科帮网-Java论坛、Java社区、JavaWeb毕业设计

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > Java初级程序员面试必备的基础知识总结
总共48085条微博

动态微博

12
楼主: admin

Java初级程序员面试必备的基础知识总结

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    11#
    发表于 2014-12-03 12:43:50 |只看该作者
    JEE
    0 }+ g0 ]0 ^  z, @' K4 V简述JEE
    ) s1 _! h, B6 oJEE : JAVA  PLATFORM  ENTERPRISE  EDITION! t$ x" F9 m8 ^0 K$ Q
    " W  O* }* `5 Q% c& G, H
    JEE是一个规范集;
    7 G) X; f- [; H( N9 K6 p3 i8 Y  R* _
    JEE是一个框架集;
    % H8 V6 z3 W% k6 \  y. x; y" {8 ]5 x' e2 P' R' G
    JEE是一个技术集或API集;
    ( }8 L. x0 U4 ~  @/ e: a9 ~1 O4 Y2 K8 s: Y' k
    适用于创建服务器端的大型的软件服务系统$ }" `" {* u3 u. J' U: }  o

    3 a1 w9 W: w2 r# [! p# _
    5 h7 X: A& I% E) P" g4 Z
    % ~: v4 F% M, W% t/ ?+ cC/S B/S 模式% H( O# N5 @0 D9 M
    C/S client/server即客户机/服务器模式,客户端也参与程序的运行与计算(富客户端、胖客户端)
    & z, Y6 S- o. X6 a; K4 S- N; a, v* v& J8 X' a  h2 s
    B/S border/server即浏览器/服务器模式,又称为瘦客户端,客户端不参与程序的运行与计算  a- e/ G: ?& r8 {1 j* ]8 d. D& z

    5 W6 \" r" L1 y0 V% n& `/ E4 m 2 v& k, g, U8 F: u
    ; E' V; Z- r+ h' O) Z8 d
    企业级应用(大规模的应用)的特点. i$ Q6 b" c4 L/ E6 E
    1.生命周期长、稳定、可靠
    % O8 \: K6 Z* b8 d0 w  N  r3 o# H7 G- r: L8 g3 k# Q8 `# p
    2.组件往往分布在异构的环境中,能够跨平台
    ) l+ V2 ?  C8 w; C
    ) t4 E* B  `& [# q; L8 [7 P  Q3.维护性、扩展性、重用性/ Y+ B7 A. s  M( k: L

    9 }; _6 U9 t9 M& E5 w$ R+ Z4.有事务、安全、线程# \3 H$ F. G' b/ Z! }5 [( m
    . E* ~) `/ t/ N& R; R( ^

    ) S0 Z; D- V  A7 M& M! x' p
    - |) M( Y* V5 ?7 l( ]什么是业务逻辑?/ R; o) ~; F8 J: p+ W6 N. U
    依照业务逻辑划分模块,
    . }) e; k7 ~% ]# I1 Q! S, H
    + J9 N9 U8 D, M( j- W, i所谓判定业务 就是具有以下特征:
    4 r; i, U, u% b- o* N" R$ c' Y, S  O: u4 e, h: G0 Z' D
    1.业务流程  s1 Q8 Y  T$ z) Z

    5 y7 q8 f* h" e1 w/ O2.业务判断
    . B5 h; x' f+ C  K3 R6 s3 G
    . r# Y* [" a: G  d3.功能组合
    9 k+ g  H7 }, y$ d" A+ f3 C" }% V- d( [

    ) \. k7 p; x/ i8 f/ W! M" P
    . @6 [5 Q6 H9 W' f8 d, Y2 K0 Z' |  @平台(角色)的划分0 d" b4 H( X" P9 f$ a" w1 e
    1.平台供应商。提供满足API集实现的厂商(BEA weblogic IBM webshphere)1 \: V) k, w* A3 R7 @4 ]1 X
    " P0 G1 r/ `4 P9 Q6 {+ M6 p7 K
    2.组件供应商# q1 V, C$ F* D- G$ q) v" V% b
    , M5 |+ m8 ]( i5 p  K
    3.组件装配人员* @* S( {* a/ @7 N- S
    + T- m: o0 j# V' L. e; j9 C
    4.部署人员7 i$ K' C+ Q8 c$ P! K. r  S
    3 h& I3 W1 K( f3 L/ e
    5.系统管理人员% Y1 K% [( `2 A; [& L

    ' @: P3 S) e# V6.工具供应商 提供开发组件所使用的工具(Jbuilder、eclipse)
    - [6 Q- f( w& J4 V6 m( w: H4 @9 {9 }$ P9 v9 e
    * B; g9 _( Y! U1 I: P( D( I& H1 g# u
    8 a. F) p- Q" d7 @; }
    java技术分布(设计架构 模块内部设计)/ E  ?8 {; V' ?1 W
    1.表现层 Servlet、 Jsp、 JavaBean、 Taglib7 }% R. }& p# Z! S! ^

    + D/ A6 ]' m0 I% f1 g8 _1 l! c2.逻辑层 EJB(SessionBean)
    1 x% H/ H5 u' `1 t& U2 X4 H) G' j
    5 c& G: J0 P% j' v' R4 J3.数据层 ( JDBC  EJB(EntityBean))
    & S% H+ G5 C/ u" Q9 o
    5 J* R) U3 Y% P" N% d% L+ U  o4.服务 JTA(JAVA事务架构) JTS(JAVA事务服务) JAAS(JAVA授权与验证服务)) `0 J* W7 @+ ^, k) K

    / V4 R9 K$ B# ^& a5.分布式通讯 RMI(IIOP)+JNDI 、JAXP(JAVA 的 XML 架构)
    ! |8 S# p0 G6 q
    4 Y' U0 e$ I# vJAVAMAIL(邮件服务)、JMS(消息服务)、IDLC、JCA(JAVA连接器框架 (成))
    4 h7 a- s% k$ S; \; G# P
    " S6 W$ N5 i+ F0 S6 _, E
    ' F' f% g) R1 N, w5 \4 a, C' S: s; @2 Y8 a+ V8 s, @0 R
    JEE的体系结构: 是一种组件的体系结构
      x7 K6 ]1 m0 y& Z; w% G( M' }1.组件 : 能够完成一定功能的封状体(独立的功能的集合). `1 o* U/ r  L9 K% C: U
    , U6 i* w/ b0 E- I+ m9 c8 |& U
    不能单独运行,必须运行在容器上! p: j& F: Q3 Q& {1 T$ B
    * Z- [1 ~+ _+ s& [9 b' T
    分为两类:web组件、ejb组件, r& ?) R6 I' A+ A7 c& U

    0 g  _' e1 \+ o! b. P2.容器 : 提供组件的运行环境,并对组件进行管理(一段程序)
    9 Q, H  b# q* N( X0 Y0 G
    ! [( [" O# W" B) k2 w$ l% l! }1 w0 E管理组件的生命周期
    ' v1 @4 V1 A8 M( y
    ( _' T# @9 |, U# h不能单独运行,必须运行在服务器上
    , z& l/ V/ j4 C8 q  Z2 }/ t  E- I& ?, l
    程序(组件)通过上下文来调用容器(context), Q1 y, h3 w- a8 E( H
    ; M1 K0 L' z5 T1 M8 U4 Z* Z
    组件通过web.xml向容器描述自己,使容器能够认识组件
    + f6 T4 ]# j+ O- U0 V0 U1 U+ x8 j# |8 a0 h( X+ c+ \
    容器通过回调方法来调用组件  v! t  `  b- R9 p
    4 `2 v  ?4 ~8 f; T, n0 c' j
    分为两类:web容器、ejb容器
      j) g; Z' c5 ?, `
    5 N2 x  r. \9 X9 _+ y/ ]3.服务器 : 提供容器的运行环境,提供大量的JEE基础服务8 ^2 g# U- o  l% V0 E
    3 s/ M/ ?4 y4 q6 `2 w+ E
    web服务器(只提供web服务)# ^5 u, h9 s, |" S
    / l8 C2 j0 r" E- `. z. t" J' }
    jee服务器(提供web、jee服务)5 m0 b( d/ x. K- a  n- a6 d3 f8 w

    ) G( W% h2 O+ J4 o 8 h# d3 U+ X. }; @

    ' Q& a3 ^, F; d/ {什么是回调方法
    # n4 k1 {2 ?! x0 c9 m9 D由容器自动调用的方法,就叫回调方法。; c+ x  d- }' j  c& R

    8 j+ V! M* _1 v+ U   I4 G* h! M- |) _; E1 G! g( c

    " }' Z  E; t! f! ~' zRMI远程方法的调用机制  R1 H" H$ I" Q& K. O0 x
    例如:A主机有B()方法,C主机有D()方法,A 想调用C主机的D方法& ~, I% R3 F* A. ?3 o: @6 ~9 W
    7 q/ {$ w+ `% m4 X# X

    5 {& E4 Y9 E, a& X" ?+ N( e  j# n, L8 }) H0 ?* N

    " U5 c# s2 [7 X5 U
    / w  M6 X3 [5 e( W9 A学习方法! F0 K0 \4 {2 f3 T! ?
    1.规范(熟记) 2.熟悉API 3.多练 4.多想
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    12#
    发表于 2014-12-03 12:45:29 |只看该作者
    Servlet. l" G: V3 i' _( y; l+ F8 ]; z% g+ s
    •     描述war包、jar包、ear包的结构- ^  A. P! E/ W' v2 q! Z# n
      8 x# J7 C2 F& c  R. _" u

      / _( @1 G, }  J, m* B% q( S

    war-                            web文档压缩包

    —WEB-INF

    —-web.xml            web应用部署文件

    —-lib                本web应用需要的jar包(可选)

    —-classes            本web应用需要的类文件(可选)


    # D4 T; g# q' Q8 f

    jar-                             java文件压缩包

    —META-INF

    —-*.MF java包的启动和描述文件

    9 P; O3 f. f: V; N9 A4 @) U5 v9 }& ?" D

    ear-                            企业资源包/企业应用包

    –META-INF

    —Application.xml 配置文件

    –*.war

    –*.jar

    ) t4 z: ~8 [2 B8 M! X% y8 j
    • 什么是servlet?servlet主要做什么?% m* g: [5 d7 Z% Y  k1 i
      5 Y. M) q1 q' b# z3 b
      " N0 G- X7 A" c0 e3 h6 |. d

    Servlet是运行在服务器端的小应用程序,是接收网络服务的请求和产生响应的一种方式。

    servlet的功能:接受http请求,产生动态http响应。


    & [  `, k+ ]0 v9 S3 l
    • servlet 与cgi相比的优点?servlet的缺点8 w! f* Q7 X+ q+ ]

      6 z6 h  a& m* b$ L7 I: S: l1 u$ c, p2 e

    优点:

    性能(线程比进程更快)

    可伸缩

    Java强健且面向对象

    Java平台独立

    缺点:

    处理代码(业务逻辑)与HTML(表现逻辑)混合在一起

    1 a5 k, F, d# Y8 c7 Z
    • 常用的servlet包的名称是?- K1 t! |# K/ g, O

      - j0 d$ u) n' d
      + p. _7 v" B9 Z7 S) C4 ]8 b, u: {" c

    javax.servlet

    javax.servlet.http

    ; j9 [) [  `# L5 k! ?
    • 描述servlet接口的层次结构?
      + L: ?' s) ?4 J- K: d$ P- _  Q  n
      % ?3 W+ S3 j, l, k2 g
      1 h, {" W, b7 @3 u8 c

    Servlet

    –GenericServlet

    –HttpServlet

    –自己的servlet

    ServletRequest

    –HttpServletRequest

    ServletResponse

    –HttpServletResponse

    * w% {$ V8 _+ q1 U
    • 对比get方法和post方法?
      + l# E7 r; E: U3 A

      " P& m9 M4 L- D6 j9 V
      + d7 H0 Z0 n( I- @% W, ], P

    get方法: 请求对服务器没有负面影响,Form数据量小,提交的数据在url中可见;

    明文传输,安全度低,不可以传输中文。

    post方法:请求的数据过程改变服务器的状态,Form数据量大,提交的数据在url

    中不可见,安全度高。可以传输中文;

    " h% q* n& ?( ^2 ^* F$ x
    • 归类描述HttpServletRequest接口都完成那些功能  O& P0 I1 v+ \9 o. y
      : V% w4 J7 ]+ w1 A; \9 ^

      9 J6 X& w% V5 ?8 b, F% e2 l
      • 读取HTTP头标
        ' _: e8 y) d+ _/ W
      • 读取cookie" y1 r2 [5 s0 j% D" T3 A
      • 读取路径信息7 Q: ?. h: ~& E" v1 N
      • 标识HTTP会话。
        % \, F: i0 c- K* F
        3 ]( a" h. c( `
    % s" Y5 }: [2 K  B5 ]0 w8 {  [
    • 归类描述HttpServletResponse接口都完成那些功能9 o9 @' ^! I# ]
      , G  [1 V7 _, R% K7 c8 S; a% t

      / J9 U( q9 A  M% k2 ^1 L/ i2 ]
      • 设置HTTP头标; y8 v  @5 t" x: F3 `) ~' a- b& I
      • 设置cookie
        1 ~- j9 ~- U! v, j/ p
      • 设定响应的content类型. H. A4 T, L+ n% |7 T7 N
      • 输出返回数据+ v3 f/ O0 O) _5 @+ A
        " I$ ^8 N6 `; l, b. e- T
    9 ]7 Q4 Q: V0 G8 o- k
    • 描述service方法所完成的基本功能?默认是在那里实现的?/ A( L3 Q* i/ s& ]8 n9 x2 l5 p
      3 |! |& H% F3 g

      # c# I, q' c( y' r4 D: M

    基本功能:service方法是在servlet生命周期中的服务期,根据HTTP请求方法(GET、POST等),将请求分发到doGet、doPost等方法

    实现:默认在HttpServlet类中实现


    & g  h6 \9 Z: Q: E3 L
    • 如何开发自己的Servlet?描述应该做的步骤和每步需要完成的工作
      8 F& h, y. J; l0 k

      2 L$ m  o6 F4 w, u- {1 Q' G3 Z, @/ @0 R) e  H7 p  k

    1.引jar包

    1)构建开发环境: 新建工程,把tomcat下lib文件夹下的servlet-api.jar引入到Eclipse的工程中

    2.开发servlet类

    1)首先继承HttpServlet

    2)重写 doGet( ) doPost( )

    3.部署

    安装web服务器,例如Tomcat

    在Tomcat的webapps目录下新建一个文件夹作为web应用的根

        在根下新建一个名为WEB-INF的文件夹,里面建立一个web.xml的文件、一个classes的文件夹、一个lib文件夹

        按照servlet的DTD配置web.xml文件

    把编译好的servlet的class文件复制到classes目录下

    lib文件存放程序所需要的jar包

    4.启动服务器


    ' l/ U& L) [9 M9 U1 y
    • 为何servlet需要部署描述?
      " a5 `4 y* Y. u; `' o+ Q
      6 W$ ^  c9 F* U1 h+ U8 U

      + y3 C4 F2 y8 k2 Z! \

    servlet需要配置web.xml文件来使容器认识servlet程序(web组件)


    6 P/ u. T4 D7 x) V7 t2 ^
    • Servlet基本的描述应该是?请写出来5 \; f, K( j# d
      . ?1 K, b7 s, W# K7 r8 e/ V5 u

      1 N$ h6 b' w. b" [' m( y& S0 g2 Z
    . s$ E4 o  q# z3 n# F+ T/ r; o

    <servlet>

    <servlet-name>Hello</servlet-name>

    <servlet-class>com.javakc.web.action.MyServlet</servlet-class>

    </servlet>

    <servlet-mapping>

    <servlet-name>Hello</servlet-name>

    <url-pattern>/greeting</url-pattern>

    </servlet-mapping>


    - g4 D% V* g9 W  W" _
    • 如何在html中使用servlet9 {& m; r& U4 E
      : H+ @$ m9 j* I1 |! Q+ S

        [8 H. Z6 ?$ V

    FORM标记

    ACTION– 指定form信息的目的地(相关的URL)

    METHOD – 指定HTTP方法(GET或POST)

    语法:

    <FORM ACTION=’servlet-URL’ METHOD=’{GET|POST}’>

    {HTML form tags and other HTML content}

    </FORM>


    " b) B4 T8 L' g6 \/ `7 m. |
    • 如何接受request中的参数
      ! w1 j+ s; z) R! Y# e3 a. u# [

      ' d5 [& z# _0 UString userName = request.getParameter(“userName”)方法- w+ W  [* ]$ B& h7 E
      , ^* u! E2 v' T" L5 S& e/ U
    ; x  C4 q1 W1 Q
    • 如何接受request中header的值
      ( f9 U7 A6 H6 N) b2 u' n2 s1 w
      ; }! c# z& R: W* u6 N

      9 X; c) U7 s) q* o3 B

    request.getHeader(name);

    request.getIntHeader(name);

    request.getDateHeader(name);

    request.getHeaderNames();

    / n  J4 e/ r. z' p6 }
    • 如何输出html
      ) _$ L  {, H4 ~, ^* j/ l( c

      ) T6 Y$ A6 K, n; [1 k0 i: t4 w# Y) I, t9 ]

    PrintWriter pw = response.getWriter();

    pw.write(“<html>”);

    pw.write(“Hello”);

    pw.write(“</html>”);

    3 y! }) g7 ~$ U. k
    • 如何设置输出的contentType6 G  W( j, J1 q5 Y- }5 ^
      . v# K, f4 C' [) @9 ?! L

      6 ?. n" \* d/ l- T, W

    response.setContentType(“text/html”)


    & H5 P, v1 {* L% B6 S0 G. d: v" I
    • 描述servlet的生命周期?
      & s0 D" Z: J* B; G( f6 T, I
      7 Y0 d4 E2 B" O1 \- c; \

      . G/ p5 |% I! `( D- U- j; G

    生命周期是指servlet实例在web容器中从:首次创建调用init方法开始初始化期,经过service方法运行期,一直到destory方法销毁期    结束。

    servlet实例的生命周期由web容器来管理。


    " P7 c. O9 n- c; u" U2 ]
    • 描述init,service,destroy方法的功能和特点. k4 F5 V/ q4 z$ R
      + V' S) w( ^; T5 q/ K

      $ ~* q+ h) O2 n% r) z! k: l

    init方法: 是在servlet实例创建时调用的方法,用于创建或打开任何与servlet相的资源和初始

    化servlet的状态,Servlet规范保证调用init方法前不会处理任何请求

        service方法:是servlet真正处理客户端传过来的请求的方法,由web容器调用,

    根据HTTP请求方法(GET、POST等),将请求分发到doGet、doPost等方法

    destory方法:是在servlet实例被销毁时由web容器调用。Servlet规范确保在destroy方法调用之

    前所有请求的处理均完成,需要覆盖destroy方法的情况:释放任何在init方法中

    打开的与servlet相关的资源存储servlet的状态

    ( q6 ]: B$ ?2 Y* D1 a
    • 什么是回调方法?有什么特点?
        g. S' M. F; G4 Q% J
      $ a8 ?& r5 \3 _# Y$ w7 f

      # O: O  r" I6 T7 q+ V3 v8 m3 h

    由容器来调用程序的方法

    由容器来决定什么时候来调


    # W- i; f" A" t  t  V) c
    • 如何设置初始化servlet的参数?% s" N! Z, B7 \
      $ v& J$ a0 g/ p3 k! W
      在<servlet>中添加如下配置
      , z% m* X6 @2 H( h4 m& u& k
      / B6 U, I5 g, J0 {$ H

    <init-param>

    <param-name>greetingText</param-name>

    <param-value>Hello</param-value>

    </init-param>

    7 A( K! r. G0 ?6 L3 f
    • 如何获取servlet初始化的参数
      : R  W& p! h; z# |, ^
      2 j4 o! F: F* |2 y8 G! {
      ; B& O, u8 M. q4 F; ?" y

    public void init() {

    greetingText = getInitParameter(“greetingText”);

    System.out.println(“>> greetingText = ‘” + greetingText + “‘”);

    }


    & T# R  {( p; n  q4 m, ~* ~# h$ h
    • ServletConfig接口默认实在那里实现的
      ; F% ?% w# |$ Y. ~5 C

      " |. J' U# i0 ?" \) C' {  [2 L6 n/ ]% G3 j+ P5 q1 j% a8 o& l9 N

    GenericServlet类实现ServletConfig接口


    - t$ `+ m% e3 b8 r0 {
    • 什么是ServletContext?有什么作用?6 r; a& z: M* \6 t! _

      2 b& j! I  `- i# r& i
      ! H  G7 Z+ Q  S5 P3 T; E  k& j9 i( O

    Servlet上下文

    ServletContext对象是Web应用的运行时表示,约等于整个web应用;可通过其实现Web应用中的资源共享


    ! r* F" g$ |) Z" L/ d$ j' _' f
    • 如何访问ServletContext接口?是在那里实现的?( @- A6 ~7 v, q: M6 k( L7 m' Z

      : s7 T# V& i9 G6 k9 j
      ; A+ L8 ]! B; e( u- L% q$ ], \

    在Servlet的实现类中通过this.getServletContext()方法访问。

    GenericServlet类实现了ServletContext接口。

    , b, P6 L. k% u8 h' t6 \" o: t
    • ServletContext接口的功能包括?分别用代码示例
      1 r1 F$ `, w$ [2 h* K2 v2 J4 U! S
      # r" F8 r/ V0 a3 `/ L% g( I

      * t' j+ u) R3 v4 Y2 U  ]

    只读初始化参数:     getInitParameter(name:String) : String

    getInitParameterNames() : Enumeration

    读写访问应用级属性:getAttribute(name:String) : Object

    setAttribute(name:String, value:Object)

    getAttributeNames() : Enumeration

    只读访问文件资源:    getResource(path) : URL

    getResourceAsStream(path) : InputStream

    写web应用日志文件:log(message:String)

    log(message:String, Throwable:excp)


    5 D* W0 h$ X/ t' i; X$ k0 W1 F
    • 如何设置ServletContext的参数?! K( j" s* _5 b7 E* _
      8 Z2 g& x/ X  U  S" U

      : G( N  _( t; ^: A( u2 f0 f: H$ R

    <context-param>

    <param-name>catalogFileName</param-name>

    <param-value>/WEB-INF/catalog.txt</param-value>

    </context-param>

    & j* J/ t0 s8 ^
    • 如何获取ServletContext设置的参数值?6 n1 A; c' f7 K8 x0 v  Z- x
      . D( x) U# R0 I2 Q6 P0 F/ h

      1 I8 H+ Z& h9 ]- [! J3 V' _

    ServletContext context = this.getServletContext();

    String catalogFileName = context.getInitParameter(“catalogFileName”);


    3 {& a8 n& o" k
    • 描述Web应用的生命周期?+ S9 g* G( Y9 N& ?
        I% {8 F. S! z" T. t, ~. W: f
      4 C- l; Q4 s9 t& r

    Web容器启动时,初始化每个Web应用

    Web容器关闭时,销毁每个Web应用

    可以创建”监听器”对象触发这些事件;


    : g# w; L2 ?" z! I% D
    • 如何用代码实现监控Web应用的生命周期?
      # N8 G0 o- n% W$ l, Y2 u7 v8 S: k
      . J4 j+ w/ ]) k' c; U: z- E

      - Z+ n: a1 X1 e: d( _$ i  g" c: r' e. v

    public class Test implements ServletContextListener{

    public void contextDestroyed(ServletContextEvent arg0) {

    System.out.println(“web 容器销毁了+++++”);

    }

    public void contextInitialized(ServletContextEvent arg0) {

    System.out.println(“web 容器启动了+++++”);

    }

    }

    ; }! E, s/ M; g3 T" E$ G

    web.xml文件中的配置:

    <listener>

    <listener-class>

    com.csy.Test

    </listener-class>

    </listener>


    $ f' T" T6 ^9 @" N: J% y
    • web应用中如下错误码示什么意思:400,401,404,500
      0 \% w" o: k# k% a

      3 M& w% [" T+ I, m% D2 e
      400 Bad Request//错误请求
      401 Unauthorized//未被认可
      404 Not Found//没有创建
      500 Internal Server Error//服务器内部错误

      ; }3 y8 l# R" }9 t- q& L% z# v
    6 |( E& J% {; E7 W: K7 ]" f9 w! J
    • 描述Web应用中用声明方式来进行错误处理的两种方法) `8 V3 w$ c0 s

      ; z' C* q' T! [  I5 G! ^; Q2 Z1 r, E& G2 a

    使用error-page元素声明一个给定HTTP状态码的处理器

    <error-page>

    <error-code>404</error-code>

    <location>/error/404.html</location>

    </error-page>

    可以声明任意数量的错误页面,但一个给定的状态码只能对应一个页面

    使用exception-type元素声明给定Java异常的处理器

    <error-page>

    <exception-type>

    java.lang.ArithmeticException

    </exception-type>

    <location>/error/ExceptionPage</location>

    </error-page>

    可以声明任意数量的错误页面,但一个给定的异常类型只对应一个页面

    不能使用父类捕获多种异常

    ! f% f8 Z9 _! w/ L# A
    • 描述记录异常日志的方法,都位于那些接口?/ f- g: u! `2 K. b( P# O* K

      2 G, K- w" Y: X9 W2 F/ h( J9 B1 C# r8 q& ^0 w# u) x1 \* i

    GenericServlet:

    log(message:String)

    log(message:String, Throwable:excp)

    ServletContext:

    log(message:String)

            log(message:String, excp:Throwable)


    1 {% i- c  I& D" j6 H
    • 什么是会话?6 E$ v- D2 n7 ]# D7 O8 [

      ; n9 B8 v* N9 E
      ' v* P% Z- u- J, G1 I

    Web容器可为每个用户保存一个”会话对象”,用来存储特定用户的会话信息。


    1 {& a" l9 V9 r+ N
    • 如何获得会话?! T$ v0 d8 K( o* g$ o- d( x* Q, |
      : s1 e3 J1 C5 k! |1 @* R
      HttpSession session = request.getSesseion( );

        W5 o" S5 {6 G2 t) P6 g
    & G2 q: F+ \% w' Y" I/ {# C" j. z
    • 会话Api的基本功能?) n) P" G8 G# r3 V6 }" T' x
      # \2 l* `4 q3 V( q; h+ L1 {8 O

      ! m- E* P( x  D# M$ ?/ _

    getID() :String. x9 K1 i9 y% T1 d' v% U

        isNew() :boolean% L0 g4 U1 V. e5 f

        getAttribute(name):Object+ |# V# c3 A  f+ F/ w* \

        setAttribute(name,value); |' q: J4 V) l0 o8 G

        removeAttribute(name)

      [6 ]( ?: O; M9 g: b8 p3 v$ L
    • 如何销毁会话?& r% i" C2 B4 \2 _) h9 |2 b( @6 _% B

      0 d  ^' R0 ?& Y. X* q
      * K4 n& I3 F$ |6 m4 {/ n; i

    1、可使用部署描述符控制所有会话的生命周期

    <session-config>
    1 b! u% F% e8 ?0 ~, a

             <session-timeout>10</session-timeout>
    - A% f! \9 J3 c+ A

         </session-config>
      q; [/ r, [, Q) b5 M

    2、可使用控制特定会话对象的生命周期HttpSession接口

    invalidate()& o; V3 U1 N, y8 U; r* k! [

         getCreationTime() :long
    : l* B) m0 V5 g6 G( K

        getLastAccessedTime() :long$ ~! j9 R6 f  B4 b

        getMaxInactiveInterval() :int
      t' F: s: m3 L0 p9 [2 Y1 E

         setMaxInactiveInterval(int)

    ' z9 \4 n' f( q% y$ U4 k9 u
    • 描述会话保持状态的基本原理& o; R. N: {- l. y4 [1 B

      ( ~$ g$ `5 v0 K* b' f) q$ q+ U8 J4 `2 f- M: n2 a
    2 `) c& S: `) K& ]

        client server7 b; j; Y0 S9 k" C$ w, t' b


    ( \, b5 M$ M( I. I* N7 ^2 x

    request0 ^2 e6 \# k7 g  K- U

    response (sessionid)
    ; o- O- V$ X- u' T; w

    request (cookies)+ {3 A' V/ T% v2 q6 G) c! c

    当客户端第一次请求时,服务器创建一个session与request绑定,用响应对象response来返回sessionid 放到客户端的cookies中存储下来,下次在发送请求时,直接根据sessionid来检索服务器的会话(每次请求都会将所有的cookies带到服务器端)

    + G$ ?. q5 l: g2 K% n. b
    • 请描述session和cookie的异同之处# J& r2 }9 P# @2 Q

      % s% ?9 c  Z8 n1 F$ ~
      ( T! M% @: J  N1 _) |+ N
    8 [6 g3 P. J5 G

    ( B& `% u$ B7 w% A& ]* ~
    • 如何读写cookie,代码示例
      3 m; U9 s3 x" P% r" Z2 w+ b! @) F; F% i6 W

      7 M+ W7 Z3 \, S$ c# q: C/ }& |. t, Z) i$ [  [

    写:    Cookie c = new Cookie(“yourname”, name);

    response.addCookie(c);

    读:Cookie[] cookies = request.getCookies();
    - F. B8 d! y- O; t) l1 \" l

            for ( int i=0; i < cookies.length; i++ ) {( t  n: z6 m/ I7 t' K/ c$ ]

                String key =cookies.getName();
    . S/ [9 W7 ?1 C1 {3 R

    String value = cookies.getValue(); ( D- d- q: \5 C% }1 H

    System.out.println(“cook”+i+“:key=”+key+“,value=”+value);
    " u9 \* U) b6 {) S

         }

      D+ C- @3 J' s
    • 什么是URL重写,如何实现,代码示例
      4 i# b* w3 J6 q  b4 U% `9 x
      ( ]/ L! V: P; x2 v. |, L
      3 i  ~6 f& u, `+ l" Y2 h

    Cookie不能使用时,可使用URL重写 request.encodeURL();

    客户在每个URL的后面追加额外的数据

    服务器将此标识符与其存储的有关会话数据相关联

    http://host/path/file;jsessionid=123

    ) e$ c: w8 W# e( P" l

    1 i& J+ m& V  A" H
    • 描述web应用的4种认证技术) Z! _2 X" k6 P5 \

      9 W- l- W/ d( ~0 ^# l& z, H, F6 {* C4 o/ h, m$ K4 j0 W2 F

    BASIC – Web浏览器接收用户名和口令,将其以明码方式发送给Web服务器

    DIGEST – Web浏览器接收用户名和口令,使用加密算法将此数据发送给Web服务器

    FORM – Web应用提供发送给Web浏览器的HTML form

    CLIENT-CERT – Web容器使用SSL验证用户,服务端和客户端的链路保护


    % w8 R6 f2 D; R/ q  c7 H6 S. w
    • 什么是授权,什么是验证?' a6 \6 g: x$ ?, T0 T, `% b/ x: e
      ) K4 k; R7 X0 j- S: `
      , a& {2 B1 A3 d, U, v, {

    授权是根据用户角色划分web资源的过程,其标识web应用中的安全域 分配权限

    web容器使用厂商指定的机制验证用户的角色 匹配权限


    * k8 C4 K9 ?- `) f3 p: o  s: r
    • 什么是HTTPS
        J+ \. F& D& T
        z( \  e: v! o' m6 g3 O
      ; a% i: i7 C0 R4 S  u& V

    HTTPS (Secure Hypertext Transfer Protocol) 是使用SSL协议的HTTP


    % s$ ]$ V8 r. Q5 v
    • 什么是审计?
      # f# A% g9 Q1 ]. U* D- \

      . A( x- M( ~. D, O, r2 k
      . h: C3 \' Z  l

    也就是访问跟踪,是为web应用的每次访问保留记录的过程

    ' z0 Z2 @' X9 |8 T% A* d# x
    • 如何实现声明性授权
      $ d1 z2 ^. ^& M- F8 I* t

      - e! m6 F* d% ?* H, d1 n/ `# _/ M7 Q9 O6 m

    1、标识web资源集

    2、标识角色

    3、将web资源集影射到角色

    4、标识每个角色中的用户

    在 web.xml里配


    ( B0 P( Y- O2 C% |2 i8 w
    • 描述servlet并发问题?
      $ ~; F& Z, P% P+ K

      . @- ?9 m1 r. y! g3 A% j' ?4 C; T, @
      , K; V1 O1 l* w& ~6 s. g

    多个同类线程运行,可以共享同一个Servlet实例,共享的数据和资源未合理同步,可能会引起数据的冲突

    & N* P' Q! D7 e$ y6 `; u* F9 s, s
    • 描述Web应用中的六种属性范围
        N4 E0 L/ r3 B$ ?  C% `9 K
      3 i4 d/ e8 K4 W  G. h2 R; |3 q5 P1 E' h
      1 C* V: N7 |  y" g- O! Y# U1 C

    局部变量(页面范围)

    实例变量

    类变量

    请求属性(请求范围)

    会话属性(会话范围)

    上下文属性(应用范围)

    - w  {( P8 \+ S% j
    • 指出上述六种哪些是线程安全的8 P+ D0 ~6 A) ~  r

      : \2 H9 p+ R6 ~* `! Y' C: b! W! `% a

    局部变量和请求属性

    & F$ Z: r  B( D  I' {% k( S% o% U
    • 什么是STM?如何实现?
      9 N* a2 G) p. W$ Z; `2 @! e

      0 |% E3 Z: t0 F  [* x
      3 F$ V7 @$ c+ s" l5 _

    SingleThreadModel接口

    可以实现SingleThreadModel接口保证某一时刻只有一个请求执行service方法

    8 [: e: b+ C# Y
    • 如何实现并发管理?+ Q+ v3 i; P$ }7 U" X0 ^% D+ P% u
        Z/ X, n& b; M# b4 `- ^  n5 E( Q
      # x; N/ Q" q1 ]

    尽可能使用局部和请求属性

    使用synchronized语法控制并发

    尽可能减少同步块和同步方法的使用

    使用正确设置了线程安全的资源类


    1 i; w  d9 M' a# ]5 Q/ R' Y
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    13#
    发表于 2014-12-03 12:45:45 |只看该作者
    Jsp9 O7 ]+ d! I* Y6 s
    什么是Jsp?
    ; H0 d2 m5 ]9 }8 gJava Server Page    结合java和html在服务端动态生成web页面的技术
    ) _( v8 D8 I/ @8 i5 m, `+ C3 f7 [2 v% S7 H1 n) m# T' b

    ' F( g: r- j; F! G' [! L% q& g1 y3 r, W
    描述Jsp页面的运行过程?
    7 j9 I* S6 W1 v/ f: a1 l第一步:' F5 D. p" @- q4 o

    $ s6 I; s& p" l- Q- S+ U9 v请求进入Web容器,将JSP页面翻译成Servlet代码
    4 T0 T, j9 p% `& B
    ' H4 v. ~4 |4 g/ Q1 b3 Q4 x& P第二步:
    # ]8 u3 q2 _+ {# F( v7 X: B6 G+ g# W- W; l- e
    编译Servlet代码,并将编译过的类文件装入Web容器(JVM)环境# M2 K$ O  S, U! I( x3 ?

    7 s8 m' U7 y/ ]% w# @( M( w$ L7 ?第三步:
    1 h  L) w2 A( m- [8 f" B; S4 i+ }0 t5 p1 [# V
    Web容器为JSP页面创建一个Servlet类实例,并执行jspInit方法) Y! {+ G* E* u+ w! y) i

    $ `3 `! t" y2 x5 Y第四步:
    ' x2 k; u& x6 [; Z& u2 J
    % B6 e8 c, m% u1 A4 jWeb容器为该JSP页面调用Servlet实例的_jspService方法;将结果发送给用户6 w* F6 Q2 p$ T# G" i1 B$ \( \  s

    4 a, q4 H% T/ F, b 8 A: ~0 m; \9 i7 m5 I

    : n: Z) a% j, c! q描述Jsp页面的五类脚本元素的功能、写法、并示例
    5 v; ?1 v8 r8 h1 n: c. a6 D3 L$ Z注释 <%– –%>
    # n/ Z6 |/ E8 w* ?7 v" z5 q& b1 C+ r0 U' ]' [: w! J1 N
    <HTML>
    - g% a0 g3 d) R3 I0 ~- q1 _8 z4 B4 k( a$ g; u8 n' x. _
    <%– scripting element –%>
    ( X- W2 v% O: F, _9 E0 M2 u& [5 P
    </HTML>( s' G$ |% G' B7 ?& _. K7 h' b

    . J/ U4 E/ g8 N& Q# i5 `$ E$ ^1 X3 u指令标记 <%@ %> 指令标记影响JSP页面的翻译阶段
    ; t) T! L' d" n% [
    ! j6 X- n4 A& F. \<%@ page session=”false” %>
    9 A1 G9 N$ M, s
    + f  g& l7 N- r# x) g, T1 m2 p声明标记 <%! %> 声明标记允许JSP页面开发人员包含类级声明6 i: }1 p& n: B5 m( Z, p

    - e9 d' T9 y3 X5 B<%! public static final String DEFAULT_NAME = “World”; %>9 |) t; R% S& K' s

    - ~/ _2 |4 t1 _, ~    脚本标记 <% %> 脚本标记允许JSP页面开发人员在_jspService方法中包含任意的Java代码( C2 H! w; }0 F( I: q. W, |: A

    # ^; b% t0 @8 G    <% int i = 0; %>: U! A- i/ o# S! p; J% o% [& W
    9 E) F: X3 W1 s
    表达式标记 <%= %> 表达式标记封装Java运行时的表达式,其值被送至HTTP响应流 <B>Ten is <%= (2 * 5) %></B>8 Y4 A: {; ?5 \: M
    8 v# d# ]  V$ e- H
    . l/ w3 v- y4 d: e$ R$ z& a7 h/ q* @

    " S2 g: S! ?9 J( n, ?描述Jsp页面中的注释种类和写法% a, \" A: k& Y1 q2 P  Z
    HTML注释1 M4 n9 ]7 k" C. m
    ' F/ }  P' a$ B/ h  N- I
    <!– HTML注释显示在响应中 –>
    . ?! }. e7 P$ F* B! X" {3 s& P( d0 R: D6 \4 m/ Z
    JSP页面注释4 Q3 U1 D. ~+ Z: z4 ~/ N3 G& {8 M
    % i2 X4 ^9 u* I! f' e; X
    <%– JSP注释只在JSP代码中可见,不显示在servlet代码或响应中。–%>
    7 Z/ D/ ~# u& r: G- D  B, i3 o/ c) h& _# L% @; d
    Java注释9 ~( i( `5 m: e7 o4 \6 f
    7 I( m( `( K* t. g
    <%% R, d/ i, Z/ h

    6 A; F* a! m6 w- D4 b' p" d/* Java注释显示在servlet代码中,不显示在响应中, N2 P8 d( q, }, s5 }+ Q" B
    9 [' V- X& U8 y# Y9 `7 k
    */7 j- j$ T; e" W; Q7 h; }

    + E# g4 M, i' p9 S! x& G%>
    ! |. h% E3 o  j9 W  V$ m! v2 G6 @
    8 U; d* f7 m: P 0 z3 r7 L' N0 Z% J1 B5 ?
    2 @1 h0 z2 G! m0 F3 `) c% ]2 y* z! S
    描述Jsp页面的指令标记的功能、写法、并示例$ w7 Y2 l0 O/ }4 r
    指令标记影响JSP页面的翻译阶段
    * U$ n& C' @3 a$ W* N3 x2 `4 ?$ T8 V. N2 t8 ]6 w
    <%@ page session=”false” %>
    ; Z) n5 }, b7 D! ~1 `. V) f  q  Y" X! c$ [9 s6 e! e& R$ A- h: _5 P
    <%@ include file=”incl/copyright.html” %>! J9 B$ {" S. t
    " h0 `' l( h4 p8 `
    <%@ taglib %>
    7 P" J& ~1 U# o; R! `+ V6 j4 e# V2 P$ [

    * y8 N; |/ v! C1 k7 n# _
    + u' |# B, ^! C9 F) K3 \8 |8 z& i描述Jsp页面的声明标记的功能、写法、并示例0 W3 P+ H6 D$ n( v! q6 W% J
    声明标记允许JSP页面开发人员包含类级声明
    2 [( E4 l4 T1 s0 c+ ~8 H3 s8 C- L3 |) a4 ?5 ?; o/ M6 f$ |' p
    写法:
    ! g5 w( l3 @! y* k: K& ?$ S4 V! o
    & o2 s) K9 k# g8 ?/ ?6 K4 |<%! JavaClassDeclaration %>
    1 B0 m2 G# [; d+ {! O* d: O' v+ x! }* T8 G0 y$ O1 P, u1 q7 o/ c2 i
    例:& K! {: s4 U8 Y
    ! z  @, t1 G$ W3 s1 g# o# P, R
    <%! public static final String DEFAULT_NAME = “World”; %>6 k8 P! N; ~; w) _9 w

    # s( ]% I( J& P6 l. o! O2 B<%! public String getName(HttpServletRequest request) {& A( S5 t% N. I' E2 `, Z! n
    4 b" I; h6 h3 v: _# q1 Y
    return request.getParameter(“name”);
    7 p2 q5 {; R, `$ }1 R, j% G- W$ F8 V6 I
    }3 u% V- }: x* u
    % ?" q; _4 y# n( L, c6 c! B
    %>2 \# M6 Q; e% {7 b& \

    & z4 K% O; j) G2 w" Q<%! int counter = 0; %>1 ]; s% y9 j3 M" s  w
    " r% O8 y3 `2 V0 V( b

    , A8 O# ~0 `1 }* }& n0 U# W" p4 \$ u: d) A; g  S
    描述Jsp页面翻译成Servlet的规则
    ; d* k, F1 h- g( Y: X% rjsp中的注释标记被翻译成Servlet类中的注释
    ! }7 H& C, w7 @5 {# u8 H
    2 [# }  n. {# i: M% \jsp中的指令标记被翻译成Servlet类中的import语句等, O' ]: S: U+ o( J0 G$ @

    : I0 L1 u) q2 B, Jjsp中的声明标记被翻译成Servlet类中的属性
    6 I2 w- x8 `1 @: M. A. @8 e# G+ e
    8 T* ?- `6 `; s. f/ {+ Qjsp中的脚本标记被转移到Servlet类中service方法中的代码4 v$ P4 x+ ]8 @- z0 d( U  J
    ( g0 w- M4 g0 L) m2 E
    jsp中的表达式标记被翻译成Serlvet类中的write()或者print()方法括号中的代码
    * A, |% x4 W8 i$ f) x* D! e: s  j
    1 p! B( I' Q" f5 J& d9 m( O
    # {) D, F& p5 X, M7 e% N& }
    % R* S& y, y7 p2 V7 G5 b" ~描述Jsp页面的九个预定义变量的功能、用法、并示例! g- L% I) M  j& v* _: o1 L' s
    request 与请求相关的HttpServletRequest对象% E' Q' N) \* O9 S; F

    ; m: x% ^4 d  {+ l6 Cresponse 与送回浏览器的响应相关的HttpServletResponse对象
    / m# K" e8 k: O* E# x3 A9 W- }9 M" q
    ( c, q4 c6 z9 h  Lout 与响应的输出流相关的JspWriter对象7 b$ p# ?0 y! L: r0 w) N

      k7 e$ }% D; ~6 f  O' Q' {    session 与给定用户请求会话相关的HttpSession对象,该变量只在JSP页面参% d& _* S4 M3 i* G6 V
    8 n% F! c4 q& H6 S
    与一个HTTP会话时有意义
    / c. r" [8 f8 N( H) y  `: V) }, N5 F" `- Y
        application 用于Web应用的ServletContext对象
    2 {, D# H+ p$ I6 {( Y% x3 p+ s1 c$ l: g5 O7 F1 _
    config 与该JSP页面的servlet相关的ServletConfig对象
    9 A" X: n( ^4 \7 @- \# e1 |' c$ A* L1 s3 g  i/ d0 t& V* X2 y
    pageContext 该对象封装了一个JSP页面请求的环境$ @3 i$ w" C9 j2 x# s3 C$ U

    4 _% k& ?/ Q# r4 @$ X* Wpage 该变量与Java编程语言中的this变量等价
    . k" L! E# B6 }6 ]8 P( a; N' p( Y7 v8 c/ ]" S9 W1 Q; y' l4 }
        exception 由其它JSP页面抛出的Throwable对象,该变量只在”JSP错误页面”中可用$ T( H, [6 j$ N

    4 n$ ^9 d( z' w! w& B
      E3 x* p0 ~9 o( X/ _! W  h( t* ~1 N1 Q, j, H  g2 O) @6 }
    page指令的功能,写法、并示例,并描述它的如下属性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding8 E4 R+ `5 }6 J% u' o9 w4 n
    import import 定义了一组servlet类定义必须导入的类和包,值是一个由
    " `. D5 Z* A4 }. q1 R3 p% B0 _
    ; X- E# |: Q/ z* y1 _2 {* _逗号分隔的完全类名或包的列表。* e# ~* [0 A/ K: N; J6 b

    8 q8 x% ]4 Z# V1 D  k4 [% v# Z! Isession session 定义JSP页面是否参与HTTP会话,值可以为true(缺省)
    9 ~9 R  t5 Y6 i0 V
    3 k2 p; B. G7 F+ Y或false。% v  K! }" X# w* V, ]

    # G8 v$ _' Z9 F5 S# S9 abuffer buffer 定义用于输出流(JspWriter对象)的缓冲区大小,值可以为
    8 q9 E' n. F! s& ?4 W1 o& c; o- Y. ^% O1 z2 x$ y* C
    none或Nkb,缺省为8KB或更大。
    ( |0 J! C2 y! h% R* r8 ]- c
    ; w2 T" y9 s7 r6 I' ?errorPage 用来指定由另一个jsp页面来处理所有该页面抛出的异常
    - u( V( o( h; g1 L, G, m/ o0 T8 X: g$ Q" E% b9 Q
    isErrorPage 定义JSP页面为其它JSP页面errorPage属性的目标,值为true或
    1 |% ~; [  B2 F0 X; a) l! W0 Z; G
    false(缺省)。  y  `* w& @; s6 |

    8 i2 A, r$ `5 U  o3 V$ T: [ContentType 定义输出流的MIME类型,缺省为text/html。7 P8 L% h- P3 |! S( |

    * P# J; w+ Q" a/ w! d) [pageEncoding 定义输出流的字符编码,缺省为ISO-8859-1
    - [' `7 |" T$ W2 ~' a8 I" x, @2 I0 @0 |" e) P

    7 n6 P% l2 u# }) y. L
    $ I% f( L; n: e描述MVC各部分的功能?MVC的优点?MVC的缺点?
    1 h: m) j* z( c% m; aMVC各部分的功能:
    ; ]3 k/ _4 `# Y  N
    4 q- r! A/ X% U: a! J+ p3 Q3 p% GModel(模型表示企业数据和业务逻辑)
    0 \6 y; i) `) V8 q. Q6 S$ L8 h, W
    & _1 X$ Y" f6 }- G* Y封装应用状态
    - o2 B7 T, }# t7 _2 h$ Y9 G8 k# }& U
    8 k: a9 f8 `3 ], d; }响应状态查询; {) {9 Q& y; h8 `  _' h, o
    + S  J: K& Y( h4 `5 p: v7 w
    暴露应用的功能
    * `4 K# S/ W8 B  P5 n: d5 L
    0 I! ]; p$ H6 Z" [Controller(控制器接受用户的输入并调用模型和视图去完成用户的需求)- `+ }! H, V: s; U2 S+ r

    0 V3 f" Q" i" N; X验证HTTP请求的数据9 p, |5 z$ j/ g0 G/ _2 t! k

    4 a% e# ]# c  a+ K) w. C将用户数据与模型的更新相映射
    / R& _. O* Q9 ^# Y( D8 E+ }) \
    # x- P9 N/ _' C% j3 W选择用于响应的视图
    % W: p( F. |. @0 T6 F! z/ w" u$ {9 e, W/ a( k! `
    View(视图是用户看到并与之交互的界面)" g8 E  U7 @& K, ~. G7 {3 n
    3 I7 l% K! l8 |5 _2 e
    产生HTML响应. p: `3 @2 K1 U" M; U$ n
    2 i4 f; d2 ?( c7 ?( P& [
    请求模型的更新
    2 O5 S* t! P8 A* C+ d' F0 k
    # x+ k% q: S) Q& L2 k提供HTML form用于用户请求6 u1 [8 Z* }6 j6 R

    ; Q& |% V9 A+ cMVC的优点:
    2 E: f/ I/ U; P  X: J, ^' @% v# E1 R$ r9 I
            低耦合性:视图层和业务层分离7 Q( y5 g/ @8 Y1 A

    " P7 m" o* Y5 K+ U' s2 V高重用性和可适用性6 n% ]) y5 `3 H0 Q
    : U; O) X* u$ c9 Q7 K
    较低的生命周期成本  o! V3 j4 {8 u( p% K4 H0 W

    7 c$ H0 T6 e! }' I2 G快速的部署: B2 Z! u- o6 w
    9 i6 P) [; y% q4 j! n. K
    可维护性9 }$ W2 S0 l. ?1 u3 _
    0 ?3 Y- y6 s4 r/ }" w9 K
    有利于软件工程化管理
    1 T. q3 X6 O! L! y8 J) t1 l1 o: B$ m; p3 z
    提高软件的健壮性
    8 C/ C/ W% c- v, n' T' k$ n$ Q: ^- J: b
    MVC的缺点:
    + Z% G! g$ }: F
    ! N/ m! ]# w$ z8 A        工作量大,增加工作的复杂性,MVC不适合小型甚至中等规模的应用程序
      c/ K/ _" l9 N) h( b: S& i6 F8 p9 [* O/ i0 C  |2 c2 X& h

    ! E0 K2 F2 M/ {/ B& f: p
    . t8 [1 L# d9 z什么是Model 1结构,以及结构中各部分的功能8 z5 Z1 {9 z, G1 \0 O( P' ?/ I
    结构:jsp+javabean+ M! j" [  D. T2 s& i" e
    1 Z. n% ~% _+ x* t) o/ c  O+ {3 a
    Model1中使用jsp来处理web应用中的视图控制部分3 U5 K4 v; P! W9 o0 |
    & T' H& R4 Y# K. G, w4 ~
    Javabean收集参数/ h4 L3 k" c. j# J

    4 Y  G9 v0 I. ?  M# b8 j$ b
    2 y: B) o9 y# Q+ a
    ) i$ k( p- ~6 `# P1 I  G什么是JavaBean?
    9 k  \" p# a( R* r# m+ ?用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。
    2 q1 H3 o# m8 r7 X& J! M+ V8 v  ^1 t4 d+ O- K
      _( y8 n5 _( Y( i1 U, G

    # u  w7 e( t) y- q8 B# OJavaBean的规则?& N& k; W" y7 _
    使用get和set方法定义属性0 s. W/ _9 ]7 k8 E

    4 F! q0 t- c) y  y6 Q( v6 c一个无参构造方法
    8 c1 j9 L$ e+ y# x1 y' N0 R0 @4 c. Q- S# v2 F. G# {) g- D
    无public实例变量( 所有属性私有化)
    4 y6 Z( `" {6 p* `
    / z2 y5 h1 e$ n
    ! g6 A$ |3 M6 L5 R' \
    " U' q+ H. p1 @) _) z7 l2 J2 f什么是jsp标准动作?包含那些?分别都是什么功能?如何使用?
    . b6 `9 i7 Y# l. M, }JSP页面中使用类似于XML的标记表示运行时的动作" s) F1 ^' }# W7 ?
    4 i6 T, X8 q' ]% r" h. ]7 U9 w
    jsp:useBean
    ) t( {* E" {( E/ c* [
    ' a* G9 }3 F8 I+ `jsp:setProperty( N% [8 n( u1 ~. _
    ' F% Q, w* P6 g& V/ u* {" ^: _
    jsp:getProperty
    2 C) i2 I0 b) h& K
    % k8 s" f3 b. Fjsp:param
    1 V( l* n; W9 Z6 h; w7 O
    ; |9 V1 J/ B" P$ C6 ]$ s$ V1 t) {jsp:include
    ! ^( i$ K, F# |7 v3 c8 M
    9 @1 W, X7 e8 W2 q: ~/ W2 l: y( b, z% ?jsp:forward
    0 n' D& o- v; y& D! J; g8 C6 k8 @3 u
    ( y9 p5 L' \& f: d3 Q( B  M% S4 @% V
    1 C: c5 }- O1 M0 _" j& W
    用代码示例如下标准动作的使用:useBean、getProperty、setProperty
    . z: U# g! U$ n% m<jsp:useBean" o5 |9 G- I2 ?; O' m0 ~- Q

    0 ?1 c+ l. m4 {/ Eid=”myForms”
    : n" p8 x% P) L2 q; n
    & M' C% I# n' |9 L: x' i7 aclass=”com.base.mystruts.forms.MyActionForm” scope=”session” />: i2 T  I' P; _4 u. K

    1 B# o/ W* |+ f* a7 [. f    <jsp:setProperty name=”myForms” property=”name” />6 T4 J8 k; ^- v

    , c. B8 W. _( o: N2 h<jsp:getProperty name=”myForms” property=”id” />0 n7 u# U  @. G1 X" G! S

    0 G& Q& l& {( |' P) ^6 M+ c - C+ T9 S+ k: ?6 v. S: N% x7 A
    ! U# y! s# P* \/ w9 g" l6 p$ Z
    描述说明Bean的四种scope
    ) x& c3 J* ~- U$ n  ?/ \! b8 hpage
    5 ^& S; a4 Z4 q+ q* a% Y4 y7 S# r- B' G# a; Q
    request
      K6 D  D8 o: x1 k2 ^/ O% M8 I
    " D' A9 t5 T! ]: P- U5 V8 M9 Esession# n1 _  v! p* q" Q( B* {" @
    % j' k. t! @! Z# z: t# r
    application
    5 K1 `& P% N$ E- O# A% g& [/ D
    , D, Q# F4 |( Q2 t3 C) t3 M " S4 @" f3 ]9 O4 E1 |. V) g7 F
    $ ?$ D7 f5 R1 l$ F$ U
    描述说明页面上的字段和Bean中属性的对应规则
    6 S: x3 d; r0 Jid 指javabean的变量名
    8 Q8 b+ m9 I+ D  q9 K( a8 `# h  |4 X, M
    class指javabean类的全路径( T. |1 O- k8 h* N7 |

    ; [# ^3 j% L$ P/ q2 L8 fscope指javabean的应用范围' v6 N6 H% D1 H) o$ V  e/ j
      d5 z1 o& t6 e1 Z
    name指所用到的javabean的变量名
    " I- |3 c) U5 l9 q: r3 [5 ~. L) j9 Q0 q, o6 Y4 ?/ j7 p* E
        property指javabean中的属性; G# \  n! @! |+ O. G9 o

    0 k& S: C0 Z0 Z ' d" N9 `9 T* Y1 v
    7 r6 A0 v: v# k" R% y3 @
    描述useBean动作的处理过程
    * {1 z( m% l3 ~- `3 b! o3 d3 E: N8 F使用id声明变量
    ( ]3 r4 k  ]! Z  ^) ^" T8 c7 {
    # V4 ^) a& J6 t: }4 }试图在指定的范围内查找对象, \8 k5 m' F! s7 |
    ' z7 ^1 B4 J. t. ~' z/ `" A
    如果没找到
    4 _( F# w4 m* D/ o5 J' C- p! N- v; ?2 [/ h+ C/ t& f
    创建一个类的实例3 c3 v8 K& E3 }+ Z9 [; i# ?

    0 s8 ^" a/ i% T执行useBean标记体初始化对象
    / @9 R* O0 ?! m2 G7 A1 E# u: i# ~' H+ Q& b5 N" g7 j
    如果找到6 l) W) c+ H% _( {7 r0 y

    & A1 @, e0 t4 N% q7 @5 N1 m     将对象转换为类指定的类型
    " ~' z( C$ u. v+ R( K" b
    0 h" Y# B" Z/ c9 X: `: x7 c  ~* a4 Y
    $ @9 K; b7 B/ g2 x6 K+ d
    + T, E$ C& g( B" S6 {! b3 Z* S2 J描述forward动作的功能
    ) U5 i6 R9 y$ H+ }+ m, z- v使用脚本代码处理请求时,可用jsp:forward 动作产生一个不同的视图,* i8 l7 p' V3 `3 a" Y) ^8 M

    2 f% P0 {; W1 }使用同一个request:3 P; B3 K' B, Q7 m, e; ~
    ; c3 P/ n3 a0 D. n2 j
      |: }8 l; c1 X4 p! r
    0 ?! Q+ P1 U9 o: l
    什么是Model 2结构,以及结构中各部分的功能- t7 e) t6 ?+ |  G; ?( \
    jsp+model+servlet
    ) o& a0 X! A# E/ n! G7 `  g
    1 o! s6 |4 n: M8 G. q' SModel 2架构使用MVC模式,JSP页面充当视图,Servlet充当控制器* w: e' {5 K/ ?) r' h& f6 i6 f
    $ J6 n" C" A& M0 u' E0 ~
    Servlet控制器:
    6 ~( X) B9 {7 e) e0 w
    6 R/ n' e% @3 b& i8 Z验证HTML form数据; I4 {6 q# u4 @0 D) q* d5 O, s1 @% y
    1 \( Q% X3 z. g7 e* j' R
    调用模型中的业务服务" x7 b/ f5 D4 }/ M  e! |+ b! b

      E0 K4 i& |. G+ y存储请求(或会话)范围内的域对象5 i3 g+ T& `0 J) \! T

    ' P( |; Q7 s2 {* M选择下一个用户的视图5 v: r! |) k, ^2 D# Z6 G
    0 \! k) ?5 i& I/ q: V# L- b2 f
    JSP页面视图:
    . e6 g; ?! ^. C
    : f( q, H2 ~% a! u) u8 x( {使用用户界面(在HTML中)
    7 m( @  \3 O; K2 Q- `' a; G$ }! y9 G- F& t  P
            访问域对象
    ( \6 v: w0 y, Y) d/ z7 t2 {! Y1 t/ z+ l) \

    * P1 z) F+ ?$ h8 E! |6 c
      f# x( k- s" N8 ]如何获得分发器?分发器的功能?# W9 {) L' T/ N% j
    上下文对象中的分发器:
    # b9 d5 b8 }* P5 ^: d$ k5 e
    1 M3 o, H" Y1 W. J' `% @ServletContext context = this.getServletContext();, b( A! [/ L! B# p
    0 V) }5 n& ]! ~2 ^
    RequestDispatcher servlet = context.getNamedDispatcher(“MyServlet”);4 S/ H5 Q5 C  J/ ]- Q9 O

    + j; l) n' w& o& Lservlet.forward(request, response);
    % G, H5 h+ c/ ~8 S4 n2 V7 n& t' K  P) c3 X5 J
    请求对象中的分发器:6 ?% {5 w- r& U& q, J2 h& J6 w

    , Z. t$ `: q# K' C4 c* j* aRequestDispatcher view = request.getRequestDispatcher(“tools/nails.jsp”);6 ]/ x1 H9 h9 I9 b

    % P9 ?1 i- ~1 j0 v. n- \; tview.forward(request, response);
    ' k+ T$ u* e! C2 I7 e/ @% I% y3 G- G1 |+ [( K# v, p  d' }- w  E& S
    可以将请求转发到另一个jsp页面,并保持请求的传递性
    3 c$ h& n5 w. E: g: ^( h( h9 D* d" X/ d% I6 C4 f1 ^* }8 S

    % ?. ]' H( K1 ~; ?
    % y5 Y) F2 s' }0 R0 C4 n3 kJsp中页面跳转的两种方式?
    2 k6 ~* O* a0 m使用分发器跳转页面
    ; Y* v0 V6 R# U1 C9 u; a; y4 ]' tRequestDispatcher dispatcher = request.getRequestDispatcher(“url”);  O7 N1 W# D# t# C3 q) q- Y4 M9 s
    1 t" X! `1 x8 n4 s
    dispatcher.forword(request);7 }9 x" W- n+ l( V, b
    4 G1 w# B$ Z* Y' S
        特点:保持请求的传递(上一次请求中的数据,在下一个请求中仍然可以得到);8 T5 z* T# K8 N0 m& N

    0 Y* v# B  Q( {! u- i4 a- j        转发的页面只能是同一个Web应用程序的其他Web组件. D& x1 c2 V8 |: r

    ' B- b. q3 D5 _( X) y- _使用重定向跳转页面/ J* y1 ^! w( f) ~
    response.sendRedirect(“url”);& J2 V# p9 @& p4 O- b8 c4 p! n( H

    2 W: x9 M, ~* l: ^    特点:产生全新的请求,(上一次请求中的数据,在下一个请求中不能得到);
    ; k- I0 d- y& o$ |+ P
    7 `' v/ F5 O' i0 P( {) i. K        重新定向的页面可以是任意的URL
    / A: \. K9 Q& p" |" q4 ~4 n+ C
    5 o, e- [9 S6 `1 v9 G2 V+ M9 p/ i
    : `  Q9 I5 v1 @$ U2 N7 K' S8 F3 e3 w- o6 S* H& b( j
    描述Jsp中引入另外页面的两种方法,并比较两种方法的特点?
    # x* \' B, }, d# {& X, Z' e6 ?+ O& R<%@ include file=””%> 在编译期间把另一个页面完全嵌入这个页面,可以说是一个页面6 Z8 O9 w" g% y* D# X

    ) t( s  `+ Q! {# H在这里可以共享变量/ N: h- E9 F7 e6 {- K$ H2 J- f

    & v7 I) F$ U) Q: K<jsp:include page=””> 动态的再运行期间把另一个页面加入这个页面,可以说是两个7 N& E% d! K: r" n: ~
    8 a$ v; L) [/ ?+ c& H$ i
    页面,不可以共享变量% ?. z) g' X: l0 y  A1 N/ [$ Y/ b

    # a, y& p2 c( G5 r. S5 r 5 \* v9 H( i8 d; p5 ~8 w9 S9 Z
    " |& h+ S: G5 t
    什么是自定义标记
    3 H& b0 ~# i7 ~1 G) [: U自定义标记库是一个Web组件,% H& ?8 f# O. E% `4 }: p+ n. G( M
    " X/ x6 ?% h6 n" v1 M, x  D) l
    包括:& M7 D5 V# |2 N* c' e- w
    ( {) B/ L0 D5 s  k
    一个标记库描述符文件(*.tld)
    - }8 [9 ]. q) t/ c- ]0 v! n, ^0 _
    所有相关的标记处理器类(*.jar)
    ! [, R/ y% }  S6 T/ i1 J
    8 G  t& q1 M+ [) X( V  n2 D; K
    0 m' O9 z$ ?7 a+ a2 U) L) H( s& ]( |1 \4 Z
    描述使用自定义标记的步骤,以及每步详细的工作
    # F+ C( F. {5 `! R) R0 I使用自定义标记前,要拿到.tld和.jar两类文件
    " [4 F0 d; a! Y  i' Y- v1 Y: ]0 T$ s% ^/ x
    把.jar文件放到WEB-INF的lib里面。
    5 `7 m3 C8 ^' [6 E2 N2 B把.tld文件放到WEB-INF根目录下。
      P' u5 i4 v9 k7 a8 z5 G在web.xml中配置。. X) p8 t  g6 U9 Y( l
    <taglib>5 B+ ~8 L: S: @' i% S: D& f9 u

    / p1 ^! T7 n- g  t: J<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
    # ~" L6 q, h6 S" N( ?
    ; h) n3 E  u6 k7 `     <taglib-location>/WEB-INF/c.tld</taglib-location>
    7 N: ], ~) B4 ~) c- f2 [3 N2 o# e
    & s' w2 y- g6 _) \9 O</taglib>$ b3 |. R( n, R- e
    * D$ G: z: E8 Y8 l
    在页面中引用。+ I1 V; P% I9 x7 Y( N, Q2 c
    <%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“s”%>
    & e  ~# v' F1 [3 I: u9 G$ Q* i' E$ z6 e
    uri必须与web.xml中的uri对应+ e" Z* U! ~" T" n: U

    , q7 r/ J# v  H% Bprefix是前缀,用来区分是哪一个taglib
    4 e  @9 o( Q5 q. @* Q
    ' o: t4 B( J- L, k* }, \$ d" d# _使用标记
    % w* I$ X0 x+ n) F9 v5 @3 B格式:<prefix:tag名称 属性>
    # B5 G! p3 _7 V. [
    9 q6 C: A' |# A- l- U9 V<s:forEach >
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    14#
    发表于 2014-12-03 12:45:59 |只看该作者
    在tomcat下配置数据源; [/ |, D. F. O
    1、服务器与数据库的连接4 z  J5 J1 Y( w' ?, Y8 `( t
    ! @- C/ @% r( }# g
    配置server.xml文件. D& q. c7 c  e5 i3 Q
    " O* e0 W; O1 S
    1.oracle
      Q/ b" J* p( r! I) q$ }+ U
    # B  C5 m5 p1 p+ Y9 F  J<Resource name=”jdbc/company” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
      Q7 \0 m! m% l+ q' ~+ O$ ~
    & e* O5 {) u2 w                        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”. s* Q; u1 R, j/ U) Q( u: {

    ) X8 ]# m* L( Q. w' Z; d2 Curl=”jdbcracle:thin127.0.0.1:1521rcl”# N) L1 b8 W# P5 W+ p

    8 ^& h0 L& b! |7 b/ Z+ f. kdriverClassName=”oracle.jdbc.driver.OracleDriver”
    : L) b) b. [4 K1 K5 P0 b7 D  q# m( P! {) x6 K
    username=”aa”
    & Q- ~+ l8 p, u! @/ K
    " }- z: N' [  W+ M) rpassword=”aa”
    5 ?6 c9 B3 F! m) [1 N( }
    2 ]7 E* l# w! _6 D) v+ bmaxActive=”50″% Z3 O0 R0 ]2 S8 ^! R# N

    0 B, A* i" x5 }" `, ?maxIdle=”10″( f$ J2 s, O) |; D2 f/ ~$ K; x
    : |! E' k5 L8 c( K  p  p
    maxWait=”-1″( _: u& V1 `0 ~$ s

    ; [. |  P: l8 G5 [9 N2 |& U& d: T/>
    1 p/ D+ E% f$ \& i0 X/ C# U7 T8 m0 k/ O7 Z
    2.sqlserver5 [2 X' a4 p4 q) ~" Y* j' \* O+ T$ d

    & v, G+ q5 d  ]<Resource name=”jdbc/webpage” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”( ?/ s7 q1 v( X
    4 B5 d. ?  J! M% C1 I$ w
            factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”
    # }9 ^" Y: m, L0 C1 r- A6 v6 L7 B" D, i1 T
    url=”jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;
    & z) @) F* u+ @) v4 t8 W- ^0 Z0 ^- R1 h5 f  K- h( c
    DatabaseName=webpagetest”" Z: t. U4 Q4 E2 z# N+ R

    3 ~1 i2 n: b/ g1 EdriverClassName=”net.sourceforge.jtds.jdbc.Driver”! [) e2 L  F# c  @: K- ^  ?1 u
    1 J; ]% k; b4 N5 o; S0 z# c0 w9 Z
    username=”aa”
    , a+ ]# q) K# h* Q4 m! h) s
    . I  V; c( t, C; x: ^. Jpassword=”aa”. @5 |- P4 ?0 j( M% E

    , ~' L1 \! j# T# n/ dmaxActive=”50″( ^6 Y8 E1 `) V+ b1 Y% t8 H1 O6 P
    # _" S. r* Z1 ~0 X4 Q& G5 \
    maxIdle=”10″+ T( z) [& h9 ?0 k4 Z; N
    6 M( F& T2 |5 }# S* u
    maxWait=”-1″
    9 C4 w) P7 \& E0 i  W1 S) U
      A6 {6 d; c0 E" E/>8 P& @5 T; w+ {6 F
    ; S" @! z% Y" V7 S) f
    2、配置自己的web应用的xml文件
    * A- ~: |$ i) W
    & j: s3 O. \( N" Q5 |- N% N
    2 a4 {' L; @1 u! L
    0 ]  X" `8 r3 I/ @+ L<Context path=”/eb03web” docBase=”F:/workweb/eb03web”, L; B% t& O! L! J# {5 J
    , J! v! L- V* ^7 \/ Z+ R' ?: Q! t
    privileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>1 i$ x7 R+ @+ l' `$ x  I

    8 |4 R4 v. e0 G# `4 h5 ^<ResourceLink global=”jdbc/company” name=”jdbc/company” type=”javax.sql.DataSource”/>+ I6 o7 R( @: v, g! J. D

    3 e; N3 M: F, H3 A) N</Context>
    # E4 o  g) B+ w' ^3 B: D+ A& `: L
    3 u" Y! x/ `+ p" }6 l: d& J1 A # j; M! \- I0 q

    % l5 |) v. s! h. R- v- S5 O3、配置web.xml文件
    ; I- }1 }# N/ k$ A
    ' H- S2 q2 u6 _6 Z' H5 A与服务器建立连接& [: ]# f! _0 n+ Q/ v5 e' U
    2 O( ?5 H& B- a9 }8 I/ _4 M
    <resource-ref>4 z2 Q& G! `+ O- m' D
    , K1 P  H6 S1 W$ N7 v
    <res-ref-name>jdbc/company</res-ref-name>  A( x' m% d' T/ I/ E
    ) z: u$ m0 u* u5 W$ q
    <res-type>javax.sql.DataSource</res-type>3 t7 h" D6 o+ l+ @/ w

    & a$ m8 i& ?4 E<res-auth>Container</res-auth>0 Z% V& v. W1 r4 z0 F
    ' |# |( c! b( V, v! N, l
    </resource-ref>1 r' U3 }- D8 Z* S! s  k

    ( K. h" |; [$ V7 u- @. s4、在应用程序中不直接与数据库连接,通过DataSource连接池建立连接5 m7 ~  ]# g% x0 b8 S  o) R8 [
    6 J$ f% e' {1 d" {/ X- h7 Y
    //1.在程序单独用时设置系统的属性,在tomcat下可以不用配置,
    $ ^; [0 z" F4 i( j* I/ i& q7 U* L. x$ K  [+ x) U0 d5 e
    System.setProperty(Context.PROVIDER_URL,””);
    8 s; p) H; _- r$ O
    3 @8 E# \0 w4 o5 tSystem.setProperty(Context.INITIAL_CONTEXT_FACTORY,””);* V8 A# ~2 C+ [& A9 _- G
    1 y9 W" g( T5 a' }" _% \( k6 K
    //2.创建一个上下文对象* A; F  |. g2 C0 r: N' g" ~
    ; R5 R) k3 A$ a2 ~$ A* v
    InitialContext context = new InitialContext();. E* y* M; N9 q4 C  Q7 Z

    ( E) [/ [' Q+ E5 j. a$ b//3.通过上下文对象在连接池中查找DataSource6 M7 ^( C) p) b) q
    8 c$ q- m/ |/ N2 S7 C4 N
    DataSource ds = (DataSource)context.lookUp(“java:comp/env/jdbc/company”);
    7 u: @0 y) W# ^! ?, |1 q* f# P, G9 R  |% y- i' z) t0 h
    //4.通过数据源建立连接
    0 X  _/ L) ?+ A2 Z) e  |0 L
    + |( m# s, L4 o4 y2 K* }+ gds.getConnection();
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    15#
    发表于 2014-12-03 12:46:30 |只看该作者
    ORM对象关系型数据库映射; x& y8 G  h0 ^. a( l2 \1 C
    (Object Relation Mapping): z+ Z- @2 d( T  n; }
    2 E- F- n0 g" H( a, n
    一、映射的特点8 c$ y5 D% h; L9 v  H

    5 k0 O/ F7 g, E% a1.一个对象可以对应多个表
    . r. \/ E. Y5 g& p  ~2 g$ u! g6 z4 e6 j7 C! Q  t* d/ t! [
    2.一个表可以对应多个对象
      b9 D& W( _6 s5 Y2 S; Z: t+ k
    # O3 L$ l8 R) u$ o# }3 @3.对象和表的关系不用完全对应* c* u, V/ j, H

    + m/ h4 A$ j* H4.对象的属性的名称和表字段的名称可以不同! S! B# g' b( h1 W) x* T4 W: Q
    ' B5 L1 m* Y: S4 y2 {6 `7 y) C
    5.类型可以不同,但数据类型之间可以转换
    3 P0 C/ z. I' S' H
    * w2 S+ x' \8 \* ]6.对象中必须有主键,数据库的表对主键无所谓+ B" u# G8 S+ I5 @

    7 Y/ R! r* ]3 N7.数据库中有主外键关系时,对象中可以有,也可以没有( ^4 Q3 R. o5 X

      ^( ~3 ~% }' I
    * N; M) d5 K5 ?& q
    / Z3 u! D: ~4 ~" O% G) V3 `' B' N二 、有一个映射的描述文件————>xml+ s4 I; \7 y8 H
    : W2 y1 a! s/ U! @8 \9 L, o. i+ N0 u
    三 、怎样实现描述文件————>一段程序
    " b1 u0 \" h, R; ]0 c$ n3 o" M
    $ m- ?) s9 \; A" v6 w对象 映射(mapping) 数据库
    ' s  z7 Z: ^3 z) [& d2 w' t0 D2 t/ S; W, j5 B
    user; q1 H* F! Y: W# O2 R
    $ I3 a; T, d0 t  J, L, U! E, b
    id=118 A/ K7 M+ L3 [* e/ N9 M
    ) Q  u/ S& D- f6 u, k6 U
    name=”张三”———— > (1) —————> tbl_user(id,name,age,tel,address)
    # }$ p0 `/ R5 Q5 ?" R9 G
    0 f# ^# ?7 o8 O6 Qage=25 <————(2) <————
    : A1 J$ h* ]( k% r. t6 }) |! O
    - W6 e. ?3 Z8 ^: S  C$ {  L 9 {4 E8 @+ k; ^8 f+ ?

    " I- J$ A6 m: X! q4 W. V) O(1)从对象映射到数据库5 `3 N% Z. g1 W6 ]& i+ ]

    4 M0 z1 j' b. Q+ c2 P1 [; m8 I, f1.JDBC5 u" r' ~2 L& r
    $ b! K, m$ ~* d0 O, M7 o
    2.根据描述文件来动态拼接sql4 O+ Q  Z0 H; n4 }' C

    - D) v& f+ X5 a* x3.执行,添加到数据库中
    ' N; f/ ?& ~! `  P1 R& Z9 x" ]7 u6 F( j: E
    / i5 \3 g" E  Z& G; E: K
    . b! t: M+ V6 Z" H
    (2)从数据库中映射到对象# J" X' C. {2 ~4 g: T
    ' K2 k* E$ E! x9 ?3 S% Z
    1.JDBC# Y* G* T6 P. a

    6 G1 u$ B; F# {5 b5 j9 J" {& `. e2.拼接查询sql6 D, d8 p! y0 x1 _$ ]& ^
    * s, G& [2 I$ }+ w4 h
    3.ResultSet, D% A5 l7 A+ {0 Q. v2 r! ?: E
    0 u; `2 ^1 ~  W- i0 `
    4.Model + w3 G9 ^- J. E. f, [! J2 [/ W
    2 H( O" T+ s; a  M# n! _) w& U
    ( F; S3 t6 E) Y1 u8 A

    " B+ q  u2 E( a5 M% Ohibernate
    $ r$ P5 ^2 x# C+ S9 X! g开发流程:
    ( o3 G3 s+ R/ z8 ~  g& g
    ) I% |$ J5 Q7 X# Y是什么?
    % Z( D3 K: r' G- e  q1 ]hibernate是一种基于orm 的轻量级的框架
    ) ^! C- X+ A& F. i# F. M$ v& K  s% \" f- p6 ]" ]- m6 b# o
    9 Y% D+ ?& M0 b! l3 E
    ) f7 }9 _2 K+ w1 I5 p( g9 o1 E2 a
    有什么?
    6 H8 s( G3 ~& j. l  k0 Y  c. w3 i1. session 保持连接状态(依赖事务和连接池)0 _2 G/ S  e- e: H. k* M. l

    & Y$ n% q9 ?  p5 ]* |5 b; l+ w2. Transaction事务6 c. v+ j) c, Z! Z

    0 J4 C0 u) r7 `; W3.+ I9 v) r1 a- Q0 M! k: d& n
    Connection Provider 连接池
    5 f+ u3 S4 x3 ~1 O1 h5 X
    : v0 _* h8 S- u0 j  a 7 N1 D. v; W1 i+ R
    # I) S1 y) x# v1 C; k, o
    能干什么?: t  A' Q: i* G$ {3 K* V
    1.orm. f# s3 G# o4 P# n( E9 t( a0 F
    0 ]& D/ l! j4 G* J+ N
    2.提供操作数据库的接口,简化数据持久化的编程任务% D* |: l/ n) u
    " z/ J# M2 j1 O' ~

    ; }( G( n  x4 Y' y! J0 y1 v/ |# D, q+ t( `
    怎么做?" r( D5 Z, `: |- o; W6 P& z
    1.搭建hibernate的运行环境,将hibernate的包和hibernate所需要的包拷贝到lib 文件夹下
    # [2 d, ]/ z1 q4 K* u4 j( t8 R% y% p7 j+ \0 `& @9 H
    2.O(vo)
      P/ J, v# i7 |8 _/ B& o0 Z/ a% u6 o  f
    3.R (关系型数据库中的表)
    ) d  _) K7 z6 u9 ^
    & L) f+ \  M$ l$ d  \9 k$ w  F4.配置文件( p- s0 j, l' ~4 D

    , _( L& {  M' P+ G: r& i4.1 cfg.xml 放在classes根目录下,默认名字为hibernate.cfg.xml
    ! |& o, g0 W( p, f$ R' |
    3 x2 O, a* [0 V: R- Ma.与数据库的连接4 q( Y  Q0 {! R9 g( a4 g5 r& f
    ' ^5 \) d, {9 O; a$ K
    b.可选配置
    $ r+ s# V* X- h  e
    8 Y8 @. G" x7 Uc.映射资源的注册3 L) T5 f5 T2 |% I2 b8 N0 e$ h

    : r5 m/ Y, D' R1 e; E2 L4.2 hbm.xml文件 名字与类名相同 并且与类放在一起
    - q4 M% [1 E, h) ~) W6 ~5 g4 E: n- L- l; E4 D. }9 @( S: g1 F+ l& S
    a. 对象与数据库表之间的映射
    2 Y9 a; U7 ?; B! [3 R: N4 G
    ( U! m5 R4 e* d& R3 w  Rb. 对象的属性与数据库表的字段之间的映射, D+ Y0 l$ q8 t% J

    1 f- S1 @5 |+ `3 ?c.组件之间的映射
    ; x7 K( N* r1 i8 d
    6 u4 L; T  h. B' Rd.对象与对象之间的关系映射
    7 U' ~& J" z2 F1 D
    + `2 G" ]# g, B8 y& P5、客户端
    * x3 W+ v# [5 m8 o/ i( y# ]2 \
    2 Q3 t  @: A/ A9 |! T! N' c1.得到SessionFactory
    " H- ^, Q2 |  E+ E
    . F( }0 z! [. h# J2.通过SessionFactory 工厂来创建Session实例9 y2 e) m* m  N+ l& l* q

    * B' |! `  h, h  L3.打开事务/ \/ C" l2 z# ^) n2 u

    8 B4 E7 {& z/ R- o4.操作数据库
    1 J9 Y7 B  Z3 ^# q$ T5 ?* O- b) V5 A5 w, ~' f$ x
    5.事务提交
    & g& \7 N- E9 g0 v5 W- {4 l" Z/ g
    % X4 W1 d) \8 {1 x3 E- J& S6.关闭连接- g* M' W# M4 L% _

    ) |* D! l+ f$ P5 d运行流程:
    : H7 u) q+ g+ S) v2 v! w; H7 L- C8 v! _
    整体流程
    # A' R" V7 m4 `1.通过configuration来读cfg.xml文件
    5 Y% R/ X( J$ g9 z+ x# w
    0 y! X( `5 h0 y# r& |$ u2.得到SessionFactory 工厂(根据数据库的连接来创建sessionfactory)8 W" s+ `: s9 M; D0 P) [; O
    / ~( [) ]. K0 T& \3 T& p
    3.通过SessionFactory 工厂来创建Session实例
    $ _8 i3 I, l3 g) `6 l% P- Q% F, r+ U' r5 e% t# o% \( g& |/ l
    4.打开事务3 R. t0 P3 z: W  K

    ) N9 t( ~$ [" J4 b5 M$ x) O# t5.通过session的api操作数据库; a0 _0 t7 X/ a0 A7 D. u9 P
    * G) Z. T. D( u- Y8 m7 F- V" J
    6.事务提交5 B" _3 l* N* [4 ]

    ; p( O2 {" u& I0 [' y( p5 l3 A7.关闭连接
    5 U% p8 P$ C6 D- H! {, N5 _2 b! A$ O( B5 L5 t! I( _

    # s! O9 `3 a, A2 X" {" D
    4 Z' @9 T) e1 U, f6 x* qsave& q$ b7 v5 }" T  D9 S4 G( `
    1.to—>po
    . }+ R) W; u: W. ^9 d( {; X" D0 n0 c! ?
    2.根据model和cfg.xml中映射文件的注册来找到hbm.xml文件! Y+ e( d+ M6 I8 T

    ; W1 P9 b; _$ L& d6 z! p3.根据hbm.xml文件和model来动态的拼sql
    + N+ ]5 D2 E1 i, M! D+ }# [# @$ A
    , e3 a6 C; k, @7 l4.客户端提交或者刷新内存
    0 e2 L+ U. e: [. k$ q9 M, R) k# q, o5 s& ?/ N
    5.执行sql,值放到数据库7 N- p% u; K* C0 |" j3 ?* \5 x
    6 K( y* m$ q+ @  K- l  ]% F- [* E8 u
    3 k6 z2 ]% M. B' Z/ s) a
    / C0 u) ]8 X4 D4 n- y# z0 c
    update、delete( ?) d- `3 V: ?4 h& @: V
    1.根据model 的id在内存hibernate的缓存中查找该对象: H% L0 h6 x0 ~2 D9 |1 V

    * D8 g$ C/ r4 C$ O7 ]9 j! ]如果内存中没有就到数据库中查找来保证对象的存在, R8 ^% Y: `4 I) _
    ( K% a; @2 j& ^, g* a( x
    2.根据model和cfg.xml文件中映射文件的注册来找到hbm.xml文件+ A3 k. E) R9 c0 R6 @; N
    : {1 B2 u1 _8 ?4 i/ C" m
    3.根据model和hbm.xml 文件来动态拼sql- e4 p0 N+ h% e8 t

    + E, b1 e- {" t( K3 O+ O4.客户端提交或者刷新内存
    ; R/ z* ]% H% {& j: {
    1 O) U7 K' b7 E8 I4 K- ?; B5.执行sql7 {4 z1 P8 l/ @" {! Z) b

    " v- M8 b  \. x5 Q( E" |
    ; e4 V5 X, i9 Z0 K7 A; o1 I; ^# Z
    Query: S5 s+ n8 F% @& s
    load! G9 [$ S  j6 ?' G2 O- N' ]8 N

    . M* B$ l6 m- D, O1.根据model的类型来找到hbm.xml文件
    ! i, j+ r! b0 V# `+ n1 ^4 b  ?. ^+ G" M6 H: x, q
    2.判断id对应的对象在缓存中是否存在,如果存在,就直接使用,如果不存在就进行下一步。
    3 Y( u+ n4 F! W* ], {/ N, U- @; i0 W- b! y. {& C: p1 |4 A6 z- B2 i
    3.用id做为查询条件来动态拼sql4 K* A) k3 A0 b& F7 F' O& F

    / s/ ]  N& S* o4.执行sql 查询(先在内存中查找,如果没有找到(会抛出例外),就去数据库中查找)
    + q. H$ A6 A3 i/ m
    : l4 A: M9 ]* P( M  G, W4 R5.返回一个model类型的对象
    9 B+ y% R# O( c, d$ i4 ?1 v8 T8 K! l3 ^0 B9 N' R5 J% ?
    get& M$ J, ~: u7 X1 C2 |1 @1 U
    ( m$ g; W/ r' E5 q4 {& a9 c* R
        1.根据model的类型来找到hbm.xml文件) ~5 o# n; m% v) V1 y: ]
    9 U, u2 O0 K1 O! @
    2.用id做为查询条件来动态拼sql+ K( _9 I. ]7 y- j' i& u' Z

    * |) ^7 |1 q! A4 [  p( g3.执行sql 直接在数据库中查找,如果没有查到就会返回null6 F( s* I& B4 H9 D& O0 Q# Q
    : P$ Q# K! z3 o9 N" I1 Y' Z
    query
    6 ^, _( o, C' W# |. c* V9 }$ ^  k
    + X/ l+ r" A. ]" Z1.分析hql语句,得到model的类型8 X3 a8 s* x9 u& H9 l! i7 R
    2 @) |9 z( W* i0 f4 c9 l# B
    2.根据moedel和cfg.xml文件中映射文件的注册找到hbm.xml文件
    ; B  R% X* {2 H; T0 d- M, H0 g5 K1 |6 U# _
    3.根据model和hbm.xml文件来动态拼sql; ?, c; W# t. I; j0 M4 Q

    # n$ t* b2 f- K# B) T+ y4.执行sql查询数据库: @# O4 ^* I9 }% ?1 Q" _- }1 ^
    0 X. f4 _/ S% p( x5 C+ W8 `
    5.返回一个resultset5 e& q1 r# z5 G5 P
    & \  M' \" V# S& @
    6.循环resultset的值,放到model中在放到集合(List)中: Q' g' E) M$ [, n7 w" ~1 v/ u
    4 F* V8 \- C0 u; r: U
    ; ^, ]7 D' T" r9 \. F& O
    % B$ _9 N3 ^! L  t4 W5 F: A
    谈谈hibernate缓存机制
    $ ~$ M# o0 q" T( g- I3 a. S1 X% _
    缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了。打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去数据库中取,也省了很多事。
    ' V7 z4 P" H( Z* \4 s) y7 T+ i9 }( o
    ' p9 @4 z2 X5 g$ q! }2 q
    8 N! @' f& P, Y! X
    2 s, D" P% q8 G( O# @8 _  U) M0 Uhibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。% C8 ~3 _5 `& K" @) k% ?

    & Q) W5 l8 z, T5 H* f- V
    5 p! q. E! [) [7 w0 I+ }# o1 _- ~0 D( W! X: _9 O/ S- W! Q9 L1 ~
    对一级缓存中的session事务进行数据的预存取,数据在各个session的上下文中存在(单例),当session关闭时,就是session.close( ),整个所有session范围内的数据全部清空;二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二级缓存只有一个区域 ,画个图比较容易理解。1 r" _7 F8 `7 H5 U

    ' @, |' s( X  R+ C  G1 i 6 W; Z: X* @  @! q) B- l; \5 M+ H# O
    % e# `  `2 Z* J5 J2 B
    | 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|) u! p% @% A$ e/ N; `
    * M7 B! R/ ~7 C! W1 z+ [+ `- l& j
    | | | |  K2 u/ z( w$ f4 P% a6 X3 m' i4 b
    # @5 K" i- W' r* J; e- b: v
    | | | |, f, S0 m# K. [; r* E) H

    * ?* r' b% ~3 d$ b: j( u7 \—————————————————————————————————6 Q  R1 }  \0 }+ W( b- q2 b
    ) J8 Y( P/ P! C, c
    sessionFactroy级别的二级缓存, p/ o" K8 Z/ w: d
    . X. ^) [, R- T6 t2 D& f, F
    ——————————————————————————————————————-5 d' {1 {1 }, N! d7 U' q

      w" |, B# X0 A9 q+ p1 w|7 s5 C; L3 E8 f+ X
    4 M( l( [' X9 p6 l6 S  M
    |
    ) q# S0 p8 r- Z, [1 ]) K9 H# P* o- q& A
    |: @% A) }0 @5 V, C9 N

    # E% H% B0 }" n& b( o' L1 K——————————————————————————————————————
    4 ?. K" m3 K5 X: u: r
    7 }1 n1 _6 y) N% B$ `$ oDB3 T/ p3 z- L' q# X

    ! u2 Q3 v- U8 C  }7 |/ P: a—————————————————————————————————————–
    8 e1 ~: C! v3 C3 q. X; |
    7 s# n0 n9 T  i+ q9 F  d9 l& n
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    16#
    发表于 2014-12-03 12:48:12 |只看该作者
    Spring
    - t7 E3 O' N) r: }- X7 C1 n9 J7 [
    • 是什么?
      0 l1 {" L0 i  e4 f+ g# ^; J
      6 K# V  {, X' a) k* H

    Spring是基于JEE的轻量级的应用框架

    9 e0 @1 G4 D# ]: C
    • 有什么?% Y4 ^  e6 D: Y% `5 u
      2 `0 I/ ~4 ^* b0 `# ?

    " ^3 n  Z! A0 e

    每个包的功能:

    Spring MVC:spring 本身提供的web 框架

    WEB:集成其他的web 应用的框架,或者说是对其他web应用框架的支持。如struts,webwork

    JEE :集成一系列的jee的技术(对JEE技术的支持)

    DAO:封装了JDBC;(对JDBC的支持)

    ORM:提供了对ORM工具的集成(支持)

    AOP :面向切面编成

    CORE:spring的核心包,提供bean的工厂和IOC容器


    ( ?* }  I& j( ]- X9 n* o9 y8 G. f
    • 能干什么?. L( W3 Y4 ~, L2 g% S) j
      ' ^& G. m1 s$ a1 A- _( a: ^7 P

    把一系列的jee的技术有效的组合在一起形成以良好的系统


    % i: U2 ~6 P4 t, `; k# n% ^! P- L
    • 怎么用?$ A" g$ P7 n2 E& Y! S
      9 {) R$ g: i$ g6 ?2 t, g4 T- f
      • 搭建web工程,引入spring的jar包
        2 S- }; d2 ^% }& N5 Y& d
      • 在web.xml中添加如下配置
        ( S( L9 e* O# ~  @: ?8 Y& k6 }& T

        - g- l4 r( @* I  F9 \

      / a  j# M9 @3 L: g; K
      2 S4 [5 X/ E. g/ Q

                contextConfigLocation
    * W* t: r# I1 y+ i' q0 k9 R& X

                classpath*:applicationContext*.xml1 D3 ]* H5 {2 z3 z# ^

        7 J0 {" E- s3 b6 g8 ]

            " j1 `3 A8 K7 i  j- {# _* {

                struts2% K; _5 ]4 y: K/ n( i4 T! t

                
    . y( d; ~* [( F

                    org.apache.struts2.dispatcher.FilterDispatcher
    % |; b9 l4 T2 P/ `. L* v8 `  i

                
    2 ~, m6 G1 H* |; Z. l: B. `6 g/ |

            9 O8 I3 J) _$ }8 j9 w; Z# D7 Y

            
    4 y. ?- S, F  E5 \

                struts28 E4 Q, c- Q. ^7 t7 K. z

                /*8 @8 C, ]4 ]' a( t$ S+ Y7 }2 F


    ) U9 @' v4 r+ [! Q7 O


    $ Z$ \: K) A" f0 h1 R: ?3 L3 B! g

                
    . w/ Y& e0 j5 G

                    org.springframework.web.context.ContextLoaderListener
    # }4 |0 ?3 @' {- m" a# c$ a

                8 ^- W  {1 i. Y& l% }9 J

            

    • 部署
      ' L4 i* ~: _; Q. D  Q* {+ Q

      / K' y1 k4 s2 W3 X
    8 p% n5 g3 L- T. c6 {

    $ [+ q3 n" q  N2 t  X" J7 n6 v( \2 H. _3 o, R
    • 容器和bean
      , s: C0 u* O* q$ B* V: ]! K; l0 D5 j" e

    Bean :是指受spring的ioc管理的对象称为bean

    容器 :(与jee的容器类比)

    Jee :提供组件的运行环境和管理组件的生命周期(不能单独存在)

    Spring :提供bean的运行环境和管理bean的生命周期(可以单独存在)


      s  r" K' x& ?8 \: w" I9 Y
    • IOC控制反转
      ' _4 G) h# h! b3 ?! o) ]$ f" w$ j$ H/ E$ P

      9 L  R# I/ Q) v' I. | 9 a* B4 [; v$ e
      从前的应用程序想要得到A的实例他会直接主动的去拿,当用了sping后,应用程序由主动的去取变成被动的等待,由spring来控制应用程序所需要的对象
      : z! W& }0 f) e# ]! W) V/ Q) d9 T
      • IOC的优点
        % R! @! n  T: q
      1.可以通过IOC来获得实例
      2.可以通过DI来获取注入的资源
      • 配置IOC的原则
        5 x1 @/ S2 ~; i# a
        • 一定是可变的资源才采用依赖注入
        • 一定是层间的接口或者是模块之间的相互调用才采用依赖注入
          8 L3 d- ]9 U& p3 F- l3 h6 u

    & f% n; V$ t8 k4 b" ^
    • DI依赖注入
      8 S4 N: K4 q7 i3 n. h) G

    1. 应用程序依赖spring注入所需要的对象

    IOC和DI是对同一种事情的不同描述

    2.setter注入: 在配置文件中将接口的实现配置为bean在应用程序中注入bean

    例如:

    在配置文件中

    ! F0 Q8 \1 e7 K. A; U5 k
    - Q. I/ r$ a" \$ t# J/ m, b
    9 Z& s# G% E  \" j' ~( W

    在应用程序中

    Public DBDAO dao ;

    Public void setDao(DBDAO dao){

    This.dao = dao;

    }

    3.构造器注入


    " F+ n" {- ~7 _9 \

    4.ref 表示参照其它的bean

    在参照的过程中一定要注意死循环

    5.自动装配———–〉no

    自动装配根据名字来匹配相应的bean 尽量不要去自动装配

    6.lookup注入

    7.singleton

    1.单例模式是整个的jvm中只有一个实例

    2.spring的singleton是指在spring的容器中只有一个实例

    一个生命周期中只有一个实例

    8.DI的优点:

    1.程序被动等待,强化面向接口编成

    2.切断了对象或组件之间的联系,使程序的结构更加松散,运行和维护更加简单


    $ p, v0 Q% \+ R# C1 T  `% Z4 T
    • Aop面向切面编程  v/ p2 V( H( z5 `

      2 e& A6 l: f8 ]& y" ?

    1.AOP面向切面编程 一些较好的模式或者是示例—-范式
    9 M2 h1 `+ F; d" A# \; T' X( ?/ H% i

    切面:一个切面代表我们所关注的一系列的共同的功能点(模块之间的共同的功能点)

    2.AOP的思想: 主动—->被动(追加功能)6 l7 S) c1 C( g* z: x& W& W

    3.AOP 的概念
    8 H% ]( v/ `  P" k: g0 k/ D' O! a

    1.切面 :我们所关注的功能点

    2.连接点 :事件的触发点(方法的执行)

    3.通知 :连接点触发时执行的动作(方法)

    4.切入点 :一系列的连接点的集合 (连接点的模块化)

    5.引入 :扩展的功能

    6.目标对象 :包含连接点的对象

    7.aop代理 :实现机制

    8.织入 :把advice和目标对象连接起来

    4.AOP的事件机制
    2 T9 X7 b# Z3 z

    1.通过切面找出一系列共同的功能点

    2.找到目标对象(在标准的spring 中 接口的实现类为target)

    3.找到切入点

    4.确定连接点

    5.通知spring AOP,查询xml文件,通过代理找到advice。

    6.由aop代理来实现动态织入

    . O9 J& F+ r7 y: m4 n7 E6 y
    / f1 C2 n; Y; ]3 }

    ( L0 P0 U5 k9 e& |
    $ `2 w5 o6 w3 Q* N/ e
    , a/ {: v# I- T0 g# d; \, P2 }. H& z+ Y' L7 y4 I& j0 K/ M
    ! b2 y8 r5 l( r6 c, S

    5. AspectJ
    % X4 {! I4 Y$ ?9 ^) O

    5.1.在xml中配置比较烦琐
    # Z8 f, m* Q4 z

    所有的入口必须从一个代理(ProxyFactoryBean)开始# v, ]# O# a7 g; K6 q; E

    ( j9 @  `$ Z9 l, I6 l7 ?  Z$ C
    / k2 y: x: r5 C8 O, a

             
    # L. ]. c& E6 _% V! W6 G  |' N; z' t+ \! e& L9 A) _

    * b5 u6 D3 G, z         9 c  Z. L, `$ x" t- h

            
    9 n! h2 R: c8 v9 V" Q/ ~4 D

            

    9 `5 P% l$ s( R
    expression=“execution(* com.javakc.aop.MyTarget.t*())”/>. _- R" t/ m& M5 _' M- [& G

            ! c2 R% @+ W: `

            ( R4 _  T1 F% |* Z/ `7 f) w+ t

       
    $ c$ c; O( H4 K3 W

    6 l: x( ]% W) K' q3 ]2 Z$ q# b
    3 B+ r- l8 b4 K5 Q8 w# |. D0 e

    5.3.使用注解的方法相对简单7 ]5 x( q) V; ^$ M

    @AspectJ的基本语法
    0 B4 c( C/ N3 @+ Z3 C3 W. C

    1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面5 ~6 r9 L& q; s

    直接在类上定义@Aspect
    . t: Z" H3 H& r

    2.@Pointcut声明切入点
    & ^' v- u! v# `- Y: P6 O7 u

    2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字' A( \, n0 C. _4 y8 i

    2.2、可以使用匿名的pointcut  _$ \' ]; W6 k. Z

    2.3、执行切点的几种方法0 T2 M3 z/ c) j

    2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法
    9 i' ]3 ~5 h2 [( P

    2.3.2 within 指定到包,不能指定到类
    9 S. g! Y' g7 e3 B# b

    within(”com.javakc.spring..*”)
    5 Q1 a( u4 b# v; }  R& A3 a& |

    2.3.3 this 指定到实现接口的所有的实现类0 T; e3 F" W# Y: t. e

    2.3.4 target 指定具体的实现类
    2 i7 z( O* C& D3 @, K+ c& U3 x

    5.4.advice的五种类型的示例
    4 X  _6 f5 U& }2 y

        客户端必须从接口走才能得到监控,实现想要追加的功能
    " a; y' N+ c; \- ^# M

    5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)7 o2 r% i. i. j$ N: C. L

    追加的方法的参数名字一定要与retrning的名字相同2 u: R* z3 f0 m' C2 V& N) P

    在注解@AfterReturning中必须加上pointcut和returning两个参数- U3 j1 T9 {. J6 M9 g

    pointcut指所要监控的目标对象的方法
    ! m5 R" q! w9 ^/ @+ w! Z

    得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配
    & }  d$ R* C* ?/ P' [

    完成追加的功能
    & j; n/ B  f8 a& y

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用/ u1 X7 m% ]2 U  t" C

    (1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)3 z- s! l+ V7 g% I7 p# D3 m

    (2).) v' @( p8 n* v6 E1 P* l

         2.直接引用匿名的pointcut
    : _4 f# K/ `& U" `

         (1).@AfterReturning(“execution(
    % y1 S- m8 l1 k# G

    * com.javakc.spring.schemaaop.Api.test4())”)* b: `* Y% o  K* p

         (2).@AfterReturning(pointcut=
    " g8 d6 J0 f) c0 P4 F

    “com.javakc.spring.schemaaop.TestPointcut.t4() &&
    & x2 ^7 t/ ^& }# W( r

    args(str)”, returning=”retVal”)
    # U' \( `# q& W

    @AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)* f1 ]' J7 Y& ^7 ^1 l# J" H

    public void testAfterReturning(String str,Object retVal){
    0 C2 \  ~+ ?  h9 _# [* b- p5 `' J# J

        System.out.println(“afterReturning1=>”+retVal+”=>”+str);# W5 ]  ^1 w% W

        }8 V5 S* P2 r) X8 |$ N' [2 \) B

    5.4.2.@Aronud8 K' h6 `+ v, k

         注解@Around环绕追加功能;
    3 A1 O2 J4 {8 @; h

         在执行目标对象的方法的前、后追加功能;. O) ^4 X8 X' h7 v: d, u, x7 z

         必须有参数;第一个参数的类型必须为ProceedingJoinPoint;, o6 |( z- V- P, j

         通过ProceedingJoinPoint的实例的proceed来调用所监控的: x* ^) u8 ^2 j! z

    目标对象的方法& L7 a2 H7 _5 @  t  i/ W5 f0 ?

         1 定义一个pointcut,通过方法名来作为pointcut的名称来引用2 F0 \, o) V. O7 f6 w

         (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    3 c! ]4 i1 L9 @* X) [) u& K

         (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()
    # ?: W0 Y+ c. V8 w4 c

    && args(str)”)
    ; [1 E3 u/ }0 `  @1 T! _+ j! T

    2.直接引用匿名的pointcut5 e, y" g2 i4 v0 ]/ i$ _

         (1).@Around(“execution(
    : ~6 h1 }& j' S* a

    * com.javakc.spring.schemaaop.Api.test1())”)4 h0 J6 i- e; p" H  f8 s# k, f( o: p

         (2).@Around(“execution(+ p5 S2 ~+ h1 p( C$ e, A8 @) o7 m

    * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    + J8 |, t- D0 X$ W

    // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    6 Q) d1 U1 O+ w4 x* O- X

         @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    " U$ c( y, N" H1 Q  M

    public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{3 n4 o- O+ e; {' T

        System.out.println(“around1==========before1pointcut==>”+str)
    " S. p) ]8 q9 m! _# ~5 d( [

            Object obj = prj.proceed();
    9 ]% }1 p# h8 C8 s. N3 ?3 C

            System.out.println(“around1==========after1pointcut==>”+str);0 A2 z  H8 k- p& [& {

        }
      U1 s  h, u6 r

    5.4.3.@Before
    ! A- T2 T+ u: |. H& Z5 g/ J2 {0 @# ]

    注解@Before在执行目标对象的方法前追加相应的功能1 j/ A$ i" ^" d" c

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用6 v0 v$ P. B! l" a# ^

    (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    1 d4 v! I0 x7 ~5 b1 _" K2 @7 ?! I

    (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    + N5 d, G- h) y3 M

    注意args后的名称与参数名相同, \/ }2 U' F/ B

    2.直接引用匿名的pointcut! [5 F7 s' H% M2 _

    (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)6 ^  ~3 k" u4 V* K8 o- S( Q

    (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)  D% t8 ^- w) G6 Y% g; U4 e/ d

    注意args后的名称与参数名相同
    : h2 P: q: X: f( ?& Y

    // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”), [1 h; o# U* _4 ]; p4 S* D

    @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    ) t7 Z' Y% N, I, A# |# A

    public void testBeforeParam(String str){
    $ `' H7 L7 V/ _- E: k

        System.out.println(“before1=param=>”+str);
    - N* Q  W7 s4 \, f1 S( s

    }8 \9 c* b0 @0 g% H' v6 F) a, I1 e


    % m8 `! p" ?& l  q

    5.4.4.@After
    3 }  n) ~. B9 F% N! [

    注解@After在执行目标对象的方法后追加相应的功能$ Y1 f  k6 d0 j7 k$ r$ A. W' i: a5 E

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    ; t3 \1 a$ c$ O, N

         (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    5 g; u5 y8 S  x3 r" [/ E! ]5 ^0 o

         2.直接引用匿名的pointcut
    + n% S* P. K8 Z5 s! E6 s& z

         (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)5 J+ g4 |$ ~/ ?& ?. u

    @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    % U1 L/ L! ~! l2 f+ D' I

        public void testAfter(){
    & ^3 }; r6 a7 N

        System.out.println(“after1== >pointcut”);
    ( l. o, E: Y/ W

        }; m7 ]- H& e+ b2 ~! P7 P8 A

    5.4.5.@AfterThorwing
    + D9 ^3 ~( ?2 U9 u7 }1 G


    5 L: |+ E4 E4 q3 m+ d' m; K1 Y- j& S  A  V0 y2 o
    • 描述一下spring中BeanFactory和ApplicationContext的差别9 O% V; E2 o' c7 T
      , J% j1 B. z% v6 W1 K

    BeanFactory是一个Interface,这是Spring的核心。它仅仅只是提供的一些基本功能。ApplicaionContext 也是一个interface,这是从BeanFactory继承过来的所以它具备了BeanFactory的所有功能。但它也从其它的类或interface得到了一些特性。比如提供国际化的消息访问,资源访问,事件传播。

    但其主要区别在于BeanFactory是延迟加载,如果Bean的某一个属性没有注入,BeanFactory加载后,直至第一次使用getBean方法调用此Bean时才会抛出异常;而ApplicationContext则在初始化自身时检验,这样有利于检查所依赖属性是否注入;所以通常情况下我们选择使用ApplicationContext.

    代码示例:

    BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource(“beans.xml”));

    ApplicationContext cxt = new ClassPathXmlApplicationContext(“beans.xml”);


    : S* m0 g$ D* {9 a  {
    • 谈谈spring对DAO的支持
      2 X2 h. U3 ]# R8 O! Q, K: P

      . i6 E. j: w' K: j

    Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。
    ) k, a6 s8 L$ |: j9 N, o5 L7 m; b0 F

    简化 DAO 组件的开发。
    0 B- C7 h/ R1 DSpring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。
    : B; R  X. ^3 V* w8 J0 n7 L' S

    IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。
    ! F9 ~4 J# @  z5 q# `* ~$ j, e

    面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。
    + u) y/ L8 W4 D

    方便的事务管理: Spring的声明式事务管理力度是方法级。$ `5 E0 b' x. h; ~8 S2 r

    异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。8 Y" G9 S$ |! {/ r  p; y3 J5 K

    7 g  ^: T' J; x+ d: }) {/ R

    7 O: @2 f* s6 x
    • 谈谈spring对hibernate的支持
      6 U3 j9 g( @0 ]  c* U0 o1 l
      2 v" ?7 J# T; X; m( ^1 b  e

    在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。/ W% i9 y2 f9 r' d! |2 _0 T7 y+ F

    一旦 Hibernate 处于 Spring 的管理下, Hibernate 所需要的基础资源,都由 Spring 提供注入。Hibernate 创建 SessionFactory 必需的 DataSource ,执行持久化必需的 Session 及持久层访问必需的事务控制等,这些原本必须通过代码控制的逻辑,都将由Spring 接管ataSource, SessionFactory, TransactionManager等,都将作为 Spring 容器中的 bean。将这些bean 放在配置文件中管理。3 P2 ^& Q5 @8 w3 r( P9 w

    1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:
    7 @# Z7 H% ~$ c' |4 R$ o. C/ {" W


    . w( X. K* v* T0 P( V& F/ @2 a

            class=“org.apache.commons.dbcp.BasicDataSource”>
      h6 B- d' h& |9 E1 }

            7 J3 f0 K0 q9 s( b! A; ^+ [

                oracle.jdbc.driver.OracleDriver
    2 m  p$ Y4 ^' m6 ], }5 c

            
    % T& c9 w1 F' y0 s! u9 A: o, t) y% V, I

            2 `; A! w, _# K' j! X4 M/ m

                jdbcracle:thinlocalhost:1521rcl
    / X% v3 E+ t) `: R+ m9 z1 G; T8 e

            
    7 Y  a8 d8 a1 s! x

            % i' W" p/ N5 J0 D- z

                javakc25 c8 s: w% g  w" _% b7 M  b7 `7 u

            & }' N9 V3 Q' ?4 _: \

            % c1 j6 {6 q3 v+ P

                javakc2% F+ u# Q0 q/ G* ?1 h/ d' Z

            6 l6 d9 q7 W# x: q$ n1 }7 h

       
    6 b# j, g- A" N- E

    ( i3 ^5 ~: U5 C1 N, V

       

            class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>& J! }& @5 o2 }6 {) `/ F2 v; Z, C: }

            
    , E/ P5 `; P" D2 K. G7 V" T1 e

            
    - E5 x$ F9 S9 h$ W6 H* S( a7 `6 h2 N

                
    ; N3 ^. I& F6 c: A' t

                    com/javakc/spring/h3/UserModel.hbm.xml
    * l+ X% o2 Y& B+ b% m/ J

                % d+ x& C* u7 ?

            
    ) J- c" f3 n( k! n' e8 N9 M1 u

            . h  X9 `- W! I7 @! @

                
    9 Z, Z( V- |; s7 c, O

                    hibernate.dialect=org.hibernate.dialect.OracleDialect& l; |4 N+ m+ v; r6 c! Z5 a

                - q/ H) p% I! i( J; Q5 g

            * c4 P7 {8 r# K9 U

        6 E  l. A) S5 |, k6 F8 M. ^5 ~' I

        8 w5 ~4 W1 w- W

            
    8 r6 ?- G7 M8 |3 W& A

        % ^% g% T2 \% G# S

    如果需要使用容器管理的数据源,则无须提供数据驱动等信息,只需要提供数据源的JNDI 即可。对上文的SessionFactory只需将dataSource的配置替换成 JNDI 数据源,并将原有的 myDataSource Bean 替换成如下所示:

       

            class=“org.springframework.jndi.JndiObjectFactoryBean”>
    : A2 k. }$ J& `3 J0 r) \

            ( I( l( C6 U3 _1 A! Y  Y# C7 U

                java:comp/env/jdbc/myds7 ^  k  Y& f( A( Y9 ]' n

            
    4 q' r" h1 g- ^( b  L8 Q# d

       

    2、有效的 Session 管理: Dao类继承HibernateDaoSurport后,Spring 提供了 HibernateTemplate,用于持久层访问,该模板类无须显示打开 Session及关闭 Session。它只要获得 SessionFactory 的引用,将可以智能打开 Session,并在持久化访问结束后关闭 Session ,程序开发只需完成持久层逻辑,通用的操作则由HibernateTemplate 完成。

    3、统一的事务管理。无论是编程式事务,还是声明式事务, Spring 都提供一致的编程模型,无须烦琐的开始事务、显式提交及回滚。

    建议使用声明式事务管理,Spring 的声明式事务以 Spring 的 AOP 为基础。可将事务管理逻辑与代码分离。代码中无须实现任何事务逻辑,程序开发者可以更专注于业务逻辑的实现。声明式事务不与任何事务策略藕合,采用声明式事务可以方便地在全局事务和局部事务之间切换。

    Spring声明性事务有两种配置方法,一种是xml配置:

       
    4 u$ g. @. [# n( x$ V% T

            
    0 O3 c- K( W9 a; B) e0 B: {7 A# ?

       
    ! J: U7 ]0 c, P. I- i) F


    # M# ?; d2 m6 Y" x/ }

        ) ]; N  z/ g4 y5 n& w

            
    + ?  y- @3 H7 o6 w

                + U( R& H+ V; L0 o% k

            
    + R4 o+ A# B) T; h9 F. Z- A) L3 N3 [1 y

       
      A! k* l* a( Y4 H* f1 l& L6 W

    9 d# g# L8 \+ P& j; x8 e

       
    5 {. e: p& q3 R; T5 n

            9 Z% `# U. ?% k( N4 N* l

            % j* E7 X$ j3 M6 p/ H. l9 O+ _

        ) `/ P; s+ U/ r4 k

    另一种是通过注解,在需要添加事务的类上注明 @Transactional

    6 n' ~! S; J; u/ U' ~% r6 {
    Spring2.0之前事务的写法# E* l0 ?, x$ d2 e

    5 d3 V; ^0 `) u8 J: [( v7 o3 V0 s3 \1 H7 F) j
            class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”: X6 [6 t$ j  w* g

    7 B/ t; o# [$ V+ p7 n8 b6 \        abstract=”true”>/ [8 k* n" u, {; ]2 D) J
    : ?. n$ d5 c, }% A

    ; ]' @4 v& S( D3 D( v5 T
    * v. q* i- o+ ?' r4 L; x% ~1 o- e3 C8 H2 t
                    PROPAGATION_REQUIRED,readOnly
    5 [  c# o, ?$ ^
    & V+ f9 y' E% {$ L6 i
                    PROPAGATION_REQUIRED
    - X: |" C) |+ p, n  L6 c
    $ l* ]5 x" ]- ^2 ?9 C) G! N4 R; x

    ! K) Y2 n7 c6 k- z- y5 V3 G. e" Q0 `, I) a+ S4 ^/ M# i
    6 x4 Q5 ]+ @* X% o+ X
    ' u# d7 S4 w! u  B
      r* k5 W2 I' T9 E; u5 V  _
    • 谈谈Spring对事务的支持
      ' k: t2 \' P0 Y$ Q7 b
      # }& u6 c* L4 x3 D* V5 U# a


    2 s7 q- F9 u0 J  s, r( K1、声明式事务管理:

    1.流程:由客户端访问—-aop监控—-调用advice来追加事务

    2.做法:

    2.1 在配置文件的头中引入xmlns:tx 和schema的文件

    2.2

    2.3 注入数据源


    2 B+ @6 q# C, c4 ^3 X8 h% y
    & |8 N9 a& v1 t
    ( r  y2 K6 e- C! z- h3 j
    ' H' G7 {+ y  l3 Y6 M/ \, a1 H" ?5 C

    ; e# `+ c, Z8 I

    2.4 由spring实现的事务管理,但需要注入数据源

    0 y/ [/ \! ~# \
    ' ^% F6 }0 @& w: w' `

    8 I* J$ V. x8 b: b6 k7 X: e+ j7 K

    2.5 事务监控所有的方法(事务加强)

    6 G2 i% x/ k# K4 F8 n5 s: M

    5 z5 |6 L  E- D- E% a" ~0 B! o: Q! U2 K: Z! D' H
    ' I! Y8 x8 J* a( c9 [
    9 C% i; E5 E/ p3 `  A1 t" U

    2.6 定义切入点

    , C% n1 _$ g( S. t

    6 r' S6 @* @* E- K5 p$ ]" l! l* p; o* ]5 c. s6 s9 l2 W
    5 R1 r& [1 p6 P" P  h
    1 f4 T- t3 z7 ?) ?( T. j) w

    2、使用注解实现事务管理:

    1.注解@Transcational

    (可以在类上,也可以在方法上)

    2.在配置文件中同样需要注入dataSource和spring的事务管理

    3.使用注解的方法来追加事务 注解驱动

    ) }) V' J8 z6 z8 T, w+ P3 r
    / C. V! ~  [7 Q. r$ K+ x  [1 |) K8 h

    如何在Spring中使用Hibernate的事务:- O! y; \% Z+ f# ~4 l+ }+ y


    * V4 n8 ?/ T) N6 w* K


    3 @- @3 q0 e/ A5 P6 Q


    8 i( z8 {6 ?; r/ @7 F5 ~1 @

    如何在Spring中使用JTA的事务:
    7 G; y4 @2 D0 i3 n6 y


    - D5 W3 S0 y; x2 c" Q
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    17#
    发表于 2014-12-03 12:48:32 |只看该作者
    事务9 r3 q, X  N) l7 h" _
    ACID1 ~/ L( a' H+ }! O& A' I5 O% x4 u
    (1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失败
    4 Q% T* u  ~3 f* L! F- K/ Z5 B+ L( ^& i
    9 R* s* z4 j1 B! \& I(2)一致性 :操作的前后满足同样的规则,保持平衡。$ D: A1 Q5 M8 U7 w$ j8 |

    ! t8 o* C+ ^( n/ e9 C+ h(3)隔离性 :在事务运行的过程中。事务内的数据对外的可见性和可操作性(必需由数据库的支持)2 i! x; L% |1 \1 Y) Z

    ; O6 i% s* p2 E(4)稳定性 :保证数据在事务的操作的过程中不会遭到破坏,而且是永久性存储的
    ! `6 L' f) v) A& W4 E% m4 [# I
    : H% @  Q4 S& q0 M/ N
    9 i8 y9 s! w4 @+ l1 v) z( o; }& Z. i
    事务模型9 ^$ u% ]4 D+ W( A8 A- v' @; r
    (1)经典事务模型又叫平面事务模型(JDBC) 事务不允许嵌套
    ; \/ D7 G, Y& r. x" @; y; {# m  D$ N) M( K9 i1 b
    (2)嵌套事务模型  d- c" P( b7 u

    / T  p9 _; T! j- G9 L   i: {  K8 J/ x% ]) _

    1 P0 _. h9 B# a# {7 h8 }事务的两种方式
    ) [* _6 S# Q( o8 l(1)声明式
    4 V7 V7 p2 g* C1 x
      Z( T$ Q+ {% c+ y( a在配置文件中设置以下6项4 [% ~, G4 r% n/ \* K1 f9 g* n
    : e6 l4 p# E: ?" x$ r2 l2 q- F$ \9 \- v
    (1).required
    ' p% {7 u* L6 P) F% k; [7 d7 B; {. W+ Y, R% Z3 A+ P! r$ Z
    如果客户端没有事务 在bean中新起一个事务
    $ y* g/ ?& g' z# P& |6 u; Z% [' s& G" |- s" Y& j
    如果客户端有事务bean 中就加进去
    - Q$ s" a5 s7 s
    6 E% U* z5 ^7 V* L(2)、 requiresNew6 j3 H, B, s2 [) a" s( n

    + L" d! R& E4 e  X$ {) `不管客户端有没有事务服务器段都新起一个事务
    6 {0 E  P5 F* d5 ~/ D. j! q$ e( z: S" U: p, V6 o& C
    如果客户端有事务就将事务挂起4 l+ |" G" T, q  _* s& e. f: C
    % j, ~- `, a  u/ K% f+ l. [! a
    (3)、supports
      `4 r0 ^. k4 |8 R6 v& J2 S9 p& F
    5 Y, u2 `4 @4 [2 q1 v( n. H& ~6 X; d如果客户端没有事务服务端也没有事务
    / }1 o% ~. O- @7 }/ m9 N! t5 n( {# g: @$ S5 I
    如果客户端有事务服务端就加一个事务4 y; Z, ]! C( G$ f* Y, [; z7 x
    & i& h) b8 @4 K  \- w  A9 G
    (4)、mandatcry) W- F- d9 s, ^! V# R
    8 |) k) [! P) Y/ ^+ q8 Q0 y
    如果客户端没有事务服务端就会报错6 E. R! @% A! h" A3 i, \* ]
    8 e4 N6 ~7 S9 B4 U# X  \7 u1 f# V
    如果客户端有事务服务端就加事务
    $ ]8 [. x5 i+ S5 H" h
    $ ^: l. |+ e* A$ N: `" M5 z8 L6 [9 S: T4 S(5)、notSupported# h. W2 a0 K0 F3 K
    ; B* h$ \; p9 k2 p
    不管客户端有没有事务服务端都没有事务
    / \8 u+ I' O; I+ Y1 {# M/ {) S9 G1 W! d0 A- b7 s4 M
    如果客户端有事务服务端就挂起
    - _9 ?% P8 r$ H  j+ F5 |
    & `- S5 O8 A5 K# X/ n; {8 l(6)、never" j! c) C6 g& U/ r& G
    - p5 S+ `5 a) j. o, s0 a0 z
    不管客户端有没有事务服务端都没有事务) X- e4 v  f! P" U
    ) W4 d: Y8 E$ d6 c! S
    如果客户端有事务就报错
    . \9 w' l: f! C6 N' j$ ?! v/ J9 B3 @9 P/ E$ x
    (2)编程式事务
    5 @) [- Q/ ^7 c5 X2 |) C! a4 L9 b8 x& u0 Y2 [+ X7 O
    Javax.transaction.UserTranscation
    9 M7 C& c+ X2 G6 ~# [" E  A" a
    . G1 s" t1 r2 }& u  [JTA 事务可以精确到事务的开始和结束
    ' F- I% {5 f0 Q* U' F* ^
    ' K2 l1 p0 h0 B- K# h; ?7 A ' H* ]' S" p6 H. N1 v

    2 p4 V7 r  T6 t% k$ ]+ d" p事务的隔离性) ~6 \$ G4 E! Y" ~5 [& k, D. `$ Y/ J
    Read-uncommited. H- j$ `. b  ^! \9 f

    " k& P9 f8 Z4 t- |" b. P读取未提交的数据(基本上没有锁)脏读,存在不当读取的问题。
    3 z6 j# a  m) H) A# n3 j/ m% G+ U1 Z( R& e4 x
    Read-commited/ ]6 N7 v2 b% s( ^

    ) K; G* I9 x4 O读取已提交的数据(行级锁)0 S$ Y5 ?$ r6 u& {+ p7 S
    2 _7 o+ I: ?; |: _
    无法读取已经写入,但没有被提交的数据。) W1 J3 e" J, g% y5 A* [
    1 m* G2 {$ v3 ?, [4 B
    Repeatable_read
    ) s+ b$ \0 [( N4 C
    % n' V0 ^* e1 U9 W. P读取的数据不允许修改或删除
    ' X/ R3 J+ k2 c$ I  ^% i
    # v3 }' i9 v3 m3 _4 A5 {( W不可重复读(行级锁+不允许修改/删除)8 J% B: g6 m- r8 h3 K

    ' j, L) w; L# h( N. Z# ^2 C: @Serializable( n5 n' q- Q. s; n# Z4 l
    , G) g; k; ?+ [5 ~" f
    幻影读(表级锁)! h6 Q6 t7 D" {. \3 Y% A4 f+ s$ X

    7 a; A8 H5 K6 @' ]" g
    5 X& g  w7 _9 \, U, x( X( e: b% \8 c% F/ s4 p' T7 L
    struts
    ( t5 e. C# Z' m开发流程* P, |0 E5 b8 I" @, o$ v# h
    3 u/ w& D3 t* F  r
    1、创建表单
    - X  A, b  G  Z! j2 A5 g1 E0 N
    ( v  q. [7 b: d7 Y% C0 u/ S2、从表单中获得输入$ J  [  y; X& i5 {9 G) z! S$ ~

    5 y. E+ Y" P/ f3、处理输入(业务逻辑)
    0 r5 o& E2 d& y( \) {% @
    4 c8 ~1 [6 E- a2 \4、根据动态输入改变输入流
    " N4 e3 T0 W5 ]2 S+ e( n3 s1 ?
    / w: N0 s1 j( l; {要完成上述四步,我们需要创建3 V' G. Y' I9 D) F

    ! e$ W& c- s, I* A1、一个ActionForm/ B5 H/ {# A9 {# B
      q3 y) R2 B; Z8 l$ V3 C& S6 t
    2、一个action' e' Q$ n% W! _# k  `
    6 W4 K- U3 @1 [$ b5 u5 K  c
    3、一个配置文件struts-config.xml/ p2 b3 A; O4 n$ l2 |% v

    ; q$ C5 V$ \( i+ e4、创建页面0 q4 r8 D9 t( Y8 M/ F
    5 g4 _+ Y  ^1 Q
    创建ActionForm
    3 H; V6 o* V# D( M2 g4 O& B  u1 I' M" H3 h) e
    1、写一个类继承ActionForm9 ~2 J' R9 ?3 w' L) ]# {
    : [( }- r7 @$ y& N% ?) @
    2、私有的属性
    ) A7 [6 y/ O# W4 H+ {9 S% Z8 Z) K3 z# Z! R$ g
    3、相应的get、set方法
    7 h5 e7 K; X8 A8 ]/ W+ z* u" q3 w
    : ^1 I7 A7 g& o' u7 Z/ C4、重写tostring、equals、hashcode三个方法
    5 n# A6 V' a+ _  `. A2 q1 X* t6 ^6 B  X. ?# @7 p
    创建action
    % F, S, R# p& h6 X# m; K2 m8 W7 Z& O1 z# w; n' Q
    1、写一个类继承Action
    * T( a) D+ [1 U- E  u( ~' M  H0 G& Q- P/ n
    2、实现一个公有的方法(回调方法)/ y/ P5 S% m6 x; k

    : R1 Z) P( v6 d, W* K0 Epublic ActionForward execute(ActionMapping mapping,
    ) s5 r: F# X4 Z$ q' {; j( p; o2 F1 ^' o7 O9 u3 u7 e
    ActionForm form,2 n; d3 k$ `* v5 I

    7 p5 d( g7 j! t! HHttpServletRequest request," _7 y& m' T9 o  {& c  a4 C8 X4 N
    1 ?6 m2 S) o9 q/ b6 P) C' m
    HttpServletResponse response)
    ( b% w. Y1 ^  B( \9 X+ c& l3 |3 A7 z1 t8 r" k
    {) s3 C7 }3 \( \4 U5 R! A: E( Y
      x4 p8 M! ~6 Z+ G' N! C
    //1.收集参数
    5 }. |" e3 _- p% ~2 r* P1 L; D% K+ k$ F7 B: |
    MyActionForm myForm = (MyActionForm)form;& Z; v3 X3 q& o. m1 c& n
    5 q$ Y% Z# O7 W8 q3 _1 T
    //2.组织参数
    + g9 c% y% e7 `! k# H& a; r8 k. p1 J  R$ m
    ) d) p( e7 ]( Q, u

    6 a- I; |6 a$ p//3.调用逻辑层8 j( N) J- }; Y+ M' \8 ]* a

    - `/ i5 u% ~, `: B$ Kboolean flag = true;
    1 D4 f) T$ i+ ?4 I; {. j# R' B: c* y
    //4.根据返回值来跳转到相应的页面# ?6 ?, ~1 r; b. t
    / a. `7 e+ |% J; Z
    ActionForward af = new ActionForward();
    $ T$ t$ s  I( n6 @! B$ S3 X( B% w% n* z  Z/ d+ w2 J% v
    if(flag){/ A7 f2 v$ c2 M' r' @$ P

    8 F5 Q$ G9 `5 f3 U2 T1 waf = mapping.findForward(“1″);2 s" g; U+ D9 G# U# U6 a
    / I' n' B0 h5 ], @- Q
    }else{
    , e5 A- z+ [/ O5 A8 _4 k6 q' W7 X, }" N7 X# j+ h/ ]9 x4 k
    af = mapping.findForward(“2″);
    + H$ N) P% Z! i/ t& j( w' @; s$ w) y5 @
    }7 K9 t  B6 \+ A
    ) C1 J: g7 {* j* s- B
    return af;
    7 |6 V1 Q. l. x$ R* h8 H; ^, B3 M, Y6 x3 Q; ]6 A
    }
    . C3 P* _" l( @2 R2 f* ~  U. ]6 _  E+ L) k1 l+ ?, y9 @+ z5 ~
    配置struts-config.xml文件
    ( d0 L5 m  E: G  q7 f0 `
    0 ^% V7 x. I% o1.<form-beans>
    - G* t# {5 C: e, F  ^) r
    5 D3 _" q. j6 R<form-bean name=”myActionForm” type=”全路径.MyActionForm”/>
    8 Y3 l$ f' b! L1 {: }% i  f
    / K7 G( S$ B; t<form-bean />1 l$ ~) Z, P* _( H

    * o; p" z/ d1 C9 ~) U</form-beans>9 }% l- S  ]1 V$ b- o& n% _7 `
    . R2 L: Q2 T( ]: T
    2.<action-mappings>1 y% e: d$ Z- e2 g9 O
    5 J. `2 W4 p+ Q* S% V& `6 c3 M
    <action path=”/sll”) [& Q% x  {' v( H) k4 a8 X
    / `4 Z7 r; Z7 S( b
    name=”myActionForm”9 G% `7 y, f( E. A4 j3 Q: F- T, X8 i
    $ _9 d5 \5 L5 m& `) ~/ {9 u2 M+ }/ s
    type=”全路径.MyAction”8 Z8 O" o8 {8 X9 o
    # s  Q" u, ?0 I" J
    scope=”session”& ?5 R5 R7 u& c7 w
    ' l0 m7 v+ o; f! x: i
    input=”错误返回的页面”>8 J- Y, ^' `- \8 m- _' _+ x' z
    9 y8 h4 Q3 [& O5 Y
    <forward name=”1″ path=”/1.jsp”>
    % s" V8 L& I3 B  X- T7 B9 R* C- K( c3 n- K( i3 R7 \
    <forward name=”2″ path=”/2.jsp”>
    0 h% \9 ]' ^, J- B: n; M7 N6 n9 c/ E+ \" z
    </action>* v0 c0 l5 W( e! ^

    5 L- _' y5 K  F: ~2 }+ q  k</action-mappings>
    # Z$ v. ]2 p& S' L" J" w8 P. L  H( f/ D/ g- H% c; S
    步骤:. N( m( u5 h( E
    " y7 M. i" U+ @
    1.创建一个空的web应用9 M0 H& p' v7 M/ s! K7 A# o( w
    2 ]( s1 v8 w/ w) h, m
    2.将struts的包放到lib文件夹下
    . o/ @# o# O5 @8 A4 g. S5 V' A& q0 w4 n7 P
    3.将.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目录下
    % K* {( ?, i% r
    4 c" L) k2 m7 V8 c4 {/ ~- q4.配置struts-config.xml文件和web.xml文件
    . f3 T1 b: ^% w: V1 T  S1 b3 R& r6 o- Y, A
    5.在页面引入tag文件uri
      r2 ?0 ]" y. ^  `/ Y
    ' {% p4 v( ]' W/ s- w' \STRUTS运行机制
    9 i; x9 y7 c$ D* Q, j& ~% ~& ]% A% u/ H6 p9 V4 M
    1、界面点击产生请求8 U5 V) K+ h1 Z
    + a+ ]2 A7 m9 w
    2、容器接到请求
    ; ~4 _0 b! v& j. M; k9 Q* p
    3 N& ~% j: E+ \- H1 m6 }2 O3、匹配web.xml文件中的*.do来调用ActionServlet$ s' [; }& R: T4 i6 b& n! G
    0 T& A% H  j9 B7 ~6 _* ?, Q
    4、ActionServlet的处理
    : j! V. L! r% {1 ]6 m4 {3 [$ e5 S7 y- K; e" k) P9 _
    4.1 读struts-congfig.xml文件形成ActionMapping  F/ ?( i# g( s1 _- ^

    2 g" ?8 \: r& ^; E0 u4.2 通过path 来匹配Action类,通过Action的name属性来匹配ActionForm类5 z7 B( I  T2 n1 {- q8 I

    $ Q& t1 P' W9 L( `+ o7 J4.3 通过反射机制来给Form添数据* u0 m5 b5 m$ r5 j; [4 b

    5 d- _" K7 M* s( u. n9 J4.4 由ActionServlet转调Action的execute方法9 a" Q- X! h% \+ v% w

    ' {9 P# c6 f1 k  M2 e5 X* ^4.5 得到execute方法的返回值,跳转页面
    2 P* ]$ e5 S7 V
    0 b9 v" `/ E  k( A7 I+ Y4.5.1 RequestDispatcher
    $ N' Q. t3 M  S& t# K# o9 i! E' C5 X' V6 w6 e3 f% P* w
    4.5.2 response.sendRedirect(“list.jsp”);1 `+ m: _! [( l, N1 m9 D
    7 d1 a1 h! B& i/ a
    ( U; t& U$ @6 ~% W
    2 k% k1 \* M" b) [# s
    进入execute方法% V/ y) O6 [& R2 R% X

    - Y) z  s+ i" u: H6 j; U7 S6 X1 收集参数& b0 I, S' x3 U0 ]; d) m
    0 N$ P0 q3 ^; x* v' g7 g
    2 组织参数1 c/ R* ?: u0 _: ?4 H
    / I+ |4 B" l: A% c
    3 调用,逻辑层# ]  p" g! r4 {5 I

    # `7 H( V% g' b( r, R+ l4 返回值
    ' K; }4 }4 m9 I: W6 Q
    6 b& l$ D+ L/ U8 v8 k! y) u4.1 选择下一个页面 (ActionForward)
    % s9 t% F3 W8 [6 E( e1 B4 P% P0 W( W9 {$ k/ o
    4.2 把值传给下一个页面7 N* ]7 G! f! D: y$ l' E. _4 ]0 h' F

    ' ^1 t. f1 H, B; y$ o ( ^6 ]2 b% C& s  l; \0 L) U& Q

    & A9 l% c! b1 I比较struts和struts2的不同6 n* X5 n& ^' D) a" G! Y

    $ @1 c- Q- U0 m& h" }Struts) }- k6 U5 @) }7 C6 `
    6 ?( Z  b% r% C) X2 V
    Struts2+ v- U4 Q* [/ s7 ~& m$ \4 V, x2 B

    $ }' }8 s% T" d1 O  a组成        五个部分:ActionServlet,ActionMapping,AtcionForward,ActionForm,Action        十个部分:AcionContext,FilterDispatcher,ActionMapper,ActionProxy,Configuration Manager,Action Invocation,Interceptot,Action,Result,Taglib/ \: d, ^. U2 T9 U4 a( G! Q6 y
    url        .do        .action% l; ]. w8 ]3 W* F" f0 K
    分发控制        AtcionServlet        FilterDispatcher2 n+ w7 Q! _+ j' H
    收集参数        利用JavaBean技术,将数据封装到ActionForm的子类中;
    " ~. u6 Y$ j1 l" B4 u  P一个Action对应一个ActionForm的子类- O+ f4 J: Z& _5 D" o: l4 O
    - P: I5 ?) h( O# q
    使用拦截器将数据封装到值栈中。; ~5 |4 l7 S2 ~+ @! T7 x
    使用域模型,一个Action对应多个值栈中的Model
    3 p* F* j, ^0 d2 a( v
    / e9 Q" ]# m* {$ {读取配置文件        ActionMapping        Configuration Manager2 C7 k$ J, U1 x. K
    拦截器        无拦截器        执行Action前后有拦截器, X; E0 T( M) A6 k: ?$ |2 w
    返回页面        将字符串封装到AtcionForward,进行跳转页面        Action中直接返回字符串,通过Result跳转页面
    2 v$ i1 o; ^) ]) }3 H6 k' O) e页面跳转方式        两种:dispatch,redirect        三种:dispatch,redirect,chain
    9 _# e. Z% d4 U4 @1 g! e8 c" {值栈        无值栈,Action通过在request范围内设置属性,向jsp页面传递数据        有值栈,Action和jsp页面通过值栈传递数据,jsp页面通过OGNL取得值栈中的数据
    # y- ~+ p/ k# d  M配置文件        struts-config.xml        struts.xml
    6 D% E/ n! b- ^8 H) V# {中文问题        不能解决(需要使用filter)        可以解决中文问题:
    * N5 Y* X/ ~' k6 `( k0 w2 k1、在jsp页面添加Meta;" o) e7 R, X8 e( |: r9 x4 ?6 e. H
    / Y# N, F2 {' }4 ?  y/ |  S
    2、修改struts.properties中的设置。
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

    2021-2-2 11:21
  • 签到天数: 36 天

    [LV.5]常住居民I

    管理员

    18#
    发表于 2014-12-03 12:49:03 |只看该作者
    其他开发工具和技术6 ?) t4 s8 ~  b& R6 C, _* J
    Ant9 R+ }4 X3 y8 U7 Q! L
    Ant是基于java的批处理工具0 B! s% d% `# j9 v( G

    ' j  s$ K( @: w; R  F6 k一、配置ant的运行环境7 L- [- p+ F& n1 a
    ! N& p( `8 x: i3 S6 N
    1.将ant的bin目录添加到path中, n& O8 Q& t% S% S/ ^) U8 e3 a# v

    ) B4 _. S$ t! ]" O0 K2.配置JAVA_HOME
    : l5 K" N2 b& ~
    . F: M8 x' t+ |3.配置ANT_HOME
    # a2 m6 y+ v- I! a" _4 P
    & n! t$ U8 ^9 N7 c" o; K" D二、配制build.xml文件,该文件放在应用程序的根目录下' g; S: n8 h1 p+ y4 ]6 |+ V4 n
    8 A% @: G" x. c/ w9 c
    编译java文件
    $ e9 @. L% a  q1 a1 J0 ^$ A8 l
    8 q" V1 P* E8 t1 ^$ q- }% i执行java文件
    0 v' E$ D, B2 H! E( L- t8 o( U0 N# K$ o
    copy
    7 v  F; u6 b1 a- O7 c2 K, I& U& t' C% ]9 d
    删除2 M0 p" R7 B0 k
    5 I; I' f9 A8 l/ I8 e; g0 o
    打jar包
    1 n+ K2 e* g$ b/ ]& S! T9 m$ S! r% j8 q( o: r
    根据注解生成配置文件7 s4 B9 z+ U5 w# ~0 O" f

    ! t) M5 G+ |' z. mXdoclet; @) n& G! \4 @  z# N- ^$ {
    通过注释生成一系列文件的工具(txt、xml、java、html等)
    / D; Q5 L  l) o! R* L( O# C' B+ X, f1 ]$ O( ^
    xdoclet本质是摸板技术+字符串的替换
    ; C% I; E. v% z! |4 X2 E: S2 r& d5 i5 F$ x- g
    1.在java文件中写符合要求的注释(将hbm.xml文件的内容搬到java文件中去写)
    ( g6 e( {2 Z1 _" s+ g
    5 `+ T- `! }  G2 D1 E1 n; |" t5 [1.1 在类的上面 写与表的对应
    3 c  s  Y! U' R$ u9 I  Y6 i& o$ ~9 l  L# o- v1 R- x4 K4 f  H; W
    1.2 将每一个属性的注释都写到get方法的上面
    9 g" ~4 p% s4 ^$ G
    8 L2 u- G7 n- E! m- E2.在ant中引入相应的task来驱动xdoclet
    ' h9 m4 g! o2 D+ m0 ^4 {! ?' ?0 f) |' c5 b& e3 v2 @
    % r3 u5 n6 k- L- |( ?( f8 h" \

    8 ^2 E9 m6 H3 H  w2 m6 Ilog4j日志管理" Z" _, q: a3 _$ w8 }! ~  K
    1、是什么?
    - u0 j/ n+ v# ~- e8 x( S/ q! r
    , L7 u% H$ {. W7 {- k" N在开发期间用来测试、对整个日志信息进行管理的工具& `1 {' \+ p: {/ A3 j: J

    8 c- K/ {) y! k; j2、功能
    # E' z& N- x) X2 U: h( u6 }+ M( N/ |) C- q) y* l0 ~5 ?
    1.控制输出的目的地8 @9 d% ]( j8 W7 m' l# }! g

    % y0 @: O; Q6 Z. m+ p6 `2. 控制输出的格式% G! v: }6 Z- X. I4 W4 |

    + |1 x7 b- S7 _' c0 M: M3. 控制输出的级别& a( W, }. |- w; h

    / Q4 ~2 R+ I3 K1 X3、日志的级别
      a4 [/ |- v% A7 ^# o
    3 O5 m$ Q4 _) ^5 y1. debug 调试
    : a# ]4 x4 N0 `7 E/ X' _6 p% h/ `( ]3 N, v& A
    2. info 给用户的提示信息
    ) [1 H% {) N, w' B1 ^8 r. O! v- u) d2 |8 H0 \3 K6 ^
    3. warn 给用户的警告信息- v+ S9 U/ Z8 _; p! ~
    8 w9 @. j, X* W2 G5 @9 h
    4.error 给程序员用来调试- @) h8 D% M1 p( s" J

    ( A/ z) R. V2 g$ S) {Debug—-〉info—-〉warn——–〉error* [. a& z& {( C2 I3 `6 U

    0 ]& t4 \8 m# h+ ]/ {0 [5 [5 y8 y5 ~( |" [4、配置3 N% i3 j+ T: r, {. I

    1 j9 E/ d: Q1 ]- i! E- s4 w9 S1.配置级别0 ]4 ?& U4 K' J$ n# T( L
    : Y# j0 J" w. }( }3 \1 n0 j
    2.输入源 (控制台和文件)
    - @7 ^( [7 S  g! V
    : \, d& m3 z3 d7 A0 U3.可以进行分包控制
    ' E2 ^( b# M7 Q) f* w; ]! \* w# ^+ T% \% ]: b, ]6 H
    Log4f.logger.包结构 = 级别
    7 M0 A% C  d- X
    , M# p8 S" Q4 e* ^/ \7 D" F5、使用
    * V" H! h6 `) [" Z, o' h! ~  T6 g0 ~1 G6 J5 W. g
    Logger log=Logger.getLogger(Test.class);
    # b1 L: ?0 u$ M% V
    1 g% {+ k) f  x" B/ o' v    public
    * w% D5 L& p+ S0 v! lvoid t3(){
    % u" r5 Z9 Q2 ~, E. l3 S7 z/ @4 r1 n  f$ E  y
            log.debug(“this is debug”);: H9 F& _9 R6 i) L3 X
    $ }: V; s3 {8 T. N
            log.info(“this is info”);
    ; B: |! q! {! Y8 b' r* M! w% G2 i& o7 ^# @$ L) K" q
            log.warn(“this is warn “);0 @+ `9 y! n4 E6 o1 T
    + B0 N" g6 D4 T0 E. R
            log.error(“this is error”);
    4 n: d* U5 t& k8 g" j4 a! E" A9 A
    ( ]) k0 x. j! k8 |$ M; V    }
    ) d0 ]' W- u1 [
    ; }; \& G3 K. O6 @% d) ^+ P7 |Junit$ \7 S5 N5 d; \8 O; b, B/ ^
    1.是什么?2 y) Z2 L7 w2 |0 @8 Y

    5 Z$ R, R  p+ {/ }  G6 V. w单元测试的框架" Z% D( M; n3 S7 M8 C: q
    7 D  u6 ]( N3 h! v6 _' P
    2.怎么做?
    + z2 Y# Q" _7 O8 f0 v2 A: `4 G# t/ G/ j: G; [
    写一个类继承TestCase5 J4 d! {; A# V- A

    1 T" j+ F0 i% B) ~  n7 P; M测试的方法一般都以test开头并且没有参数7 v& b* l: C! ?9 H# {9 {

    $ Y: }/ T4 ^/ p在测试方法前执行的方法public void setUp( )
    % ]0 t5 }  b; c7 @, E2 o$ c! ]& b8 A" {! j, M/ P& Q
    在测试方法后执行的方法public void tearDown( )$ M# {# y% \1 m4 p3 n1 X
    1 H0 w4 [: {8 ]- U
    error和故障的区别5 @: X+ c2 _+ K
    7 J' h* m# Z# E5 ]+ L
    error :代码有问题. Z( Q9 E' v7 q3 K: a# x

    9 |8 L8 |, {0 e故障 :逻辑有问题与祈望的值不相符合8 F+ _/ |& Y4 K: S. g

    , H1 V6 ~# N9 d1 a生命周期
    $ }/ O: S! l3 N3 r$ c2 J; L1 B# o
    测试—〉SetUp()—〉testXX()—〉tearDown()—〉结束;! i4 D2 z& z" h' w) {
    1 W  V) a6 b+ t7 `% ]( s* C
    TestCase套件$ j$ r" i% R! J
    , t% @( q4 E* M
    public class MyTest{
    ( Y# s7 l' T* [. d8 m7 o  Z$ _& y! ^7 V6 t2 i; k+ R
            Public static Test suite(){
    / a7 O: D$ o! d3 O6 _/ b6 ?5 |/ V. ?; Z  z$ v, D9 G  T8 T
    TestSuite suite = new TestSuite();  _, n  [4 q3 @- `2 N4 O
    8 {; v" Z' @: P: p
    suite.addTestCase(Test1.class);( L, r$ T; q! Y2 m5 J
    6 z9 V" b8 R; ^: M
    suite.addTestCase(Test2.class);3 \: m9 L, \1 _2 {+ ^

    : t4 y* O% u+ V, h- k}  A3 t6 ~$ j/ P; S# f

    * l  _: K# i4 U! }) ^' B}
    7 W1 o: k* y2 e( K4 O2 G4 X4 ?2 a) Z. e  i
    3 x1 K; u7 ~. N( ~- b; J

    8 r* r( j  L; l; \Ajax; s9 j  k: v; U7 W
    是什么?' r. [$ x: X9 u3 Z' K
    AJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。是一种创建交互式网页应用的网页开发技术。/ u8 w( \2 d; B

    9 ?( ]# D$ \8 b9 Q无刷新页面。
    ; s, m$ ^6 Z  E: C9 o! A9 K5 B* w3 z" D6 t
    有什么?+ o. V# \& O1 c1 X  Y% @5 J' [
    AJAX是多种技术的综合,包括JavaScript、XHTML和CSS、DOM、XML 和 XSLT、XMLHttpRequest。
    9 n) o4 R+ ?4 D/ L/ D
    . f# e7 M. A( ~6 h; u能干什么?6 u: g, `! t) H4 X" b
    使用XHTML+CSS标准化呈现;$ T& h' n# @- o& G3 [
    使用DOM进行动态显示及交互;
    ; t, d2 C+ s- y9 E使用 XML 和 XSLT 进行数据交换及相关操作;0 J. H& U  Z1 g0 N; a6 v
    使用 XMLHttpRequest 进行异步数据查询、检索;
    & S1 U9 z3 ^  i: [" u使用JavaScript绑定和处理有所得数据;) a+ M2 h* P; h! }( W% O
    * Z7 x: |7 i' n  `) z$ Q0 {
    传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。% C3 [$ A! r; D# p/ B8 u# Y$ \8 b7 J

    5 G; d# e( q0 |. g( {) D# r) I与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。
    / E+ O+ {/ Y2 @0 a9 p
    . G& Y) U9 _- Z5 V9 L% X0 [( H使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。
    $ G1 P- U* v# ?/ N4 v+ P! m" T( x$ I
    + U% V4 u% d- N) r) q) {/ b. G对应用Ajax最主要的批评就是:
    # r' ^  ?% J' v4 Q1 它破坏了浏览器后退按钮的正常行为,就是用户点击后退按钮后不能看到之前的数据;; d" m3 s  u/ u9 X: N
    2 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;+ J- @; C7 b0 u6 O2 _
    3 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;
    ) |, n3 R! g- }4 Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;
    0 A4 e9 O9 X2 d6 I) p
    $ e' N% z9 i/ U怎么做?4 \( j. k$ {$ E( S
    <script language=”javascript”>+ {- W: s* F. y2 |
    & x* U' a" [' A" A: e
    var req;2 W6 v( O, f8 N. o/ p2 g  X

    & W7 i; O. e( Ifunction add(){
    " s2 y8 C3 |2 G% F
    , v6 S. d% `- G) ?//1:创建用于传输的对象3 P( c" Y3 X$ `& o- J$ l5 V. F: ^
    & C/ v2 ^* A3 S7 @
    req=new ActiveXObject(“Microsoft.XMLHTTP”);
      W1 X( Q$ e! o% i' l7 y* F1 {2 K8 w5 V
    . z' Y- q# h2 l; n$ [* c// 声明返回后,处理数据的方法
    % `0 |: `6 P& a) w6 M  _; p, b/ [% y
    req.onreadystatechange=manage;* l' B# o& H: k3 ]/ @
    , @; }; J8 v. c3 @: C7 T: E- i
    //2:准备传输的内容: J) M! {6 Q. q, D: ?3 F
    , {6 N" A3 m  s# x3 {
    var str=”test1111″;
    5 S6 B6 I! N. n7 J; K; N; \8 _; h1 {2 h2 G! w# w! f
    //3:发出请求) Q% i# I" S* e& I" }
    5 ^% t( V# @  Y2 o; k. d
    req.open(“GET” ,”/others/ajax/test/t2.jsp?str=”+str);
    3 h' X1 ?; z3 t6 H$ z. \& }
    $ `4 k2 R0 R' M- jreq.send(null);
    # U) s4 d1 @7 c7 D+ C, K# A: ?* Z+ U
    }5 u/ Q5 Z& u; ]

    # o$ [9 S( y' o8 N+ |//4:接受返回并处理' `, ~7 K  x( N% x2 q# N2 U+ q

    ) E8 _6 R% i5 L" d/ l% L8 O- ?/ f+ Efunction manage(){" w7 g# Y5 S" G0 E

    - a1 f5 m" c* t5 T% eif(req.readyState==4){
    3 [( Z# i4 S/ w* D  r' Y( A3 t' G1 ?- A" Z* X
    alert(“r==”+req.responseText);
    5 v' z; T1 B) q& _) b9 p/ A% a8 X% ~. k0 p3 ]1 [" D7 C
    }5 o- @1 N/ W$ v
    ( D  g; f! f  \& A2 q/ I
    }
    1 l: H& S# I- V& [& j0 ]# F$ G8 u
    , o4 y8 B5 i1 }" p- s1 C5 M</script>
    ' \7 L& y: o' @5 l
    8 r- r5 ]6 p  I6 U2 LreadyState的取值如下:
    , r* `5 m% [$ ]/ ^# l6 Y; c5 [/ [6 x
      0 (未初始化)
    + }5 `) g* z! V9 W6 l: p4 W9 H; {' ?" w9 G$ n- x$ @& l
      1 (正在装载)
    % J6 ]% L$ k- P' j' Y
    % v6 S; u# y+ m& K3 L  2 (装载完毕)
    : @# D* P5 k8 {7 u, i
    * b" F0 P1 _7 ?% n& ]# @- M  ?  3 (交互中)0 l, P3 F* q) `7 s
    # d* }/ [: y! a# A& p3 }7 K
      4 (完成)0 p( Z! w6 D  o

    1 b, s7 a" P5 @; z 0 J0 Z1 r; B$ S; n1 V8 h5 l3 j
    " X4 H) z6 m& O; n& s. z% L
    原理) V6 S2 u! C9 x) D8 l; r
    Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,可以是xml格式,也可以是一个字符串,然后用javascript来操作DOM而更新页面。" {4 Z+ u) W3 D: M
    ; S6 A# y- n% O) H' H
    Dwr
    $ K( u. ~/ T4 y. g! }是什么?
    0 l8 Y) c6 V/ f7 e: LDWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的页面。它可以允许在页面中使用运行在WEB服务器上的JAVA函数,被调用的JAVA函数就像是在页面中JavaScript方法一样。7 M* @4 n! s# y* S4 I
    4 t# M1 [6 U& z, x
    有什么?4 D8 C% ^% C7 M& B" N" u1 E% t7 e
    它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据;另外一方面提供了一个JavaScript库可以帮助web开发人员轻松地利用获取的数据来动态改变网页的内容。1 x& }3 ~" \4 F4 m
    ! R& [4 n  t5 x) J6 {5 x

    . L# c  W( G) u+ m. q3 L
    9 x0 W) H: T0 d" F1 ]能干什么?
    ) S+ ]! \9 P  |8 w% c5 H动态地把java类生成为JavaScript,感觉调用就像发生在浏览器端,实际上代码调用发生在服务器端,Dwr负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制。# m/ M% J& ]8 t0 q
    8 ~9 C. x/ Q. d/ O* W' N6 z6 a
    0 j% ~/ S: x7 ]% k6 D

    : m' k, a$ v0 N9 }. t5 W6 ~怎么做?! |! b  Z/ o  v4 h" G
    ① 编写配置文件
    . ?; q# b! y% e7 V! @3 A& M* Y# ]. q; ], o
    web.xml& E1 R* v8 ]: `( R) H. T9 p  M
    2 X% J* @& r! C. q  C
    <servlet>
    $ K" y! N4 O. a. D/ G. q" t' `8 G& U' v) k5 Q) |
    <servlet-name>dwr-invoker</servlet-name>9 d4 x6 [# ]- W, x4 d6 }$ I, N
      O4 Y2 ~7 Z% ?+ o" ?3 G, n
    <servlet-class>
    3 {" `* R( J' T2 _1 _# Z0 i4 l2 A$ o( I8 m2 L* K) E
    org.directwebremoting.servlet.DwrServlet
    / y$ W% P) R8 g  y& y6 w2 V$ p2 q" B0 i
    </servlet-class>. l  h3 G9 C7 t7 S
    # F% m% A6 U: m) J! u4 r! ~
    <init-param>2 ~& {, O  C2 o: {- {5 R

    9 Q8 C" o/ z9 F0 g- M: `1 ]7 H/ \<param-name>debug</param-name>2 e1 \- r+ v  B1 x4 \2 s' X! W% E  _% x

    % U& ]7 w: |4 s# [" X$ G<param-value>true</param-value>
    ; S. j$ U8 @! Q
    ; {+ [. D9 }" U% z</init-param>
    8 \4 k$ [; h! i$ n- o) n+ m2 I
    , \2 c$ M1 s* t9 j  z' @</servlet>
    3 B  j! o$ D6 P$ @7 w3 t
    . ^# l+ |! c1 e& k2 V' \<servlet-mapping>! s3 r( `& w. z1 a2 F

    * s1 I6 p6 e4 O+ Z<servlet-name>dwr-invoker</servlet-name>
    # s5 p5 d! \! m$ Z
    ! z. @; ?6 t6 ~& Z* W<url-pattern>/dwr/*</url-pattern>8 \6 a6 h/ {/ b1 Q/ C1 t3 r

    ' C- D5 g2 u# D/ F% w</servlet-mapping>
    - o! n3 M8 B# O+ M  O
    & e" C. ~4 [3 o: O& T* vdwr.xml
    6 h1 u. i3 m( Y/ v6 T7 p$ }, @8 z
    : |5 X4 i, v, c' p" n% }<allow>) F) b: E& F9 N2 ?- U/ V# _
    8 q+ `) A" x% ^% |' \7 o
    <create creator=”new” javascript=”kc2″>  \% c; E; v# E) A7 \2 ?0 y

    + |8 A5 U9 ?0 j3 Z# j. U7 Q<param name=”class” value=”dwr.Service” />) O1 W  L8 ~6 u: }

    * }" r& F$ `- ~4 d& k</create>7 j( H$ C$ \/ o7 h
    $ j3 m2 u. c' b
    </allow>5 m' e. c' L% e! v% W
    ; ~# K1 S' v) q% j
    ②编写service
    : W1 J( r1 J  |+ O7 G
    5 r" C0 d+ f# _% d* _  {) Y) x% g" fpublic class Service {" z& u8 |+ i6 u" Z
    " l" M7 z. l& x0 _8 ^/ ^! [! {
    public String sayHello(String yourName) {
    2 B1 n* M$ ]% K5 y1 u. v& {6 d  V9 I) e# x" ?6 H% A( d$ r
    //可以是访问数据库的复杂代码, n( U! ~# H+ R* \3 @

    " h. C* Q  d2 [% N% U) m+ l/ Qreturn “Hello World ” + yourName;
    , h" x/ \1 {2 K; e+ l4 ]% A0 p0 p/ N" y; E/ Z) Y1 Z* Y
    }7 n6 a8 x: _& ]1 a& }

    . s( i1 P9 O) V, e2 F}. J8 p) f" \' s  K

    0 d6 H0 h. d# s, ^6 m/ U5 W③测试DWR* l3 o7 ^! M$ ?2 Q
    1 g6 V  Q1 d* C+ n, @
    将代码放入应用服务器(比如Tomcat),启动。) a8 |2 F4 h* W) x: L4 s  o& Q

    ; v7 G+ `& Q% X1 z; b# V然后在地址栏输入http://localhost:8080/你的工程/dwr
    9 r6 x5 t( P: a$ ?$ b/ d5 @
    ; r7 V3 L; D: {; N. ~④编写jsp页面
    7 i  ?( T6 \+ ^  \' n8 P2 p* E) g5 g- b" P0 ^: _4 m  E# {
    1) 要引用3个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js
    . ^$ E' L2 a/ ]9 k7 d7 f$ K/ c  R6 x. \' B* D* ^" R. Q
    2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样7 ?+ e# t1 f! G: t4 r- Q+ x( l* ?1 D
    + b) [) L" f  p! E0 K" e# G; m
    3) js里的service.sayHello和java类的那个有一点区别,多了一个参数,用来得到返回的数据
    回复

    使用道具 举报

    12
    快速回复
    您需要登录后才可以回帖 登录 | 立即注册

       

    发布主题 快速回复 返回列表 联系我们 官方QQ群 科帮网手机客户端
    快速回复 返回顶部 返回列表