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

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

动态微博

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
    7 I6 R3 b( s* C/ H, |2 S9 d简述JEE0 c1 w/ L- p: S
    JEE : JAVA  PLATFORM  ENTERPRISE  EDITION
    $ S& r6 n! v# ]9 K0 |! p" N3 D! r
    : Z- l! J' g4 u9 Q3 ?  v4 R1 XJEE是一个规范集;0 M+ i- `' i3 x! W- e

    % b6 a7 `1 w3 C2 }" jJEE是一个框架集;2 O! |) s& M' E, n( Y, E- C$ B
    : p7 \0 g: A0 V
    JEE是一个技术集或API集;
    * ~  |; [( P/ {6 U! t; v; e  J* t" t, E. K6 f+ m+ u  c
    适用于创建服务器端的大型的软件服务系统
    5 {7 J6 n4 V( B; S
    + u8 @7 c  U( T
    * I  o0 }) F1 q# L: \* _
    7 y$ y/ H2 K, U7 \$ i7 R( lC/S B/S 模式7 {7 H: t3 S. S  W. c/ j' b; Q
    C/S client/server即客户机/服务器模式,客户端也参与程序的运行与计算(富客户端、胖客户端)
    3 [6 ~$ w. M7 a6 G, k: c- {" N8 z5 t5 m
    B/S border/server即浏览器/服务器模式,又称为瘦客户端,客户端不参与程序的运行与计算$ w  F$ [/ e% u

    3 d% z6 P" ^3 X; U; C, U0 k8 h& W; p
    5 b# x. f+ h* s9 w/ H
    1 }. [/ t, |) D7 D/ ?企业级应用(大规模的应用)的特点
    # \5 S9 b7 A2 T$ `3 G1.生命周期长、稳定、可靠( [9 O' ~: w  a% [: M+ g) C" X  n
    * e, u3 i( k& k
    2.组件往往分布在异构的环境中,能够跨平台. \2 d) \4 Q* P, U- ~

    2 G8 |0 ~6 _8 F+ Y5 e. t3.维护性、扩展性、重用性
    2 K& ?- Q' W8 s0 y$ P+ b" ~4 Y/ u: r  ^% ?' e
    4.有事务、安全、线程- w( {/ K7 E! _+ f: k
    & W5 k, E7 R3 y
    - P2 C  C+ \' n- [5 M
    $ {. Y% B; H, N' A8 s
    什么是业务逻辑?  c$ \' P' L, K5 r/ X6 P5 U* r' }
    依照业务逻辑划分模块,; k! P. @# O# H, q1 B! ]

    9 R3 g% K3 e9 `! }/ {. l$ A所谓判定业务 就是具有以下特征:+ ^1 ]5 d, y. W

    4 j$ N! P$ k) `* ~* H# s1.业务流程
    5 p- u& c1 ?/ }* O* _% `3 M# P8 B7 h' j: a
    2.业务判断
    $ y5 b7 j* I8 g8 \0 d! u( C' `# o2 g* Z4 M0 e8 v  q+ V: T* d) I% Q
    3.功能组合+ K7 {6 b( V- O: I4 I! v& [: S: ~

    6 Y) f  h! Y8 c5 q" j7 z8 r . u. F4 h2 _  C: F

    + l9 ~, S* x% j+ p/ J* K平台(角色)的划分
    0 E9 G  ^; d, Z9 g1.平台供应商。提供满足API集实现的厂商(BEA weblogic IBM webshphere)2 l8 A0 n4 C: |2 n0 s
    2 q# ~" k+ b  v5 |
    2.组件供应商( F9 C' l  o2 C; k- T2 }" t" B

    9 v$ w) K8 Y  s/ {3.组件装配人员
    & l  d# f( w% a4 [6 Y: n  u
    ; j# M0 V" x% X. Y! |6 m4.部署人员
    " q9 {2 \* R+ B2 n. d2 k% `" h; g3 p9 H- f
    5.系统管理人员4 f% j# o6 C% F
    7 z# r& E: ?1 O7 D! v
    6.工具供应商 提供开发组件所使用的工具(Jbuilder、eclipse)! y3 m3 V2 v/ {4 d: z1 o# c( [

    ) j7 F0 h: N# D9 p  U8 D% e
    / W' e' G) a0 T/ r5 r  C! H* F% F' K. o+ X7 v0 b5 A$ m2 x
    java技术分布(设计架构 模块内部设计): h" ^, D4 v2 U" O3 U9 i
    1.表现层 Servlet、 Jsp、 JavaBean、 Taglib' W0 `. O; N0 N) Z% y4 C0 {

    ! K9 ]  k* H) @5 n% M* j1 k2.逻辑层 EJB(SessionBean)
    ( r5 R* n5 g* `
    & W6 n5 Z) v6 u( @) z$ `& Z3.数据层 ( JDBC  EJB(EntityBean))" Z' \! U  w' c8 L& z$ D

    1 |3 x( r! O. y) m) ^- S# Y4.服务 JTA(JAVA事务架构) JTS(JAVA事务服务) JAAS(JAVA授权与验证服务)
    0 Q( [; p; L2 b: Q& X& \/ L5 g
    3 m$ S- \" I, F( k3 Q2 r5.分布式通讯 RMI(IIOP)+JNDI 、JAXP(JAVA 的 XML 架构)
    : M7 Z2 a/ W! _# t" |9 {6 P
    $ p' S6 e$ n; C& z. `JAVAMAIL(邮件服务)、JMS(消息服务)、IDLC、JCA(JAVA连接器框架 (成))
    9 x6 ?1 @! l* U! Y& f7 N5 m4 U, z9 y) Q0 D

    * u7 p* ~2 [9 @& b" S0 y1 w9 Q
    4 S. o  L( P5 G8 _. n" a7 ^JEE的体系结构: 是一种组件的体系结构# b8 {, \0 h/ d; B9 N- W
    1.组件 : 能够完成一定功能的封状体(独立的功能的集合)3 j) B' a- R1 w. h7 [6 f; s
    1 Z, z  _$ I$ ~% s, n# r5 f: G
    不能单独运行,必须运行在容器上$ ^# ?1 a( v8 d6 v9 X# O
    " T% \" h, ]* b& J/ p
    分为两类:web组件、ejb组件
    ; e5 c$ ~- ?3 }) ]9 H# v
    , d" Z$ S  k$ L  Y1 s2.容器 : 提供组件的运行环境,并对组件进行管理(一段程序): D# I$ @0 L6 e

    + t0 w  g- P; U) @$ D  X; t* w管理组件的生命周期
    : D5 J0 s! D# @9 K6 }3 Z
    + _  ~/ h  I6 z) \% M) s9 P不能单独运行,必须运行在服务器上
    " f" B% e% n* F: R$ h0 j
      ^0 N3 P0 a0 Y$ K! a" L程序(组件)通过上下文来调用容器(context)5 d! L% {, L$ x& X, n
    & G7 B9 g4 v0 ?5 [
    组件通过web.xml向容器描述自己,使容器能够认识组件" ~6 g. \7 n! t, S8 X% X3 s5 ]

    9 }; C: i( b! g7 ?1 m! C容器通过回调方法来调用组件1 Z+ k6 f. d$ e# P+ m4 j

    0 _1 A0 [3 t# W4 |% g分为两类:web容器、ejb容器& \, n9 w8 r: H" r& z5 _. W& S

    6 P; H" O) n' p% u3.服务器 : 提供容器的运行环境,提供大量的JEE基础服务
    8 o, z6 E" E' k% z" ?$ g( o- R0 x* O8 x3 ~1 Y
    web服务器(只提供web服务)
    $ e1 Z' n, @; V) |, q" u7 g& v; `7 N, p3 K  D( r8 ^+ t) y
    jee服务器(提供web、jee服务)$ K6 Y1 C) l% s
    8 l4 ]: K) f8 [* j
    $ K3 i; d3 R6 z; k& |: ^

    1 t$ s3 e  {. Z; ~: w$ b什么是回调方法
    : Z3 D6 O9 \4 w由容器自动调用的方法,就叫回调方法。
    , O4 k" Z  v% y- y8 X4 m! `# P8 `" K' B: _1 C

    ) w  L, U: C) K
    9 b0 \0 J6 `+ @) W8 eRMI远程方法的调用机制
    9 U3 K/ E6 y. U+ w( J+ G例如:A主机有B()方法,C主机有D()方法,A 想调用C主机的D方法8 p+ k, u& c4 c* u7 `

    & p8 d; }" F. \
    ; j3 S  L3 v1 m9 n
    " o, h: R# d( `9 d' x1 [( t1 h; p
    + G5 X. c) B5 l+ V/ q% V$ A0 r
    ) F. h  Q6 x' i- ^+ T; u! j' y( P, ]学习方法
    6 F2 Q' S: c: |' v% h1.规范(熟记) 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 |只看该作者
    Servlet7 y# T2 x4 Z8 h
    •     描述war包、jar包、ear包的结构: }- u" ]2 K+ T
      . P/ y$ d4 b% Y: Y
      3 l6 y. E) i% k0 q* x

    war-                            web文档压缩包

    —WEB-INF

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

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

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

    9 Q2 d9 i/ h+ S3 _

    jar-                             java文件压缩包

    —META-INF

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


    " T* ]( O1 x! Y2 O) V

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

    –META-INF

    —Application.xml 配置文件

    –*.war

    –*.jar


    % r& B: Z  i$ J) q: ~' h3 a
    • 什么是servlet?servlet主要做什么?' O: v6 s) @, `3 a4 T$ x' H8 K

      2 B: J9 I5 k% t5 J+ v: Q
      0 C4 `2 P/ e* A1 B

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

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

    % t  s' b5 X9 ?) K7 _
    • servlet 与cgi相比的优点?servlet的缺点
      3 h& B. D) J' X) h, a' T1 C& V
      % R  y! E, |8 H9 a) Z( d/ Y
      ( m% u9 [. i9 T- a! U  C( P" ~

    优点:

    性能(线程比进程更快)

    可伸缩

    Java强健且面向对象

    Java平台独立

    缺点:

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


    7 A7 w8 P! W$ U# f8 Q
    • 常用的servlet包的名称是?
      1 L' D1 d9 e  F& f4 Z

      # v# ?3 d) w% f' e3 `' Q  \3 Q7 U
      ; ?. o5 l9 z+ \/ W5 U+ i: b

    javax.servlet

    javax.servlet.http

    " j, J  j: D& @) W! R1 r
    • 描述servlet接口的层次结构?
      ' i! F. U* Q! w4 z4 N8 `1 Q

      ' w0 P8 Z0 I$ C; k& Y! d; u6 P+ t5 [1 s8 r7 [: D, l+ L

    Servlet

    –GenericServlet

    –HttpServlet

    –自己的servlet

    ServletRequest

    –HttpServletRequest

    ServletResponse

    –HttpServletResponse

    8 ]1 n- ]1 v( ?2 o! ~
    • 对比get方法和post方法?
      ; U' N  @, j( S9 x) e3 M6 @: p
      ' L) ~' F! |1 ]( p

      & n# O: C! _8 ]' {- j/ f  B$ M

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

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

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

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


    6 x) z& u) E4 Q  q' Q5 z+ I- P
    • 归类描述HttpServletRequest接口都完成那些功能
      5 d; f4 H8 J/ S9 N! H  {9 {
      2 s$ x5 j1 m9 w, q  \' \$ [4 L
      4 u) u' R  v$ J" ?0 b0 `% h
      • 读取HTTP头标
        " x0 @# N$ N& n( u# Q0 P9 a% j0 E' Q% a
      • 读取cookie
        & I8 Z8 X- w" L$ A3 p
      • 读取路径信息
        8 n5 b. M$ l1 \8 N5 P* j+ g- O+ @
      • 标识HTTP会话。4 z0 c7 v9 ~: @0 R
        / ^, w/ _6 K0 x7 {6 e* m6 _

    ) Y1 c1 `. n; \! o4 \7 A
    • 归类描述HttpServletResponse接口都完成那些功能
      " y3 E8 c  W7 c& r) [

      4 @, [% `: I; E$ |  W
      ! b! k0 h* b0 f9 `
      • 设置HTTP头标9 b' D5 H' j9 C1 T$ Q4 Q
      • 设置cookie
        / Y8 M7 H- \8 J" J
      • 设定响应的content类型, Q; Q) q  C" J0 ?
      • 输出返回数据4 G% }& x& s$ {! s! O
        " a2 U1 B4 Q2 C4 B/ N0 {) z
    9 u% S, D0 u6 P, a4 z+ u2 e
    • 描述service方法所完成的基本功能?默认是在那里实现的?. u: M. H- f  {, S( ~

      ; B. P7 z* q* E- k& x2 y  g" k, Y" Z8 ~. Y

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

    实现:默认在HttpServlet类中实现

    7 n7 _4 r. D4 U" V6 ?. l4 X
    • 如何开发自己的Servlet?描述应该做的步骤和每步需要完成的工作
      2 Z, b% T2 h0 \% P' a
      + o; I; e! k- w+ B% F1 B

      . y6 ^& Z% \# ^

    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.启动服务器


    . `+ r$ X5 T. |4 w7 x2 q
    • 为何servlet需要部署描述?
      6 J7 m8 n) Y) ^" U. m1 ~" ~

      - z- E' ]% Z  S! g& ?
      ! f! D# b% m- ?* K5 P

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


    & \0 f2 g/ u2 k% o5 r' s+ ?
    • Servlet基本的描述应该是?请写出来, |* w6 B9 G3 L* x9 h6 b
      4 ]7 U& Z" N8 A9 O- w; R+ Y7 S

      : l% s! M: _+ l# j

    3 G9 a. ~9 T. ^- \/ d. `. ]$ k

    <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>


    6 p9 |! x+ v3 U7 m" }5 h2 ]
    • 如何在html中使用servlet
      ) c) G/ {3 h+ s4 D

      $ n: D9 |: @9 t! k/ a+ S0 Y( N$ W; n4 M: I) `

    FORM标记

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

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

    语法:

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

    {HTML form tags and other HTML content}

    </FORM>


    : h/ O$ b9 |, V- l4 J( @
    • 如何接受request中的参数: d0 P* l) e1 w5 k- h7 v

      ; B& i& W$ J$ H. T* _String userName = request.getParameter(“userName”)方法2 Q/ r& b+ M$ t: o$ M! |& H, m

      5 H3 y" i! i8 ]- d) p3 u
    # Z3 G' K6 M( ~! Y( Q8 k1 T
    • 如何接受request中header的值
      6 W9 q6 Z% @9 g/ w/ W

      0 m7 m/ |5 E/ D  i8 ^/ S! t- F7 J2 K+ C" u1 d

    request.getHeader(name);

    request.getIntHeader(name);

    request.getDateHeader(name);

    request.getHeaderNames();

    ( x8 f# ~- A# K5 G9 ?7 K
    • 如何输出html
      . W; m4 t  v( h  z4 z& P
      * x) \( m3 y$ T4 \" _
      ! f" ?7 J' ?$ N& E3 N" Q+ s

    PrintWriter pw = response.getWriter();

    pw.write(“<html>”);

    pw.write(“Hello”);

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

    - |1 I$ l0 d- \- J7 _. `' k/ w
    • 如何设置输出的contentType) K  o) V% J' p3 }7 f' Y

      " `- s* _: F! p3 C* g" |7 R+ l1 h8 m& |9 n3 s8 }. w

    response.setContentType(“text/html”)

    # Y4 S8 ?/ \4 |& o
    • 描述servlet的生命周期?
      ' @* w" h- K0 y' B5 j1 n& Y

      ( W" j7 D$ t" o7 B' s9 \( Q' t' l. R. P0 y. U& a

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

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


    " [: h# I( v* Z: ]- w# q+ s
    • 描述init,service,destroy方法的功能和特点+ C/ i' O' I/ H* j' U1 E7 b4 P

      + \$ E  ~. n$ B, a
      ) R$ \+ v0 W# s# b  \+ V, v. ?: k9 @

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

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

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

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

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

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

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

    # v* ?; ^" K, T
    • 什么是回调方法?有什么特点?  j, s% b  a- H, P( q# ~6 m; g( ^+ h7 E

        i9 W7 |8 `. B- R8 s7 L+ k1 e9 T' v

    由容器来调用程序的方法

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

    % L! q, a( I; [; _& R$ ^
    • 如何设置初始化servlet的参数?' i  ]+ j0 z# N5 j! g8 O* q( a$ E
      & l/ e/ E+ k& ]8 c: I! i% P
      在<servlet>中添加如下配置
      : b/ R: R0 T) y& y, s  ^2 J+ n4 D9 e# O: b; b

    <init-param>

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

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

    </init-param>


    ; `5 B- |) v& a7 X
    • 如何获取servlet初始化的参数8 Y7 J- l! q+ y2 d3 n( G

      9 O, {  O- ~. c/ s2 d1 x/ T3 c  \& W$ z" h$ [. K4 X9 j, e% k

    public void init() {

    greetingText = getInitParameter(“greetingText”);

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

    }

    5 [7 D$ f$ v* j0 l* v
    • ServletConfig接口默认实在那里实现的
      4 F: U# r1 v( M$ B2 N6 V( s: m: E' j
      $ t  W1 o) e; f; p4 q6 c/ o, m

      ' A- M$ _1 ?* k8 u

    GenericServlet类实现ServletConfig接口

    + T* u* U! M; D) s
    • 什么是ServletContext?有什么作用?
      & e9 G7 \7 }( a9 V8 V1 J

      2 A% V% v# A$ _; s7 C! `
      ; [$ d6 N$ T3 Z/ l

    Servlet上下文

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

    ; _+ B  a% m* g( d2 r2 n
    • 如何访问ServletContext接口?是在那里实现的?
      : T5 E+ U/ w" J  z$ b7 x
      . P! e8 G' U% M  w& n' C: J
      * M# K: o. G, Z9 G2 S4 Y

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

    GenericServlet类实现了ServletContext接口。

    9 J4 \- ?6 W7 R1 @
    • ServletContext接口的功能包括?分别用代码示例" X  E" M8 B1 K. ^+ m; w( w

      ( Z$ q) w* }8 y# P+ ~+ x) g! a; I2 E  H# b& J1 a

    只读初始化参数:     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)

    . Q8 G; Z) f3 D3 S$ x
    • 如何设置ServletContext的参数?- f& L" c- ?6 M

      * F5 W* M) u( T# x1 `2 F1 _
      . o4 h7 q* n% o( s$ A( P& Y

    <context-param>

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

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

    </context-param>

    , @: p# q; B8 j2 b1 n
    • 如何获取ServletContext设置的参数值?
      2 _" Z( B: a. k0 U
      * d; t2 |, h' V) z
      ! [/ s- D: b2 \* X+ a: [' ?2 m- V4 C. x

    ServletContext context = this.getServletContext();

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

    / R" r* D3 q; R2 Z! d
    • 描述Web应用的生命周期?! v: B+ {, f6 ?& s1 B, [/ F" ~

        K$ r. b5 i6 o! S, L: i: @0 D: V# q6 b' Q  D

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

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

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


    3 i& _! |) a6 s
    • 如何用代码实现监控Web应用的生命周期?
      4 _) K" t1 r; s3 t
      " u( d1 x. O4 @1 T( i( e2 C
      * {  Y3 t% c! ]9 W8 M  t
      ; k' t: Z/ b7 J# Z" E  h

    public class Test implements ServletContextListener{

    public void contextDestroyed(ServletContextEvent arg0) {

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

    }

    public void contextInitialized(ServletContextEvent arg0) {

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

    }

    }

    * ]! S" m2 f% q) F' ]

    web.xml文件中的配置:

    <listener>

    <listener-class>

    com.csy.Test

    </listener-class>

    </listener>

    1 W0 }2 k3 k+ J8 E# y
    • web应用中如下错误码示什么意思:400,401,404,500
      7 M9 P. d- ?6 n

      8 b- D" l2 |' r* U
      400 Bad Request//错误请求
      401 Unauthorized//未被认可
      404 Not Found//没有创建
      500 Internal Server Error//服务器内部错误
      " a/ l' W; }/ B

    + M% A1 E' |! V
    • 描述Web应用中用声明方式来进行错误处理的两种方法' q) ~/ @0 x6 m% o0 x1 z1 Q8 y

      6 U! T7 }* ^) X0 s
      4 \4 j$ w( B9 F" \

    使用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>

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

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


    % T- `+ a2 `6 R+ u$ [
    • 描述记录异常日志的方法,都位于那些接口?
      ) F; z& t' t) E. Y

      6 s6 ^+ h- `* A( e6 z# n; e6 H3 P9 M2 H/ d7 \' z

    GenericServlet:

    log(message:String)

    log(message:String, Throwable:excp)

    ServletContext:

    log(message:String)

            log(message:String, excp:Throwable)


    / ?+ q) R! C# \! `
    • 什么是会话?
      - x2 k: u& i) Y, G4 _) q

      9 Y& m  R, h: S, Z' E
      3 J9 a: B, D9 _- c2 ^+ C1 X

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

    " I# X( f. {# q, ]
    • 如何获得会话?  F  I" M6 e) A1 g4 U1 ?

      7 F5 s- i) D; w7 s. A0 ?; j
      HttpSession session = request.getSesseion( );

      : Z3 c4 J. O2 x) X
    3 w, U4 U  F! J) U, b: R
    • 会话Api的基本功能?- X0 D' ]3 T. v, K% C1 V
      1 D2 N* V7 I/ O9 L4 B( S

      3 N4 k) T/ h* ]3 F3 @5 ~7 j

    getID() :String
    + V: V4 @' C/ t& Q/ }

        isNew() :boolean2 B: N7 ?; L3 Z) q- j* w

        getAttribute(name):Object
    * D6 `: ^) Y7 N

        setAttribute(name,value)3 v6 r2 g9 b: A4 p- e0 h- a) f

        removeAttribute(name)

    ! J+ L! s0 ?8 ^/ j( L
    • 如何销毁会话?' ^. G8 d% {' p3 \0 C& B, h. _& ?

      " n3 b& X; Z: D! g9 I6 a' O- C
      / D2 k) U# b& s: H0 F- x3 ?

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

    <session-config>  M7 j& p1 X* Q

             <session-timeout>10</session-timeout>& R3 M: F  u& d. f4 B  E

         </session-config>
    6 r& r0 G0 E- M# e

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

    invalidate()( v" q( T/ H( e

         getCreationTime() :long
    / S. u! e- m: k- q8 D" e0 u

        getLastAccessedTime() :long1 P2 U! O9 {5 j8 V

        getMaxInactiveInterval() :int3 W# Y& y. G+ O- V" Y9 B

         setMaxInactiveInterval(int)


    # A; \9 s4 p/ F0 k9 {8 c! z
    • 描述会话保持状态的基本原理2 v0 g. x. {. t- u6 T
      8 D, f4 q$ N. Z0 o  W2 h' ~; ?) b

        D  [) U# s5 L
    5 v. J6 V& M, O0 v) S: e1 X

        client server0 z  H' R$ w/ l- z9 q


    6 l) u' s1 m# I% ^- }7 S

    request# J+ J3 y8 X0 W& z# ~, S" H0 ^

    response (sessionid)
    9 F3 @/ S1 b6 H0 Y" K7 l7 k

    request (cookies): W9 V2 f. n, a' d: J

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


    ; \" X3 c- [' F
    • 请描述session和cookie的异同之处
      0 B& G' \; t5 F# X: N/ N! Q7 H9 |
      " h) R4 _  V" L* I+ n; Q  U

      0 @7 T) v% r; r! u; P0 A) b( v

    / u5 z7 n8 A0 d$ X, e0 p4 e- p5 B# w* u" f% d4 ~
    • 如何读写cookie,代码示例7 }1 N9 B% y6 U

      5 v% d" A4 x6 N9 w' `, _' U+ N3 T: }2 H# p" [

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

    response.addCookie(c);

    读:Cookie[] cookies = request.getCookies();
    # E$ |+ a: w+ a) |+ b  F  V

            for ( int i=0; i < cookies.length; i++ ) {
    ) h) ~- b) Z  ]. m1 t1 f( P

                String key =cookies.getName();4 F* _2 ?7 B9 Z! q% L

    String value = cookies.getValue();
    / r, O) [6 \" t: j3 f+ q

    System.out.println(“cook”+i+“:key=”+key+“,value=”+value);
    - K6 i  N6 |$ H' V3 W1 K$ F

         }

    , J3 K6 L& A+ V0 s% E
    • 什么是URL重写,如何实现,代码示例
      * M; m  C1 G8 n" X
      4 O) a, q) M/ B  s0 i, @" K+ ?

      3 i2 `( i" L- v( a5 u6 N( T

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

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

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

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


    , Y. X* N. J8 x) s
    5 S0 A( K# V7 Q" f8 c2 ^
    • 描述web应用的4种认证技术
      8 K  G9 J- h- P4 h, V& M! b% c" p+ @* X
      ! H  \" r. }) v
      5 q! |% }4 _  h/ M

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

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

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

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

      o) Z* d4 o& c
    • 什么是授权,什么是验证?
      # W4 X+ m) B' v, |8 }: B1 `1 ~1 O
        V' K; _! a# g( `6 m5 T# g) k

      2 d# w4 B4 |) U, T; M

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

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


    + z, ~5 j# F  q6 W4 x. A2 u
    • 什么是HTTPS, `7 m( E$ x( k/ I, }
      / Y2 X0 x% ^" f& j& Z

      * g; `* T( r) v

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


    # N' z4 W- |8 G) L' q+ m0 t
    • 什么是审计?- O8 z+ u8 Y1 @# T7 e) \+ B: i
      : t% }/ e/ G# V' A
      ( A4 K2 t# L  F3 ~$ f# a# V5 [. \

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


    9 F  ~2 O: K# R
    • 如何实现声明性授权) t6 R, N& p! I  v

      6 S2 a) I# ]7 O0 [9 [/ ]+ X: E
      9 c. u4 r5 p( {

    1、标识web资源集

    2、标识角色

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

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

    在 web.xml里配


    & a3 W+ Q) s1 T$ a* r! N
    • 描述servlet并发问题?" i( B) ~' u- a

      1 U& h' B/ F* |, Q% l2 K. r! T1 t3 w+ ~2 u  Z

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

    1 n9 p; H8 }3 E% ~$ ]7 N
    • 描述Web应用中的六种属性范围% U0 d8 f6 a3 R% p- f6 h" ?, p% i
      2 G7 t& I! X9 N" M/ h6 F

      ! G9 M& ?' l; x' J4 {  k

    局部变量(页面范围)

    实例变量

    类变量

    请求属性(请求范围)

    会话属性(会话范围)

    上下文属性(应用范围)

    8 O1 i  M5 ~# W7 P6 F
    • 指出上述六种哪些是线程安全的
      3 l# N- I  L  V& G4 F4 D  g

      % C( i, _7 X) J
      * z) O, W+ T- k; I. e, O2 a

    局部变量和请求属性


    - b) [4 \$ ?: A, x% k
    • 什么是STM?如何实现?
      0 H$ D/ L: v% @0 \( z8 F4 U
      3 m2 Y% O( e0 W( n: l

      * D0 @, J/ K9 s- o8 V6 Q

    SingleThreadModel接口

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

    ( f, l6 @0 G  V) d
    • 如何实现并发管理?
      $ V/ }8 i8 v8 m. L3 k( a

      3 ]( p% o9 X4 h) g  x* |5 j0 l9 y/ a* a; v( U$ I

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

    使用synchronized语法控制并发

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

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

    ! m  Y' s! ^, T! I3 o8 x7 y
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    13#
    发表于 2014-12-03 12:45:45 |只看该作者
    Jsp
    4 k  _! h5 m3 S什么是Jsp?
    7 p# g3 c& J" VJava Server Page    结合java和html在服务端动态生成web页面的技术
      z7 ]8 |  \5 d- n8 C. T- H# k1 @  x
    2 P' t2 c5 h5 B

    3 c5 |: ^1 q3 q$ i# E描述Jsp页面的运行过程?
    : x* i0 H9 a" N$ n5 M# e第一步:
    1 `& E; A9 h$ U! K: L" l7 h/ L. x: I: [# I
    请求进入Web容器,将JSP页面翻译成Servlet代码
    * {! e/ z8 C3 z& S6 z0 Y* n: z5 T5 D5 A6 r' [6 D
    第二步:
    7 k, c, w% u8 B% R! }, f* l5 _& g" |( g* H
    编译Servlet代码,并将编译过的类文件装入Web容器(JVM)环境5 U8 Q3 y) S3 l) n

    & J2 U9 ]- M; {* g0 t第三步:. s5 }1 ]5 p* {0 H' z
    4 z1 b' Z) H& H4 [( Y0 ~
    Web容器为JSP页面创建一个Servlet类实例,并执行jspInit方法- U! a7 q# q8 O+ C9 z
    3 Q1 F3 w3 b& x: a' J0 N7 M* P8 ~
    第四步:
    % ~, o5 Z. J3 C- H- }' m  a1 {* |- D6 n2 E) v- k
    Web容器为该JSP页面调用Servlet实例的_jspService方法;将结果发送给用户
    + G" o0 L! ~2 d/ ^( r3 S! u7 f2 x! Y; `9 a; n6 u5 k- I

    5 }* X! u/ m8 B- A% e' P
    9 b0 Z+ ?& Q4 v5 {3 @! r描述Jsp页面的五类脚本元素的功能、写法、并示例* u( l! L5 s+ t
    注释 <%– –%>
    & r. L4 S7 j1 j% f9 U2 c8 Y  G1 z/ R) C2 |1 P' `% E  {. S9 B2 M
    <HTML>
    / B3 I: n) _5 j3 f4 W* f; e# \' z6 [7 b4 v, N- H, C: Z" a8 y) s; x" |, N
    <%– scripting element –%>
    ( X+ K3 _- |3 x0 V7 F: W; r4 y, e; ~
    </HTML>: f6 n2 B9 Q9 r- |" I) H( l% [! H, N
    3 q2 R! M5 X+ J# t& T
    指令标记 <%@ %> 指令标记影响JSP页面的翻译阶段
    3 W4 \. x# W3 q! ~; M, n( k+ C/ {/ A4 g+ i
    <%@ page session=”false” %>
    4 N2 _" K  n" j3 D, T# E" x( n* j. v8 a: A' I, L
    声明标记 <%! %> 声明标记允许JSP页面开发人员包含类级声明. x0 @" T6 v+ g3 h/ ~$ ?$ j
    9 ]; d  v4 D& i
    <%! public static final String DEFAULT_NAME = “World”; %>2 x. X: m" ?- l4 q% ~% W  i

    * t" s; {! T/ E* @4 @# v- N    脚本标记 <% %> 脚本标记允许JSP页面开发人员在_jspService方法中包含任意的Java代码
    # b% ~2 Q+ X" [- Y
    5 X' z& n6 c9 R- L    <% int i = 0; %>- _0 N/ M, U' p$ e, K  i* v6 k2 Z
    : B8 N8 p9 Y$ I! c) `4 I
    表达式标记 <%= %> 表达式标记封装Java运行时的表达式,其值被送至HTTP响应流 <B>Ten is <%= (2 * 5) %></B>
    9 j( l6 u! M$ D2 [
    % G* b7 `9 C# N
    / U/ T7 I% U% A* y
    : U' [0 o4 R( s5 w2 v8 D: {* o3 j描述Jsp页面中的注释种类和写法1 w7 J2 v0 E( x- {9 R" a, Z
    HTML注释
    * c# [" D8 l# ^/ h* \5 h% v0 ]! Q9 Q' w
    <!– HTML注释显示在响应中 –>8 c  ~) b! q. r; s) d/ ?- e3 p

    # o( _5 _8 r% g2 {4 WJSP页面注释
    3 {1 u( R! B. F9 S- d$ _
    / N4 H3 `5 B7 E' j& W! [* |3 j0 B, |<%– JSP注释只在JSP代码中可见,不显示在servlet代码或响应中。–%>
    1 P! u& h& T2 L' M- v+ o1 e
    2 k. D  I$ G% o# L$ yJava注释
    ; H  w" p" Z2 @* z4 \5 q) u$ o0 W( K" ?- n
    <%. m# M7 P4 u  u2 J. e
    - k) o4 C$ S2 S! q, C3 Q
    /* Java注释显示在servlet代码中,不显示在响应中4 _2 a% x' B% x3 g
    & L1 _& P: L: [( A+ [1 o
    */
    1 ?9 ]% X7 Z) e) a: O1 \  B1 ?8 i% d$ q) o$ _& X
    %>/ z) y- d6 L& J
    ' b/ Q4 Q, }+ \/ v7 E
    0 O- x( Q( D+ \$ z' q8 `6 C
    - a1 K& z& K2 U& y+ q/ H! W5 }4 I
    描述Jsp页面的指令标记的功能、写法、并示例
    $ O6 g3 `3 {0 a& J3 v% l4 t指令标记影响JSP页面的翻译阶段
    , O9 [& h. V9 w1 C) N  O* ]9 ^
    $ g: \' X# c8 ?  n) Y& {& U% r2 N<%@ page session=”false” %>& }; d  L2 n, i

    4 M& Z  t1 ?& ]2 h<%@ include file=”incl/copyright.html” %>
    9 u& f3 f) d; m1 ~9 o$ b  L7 b% k' L8 i
    <%@ taglib %>
    / w+ E/ @6 ?0 u6 \
    4 v6 E# w, `: P
    % h0 _% X& Y4 p% g, S8 B0 x7 u  `$ j, R  F, k5 X
    描述Jsp页面的声明标记的功能、写法、并示例* [; M4 P% |: f. M, k8 a" G- N
    声明标记允许JSP页面开发人员包含类级声明% B5 S2 k! r8 e+ b

    & E6 ?- c9 W: d9 y1 j9 N写法:
    - |! L/ e, H% m: `6 i1 Q$ M; B1 I2 W) h4 f
    <%! JavaClassDeclaration %>- A$ I; `( D, F) L0 `) x

    " \& u% Y( t$ v9 s" p/ E( ~例:
    2 v5 j" ^. t( E6 d" D
    7 K. U5 n; K) t( l. C<%! public static final String DEFAULT_NAME = “World”; %>
    # q0 u9 D* [2 ^- i/ A* N" Q( j! s. `3 B0 \$ w" l  j
    <%! public String getName(HttpServletRequest request) {
    # x( N! N! E* A. ?
    1 ^, |8 s% A& B6 l4 N( V! Treturn request.getParameter(“name”);
    9 Q' G  y! d# Y4 N3 f# ~
    5 h) I4 I% m0 R}" Q+ I8 Y8 u6 \5 X. R/ ]; o

    + t9 B' f6 h6 K/ d+ I- m%>; W" n* T) y, \# @
    2 r# L6 a- o2 a
    <%! int counter = 0; %>
    5 B- {1 d* B3 i1 m  L0 ^& O6 @0 U4 W+ V) G; o$ _- m, B

    : \) F6 e. t9 E% z+ `. d% L
    / P3 z; u6 o$ u% _2 c% W" S2 g描述Jsp页面翻译成Servlet的规则
      x- A* X; ~3 l$ E, C' vjsp中的注释标记被翻译成Servlet类中的注释
    2 z) F2 E& k- O0 U+ y
    ! P, k( H5 K+ @: O2 w* H+ kjsp中的指令标记被翻译成Servlet类中的import语句等
    ; _: C4 e7 t. [  ?
    : f1 Z" y% G% Y& ojsp中的声明标记被翻译成Servlet类中的属性$ Z1 N  V9 O0 V: |, G5 f+ g
    4 \) J$ n: r+ H: ]1 x
    jsp中的脚本标记被转移到Servlet类中service方法中的代码
    4 n, k- v* ?# m' N
    , \4 _1 f; A  |1 Yjsp中的表达式标记被翻译成Serlvet类中的write()或者print()方法括号中的代码) F5 U3 u" J  _) c! t( P1 z
    ) g, y  N# b( ?, ]! v; |

    - e" z  e4 B% I0 e# K) x3 a* Q$ a6 G/ d- R; x& [* p
    描述Jsp页面的九个预定义变量的功能、用法、并示例
    + S0 O) w9 p! h. H; V, m4 Orequest 与请求相关的HttpServletRequest对象
      k' k' a# j! f, J$ \- v& a5 m8 J3 E4 X6 @
    response 与送回浏览器的响应相关的HttpServletResponse对象4 Y5 j9 R7 Q, _: J5 e1 y
    / \/ k: O& N: Y) E- K: P' Q3 v. n
    out 与响应的输出流相关的JspWriter对象
    - p/ f2 s5 v0 r; U$ k
      x( k! z( g: y1 D0 M. w8 M    session 与给定用户请求会话相关的HttpSession对象,该变量只在JSP页面参: u0 t1 }/ p; S" _) @9 I
    & c; R! K+ b" n! r6 w+ |1 I. x
    与一个HTTP会话时有意义
    ' ?' _; b" U. n' ~5 z0 n  W8 G  v4 V, F' _4 C# L# \
        application 用于Web应用的ServletContext对象% t# [0 x1 [8 h7 D
    3 t/ E4 x/ s( }1 Y# h0 j
    config 与该JSP页面的servlet相关的ServletConfig对象# |) ^$ \0 q, R. L1 S- o/ s% f, J
    5 i0 J/ l$ p6 p2 X0 ?; u! l
    pageContext 该对象封装了一个JSP页面请求的环境
    % V0 X2 K8 D$ `. `, J- H; z, q4 Q( B9 Q5 s, Y
    page 该变量与Java编程语言中的this变量等价
    2 p5 a1 Q3 R  O) K- n5 [) a* t8 L5 I" e' r' _7 k. U9 r
        exception 由其它JSP页面抛出的Throwable对象,该变量只在”JSP错误页面”中可用
    8 R8 _' H$ x4 s3 f' h+ I
    3 p. M) h! f4 N6 F% l2 ~0 H 1 U  X- A5 _: M4 r
    " O# [# x, c3 Y( j& h4 d& K
    page指令的功能,写法、并示例,并描述它的如下属性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding
    . x, H; w8 U& N" |$ x2 l: Iimport import 定义了一组servlet类定义必须导入的类和包,值是一个由# c* t$ i1 Z8 `* X4 U

    $ d! Q7 V( Q5 _( h7 W" q逗号分隔的完全类名或包的列表。
    : q0 V2 k; M# P
    4 @( q  L! D4 G0 X' ]6 R, A$ bsession session 定义JSP页面是否参与HTTP会话,值可以为true(缺省)
    ; q4 r: g, H2 f4 H! C7 y: ]6 o6 n2 m4 [2 Z* S7 G
    或false。5 ?$ r6 p& |3 Q; g' G4 H
    % }: M# O, p4 I& H; Q  f! b3 d
    buffer buffer 定义用于输出流(JspWriter对象)的缓冲区大小,值可以为9 K% [  ?- @' S- R3 b

    ; w# g; ?( H7 [% q+ D/ `none或Nkb,缺省为8KB或更大。5 j% _% f( X, {0 m
    0 v& F8 Y/ _3 z2 K% U
    errorPage 用来指定由另一个jsp页面来处理所有该页面抛出的异常
    ! u* a! p  e( G) q  V
    0 m, w( R1 u% L% I" O0 `isErrorPage 定义JSP页面为其它JSP页面errorPage属性的目标,值为true或
    2 s- A5 k0 D# }/ U+ `) z
    , Z9 z1 r. w' O, ]6 sfalse(缺省)。
    & o6 @2 Q+ N2 S  P" w# O; m+ Z( [, J# |' S/ N# T4 v
    ContentType 定义输出流的MIME类型,缺省为text/html。
    1 i7 \# b" |6 g5 D$ M2 H1 m0 j  ~0 x6 |" b) h. x- _  n6 E
    pageEncoding 定义输出流的字符编码,缺省为ISO-8859-1, x9 I4 L5 X0 F" B9 `5 V2 G" V. ~
    1 U& Z; v0 q1 D2 l

    ; W6 X: x; k4 u1 z* R! a4 v% v9 b- e' i, e1 S. h
    描述MVC各部分的功能?MVC的优点?MVC的缺点?$ f. s" c9 ~7 m' R( C8 f4 |3 ?* _2 \
    MVC各部分的功能:# C9 n) H2 K9 \+ v- Q6 o2 x
    8 l/ ]) V4 N  W% b1 Q! l0 `2 S
    Model(模型表示企业数据和业务逻辑)) O" I6 ~6 J2 j7 o3 g% f( h
    ( k& g$ V) c/ f( X! X. \& N  _1 m: ~
    封装应用状态
    * j0 @2 a$ R5 A2 P- J& {- L+ k4 e/ a' M
    响应状态查询) _; x0 n3 i0 I7 r. Z4 k  Z
    6 p2 L. n. z2 ~( E9 U7 ]
    暴露应用的功能
    * V" M, c3 }# }2 e: g2 r
    # x' {& I+ b! Y8 H  W9 ^# vController(控制器接受用户的输入并调用模型和视图去完成用户的需求)
    ! x& P' w9 ~7 @: D2 i7 ?% y4 f- p: r) G# L
    验证HTTP请求的数据% C( U" V, i, a  y! f# w. H% R
    , B3 o+ l! k- M9 o
    将用户数据与模型的更新相映射
    * w! Q9 \( h6 G0 R4 V/ ^
    7 J8 V- k9 O9 F+ S6 G选择用于响应的视图: \8 P  ]+ h, Q$ |/ X' E  g" [

    + y+ a/ g" N# U! ]5 \4 z0 w' c6 OView(视图是用户看到并与之交互的界面)
    6 v# k2 b$ ~  H
    0 ~3 p) B, s& G" D" c/ c产生HTML响应
    , G' q/ X( ?8 u
    , z- j4 U& N: d9 {请求模型的更新
    % b2 g* x0 [( e/ \2 F: u/ }% W# o
    # r. p' C$ T# m: c2 L& g提供HTML form用于用户请求
    9 J6 F( Z  I2 D. i% W# Q; K" r
    ) }. ?: g: @; r6 H/ q6 f9 y$ eMVC的优点:
    4 V3 V& D4 T! c( w* Y. G- u  y9 E
    . @2 S9 c% Z- l- J        低耦合性:视图层和业务层分离
    ; |6 x. C' r0 b$ R# i1 K
    2 \3 j9 ]) L6 o高重用性和可适用性
    * o1 ?* D2 N( G' l. h+ i& g0 e3 M6 W) o7 P
    较低的生命周期成本$ ~  Y% l8 U( z  R% ~) X6 c

    % C* v* A5 p3 D8 T快速的部署
    / r" p' r% k6 K4 f; P4 r: c' A3 n$ e( }
    可维护性5 d' [# w1 k0 `4 Y/ D3 X* ~$ [
    & q1 a, H0 a. c+ x, R
    有利于软件工程化管理
    ! B3 A4 z( ?8 M; m: F5 v4 D3 I/ N" Q
    提高软件的健壮性
    ! B8 Y4 Y  p) g0 A; n. L+ W7 {* k9 n% ~2 r& x
    MVC的缺点:1 Y! m% w. Q& W' P( I/ c- L! }/ m

    + i# `% k9 u8 W0 K/ |        工作量大,增加工作的复杂性,MVC不适合小型甚至中等规模的应用程序
    - V: n- A1 r2 F  r" T% s" g9 ~* W4 j6 J. E

    # K0 Y5 W- e" y/ i: A( t3 d: l1 C$ M* V1 a; ~5 v  i) y
    什么是Model 1结构,以及结构中各部分的功能
    , }' {; C7 m5 b: F结构:jsp+javabean
    , `3 R, r( A! P+ [" h7 e
      }- U- I9 ~' ^Model1中使用jsp来处理web应用中的视图控制部分
    ' B( _+ c& s! N& B* m- H+ J( {2 L: L4 t" |: o) |
    Javabean收集参数' N8 L6 l/ @( |* K6 L5 F9 R5 f* @

    % ^0 K# V; v! k# z: F+ u
    : n4 Y& u: S/ o5 ~9 ^
      v6 W5 _0 _% Q& t: T% z, D什么是JavaBean?! @0 y& ?6 f6 ], K1 i. ]6 K4 K
    用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。
      G5 |. L/ m/ t+ B- W
    , Z$ |2 n3 A  ]: P- n 2 \8 m. y2 K$ S2 l3 R/ s# v3 T  T+ q- e
    # A% w# f+ E5 U% ?* I, R- r  w
    JavaBean的规则?, g5 B0 }: e  u& |
    使用get和set方法定义属性
    2 s" q$ W  a' h2 K1 }! W7 F8 J! x' ~% X; d
    一个无参构造方法0 G0 v+ l+ u( @/ ]" H
    ' a* i  Y* I$ d# Z/ M) d1 ?
    无public实例变量( 所有属性私有化): m; D3 g$ [/ D( _

    * w' u. {% L' O9 h; ?4 w/ c 1 L0 I! N. p, H* e
    9 [9 X+ F: x0 j/ p: W4 i( I( A
    什么是jsp标准动作?包含那些?分别都是什么功能?如何使用?. G4 ?7 p1 ~" W4 k
    JSP页面中使用类似于XML的标记表示运行时的动作" Z9 E$ f! G; d/ K4 w. c" N
      \8 w7 U, S! F) P! i5 h
    jsp:useBean
    3 U' C$ G3 E( ~. j7 T# [8 a  f% m+ W" z
    jsp:setProperty" V: T/ B' n) j8 D1 y, g
    , {0 l; o* i( B# e) \; ]
    jsp:getProperty
    0 W8 F1 D$ |0 K
    7 e" i/ a3 e$ ajsp:param* f, e, M+ _6 S; e
    8 u+ B% T# \7 t. h  T( U- Z7 Y9 c
    jsp:include; o) \8 r6 v% _" x- q

    * S+ n( Z! y# M2 B8 Q. P% Ljsp:forward9 d5 }( |( _: n, Y" z

    6 Q* f- O; {( ?- A$ ?
    4 M9 X, \; G7 E7 u$ h% ]+ \6 H# `: A% g: s; F
    用代码示例如下标准动作的使用:useBean、getProperty、setProperty
    : W- ^. Y1 I! q! c5 I7 n1 R<jsp:useBean
    ' x5 n8 A3 {7 p1 p
    & M6 a' i/ J2 M: [5 P: A- h( n" E; xid=”myForms”0 S, o' k2 `: ~8 A

    0 O5 c* R, B$ {, E1 f, vclass=”com.base.mystruts.forms.MyActionForm” scope=”session” />
    1 p/ f4 Z$ w" O  |1 e( T. \9 I% p. v) a5 k1 |
        <jsp:setProperty name=”myForms” property=”name” />' b# D/ N) g5 P- n

    2 B6 N& _# u- A  o0 \0 T: H/ V<jsp:getProperty name=”myForms” property=”id” />6 s- _& n  u7 Z) d; g* Z
    + R9 C. B0 b' f% P+ @9 l; l# B
    * u# O9 |% ]. [) I& p7 w2 C

    3 _, v4 J; Z* d描述说明Bean的四种scope: \/ T4 @  v2 K& Y  z6 ^  f/ Q
    page
    4 `& ]; [6 w" L+ a8 o
    ( I" w* Q& }0 y, G2 jrequest3 L  s( O3 k) X) r$ s( y  A( a; c

    ' r1 n4 T1 R1 I3 t, [, dsession' C4 l9 w8 x' A

    6 P+ ^  m  R9 u" b5 D! sapplication
    + s1 J3 `6 y- H7 i% D. S' {
    % h/ s4 f! Z6 M * z6 F, q. L) ^2 T

    " d8 D; g% ]; l3 Z1 Y6 y( u+ t7 x描述说明页面上的字段和Bean中属性的对应规则
    & W$ O/ r3 c& i( Bid 指javabean的变量名4 g4 e' A8 p* w* c& ~( @( p

      J7 \. [; Y2 [+ d( B1 Xclass指javabean类的全路径% J1 d4 U3 I. ~% @% h5 w. ?

    1 @& Z/ O; `, M+ ?- X. z- Hscope指javabean的应用范围2 q3 M$ x( e$ Q# n! s% R$ A
    3 e# m" s! }* F4 B% o
    name指所用到的javabean的变量名$ @. ~2 u/ T  }$ |
    0 f- o- i0 T- N8 s( m$ Q3 E$ i
        property指javabean中的属性9 X/ [4 v1 b8 V9 [) ~# X5 y
    , r1 ?) R' \; k; n+ T6 M+ l

    0 G4 S# H& R, b( }+ ]4 d
    ) K# S+ z* M% i: p* R描述useBean动作的处理过程6 j4 X; Y2 b) n  m
    使用id声明变量
    ; u4 ?8 y% s( _. ~# |  v# }9 \: Y4 i; R- O1 F
    试图在指定的范围内查找对象
    ; {' \3 `- [% \/ C) i' D% B/ K( p# g1 K8 B
    如果没找到
    + ~, O. ~( E' }+ X. P! i0 f6 C& t& ]+ H3 G7 t( J, M
    创建一个类的实例6 Q' X8 q  S- f

    + T2 E6 \' @$ d  w4 o1 j0 D6 Z( \执行useBean标记体初始化对象
    - v) O0 l& W* s" w& h2 M
    - z3 I7 b, K; _. J9 J' Y, G1 `; `如果找到
    ; L7 {! Z6 @* Q& `( ?2 ?! U
    ! U( z1 k3 I" f* C' N" o" j     将对象转换为类指定的类型
    & W% U3 I( U( o8 g- y( o1 |3 M
    3 M: [5 y# ]# o( o! U7 q) b; a+ X % L- C, M5 y1 x) ?5 P3 L6 [! j

    3 ~& V5 \. ?( G# j" d描述forward动作的功能% w: I* T: Q' f! a: m' A
    使用脚本代码处理请求时,可用jsp:forward 动作产生一个不同的视图,2 Q4 N$ }+ ~( u! [( c
    0 ?% A& p  {+ i' a/ n. t
    使用同一个request:
    & K. \3 G, V* h( b9 o$ R) I* O! B+ U4 {: I& b2 a: G6 c

    # q! r& T% h& B" e  P% ?" U7 C6 w9 v0 ~* K( y7 t# z
    什么是Model 2结构,以及结构中各部分的功能
    3 U6 [: O. o4 a: T* xjsp+model+servlet( W0 Z% l/ ?( i5 \2 B5 V

      {, Z- `2 k- u1 }& h& }Model 2架构使用MVC模式,JSP页面充当视图,Servlet充当控制器  V( a8 C1 [0 {0 o' c- v6 u3 C

    3 z. u) i! R7 P$ b" t; w" zServlet控制器:2 T: e# @6 E+ @4 x. ]3 Y1 `) ^+ l

    5 i% ?9 l! i6 e" ?! Z( ?验证HTML form数据# f6 r) w, p, A& B
    9 M0 `1 X2 P  v% H' E: [! |
    调用模型中的业务服务
    $ k; U+ I/ k( Q7 X; \5 L5 f' H3 Z8 o- B6 \- S% i
    存储请求(或会话)范围内的域对象) M2 A, X: ~. N3 U

    * g2 W$ x+ |# N2 L选择下一个用户的视图) l! Y  [8 j# {2 @+ X& j( T

    8 E# O; ]7 ?* n: VJSP页面视图:
    # t5 t1 r* p$ N5 [. x, x6 g6 r. Y3 w$ Q+ H7 [" p1 C# C, C( x
    使用用户界面(在HTML中)+ N' x1 T2 n$ C4 o; L
    4 m& F0 s" }3 P7 W3 j. O& x
            访问域对象! \" d$ C1 L5 P, D( J# p6 ?, a7 y
    2 |$ T1 x. {5 t3 ]0 C
    / @" H; X3 q. B4 ?8 O& d

    4 Z$ d$ U6 j3 b$ e如何获得分发器?分发器的功能?+ c, C$ s& P+ C. Y( O/ m; d0 v
    上下文对象中的分发器:
    8 E) D' x2 I% r5 ~0 g! e$ l% a5 A! ^! n' H9 L
    ServletContext context = this.getServletContext();" Q( X8 z6 s) a% }; b! K7 z
    4 f' T. p) l& r* K* j* T
    RequestDispatcher servlet = context.getNamedDispatcher(“MyServlet”);+ x4 D: ~- z  o. |9 Q; o+ R
    7 y/ S+ h! p1 [1 C
    servlet.forward(request, response);  k* Z0 B, t  m8 r4 R/ i" C

    2 I( A, p/ y5 h0 W' Q6 @2 K请求对象中的分发器:6 ?/ P) z" E* C" V/ \- S
    - m+ h) V2 [, d& ?( l" l' p$ r+ I! w
    RequestDispatcher view = request.getRequestDispatcher(“tools/nails.jsp”);
    # F  u" i7 V2 n; t' {  l
    8 w2 w9 B1 B5 s- `' pview.forward(request, response);! X5 u% `" y) C" w+ }7 c
    ( x" w2 A: E! }7 m, w- ]" d" Y' [
    可以将请求转发到另一个jsp页面,并保持请求的传递性
    ) E# K' F4 Q( ^* a: J
    7 |" _1 Z9 J3 q - d- _- U, V+ T& i: K
    9 e: k3 c6 [& s
    Jsp中页面跳转的两种方式?
    ; C- u8 j$ B$ P- o& ~使用分发器跳转页面9 N; N/ C! |* W( p" S' C6 C! S
    RequestDispatcher dispatcher = request.getRequestDispatcher(“url”);5 K$ ~7 y1 s" r+ R& N/ u
    7 p% o( G2 ]8 X- I
    dispatcher.forword(request);
    ( z3 H8 H% L7 G) e6 Z
    " t/ t8 }6 l3 s1 z) U, m    特点:保持请求的传递(上一次请求中的数据,在下一个请求中仍然可以得到);# G$ |" ], c. y5 H

    " Y( @; F- p1 X5 T  Z- S! |        转发的页面只能是同一个Web应用程序的其他Web组件# l% a# m) F2 E0 w( r- Z
    1 c; e; `& J9 \0 i6 h) s  X, k& z
    使用重定向跳转页面
    6 `1 C+ B" @1 H" v+ sresponse.sendRedirect(“url”);
    " k* z' K8 v) Q. m) w' d2 I! T  ~  ~3 u, t8 U$ I0 D
        特点:产生全新的请求,(上一次请求中的数据,在下一个请求中不能得到);& E. J" g  X: ?9 T0 @& n! p
    + F+ u0 w8 w; ~/ a2 o& z0 I. U8 U
            重新定向的页面可以是任意的URL
    1 G  c% ?9 \5 d5 ]; m- `5 H* u$ G0 b" @' m1 u! ]
    & @5 J) E; |# S! M7 y
    ; k6 m- I* A8 U3 F
    描述Jsp中引入另外页面的两种方法,并比较两种方法的特点?
    7 r( {, o+ O& ]% ^<%@ include file=””%> 在编译期间把另一个页面完全嵌入这个页面,可以说是一个页面- w2 H) _: |9 g8 l; F2 F5 q

    * q: w0 p# u2 B8 ^在这里可以共享变量" m4 E; F8 e3 _" x( I7 ~
    ) X% o. l1 w7 [/ L3 l
    <jsp:include page=””> 动态的再运行期间把另一个页面加入这个页面,可以说是两个2 w0 X" t$ m/ l% u& t9 z
    1 Z9 s* p( H) G3 [1 h* @
    页面,不可以共享变量7 o8 ^) x1 I& N9 n- c  N0 d

    : S8 H4 h) c- l' j6 w7 O " O4 A; h. N" Q
    $ C! o  u' H/ f* Y, K
    什么是自定义标记
    # V$ j3 l( f! _) \4 p自定义标记库是一个Web组件,
    & D+ O# l+ y: p5 l" S; N5 @
    , q$ [; S2 q7 l包括:
    3 n1 m7 T4 x+ c% O
    1 t* G; B7 Z; E3 K- U  q一个标记库描述符文件(*.tld). Y! n& I0 @; T' t9 C% f
    ! j6 J3 T) q5 Q" K- e
    所有相关的标记处理器类(*.jar)7 D5 M# f/ N/ e" T

    2 q8 _8 f2 J2 Z* J4 T0 A5 i$ m- |; P
    7 a8 R& v) q- O' H2 q% d3 m8 ^: m# |/ g$ r6 a9 Z: f
    描述使用自定义标记的步骤,以及每步详细的工作
    , @/ b7 L; n3 Y; m8 b4 Q0 Z使用自定义标记前,要拿到.tld和.jar两类文件
    5 |5 i' x. ?  C% j" I' O- F5 ~- z" B
    把.jar文件放到WEB-INF的lib里面。
    7 v: M2 a& k; S, c把.tld文件放到WEB-INF根目录下。/ l: S3 F; Q: T) e. I( u
    在web.xml中配置。
    8 k$ J+ g) X* P8 R& p+ x<taglib>4 C# [* F5 r) f9 T
    ' X  H2 H9 q# [3 S! r+ Q1 q
    <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>9 \. B$ |8 E# Y% E1 h1 [8 {

    . b9 D! p  N- r" A; k     <taglib-location>/WEB-INF/c.tld</taglib-location>: t5 s, H5 \9 x1 ~( f$ ^! L% d
    . i( K% u1 A1 |* M
    </taglib>3 x' _; {4 ?& e1 `' Y$ h  W# j
    / l+ W8 z/ \, g6 S0 Y1 l, L& T5 L
    在页面中引用。4 d7 N! z# ]8 C! O
    <%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“s”%>& O4 q' @, @- l* w; @
    " @! O' T; ^% L6 P8 H! B# M
    uri必须与web.xml中的uri对应2 r& B; P4 w( @1 U" {# O) K* t' I2 l
    " m% e& a2 F2 v6 }: G
    prefix是前缀,用来区分是哪一个taglib
    , P3 y; E6 T" p2 A: ]7 X' \# I/ |; g+ T" M2 p
    使用标记9 j: [0 A" n0 J: a
    格式:<prefix:tag名称 属性>& a  _, U; P6 T/ T% r

    5 S4 {' P$ |/ U8 O9 m<s:forEach >
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    14#
    发表于 2014-12-03 12:45:59 |只看该作者
    在tomcat下配置数据源7 o3 ~  O0 J9 H8 n6 C8 z
    1、服务器与数据库的连接
    - l0 \2 n" s3 W% \0 z' u" R6 U4 _+ ?$ |+ Q1 Z
    配置server.xml文件( A% ~; e+ }3 c! z, n# w

    # N4 T! v- A) k6 p5 Q1.oracle- c( M% G3 L( h2 D  a( ?9 Z, V: f

    , n) Q* X# Q& l% S/ b<Resource name=”jdbc/company” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”) n; o5 z' t" w4 B
    * a5 p: S! @9 I( w
                            factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”
    : }) S6 y  u& V) ?* u
    ( e3 {9 [) I; V( f  g- aurl=”jdbcracle:thin127.0.0.1:1521rcl”
    * o3 f$ e5 g$ C! S- a. r
    , h) l1 X& X  x$ r- B; _driverClassName=”oracle.jdbc.driver.OracleDriver”, Z% Y$ d. U( }4 _+ y9 P- y3 A: N

    - p8 p' l6 ]$ n* P; F0 Tusername=”aa”
    7 T( y& h& Q# [! p, a' p8 J
    ) G7 b  z8 A: x/ @+ Q4 [8 kpassword=”aa”! A: z) L9 [' ^5 Z

    9 E  ^: K1 K& l$ s2 GmaxActive=”50″
    0 [8 f9 ~- k- d( g; T, }! b5 j% E# Z0 I
    maxIdle=”10″
    3 m  e' B0 q4 n" `) |% w* o$ b# l$ Y) F, x. p
    maxWait=”-1″
    * c4 u( w9 R# u7 V9 x' _( L" t5 |5 l' S& y& ?7 C
    />
    / p  r# x# n* r, d; {) e. |7 ~# ~' s) |8 h1 X& g/ r, X
    2.sqlserver0 t: f& k. I0 y7 l# A
    / p, Z* [# k/ E: e: C
    <Resource name=”jdbc/webpage” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”8 e# x! @9 D$ T/ h$ U/ k. c1 o
    & r7 y' _/ O  ^
            factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”
      K3 t4 p, ]) W" b9 I
    9 p  Z) D# h* A% G, gurl=”jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;! _2 H8 E. w( o) Z! Z1 C8 `7 g

    . G. {1 z3 c: z! I4 cDatabaseName=webpagetest”* n8 y. B  M% b0 ^

    ! m( d9 }1 ~( k1 tdriverClassName=”net.sourceforge.jtds.jdbc.Driver”
    $ ]9 s4 L  \3 V
    5 L& X. ~, \) A& A4 l1 U) Cusername=”aa”; p, u6 b4 X$ z  k! V. \+ K" {

    : G5 d0 T# l' z( |password=”aa”: i! a% `: g1 R$ S4 L1 A

    2 |* _, ?% U7 T7 d1 [. g2 u* c, _maxActive=”50″; I# M! l  @3 a) n) O
    % b8 U) U$ Y* C
    maxIdle=”10″
    # t& u( m6 [; ^' v' K$ }5 k# r  T
    maxWait=”-1″8 [) v  k. n9 |

    0 G& P$ X; }( F; Q5 N+ e/>% u8 x9 X) a. L- Y- U% w& i( ?

    3 N' u' u( l! S, }2、配置自己的web应用的xml文件
    4 N! S2 m" a9 b2 }  V0 s. @& }: W" P' i* z5 Q
    7 y4 ?4 D2 h( N: M- V6 u, i
    2 V, k$ x9 {3 N! H: y
    <Context path=”/eb03web” docBase=”F:/workweb/eb03web”
    5 m: o$ @1 `; y5 ~! z! }! K9 @$ V  B
    privileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>8 \+ b4 H0 Q# W0 ~  x2 W
    6 x& W0 |- R2 k& v' I2 _# E; e
    <ResourceLink global=”jdbc/company” name=”jdbc/company” type=”javax.sql.DataSource”/>1 i  }) h% s! t4 N7 h4 U! i

    . r2 [3 n) I4 I& Y! z</Context>" G. @; Y9 k* [( p; M' u7 S5 b! r

    # t. S/ @4 o6 L . Y# n* G9 e: H9 c# R
    - X' W3 |" D6 `* V/ U) U
    3、配置web.xml文件- Z: w4 W. |# r
      u! @9 e  H$ p. \6 T& Y
    与服务器建立连接/ r3 u% u( ?  G1 s) o# Y3 \1 R+ b, o& e

    9 s% F# T; s# B! I+ c<resource-ref>
    ' n% G) v& p9 f2 w# x' K5 e; c9 B% p/ h; g- H% q
    <res-ref-name>jdbc/company</res-ref-name>
    3 R9 x+ Q( x$ l0 y; u- J: b8 T; f; p
    <res-type>javax.sql.DataSource</res-type>
    ! j. Q' Z5 @5 l9 `6 y( X' [
    / d6 w$ J0 d6 e% x# E<res-auth>Container</res-auth>0 V" y( C0 G, k" v- [/ Y

    $ ~9 c) A, h. f: R: R$ K</resource-ref>
    % S% C4 ]& F+ f5 C$ z  Z! z7 P
    & }- }* ~+ @" |# f9 p' s3 c/ |4、在应用程序中不直接与数据库连接,通过DataSource连接池建立连接3 Z0 N1 ~8 T: e4 e1 [
    ! A% A9 k  [! m0 q9 a* y
    //1.在程序单独用时设置系统的属性,在tomcat下可以不用配置,, c  ]+ h  U& c% T' b) s4 m

    4 S7 z6 _/ j1 c, j- {System.setProperty(Context.PROVIDER_URL,””);
    6 [0 \2 d0 U; w0 ]# q1 b5 o. z& h# a1 A; ~1 i- ^5 r
    System.setProperty(Context.INITIAL_CONTEXT_FACTORY,””);
    1 Y" s# G: n6 ^; E$ Z
    * E: u4 U( N* \- E% H/ O- R% d$ j//2.创建一个上下文对象
      l/ c" D) y7 E0 w: ~0 K* x$ A& z/ T; H8 p# [( [6 o
    InitialContext context = new InitialContext();4 ~6 U  `: e, V7 `& H: v
    % J, e# _* _4 M* u6 i
    //3.通过上下文对象在连接池中查找DataSource
    4 j9 q7 T* i# U- |5 K7 t( |
    / c" ]( F5 j  o6 r0 ?3 P: _8 HDataSource ds = (DataSource)context.lookUp(“java:comp/env/jdbc/company”);" z! F/ z/ i2 z  l' X# k# _$ \
    $ N1 u& n8 q4 i: j
    //4.通过数据源建立连接/ ?9 T! w% n, p, }9 A. }4 D7 w
    # t- {" J- K& w8 J) W
    ds.getConnection();
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    15#
    发表于 2014-12-03 12:46:30 |只看该作者
    ORM对象关系型数据库映射
    3 h2 o' p+ {( G6 ]- h(Object Relation Mapping)
    - J; H2 y, j, J' {' v6 d3 `1 K4 d" P
    一、映射的特点0 |6 k4 }& h/ n4 K
    1 L6 \8 }4 q, [# ~5 L5 ]; f
    1.一个对象可以对应多个表0 [$ D9 l# ?" s+ L
    $ o& I. u1 Y# I! Z# _
    2.一个表可以对应多个对象
    7 A- m; E" a7 s4 x' h1 [
    ' @' q4 x( ]& }; l# Z5 m3.对象和表的关系不用完全对应
    6 q! |+ {# V8 N$ B9 a/ _- G
    " c* [: c5 X/ R, w8 X: P% y4.对象的属性的名称和表字段的名称可以不同. A1 \, W( X; P8 \3 N' u+ i

    * P9 V( S" x& _5.类型可以不同,但数据类型之间可以转换
    $ q3 ~$ {; t4 V: N4 S$ I7 p7 Z! l- u) I$ F, }3 b& h& H$ }/ Z
    6.对象中必须有主键,数据库的表对主键无所谓
    6 Z/ a* D) R# a1 j& \% S% g- n0 ]5 g  f+ o1 K9 E; @5 l& n2 R* v
    7.数据库中有主外键关系时,对象中可以有,也可以没有. x& t- k# K( X, q; h6 h( \* m
    % I4 [8 I) I  o4 C) a; ^+ ]* b
    & [& h9 L+ N' ~7 }& I' \9 d

    2 L5 U% N" H% U* m4 ]. ~. ]二 、有一个映射的描述文件————>xml
    ; r) O, S8 m- z8 B4 `% L, x- e7 Q" d  T, s" l2 d
    三 、怎样实现描述文件————>一段程序6 X6 J& v( B* A% I4 v6 u1 G

    : r( f0 p/ i, h$ G; @; z# l7 F对象 映射(mapping) 数据库9 H3 B, U1 w; W) Z: F
    ) p: Y. F1 ?6 O; e
    user
    # g& i$ `) I$ K# ~
    , }/ i' Z0 Z1 o8 o: o8 Did=11
    , S% T. }$ ~' h* R
    : y, C! v3 B8 p7 t$ oname=”张三”———— > (1) —————> tbl_user(id,name,age,tel,address)6 S0 u. ]( R3 b
    ' t) ]4 w4 j; H
    age=25 <————(2) <————
    " D+ F% d% T* B3 I: V2 B" L' t+ k3 P

    % x; I$ K9 V$ U: k: @1 B, ~! s6 z. L7 \0 {" o$ X  y% F4 Y5 K1 O1 y! e
    (1)从对象映射到数据库8 O; e# P4 ~7 x+ L7 ~' ^
      y* `5 Z3 B; s6 h2 e8 \
    1.JDBC
    1 [0 I3 F- @8 u; D! F; }
    3 Y- C) Q4 Y( w  S+ o) |2.根据描述文件来动态拼接sql
    . F9 X2 M; p& I' T4 f
    " U. e5 E) J& X% |$ m3 u% p3.执行,添加到数据库中. w' D1 a8 T' u6 y5 g+ l! \# n) O1 M3 p

    2 E, }- K4 e% q* f* c
    , g4 Y* F; m& o% }$ {' |; {- {
    , o# _9 x- ]' D(2)从数据库中映射到对象
    3 R# d* g! P8 m- @# S: x" @* ?/ y! f4 O: T" Z
    1.JDBC
    6 q- o, T9 }7 U" T4 p4 Q: D& t
    4 y- v8 ^0 W) f& E; R$ _2.拼接查询sql
    - j& j+ m. j) s7 M) ^8 k7 i7 n5 z" h1 H! L) j' z
    3.ResultSet5 p" G7 T. ^3 o/ V3 \8 V* s* c
    7 r/ t. K  c' w% c
    4.Model
    / y* s1 m6 h1 f4 K; E6 a) b" \, X# K: ^* K+ U! ^

    4 x, ?; o8 G- C4 ^( Q8 `4 R0 [. c; S; f+ c% ?) K# }; E3 h, S3 ^
    hibernate- k4 |" X9 {1 [+ b2 O. e/ ~
    开发流程:- F2 Y* E7 ?9 Y
    / T# C# k2 r9 z8 L
    是什么?
    7 m  f2 X, F1 h2 k, khibernate是一种基于orm 的轻量级的框架
    1 D. l" y9 I" c* P: K1 R% T$ I0 E3 X! G
    ! D3 `& G0 D  S$ P

    8 n7 i/ u* U- c% {有什么?: n( V1 L! y9 i, V
    1. session 保持连接状态(依赖事务和连接池)/ S7 ~' f5 f7 Y

    " m. _' B' t, N' l( o  k) C2. Transaction事务- p( W+ g1 Y$ Z( u; N

    / r5 G+ p$ F" c$ w3 T3.: k$ G& s# H0 m/ ?
    Connection Provider 连接池8 }2 j# P! W6 ]7 O% H+ e
    7 {: y' k9 X( c% M

    ! F! r& C2 H; u( \0 ?, J9 j5 }5 X5 s4 [. v0 M, f) S
    能干什么?
    % m! J9 J: }7 s# r# d1.orm7 F# j5 `# X9 v" I. P. [
    4 K/ L: T! A  X" y0 [
    2.提供操作数据库的接口,简化数据持久化的编程任务
      f& ~( W1 ]/ @6 b" V
    " c! \" [) f4 |
    # ^/ e6 y# r6 Z* p8 g8 H- ~' S5 W! a  f  K
    怎么做?
    - G6 u" U0 V% a6 E. a2 K1.搭建hibernate的运行环境,将hibernate的包和hibernate所需要的包拷贝到lib 文件夹下" u- M+ J$ k! ]0 Z. W

    , [' ]3 m- z. |# e* m' F; m2.O(vo)8 r; N. O- R# z

    8 b5 M! V( d& M$ g; j/ J3.R (关系型数据库中的表)
    5 \( V; E+ r5 I. W5 e! L3 H1 W; W
    9 z7 ~! \* i: @* T- ^! b+ m3 h4.配置文件% k7 v0 u' {1 C* V6 }& ?

    % [* E. d/ u/ A  I4.1 cfg.xml 放在classes根目录下,默认名字为hibernate.cfg.xml
    5 \- Y* a6 I- m5 @2 a
    , l' N' p) ^# Q9 m# na.与数据库的连接
    1 F% ^+ V! d- T$ y( {  l" }# H6 c6 K
    0 t$ m. J# {' h# t* e9 J2 W/ @b.可选配置
    + l7 Y8 L9 r) U: K" m
    0 ~9 U7 j* Y, I- j7 x- rc.映射资源的注册
    & A; @6 n2 j# R% Y4 Y) l7 g
    $ Y& r: B  Q) z0 w& M/ H4.2 hbm.xml文件 名字与类名相同 并且与类放在一起
    ) D& }; V! n& p2 e
    ) f- x/ N1 l, Q% G1 La. 对象与数据库表之间的映射3 ^  L( r( D' n" X* J! A
    % p$ f* \' B$ l+ E/ _/ [+ `: Q: {- Z
    b. 对象的属性与数据库表的字段之间的映射5 K9 X$ M; R3 G+ U0 j$ e

    # L8 U" ]( m5 C. Fc.组件之间的映射
    2 A) ?' n5 A  ^0 ^+ F5 J# a8 s. }% o7 e. q/ I% R6 O+ G9 l
    d.对象与对象之间的关系映射: p: q- z1 @# ?/ A" E+ b9 F
    + w2 w) S2 w; z2 v1 F9 r, h
    5、客户端0 r2 N3 j* r# f0 i3 w' A

    0 {3 u% L; @; \% `2 s1.得到SessionFactory/ v/ ?7 `0 P/ I! B* F! Y; A5 w4 e
    - O7 m, w3 @# l
    2.通过SessionFactory 工厂来创建Session实例
    ! f7 p6 [7 _: l" f: m+ S- I1 M, b" L& q) c" k
    3.打开事务( P+ n0 t3 M+ Z6 u# Z) X" m5 G

    . x+ g, H! }" g  T4 K4.操作数据库
    & ^5 ^) M2 @) f% T+ L. t/ x$ O$ y( ]: _1 h
    5.事务提交" |$ u# i, E: J9 A
    & b, n7 }6 K" |1 Q
    6.关闭连接" ]; P7 c+ t/ S; h* y7 A* [

    $ }! Z+ z3 `% h) e9 O: X运行流程:
    + j6 j# b/ ^: G* w! x6 o. o
    7 z0 N& \: U& a4 ~& z整体流程; T" |3 I$ R* J, e5 [2 `1 B* o* P
    1.通过configuration来读cfg.xml文件
    " F5 C, {8 x7 b  e, j9 J8 k9 V8 {( u+ s
    2.得到SessionFactory 工厂(根据数据库的连接来创建sessionfactory)2 m$ Z* x# q0 Y% x6 |

    % b! b) F3 r9 i" O6 ]3 Q% _3.通过SessionFactory 工厂来创建Session实例
    9 U: ]3 s; c3 c1 O( t* _# X# K# q1 T( w: M9 e$ \* M
    4.打开事务
    " ]9 @$ U$ X! r# R  y
    0 f0 E9 g! q* _6 @% \3 X5.通过session的api操作数据库( L7 L8 w: S( j" K! x$ L0 B

    1 S, f) N* _" A4 V- a: W2 b6.事务提交' j- N; @8 X9 Y$ S" P
    0 d3 E" l( _6 Z4 O
    7.关闭连接
    3 w9 X8 g  Q2 M7 j* S0 a9 t
    1 |9 Q- F% Z! p+ \) F6 k9 {9 u) b ! F5 J# x- x5 R$ q

    ' ^% a1 \# x0 D5 Jsave
    2 X0 a4 V. P! s4 J( g6 N0 V1.to—>po; a: V7 f# @5 i1 d0 A# f' N* |0 a

    + R/ G, }5 g( _1 x( j# y4 m& b2.根据model和cfg.xml中映射文件的注册来找到hbm.xml文件
    3 D- I( F/ \: U
    3 ?8 n  ~; Y  ]# Q3.根据hbm.xml文件和model来动态的拼sql
    0 [% Z1 X) W6 @6 e' T6 j5 V( k7 ]
    4.客户端提交或者刷新内存
    9 ?8 h& J, H8 H! k$ _/ Q: V* ?; W/ D! b4 U& d! W. F# D
    5.执行sql,值放到数据库0 I2 `$ S" F2 e) |5 i) I4 B

    7 q# R5 C& x$ Z( o$ \6 a
    ! p( ~& [9 C6 U6 T* a
    " M: x4 I1 h0 P. S5 j9 d( ^' Oupdate、delete- _5 j2 H1 J4 d: \& m% D6 f
    1.根据model 的id在内存hibernate的缓存中查找该对象
    1 k: E" ]' r( d4 a4 x0 \" X1 d9 L3 r4 K  `* x7 q- e  e
    如果内存中没有就到数据库中查找来保证对象的存在
    4 r; c8 c( h& T" ~
    6 z  H* D1 N/ o+ h3 z" u1 Y- p2.根据model和cfg.xml文件中映射文件的注册来找到hbm.xml文件
    % d/ F1 D" Z: ^- U7 O; |6 S; t9 z
    . M" j7 `5 w0 |% B1 l+ C; I- l3.根据model和hbm.xml 文件来动态拼sql
    4 i( ]: ], M; X& r' L+ X! C
    3 w8 P* R1 t+ T4.客户端提交或者刷新内存
    . m  z5 l1 B0 \5 s/ R4 A# ^' `6 P5 W3 u3 D5 c% ^$ |
    5.执行sql" r. @- ?3 p- z

    7 |: T% T# y/ ~6 m, ?7 s& v' U& O
    9 a2 A& B0 V% R+ w3 l' _2 r0 z, p% @) _& V* @9 d' U
    Query
    6 L, U# k+ R/ N4 M6 tload5 h% a: z- G' f! y# {" ?

    * W# P8 ~3 F4 h9 n* q1 U1.根据model的类型来找到hbm.xml文件
    5 x5 S1 c2 }/ e1 O" j* q& ]) W3 C  X2 i' a
    2.判断id对应的对象在缓存中是否存在,如果存在,就直接使用,如果不存在就进行下一步。
    . e+ m2 o/ u: `3 I
    / R" j* ~; Z+ i1 ]3.用id做为查询条件来动态拼sql
    " f& z8 f( e7 v) O2 z1 W- N) T1 w0 `$ s% p: Q1 `
    4.执行sql 查询(先在内存中查找,如果没有找到(会抛出例外),就去数据库中查找)
    4 g7 O0 Y% B+ `/ k# A+ p/ C
    3 b8 U% n% t+ p- W% j+ X4 O5.返回一个model类型的对象
      e/ I3 P/ s- g& y
    * L. _' m8 p2 b  N' @% p  uget" t4 C) z$ k: Y: h# d1 N9 H; W
    2 ~& s1 [* H2 _
        1.根据model的类型来找到hbm.xml文件
    $ u. u5 J5 J& _, N( z; h
    9 Y' f  T! e9 l& F: \8 F5 O% t; N2.用id做为查询条件来动态拼sql
    , H* N& k2 I) M! V. I( x# d3 C; }' @/ M# W, M
    3.执行sql 直接在数据库中查找,如果没有查到就会返回null
    3 }5 a. p* H# I: f' x
    ' w4 l& h4 B' f6 \+ W2 |$ @8 I! qquery
    ! L5 \8 a8 I' w' g4 y1 |6 H* ^' _8 N3 ]1 E6 B
    1.分析hql语句,得到model的类型
    . U; e5 W5 T, v2 P8 y0 f8 l- V3 ^# X! j0 x: ~$ X4 {8 D
    2.根据moedel和cfg.xml文件中映射文件的注册找到hbm.xml文件
    - j9 k0 k( c, K& m4 b( s
    3 f: X! z% u1 k8 H$ z0 n; H3.根据model和hbm.xml文件来动态拼sql/ o# t0 f$ R% O8 \- T0 u4 A7 J
    + j( ~5 V+ T5 o2 U0 J# ~
    4.执行sql查询数据库
    8 ?- u3 I" g% a( ~# }3 C0 D5 [: ~/ I7 m7 Q. L6 c6 w$ b$ D
    5.返回一个resultset: H' {& Z& R4 e+ }8 i

    0 H8 \" H! @3 C$ J3 x# G6.循环resultset的值,放到model中在放到集合(List)中3 R8 y+ o& H3 W, h  v, B

    # F+ x4 n( \; u& N$ Q& x . Q1 N3 }6 X7 k4 s$ v

    9 `, J+ C$ n9 i  l9 |$ v9 b谈谈hibernate缓存机制( C/ e4 [  z9 I5 G" @, f& ]+ p
    0 E9 t" ?3 V& {  a, g" ^$ }6 j4 [
    缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了。打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去数据库中取,也省了很多事。
    " [8 o1 d+ m+ ]! O$ S+ `* s& Z2 [& ]8 |0 R# b% o  w

    ( v8 P* ?/ _' Q8 d. i
    4 q) q, {  i2 W! i( B, \' khibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。
    " @" p7 D" Z( u. e; S4 E4 U
    ) _, u( e3 `1 l# Y( N5 ~+ o5 \
    0 h' L+ I# _4 R% z
    - I7 M( F$ _! ?% j0 ~对一级缓存中的session事务进行数据的预存取,数据在各个session的上下文中存在(单例),当session关闭时,就是session.close( ),整个所有session范围内的数据全部清空;二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二级缓存只有一个区域 ,画个图比较容易理解。
    : R- m3 ^& ]) V5 X
    ! m, X* K& c, s8 l& i5 z
    & U0 I# b! [. _: D1 X5 S; A0 V1 @/ R: Y! H# f8 O# a
    | 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|$ B2 n# t* ^3 a7 j
    1 X! _5 l9 i; t9 A7 L9 d
    | | | |8 k+ F2 ?+ U- `4 }2 y) q& m2 w( f" @

    ( H; z( v8 N) `% K$ w; R| | | |& M+ O. O4 h& M
    , \9 H9 L. k4 u& m6 e4 Z7 ^) t
    —————————————————————————————————
    8 f6 C8 Q% H: \/ E0 k9 _! x" f  Z+ j
    sessionFactroy级别的二级缓存
    * v+ B* Q2 J' Z, P; Q8 b9 N% u- ^: C+ \
    ——————————————————————————————————————-+ A1 n0 `: ]# U
    6 i: _2 m7 G, |  G: A+ c) F
    |
    6 _" I! W( H, i+ Q
    0 M9 U; _- ~% l) ||  m  r& l2 x1 T) d0 `
    1 T$ H& u0 g1 b' K3 P5 X
    |& n7 Q( j% a. z, V. X
    7 |! f# ^5 e+ s8 `2 ?
    ——————————————————————————————————————! C& Z/ |: N2 T8 Q
    + i2 K4 |9 x3 _
    DB
    & s, T. Q! n3 _8 @) x) s& J& P. w5 U. J5 S/ P  x3 N  K9 N
    —————————————————————————————————————–( t* C4 b3 C9 T: I; X+ l; O
    - o; _3 B  @) Z/ z
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    16#
    发表于 2014-12-03 12:48:12 |只看该作者
    Spring4 p+ c( F  ?& s" X3 P
    • 是什么?# F7 |1 R& n/ w3 X) P
      1 p1 N% J  e( b- Q8 E) b( s

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


    , w  Q' {4 C8 Y) |0 D. Y
    • 有什么?
      3 q/ |3 r4 X* R  k
      ; l( |- `3 t$ G# n5 n! E

    . F3 y4 \8 @% i. s8 ?

    每个包的功能:

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

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

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

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

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

    AOP :面向切面编成

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

    ) U6 j" C: q5 K2 b
    • 能干什么?
      - ^9 ^  ?9 r  H
      6 U9 u% U6 M( U  |% `6 L

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


    " _8 q* B% b# e' e  b" h8 d( M. d
    • 怎么用?& R+ e8 A% N5 `7 ~6 O+ H

      3 E( T1 C+ ~' g
      • 搭建web工程,引入spring的jar包% y5 N. x: a& K3 V3 l' {/ z+ x
      • 在web.xml中添加如下配置
        ) r- T7 D! H2 x3 p1 ^
        2 Y2 L0 {0 l' r, Q+ J" t1 j

      6 ^$ W4 v1 w. p7 H$ K* D
      * Y2 Z! f0 {4 w( o& H9 n

                contextConfigLocation+ {2 ]( P6 j- K1 u# L& m* \" ]

                classpath*:applicationContext*.xml- e" h, E# G4 C

        7 d- ~( P6 X% g6 d& v7 O' H) h" a

            1 k7 J5 P7 i6 |' Z8 V2 S. x, T

                struts28 B- s; w% _8 C

                
    # ^. D& N( O! u8 R

                    org.apache.struts2.dispatcher.FilterDispatcher! Z5 Q* ^$ \# j  H; R) |9 D  U% F

                
    4 K- c9 C1 _1 O1 |: y7 B0 f

            
    2 ~8 Y- V) ?. g4 m" q/ u" a

            
    8 ~2 i# A6 V( b5 J

                struts2" a+ U( n4 p0 j* J/ s$ s

                /*
    $ z: S! b" }8 Q) `


    ) c  N  w+ M5 t9 u5 g

    ( J' b3 C5 _4 \) P* V" [+ h

                , G+ h9 S! c) d

                    org.springframework.web.context.ContextLoaderListener
    2 {4 l) D  X( G

                
    , M+ {( W$ ?; }, g& T& o# U

            

    • 部署  I3 B1 ~, U% _+ b* U/ K3 ^

      8 f  p% a. V# \' P! E6 O6 x5 k1 Y
    5 l4 g$ y+ m- U0 Y1 _8 c# H
    2 U9 e5 U+ o  V+ p4 N

    " V$ {: Y9 g& y/ q
    • 容器和bean& ~0 n- P1 X9 W: M

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

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

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

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

    3 Y9 M3 P; s# J0 ?: b' J
    • IOC控制反转
      3 B. p) z, ~9 z' p# D
      4 A) S, t7 a9 r0 d4 R$ ^# X
      0 \- y5 z3 E; s$ [

      3 s& H. |! L5 q! P
      从前的应用程序想要得到A的实例他会直接主动的去拿,当用了sping后,应用程序由主动的去取变成被动的等待,由spring来控制应用程序所需要的对象

        V2 ^$ L1 H2 ^% W) B) M
      • IOC的优点* S# o5 t1 B- y4 U& ?
      1.可以通过IOC来获得实例
      2.可以通过DI来获取注入的资源
      • 配置IOC的原则$ A, l; U5 b- K: [
        • 一定是可变的资源才采用依赖注入
        • 一定是层间的接口或者是模块之间的相互调用才采用依赖注入9 b! |6 x6 _/ P2 D9 C  l& o
    3 b# m7 ?$ [2 r# j0 `
    • DI依赖注入; O( I; D1 ~* c5 L

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

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

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

    例如:

    在配置文件中


    , c7 t( O- q; g  B; H
    2 L! W" g9 z6 e. ]( v
    " @8 X8 f! V' |9 N

    在应用程序中

    Public DBDAO dao ;

    Public void setDao(DBDAO dao){

    This.dao = dao;

    }

    3.构造器注入


    ! \# Q5 s- M) }3 N. h, h" B

    4.ref 表示参照其它的bean

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

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

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

    6.lookup注入

    7.singleton

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

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

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

    8.DI的优点:

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

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


    ; Y- A3 b( v7 Z% g$ x: ]
    • Aop面向切面编程/ z6 e$ ]) o6 r3 J" T
      1 [  @5 N& R! b4 {( x$ P4 a

    1.AOP面向切面编程 一些较好的模式或者是示例—-范式+ r( m/ o% D1 M# r2 H

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

    2.AOP的思想: 主动—->被动(追加功能); f8 E) S* [$ R, @( q- _7 B( q

    3.AOP 的概念# t1 {7 W# w1 N: y& s; p

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

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

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

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

    5.引入 :扩展的功能

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

    7.aop代理 :实现机制

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

    4.AOP的事件机制
    ' R% d3 u4 W' ]* z  t' ?, `

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

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

    3.找到切入点

    4.确定连接点

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

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

    1 f8 [. T7 T7 I4 }8 a; Y' ?  ?
    4 b! o* A* _: h% E8 B& T

    3 I( a/ N4 }( w; ^/ g3 q, R8 s; T2 R

    1 Q, E4 F) V+ N" @( B4 D# O1 \- S! t# d1 b

    7 _9 A: e7 y$ `) G3 Q' y

    5. AspectJ
    . n- E& I0 F* l2 x4 o

    5.1.在xml中配置比较烦琐
    , k+ G2 \) V' U9 M( j5 r, f

    所有的入口必须从一个代理(ProxyFactoryBean)开始1 b6 D" m4 Z, u4 m

    0 Q; |6 R! v/ ?' b0 x. j; P  @
    & b/ c, g1 T* z: y1 b: p

             ' g8 G( k4 C, }$ F) D5 m2 m9 l
    5 P" a0 n+ H3 h$ K! H: x1 T
    7 e4 x- H8 q' Y! ^3 X/ E! |
             
    - f1 d- z5 h; x( q4 ~9 u

            
    . O6 S' O3 }: f& A

            

    , x) v9 B8 B8 c
    expression=“execution(* com.javakc.aop.MyTarget.t*())”/>! b+ Y  b- i# u* Y1 d/ S

            + T$ V* I/ b5 W

            
    ( q# v; F4 @. [

        , p( n: g+ ]: Y& `1 C


    1 C4 @6 I) B( p; J' m/ H3 ~
    ' N1 ^8 K: U* p0 j+ l- }

    5.3.使用注解的方法相对简单
    / A/ D, u( p3 y% m. e+ I

    @AspectJ的基本语法
    ( H4 }7 L, i( r# A) P' r

    1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面/ J6 x" |- G4 S/ r# P" G) Q

    直接在类上定义@Aspect
    ) J  u3 n$ J7 C: C5 u

    2.@Pointcut声明切入点
    - m, K4 V7 e5 U' e8 e1 n4 s

    2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字
    4 y, E* c, x6 C7 U3 A+ f

    2.2、可以使用匿名的pointcut
    0 g) d5 H, C/ q( S

    2.3、执行切点的几种方法
    9 d) Z; u1 B, D! R; p; [- X5 j

    2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法- G+ Y9 L: D, Z4 b8 X, f

    2.3.2 within 指定到包,不能指定到类
    , I2 I; m; J/ x( n; o2 r5 J9 l

    within(”com.javakc.spring..*”)& j! d7 p6 @# q8 ^5 \- W

    2.3.3 this 指定到实现接口的所有的实现类& ]* G, @) s! ^0 d( S

    2.3.4 target 指定具体的实现类2 D- X" [9 w( ~

    5.4.advice的五种类型的示例9 r5 B# e4 k$ s0 B

        客户端必须从接口走才能得到监控,实现想要追加的功能3 r4 h( \. n7 W

    5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)9 `2 x  U$ z' S% n8 Q

    追加的方法的参数名字一定要与retrning的名字相同( N4 G/ \; A5 Y9 [; ^$ o6 z; b8 v

    在注解@AfterReturning中必须加上pointcut和returning两个参数$ B4 U, h$ a- y% t- r

    pointcut指所要监控的目标对象的方法
    ! Q2 Z6 C) E* ^+ Y8 k* S9 J( U5 c

    得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配' H, W0 I( j! d5 l) D

    完成追加的功能0 {; k6 f: C+ c2 H2 v" @

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    : q, l4 ~) W0 I! B

    (1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)# k/ y  h6 d. K6 V3 E' S

    (2).7 C- ~/ K; g5 U' u9 |4 d- u3 D9 a

         2.直接引用匿名的pointcut0 a6 F; z: Q+ L) h* c. G

         (1).@AfterReturning(“execution(7 G  z5 x, n. }# w

    * com.javakc.spring.schemaaop.Api.test4())”)
    / A: v1 `: U& v+ d* d) y

         (2).@AfterReturning(pointcut=0 H8 G% U. @8 z" U

    “com.javakc.spring.schemaaop.TestPointcut.t4() &&
    3 |3 L9 b6 M0 ~9 a% Q

    args(str)”, returning=”retVal”)4 ]; e/ f- l! X( {9 v: A

    @AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)
    & D* m% M( m$ T, V! h" P0 u( e

    public void testAfterReturning(String str,Object retVal){: p( H8 E- T" n4 N1 k! S# O

        System.out.println(“afterReturning1=>”+retVal+”=>”+str);
    ; r4 k  F# F& M9 A

        }
    ! V( c3 F# i" A* V

    5.4.2.@Aronud% a) j( _/ ]4 u: V" b& U" h$ b4 P

         注解@Around环绕追加功能;0 R  u1 R4 m8 @0 _

         在执行目标对象的方法的前、后追加功能;! \4 r( L& {) T& z0 \/ m8 b$ m

         必须有参数;第一个参数的类型必须为ProceedingJoinPoint;! b0 ^2 ^. k/ z6 ?8 d  w# L2 M% e

         通过ProceedingJoinPoint的实例的proceed来调用所监控的9 H6 E; p; q- ^3 ]& n

    目标对象的方法
    ' y* r; u( J9 t. f

         1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    4 z( ]1 t7 C( C; g& c0 g9 S$ {

         (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    ! b8 U7 x+ i$ q

         (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()- u) o/ k2 p5 D' ^1 a

    && args(str)”)
    * a$ i7 J% Q; i+ X: E; o/ j* A

    2.直接引用匿名的pointcut# @8 Y; o0 ^) d' a

         (1).@Around(“execution(
    ; Y0 J, f7 V, f, K6 \

    * com.javakc.spring.schemaaop.Api.test1())”)
    0 f. s5 q* J" U9 d

         (2).@Around(“execution(9 G: ^% l8 o! j) H- U5 ?; Z- K0 S

    * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    ; I6 q' g; W1 H/ _. v3 A* z

    // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    : F& o$ e9 R6 N  N

         @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)9 E3 D$ Y* _( ~5 f# B8 ]4 E" u

    public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{
    6 R% z5 J4 L6 ^. ]: n

        System.out.println(“around1==========before1pointcut==>”+str)8 Z  k7 H" V; O1 p7 E& Q+ ^9 i

            Object obj = prj.proceed();
    2 T3 [) J1 _; n, Z% ~

            System.out.println(“around1==========after1pointcut==>”+str);. u5 {2 z5 d2 b5 K

        }
    ! `6 Z3 F* ]/ y2 g, l% P) Q* a

    5.4.3.@Before+ V4 `/ G: R. p7 \

    注解@Before在执行目标对象的方法前追加相应的功能
    0 r) D4 \3 Q0 K/ q% a$ k

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    5 [) y8 |5 k6 `+ h5 N

    (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    $ U6 M3 Z5 d8 `8 P0 C; _, y! K8 c0 S  m

    (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    0 V& ^, S3 X/ C  J1 F! G% H8 z

    注意args后的名称与参数名相同( R, I7 ]; U6 t1 {6 P6 O4 [

    2.直接引用匿名的pointcut
    : ~/ r9 J: |# t

    (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
    4 a+ k8 ~$ g7 J/ t

    (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    & z5 N$ d# q0 |" V, H# C

    注意args后的名称与参数名相同9 F% T7 F: E: E! `5 p) j

    // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    $ M1 s; l2 J! I( o  a" V5 }% z! n

    @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    ! S6 @, B* \/ y

    public void testBeforeParam(String str){
    1 J7 ]0 k0 s) Y) \+ f* r& Y: y, n

        System.out.println(“before1=param=>”+str);- y& G+ v; k: d+ Q8 j

    }- I* L# N; b) f- h& b

    ; H; P+ i( V: J; {. d

    5.4.4.@After7 q/ w+ \+ Z& U9 x- J

    注解@After在执行目标对象的方法后追加相应的功能6 ~3 F3 g( [3 h( E. w

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    0 _! \5 K0 z6 g1 b9 B! C

         (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)' I2 {5 p# S+ r

         2.直接引用匿名的pointcut
    " X' o6 v. n4 g$ @: S8 W0 a6 Q

         (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)# c7 O1 j; b. y; o7 V

    @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    $ u, K4 U8 |# g: _6 O* V) ?$ C% b( W( E

        public void testAfter(){; O9 s% |' `3 T$ C

        System.out.println(“after1== >pointcut”);
    ! G& F* r9 {! ?; k  e3 g9 r

        }# z' A9 x/ F; ]. p7 U2 S

    5.4.5.@AfterThorwing$ D6 _/ O, t6 {1 \* u3 Z3 u

    . {- p: l- w8 ]  m% \# G
    & a9 z6 Z$ d, G/ f+ f0 R4 y+ T7 V
    • 描述一下spring中BeanFactory和ApplicationContext的差别# b* v8 s( D7 [4 Q! y1 i
      0 K- d; ?7 l: u  F. [! q( u% p

    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”);


    5 N5 `4 F2 V; v/ z) p9 C8 D
    • 谈谈spring对DAO的支持
      ( D0 N2 C1 y" ~8 y# b' s* t
      , p4 s7 j: R$ l* A8 ?' J2 M

    Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。
    % n' K8 x" ?" {8 h9 g

    简化 DAO 组件的开发。  |; k  `  Z" B+ m
    Spring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。
    : }2 u3 I/ q5 R1 H

    IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。8 [# L+ n/ L/ m% ~) d) E

    面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。& u/ T1 i, W9 P( ]

    方便的事务管理: Spring的声明式事务管理力度是方法级。  i1 L7 u# U$ t0 c, p: B. ^

    异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。
    + |" l; y; e0 P( A. g2 r; J% _


    # A$ T, U% y/ z: C  W/ _( w& M$ s- s$ I0 m. u8 ?
    • 谈谈spring对hibernate的支持9 z2 v/ a. Q" S
        \! ~/ B- i, O* i8 a

    在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。& ~8 a) V; l9 s. R2 O0 I! C

    一旦 Hibernate 处于 Spring 的管理下, Hibernate 所需要的基础资源,都由 Spring 提供注入。Hibernate 创建 SessionFactory 必需的 DataSource ,执行持久化必需的 Session 及持久层访问必需的事务控制等,这些原本必须通过代码控制的逻辑,都将由Spring 接管ataSource, SessionFactory, TransactionManager等,都将作为 Spring 容器中的 bean。将这些bean 放在配置文件中管理。  L2 ?! Y6 y! E5 W  e: k

    1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:
    % j7 r& f3 e7 k3 l

    + `4 z8 c) i/ {; j4 f2 G8 ^6 e

            class=“org.apache.commons.dbcp.BasicDataSource”>
    4 w& ?3 {$ |6 n9 s6 O1 K6 N  I

            
    7 w0 S( x; q+ A9 P8 R

                oracle.jdbc.driver.OracleDriver& M" ^* i# [8 r( G/ Y

            3 O+ K6 l4 m# b( A) R) H0 M

            
    6 j$ r6 H4 U- |) r; H& R

                jdbcracle:thinlocalhost:1521rcl
    8 N1 y! l8 j& q( V) n9 ~0 k

            
    1 @4 \( M# y( o6 g

            
    $ ]9 b$ T( h# a/ ~! X

                javakc2( q+ m# a& Z& r5 i% K$ M" U) W! {

            
    2 `* C, R4 t, g% g, q

            % H+ J! N+ j* z. \5 V+ o; u

                javakc2' h4 J7 I3 J+ [" ]# Z

            # e/ Q5 [6 E- O: |. `4 _

        % I+ K7 y. R( K- a3 p6 r& w8 k5 A


    7 k7 u* X2 L' `# i; C9 Q: z% X

       

            class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>4 b/ C0 Z1 }% _! k# [

            + f! R- w1 t0 I1 X  X% x4 v

            0 `, _* a, O5 V; W4 d6 _

                0 Q0 [$ |1 y$ ~+ N# s9 W. V

                    com/javakc/spring/h3/UserModel.hbm.xml- Z" \5 M5 }& Q* J1 y3 B

                ( C  e9 r9 E) u6 z' q  R& s% t% N: N

            
    + j$ p+ ]8 O) K' |2 r8 T

              M3 }) I3 W# \8 w! n& y2 u+ E

                
    2 U1 g. d6 z' ?

                    hibernate.dialect=org.hibernate.dialect.OracleDialect
    ; T" {" z" l- V3 ], q

                + p, e9 j' t+ _  U2 c

            
    1 _) J1 E4 H+ r9 h

       
    ' e8 q! ]- [$ O5 ]2 Y- c7 Z/ Y0 N4 L

        & m7 X4 m" h3 B- `

            1 n& @3 K6 l2 R8 f

       
    , \) g. R/ ~) q# q

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

       

            class=“org.springframework.jndi.JndiObjectFactoryBean”>% l' k% b( D6 o; B. ^. P* v6 ^0 g

            
      |8 N# N2 V- v6 X/ u9 x

                java:comp/env/jdbc/myds! c$ ~1 _! c5 Q0 ^: y9 O4 U

            % h0 p1 e4 D9 {& o

       

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

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

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

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

        # a& S( f+ ]6 i  W( U

            
    + {, \7 k- ?$ N6 z5 L6 T5 c

       
    7 o- L+ [9 \4 H

      u: O1 v! b0 g- ]- _$ i

        ; U5 t8 ]8 e$ b

            ! }# }, t; p4 u& s9 K8 h9 S

                
    & ^0 j# y6 G& S& x

            
    ( H- j5 g  d/ u7 A& M

        * r5 g3 \2 ]4 ?. K* h: H8 o, A& m

    : s& n' S9 n% P' [0 o1 L

        ( K3 n' ^. v& z6 i% T5 I: c

            
    % n+ J/ w  Z7 G7 N( k8 \' w7 V

            
    9 k1 v. n3 w9 p6 l$ X

        ) D6 ~' V0 r" s8 ~6 N

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


    . w- |/ o0 j1 d; M/ |  o
    Spring2.0之前事务的写法" Z6 O2 Q& I6 M. W- I

    5 M( h1 t- r% y6 z# H5 c9 d) W% |: q. c
            class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”
    + w& P+ }  I8 z& W) s: L
    4 d# i) H# j$ v1 q! h& g7 k0 e3 `
            abstract=”true”>
    & h9 A% R3 Y! e8 }2 F) _+ ^8 t( n
    9 G1 ]& d9 w9 n' B0 M, Z

    5 k! h8 Z5 Z/ n4 D
    % |- Q+ a5 D* T5 w6 I9 U/ _4 d+ w- A" q, t
                    PROPAGATION_REQUIRED,readOnly- J* s  s7 ~* p  x6 B( r& i
    3 Q% [0 c. y4 n8 j  n4 a. ^
                    PROPAGATION_REQUIRED
    $ e, A1 u5 q- {" C
    + O0 f0 O& c1 z. B/ F

    2 w: W/ t; P" g. k; g
    , i* y- m; s0 k3 q$ {8 t7 v& a+ o, O3 i
    9 y9 z. X. ~: w7 |" M* P

    7 a7 D2 {; o: W* w
    • 谈谈Spring对事务的支持) d3 |- ?* ]' \5 |% D& u2 Q

      ! ~. n+ H$ d0 x

    # A; N+ w1 g; _4 E
    1、声明式事务管理:

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

    2.做法:

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

    2.2

    2.3 注入数据源

    1 [" ~0 A6 \9 V% H- e7 u$ T

    / \7 p1 d6 s! n& j
    1 X5 f. [0 {; E( Z5 t" k3 N( V  I' V! r
    ) |" |, v3 {5 _

    7 L1 j. f8 B5 H( W) Z6 o( D& O

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


    2 v. Z, g# e: [6 E" H. v/ h! c- W
    4 ?3 M. e4 s; i
    ) p) ?1 h7 K, Y. \3 I) g

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

    % b; H9 |7 l$ d
    ( h2 m6 V6 O1 P
    ' C. X5 z( A7 e* t
    3 H: I4 L6 B% V5 E. O& |- R( G& F1 H/ R

    % Y6 n6 ]- P0 E

    2.6 定义切入点


    8 q; T4 Z( ]- e0 M3 ?0 ^+ G$ |' f6 T0 T( l4 q! ]5 k& j% B
    3 _4 U' c! k* L  R4 @
    2 k1 p/ B, c1 t9 q, T! ]

    9 W# R3 I$ k/ ]6 y3 F' u6 C4 P

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

    1.注解@Transcational

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

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

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

    ' E, C) K" _; i. Q/ d$ A
    : Q  Z* ?" p/ V; t$ {  N. m

    如何在Spring中使用Hibernate的事务:' p3 a8 z) w: _


    ! ]9 J/ g9 V, N# m( [( r# O- G  w( q

    1 V! A+ ~7 J0 z" h8 }, M


    - t# X" i1 W8 |1 ]- ]( a

    如何在Spring中使用JTA的事务:/ q( d$ h' m# y" M  u" B' y

    ' Z$ l& h+ t2 g2 {" X
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    17#
    发表于 2014-12-03 12:48:32 |只看该作者
    事务
    / U3 S& c! a9 q3 UACID3 C5 I% q; U! ~9 X
    (1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失败
    5 ~* J/ e. L% @
    3 T/ N6 W- k5 f+ O. r6 u  y(2)一致性 :操作的前后满足同样的规则,保持平衡。
    $ v3 e2 k; g# K- @- a; E; f
    3 \0 U1 a& L) E( m7 B) C8 Q(3)隔离性 :在事务运行的过程中。事务内的数据对外的可见性和可操作性(必需由数据库的支持)
    7 K$ N! d- P% n2 L" Y! G+ X# u, Y9 r6 x, j2 I- I) L- s2 u
    (4)稳定性 :保证数据在事务的操作的过程中不会遭到破坏,而且是永久性存储的
    6 h  |( a4 r* ?6 G- S  f5 B6 m  L! x

    2 T, Y* L! J3 V- l4 A4 [
    3 s' \( L( U& f1 Y9 Q5 H事务模型1 U4 i, ~  }9 i2 Q8 u1 X
    (1)经典事务模型又叫平面事务模型(JDBC) 事务不允许嵌套0 F% \# o4 c2 X* G
    + k, d4 V* y6 h0 h" ]
    (2)嵌套事务模型' x7 G# t3 A: n5 |9 [) n' s
    - B: V* O1 z) H+ ]
    6 n- v1 j, D1 P
    , j; ]3 N: B5 h; M
    事务的两种方式
    ) s7 Y, V7 k- h$ f- B3 s: ~(1)声明式
    . @  R2 k: |" C% C1 d3 S! q% O! V+ [+ W, h0 o' W/ e
    在配置文件中设置以下6项9 P: c) A# L3 B
    9 b4 v! S/ i  V: J3 h" F$ L$ {
    (1).required
    + s4 H, J# J% X9 a/ m, A5 t4 r' e
    2 L2 Q/ X: C: v- H如果客户端没有事务 在bean中新起一个事务' m$ ?4 K1 q% X& D

    9 w9 o/ C% V4 P- O" ^# [. E4 d如果客户端有事务bean 中就加进去# }2 ^" Q% }4 E$ p4 x+ V
    5 N3 Z' g: g2 {* V$ p8 v9 F  k8 \/ ?/ Y
    (2)、 requiresNew5 D9 S7 ]  \  X% p' W
    % G  p$ s2 E6 ~# L) h
    不管客户端有没有事务服务器段都新起一个事务3 I! Q' t& ?/ x7 ]
    0 k3 {* i5 b+ c, T
    如果客户端有事务就将事务挂起- C/ \( M4 P( p6 I
    8 y3 R( J: G- k5 Q
    (3)、supports/ E8 E3 h3 O5 i5 ?: E+ M0 J6 L
    ( `% H/ P1 D4 Z5 B% O8 O& Y# A5 H
    如果客户端没有事务服务端也没有事务# v5 V$ q7 \3 e! R% K1 r

    : ^% t0 r5 G1 @如果客户端有事务服务端就加一个事务3 |/ U* b2 @. @+ |% `
    ' k- k8 g( d& \% Y9 A
    (4)、mandatcry$ I* c$ U. e4 q

    , n  g3 D, P& e4 f2 y7 C. U- T2 A9 e如果客户端没有事务服务端就会报错, ~4 A7 J$ k) e! @1 l5 }9 l5 _! B

    2 a( K* Y7 A, m. c; F  Q如果客户端有事务服务端就加事务3 E- g/ r7 D: q5 Q4 \! d
    % s  r. }  v- K1 q% J! z$ Z4 |
    (5)、notSupported! D/ j# v& p# F  i( ?& w. T; d, k6 d
    0 c7 P! ?- U# j8 L
    不管客户端有没有事务服务端都没有事务
    $ y% s  ~) f/ I5 c; {8 W. }; h& D2 @. N$ Y
    如果客户端有事务服务端就挂起: |. k1 q& C7 o; t

      l+ E( u( w' Z2 @(6)、never
    3 E8 @  W* R7 u3 Q- j8 R( N
    ' V+ h% Q4 k! C$ T. R! Y/ ?4 A不管客户端有没有事务服务端都没有事务. R! s, e) W: h6 T7 ?% E7 X
    ' G2 V( P$ m9 k
    如果客户端有事务就报错+ a! I/ v6 {* `9 m" g
      w. J) k# M2 l
    (2)编程式事务& L6 u3 _: P, k' F( ^3 M

    : b; Q* C3 u* F" d; ?5 A) cJavax.transaction.UserTranscation4 z; M. F/ `1 S! Y3 z
    / W1 R  {2 @6 a$ v% g- R- ?
    JTA 事务可以精确到事务的开始和结束
    . p+ I1 Y2 W  b, X' q+ V! D! j8 m1 I$ M$ A
    9 y! F2 A, ]" \6 K; ]4 B% Z5 v
    ; U& s5 x% T: Y" k( \
    事务的隔离性
    7 G* z. d' V' zRead-uncommited* Q0 }1 t$ P9 r2 {3 M0 R
    6 X7 ~* Q& c2 F& a) r% R* ?
    读取未提交的数据(基本上没有锁)脏读,存在不当读取的问题。
    " [: _) M& f2 Q& ]
    9 t* r# q& I5 l, _Read-commited, u0 J& n5 s. ^/ L: i& D1 t# t
    2 \. X: b/ @- }& Y- s0 G( Q
    读取已提交的数据(行级锁)
    " t( G& j$ e3 M( Q2 Y5 f  U$ X; C% e# l' n8 j3 W
    无法读取已经写入,但没有被提交的数据。
    8 K& S6 ^9 w, o6 S! y: S: o- }, c
    Repeatable_read
    4 V8 Z4 Z! T! w6 s4 y- r% ~' f- L* e# p  @. d
    读取的数据不允许修改或删除" I! \4 h/ n1 R- K) F& n

    3 N5 k3 q  e! _$ a不可重复读(行级锁+不允许修改/删除)" Z8 P5 u0 q, w5 \
    / n" c. O- l* X' W9 s' Y
    Serializable8 v' {  t1 U& N0 z9 N. z

    0 v$ G2 a! T# ~6 n6 f3 x幻影读(表级锁)
    ) Y7 @( j" M7 M0 R# n4 ?" |% k
    8 `* T' {" P' u& c) C8 x0 M2 g
    " ^# j9 }! v! m& h3 l( H& Y0 t
    0 q- x' r! M3 B. {5 ystruts" S8 Z1 F2 P4 C' w+ X  @
    开发流程! I; Y# q  Y" i$ `8 @' I8 \& x

    0 K5 A# B' }- ?' ]( t/ F2 L: {8 J1、创建表单
    ! C4 s. I+ @6 Q9 D  y% t9 N- s6 P: ^3 ]2 i# U  ?
    2、从表单中获得输入
    ( F2 b% G" I4 B$ W1 A7 K! p* J6 ], _8 }& J% {, L2 M/ K& A
    3、处理输入(业务逻辑): l$ `) m. j) ]* J8 m( O  z2 u3 ~

    ( I7 ~' |  S% K4、根据动态输入改变输入流
    " A& {  c/ W: _0 m, ^3 Z0 c' C
    . Q( q4 |5 @( r/ C4 @要完成上述四步,我们需要创建/ M  K6 p% U8 I- N& W* S

    % [+ [3 P* L, ?% b- z" N* G1、一个ActionForm. i+ u3 e+ R; h7 J- H% f

    6 M2 \+ C; w" i2 s( p- t2、一个action
    ; x) X  @0 R% L. K. I, K! b$ ^9 y$ I1 ]9 g' e& d3 x
    3、一个配置文件struts-config.xml
    ) `" B; X; g) q0 I4 l1 c: s! Z. ~
    ' {; q0 Y' C; N0 t0 [0 O5 U4、创建页面
    % r" V9 W& J8 C5 J0 O4 f
    # H6 A4 {' K- o4 }: o" ~& z创建ActionForm
    4 V2 i5 Q; W/ m1 i" n
    . @  k$ \& z& }# c2 B+ p, [1、写一个类继承ActionForm+ _5 Z: L# f* v$ Z1 s$ g+ \

    / z, y: B/ G2 l9 t8 B2 x2、私有的属性
    ! e9 q7 Q/ K# i5 U  \/ Z% s
      t' b; X* v. D. |7 f& _+ n3、相应的get、set方法
    6 |9 A- u1 G5 z% K: J( p4 Z# ?8 H
    0 `2 ~. ?. m* ~* C4、重写tostring、equals、hashcode三个方法4 P9 [. [4 V2 T1 }
    ; r" r5 t1 p- w+ V, o1 y
    创建action
    * f2 f, Q) _3 e5 [' G5 J" \
    6 N3 `3 k- s0 r+ m1、写一个类继承Action! L% `* R  w8 O; `; {

    ' d; x- w* M, ~& ]: d2、实现一个公有的方法(回调方法)
    ; B) [7 s" _! e6 @, r# K) n# q+ \. s# F( `$ l# {' Z
    public ActionForward execute(ActionMapping mapping,4 t4 F% }3 o6 n' ]

    " k7 h7 d$ @% R; C  `$ IActionForm form,
    % j6 L9 q) E6 H4 \0 K; B4 e. H" g- H& w. D/ P" y
    HttpServletRequest request,4 N$ }' q5 x, P) ?. V
    * A+ L/ N- V4 }5 t4 L1 Z" \
    HttpServletResponse response)$ k  _* f9 p$ r6 ^( L) Q% v+ v

    7 @3 k! J6 l8 X0 H: X8 S( n6 S6 C, ~{
    1 W2 M5 {, @4 t- Q3 @; a* w! J/ |7 @7 ^( L
    //1.收集参数
    1 L/ b2 q$ Y) ?7 b: E$ z* @* f5 K* \. _% x# S1 ~2 B
    MyActionForm myForm = (MyActionForm)form;
    ) u/ y1 d" A$ W2 N& U: X3 T
    & T/ J" M/ @  o# M4 K0 F//2.组织参数* X: K6 }7 H$ n* B

    * ^' Y7 _+ L) \8 P. W 8 k5 t& P7 S8 `% p5 Q* s" ^! t

    . G, P# B1 p+ V5 E//3.调用逻辑层' `6 ^7 K% i) t# y$ r

    1 {# ~# j1 u8 }( y4 t* xboolean flag = true;
    * u3 l. }3 T7 P/ F2 ]1 q: B4 Z% v# x8 h9 v( M+ ?6 @% ?$ u
    //4.根据返回值来跳转到相应的页面
    $ T" N8 o% ]; P- [8 j, o3 z' m9 s! D: y; g1 C
    ActionForward af = new ActionForward();* f& X6 ]2 k5 r9 R* V" y0 o" s0 C

    1 V: K- k: ^& k, s  U, x: d9 Qif(flag){
    8 @. G/ }8 U! u- _, J4 d
    0 b& x8 S- o$ Paf = mapping.findForward(“1″);1 u% E  \! r' e

    / P. t* A3 P, B% R% m}else{6 [2 L- N' N8 t1 o+ s& b

    6 p3 L3 N' P8 F9 r; ?/ Waf = mapping.findForward(“2″);
    ! E; y( L6 Y4 [
    ; z. f* ]9 a8 n5 ~, ?# c) j}/ B  A- B0 n7 j7 k

    8 p7 s5 |5 q& D1 q2 M. @* B7 {return af;. T! X3 e  Y2 g
    & W' h; x+ @- N' e8 ~
    }# K4 F* p$ e7 H+ j! g
    . R& o0 d: w. [6 r
    配置struts-config.xml文件
    ! d2 W1 T$ M# A! M' Q3 Z0 I8 D/ h( j
    1.<form-beans>
      i- b. ^- z$ \( h1 Z3 ^$ w
    % V6 F; @2 W4 U8 |+ f2 a7 Z$ L<form-bean name=”myActionForm” type=”全路径.MyActionForm”/>5 f% |. r# ^5 x/ }! X: t$ G
    * A& {3 ~; d6 z. k; A1 _( d
    <form-bean />
    . E6 d, \5 R/ p7 _
    , `! z! q! X3 m2 k7 n</form-beans>) b6 r& p1 Z, ^3 ^* `$ K7 w

    0 J% B, P6 v" v0 w3 M" |. M2.<action-mappings>, Y% L8 @5 j8 o' n4 y) }

    - N1 s# F- c$ d" w8 u- `* P<action path=”/sll”$ Z1 k" K& m0 k% Y3 ]4 G& Y# q

    1 Q/ v+ I! D! |0 U( f% Z8 T$ L; Uname=”myActionForm”
    ! W# i3 [& M; {9 R: m5 d4 V. N' C1 G) R# v2 K! E
    type=”全路径.MyAction”3 H: c5 _: K" J. ?1 ?& [9 H) m
    ! v( e; W7 R/ }; @
    scope=”session”8 \" z+ E$ k9 t! ^: W
    9 p( N2 Q8 Y' s5 [( ]
    input=”错误返回的页面”>7 ]8 n0 J6 O1 L$ g1 Y
    5 q* _8 a5 ~) t* L
    <forward name=”1″ path=”/1.jsp”>: A0 F, Q3 k9 T

    4 G0 n& C% ]  R/ B8 B<forward name=”2″ path=”/2.jsp”>5 T' |+ M( O8 v3 h  K

    ) J- P# ]( |' ~' l% ^+ S4 u# D</action>. I) ?" G- c0 p- @
    . U6 b; q: P; i) t+ X8 k
    </action-mappings>
    ; g& K& N7 f3 M0 M' J. s& V. w$ Y0 B1 L2 H' y; b! o
    步骤:, L" D4 H( u" |1 h
    / ]; |$ m" I8 c% N  r* L$ K7 I# m- M* K
    1.创建一个空的web应用
    & a9 X* \, k- u+ i4 e; {- Z
    . e9 H- Q6 r' u2 p2 g! B  Z2.将struts的包放到lib文件夹下
    9 S9 K. q  C) V  t' h4 i
    ' L  Y8 R# v5 H+ I! u3.将.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目录下) z  q" f- H; \, `; u
    . o7 }" o# H4 G( }
    4.配置struts-config.xml文件和web.xml文件( Y  C1 J% J5 t2 k$ ~
    4 x5 G" A8 C: K6 Q
    5.在页面引入tag文件uri
    / z+ |' {- t7 f% I
    - y0 {! p, L) X4 X  S; FSTRUTS运行机制
    & a, x  x" Z: _# `6 }7 a- M% E1 K# G+ D
    1、界面点击产生请求
    : f! r/ N! v+ ?2 u. }
    + U5 h% A) A/ p7 v, ?  ?2、容器接到请求
    / n( S5 _: ?; L3 g4 `$ ^& {" Q, w! i. i7 j$ m- ~  [4 \% [6 [5 \0 V
    3、匹配web.xml文件中的*.do来调用ActionServlet
      B, b5 {6 v- {* @4 o" J0 M( B$ d" \( N" V; Z2 M1 L9 [
    4、ActionServlet的处理
    5 k1 X- A+ B  o+ \; {
    , f! Q8 R7 ]5 _1 Q% g; [4.1 读struts-congfig.xml文件形成ActionMapping/ m% U5 w' c, {' j( @8 E7 J0 H

    ( |% }! G; ?9 Z4 @+ ^& O4.2 通过path 来匹配Action类,通过Action的name属性来匹配ActionForm类
    0 T; Y' Z* ~* y6 ^5 [5 x4 a. C  h0 E% g! ]6 w" x$ }1 Z
    4.3 通过反射机制来给Form添数据
    ; X; M  v. |7 y: Z3 t" |2 e
    5 ~1 x: _% D& Q5 n4.4 由ActionServlet转调Action的execute方法
    5 @4 Z, N6 x, I' {" Q% |% T# R  m( O3 I2 ?) c% @3 Y. T
    4.5 得到execute方法的返回值,跳转页面
    & x1 C, g# j* i8 ^$ U( c2 l
    ! a  I0 K$ r1 q: L/ U$ D& y/ K4.5.1 RequestDispatcher- C/ Q) L+ L1 K8 v# D

    2 [( m5 b0 z+ X( u& O4.5.2 response.sendRedirect(“list.jsp”);
      d* d! J' d2 V2 a" M( y2 K; @- Q) T- D( e

    ; t! l; _7 C- C+ M" e1 V. p5 p2 S8 o5 {4 ]
    进入execute方法4 s$ R. s' [" o% q

    / l6 Q; J& o: C0 m1 收集参数* p/ _) S& u# R

    - D$ s9 y- p0 j4 X( H" L( _! Q2 组织参数
    , T3 i# X/ ]$ m. H$ Q1 L: _1 j. }8 ~2 }1 o
    3 调用,逻辑层3 ]4 @* O% Z, s) Q7 h* l+ y

      u% K4 ^! B: B) U  |3 D0 y4 返回值2 e2 {8 {9 I+ H" d
    7 X  J3 }6 F. j$ X
    4.1 选择下一个页面 (ActionForward)
    ( i5 T( G3 u! q2 I# w6 x6 {. L- O" r& U. B& m0 E  q; g( s
    4.2 把值传给下一个页面
    7 N+ b& t+ p5 L' U7 s3 D3 ~  U+ h" a% O$ R3 g# v+ i
    6 [, e+ \) I" M1 B! c7 Q
    $ m" G8 J' h$ o: I
    比较struts和struts2的不同9 H) N5 F; n" j% E
    7 d' \) M5 Q& m' M
    Struts/ t% t* p" q; h3 Q, t
    * M8 d. H* i# Z4 X% W
    Struts24 n2 N, [! i+ L7 M5 n5 C

    . _( ^2 Q6 K8 a, s) [- U6 C! Y' W组成        五个部分:ActionServlet,ActionMapping,AtcionForward,ActionForm,Action        十个部分:AcionContext,FilterDispatcher,ActionMapper,ActionProxy,Configuration Manager,Action Invocation,Interceptot,Action,Result,Taglib8 a  b9 v! A( @9 a: |  I
    url        .do        .action+ X. _' d% d7 c5 Y8 P* T8 A
    分发控制        AtcionServlet        FilterDispatcher; e/ t) Q( a4 O9 r4 w. O
    收集参数        利用JavaBean技术,将数据封装到ActionForm的子类中;
    3 g8 H! v! e4 l8 L& x5 s一个Action对应一个ActionForm的子类' @% b7 A* S* d
    ; @. P; b8 c7 w( V6 t: I
    使用拦截器将数据封装到值栈中。- B5 X9 b% a' G" T0 V3 e* s6 \
    使用域模型,一个Action对应多个值栈中的Model7 Z8 F* U+ N4 R  }

    ; V( B3 _4 s0 s% B读取配置文件        ActionMapping        Configuration Manager& I$ F8 q; Z" j! m8 r
    拦截器        无拦截器        执行Action前后有拦截器& ^* J8 a4 }2 D$ R! G- A
    返回页面        将字符串封装到AtcionForward,进行跳转页面        Action中直接返回字符串,通过Result跳转页面4 C4 {; p; u& Z/ J" C
    页面跳转方式        两种:dispatch,redirect        三种:dispatch,redirect,chain
    - w! {% x* \; Z# w, M  J$ c: S值栈        无值栈,Action通过在request范围内设置属性,向jsp页面传递数据        有值栈,Action和jsp页面通过值栈传递数据,jsp页面通过OGNL取得值栈中的数据; k# v& w1 p! Z9 U* ]; o. O
    配置文件        struts-config.xml        struts.xml% a& G% k/ C" ]0 d0 f$ q+ h
    中文问题        不能解决(需要使用filter)        可以解决中文问题:7 Q. F& C8 T+ d! X- ^3 ^* j4 t8 v
    1、在jsp页面添加Meta;6 a( |" h( e) H) Y$ J1 i
    + G: B7 O( V( |% U0 D
    2、修改struts.properties中的设置。
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    18#
    发表于 2014-12-03 12:49:03 |只看该作者
    其他开发工具和技术. K3 j* x/ R2 R( u
    Ant" N) l5 M- P0 L! U, n& ?5 n% V% i
    Ant是基于java的批处理工具
    & n: E7 F% r3 \/ V$ C9 g) t1 w& B3 L. v
    一、配置ant的运行环境
    ' ^1 X: a  E3 J' p0 I' I) n# [  d0 [" }# j' @
    1.将ant的bin目录添加到path中
    / w+ [9 r' ^2 }/ Y" V; Z7 f% ~- `- {- K+ P3 d7 `% r' P
    2.配置JAVA_HOME
    2 c8 [$ B0 I$ F0 k9 O! \4 G7 ^# H
    + H) H# l; C. E" `- V" F% K3.配置ANT_HOME
    7 M( M# @% O; I! V' T9 k0 G' d' s
    二、配制build.xml文件,该文件放在应用程序的根目录下
    5 C3 p+ F* {5 c# Z
    ( q( F. h# a5 F4 q7 B0 x" o8 B编译java文件8 K' o) F/ I9 U. G6 ~+ Z

    / W; h3 i& J9 D执行java文件
    ' l, V, M) N( b) d3 {( g# s2 }3 A6 N- E- L7 ~
    copy6 `- R, t1 H  i8 i  `% T
    % W' y  e$ `5 @+ {) p, F/ B/ C
    删除
    ; A1 ]# a( b% a8 U% r
    6 e2 }! a; |- Y3 r打jar包
    5 j* u& `1 j3 F: Q. [0 c
    ' v8 b/ x2 Y3 T根据注解生成配置文件; r2 K0 {9 [; A# j

    . R7 I/ @* Y- z2 T* @Xdoclet3 J3 E1 e  |9 B6 I
    通过注释生成一系列文件的工具(txt、xml、java、html等)
    6 c- H, y! A- C$ I5 W1 N& h4 C4 N7 {: N/ `# m% A- D7 Y9 X9 N
    xdoclet本质是摸板技术+字符串的替换+ \$ L) b2 z$ ~$ u1 z. A& h
    ; h0 A% f7 r( U: J0 A8 ^
    1.在java文件中写符合要求的注释(将hbm.xml文件的内容搬到java文件中去写): M6 j8 H( n6 I; }
    * O2 b  x" D2 J5 S4 j
    1.1 在类的上面 写与表的对应
    % H7 K' Z: W5 T: N9 J! L
    ' V0 b, E. Z& ?/ x7 O1.2 将每一个属性的注释都写到get方法的上面
    7 X$ p' S, m. G7 t9 A  l$ c/ [  ^7 t9 r0 E$ D) {
    2.在ant中引入相应的task来驱动xdoclet
    ' `- \- H# e% b+ S7 `6 L
    % E9 K4 u. F9 H. O4 n: Q
    # p  a; v4 [. Y: l# y: u. [  }  ]3 M7 Q: d
    log4j日志管理# _5 x* j( ~4 H! l6 i' z
    1、是什么?+ e+ G, S9 D. m. U* w  k3 k1 j

    ) [6 y9 y1 I1 K6 O. g0 a在开发期间用来测试、对整个日志信息进行管理的工具: k4 R$ c2 j: W
    ( u( f$ \6 l% ^
    2、功能6 S4 p$ }, t5 O3 T. J$ Z! @
    + W. O7 Y* s2 t( m5 {: t6 K, J
    1.控制输出的目的地$ k! `* ]( d$ H& \$ o
    3 h0 a' T) X9 k0 o8 {% |# r
    2. 控制输出的格式
    ; M! {2 a; R# Q6 d$ a( V
    ' ~. s+ f) y& {' P3 r  l/ ~$ M3. 控制输出的级别- I+ z' G" [0 k# k% L% S

    " W8 y2 ~2 O* [7 [- C6 f3、日志的级别. B7 a+ k) z) _# t1 }5 u

    % [' u% a2 z* e3 {6 q1. debug 调试: b" ~1 Y& B3 Q& w. J1 N$ u& n( E
    # M0 s* b% r0 X7 a
    2. info 给用户的提示信息
    2 ^0 A' c; q1 u) Y2 Q0 |+ D: |3 l" u
    3. warn 给用户的警告信息# }/ N3 a! O: a  M1 Z5 z8 Y; [
    + \  y; C" z* e0 A
    4.error 给程序员用来调试' ]& a# q$ `! E7 [, a
      J1 `6 U, ^+ G3 }% V6 _
    Debug—-〉info—-〉warn——–〉error! _- }7 u- M% r2 G" x& l6 {, Q8 G

    * K1 w! G; W7 x, `* t4、配置2 q% J% W6 q2 }$ z% P: }+ q

    7 _5 C6 z! t6 K( b' e7 z* a8 B1.配置级别1 P' f) u3 c5 G# R

    $ h9 I( a$ y! A0 d- [7 ^$ D2.输入源 (控制台和文件)- o+ l; ~: F3 ?. m
      y5 @$ ~  k" }5 ]# n
    3.可以进行分包控制& @8 E8 W! D7 v8 Y
      e1 X- {3 W# E0 p- N. u3 Z! L
    Log4f.logger.包结构 = 级别
    + N2 \6 a5 w' L- f% F( y+ ?
    ) V5 T: o3 m+ C( ?$ I0 i- ^5、使用
    $ w6 v! {! S2 j$ }) }  A3 v# ^  ?
    ' i7 m6 N% c7 d! T% \- }3 b7 vLogger log=Logger.getLogger(Test.class);
    0 F1 Y: n- D9 A, k8 L9 U2 l
    ; B8 X) z# ^0 y4 w) w% }    public6 p# R1 l7 s6 N! G. ~& ~
    void t3(){
    1 ~1 G( i& \# z4 M3 O* E
    ! [: V. a5 z. [6 e+ t5 s. A        log.debug(“this is debug”);5 _  t; t; T& z

      M* h3 J( H- c5 o2 B        log.info(“this is info”);
    + T( v' t/ n! f
    ( N4 X$ m4 d5 ~( g- l9 n  b        log.warn(“this is warn “);
    + r9 x7 u5 N7 y1 i
    2 x# b# d1 ^8 x) n) Y        log.error(“this is error”);0 P! A) i* u' ^) L& z+ }/ ^

    & Y: C2 v2 I( H" h    }# {+ ~; T) C8 K! T+ r+ c  W3 I
    7 `" @9 Q) _# v$ y
    Junit! Q& {4 N% n+ W" P6 Q- n1 p$ a. q
    1.是什么?9 @( o' g* Q1 F
    , z3 t5 N! j2 ^4 C
    单元测试的框架5 D& }) z" m0 Q& S
    1 U7 {* p4 M; g) n& j2 ~9 \: ^- P) Z
    2.怎么做?7 o1 K9 z6 c3 r

    * e6 |$ O" U2 [: Q& |, M+ w1 G写一个类继承TestCase
    ' ^: J) E& N# N9 E' r5 S! E$ C0 ~2 L+ D
    测试的方法一般都以test开头并且没有参数
    ; P( I$ e- g  u1 |' k0 t  ^* D2 {
    在测试方法前执行的方法public void setUp( )
    8 p7 i: j! S& B# V6 ]3 }# A* S9 w: n
    2 G. e" r6 B1 ^% U5 d9 i( m在测试方法后执行的方法public void tearDown( )7 |9 {3 L$ ?6 s4 B% B' p: e4 E, D
    3 w. y  U! n+ y6 x
    error和故障的区别
    / `3 I0 p7 H1 d8 K9 }$ {0 W! L, f/ h5 u3 ^9 x
    error :代码有问题# k: b" s6 V# V0 L- l# r
    # ^, m3 m4 u2 H7 `
    故障 :逻辑有问题与祈望的值不相符合
    5 Q" Q, c& T! n* S8 Q7 i2 S9 W2 q9 {( U$ m) d1 Y
    生命周期
    4 {6 o. R& d; k
    # [0 b$ z% t# w" V+ |1 V0 ], ~测试—〉SetUp()—〉testXX()—〉tearDown()—〉结束;6 Y% m* {, ^  K  {  n

    0 V4 m8 t" W. E- F$ aTestCase套件0 W% T# `( E  \8 }* Q
    ( _+ P" q  y( s, S0 l1 `2 C
    public class MyTest{
    + M% T* l) r- a. O* m# n3 _+ Z  p$ H( e( U
            Public static Test suite(){2 B: S! r/ Z0 p$ [
      L: J- M, Y. ?) }# {5 s6 T
    TestSuite suite = new TestSuite();
    ) m/ [9 K  O( Q  q2 f  w( T$ g+ x7 c1 j: s7 w9 r
    suite.addTestCase(Test1.class);- m8 v0 W) h9 w$ {! E, M& Y6 T( R
    ! n$ F* H( d% m+ Y( a/ M
    suite.addTestCase(Test2.class);1 U* C" ^/ w( s! W3 |) N( M+ a
    * h. W7 [/ n, S/ f# Y$ X1 I
    }+ q  ?4 G# x" q

    ' t7 x# G1 U3 {4 F& F}
    + U0 W# }& r; _, y9 X
    - \& I& v* D1 o$ s- A" o$ V ( S5 k: r5 }* L4 v

    0 r6 O& J: ]& j6 b# N1 AAjax" F2 K" l4 E; B: L% w' L
    是什么?$ z( A& `* N: T" p9 B9 s
    AJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。是一种创建交互式网页应用的网页开发技术。
    5 u0 z3 Q) M5 M0 Y: R# q# O' a( t8 m! z  k; Y5 }
    无刷新页面。& a5 ?8 |# J( m5 D/ g! K

    9 S) q) ]! E+ ^; L6 b; y有什么?
    & o/ r3 R* g7 J5 O, oAJAX是多种技术的综合,包括JavaScript、XHTML和CSS、DOM、XML 和 XSLT、XMLHttpRequest。# Y  @+ V* v/ C+ M/ h

    ) _0 {% Z  B1 ]* T8 Z能干什么?# O$ g# L1 T+ k' r. A
    使用XHTML+CSS标准化呈现;8 W& d( F, R7 T! R3 a
    使用DOM进行动态显示及交互;
      ^' Q9 v$ v3 f. I+ m使用 XML 和 XSLT 进行数据交换及相关操作;
    . W: |3 V9 x, V8 c5 X使用 XMLHttpRequest 进行异步数据查询、检索;
    5 C% w2 a: |# m使用JavaScript绑定和处理有所得数据;& n1 y  X% ~. x
    " Y; B, A% h2 R1 R2 Q' R- |% L5 F
    传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。9 ?" f" c5 m  h: Q2 E, I) J

    ( m* ?& C% H8 P& @' l$ p. G- W- B与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。
    , i1 R0 a2 C0 a- I7 ~5 S' b) F( V* n% r: q& \" _. ~
    使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。. b- w3 h* C* r5 S

    # l' g, B4 i  n! R对应用Ajax最主要的批评就是:
    6 x0 P( Q$ Q8 x1 v9 @* n+ _1 它破坏了浏览器后退按钮的正常行为,就是用户点击后退按钮后不能看到之前的数据;' a6 `9 N9 @% ~- k& {1 _
    2 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;$ V4 I6 S8 B- _4 }8 v4 m5 E
    3 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;( `$ P$ R* M( J
    4 Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;: g- m: \$ m; t2 d  B- l1 E
    0 O8 i" \( u/ M4 O( L& D
    怎么做?# d6 a" y  j$ n( [0 ]8 n* j6 n) E0 e
    <script language=”javascript”>
    . T3 q! b; p, g% f3 `# Y- E; {
      E% z& _- \$ L9 c: z& evar req;
    # ]; d  e' D. S7 `  m& r* _1 O+ l
    function add(){
    0 G$ F0 S- Z2 Y) m  S* @) C" @
    * _4 k( P/ i1 ?) w//1:创建用于传输的对象; x- M0 C3 w$ B2 ]' Y/ X
    2 H+ ^; a* }- g- M, v' A
    req=new ActiveXObject(“Microsoft.XMLHTTP”);8 `* R: I4 o# H* A

    ' }1 Z( u7 L* |4 k4 _. j# K// 声明返回后,处理数据的方法$ f+ z; n% u5 g! @) c$ H: p! b+ ]
    5 A' j* E( d' [2 [- l
    req.onreadystatechange=manage;
    2 q4 F% `( w7 V" V0 V6 M5 y
    , i( {! E' V, l( F1 i5 P//2:准备传输的内容- l$ R# S' A" ~( }' X9 n

    0 e; e) i3 d! C5 q/ \var str=”test1111″;
    " c1 X$ u; Q: J* j3 a; }4 U5 v; q! Z7 e( G8 K
    //3:发出请求
    8 a/ i  x" x) h, e; ]0 l. B# j3 R7 v" @
    req.open(“GET” ,”/others/ajax/test/t2.jsp?str=”+str);
    : y1 i: ?# p3 e3 H; v/ I+ i& p& J) F
    $ j" e5 y2 `, V5 W- |, X' }/ sreq.send(null);: ^* q+ N" k# k2 K5 n
    ' f7 u/ J5 v, T( l
    }& r- z' g, S% Q. X

    ( _/ s: `* B- T5 _, A9 @( D//4:接受返回并处理
    2 X( @" D$ q; ?, o! l3 O. z% f1 C
    function manage(){( C8 D, N; F5 }7 p' U3 a, _
    0 s3 `$ s2 P! E1 L6 P# C2 e
    if(req.readyState==4){
      T! Q( v$ w, _( W# S; `& X, D
    2 D( O% f) e2 p( g) G: g6 Y2 ualert(“r==”+req.responseText);6 X- i. S$ L" a  R" s4 G" q' A

    % J1 \' R- z- l/ l, t- g1 f: O}
    1 \$ T4 r  `- ]' F7 r6 ~# r& t" n7 @& Y; K: t$ w. T7 ^6 Y/ p
    }
    2 l/ A# ~$ H! V- F, B, M  ?. J: J
    4 z( h* d$ B# D# @</script>2 w6 F, \# Z& W& J
    7 P9 t2 Q2 k. L* t
    readyState的取值如下:& ?8 t" K6 n, _4 v& p/ {" w: d

    * @) _7 k" X* R( @! D# T  0 (未初始化)
    . x9 x. b7 ?, @$ x: d+ n
    / O3 k3 Z( R3 K3 T  1 (正在装载)
    % V; W9 z% y+ j2 A" l& k: P2 J' e" |$ l- q! D
      2 (装载完毕)( M5 s- }  b7 u

    4 S  J( z9 u, {9 f  3 (交互中). B* X: O" c/ }7 A
    # G4 e4 @$ X, K3 Z) O2 R  n/ N+ r
      4 (完成)- ~5 k& L- F- f$ R# D# Q
    ! A" u- e* N2 N$ o' Y5 H  }
    5 ~7 f( X% k  a' B4 i
      w- `7 |0 @! g( `
    原理+ v0 O7 O: y& z4 y% S; R
    Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,可以是xml格式,也可以是一个字符串,然后用javascript来操作DOM而更新页面。6 G& S& `+ G. D( N
    9 ~5 x& l4 ~* ~4 k7 M/ w) `( }
    Dwr' }4 f+ O/ v- }1 [3 J: I
    是什么?/ \) f; p5 c5 f3 |
    DWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的页面。它可以允许在页面中使用运行在WEB服务器上的JAVA函数,被调用的JAVA函数就像是在页面中JavaScript方法一样。
    / T: Z# M/ w% S' B9 w- g, Z0 T% F8 k+ M: L' ^/ B  b
    有什么?; P* V2 t6 G' T
    它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据;另外一方面提供了一个JavaScript库可以帮助web开发人员轻松地利用获取的数据来动态改变网页的内容。2 N$ T: b* \6 F; v/ Q! z

    9 _% d; {: U# e6 l3 G( B * D4 Z' S5 c2 t9 F1 t( e% J% l" H5 R

    6 i7 B' r" h  ~0 f能干什么?* H7 O+ g& n4 v4 P4 e% Q2 A- P
    动态地把java类生成为JavaScript,感觉调用就像发生在浏览器端,实际上代码调用发生在服务器端,Dwr负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制。
    * |2 ?& y: f/ d* w, f" C! O( `3 A
    ; A6 R) k# ]3 u. @& o
    8 b) G3 q- M7 ?1 A! M
    怎么做?
    + `( S* F' \7 A# G6 b" a7 d' R① 编写配置文件
    3 X* G, s6 {' e0 C/ @! m* D. Y  a( @
    web.xml
    : L  x* S8 X) @) ]8 d! H2 g3 a& z( w; R9 t: R
    <servlet>
    " l. g; T! @% B" h+ [: w6 V/ @
    9 _% n) f9 V# e- ~1 |<servlet-name>dwr-invoker</servlet-name>4 t  P. [% D" q6 k3 M; x
    ' L5 s4 _! r; n* A! H5 P
    <servlet-class>
    " [' X# C$ p  l/ h. W% _3 |5 n: W9 R  b: R1 `
    org.directwebremoting.servlet.DwrServlet! ^) }( E9 x/ U5 O( K" p- E

    ) W% _3 N* N4 E" b+ P2 u</servlet-class>
    : W9 b$ y  R1 b, I5 K5 T% d( R0 U2 A; E& d3 K/ g2 E' X
    <init-param>
    ! A7 W% q% U' N' b* e* D! ?. U
    5 ~0 H: p1 \% K, H<param-name>debug</param-name>
    4 k/ N  a5 E+ H) {% f: y$ z" z4 p* a# S2 e  }( Q: F
    <param-value>true</param-value>$ {- s' h% `" I$ v% }) l
    + k1 f. n% Z) a( N
    </init-param>
    1 V0 E% w8 }% I+ u/ S  P" u
    : a0 @" }( j/ a. V! R6 q7 b3 b</servlet>
    ) a, V. b" V/ k# ?4 }: _. r! k" n# ^1 [* F; y" N! C, I; Q
    <servlet-mapping>
    0 O5 o$ o9 N0 d( v4 N
    5 |$ G- l# {& T9 o<servlet-name>dwr-invoker</servlet-name>
    - d2 y: X- h2 r1 O& ]1 M, W+ t7 S3 P( x) ^$ S$ y$ Q
    <url-pattern>/dwr/*</url-pattern>" n7 ]$ W$ {% l0 f% d8 j

    2 {: b' M$ |/ Z0 A; k- N. X* L</servlet-mapping>
    ; W" ^! X# @8 }! d, ]- `
    9 f4 z' n. G- B; r. o6 ?dwr.xml4 L  |- G, r+ b" E

    7 @% q, o. Q. c+ H$ \  |<allow>
    1 a: B9 |/ y9 Y6 w, E! d* ]2 m  m0 |$ X9 K( M: Z$ ?# O" E2 z
    <create creator=”new” javascript=”kc2″>; N3 e" `2 j! g" U+ ~
    8 ?. ~5 ]1 e* F0 T& _
    <param name=”class” value=”dwr.Service” />$ M. P; o' q9 e3 S9 v$ z
    9 S4 g* J4 V" u# Q$ f) N! [
    </create>
    , Z9 A/ j' _2 ^& G2 Y" ]5 @" m" K2 ^; d- f, f! e1 s
    </allow>& c: U, j" D  L, d5 J; U

    9 ~; M) B: M( x( _②编写service
    + E& Q2 v% F0 B1 [  R. a$ ^1 R
    - j6 O2 ^4 j7 R( F+ S  bpublic class Service {  a- D9 l5 D/ q/ I

    3 k. g2 `9 E! Y2 T7 \& G% n4 m. R- Z% F! bpublic String sayHello(String yourName) {& V$ y4 m' [2 h- Q

    6 j. R. O: L% t3 A  L//可以是访问数据库的复杂代码
    ' b/ `/ `2 i3 W2 N% M7 s& i
    ; l+ @3 ]) t/ U1 }5 Y) h' ireturn “Hello World ” + yourName;6 q0 k, n5 m% y* `# k3 F
    # i  X( Q: r8 ~" G+ N
    }
    + n# T3 F$ @1 ^1 k6 K) K
    9 R$ ?0 u; ?, h$ A}
    & {, U1 K& R+ _" a7 S* a) Q: B9 {" K- `4 {
    ③测试DWR, a- G4 ~  j! ~8 J6 D

      |( F. n; N" C9 S0 B) \, e, ?将代码放入应用服务器(比如Tomcat),启动。
    4 S8 j9 D1 q7 ]0 [3 D
    $ p: m6 r/ M5 I4 ]# q: M: n$ w# q& L然后在地址栏输入http://localhost:8080/你的工程/dwr/ Y/ I  v% q: X" _- f
    " @( N8 m0 l! l( i
    ④编写jsp页面
    5 e* q, [9 o3 X' ^9 c6 c/ H0 T9 k" `. }( Y0 c
    1) 要引用3个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js
    . C! d, @! t2 @+ N$ Q% n& J. k1 o3 ?' m
    2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样- n3 p& j+ n9 _3 o/ k+ e3 p/ L; q$ b) N

    - w7 ?4 F1 {+ M( ~) S2 h3) js里的service.sayHello和java类的那个有一点区别,多了一个参数,用来得到返回的数据
    回复

    使用道具 举报

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

       

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