科帮网-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) ~$ d0 L- K1 R- @
    简述JEE  m- C# a2 z+ U* F4 M" F3 t$ N9 [
    JEE : JAVA  PLATFORM  ENTERPRISE  EDITION
    5 G: e) P. R1 J) A& _  D* ^% y. m" G1 J; R3 B
    JEE是一个规范集;5 N/ T0 s2 F& f, Q  H/ y8 s7 r0 g

    ; q# m' T7 L. U: {JEE是一个框架集;& u" D  d; u, {  ?+ o

    + X. o7 \! Q, a. [8 HJEE是一个技术集或API集;! N: [; K: _- b, L. Y2 C
      T% K/ H" X6 F' {' H/ W. ~1 Q
    适用于创建服务器端的大型的软件服务系统, z5 o9 s. f3 S  e

    ' e3 ]4 c" u& M8 h8 k* R& }1 a" }! j
    ) c5 b/ v( g2 |/ G2 d- a# E9 E! D6 R2 C  n
    C/S B/S 模式
    0 I3 f& k, n. R* b9 G/ T+ ~C/S client/server即客户机/服务器模式,客户端也参与程序的运行与计算(富客户端、胖客户端)
    1 b2 l; l% [4 z* w' T( t
    ' D' ?9 I* d! `% ?! WB/S border/server即浏览器/服务器模式,又称为瘦客户端,客户端不参与程序的运行与计算
    - M2 O* I  B/ T! M; S' [1 H& A
    1 c$ f- D1 H( B" U5 y $ N; E% Z, n" V* {
    + T% G; ?& \7 `5 y2 p' @: r
    企业级应用(大规模的应用)的特点
    . S2 ^$ `* N9 g% O; x9 F1.生命周期长、稳定、可靠1 _; C8 V" U& Z1 I& P
    4 U  b2 x: n5 q. l* r
    2.组件往往分布在异构的环境中,能够跨平台
    2 E  i) T" p* ^4 K6 A- v
    & I# A' o- E* U3.维护性、扩展性、重用性
    8 M5 c% p6 x# {& n9 _, s0 G8 u! u* I  b% r3 F
    4.有事务、安全、线程+ g  L9 G! w+ @. K: f0 T

    ( k2 t" h1 u; e6 W, R
    ! p% ]+ M0 y# D: L, h- K% W5 L- B6 W" x6 E3 W* m- N  n# f5 l! {
    什么是业务逻辑?! g% c5 x9 E& T" y2 P3 ]- X
    依照业务逻辑划分模块,
    ' L: _, @' O* ?1 g! u* y; ?
    ! {7 P- q7 \  T4 N0 D所谓判定业务 就是具有以下特征:
    & i/ P* `8 B, U  ]' P$ v) ]) L  R5 `5 M' P6 Q* h4 V7 z% |# t& S
    1.业务流程
    4 T- G0 f% X( N5 c' L9 Y( w2 c
    ! w6 r& T; T$ z1 j4 E% j' d# @2.业务判断3 v1 [9 n6 K5 Y' ]5 G

    ' X# }8 y* c  H, l- n4 Y% I3.功能组合0 Y3 [; z; U4 K+ a+ [  u
    : V& x8 L2 D0 C0 J* C

    3 }1 i. a2 R6 ?5 L$ T/ p% \: D$ C, j. u* _" _: e0 j0 O5 i
    平台(角色)的划分/ a9 b$ u+ @  L  o
    1.平台供应商。提供满足API集实现的厂商(BEA weblogic IBM webshphere)
    ) ^* [& x2 j' C. A7 ~! g' ?( H: n2 N: P) x* _
    2.组件供应商7 k% ?" T1 e1 L! L; i* L
    # R  @; x; h9 p
    3.组件装配人员
      D6 S9 T0 ~0 b# a. A0 N, s/ F& y& r  }5 o& p
    4.部署人员6 _4 v" B8 Z- x5 k# v7 U

    ; R" `0 y6 L; i* B9 D# f5.系统管理人员
    % N' s  A3 w, `5 w* `/ `+ F
    ; v& Y3 k4 D# a7 P) y6.工具供应商 提供开发组件所使用的工具(Jbuilder、eclipse)* v7 X+ X6 [% A
    2 w. T5 o4 D0 ^% K

    6 r3 k6 V. L$ m# y3 Q8 z# M% X1 s( V' h: `  V
    java技术分布(设计架构 模块内部设计)
    / k; a5 s* p, |, S- {! N1.表现层 Servlet、 Jsp、 JavaBean、 Taglib
    3 E; g0 R4 e: f3 J( s8 K
    1 \. D' h. F9 ^! b9 A5 ~0 }  i2.逻辑层 EJB(SessionBean)1 E. L( `* a1 a! |8 H0 P7 H0 ?2 I

    # D$ M  k" x( M6 H: U! G  U: F: x3.数据层 ( JDBC  EJB(EntityBean))
    / S! m6 c( T2 }. F; r# N  G% s6 r% K1 b
    4.服务 JTA(JAVA事务架构) JTS(JAVA事务服务) JAAS(JAVA授权与验证服务)7 ~  N# l- o. e5 v! G
    & r' I. j: j* W: |" s$ p4 K
    5.分布式通讯 RMI(IIOP)+JNDI 、JAXP(JAVA 的 XML 架构)* b" I7 J! P- Y; R6 U3 G3 l
    0 f4 R5 G( n0 J. E! m
    JAVAMAIL(邮件服务)、JMS(消息服务)、IDLC、JCA(JAVA连接器框架 (成)). p* C3 p" {7 {/ y! Z! F

    . U# @, C! `1 O * g+ `/ ]( s5 D' _' T. ~! f

    5 ^0 i; U( c- T! r8 @% w$ kJEE的体系结构: 是一种组件的体系结构
    : [  c, k. k( G; W1.组件 : 能够完成一定功能的封状体(独立的功能的集合)
    ; f* p9 f& @, V& M8 `
    8 l! x+ E8 b8 P  P& C: {" C# E+ {% V( N不能单独运行,必须运行在容器上) p, ]% ^1 c. a) O1 L
    * H8 |3 c5 }3 b- ?+ x8 N
    分为两类:web组件、ejb组件
    0 c/ D' i* b3 J/ O& w2 g/ a, {  r. f! @' q' e! n8 ?
    2.容器 : 提供组件的运行环境,并对组件进行管理(一段程序)) S+ @+ Y% d; O0 V8 \3 N% H5 `4 f
    ' R: V& J  l; J- r4 |
    管理组件的生命周期
    3 Z5 G/ _: u9 W% M3 J1 N$ Y, ~+ g) u6 x# q
    不能单独运行,必须运行在服务器上  p0 W8 W  Z4 L2 C7 a' k
    1 T2 t  f) ?+ ?; c
    程序(组件)通过上下文来调用容器(context)+ G9 E+ R7 G( c; j" A

      W6 C7 y2 n: s2 a组件通过web.xml向容器描述自己,使容器能够认识组件
    * ^0 `0 X9 d+ o$ I3 x
    7 I! w- X8 n8 ?容器通过回调方法来调用组件
    0 e" a6 m* ?' H7 Q# X5 j5 \4 X* K$ [
    分为两类:web容器、ejb容器
    / y) e% _& N% M! D# T; e
    " j. v" Y/ v% ~8 K2 t3.服务器 : 提供容器的运行环境,提供大量的JEE基础服务& {: }& g5 b3 |( j% Q/ ?7 h, S' U

    / F. [5 S! h1 k/ A; }7 {) ~- v4 z( Y! @1 Wweb服务器(只提供web服务)
    + V6 K* C" N  [* z& y9 I% f  v" x9 V6 F3 s( J- b$ v
    jee服务器(提供web、jee服务)
    7 h$ D: m: t, Q- M% v' h& e: A, _  |! o( S& ^( \1 L: B7 M

    ' G- A) g" f# _% ^- D+ j/ ~- e! B& J# A: n1 c  ~
    什么是回调方法7 e/ ^2 W' v- ?- U, [. ~
    由容器自动调用的方法,就叫回调方法。& v+ y8 X1 i% o
    ' J0 b$ J! A1 x% P+ e
    2 }* l: d/ Y, J- F

    2 H* x) i  q4 y. YRMI远程方法的调用机制1 i, F3 g) G3 |  P
    例如:A主机有B()方法,C主机有D()方法,A 想调用C主机的D方法0 u5 i" n1 h' k( k
    $ X  m- V& n1 ?! r: _8 X* U: P9 H
    9 @' l9 a# M6 l3 h; m

    . y. C5 _4 G3 Y3 {: s
    0 ?" n& b# Q  A; ^1 N" G1 |' u0 S+ I# |
    学习方法
    " u7 l7 v& q* C* M, }* C1.规范(熟记) 2.熟悉API 3.多练 4.多想
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    12#
    发表于 2014-12-03 12:45:29 |只看该作者
    Servlet+ c) i3 ], k2 K- U4 A
    •     描述war包、jar包、ear包的结构) _# Y3 L( J* K0 M( B8 D. v- H9 b2 C7 I
      . A5 B9 W; E( \" o! v

      # Z: T7 P2 U- b) M; g6 Y

    war-                            web文档压缩包

    —WEB-INF

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

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

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

    / s8 D) M& |) C9 E# f1 c, V

    jar-                             java文件压缩包

    —META-INF

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


    : @- w. }' T' f- h

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

    –META-INF

    —Application.xml 配置文件

    –*.war

    –*.jar


    & B, M, ?6 J/ ^, _9 i+ c5 e) `
    • 什么是servlet?servlet主要做什么?( Z7 c8 f" N2 f! w8 X5 m

      - n: c6 s3 `" d# S1 o+ P4 }, ~! i7 ]3 u3 H3 j0 y

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

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


    ; P1 g. M5 O& y
    • servlet 与cgi相比的优点?servlet的缺点8 r8 V7 u4 U9 {1 I
      3 H; W* Y; e' Y! B& Q7 p

      - ]) B6 `6 F$ z( @/ J# K$ e" ~

    优点:

    性能(线程比进程更快)

    可伸缩

    Java强健且面向对象

    Java平台独立

    缺点:

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

    2 x6 _. |- N" i0 M
    • 常用的servlet包的名称是?% E# W- b, z- C( h/ G9 Q
      ; d! S* p: f$ I) \- r$ _9 s3 X9 P2 b
      3 K4 ~- W9 b. D

    javax.servlet

    javax.servlet.http


    7 m1 s9 q: h) `
    • 描述servlet接口的层次结构?& F( f/ [  s7 _" }% ~9 \

      * D: A( i. j6 V5 Y+ r! \
      * W; D/ s1 Y+ z" A

    Servlet

    –GenericServlet

    –HttpServlet

    –自己的servlet

    ServletRequest

    –HttpServletRequest

    ServletResponse

    –HttpServletResponse


    " r6 x7 k, s' p- S8 f1 i1 I
    • 对比get方法和post方法?
      ( @6 a; ?' g  z5 f& e7 f

      5 C7 Y8 O! O; ~0 H
        i4 H+ n7 K  }7 B1 I* i' C

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

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

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

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

    " J+ X9 I$ y# {/ z  V  p( ~
    • 归类描述HttpServletRequest接口都完成那些功能
      . V; N: L2 i8 W6 j8 v  `0 l
      + M, O9 e5 g& _. r; U; ~
      4 L2 R# Q" Q3 b3 C
      • 读取HTTP头标
        $ \! v- @* x# m2 g' P, U& V6 W
      • 读取cookie2 [- @- \- r: w: v: J
      • 读取路径信息
        & `- Q+ [2 p) `, V7 Q5 s0 n
      • 标识HTTP会话。! Z( E( E5 v# v' o
        1 q  {$ r/ J+ @4 v! k

    1 ^* j5 v  u2 a$ Z: S
    • 归类描述HttpServletResponse接口都完成那些功能
      1 {" O; l* Y  B7 {
      0 H; o4 F7 U) }
      5 j6 P! K/ t6 o7 h9 q2 A
      • 设置HTTP头标8 @0 Y! k9 x' S) r  e
      • 设置cookie
        7 ~# U% e. K/ y$ m- Z- n9 ], a
      • 设定响应的content类型% [/ K$ i% [+ B, `3 V
      • 输出返回数据$ H9 C  G1 c& V$ K" X5 h2 g+ i
        " K4 W* p5 g  e( R

    & Q2 x( u( B) a1 F4 z
    • 描述service方法所完成的基本功能?默认是在那里实现的?+ x) D. M9 U# ^% K& U

      1 W) a$ s! D6 P( V# _6 e$ D$ d4 ]: m# I  a6 @8 j6 M: J

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

    实现:默认在HttpServlet类中实现


    " R2 y! O& F- l* _+ O9 X
    • 如何开发自己的Servlet?描述应该做的步骤和每步需要完成的工作# a) m" h  O! M( k" E$ I4 L, d. H

      . f. _$ o! `3 R: x, ?% p' o
      % P4 W7 j* _+ T6 d. F$ B

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


    8 G3 s  N. J% v6 ?
    • 为何servlet需要部署描述?! h$ S/ t6 H% p& U

      / i* w+ W6 l" f% z" j$ ?( A6 Z6 I* w( I

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

      u2 l( p8 F* s+ n9 A, G8 y
    • Servlet基本的描述应该是?请写出来
      - }/ y, B8 o4 T' C$ q

      - p1 H% s1 C; P+ n  E
      ! A5 v/ \- a' ^% a; F

    ( s6 X: Y  O1 Y$ B3 Y

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

    . J$ J3 u: b5 V- E6 i' W  T
    • 如何在html中使用servlet/ u6 {& @0 X! M% N* D. x" O! |
      2 {5 X7 U9 j4 M/ z$ Q& v

      & o% E- E* A1 I' o" y

    FORM标记

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

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

    语法:

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

    {HTML form tags and other HTML content}

    </FORM>

    4 o( Y2 G% N$ c1 }- y  x  H
    • 如何接受request中的参数
      ' {* m, {: p$ M* m  _$ Z
      6 c5 `  A7 ~# U8 u' m2 w9 A  [
      String userName = request.getParameter(“userName”)方法% h( i8 j& R  B" ]
      6 X1 D- V) }& `7 ^( _

    8 \' w7 X0 V" m0 l/ ?/ X8 Z- @2 s$ u
    • 如何接受request中header的值
      8 l. B8 r  r4 j" D9 [
      $ Y: w! _1 M1 U6 n1 J1 r8 H0 i

      # i' Q8 Y, N! |  U# a; Y) H- T

    request.getHeader(name);

    request.getIntHeader(name);

    request.getDateHeader(name);

    request.getHeaderNames();

    * d2 r- ~0 j8 H+ b: _, _: x# ?
    • 如何输出html
      7 H9 h! u8 O; m( y
      5 x# D  S! ~3 [7 L
      * i5 d6 G3 J( v$ D

    PrintWriter pw = response.getWriter();

    pw.write(“<html>”);

    pw.write(“Hello”);

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


    ) |2 ^0 `: L0 _
    • 如何设置输出的contentType
      6 K8 ]# I) [* A- r5 |
      9 K, g9 Y8 m3 p( B

      7 z8 C/ r9 \, ~6 n+ l

    response.setContentType(“text/html”)


    - v% V+ n0 |, [
    • 描述servlet的生命周期?
      6 I# ^. n1 }8 C1 p
      : _' S7 m- W% n4 b+ X
      9 v9 W# c, Y" r2 j" z, F- E0 z

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

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

    * `( r5 \4 \9 C2 O+ |$ Q8 i0 L" s
    • 描述init,service,destroy方法的功能和特点- }& s  b: L6 |3 T4 D. m* U2 X
      4 S% Y' ~" V, [4 ^  w
      0 w) |2 y0 F$ |4 L5 K5 _2 Y

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

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

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

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

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

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

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


    / R7 }9 J! F$ y
    • 什么是回调方法?有什么特点?
      : `( P4 |  a- C% c2 H' U5 ?6 ?, r
      + v' Z% r7 ?+ e6 O; Z& q) @* _

      # ^; h$ c. `9 W8 F. y

    由容器来调用程序的方法

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


    , i% o. ^  O' N: ^. d% _7 L  Q( t
    • 如何设置初始化servlet的参数?2 @& D4 m$ v) G4 w4 B, ?) Y5 G( P
      9 m; }. n$ W3 J; t. H$ T- H
      在<servlet>中添加如下配置: k# r* j# w' Q0 [) ^, c1 n
      : r* H1 ?1 X. s

    <init-param>

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

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

    </init-param>

    , |7 e! d8 v0 ~+ e0 C' H" }  k
    • 如何获取servlet初始化的参数
      " L9 J" a3 d3 G: ^( f! [

      8 C8 T: q" s3 L; z2 K* n- C9 {4 x) T+ f" {* _+ L

    public void init() {

    greetingText = getInitParameter(“greetingText”);

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

    }

    , W# f9 y' I$ Z
    • ServletConfig接口默认实在那里实现的1 Z6 Z  e) F; Y  l5 ]) j! v

      ! d. B6 a( M, Z9 R; q( n8 a' M& b

    GenericServlet类实现ServletConfig接口

    1 f- ~6 l* b/ G) h7 r' \
    • 什么是ServletContext?有什么作用?
      5 n. n+ f6 ~* ]+ K6 m

      # W6 P5 t! I0 j" ?- G
      & o; B# K! p) X& d+ U* T

    Servlet上下文

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

    * K' V( R. X9 t" K
    • 如何访问ServletContext接口?是在那里实现的?' y3 U: j1 _& [9 }0 ^1 j
      ' A( g& l7 v6 w; |" j3 m

      8 o3 g; y0 @7 O# @( ~' K$ [" |

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

    GenericServlet类实现了ServletContext接口。

    2 I0 x3 R; }# x/ Z0 w
    • ServletContext接口的功能包括?分别用代码示例
      - }: b/ o% @$ S7 q' Q5 f$ s
      . A* m9 h" q+ h1 c" i' I

      & k* G) r: S0 F6 X8 q0 f

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


    / x& g4 n3 b( |7 n: l
    • 如何设置ServletContext的参数?
        t9 N6 ~+ I) v
      $ N" ~! E3 u! d. Z2 y

      . W  {5 L/ C! k: Y, l

    <context-param>

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

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

    </context-param>

    / P) R) C. I- w2 w& P; {
    • 如何获取ServletContext设置的参数值?. W  k, y  ~9 b" L" d

      / F' z- [/ h# W; z5 ?; k7 I* [0 @6 L

    ServletContext context = this.getServletContext();

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


    8 T2 B" Y1 l2 K. B- E
    • 描述Web应用的生命周期?
      ) i4 I& F; j+ s
      $ a0 w1 e$ f; @4 u; v% W) u5 x
      8 j3 d5 s; U6 c

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

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

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

    - s8 \6 P8 e6 p, I) ^! n1 i! _
    • 如何用代码实现监控Web应用的生命周期?
      # R0 ?5 s' b/ Q$ E  y0 i' u  \- Y

      * U, g& _! n) z3 @" \+ S+ l
      ' s- j! X) r8 A* H  N# n* ~( V& Q4 I  j/ S* N% k6 A# q

    public class Test implements ServletContextListener{

    public void contextDestroyed(ServletContextEvent arg0) {

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

    }

    public void contextInitialized(ServletContextEvent arg0) {

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

    }

    }

    8 w" R8 v6 k$ x9 u3 d) V7 |6 r

    web.xml文件中的配置:

    <listener>

    <listener-class>

    com.csy.Test

    </listener-class>

    </listener>

    . {+ [  x6 P% ]3 m5 a" N
    • web应用中如下错误码示什么意思:400,401,404,500# d9 ]4 p( Z5 n1 _. f, h. k
      ' O1 r# ?+ c4 N
      400 Bad Request//错误请求
      401 Unauthorized//未被认可
      404 Not Found//没有创建
      500 Internal Server Error//服务器内部错误
      ) a* M3 u$ m8 T% S0 [4 |

    7 l. Q$ o9 z6 H4 j
    • 描述Web应用中用声明方式来进行错误处理的两种方法
      2 Q# C( h- j8 n: P5 E; j4 n

      # j; G' O" M2 m; T2 ~) [5 o8 n5 y! ]/ c2 d

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

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

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

    + ]8 u- \  R. t2 x5 G
    • 描述记录异常日志的方法,都位于那些接口?- N& C. {* G$ G* D3 X  Q  y7 o

      " _7 P+ C' e" e" r9 x+ X) E- O# J0 [

    GenericServlet:

    log(message:String)

    log(message:String, Throwable:excp)

    ServletContext:

    log(message:String)

            log(message:String, excp:Throwable)


    - `" q7 o9 c7 _7 i2 i4 i
    • 什么是会话?/ i" x& D( B1 k9 \$ c! p0 S7 b0 m1 M( [

      ' M' Y7 \$ s2 `6 ]' H
      6 `6 N6 R% ^3 r7 P5 R

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


    ) _8 C: @2 e: q
    • 如何获得会话?
      / @9 N5 D5 j- T$ L3 C1 Q
      ! _0 E, ~- D$ p0 R& @) W
      HttpSession session = request.getSesseion( );

      ( n0 T3 C9 o2 W; l

    * [" H0 ]% N% A! x' o) C
    • 会话Api的基本功能?# q: J' P3 Q1 @, {9 k1 v) U# j
      ) [4 t6 s0 }& g: t1 \
      & O0 V0 X& f" L% ?* Q

    getID() :String
    1 N0 v+ u; V$ h- Q/ P) i  e

        isNew() :boolean
    5 R! l3 x8 ]. L5 n/ ]+ j

        getAttribute(name):Object
    ! Q* y/ l6 \. u" V# S

        setAttribute(name,value)
    6 v' X8 S$ J0 ^( P* D

        removeAttribute(name)

    ' m3 D, ?7 E  W  T+ S3 H/ T( D
    • 如何销毁会话?
      % `; O/ k0 g& n+ X

      2 o2 ?6 p5 A3 [4 l* m* x9 ]
      7 Q, Q( x5 _; f# k

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

    <session-config>
    . p: s( g  Y: L$ V% m. H8 [

             <session-timeout>10</session-timeout>
    1 W8 y2 R% w6 Q; [1 R' Y& m2 U/ k

         </session-config>6 O/ d; Q9 w( |

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

    invalidate()
    7 O0 Y- x: h* _. O; {- D; y5 m

         getCreationTime() :long- `  |$ K3 ?, N( t

        getLastAccessedTime() :long
    9 \3 N, _# q8 x$ [

        getMaxInactiveInterval() :int2 C5 G' `) z! p& b$ {

         setMaxInactiveInterval(int)

    % j( j* @! X; v( n
    • 描述会话保持状态的基本原理! [% U, H- ^0 |. n: n3 P& j: }6 K, W) F

      8 N! r/ @2 [* G9 o) w( a8 z6 k* Z  |% G. p/ R3 l7 F, E; u2 d8 o

    1 S0 @: c4 ~  M  k4 e2 U5 X4 K

        client server
    " d9 T- W& ]) w5 g


    * |3 b/ |. z- x+ l8 s

    request! t7 i2 u+ D1 K

    response (sessionid)1 d3 W$ O/ X/ A1 O; e* b

    request (cookies)
    $ k$ b+ b( p& F9 V9 |) }# B# y

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


    ( C$ W! u" Z" K% P; }$ A. O
    • 请描述session和cookie的异同之处+ \1 P. Y/ j1 F* y- Z6 u. U! T
      1 x$ s! j: Y# Z
      2 K: k5 o$ A' }& C1 n7 m
    9 }% C2 W* f+ a# w

    0 R/ }$ t6 p" k5 A
    • 如何读写cookie,代码示例& z$ j8 e* W0 k3 `; m4 N) j+ T
      # g+ r( ~5 L5 r0 t% ?9 _

      ; _" D2 I/ u2 U- ]& {& J- T% ^

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

    response.addCookie(c);

    读:Cookie[] cookies = request.getCookies();/ W7 H: F! F' k4 Y

            for ( int i=0; i < cookies.length; i++ ) {
    8 B# A! Z2 X3 w1 D" V

                String key =cookies.getName();
    . `- w' u# H; j; G, ~+ e) w- j

    String value = cookies.getValue();
    ) Z2 G0 b% b1 W5 {5 w7 J) f2 I+ S8 G+ g

    System.out.println(“cook”+i+“:key=”+key+“,value=”+value);
    9 |6 E# q+ Z! |2 C% C# E8 [- g

         }


    ! h* @0 s, l0 G, I  P7 A( Y
    • 什么是URL重写,如何实现,代码示例1 Z0 I& b  O+ k( ?0 C

      + f2 [: S1 i0 {( x2 r- P3 f9 B. C3 Y7 h

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

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

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

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


    9 b& B# s" t& r+ R" ?; c
    - C. P+ G0 }; P- p* k. _" J% w3 N
    • 描述web应用的4种认证技术
      ( H+ W; G$ x+ b5 I6 Z, a4 [  e; \

      8 p; h' Y5 ^3 y# b1 S4 \& ?6 \1 K* Q: y5 C' E# S

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

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

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

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

    7 l' W0 ^7 R" \- t9 w7 U
    • 什么是授权,什么是验证?
      8 P( m' Z' d# D. S% ?
      & g# d3 l0 ^) |+ U, O- l8 U
      $ g8 D" k4 {7 |* X' }# \! V

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

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


    0 ^* K' f/ n9 i" f
    • 什么是HTTPS
      ( P* L+ L) v! c6 J& `  o; j, ?

      & Z: H3 o  \  f0 E+ S! C3 X1 |8 z. ]3 G) b' |

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


    ' r, C: e3 x, D7 i! x1 Z
    • 什么是审计?, m% s% a# E# R6 H1 k! n; m

      6 g2 X: }/ ?. m7 I# m' O+ V" j8 z9 `! h' B/ T

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

    ! O" b1 V$ E2 ?/ ?/ u0 Q
    • 如何实现声明性授权  H2 u/ p' E  B
      ( d% Z' f$ S4 M  E$ H

      ' @) K, |( f" i0 V

    1、标识web资源集

    2、标识角色

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

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

    在 web.xml里配


    " }1 _  S* }2 q: n9 v4 I$ ?
    • 描述servlet并发问题?
      & Z8 a/ M" ~2 e+ S+ F& ~
      & U0 i3 f% x, F# D1 t
      / j' M2 U9 |& C/ a- E) G/ S$ t

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

    ) T: I- `5 p" V( |
    • 描述Web应用中的六种属性范围
      / w! {  f0 a: \/ z; P

      : J  o& i4 H) A, N
      / K, g" A; ~! ~" o2 ^, X

    局部变量(页面范围)

    实例变量

    类变量

    请求属性(请求范围)

    会话属性(会话范围)

    上下文属性(应用范围)

    + k* S& b  m0 _$ z
    • 指出上述六种哪些是线程安全的8 Y6 V8 J' e0 w6 D% C
      , t/ V/ b$ h  ~4 j

      5 |0 R3 R! s/ i. n  t

    局部变量和请求属性

    $ M2 o; V# u" K( t$ c+ ^
    • 什么是STM?如何实现?) ]/ h6 E3 a, V) m, v
      ' I3 G% O# Q5 P0 Y2 p
      1 X- {0 S3 N/ J  i& g" E

    SingleThreadModel接口

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

    ; W" n! F- {% P! q( q
    • 如何实现并发管理?
      & ]3 s! ?& p) w/ K

      , D' L2 [0 t0 T- U- M9 H
      $ B, j" E1 D4 K7 G. b7 t5 ?

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

    使用synchronized语法控制并发

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

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

    1 i  d( U+ @4 G' S
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    13#
    发表于 2014-12-03 12:45:45 |只看该作者
    Jsp
    1 t% C4 ]' Z# j! `3 |1 V, |什么是Jsp?
    0 w0 ^8 k0 Y: U0 XJava Server Page    结合java和html在服务端动态生成web页面的技术
    , J2 @8 c: |* G8 ^# H4 {* h* k. d5 M4 v/ l

    5 h/ d  |% v- X
    + ?% F4 x& [- H* _% k. y描述Jsp页面的运行过程?
    + m& M3 a4 ]+ f第一步:
    6 }; R) ^; H) N% W) v# ?( s" J( G' `8 \9 n- i( A$ O' E/ @, b9 o9 O5 T
    请求进入Web容器,将JSP页面翻译成Servlet代码9 t5 c! t: ]! N& @6 F+ ]+ d, v5 D9 ]* B

    1 J8 j7 y6 H# m: {第二步:7 l# t- b( B" E' }7 z3 E1 R' |$ s6 j
      H/ z# T$ D0 x2 y
    编译Servlet代码,并将编译过的类文件装入Web容器(JVM)环境2 h! T( K( \8 Q/ P5 B0 m: P+ i

      g- W+ [7 P) {) a1 y0 F( x  [9 A第三步:
    3 E7 f- Z( e/ }2 `) X& r9 v! A/ H9 x, w, H
    Web容器为JSP页面创建一个Servlet类实例,并执行jspInit方法6 m+ i2 v1 v+ c4 k

    . l, \; A% y$ L  W' {第四步:
    6 `( A8 b5 W7 `9 t- s: |3 v' K7 C! n. a7 q# r( q
    Web容器为该JSP页面调用Servlet实例的_jspService方法;将结果发送给用户, l( g0 w0 [) ^: C9 V+ G% z* X& q
    . M  f7 @5 o* [8 K6 l* r6 y
    4 w7 y7 T# o3 L* A
    # a+ q1 R' k% o& B7 R
    描述Jsp页面的五类脚本元素的功能、写法、并示例8 S- M3 C3 L( {" L2 F
    注释 <%– –%>
    + y! W2 B8 V. M
    5 l6 P# d$ c8 b$ R% h7 w6 i6 J' U<HTML>3 }8 ^) w$ r8 m+ S$ ^) t5 D
    . b) I# I) D6 q/ Q8 X6 q
    <%– scripting element –%># M! v' [) |! ^& n3 H" r" [
    * Y2 \1 k5 B4 J' v6 w! H4 K, p* ^
    </HTML>
    7 K: m4 c% Y7 y2 U& h+ E5 q
    ' {% p* \7 O- r( ^) L3 C2 c+ X指令标记 <%@ %> 指令标记影响JSP页面的翻译阶段# Y1 Q/ g+ L  H* M# p" h

    - F; |# z3 Q# H2 Q  w, H<%@ page session=”false” %>" r: x4 y+ j  _! T

    $ S6 M* Y. E) m3 \声明标记 <%! %> 声明标记允许JSP页面开发人员包含类级声明
    9 o4 R0 c8 _% w- c9 U" d2 n" i$ {8 L  Y5 m( ^
    <%! public static final String DEFAULT_NAME = “World”; %>
    % O0 i( i( m5 q( U! G- B9 C
    ) P& U- F! d" h' J3 }$ g& S% B5 H/ E    脚本标记 <% %> 脚本标记允许JSP页面开发人员在_jspService方法中包含任意的Java代码
    ! q' f4 c4 \/ t2 l, G# A1 z$ j. s1 E' k" y! [5 I8 D
        <% int i = 0; %>
    . d+ W+ N/ Z# `7 C6 o* b4 f2 s) v% T5 w9 M' a
    表达式标记 <%= %> 表达式标记封装Java运行时的表达式,其值被送至HTTP响应流 <B>Ten is <%= (2 * 5) %></B>: s1 I0 o" M7 d5 Z! g) v

    8 M- [) W" E( m% w: L1 f! h) o
    2 I" w* z6 r' L6 h4 ^/ g/ Q
    . r! J: N+ q% ]; f/ N描述Jsp页面中的注释种类和写法
    / V/ S  o" o7 i9 HHTML注释" `+ S4 z, o! V

    ' u' _! r' v0 z8 n2 b( L0 ?<!– HTML注释显示在响应中 –># Q8 s: n: b. `+ X# f
    + M+ w* v, Y5 {- h, E4 u1 B
    JSP页面注释3 \: X, o% C! x" W. {8 g" K8 ?

    ) H5 y4 |7 S7 d9 @: b) _<%– JSP注释只在JSP代码中可见,不显示在servlet代码或响应中。–%>$ \/ \8 `) K% n1 q. R# C0 x
    ) \4 R! j; ~" j8 B4 B
    Java注释6 Y  F2 A1 P, b9 t* W2 ^

    5 J2 a. K$ {3 t<%
    - J5 d- d9 Q7 b+ l, l2 z
    9 |! s  K; ]! B% k" S/* Java注释显示在servlet代码中,不显示在响应中
    ; e7 y# X0 ^4 Z2 P) }! Z! J+ z
    8 o, u5 W4 T% ?' D& b" M- ~*/+ }& R) H' F2 ]+ i1 E
    2 X  g4 N/ N+ b& p0 r7 E. w
    %>1 J1 t+ g5 ?# Y9 b9 a, h. j
    : b0 {" v$ c8 R/ T0 f( i8 g
    # L8 F7 J7 Y% `# o2 [) f
    9 i% x) ]+ O% q* [
    描述Jsp页面的指令标记的功能、写法、并示例
    ! e8 x) l6 f2 ~* T: ^( T4 `4 s% W; V指令标记影响JSP页面的翻译阶段3 Z* ]! u, [' n  L7 F6 ?

    ) a5 W" {  V9 A% F' m8 ]<%@ page session=”false” %>
    " A$ j5 d1 V" z& a2 ]# [. Q4 s# e) c1 l
    <%@ include file=”incl/copyright.html” %>) G( v9 o' [! U- p- N' c" k

    * Q1 U9 |/ F3 t% H<%@ taglib %>. j- N; M6 b8 ^8 f# ]5 ~
    / I1 T, M. S* e) G
    , {/ r' T  n  Q( A

    - x$ b5 A5 q; C, @描述Jsp页面的声明标记的功能、写法、并示例3 f$ e4 I- z* w! S/ r9 {4 y2 C) j# U
    声明标记允许JSP页面开发人员包含类级声明0 h( x9 F! h: q2 y+ K+ N

    6 C" w8 Q* E% [4 L写法:
      S8 ]  P5 [0 f% U4 ]  k
    & x6 E+ J4 N, m: s<%! JavaClassDeclaration %>  {3 y9 b  n  k4 b2 z

    8 N; u# f6 K9 F, H例:7 B* [4 T+ z8 t) y

    : X" N% ]1 ~, p<%! public static final String DEFAULT_NAME = “World”; %>
    : F& p. j$ X7 z4 _/ ]$ G
    4 B  Y; z5 _7 n" I<%! public String getName(HttpServletRequest request) {* o) |& G2 P( M& i' R  S$ m+ ~1 ^

    ( L2 M  V+ H4 c- T+ @: p  ^* hreturn request.getParameter(“name”);
    - i, ^$ S) |; s3 Z" |4 ^  u* U' M+ Q( W6 M
    }3 A1 B) |/ Y5 P! ]/ i" V+ R

    $ |" E& W2 E; O1 v0 E- m%>
    ( P' R. l3 t" o/ Y* b: P
    # H* E" l4 C6 D+ M<%! int counter = 0; %>
    % w" l) s& g; p' l& k; g
    9 q- o4 }. v" Q( F; |0 F0 m
    * n1 e+ A8 A" W' Y
    ( m4 H7 n- Z/ M  |描述Jsp页面翻译成Servlet的规则5 c! ^4 m0 D7 R- o4 `: }6 M
    jsp中的注释标记被翻译成Servlet类中的注释
    7 W! _, \( \3 k# X1 c% ~3 U+ o( y/ Z* l9 l) L/ H- Z! T0 p
    jsp中的指令标记被翻译成Servlet类中的import语句等
    7 Q) Z5 f; C# g8 B+ ?, l% f0 L
    $ N7 D; O8 H" J9 n8 x! U. H  xjsp中的声明标记被翻译成Servlet类中的属性
    3 K$ D  s4 d- }. k* h7 C) g
    ' t+ h2 f- l: s' p2 T0 Sjsp中的脚本标记被转移到Servlet类中service方法中的代码, q; t0 j7 }: ?1 h1 a! m- Z

    $ Z- O- C3 S7 z/ bjsp中的表达式标记被翻译成Serlvet类中的write()或者print()方法括号中的代码
    ; y' T3 Y. l3 ?: B$ ]3 j
    # }7 l  b% \% L' U+ E+ Q : K! F' `+ a4 J1 K) l4 g# b) i

    * c* i) s5 ~" [5 |# G/ Q6 Q7 M8 @描述Jsp页面的九个预定义变量的功能、用法、并示例
    # i2 ]* |8 I+ f; k- q  Q# m/ Nrequest 与请求相关的HttpServletRequest对象
    # B: l) n! m1 n. J6 B- k6 H% t4 y! F; U- \5 {
    response 与送回浏览器的响应相关的HttpServletResponse对象
    / L6 w9 T* M% c. ^: S2 K7 {0 {: l+ e$ z0 W
    out 与响应的输出流相关的JspWriter对象
    * U, R/ w+ a5 H/ `' g" K0 {: g2 E
        session 与给定用户请求会话相关的HttpSession对象,该变量只在JSP页面参& |: u/ H, B5 I

    & H  F# N- t* ]+ l与一个HTTP会话时有意义
    6 }5 T! ], k4 O; Z/ m  F5 E4 y9 ?6 U
        application 用于Web应用的ServletContext对象
    ! j, ?2 K8 o7 E# k9 k
    ; m4 R3 B8 |# @9 P& yconfig 与该JSP页面的servlet相关的ServletConfig对象
    , }$ U2 {$ ?  t, z0 x" J& X) K
    pageContext 该对象封装了一个JSP页面请求的环境
    " A3 j6 ]8 u* J, s6 z# j  i7 V3 r3 `% h; D
    page 该变量与Java编程语言中的this变量等价
    - K* d5 c3 u& R' R7 N9 \% a
    / ^. c  T9 B! X9 h- e8 ^0 ~- B    exception 由其它JSP页面抛出的Throwable对象,该变量只在”JSP错误页面”中可用
    $ ^8 d4 r/ P" ?+ z& [$ |2 m$ E& E3 ~1 Q# f6 O- K5 W

    & G# O5 T$ D& C& B- E- J
    ( m, B, S: B: ^/ fpage指令的功能,写法、并示例,并描述它的如下属性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding
    + l' b6 p- p+ q7 Oimport import 定义了一组servlet类定义必须导入的类和包,值是一个由
    2 `* d2 a8 I" G/ a" ^9 D1 C5 _" b, o2 o1 j0 @, y* x5 ?
    逗号分隔的完全类名或包的列表。3 x1 @: n, b8 {* m" `+ [
    4 m0 q- q* e1 |: W& h: x' G
    session session 定义JSP页面是否参与HTTP会话,值可以为true(缺省)
    6 Z8 q. [) t2 k' U; [- p: {- W9 ]
    或false。; j. b' \2 t5 |

    ( k, r  E+ s. }# b% }5 o+ D. z5 {( Bbuffer buffer 定义用于输出流(JspWriter对象)的缓冲区大小,值可以为3 f8 _) Q7 W- P, h2 @/ j6 A

    - I' t5 u5 w% l; w  lnone或Nkb,缺省为8KB或更大。4 \2 V  B  K/ K

    - S  F1 |6 T: perrorPage 用来指定由另一个jsp页面来处理所有该页面抛出的异常
    $ z4 L" W( n1 F3 m* R9 o2 V* x3 i; q/ u) p) N1 W
    isErrorPage 定义JSP页面为其它JSP页面errorPage属性的目标,值为true或
      v" E! F# X, o" M
    4 A" u7 j5 N! d3 Ufalse(缺省)。
      \3 M7 b# p  W  n5 @* i  H6 H/ u: v: R# a; \# o; w$ h
    ContentType 定义输出流的MIME类型,缺省为text/html。
    4 W# Z4 A# ~1 d7 i
    ( [9 `, q2 Y" x7 WpageEncoding 定义输出流的字符编码,缺省为ISO-8859-1
    ; {+ ~8 f, p, E/ g4 k# h# ]
    ' N3 ~( c6 s5 U6 G' A7 _% ]
    ! I8 u. @, J) x9 K+ S  P4 O+ F8 A( O( f  O+ O8 b
    描述MVC各部分的功能?MVC的优点?MVC的缺点?% h( o- b9 y0 S6 I
    MVC各部分的功能:
    * W" W5 P- [% g' {
    2 \+ r) F5 @2 [Model(模型表示企业数据和业务逻辑), t) q5 |. V0 K0 n3 m
    , y0 X! b# W- \5 e7 `, z
    封装应用状态6 f( ]& g' l8 c$ W! G$ n

    - l; U  g7 K. Y3 U1 p响应状态查询
    : Q1 |+ I5 M/ v
    2 o& }% [( O5 z* z6 B' w5 s, ]暴露应用的功能* J7 W& U8 v5 D+ k6 C2 \7 `

    $ S8 K+ R6 O# h4 C8 VController(控制器接受用户的输入并调用模型和视图去完成用户的需求); n0 |8 h  o: a; n3 a6 j% }/ H
    # i' w5 g3 s4 K9 G; c* w* A
    验证HTTP请求的数据- g/ v' f% D- A" p$ e& [

    % `* U* P7 J4 r1 N# |! @将用户数据与模型的更新相映射
    8 T: {7 F7 o. s5 Z) }( {: `  k  @8 L6 f. r' q/ |' P; D
    选择用于响应的视图
    4 f. Q5 u/ }0 }2 I+ E! F
    4 F6 ^8 B) n& `" `0 o) IView(视图是用户看到并与之交互的界面)$ Y0 o8 v0 @2 D! c7 h: j

    3 a$ }2 p6 h% s1 t! G产生HTML响应
    4 b$ R  b3 ]- e* |+ f- q3 Q
    $ [: m- a2 G8 L4 m请求模型的更新8 D; }8 q4 `" ~& I5 n8 E" g4 F0 C8 K

    2 R  c, U+ d* V$ |- `3 N提供HTML form用于用户请求
    3 s; L3 V6 H& Q% O% {3 G, g5 Y
      s( I3 m, E; T. s( JMVC的优点:
    & H0 v- w7 K& z5 p( l
    7 R9 f. q- v+ A# |  s$ ^        低耦合性:视图层和业务层分离
    4 _; l8 @/ M2 U$ d( ]! K
    / p5 j" ]" L+ ]0 S# n高重用性和可适用性
    & A5 s& w; |- g9 T# a
    % D0 g( Z2 {+ d) \. b) `- x) ]较低的生命周期成本
    6 ^& `2 r+ E: T! P! B! \* v! L& w5 Z- ^) u
    快速的部署8 F/ H& W+ \% d+ S% ~
    ! Q! b8 q3 t* B6 ~0 i) h- J
    可维护性
    1 E7 D/ [  a, P, @, M; w  z" \# N2 \' ^
    有利于软件工程化管理
    6 A+ g! G- H' c$ m: G
    * v1 r# D3 e( @$ B提高软件的健壮性
    8 }3 F5 \) a  ]( L. q) _) K" r9 w+ P2 `2 K0 K& `9 X
    MVC的缺点:
    : I9 B, k+ R' F4 w+ Q$ z3 P, x5 Q2 ?' U
            工作量大,增加工作的复杂性,MVC不适合小型甚至中等规模的应用程序* J8 |8 _; `' T7 S" M7 U

    * h6 F. i" g6 N5 d- S
    ; g- T" R' A' w% ]1 u/ h; H( T# l% V6 s& D
    什么是Model 1结构,以及结构中各部分的功能
    # Q& i: h+ ^+ b7 x+ \结构:jsp+javabean  T3 H7 H& n6 G9 T" g# J4 M

    2 {: `0 j5 o5 q; X+ y. IModel1中使用jsp来处理web应用中的视图控制部分  s( g9 J, q7 J+ v7 [7 p1 Q. v! ^

    7 F8 r+ K" @' c" Y4 S& ?Javabean收集参数
    - v4 J7 Z$ ~+ L0 G8 @: s/ @, K% b8 n  }$ N5 @2 s

    3 o4 C" B8 }, z( i7 p2 Z5 ^$ o8 U+ j
    什么是JavaBean?
    ! i7 b1 L; s% H, J用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。8 ~6 o! t  d$ P5 I

    7 C% j/ o3 A5 M5 D% b, z" R- n% I
      f+ A6 v8 G6 S, X' a2 Z; ]8 }5 y/ k& Z
    JavaBean的规则?
    4 w( [! {8 T7 Q7 @) |1 n使用get和set方法定义属性% K5 y- g" |! G$ I3 o% u

    8 f) Y  k" R" S5 _一个无参构造方法
    1 |. o# C' F) V
    9 K7 K& Y. c- f) i$ i' d: i6 g无public实例变量( 所有属性私有化)# X$ a) L# Q" O+ k" ?, i7 m2 J+ I

    / I( e7 N5 R( v: G , k5 a4 [  k4 |
    + Z) F+ K. S6 m) a% {" ?. w
    什么是jsp标准动作?包含那些?分别都是什么功能?如何使用?7 t: K, j# c" C$ D
    JSP页面中使用类似于XML的标记表示运行时的动作
    ) U* Y# Z' y  u  A. q( ^: ]  _. s$ \* Y
    jsp:useBean9 v7 Y8 P8 K7 ]
    ! ^& p+ d$ c4 T7 c! V
    jsp:setProperty; _! {  T0 o9 o+ t
    8 E! l3 l/ J# W. \! K! z. J
    jsp:getProperty4 P5 s+ Q+ L4 S* o3 ~$ o
    # P; s- Z1 n" d, m
    jsp:param
    ) _& ]# C( l* e
    + ]6 ?& n7 ^! B) l$ Fjsp:include3 N9 v, J  o; r) Y2 f7 z$ A2 G
    6 ~' O; m) J1 |0 _$ [) @
    jsp:forward
    1 B/ T$ q/ b" w( h  x$ b5 u6 N1 t3 R% I1 y

    6 z" u- F2 W5 q8 d
    - z/ n4 b4 _+ R0 Y0 n1 |用代码示例如下标准动作的使用:useBean、getProperty、setProperty; J* K! ?) Y$ P/ P% p! q3 q& u7 r- p
    <jsp:useBean* Q0 l; L( f# B" o# F
    5 l/ w+ X3 O* ^% l
    id=”myForms”
    # D- H$ Q6 v4 c/ p0 [
    6 w( n$ a. ^! M1 b0 I# D; s' U9 sclass=”com.base.mystruts.forms.MyActionForm” scope=”session” />
    ! [; S( p% ^3 d- \, x2 k8 M- X+ Z8 c4 j8 {5 J
        <jsp:setProperty name=”myForms” property=”name” />8 h2 }7 W; p& ]) X" c
      t1 R) T6 o: s( U8 `# M
    <jsp:getProperty name=”myForms” property=”id” />" s: K5 R3 q1 F* {  q
    2 ]- @- h; E& }% f! Y. }/ J

    . ]% g& U* h, x' |, E
    * u# y) a7 M; V1 g) ?& r描述说明Bean的四种scope
    / h7 w1 T, q$ e7 B  cpage7 j( I/ j  V  k% g$ R/ `4 Y  ~
    . Z& F! h3 O) v- g! S- k1 E
    request
    + ^4 ]) w6 _. f% m, Z5 |/ A2 M  g
    session
    & p5 F0 ~6 s. I) j. _+ j: h( m# @$ i- T  j4 T* g% ]: v" E
    application5 R8 {- ?. |% r4 e5 V6 X0 i* m8 u

    " _/ e$ v. c- t  p+ A1 F/ C/ ?; |
    8 f" p$ A3 [$ u( w) S; U+ V
    ; c  D7 b/ v% m4 F9 x描述说明页面上的字段和Bean中属性的对应规则
    * _& \7 i/ E/ sid 指javabean的变量名% k+ D; y( H& p+ b  ~
    ! i( i9 U+ q! L6 b- Q- e
    class指javabean类的全路径# p. U/ ^) _/ P3 p

    9 r7 _1 s6 c4 p" O* m  N4 A3 oscope指javabean的应用范围
    . P6 K- Y7 v" R. H' W* X# m4 ?" k" Y
    name指所用到的javabean的变量名2 E# N$ L. a1 w. R# e8 |7 y2 M

    & z% U3 W4 `$ D8 F2 E7 _    property指javabean中的属性
    1 U7 S- T$ B) d* w; ?  V0 T' q  {8 {+ ^: `: B
    ! k/ y" M& Y; C- F
    + w2 ?/ {" f7 M3 f: ?! B3 _) F% M
    描述useBean动作的处理过程
    0 ^9 i. o# F+ O使用id声明变量! y6 O( L% R  r8 X  a, m
    , G$ {8 ]+ u! Y2 S, u: ]  l
    试图在指定的范围内查找对象" H+ X  @; Y# _+ n7 I" V1 a3 k
    $ L2 E. D, H; P
    如果没找到# s0 m6 E, s: A' y- _0 L% w2 p
    & N5 o0 f  y) [0 o
    创建一个类的实例
    8 I& y) j, Q- c4 g. X
    9 h% C! c+ w) J2 u; e3 J. a7 [执行useBean标记体初始化对象: b3 w9 [5 J: {9 t

    0 O4 X- ]( Z& t8 X. m如果找到
    / r& G  U& h7 d% y, P! K0 h2 F4 Y$ u
         将对象转换为类指定的类型
    4 E# `! n* _8 m! G+ f6 D, c  D. |& d7 ^$ C
    * m; I- ~) O5 x, a# X6 ?8 ^) z9 b6 F
    . W* B1 _: R6 X' e
    描述forward动作的功能/ m& }% y) n! F! G4 V  |# v5 b! i$ `
    使用脚本代码处理请求时,可用jsp:forward 动作产生一个不同的视图,2 e- m$ G, h# n

    ) E# H! p1 w/ {) Z* `6 ~使用同一个request:9 c% _/ P. H: Y* q. U; w

    2 v7 O& m  Z0 e. s) s% J
    " P6 H9 K- c  R6 y8 {3 @/ ]5 i
    : b* h1 `( P( ^3 v什么是Model 2结构,以及结构中各部分的功能0 ~: J8 |, y( N
    jsp+model+servlet
    % x. Q- v7 N2 J! n# Z) |( u; z' H' ]/ p+ a3 a
    Model 2架构使用MVC模式,JSP页面充当视图,Servlet充当控制器: F' t! e4 F3 S6 ~1 B- T
    , X7 n9 i+ o/ B! Y; A
    Servlet控制器:/ k* u% H: F* Q4 n2 N

    ' v) L2 \5 i- I1 z) y$ g验证HTML form数据& K" w2 ]/ H1 I0 p+ v

    + t5 @7 H6 d, @. r0 I5 ?调用模型中的业务服务
    0 S- w0 t$ @* d- o6 y; L0 e2 A1 Y1 r2 |+ w) v( k* K1 ]
    存储请求(或会话)范围内的域对象
    / n% T0 G" D2 ^! ~
    8 ~1 A# H  z  N+ ^选择下一个用户的视图
    7 N4 J: j; S3 Y" e* Y2 y/ B6 W! `
    , r2 {) E. l! c- t; vJSP页面视图:2 r" g: n1 h" R7 q# d

    " n, T; V; A* c+ U1 b! G使用用户界面(在HTML中)
    5 q# W/ k, Q) n
    4 X* g+ y( O9 D: C4 P" E) m        访问域对象1 m% R! w  i; y) f) R. f
    ; R- X* `+ s. T* L0 N/ e* V) l
    # w) Q, K7 w. f' X8 e" A

    7 i# p. _& j' W如何获得分发器?分发器的功能?
    # I8 W, ]9 F! J, F上下文对象中的分发器:
    ) k" b6 x- w; V9 R9 {$ D9 {/ ^
      k" a. V0 }7 H  RServletContext context = this.getServletContext();5 }. W3 [  o% B. D' z4 x

    ( [8 J! ~6 {0 c- y( qRequestDispatcher servlet = context.getNamedDispatcher(“MyServlet”);
    : N4 S# ^5 h5 H% ^7 ]1 B% u: V- K
    0 G; Z7 Z( g( |4 ?+ X  Q+ Uservlet.forward(request, response);5 z  I9 o5 y9 ?+ D$ x" w8 H
    9 U7 f! H" o) i8 g  v! w
    请求对象中的分发器:
    ! o3 M- L6 ~* [  }
    3 ~  d7 G  \! w8 y* i  cRequestDispatcher view = request.getRequestDispatcher(“tools/nails.jsp”);
    + e% R8 V% ?; W9 c3 X
    9 {( `; z4 a; |6 d8 Z9 Y( rview.forward(request, response);
    8 C- K2 L, c7 K9 H7 f
    6 f$ q+ b% ?9 ?) R可以将请求转发到另一个jsp页面,并保持请求的传递性+ g& ^' I2 y- x. t
    4 n0 Q: z8 G- N. L

    ; d2 z$ y" {- Q: d' g1 z6 a3 U. \, _
    / j9 F9 L! _4 g6 z% V; TJsp中页面跳转的两种方式?
    + ^- C) A' `. D) G+ r; u" F使用分发器跳转页面+ n4 W' ]9 [' q" f7 S* Z" l4 L" m
    RequestDispatcher dispatcher = request.getRequestDispatcher(“url”);; q. q# d4 y% S$ V( J( B& F
    2 ~+ ~$ N$ a* I6 b' K9 l! K- h
    dispatcher.forword(request);
    7 Z2 C& [5 n' o# i) Z) w6 ?6 I4 C
        特点:保持请求的传递(上一次请求中的数据,在下一个请求中仍然可以得到);- H% l6 V8 _4 ]% W* j4 \% P, @
    : B$ z3 A1 O' }4 u- G
            转发的页面只能是同一个Web应用程序的其他Web组件: ?) ~3 Y6 l, o0 p: h, m
    / k; Q! g& H3 L
    使用重定向跳转页面
    , O3 Y+ n) H% T& v0 k3 {9 e3 Sresponse.sendRedirect(“url”);7 m: s4 t+ Q8 N! n1 v1 V

    : _9 K2 {8 }5 ]2 R2 |4 B9 Z7 r    特点:产生全新的请求,(上一次请求中的数据,在下一个请求中不能得到);3 ~, }0 g6 g: B2 h( A/ i$ C

    . q9 Z; k7 q) f3 g  D- n% q( ~$ m        重新定向的页面可以是任意的URL' n4 U- p" W3 [1 V- y

    / [& q& L5 j( U, [; B' T 6 K4 V+ o7 x& A* Z* m* Q# m

    6 X; [  d7 }) L! }4 d& s( X描述Jsp中引入另外页面的两种方法,并比较两种方法的特点?* s% G! L- f5 L# X) ^3 q
    <%@ include file=””%> 在编译期间把另一个页面完全嵌入这个页面,可以说是一个页面8 o2 ^) Y1 E4 a+ w- T0 O
    9 e; e( r5 }: o2 G. y
    在这里可以共享变量
    ' x) P, m5 i- ^3 i( I7 G
    : @3 G; P) X) d* k( B( C<jsp:include page=””> 动态的再运行期间把另一个页面加入这个页面,可以说是两个2 }1 E/ B& d1 {

    ' S! @* |! a8 \9 h* P页面,不可以共享变量
    $ u- `. M0 s+ R% Q+ L6 w
    ( a& L/ ]4 G/ ] 6 _: k, {: o& r' t
    ) e) U: n& P: u) j9 s" H0 p7 B
    什么是自定义标记
    # [5 S: T) z9 x自定义标记库是一个Web组件,
    2 q2 q" K; i3 ], U: x. O: `) Q
    ! V2 H( c& M1 E+ L% {: A- n包括:) k$ i) _$ h; i6 |8 S7 X9 u

    / Z; K% i7 i# Y4 J一个标记库描述符文件(*.tld)/ a4 o0 k: g0 W, g2 L( I: i; h3 F. E

    % o9 P; r' ?) T1 s+ ^  D3 d9 r7 |( G所有相关的标记处理器类(*.jar)0 X, t& z8 i: D7 v' F* C3 D
    3 }" D7 \% Q& m; z8 K* d9 l# k7 h

    4 l" O+ [( v1 l" \  L
    % z9 J+ x' o: r% j( f6 \9 s描述使用自定义标记的步骤,以及每步详细的工作' t# C9 `& p7 E9 w; r
    使用自定义标记前,要拿到.tld和.jar两类文件
    1 G8 C% ?6 e3 V$ g; X
    6 F' G- S; f0 Z把.jar文件放到WEB-INF的lib里面。% D2 S  R0 b5 D& p, W
    把.tld文件放到WEB-INF根目录下。; d/ q1 J3 T4 Z& P4 S7 C
    在web.xml中配置。
    - E8 g- }8 ]; U: J, E, v1 s3 L1 q<taglib>
    + r' f6 w' U1 J! p. d7 |. A0 L, n2 w8 @0 w, t6 }6 `2 x5 i' `0 p$ y& N/ J! o
    <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
    + s; `  `2 H& z8 Z: ?
    % Z& e# w1 R! Y' s     <taglib-location>/WEB-INF/c.tld</taglib-location>6 m" g- \, e- \. i- M
    ( F  E, c) k0 V% M- B( U8 C5 m
    </taglib>& f# N2 I9 v7 K* E: a, N4 g3 n: _5 c

    % s) S* h4 A) E: M2 ?2 ]0 g在页面中引用。
    4 Y3 W# u4 a: ?% P  n$ L" k<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“s”%>( E1 A7 [% e& n! e/ `8 l4 d$ X8 W

    % |2 u4 t  v4 r5 {. euri必须与web.xml中的uri对应4 e% i( C' ?+ O  C
    7 Z) K2 E: x. l' x  q; \- G0 k" e) y( j
    prefix是前缀,用来区分是哪一个taglib6 P- {0 I7 Q: m% D, e

    : l' o, @6 x( O3 q5 a使用标记
    1 d: L% r& W4 L# ^3 E: {8 w格式:<prefix:tag名称 属性>
    % P+ T  X( F- Y7 H9 }# B' a; w4 @' |5 I; l2 t
    <s:forEach >
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    14#
    发表于 2014-12-03 12:45:59 |只看该作者
    在tomcat下配置数据源
    - v% T) C4 R" B3 ~8 b; L1、服务器与数据库的连接$ ^3 j8 h$ B' w0 ]' }
    * p: ]3 {0 f$ g8 {$ T
    配置server.xml文件
    ! e( r: n" t# `" c4 h4 G% K2 j% r$ ^/ X8 P. v
    1.oracle6 A+ X% C8 u2 C, d7 H

      F% D2 `; T2 d" {. m<Resource name=”jdbc/company” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
    ; M6 z- p0 G* R
    ; Z4 J1 }  g/ j# q9 ]6 B7 E                        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”
    2 V7 o6 W/ g; n7 S, e" p, R$ A5 X" U2 d' C( r4 S& y' R
    url=”jdbcracle:thin127.0.0.1:1521rcl”  J/ b) k$ Q. R$ k( r7 }. u

    , @9 u0 T4 J7 r1 ]3 QdriverClassName=”oracle.jdbc.driver.OracleDriver”
    3 j7 i! h# [9 K* q5 H1 M: Z- Z
    / v2 Y" U% [! D0 m/ Eusername=”aa”' O9 v( A+ U# d2 j
    9 G% m; p# N6 E# `8 |
    password=”aa”9 B8 g/ x; a. W* p) W
    . e& ]/ i( e+ }# l( A1 H* N
    maxActive=”50″
    . U6 V  C) ]: w3 d& ~$ `" t# f% S0 d, j
    maxIdle=”10″
      i0 L# W, i) b  ~) M$ }3 @" M; g
    maxWait=”-1″
    ; b5 f5 i# Y- A4 c* V# p  k8 b4 x8 [
    />
    : c8 G( a2 R' p; l" S, a6 {+ R2 a( j  C
    2.sqlserver
    . s+ J/ l! p6 a& K
    ! L0 J; m+ w: `$ `1 R3 w' Y<Resource name=”jdbc/webpage” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
    " }1 M' Q- u2 w% M+ d
    4 i$ C+ e( r0 Y% S; ]% W" {        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”. |& ?9 R; b: B0 v5 {8 E+ X# c$ Z4 ]

    " k# J7 \8 O/ C- e0 {url=”jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;
    " h4 q  [! A# m3 y" L
    6 H6 x0 R( N; D% {DatabaseName=webpagetest”
    ' W/ u% @! X% S2 i/ x; y; b& |1 E/ x8 j
    driverClassName=”net.sourceforge.jtds.jdbc.Driver”' x: B+ K. h' {2 I! R2 x& F2 w
    ' d7 P8 J6 j4 {( `5 o; [0 x# V
    username=”aa”
    - p$ [( I- I( ?( s) p: f" E: N1 H/ K  T% D5 D; e' |( r8 ]& ~
    password=”aa”7 {' E4 u/ L5 y+ u2 v/ }( Z  Q

    4 }6 q( Z: `3 j6 u, O7 H( [; G9 ?maxActive=”50″" {+ g( I" p+ P1 I0 w
    / [0 x9 U, @: v3 H
    maxIdle=”10″( V4 F" h: c  `2 |$ @. x, g

    # E( v% Y! [! b' y9 J, y+ fmaxWait=”-1″& T; t- q" M% q
    ; i, Y9 P: d6 p2 ^
    /># c! j  j* c( |" m. H! d

    % C4 `! J3 T' K( i2、配置自己的web应用的xml文件6 ^1 F) k, O* D
    7 s$ C% z- r# |7 |% A6 u  ?  F9 G

    ; g1 u1 j/ Q. v) _* u
    6 m" C& A0 ^, z/ ~) p6 ^<Context path=”/eb03web” docBase=”F:/workweb/eb03web”: q2 B' S" g( q2 u) S% \3 a

    , Z+ m% o0 c; Q! ~. Z" d, ^privileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>
    % u) T. _' ~" f( U# Y% ]
    $ X0 Z* \4 I7 g, }<ResourceLink global=”jdbc/company” name=”jdbc/company” type=”javax.sql.DataSource”/>  o- q. D+ e9 w5 Q! {
    # U" R9 W6 O# x% k7 u
    </Context>
      [, G$ A! Y  G7 ]" D: x3 p6 [1 K4 _9 ^" H5 n8 O

    . r8 _/ Y; i6 `% P/ Y0 c+ o
    , }% b, s/ j2 v1 j3、配置web.xml文件! Z9 d. C3 K& f

    , u! }/ G0 }! L8 m与服务器建立连接
    2 {$ e& T. M5 [" V4 B9 X" B' M* g5 O+ U
    <resource-ref>4 B0 Z) `( {3 E0 J5 U  r
    - a5 y3 S+ V- I" b+ R0 Y
    <res-ref-name>jdbc/company</res-ref-name>
    # j# |# F) b* C4 {6 g. X! v9 a. q4 Y( q4 D" d+ P- r2 @& @
    <res-type>javax.sql.DataSource</res-type>
    " E. ]  a1 |) x! Y6 L- ]! [4 B6 g! `7 v) M: E
    <res-auth>Container</res-auth>
    * n2 H' g0 M2 V0 G. m" J. F/ L  q5 F5 |$ i* H! ?) ]
    </resource-ref>5 V* \+ h7 U/ R: V4 i' @# H; ^
    0 r9 J( `* S9 N, J2 |. W
    4、在应用程序中不直接与数据库连接,通过DataSource连接池建立连接
    $ A/ V6 F7 O- b% P9 q- A( m
    0 D6 S$ Z4 h( X, I, w, [//1.在程序单独用时设置系统的属性,在tomcat下可以不用配置,/ H5 U0 H' L  A7 _2 F4 L2 v5 |6 f

    - k" K/ @5 f" n& r. I) o9 qSystem.setProperty(Context.PROVIDER_URL,””);
    7 @/ w. R3 ]* E* _+ j
    3 v* T% L) e* BSystem.setProperty(Context.INITIAL_CONTEXT_FACTORY,””);
    : }" D+ T, e9 P! t$ m3 l0 t/ h! |' @- t
    //2.创建一个上下文对象8 w% R& {5 q' m( E) B. e* }" j. P

    ' E1 ?- x' s3 h" O* KInitialContext context = new InitialContext();
    ; a3 r) U' Z! l' w
    5 J# f# c1 p$ e6 f//3.通过上下文对象在连接池中查找DataSource
    ' x9 a- N% S- L; ]+ K
    ' e: J3 S& m9 ^& vDataSource ds = (DataSource)context.lookUp(“java:comp/env/jdbc/company”);) c" e4 h0 S! U+ }) V5 j: d
    + V6 ^% Z4 t% y& Q+ b; G/ Q# z
    //4.通过数据源建立连接  ~, |4 P  B" m& b) h: k

    % R( J" T4 s% q' a3 S8 C4 U5 \+ @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 h% T( K5 g3 ]* K
    (Object Relation Mapping)
    * @5 C; @$ x4 i
    - b% l- z; ^1 P8 B/ I: H一、映射的特点# R3 d4 S& p$ ^; D" R# Y2 U

      f  G1 }  {$ ~1.一个对象可以对应多个表; V# C8 J+ [) L7 S/ r1 K
    * Y1 F/ H. }1 H4 Q# d
    2.一个表可以对应多个对象+ j9 v, Y* z' d3 o

    " R/ ~: q; d' U/ V3 [5 S! F2 H0 R& R3.对象和表的关系不用完全对应
    8 w9 s2 ~8 [2 ?0 I+ e$ H& O+ ~+ [8 q) T" m/ f5 \0 y$ L
    4.对象的属性的名称和表字段的名称可以不同5 L' W7 ^8 R* c9 q" V/ x

    0 n3 a8 z6 r+ Z2 E. O- q( U5.类型可以不同,但数据类型之间可以转换
    % m+ y( B* y1 A" C, h% F/ d: Z  A( X4 q) ~/ \
    6.对象中必须有主键,数据库的表对主键无所谓
    # T5 B3 h. R( k& B4 I0 f6 r# d, z' F, f! R4 a; \' [
    7.数据库中有主外键关系时,对象中可以有,也可以没有
    * E. `' S6 |& r% ?. ]% v! [, t8 Y+ n
    % [9 ^# D$ s# [, p
    . [, H, o. J4 x. n$ P" Z! z
    二 、有一个映射的描述文件————>xml
    7 c  _$ s% E9 W1 L! [. K
    ! r2 @: n  i# M0 d5 w" `5 R- a! u5 z三 、怎样实现描述文件————>一段程序# E3 ]$ U" [( L1 v6 a
    % w$ o; ^( J/ d- h" \
    对象 映射(mapping) 数据库' j$ g# [5 `3 ?+ Q

    . W3 P6 y/ }+ K! d; R: Vuser: Y6 X- W3 A$ r5 Y- ?* K  f' e

    ( \3 B& n9 v/ c; k+ Mid=11
    & H1 z" M& O( _$ s: M! q6 b& G- a/ }0 H* r  ?6 X6 }8 H" V
    name=”张三”———— > (1) —————> tbl_user(id,name,age,tel,address)2 T" X) Y8 S. e1 A* z

    / E+ p4 P4 B6 T! j6 ?age=25 <————(2) <————+ A  y; ^7 R0 V, ^  \

    4 }, g2 S' U4 w  ]
    # \9 n  s8 M% C5 J5 V7 Z) ?9 C$ m1 z) k, ]" J: S$ l+ R$ z
    (1)从对象映射到数据库& W4 Q" @* U+ W3 \$ ]8 V! d

    1 k3 D$ T( T+ `+ Q: L8 q  V- m8 T1.JDBC6 U1 S; H" r8 F4 v& e& t

    3 G/ n& v4 B  N; Y2.根据描述文件来动态拼接sql
    , }( ~, j! E0 E3 g0 e6 `. t4 b% m$ s
    3.执行,添加到数据库中
    " u6 t( e/ r2 w# T" ?+ u8 t( n0 Y0 [5 Z  w

      Y6 W- }$ q8 @6 B, e* S' c  w1 u! X8 J. p8 u# w
    (2)从数据库中映射到对象
    # N% f- Q" B& x+ p1 d2 r5 ?( J4 T! t0 n( R, ~1 m2 N
    1.JDBC
    ! {/ s0 F* }5 Q6 K6 c
    9 t5 F$ B  J1 N8 v2.拼接查询sql
    ( w' d* w2 J6 O' v2 W: \; b2 o) A0 {' p3 K0 v" ]' d. d1 s3 U
    3.ResultSet5 ~, l7 ?; e' v% @2 p$ O& ]

    ) A& s" s& y; {8 a$ P0 Y2 t* |4.Model
    " ?) r& A: n" J
    5 W+ c& j0 i4 X: R
    4 h' Z& V. f% k/ C+ u
    & w2 q8 G, F; |% c5 d& Q' @/ ghibernate. D7 Y; e# i" B8 M
    开发流程:/ v% y) M% t8 z0 m0 L
    % I% b( S* Y# W# \, j
    是什么?
    ) j# U4 e) U/ H# Q# nhibernate是一种基于orm 的轻量级的框架
    ) b/ x  i! h' ^- j) x, e2 A! t# F$ {, E) l9 I0 o, u7 i

    7 Z2 a8 D$ ]6 C0 b3 ]  B: Q! V' @0 g* C: C& f, \, v( O
    有什么?
    / \/ N" ~, a! }7 E1. session 保持连接状态(依赖事务和连接池)
    - x, i' R4 Z$ G- k4 c
    6 l$ L% S) h- p# s% ]% K2. Transaction事务: G- c7 m. R+ g# h

    . f% c3 M9 X1 I0 S$ U3.0 O4 ^6 H) V! V$ K4 e6 J) r+ B5 j( u
    Connection Provider 连接池
    2 W, u9 M' D9 G! L" I  V; c$ T( ]5 o) ^* D0 [
    % ?. {" ~3 ^8 w
    1 u+ H3 A- x+ u* ?% {6 Z
    能干什么?
    6 H9 n4 Z& t8 _0 M3 a3 N1.orm
    : u3 d. r) W0 i. R- x7 r
    5 U6 K6 a6 {8 B2.提供操作数据库的接口,简化数据持久化的编程任务
    * a1 H/ b: X3 O! Y) G! V
    2 `1 F* X; f0 x! E9 S $ ^0 B0 X+ K8 k) t

    ) Y5 x% j  s' y; j' w6 ?怎么做?/ X" k, _0 i' Q) T5 U
    1.搭建hibernate的运行环境,将hibernate的包和hibernate所需要的包拷贝到lib 文件夹下! U# W" G9 c" i( A5 i3 t
    " [" B6 s, S' v6 w0 d. g  G
    2.O(vo)
    2 v2 H0 ~( f  G
    ' n' `1 K4 @) {* H! ^3.R (关系型数据库中的表)4 o" E0 b$ z3 a* ?
    ( Q8 q( C! g' I" N5 H( w4 v
    4.配置文件
    ' r& `$ q! a6 X. Z) w) u8 u. t
    1 ?8 \3 \: G; v; N5 G2 P- h4.1 cfg.xml 放在classes根目录下,默认名字为hibernate.cfg.xml
      q/ i) l5 e1 _0 T) N
    ( W. X% Y7 m; f, e- ?a.与数据库的连接. U# S8 E7 O' p) Z- _

    ( @8 I. e: a  e$ F" s* E! vb.可选配置
    & T& q  r; g/ F( P
    % r6 h, D% i9 a  a' j4 I3 [c.映射资源的注册
    , U- i! x1 S( H7 q- }8 {
    9 w* t% J0 ?8 B* @4.2 hbm.xml文件 名字与类名相同 并且与类放在一起  x: [- m2 |/ I1 G
    3 V+ e' N3 ^, R4 _
    a. 对象与数据库表之间的映射
    / s1 q5 c( `( I& m5 U5 s
    0 C2 L& H7 q3 Rb. 对象的属性与数据库表的字段之间的映射1 n: K% H4 T2 \$ a

    ) K. q3 M! f5 o+ sc.组件之间的映射
    / s7 O4 y* D4 X; t) f! n
    6 g! O6 L: T3 N, L* ]! R. Gd.对象与对象之间的关系映射
    9 P+ c8 m6 z9 l; a# p- y# E: H9 q4 }( v% L. j
    5、客户端6 i# p4 l% Y# Y1 e: Z
    2 m6 h6 o7 G5 F0 k+ M
    1.得到SessionFactory
    ) Q$ M2 {! o8 @* _
    . v& X. h+ H% _7 R, X8 Z8 ]: U2.通过SessionFactory 工厂来创建Session实例
    1 }; z. {# y4 H5 q$ M
    ' A( N7 E5 s5 |+ _7 s' e, ~9 n# L3.打开事务
    : y' W7 I5 p- P2 [& u
    " t1 z6 ]0 @" n7 j4 n4.操作数据库3 v$ V( h" x+ M+ P7 l
    " @- c) c; ]* Z  R  G& K& W' R
    5.事务提交
    3 O3 n; C, t! u5 U/ D1 g
    + d0 h# M$ U% l5 f: C4 g3 {6.关闭连接
    1 R6 T# a9 U8 A* \% p) ], p2 I- z  p0 G+ h
    运行流程:
    2 y# @% r2 C- b
    ! ?. J& M/ y7 }" k1 _; ?整体流程
    & [1 Y, }7 G/ q) k8 N" B1.通过configuration来读cfg.xml文件$ _) t) k0 ]& `

    6 O) }3 T' I' t2 K, n' v5 C2.得到SessionFactory 工厂(根据数据库的连接来创建sessionfactory)! i/ f3 ~% a5 G, d4 D
    7 g# L0 S; I3 r; ?) K
    3.通过SessionFactory 工厂来创建Session实例
      v8 |0 R6 z1 c3 f
    0 p. U/ P) N5 o- A/ ^$ k/ Y4.打开事务
    & {( U; e% ?& c3 g. s+ V0 ^7 C
    5 V* _- O! Y8 T5.通过session的api操作数据库
    5 r% I; [5 z( L+ y
    6 F  I% i1 T, u5 Z3 u; u4 D6.事务提交
    5 h* d5 W; U. i$ J+ o7 l
    9 B  q" K3 ]: l7.关闭连接
    ! B* T& t) [7 @. `7 {$ ^7 y. Z5 L) I" F4 K& x
    5 h( ^; I# B/ s# E0 |, I
    / g2 r$ t; c  B* y; S+ W3 ^$ Z
    save
    % {3 @  O) @) D) n; _1.to—>po; \, ^9 m; O2 u0 }# p

    5 H; O( u* R: O0 \9 v6 S' z7 v2 j- b2.根据model和cfg.xml中映射文件的注册来找到hbm.xml文件  {' ?: O& ~# t% i
    * c. @4 H, ]% m4 Y. G2 [. v
    3.根据hbm.xml文件和model来动态的拼sql
    ! w5 c4 \. _/ t0 @" d/ n2 Y/ D- a2 W; ^
    4.客户端提交或者刷新内存
    ; s' |) j5 y* L3 ^9 P1 j$ E8 n% w1 j/ Y5 ~
    5.执行sql,值放到数据库; W/ j& X1 O, m6 H5 |
    ) L' w+ H, ~) Z) Y5 K: A/ J3 I
    # R3 V( I  ?/ g- f# Y2 ?

    9 S7 t& ?0 Y! P7 I8 E" r  v4 pupdate、delete
    9 e. Y) ~7 O# ?. _0 @7 t1.根据model 的id在内存hibernate的缓存中查找该对象3 |9 a# m! L3 Q! }" H# {3 s7 X$ j5 q
    ! I3 F/ N: U: v' M6 x
    如果内存中没有就到数据库中查找来保证对象的存在; W: m+ E1 V# G9 a% [& H% L7 g& k) a
    9 k5 ^& E0 G- G
    2.根据model和cfg.xml文件中映射文件的注册来找到hbm.xml文件
    ' h( ]  p. Y/ i; ]/ s( z1 u8 ~. }" `7 A
    3.根据model和hbm.xml 文件来动态拼sql& t$ K/ [# J' \9 I1 b. Z
    / @$ B$ f9 n7 e3 _4 s
    4.客户端提交或者刷新内存
    : B; Q& `1 i3 ]& |& t9 {9 w1 _/ r! B1 |" p, w
    5.执行sql: |4 L' |6 u- m0 {

    / H3 u! d& b. M5 @' e! @ + J! x) p4 g. {) H

    ' u0 M9 i7 y  w5 p& X  }" NQuery
    * M* o) i& _* c* }( T8 M3 D3 tload
    + A+ ?8 K) L7 Q, E2 d9 W, |
    * s0 E. l, H1 m0 V9 a6 E. {$ C1.根据model的类型来找到hbm.xml文件8 j3 [1 K  a) D" p) a1 f- C

    5 e/ c9 S7 z& m$ y$ X2.判断id对应的对象在缓存中是否存在,如果存在,就直接使用,如果不存在就进行下一步。
    + E" z) c3 g  e6 ^" k- t! I. }$ {6 B3 {' W' F
    3.用id做为查询条件来动态拼sql
    + d" k  w: i2 K8 C
    2 t- m( S1 S! D4.执行sql 查询(先在内存中查找,如果没有找到(会抛出例外),就去数据库中查找)
    " X! G9 W5 D1 i  i' K+ D% L
    0 Z- X/ }$ t& V/ h2 F4 {" z3 C5.返回一个model类型的对象
    6 ^6 t, L  @) T
    + F8 k2 W4 Y& D8 xget
    4 e9 @+ U5 o# B
    ' T2 ?! z0 P* B9 S- x6 @  y, s    1.根据model的类型来找到hbm.xml文件
    ( O# t& q% Q. |  y5 Q# b3 X% t& |$ H3 \
    2.用id做为查询条件来动态拼sql' z1 N$ J  {4 {: n5 r4 O- h3 b

    7 D7 }" [/ S2 P* l5 \3.执行sql 直接在数据库中查找,如果没有查到就会返回null" `) B, V5 G+ G' x
    1 W' o, Y2 O6 ~1 m& ~7 B; q
    query; h( ^3 t+ V1 `% y
    ; x& F& u' o2 _9 B5 P! @
    1.分析hql语句,得到model的类型* N' h$ ^( ^. J
    8 q4 s. i: _# E3 ~4 x! }" o5 l
    2.根据moedel和cfg.xml文件中映射文件的注册找到hbm.xml文件0 U9 |; W; o% a: \: L7 u9 Z/ v

    1 `6 M" d$ z; l' J+ ]: J3.根据model和hbm.xml文件来动态拼sql
    ' }! ~" _  N3 T" x' |
    ! f# L: b6 l& k$ Z3 [$ P3 }- m. Z/ M4.执行sql查询数据库% G% [- P9 r- a/ J3 D( L1 @0 e
    8 G7 E" Z2 U% N* ^" }7 s
    5.返回一个resultset
    ! q+ o7 ~, q: j  p3 w
    * A- z4 T% U* [5 a( m. Z6.循环resultset的值,放到model中在放到集合(List)中( O' `& L  b! j" ]! l2 Y( P

    7 p0 S3 n7 g. F" @& B# }
    : y  `0 O' ~) O0 z
    / n1 j& k& d8 R谈谈hibernate缓存机制
    1 t& w5 K3 q. ~" f# B; p+ Q) D7 t+ ?9 H8 P' D2 {" U8 A  O
    缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了。打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去数据库中取,也省了很多事。* e- W6 \. ?: ^! m* ^4 x
    ( u; X8 f2 M/ r# _- l6 r: g+ E

    ! K" m' F/ H6 v7 q" @- J( {
    . m3 R4 H. \: r; Z$ n* \6 l& l6 Whibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。, ~* ~, K* w' ]! R/ e0 B

    " T. M: T8 u8 F 2 a7 ?+ c4 E3 @7 u0 K

    ; q) \5 N' s; z: v1 l% q: q对一级缓存中的session事务进行数据的预存取,数据在各个session的上下文中存在(单例),当session关闭时,就是session.close( ),整个所有session范围内的数据全部清空;二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二级缓存只有一个区域 ,画个图比较容易理解。8 {& G: U5 @$ V* D$ K% z4 W; i
    3 j) j! E6 k, {8 W( c
    9 Z, V( Y3 R( O

    & }' V2 J9 J4 G+ M# h5 S| 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|0 k6 P, L2 A/ i6 n7 A  X
    ; Z; g: o- Q# F8 A5 V- [9 @
    | | | |2 H+ T+ M5 G8 o: a3 s
    + {& w* s. `, q+ b/ l% e
    | | | |0 L- ^5 ^$ c( ^- J4 d: P3 |0 w5 X

    4 s1 \# y$ Z9 |$ `& M—————————————————————————————————& Y2 c- M: h! s

    4 q) |$ C0 q. t! nsessionFactroy级别的二级缓存8 ~2 B, Q' t9 T4 N$ ^9 j
    : W- q7 {" H5 Z' `
    ——————————————————————————————————————-* X4 T% M7 {( i, y" n  B$ z. C
    . q* j5 a, W% C$ K/ }' v0 V5 `
    |
    & z: y2 v; |# g! K! [; X8 Q: u% d+ |# R, X- h7 C/ u# i
    |
    9 e' y" O. a, r+ u4 A& L; L  j4 e! a, y3 c/ E1 R
    |& H& Q8 w* |- j: y
    $ z" [! Z# d& X- [4 @
    ——————————————————————————————————————" _$ C) L% |$ B3 f+ v+ O
    ! Q" o) p6 P& L$ E
    DB
    7 t8 b9 n  P0 p6 A
    1 J  o) j! J3 p. C/ h—————————————————————————————————————–+ N$ u- L& I2 q$ f. ~6 p

    / |; A! Y8 D6 Q! D
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    16#
    发表于 2014-12-03 12:48:12 |只看该作者
    Spring3 v8 B' Y4 ?& v. T
    • 是什么?" |+ g) M% b9 c/ e5 m; J# F% ]: t, _9 J

      5 ]" }6 ~# k% m

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

    - o$ W- l1 b) W# g( b& |. f$ z
    • 有什么?3 ]! j, Q5 ^5 |% A

      ; i/ ]/ P7 t) O- C) A5 Z7 q5 H; O
    & c  u( }* V2 b5 C4 s2 y! H

    每个包的功能:

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

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

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

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

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

    AOP :面向切面编成

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

    ) S$ C" Q  Z* ~8 x. d
    • 能干什么?
      ( k" |# \! [7 r. ?1 M  Z0 M6 d

      ; d5 j7 m! P; E- s# ^

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

    1 \9 e( R3 @- a- B
    • 怎么用?
      / o3 _1 P" S: |1 v" W
      ( R! v# v2 H- s' X. n
      • 搭建web工程,引入spring的jar包' l$ I$ M. f) ]. o' f/ M0 c' B
      • 在web.xml中添加如下配置
        7 p2 H" Q  m/ D+ a0 Z& I1 V" v

        & l3 K& Z: g( f, |
      * q8 q1 c4 V4 [6 U0 F5 ^; C% O, q

      / A! T1 U4 y" @! Z9 K

                contextConfigLocation; o8 w) j8 e3 D# t

                classpath*:applicationContext*.xml( v, c; @0 T' e' j3 C

       
    4 G# h2 J' S- J( n1 P& x  B

            6 Y* P, t4 i2 N. x

                struts2( L) e+ ~5 e$ Q5 I# C

                
    5 c2 i! X5 V+ t- f" U! @

                    org.apache.struts2.dispatcher.FilterDispatcher
    + y, C7 H( J* x$ [1 l

                8 A& W0 ~0 e* k: ?+ Z

            
    $ G2 \% {4 p" t

            
    9 j+ |& \: u% r6 c8 d( i0 k& {

                struts2) f7 S5 F, z9 v: \" S" o

                /*
      W) Z* {) B  D- K. ]9 R


    6 |! x) g3 M0 V) i& Q

    6 |0 X8 C) ^2 s8 g

                
    ( f; x2 B7 q5 }0 m: K: e& T" L

                    org.springframework.web.context.ContextLoaderListener3 D/ l2 j. R4 R$ D+ L4 {) g; x  [

                
    ( ]* G2 v2 `9 B. @8 k2 j( O$ H

            

    • 部署
      / C) \. \4 {2 g. g- D  A! K. U

      2 U+ ?* @7 ]( ~9 o: r. I
    % c% Z8 x- t/ V+ s% X5 n3 }
    $ n  g0 i5 U0 s0 e8 R  L

      g' q4 s/ j- A
    • 容器和bean9 g& h$ Q& i! s5 T

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

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

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

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

    # W8 }9 [# A8 ^' g9 m3 X9 P
    • IOC控制反转* x7 q5 F% f9 D
      2 p, |3 U) k0 r( E
      ; g: m7 a+ V' Z: M$ t8 V1 |7 H

      7 G/ w4 ~% e( z  h9 r5 b( v  ~
      从前的应用程序想要得到A的实例他会直接主动的去拿,当用了sping后,应用程序由主动的去取变成被动的等待,由spring来控制应用程序所需要的对象
      ! `" l+ T7 ?/ G
      • IOC的优点
        * ~) e8 P, {6 t
      1.可以通过IOC来获得实例
      2.可以通过DI来获取注入的资源
      • 配置IOC的原则) K, }4 g) H) Z5 C% r0 H; N1 O9 i* J  L
        • 一定是可变的资源才采用依赖注入
        • 一定是层间的接口或者是模块之间的相互调用才采用依赖注入% Y" m1 P6 B) O) h# F

    ; k+ s1 G. Y6 a. P' j9 t
    • DI依赖注入
      7 U. R) K- P! Q, F

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

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

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

    例如:

    在配置文件中

    ) k& |$ w& l' V: }
    # `* p3 |- {* a8 t( t

      l6 ^# W* R) N. v. V9 X

    在应用程序中

    Public DBDAO dao ;

    Public void setDao(DBDAO dao){

    This.dao = dao;

    }

    3.构造器注入

    9 m5 p5 a4 |& z  g4 w

    4.ref 表示参照其它的bean

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

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

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

    6.lookup注入

    7.singleton

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

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

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

    8.DI的优点:

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

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

    $ H; N/ k; d& g  I+ g
    • Aop面向切面编程2 M/ W4 g. u7 A
      ; d1 l( q8 t8 @  w

    1.AOP面向切面编程 一些较好的模式或者是示例—-范式8 b, U' `) g! P

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

    2.AOP的思想: 主动—->被动(追加功能)
    " X, _& J5 |+ g  U  S! l

    3.AOP 的概念$ a* E) J7 Z' K. \

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

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

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

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

    5.引入 :扩展的功能

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

    7.aop代理 :实现机制

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

    4.AOP的事件机制
    - x' Z* c$ I+ J! J' e1 m0 J

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

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

    3.找到切入点

    4.确定连接点

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

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


      ~) u2 I2 D, l% T
    % t  N! \. w. J7 S
    4 w) S0 ~! V, l3 z; i, `8 ^
    * g9 G' h4 |  c$ L0 `! k0 c8 Q2 g- W; ?! @% S' c* @
    8 ^& O' a* l& f! C

    3 c& F' a% `8 C) D

    5. AspectJ2 w8 |; c  C$ g

    5.1.在xml中配置比较烦琐' g6 D  d) F/ @- s- i5 y1 Q

    所有的入口必须从一个代理(ProxyFactoryBean)开始
    ; \; y- b+ k! o  w7 i2 M) I


    1 X) f5 @$ Y& s0 C. Z1 h
    8 e5 U, h2 z1 \+ v9 |

             
    ; g0 k# V; I% i- S3 ?  j" n
    % q; F+ ]8 E2 g3 b/ p1 I% X5 n( F7 }, l0 Y5 Z% e1 k4 X! I, @
             
    * k, y# W! e# p

            & K3 |$ d/ s% m  o. b$ {7 H

            


      _0 M/ u, T# Z* |expression=“execution(* com.javakc.aop.MyTarget.t*())”/>
    . U! P- L! I# q/ S

            ' v5 @! ]8 a4 h+ H% q2 T5 F% F

            
    $ v# Y: r& z4 {; t7 `- q' f, G

       
    # v5 ]+ H6 _: x1 \3 ~% E


    % @* s' I1 Z7 H9 c! I* |" n, f
    % }; m# v8 x! E7 W

    5.3.使用注解的方法相对简单: |! {6 a" T5 X2 p

    @AspectJ的基本语法1 g" z3 C5 q, S  y' v7 X1 k% Q

    1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面
    ! u' L7 \9 |0 r6 F7 D1 g! g

    直接在类上定义@Aspect
    * ^# R6 }# X( M" P

    2.@Pointcut声明切入点
      \  u5 g9 D0 K( F3 W8 i$ j6 B% s

    2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字
    " F2 q3 Y! O* J' V! b" O2 v

    2.2、可以使用匿名的pointcut4 J1 r9 K2 I) q9 h1 T: i

    2.3、执行切点的几种方法
    4 P# M( a# u, r. c/ ~

    2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法
    9 f7 M! F9 H, \( @

    2.3.2 within 指定到包,不能指定到类
    8 L( p4 k# E, B

    within(”com.javakc.spring..*”)+ I& `2 y# G* F- U

    2.3.3 this 指定到实现接口的所有的实现类
    ( S% e( R! ^) J

    2.3.4 target 指定具体的实现类
    ( D+ s! q6 V1 z9 g8 C  A

    5.4.advice的五种类型的示例
    $ L3 n& y" e4 H* L

        客户端必须从接口走才能得到监控,实现想要追加的功能& s5 I& \; g) q) }; S

    5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)
    / G+ Q3 \7 m: j  b% s

    追加的方法的参数名字一定要与retrning的名字相同
    / |  e5 K% }7 x6 E* S& f1 @

    在注解@AfterReturning中必须加上pointcut和returning两个参数
    2 V( d4 w. M5 y1 A, g" l  W% g7 n

    pointcut指所要监控的目标对象的方法
    - L% X9 c% ~/ U# N) Z! w

    得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配
    / @% w0 M% H# d# y. P, N; |

    完成追加的功能
    ! u1 u* Z( E* b/ W

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用& U3 w, y, I. j5 |/ O9 z' O0 r

    (1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)# I8 W& r4 o! y9 Q; d" O# g

    (2).
    7 c* M  M5 u5 Y3 R3 C4 g  Z

         2.直接引用匿名的pointcut" i9 M: o- d8 @7 t, A0 S  G

         (1).@AfterReturning(“execution(
    6 L, j! c) U+ Z6 h% H" O2 |

    * com.javakc.spring.schemaaop.Api.test4())”)% n/ s. h  w3 \+ j

         (2).@AfterReturning(pointcut=& Q8 V* u5 h* s1 ]5 O$ Y2 u

    “com.javakc.spring.schemaaop.TestPointcut.t4() &&) U* b/ C9 F# e) D

    args(str)”, returning=”retVal”)
    ( E+ X( V3 [$ M5 p7 [3 n* B

    @AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)7 X6 |" `! {! ~2 _  u* w

    public void testAfterReturning(String str,Object retVal){# u  [4 k. ^9 b' _9 _; N: F4 ~

        System.out.println(“afterReturning1=>”+retVal+”=>”+str);  x+ c2 ^5 s  ~$ p+ E

        }
    $ i' K+ `( i0 }

    5.4.2.@Aronud
    $ `1 d: f2 r9 u( e, `

         注解@Around环绕追加功能;; w: D; b; k- n/ j0 g5 @

         在执行目标对象的方法的前、后追加功能;
    ( F; j' o, m- t/ U0 {

         必须有参数;第一个参数的类型必须为ProceedingJoinPoint;
    $ Z4 w) s8 _( A1 `0 N

         通过ProceedingJoinPoint的实例的proceed来调用所监控的2 I4 x' c$ }- L- I' \

    目标对象的方法
    : u) X+ m8 j* d3 o0 q8 y

         1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    ' W2 s" y! y: @

         (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)2 t) }9 C  S  M# F. h' R

         (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()
    0 n5 O! T. Y; H3 Y9 Z

    && args(str)”)
    ! g4 z0 N, O  S4 ]% u8 b

    2.直接引用匿名的pointcut
    ( s2 T% ^8 I- g- Y

         (1).@Around(“execution(8 W& N8 k5 }# \

    * com.javakc.spring.schemaaop.Api.test1())”)
    ) v6 d/ L9 m- c8 c) k1 e

         (2).@Around(“execution(
    2 [9 h, F6 @6 q

    * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)6 n6 V6 Y1 [8 Z. L, R) p

    // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    : z. J3 u( V( x9 m) f5 j% V

         @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    5 y/ l. S  u- L9 r+ `

    public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{! ]# m6 x$ n8 S: x/ \9 `

        System.out.println(“around1==========before1pointcut==>”+str)
    5 `; v6 g2 o( P. K. h. C' p4 W

            Object obj = prj.proceed();! D+ Y4 s2 H' T6 d6 E

            System.out.println(“around1==========after1pointcut==>”+str);# j7 K* |4 r2 f7 c# }, g; w

        }% r# y% m6 c  J+ y. u3 f

    5.4.3.@Before' G4 K8 |; e/ s/ g

    注解@Before在执行目标对象的方法前追加相应的功能
    / v2 \+ _# X. g2 F$ w3 F( i* C" u0 d

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    % j/ @- y) p* B9 F0 e, D/ ]) n

    (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)( i) E* T, H2 a4 Z2 R

    (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)' E+ J% l1 @; [" u1 A, n

    注意args后的名称与参数名相同
    % x+ \+ `$ ?$ P* w; L

    2.直接引用匿名的pointcut
    ( W4 \& Y7 Z; i- G

    (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)# O" f, G) X6 I! {. I9 `

    (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    * g7 N! c; R: f2 C

    注意args后的名称与参数名相同
    4 Z2 G. r' }, a

    // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)8 D0 M% b9 R  I! q; y, C

    @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”): @: h& q* s/ O7 k  g5 O

    public void testBeforeParam(String str){% D( i  }( f/ U' b' K, b

        System.out.println(“before1=param=>”+str);
    # U, E' U. k- {! ?" k

    }
    $ J# K( j. |8 P& m7 R

    / f9 z3 t: c* P' I; j3 }2 y

    5.4.4.@After4 ~* [+ F5 b2 l+ L

    注解@After在执行目标对象的方法后追加相应的功能1 d+ C7 \' x% y( r0 a- b

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用7 O  ^2 J' a7 p

         (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    + |% H5 i6 {6 Y" @0 Q

         2.直接引用匿名的pointcut6 \+ W& g" |1 q+ }5 ~* c+ N7 I

         (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)% R8 T( \$ g1 t( q

    @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)! _# S  j% K) I2 Q

        public void testAfter(){$ Y: \; k  Q. s/ N2 I4 b& \8 @0 \

        System.out.println(“after1== >pointcut”);
    - C7 c4 H" F, y: `6 d; Z" f

        }
    & N" l% L, v; E- X( v

    5.4.5.@AfterThorwing
    7 ^4 X9 `2 T6 G( t

    & b5 a  k8 p3 O, k. j& s

    . k$ c* Q1 J; H0 t2 b! W- M1 k, K
    • 描述一下spring中BeanFactory和ApplicationContext的差别
      7 H/ n' J& W+ }$ O8 k: v
        Z, y- I/ K/ ~' _) _3 l

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


    / E4 q9 h: j/ `1 x' R1 c2 z' }
    • 谈谈spring对DAO的支持
      $ Z/ P# J' [: V) l, A% |0 @
      2 C7 G9 L' k& c, H" d% \

    Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。
    * A  H5 n7 s) u$ ?3 H9 b8 k

    简化 DAO 组件的开发。' o" d6 ?6 `3 _# S
    Spring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。
    % x# w' i% J, Y

    IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。: b3 w9 |) ^2 Q4 D

    面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。
    . b5 w- z8 N% i  A& ~) {

    方便的事务管理: Spring的声明式事务管理力度是方法级。
    * q/ }' |& o2 ~7 Z$ e4 Y

    异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。0 d2 ^$ l2 c1 x( M1 Q4 O9 ]


    3 H8 d: o) K- _
    : z' H2 Q( g# D+ R* D
    • 谈谈spring对hibernate的支持
      8 q" t& M- M( h; @" T
      : b& X3 C7 u0 g

    在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。
    3 S$ _, m3 D- e1 g0 P# U

    一旦 Hibernate 处于 Spring 的管理下, Hibernate 所需要的基础资源,都由 Spring 提供注入。Hibernate 创建 SessionFactory 必需的 DataSource ,执行持久化必需的 Session 及持久层访问必需的事务控制等,这些原本必须通过代码控制的逻辑,都将由Spring 接管ataSource, SessionFactory, TransactionManager等,都将作为 Spring 容器中的 bean。将这些bean 放在配置文件中管理。3 b  J" k9 n$ I7 U: `9 @( D

    1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:
    ' ~* x) I6 x" t: E8 ^5 v7 p

    : T4 B, x! E9 J* q

            class=“org.apache.commons.dbcp.BasicDataSource”>; ?0 F8 d  q6 K6 `

            " a2 {& _6 v& {- ~9 X

                oracle.jdbc.driver.OracleDriver
    * U5 y! n- G; f" u: X2 i' u2 v

            
    9 V  g' T" `. c

            
    ' z# H( f  z' H0 q; i1 n8 P+ c& y

                jdbcracle:thinlocalhost:1521rcl3 S1 r3 ~4 G$ @/ i. p- H

            ( {/ S4 a$ ]) o- L# E

            
    6 S4 O. T( M* P% K6 ?- d

                javakc2
    $ n# h+ s) j% b' X2 c4 A

            ) U( s2 u  N. @+ Y+ o

            5 Q# y6 t  x* O! U7 l) d

                javakc26 T) I  g0 q5 g

            
    2 R; G7 ?0 x) w" O) J

        ( F! n0 g& Y8 X9 f


    4 ~) }' J; g, f0 a! u3 Q7 A

       

            class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>7 V# a' R& Z) a8 E$ K4 M1 K! s

            
    . |, p" n1 ~' i/ z2 z

            , }! e' S! o) U# N7 R9 a* S& ]3 ~

                7 \; G2 }, @- u0 [/ U% i+ X

                    com/javakc/spring/h3/UserModel.hbm.xml# _4 D7 D1 D2 q( s" s! q

                7 E1 [& w4 f; Z

            
    4 K, d; D2 Y$ g$ ?: _

            1 c3 p' g) Q% V, N$ X

                # i; p! l4 [9 q: A1 X" U

                    hibernate.dialect=org.hibernate.dialect.OracleDialect. U5 k. j0 b  c6 h

                
    4 r; F2 p: C9 M* w) o  J

            
    ! S/ C3 `- d% q& ?6 y4 z$ P

       
    # p1 {( i! k4 H

       
    0 Z5 h) t8 Z% s% F7 h, u

            5 k7 |  \$ Q$ ~

        % H) J# @, ^. ]4 Q9 O

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

       

            class=“org.springframework.jndi.JndiObjectFactoryBean”>
    7 V6 K) f/ r7 \8 @

            
    ' \5 I! `6 q, y- ?. }

                java:comp/env/jdbc/myds
    : D1 q0 B3 o5 N

            ! C7 ?: k1 W5 ?; t. v

       

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

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

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

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

        $ ?; u( Y# M) d* p. G+ h4 b

            8 n- v  _, m& ]( `. @

          n. Z& r. c2 n+ k+ h8 ^9 S


    0 a, U5 T" g: d" a; p1 b8 M, u

       
    0 t9 ~7 _1 a, U8 |

            
    1 F' k! ^  X( W3 H

                
    3 ]  l! k9 h7 g! v

            
    $ g% W( T: U" ^; r8 v

        1 `: m) R( L2 E. q5 z6 ], H6 G


    6 `% @& t2 X% U+ u/ `7 C* [2 E

        4 i: I2 J7 N  ], H# }! c

            
    : v- j' |0 @. C3 e

            7 g3 W. K: p5 j+ P$ N

       
    : ?# a6 F0 D" F* B3 r% @2 G

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

    3 W, G9 f% w9 B& X
    Spring2.0之前事务的写法# s  |0 i: P- U9 c, ^4 u% O( X5 ^& T
    7 w2 l( W' K4 }! Q- U5 D

    + F$ L6 q, g% a% b; W8 v        class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”* v7 h. k% U3 \& d2 m! L

    8 h1 P5 ?6 e2 Y1 A6 l+ r        abstract=”true”>" d0 Y: P, d- I' r  c4 p
    ( p: J- U+ ?6 @3 z' O% C
    6 m" [, _+ i" R* F3 n% e& w
    ' |" H3 d0 g. F+ ~; ~/ f7 J( l6 W: g
    . S0 r. P  o  T% p3 H
                    PROPAGATION_REQUIRED,readOnly4 c( Y* q" Y1 j
    : }6 u+ u9 Y, h3 x) B
                    PROPAGATION_REQUIRED
    , m6 |+ i4 d: f2 X8 r
    ( k) i% l. n8 T
    4 A6 }; g  p2 H% b  j
    + b! A% }: {0 O7 d" z4 i
    1 |! W9 s9 H5 S* b

    & C! [7 e$ q% i  W/ k; V1 Y& ?# S: j. A+ ^& r
    • 谈谈Spring对事务的支持# Y& |2 O* K# n; p( h3 `

      4 P* C! `; p9 Z

    2 N1 W. q6 d1 Q$ M$ I' b
    1、声明式事务管理:

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

    2.做法:

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

    2.2

    2.3 注入数据源

      Q7 Z* j, Q: y# H0 P! @; D- [8 f
    6 d# I9 d) [- o. a2 }

    7 i% P4 x  E1 D  c3 |! b$ c6 y0 I) ^& E% N0 b' E0 [, J8 x  F+ [) x; e
    ) m5 l/ S6 G; l( b2 D0 c
    - M2 J: `  x; K  X! K, s

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


    ( W! o+ w7 Q+ Z# K2 d' E8 s6 b
    ; ^+ i, h! c; o& {( ]# N9 w4 k7 E4 P' M5 {" V5 H

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


    # D+ `- g/ a# K# b; \) C, w4 u$ V# B$ o+ i
    2 e& ^% w$ Z# T) p
    / R0 ^2 Z& \5 t9 D$ A1 \

    1 e! |  O2 H4 F2 E9 G+ ]

    2.6 定义切入点

    3 w# N/ a4 p" b! u8 e+ i* n/ j

    7 b7 o- K; u/ V: }* L9 }9 z% s) _$ c$ E1 ]! ~0 X# v

    0 ]. H0 \8 F$ f4 A, B! m; E, ?$ p' W

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

    1.注解@Transcational

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

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

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


    - h# z6 z7 q# L5 x$ _% u5 H8 Y  v$ D9 c; }6 ^

    如何在Spring中使用Hibernate的事务:5 G5 Y* j9 M, o2 w. R4 S2 w% J


    4 }+ t) c2 S, n7 z; z3 ]; n9 e) Z


    / ^0 u: V4 Y& }0 I0 D5 u' y4 \! [

    & a3 o1 w( Y3 c

    如何在Spring中使用JTA的事务:- O4 E3 V# e1 _& F0 ], z( [

    8 l) p8 a" F/ e8 y4 a- S
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    17#
    发表于 2014-12-03 12:48:32 |只看该作者
    事务
    1 B" S; c* [/ E( x- o( p) EACID! D& {8 r; ^0 F4 u, `
    (1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失败7 D8 @( \4 K6 t4 T6 c9 X

    / l5 q4 K7 i5 s9 f/ ~(2)一致性 :操作的前后满足同样的规则,保持平衡。
    6 r: V7 n4 q* b9 ]1 J( D: ~; q1 n' j, V$ s! C- ^( ^
    (3)隔离性 :在事务运行的过程中。事务内的数据对外的可见性和可操作性(必需由数据库的支持)9 ^0 |" E: d" G+ n0 B, B

    ; t& f' W! `- e4 r: x0 k# R3 s(4)稳定性 :保证数据在事务的操作的过程中不会遭到破坏,而且是永久性存储的* m) E. i7 b3 \) Y

    ! g- ~# }6 s8 {7 e* Q: r  z4 Y - C& h& c3 A+ q3 N1 q/ Z5 c

    $ Y* S  F- ]5 f7 x事务模型
    + K6 F& ~+ \4 V# Q! e(1)经典事务模型又叫平面事务模型(JDBC) 事务不允许嵌套
    & M4 F4 r) U  {& p1 j# V8 s) s$ P7 S' R6 D7 P2 G. h8 g
    (2)嵌套事务模型
    5 M8 O7 Z( ^2 e% ?
    ! [( r" T) I6 L7 F4 g
    * a% o. M" r* t" Q4 e( _
    ) s8 T0 p5 `( ~2 u) R4 j事务的两种方式
    0 W% P$ _7 U5 x0 ^- M2 b' H$ @(1)声明式. H. [6 M/ U$ s/ r& A9 q
    : i$ H, K* M  H
    在配置文件中设置以下6项
    * @- r! b9 A9 i8 q) I) C- c$ Y+ t# e/ |$ T  |
    (1).required0 E# p! L  |* I- ~% ]6 [
    * @% s+ R( N; _' v* M/ M- g
    如果客户端没有事务 在bean中新起一个事务2 [8 a# z; e: d1 |$ Y
    8 @# z6 x; |3 i6 s+ y
    如果客户端有事务bean 中就加进去
    & x+ o1 C) ?& U0 D% L" @8 Y, i
    8 Z+ Z7 ?# p8 W- Y' k3 A7 S- [' N(2)、 requiresNew
    ! M$ t3 v8 A; \4 E( G! I, t
    ) U- o5 J% Z5 ?4 o; I' @1 u! M不管客户端有没有事务服务器段都新起一个事务/ @, `5 D' k( A  d* c9 [# Q1 o  X

    ! d3 j3 U0 e  M- _如果客户端有事务就将事务挂起
    1 Q# e- H. F5 i! C6 H. k. d
    / n5 b( N( X& J(3)、supports
    + z; E' P- v" E% B4 M2 z% h0 a0 \6 L2 T, J- L  [: n. I% H
    如果客户端没有事务服务端也没有事务. o5 a" q5 {( l9 G, ^
    1 ^6 k2 V# r; ^  t, ?* l8 P( J
    如果客户端有事务服务端就加一个事务! X4 U9 y8 @# n( D2 @0 C
    ) x" Y( p! n! y( I( F. ~
    (4)、mandatcry
    4 ^' [- Q, Y" r8 R/ J" y" h4 C
    ; g  x0 o# p: Q- ?; E如果客户端没有事务服务端就会报错
    2 H8 `/ X- ^) E; W6 z% Y0 l) U% a2 @# Y  L
    如果客户端有事务服务端就加事务
    : S" w5 E( D' X6 F5 S! D, ]7 c: f9 n- q/ H: Y' t
    (5)、notSupported: x9 p5 x4 u" `( ~2 }6 Z
    9 U4 M0 P% v+ d% U
    不管客户端有没有事务服务端都没有事务
    ; ]- Y& P* ]& c6 ]! }& D7 a1 @  z8 B6 e$ a) a, A
    如果客户端有事务服务端就挂起
    : t* N1 \/ I7 ~9 C$ u
      S$ K4 L0 U4 x/ T. p- A(6)、never! f; e. r" A3 I  }) T9 C3 v
    ( z9 C; ~6 [3 k0 ]
    不管客户端有没有事务服务端都没有事务
    ( T" `4 ]7 a( q/ J9 L9 x/ j  j% I9 Y+ _
    如果客户端有事务就报错% \8 R* \4 |4 N" C6 i" D
    * G3 ^( i, n) d" l! Y+ I/ N
    (2)编程式事务, }* M3 k+ P7 T: o6 |  G5 I6 W
    # J2 }+ D+ K. h: c( o; g" C  n; x% E
    Javax.transaction.UserTranscation
    4 u: e5 x  }" W& O0 b% L3 [/ s8 m. U5 u# [* l9 `
    JTA 事务可以精确到事务的开始和结束
    : w* @* b4 C. W! I6 m- f! R) d4 U  I; s$ Z

      u- R7 M* Q6 d3 j6 l8 o( H. d+ @  p) v
    事务的隔离性
    3 n  z' u3 V" `# ?- A4 _6 fRead-uncommited* [) u' p# _5 J& B: A0 G3 V0 h9 f

    3 y2 ?  l4 d; ]3 ]" Z& ?6 q1 g读取未提交的数据(基本上没有锁)脏读,存在不当读取的问题。: z7 }. Y4 ^) j& k' |% u8 r2 w/ I& r

    6 ^/ w) F( s9 h2 @& E% VRead-commited) ]# z0 j% o1 ?% O" g

    3 w0 g8 y- m6 P9 a读取已提交的数据(行级锁), h8 r) g) [. m7 f& A9 u4 d
    % d" W) c! y& B5 o" V  o; r
    无法读取已经写入,但没有被提交的数据。
    9 k/ b: ]/ |/ d. X' e
    / B% ~, M( [( }# k- e6 TRepeatable_read# v, b  S- h6 C! C8 E
    . {# x$ H* N" q/ x- S
    读取的数据不允许修改或删除
    3 Y: ]; C' d, N: J. ^
    " h3 T! \  L" N( v, A# O不可重复读(行级锁+不允许修改/删除)# Q3 N9 h5 l4 c& x2 E  ~
    $ O) V! {3 D/ ?4 v! S
    Serializable
    0 \7 A9 c7 @7 Y( t9 n) ^- a& a8 i0 J9 @+ q8 m
    幻影读(表级锁)" X, t6 m9 U9 A2 _7 q4 v

    2 q- h3 ?8 H# ~  x- q* h 3 p5 Z; Y% K0 N# _* h
    . D, M9 b7 K3 b, @
    struts
    1 A3 k+ e7 W- t) U8 n- k' A' k开发流程
    & r2 o% }: I0 y! {+ ~
    $ D2 }( n) j& t# j2 F, b1、创建表单; m2 y. F% j: ?3 v; {! ^
    / n% P' i6 E6 Y
    2、从表单中获得输入
    - _  h8 R4 \: Y& }( s( r( m: d- U# o2 b7 m3 h& l3 U: t8 ?
    3、处理输入(业务逻辑)$ J) f: F4 F2 Z3 g9 G& S8 E. S3 b
    1 S5 t+ J; S+ a1 f
    4、根据动态输入改变输入流
    ) i& l6 A2 j$ J# X, k
    8 t) ?+ @/ H* T' X5 h5 J! ]要完成上述四步,我们需要创建
    ; G/ j& o8 M3 o; o8 w2 U2 @5 @& l0 m2 M. v$ z1 e
    1、一个ActionForm! P$ R3 f5 d& K0 G
    % x! P* D0 m$ B* G
    2、一个action
    ' W  m7 B3 P9 e# X8 v" S' q. E6 v, \+ b; F, V( |& O9 |
    3、一个配置文件struts-config.xml
    ' V: y% W) R+ W. l- u2 h# ^3 c& s: a* z2 {" z. d
    4、创建页面
    ( U8 y, B& w9 n" h( D6 C- ~# Z& D9 C: j3 K  J. v' M
    创建ActionForm
    + _' t, L1 E: w9 S, G( F0 o: J4 `7 u/ P
    1、写一个类继承ActionForm
    , ?& A  T5 V% |* @$ q% z+ J& _6 \' B8 Y$ X# h% W& |7 w7 C% s
    2、私有的属性
    , Z. `6 e5 A0 ~- d( _7 O9 H0 I( {. y$ c
    3、相应的get、set方法
    3 k, y$ O' i! @  A
    ) C9 A' c* V9 i4、重写tostring、equals、hashcode三个方法3 U) L0 v$ i' a# j  i2 }5 D+ j# `

    2 P& m) C# h" u' n" K) c5 q创建action- Z* n0 n2 b8 q7 p8 j
    / D9 w" ?7 c1 h2 c& h2 @( R! H- u
    1、写一个类继承Action
    ; W  G" S+ r: G" P6 {+ x
    : H" ^9 e/ D  J: D7 H9 c! |2、实现一个公有的方法(回调方法)3 |4 y& a7 i5 _

      T2 A. D, J, z' E$ H0 f6 Dpublic ActionForward execute(ActionMapping mapping,
    " B$ H+ q+ D# D/ Z, q
    $ `' Z- P  ~7 ^/ T  EActionForm form,
    9 S2 {! ^. R* W) A1 W  Y5 Y  b6 n; B' u
    HttpServletRequest request,9 x6 E9 Z- Z- ~  v: Y, P8 Y
    : Z' F  e/ C: Z$ p" i) A  U
    HttpServletResponse response)
    ; C. z0 S% e0 J- _- c9 e- W' l, }- i9 Z' L7 I/ h2 v) i$ q
    {! s0 h4 X; Z: G; g3 z. }# \

    : a* }: Q8 K8 h; v/ o6 I//1.收集参数
    ) ^/ T- U; H, J, \. f' l( g
    2 Z* S) s' R$ _9 q) N. j' fMyActionForm myForm = (MyActionForm)form;
    6 D6 d( x5 B0 `: t% n$ O
    : F+ T7 x$ n" u' ?  |//2.组织参数
    % `) R4 b6 e" {' C' |, g0 ^5 L" @. U. N5 @4 v  x* G

    0 Z  K1 {( V( S$ j6 [4 g' g5 k5 L( ?0 v2 F1 X
    //3.调用逻辑层
    ! X( [7 |4 a4 _# E% d% \( r7 T. e; @! x! M+ y4 }( r2 D
    boolean flag = true;
    0 l8 F( R9 |6 o4 `4 e. c/ ?6 w$ d5 q/ q2 A+ ?
    //4.根据返回值来跳转到相应的页面
    1 d% |* _" \" w, m0 |5 R2 a! Y
    % h; e0 ^" `$ E/ q$ P- M  m' CActionForward af = new ActionForward();& i% l) g/ s) _4 ~
    2 u* _6 f/ A; c9 x1 w
    if(flag){" y$ o$ N& L- p

    & }* n- G# M! `9 eaf = mapping.findForward(“1″);
    ( v/ N, P! ?4 D8 Y- k3 L" e7 p+ B9 [7 A! m
    }else{
    % ~0 G. J: h0 F4 I. [0 p
    ( m/ }+ o! b# J1 m3 jaf = mapping.findForward(“2″);
    ) V! Q2 e# R! Q6 A; z7 r- j) [' ~3 r$ V: b' A* \
    }1 N0 E' S( z0 ]+ O3 y- x; s( {

    ' n7 i! [  |" \+ N" H7 D6 breturn af;! w! }, l, M  o! J
    ' U9 Q, L% ^2 B. _
    }6 @- @+ Z) r* v1 v

    , N. X% ]. X6 P7 P- I4 F  a配置struts-config.xml文件. `9 _7 M' G) Q5 x: `* L7 Y

    2 K( E! ?  |! ~6 L6 |! R1.<form-beans>. a4 T3 I& v' E' t
    2 d/ x! g' C' g/ p; E* p% a7 E9 ~6 s
    <form-bean name=”myActionForm” type=”全路径.MyActionForm”/>
    5 ]1 ^1 F/ K4 l8 r- t% g8 I9 b. X, ~6 E" V( Q
    <form-bean /># @  y/ x7 X1 m4 j# x" c# @. ]. V$ T* t3 S
    & U9 W0 ^3 Z& R
    </form-beans>) s& q6 j. F5 g$ @' y9 ^- v
    8 L( H- m" L' y$ h
    2.<action-mappings>
    , S( @, t# U1 n) T& \% D6 W2 P- I) `/ ~5 {1 t
    <action path=”/sll”
    $ [  e/ G1 C1 i0 @* \! e# K5 }' ?- l* G" I# Z5 p' R
    name=”myActionForm”) ~* ~' v) H0 H# R' Z! ?
    ; x3 ]. H$ a2 y$ h) w, b
    type=”全路径.MyAction”
    * z7 {9 N) R  A/ T. B9 Y
    3 H9 i5 q* A' d0 r; T3 vscope=”session”
    3 o2 E$ i; w; e
    " M( d0 ~( c- z" uinput=”错误返回的页面”>, Q- M6 {( T/ {7 l& O( ]6 N& y, J! e

    8 V" J6 ^5 k* J; A( O! Y% |; E<forward name=”1″ path=”/1.jsp”>
    6 R' i9 r0 U7 g  J* D+ e6 q) a$ o" w& x4 z' U
    <forward name=”2″ path=”/2.jsp”>
      b! m6 j7 j5 h+ g6 h7 p2 I4 P( b2 [0 F! _. s$ [" P/ w  h
    </action>8 T; Z, t3 `6 J5 G
    6 }- e8 P. @8 v5 B
    </action-mappings>) d( \5 h/ j5 n# I4 S/ l

    ; h# T4 z2 J6 s2 K9 l# y' ?. l2 o步骤:
    2 H1 R( q+ v6 S) k
    " S+ I3 r+ Z& F1.创建一个空的web应用
    $ V( s, u: {7 T
    0 z9 Y" t  `; l! S2.将struts的包放到lib文件夹下- ]' E& z% j  y
    , {( k1 h6 |: H' a- Z
    3.将.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目录下
    2 p1 y8 f( I' _  v1 q
    1 s& n, ^" }2 U& b3 _4.配置struts-config.xml文件和web.xml文件
    - X0 M% r7 x5 l- ^0 G8 q. ^0 P. ]) N- }0 Q# _3 U9 x6 q5 U3 t
    5.在页面引入tag文件uri* ^, r% y# G9 O4 D6 E$ o) ~

    % E, {5 o- c! B- c( CSTRUTS运行机制. }% b! d! p/ o6 O6 _& y- d& `3 m% n

    % G- j8 L5 m- i4 x  @1、界面点击产生请求, z: `! L! k: x/ ^9 [

    1 ~# A# g: _% e1 ]1 K# U" S2、容器接到请求. y/ Q  M7 P8 ?5 ?8 A8 w- B

    , `" u$ Y2 v6 ~3 J& f% n/ e$ j3、匹配web.xml文件中的*.do来调用ActionServlet. c$ |2 S8 T- [8 ^4 F1 d, i! ~8 a

    " O( ?1 [. [+ W7 x4、ActionServlet的处理: }/ U$ V8 I3 N, f( F2 i
    ! u. K+ S( N, e6 J8 o, ]
    4.1 读struts-congfig.xml文件形成ActionMapping
    + O+ d: b" n! X6 a- r( f- l& X6 c% _2 C4 V
    4.2 通过path 来匹配Action类,通过Action的name属性来匹配ActionForm类
    ' j: Z6 w' x3 S+ g  K* T# z  V4 E/ f) U) N. p/ Q4 p" ~. ?
    4.3 通过反射机制来给Form添数据, e. p/ x4 t0 s8 v" w. D9 p

    ' A( d6 l; s" G% f( t4.4 由ActionServlet转调Action的execute方法7 B3 p2 F! }" m3 R- z+ F- H

    * x2 [0 O- ]$ h0 U2 M+ w4.5 得到execute方法的返回值,跳转页面2 ^9 C# o6 b8 g, h3 O+ E

    # O9 b0 c0 y& w7 O3 U' h4.5.1 RequestDispatcher
    5 S0 G0 R. S6 F  |" R; Z# i" R  a1 q3 q
    4.5.2 response.sendRedirect(“list.jsp”);
    . c$ F$ P* \% M# t% c% O8 T0 L$ |! K8 f* v$ O* o/ D  A) v! C

    ) `# u$ `8 s6 r( C$ C; Y4 r& |
    3 x2 p' l# c1 l5 D进入execute方法2 _5 |8 O! p. ~8 O

    ; c: q: E& T* W8 J+ u" u1 收集参数4 A1 d/ J1 v- _9 h) K) H% x

    ; E6 s# V4 c& t0 Q$ `2 组织参数/ p1 F4 @' a4 q: Q5 p. B4 X2 _
    $ s7 J; L8 L# q5 r
    3 调用,逻辑层
    : ^: B( d  V! X6 L) D
    * V5 p. ]- d. T5 `3 p4 返回值# p' G# x4 M6 ?& v/ @% O

    ) b: \/ _) p1 z4.1 选择下一个页面 (ActionForward)
    . P# |3 q/ S3 U' [% _  `- g1 l+ k
    % X, Y0 V: P9 g) d9 }' I4.2 把值传给下一个页面+ m# r$ O5 b0 m2 k; W

    7 v) j' Z8 f2 i' \ 4 C0 x# A! `0 ]: v

    7 t8 i( l1 Q% c  J比较struts和struts2的不同+ _3 M- t4 f8 Z8 b& ~# S  ^4 ~

    ! e2 v0 h! j# f7 g7 G# vStruts
    ! w. ?2 E" v; D  _& g, w2 q& b) a
    . E1 W4 z/ z+ a* E; T9 {Struts2
    + ]! J! a. S1 @0 _0 x$ u, R, }. `6 z/ C; [& H' C& X
    组成        五个部分:ActionServlet,ActionMapping,AtcionForward,ActionForm,Action        十个部分:AcionContext,FilterDispatcher,ActionMapper,ActionProxy,Configuration Manager,Action Invocation,Interceptot,Action,Result,Taglib, {/ f: @  c3 G8 W! F2 z6 ]
    url        .do        .action
    : U9 ], n# Q1 t" j( ?: d. G' X7 V分发控制        AtcionServlet        FilterDispatcher& j1 l; o+ @$ E3 S1 P
    收集参数        利用JavaBean技术,将数据封装到ActionForm的子类中;
    ! \( }. }' f  B- p  b一个Action对应一个ActionForm的子类4 c1 h5 m' R  H6 X/ E% u/ q

    * a" q* |" e* K' h2 ~使用拦截器将数据封装到值栈中。
    2 e& a0 L" H9 L使用域模型,一个Action对应多个值栈中的Model4 e- n( w8 s* T) ]- G7 m: k

    ! m' K( j& U; V- z# y& n7 q读取配置文件        ActionMapping        Configuration Manager8 s, h% T" v7 b0 X9 N) t
    拦截器        无拦截器        执行Action前后有拦截器' B5 m) i1 h' \! m  q% d; g9 d
    返回页面        将字符串封装到AtcionForward,进行跳转页面        Action中直接返回字符串,通过Result跳转页面  m; I- l( j( r
    页面跳转方式        两种:dispatch,redirect        三种:dispatch,redirect,chain
    # i+ L8 ]# e0 x' u3 J: H8 c! o值栈        无值栈,Action通过在request范围内设置属性,向jsp页面传递数据        有值栈,Action和jsp页面通过值栈传递数据,jsp页面通过OGNL取得值栈中的数据
    3 L4 v- }: Q( J0 b  I配置文件        struts-config.xml        struts.xml0 W5 n% n! ^3 v
    中文问题        不能解决(需要使用filter)        可以解决中文问题:
    , y, G) v; p8 C8 l1、在jsp页面添加Meta;1 l7 W5 y0 i+ E5 f& p  ~8 }

    6 I* _' V/ ]+ ?; v! S7 b2、修改struts.properties中的设置。
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    18#
    发表于 2014-12-03 12:49:03 |只看该作者
    其他开发工具和技术
    ! }3 }& {7 ^1 SAnt
      e" M+ z  F( r% _9 DAnt是基于java的批处理工具7 y! U$ T$ C1 Z8 Z/ S

    3 O" P, E8 }. ~2 {: M4 {3 K. n# X一、配置ant的运行环境: U+ y: j$ F+ T# ]- p

    % D7 }8 J* G! l1.将ant的bin目录添加到path中. V7 l+ q5 @8 y, i, u

    % Y# _: i# g2 H' A4 o9 w& _2 j' T2.配置JAVA_HOME7 G5 }% v( J; @$ S

    5 E: G  {! F. P3.配置ANT_HOME, \; [' J6 c1 D) C8 w
    ! a" S$ b8 z) Z- X" ^
    二、配制build.xml文件,该文件放在应用程序的根目录下
    ( }& C# l9 K9 V0 g) e- y( i7 M3 J: `8 x2 Q3 _7 ?; f9 l7 I
    编译java文件# O/ [& y1 w/ ]- {! i6 O+ }
    - H' q- f4 `4 p  ?, Q
    执行java文件) o) X* |; a, V6 r
    + h, V- o& F+ S* V2 \) i2 l% u
    copy: @7 |8 P# p" A; W; A

    7 `0 o# {) _! ?7 M& s; S, F删除! F2 F0 U3 _+ K2 n) a$ l

    / Z3 K# Q9 d4 n- J: I5 u打jar包
    # L! j( F% n( ?; J0 V
    % [" V8 s& d+ J" i7 S  n0 P根据注解生成配置文件
    & h4 L1 ?8 J9 K8 j7 ?9 k; E2 Y2 ]4 T) ]$ V, v, O& c* `
    Xdoclet
    & }2 T, G. r% y9 G, C: X1 i; I通过注释生成一系列文件的工具(txt、xml、java、html等)
    8 h! j# A/ j" R8 r. W. P
    . B1 f1 d/ V0 r; |, Bxdoclet本质是摸板技术+字符串的替换
    * w& P; L. N( }) d7 d* ~
    / n: t, u, A( C9 C5 A" y1.在java文件中写符合要求的注释(将hbm.xml文件的内容搬到java文件中去写)
    8 ~1 W' ~  q& P0 U; w* r/ ^
    , _" `7 U- D! i1.1 在类的上面 写与表的对应
    + o: {* N* S) F& Z* U6 @  y3 l. W8 i# T4 P" k
    1.2 将每一个属性的注释都写到get方法的上面
    3 P- j5 s- @; n1 |  A1 A
    2 @/ s% y0 e4 q, a4 y1 U" G/ N* Q2.在ant中引入相应的task来驱动xdoclet0 Q/ H8 w- e- _5 {/ I
    6 O7 G) h( s, d4 E& ?9 r# @1 r
    # |; X# ]( g; o% M

    2 g+ x- p$ A" ^% ]; f& Wlog4j日志管理
    ) r$ H1 v3 q0 O# Z& x! ?1、是什么?# C( E+ b9 c( X- J# b4 w( U

    0 [5 y) K% _$ r在开发期间用来测试、对整个日志信息进行管理的工具& g0 K. Z4 ?- I# A' i

    $ m+ Y" L# \7 I* G9 b2、功能
    2 [. q/ W+ A5 H. z5 m: H  g& ], \
    ; J6 K1 F& H: x* p1.控制输出的目的地
    2 R) P  [+ S- b! m/ @8 A/ W( ?' e6 ^0 p! I! N6 m$ z0 v% j4 D% H
    2. 控制输出的格式$ D  f" N, f" h7 r  m/ K
    & H/ A4 M5 h0 Z9 R5 i* x- C
    3. 控制输出的级别% P1 |8 P' b" ?1 |. f% Z( s

    ( C& C7 v7 R# }1 D$ M0 w3、日志的级别4 p+ A, q4 W$ v. ]# |3 h7 ?

    : W. ~9 t+ f! }3 ~# x" C1. debug 调试
    5 U# j, N6 g( V0 v9 k% e' K* B3 O1 |& e8 `: }' _
    2. info 给用户的提示信息
    0 I) T, V) k- x$ _+ z) o( m- w
    6 ~/ W3 w, y+ Q/ w9 u3. warn 给用户的警告信息
    6 k: i4 Q5 `! W& l  m
    0 Z- s0 [& P9 v" ]4 G/ z& E1 h4.error 给程序员用来调试  ]2 k: q. L' A# b1 }( _% D# m

    $ F$ `: s' ?+ u6 I) F0 T5 BDebug—-〉info—-〉warn——–〉error5 p0 j# M5 _% R3 S/ F. s1 o
    4 a& ^& H. T" t5 @4 \" \
    4、配置% _# c; W! Y& O- z) ]
    5 u4 n6 u/ a2 t6 p
    1.配置级别
    " q7 X. y0 @2 p- w2 L4 a1 p
    : U) W. c* w1 B+ o* q2.输入源 (控制台和文件)
    4 l$ `# {' _  c$ `- e; f  Y0 t
    / \. t! Z/ e1 L0 y( J, V1 V3.可以进行分包控制
    9 H* I) ^: E& g
    ; @- i+ d% B) d2 K9 j% ~; {: w' g- vLog4f.logger.包结构 = 级别  {) _& o/ a) i6 T

    8 K& t7 p5 d' `) K5、使用
    ( k5 Y9 a; A, k" z3 o1 z3 E
    + d3 L$ X3 M, P% mLogger log=Logger.getLogger(Test.class);- Q2 d! T) b9 D3 k/ |

    : M/ F% S6 }, Z: `7 o1 j    public7 J6 y$ m4 W& Y$ F
    void t3(){( N6 p& G! C: d/ W  @

    6 [& M) U, g. E; f. C0 j! e. L. G) t: t        log.debug(“this is debug”);
    : c4 l; ]& ^  C% ~; l1 k5 \) o* Y" f, u3 a; i
            log.info(“this is info”);
    5 i' P  J1 x3 W( T7 j
    1 t) w) w3 W; A0 E7 k* C" W) Q        log.warn(“this is warn “);
    0 K- j7 g9 R4 A  r- }7 v& N/ Z6 Q. B6 X  D
            log.error(“this is error”);1 {: G* T0 _4 ^& m3 c# A7 r  U4 D1 n' `- T

    + D% a$ m7 g7 h8 U% `, [# ]    }
    + `. ?& [, h( ?) m& E) P3 R. a6 A6 R4 N& H4 K( }- I2 d' r
    Junit' a& }2 A! b1 r. ~) w/ G
    1.是什么?2 e3 K2 O2 B5 z$ ^1 h3 {* |
    0 \8 E3 x8 k0 g1 W# H+ L; ~. i
    单元测试的框架' M2 x* g6 J2 W4 V) d. T" `5 \* ~

      X9 }, ]' q- O2.怎么做?9 I& }- B( R" H1 r) b6 E

    ) D/ ^, F+ q9 v& f1 v# ]写一个类继承TestCase; @; |: B1 t0 c" ~; K
    ' m0 r% K6 q% ?- S/ {
    测试的方法一般都以test开头并且没有参数
    ( {- D% a5 r& E& _9 d
    2 w/ V9 _# N, N9 v在测试方法前执行的方法public void setUp( )
    # j2 {6 R9 |2 P$ ^6 P: n8 w" U
    9 y$ j% A# G8 q5 W( a) ?2 A! C在测试方法后执行的方法public void tearDown( )
    + n0 E  |4 R8 ?+ a8 p
    9 @3 w; ]% J: `) [error和故障的区别/ t0 x5 i+ u2 U& y% Z

    5 U  \4 I( ~' i& ^; F2 s$ i1 X' N% Nerror :代码有问题
    5 W3 z8 ~$ X% ~! {) J3 Y, G8 B- I* |9 f' E' e: b
    故障 :逻辑有问题与祈望的值不相符合
      G; B+ S) e5 ]
    8 P/ W3 M; g) T  e6 |6 r- f& N7 w' X生命周期
    ; j3 \7 G5 L. G7 ^2 n" U2 Q$ G4 G5 e- f, r5 C2 ~% d- P$ Y
    测试—〉SetUp()—〉testXX()—〉tearDown()—〉结束;
    6 H9 q* y6 R2 h) d: b; S- z
    7 Y2 y( [, A9 i6 kTestCase套件- a7 l& g  H  R/ r, R- r

    0 f% t7 y% u+ m6 f6 H; e+ {public class MyTest{
    , v- E" ^2 S7 o. Z# z/ d
    ( w  s$ a% w' i7 c' o: [        Public static Test suite(){1 d; Z3 s$ B# g3 I3 ^

    - X5 m4 j" p8 {" h3 L. @8 eTestSuite suite = new TestSuite();
    " F" P6 s) Y2 b3 u
    : T& Y  w; z& f! d4 y# Jsuite.addTestCase(Test1.class);
    2 P' w5 S6 w9 Q- e# x8 L$ k7 }- j# Q* o4 s
    suite.addTestCase(Test2.class);* f) w# h1 i) R' q" o- i' G
    5 q3 C1 m* ]9 j! ^! Q9 E" J
    }
    4 G: @! i  s# M- M, ~! g6 x+ _' l, w- b" z* ^0 ]0 f5 W
    }
    # n8 u/ n7 L2 s2 ]5 s0 B. i$ y, v, s
    ! C( S5 P. v% p4 e0 Q
    7 ]$ _  X3 a, J
    Ajax
    6 A0 w: z, N* a- P$ I# @. i7 ]; l0 `3 n6 G是什么?
    : ?7 ^' W, U+ @  ~, J' Q# a- {AJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。是一种创建交互式网页应用的网页开发技术。
    6 k$ K( l6 C- I/ G0 U3 \" S% {' i  ]2 |& A1 \9 K
    无刷新页面。
    . [2 y3 ?/ f1 `( F" q* G! a6 e
    0 ^2 r3 j% O  f; \有什么?* m3 F0 W0 D$ N" N2 }6 G
    AJAX是多种技术的综合,包括JavaScript、XHTML和CSS、DOM、XML 和 XSLT、XMLHttpRequest。7 ^. E: N- `) U7 U8 K7 }& u8 R/ i7 P

    $ `- s8 `8 u+ f& G! \' G能干什么?! x3 i: v+ B( l9 O
    使用XHTML+CSS标准化呈现;
    + G3 k  r+ T1 I* n/ }- F8 M$ u使用DOM进行动态显示及交互;  g' r! O# n4 G+ a; M% y( R  `
    使用 XML 和 XSLT 进行数据交换及相关操作;2 T) Q) N& _% u8 @
    使用 XMLHttpRequest 进行异步数据查询、检索;
    * t. ]( }9 c& U, m0 Z( {使用JavaScript绑定和处理有所得数据;
    - ~/ S1 c8 d6 w- }0 f
    9 p; S8 e& M- n: ~2 ^0 A# L' `: \传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。! s. y8 s* ~0 f6 ~' u* }
    # M! _7 {3 g/ w: ^5 U* o
    与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。$ p, |% m  y4 ^6 h4 S% G& p
    * w& Q' K4 |" u' q# N; K
    使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。
    * W6 D* g& C$ g7 ?: j2 f
    + \5 Z. ~( u2 i4 M对应用Ajax最主要的批评就是:3 `8 B; a# l( S1 O: Y; ~+ G
    1 它破坏了浏览器后退按钮的正常行为,就是用户点击后退按钮后不能看到之前的数据;* u- I) @; B3 O
    2 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;
    % r3 L  t* T3 [( _# y3 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;
    1 w) i' ^, ?; `5 ^+ x" Y" U4 Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;
    , S1 d+ y6 x# c+ y# k. p, N) c: Q8 b# v5 ^
    怎么做?
    % d% z2 W' X1 A) H, T" `4 n<script language=”javascript”>
    9 ]1 S# C& X& X) X6 [9 Q
    / J8 Y# p) N$ Q7 o- Y+ o- |var req;
    ; L. _( [" k+ |4 M% E2 E! v3 r" [( ~' o/ F4 d/ Y' s
    function add(){4 l2 @0 l+ Y/ Z6 k

    0 K- h8 ?) k0 c2 s" @1 i//1:创建用于传输的对象( q0 i/ W( Q5 D" v5 H1 ]

    - b! ~: h1 C7 ^2 L- |9 ]' a( Preq=new ActiveXObject(“Microsoft.XMLHTTP”);( ?& g9 z0 r7 Y8 g/ t- N: j, N4 l

    - o3 H7 ?, p% w  o  w: d5 F' o// 声明返回后,处理数据的方法9 Z* j4 i  X1 s5 Y. D8 f

    ( a  G9 Q7 j8 R5 `2 g4 A4 Sreq.onreadystatechange=manage;+ b1 p4 T- ]. S
    # O2 C6 n' q% U' O3 c3 M
    //2:准备传输的内容
    / P3 n( s# F5 t$ n
    4 A; o1 w. `3 y' _) Qvar str=”test1111″;7 T) d3 {; ?: W9 p6 n( w0 e/ n; `

    , Y# _% \/ ?  ]# `/ q//3:发出请求3 P1 j+ D  w/ l- X+ W( s3 x
    * \( l' R% K" T
    req.open(“GET” ,”/others/ajax/test/t2.jsp?str=”+str);* u, j  Z9 X+ n! I6 [7 x0 r/ r7 O$ K! v

    1 G" Y  H. ~( T6 W& oreq.send(null);# T6 V9 J" n) [9 l: z! Y( C
      ~* b" O1 ~1 i) T1 H" B
    }
    % o3 t; J5 N' u7 I- z& t5 k( z* ^7 q+ [1 G3 [: |: B$ S
    //4:接受返回并处理
    ; X( ]' Q; e! K. l3 e5 z3 X7 X, i: l3 O$ f
    function manage(){
    0 u  N4 m- n. j+ ~# z' G- T$ |0 X- K% O$ d1 O- M; j
    if(req.readyState==4){
    9 q! B% K2 s+ m! @$ d  M" i3 v9 n+ Q- \- F' q# s8 [
    alert(“r==”+req.responseText);1 T# P% }4 t2 J& t

    3 P) g% n& b4 }) _}
    ' r7 `$ ^+ F( S' x7 ~# G3 E$ F2 q6 \4 B
    }+ J9 t9 Z, ]" B  R+ v
    & k; j8 q* ^- R! i9 m# }
    </script>
    " |: H4 X5 z+ s, x  u3 K7 r. P& B4 ~: L
    readyState的取值如下:, \, o, Q$ O1 F( v% c5 e: U

    - a- W3 ^, Y# h* r  0 (未初始化)0 o9 R) u6 ^5 b" a/ Y& Z0 q
    ( v2 B8 r# h& z8 v% @+ Z
      1 (正在装载)/ B! E( Z* k& h' [; h

    . k9 u5 E& {, U- u6 j  2 (装载完毕)0 ]  Y% ?' w* l
    . ^% Y' _  Y: `6 g
      3 (交互中)
      d6 Z( Z+ v- i2 A/ D" a( n1 |( a$ c) j
      4 (完成). @+ L+ ^% a" N8 _
      ~9 Z$ h+ x5 @% Z2 U

    0 ?4 v6 `4 m: \0 u1 Q
    ) u- e( i  g1 s# E# G! _3 K+ J原理
    0 h4 ]  U+ y1 l6 f+ I5 c3 YAjax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,可以是xml格式,也可以是一个字符串,然后用javascript来操作DOM而更新页面。) J. Z+ V9 o% B- `0 L

    ( Y/ x4 V- d. A/ X6 E2 [6 y) F* ADwr
    2 }( N- j- T$ ~, L是什么?7 x! Q  C: e/ G0 I4 O/ m
    DWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的页面。它可以允许在页面中使用运行在WEB服务器上的JAVA函数,被调用的JAVA函数就像是在页面中JavaScript方法一样。2 x7 c# c( C, @" [$ ]
    # d6 s, _0 G1 ?& d7 _
    有什么?- f% U) ^* m2 Q- B
    它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据;另外一方面提供了一个JavaScript库可以帮助web开发人员轻松地利用获取的数据来动态改变网页的内容。( r' k$ V- f. Z. G1 G5 m
    * J% e8 U3 w5 o5 E" ~+ p

    9 V, ^7 [2 X) d, w& o# }9 d, w- P9 h: T) Z
    能干什么?  n. a9 v8 @. H4 @
    动态地把java类生成为JavaScript,感觉调用就像发生在浏览器端,实际上代码调用发生在服务器端,Dwr负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制。
    , g( e$ {1 X+ g, I' x) X7 ?% B/ O3 B9 A6 ~/ q/ H
    8 v6 w) Y/ x! ^2 I, ]
    1 O* Q9 V, _. F2 _0 t
    怎么做?, ?* U% g8 G8 o$ W+ j
    ① 编写配置文件0 x- S) k# _2 k" D$ q0 ]- }

    ( O8 K) `& ~& O0 h3 A6 c2 Yweb.xml
    1 ^! h  c+ c8 I8 |- [+ f
    . n# s, y1 I( F; t7 V* _<servlet>: D6 U1 K& A3 Z: T6 G5 Y0 T6 i, q; S
    6 D1 Z" W6 U( o8 C8 k9 z
    <servlet-name>dwr-invoker</servlet-name>- [5 ~$ G: r/ K5 [  _
    2 H$ Z5 G3 d5 Q
    <servlet-class>
    6 r) Q! |2 Z+ m% q+ d
      a  X0 W3 F! |) \4 c) gorg.directwebremoting.servlet.DwrServlet/ c: E& b9 Q; A9 s- t) J
    5 L! H7 r. {" G9 b2 n& b
    </servlet-class>9 o& P4 n5 g6 A3 ~4 @% c' Z$ {
    ! ~0 y( x& K. g# F
    <init-param>
    7 q/ U1 K/ m& G, s1 y+ a
    . b, @3 r: f2 J<param-name>debug</param-name>1 L( j% X1 J9 e3 l: r! C

    0 D# q1 h1 _; ?. C$ o2 t7 F<param-value>true</param-value>/ u8 \0 o1 ]/ t6 Q) g
    + h7 ~! O/ ^6 @$ Y0 b
    </init-param>
    + `$ ?1 C8 w: W1 I5 H) w4 ^, E% Z6 g: {2 ], P
    </servlet>
    1 v4 K) y5 [# G) I2 a
    5 ^; z; s% b3 ^5 W4 Z! Z7 Q<servlet-mapping>
    1 i+ Y5 q& c) f% t; r
    ) P9 P- X3 ]  Q! Z$ m<servlet-name>dwr-invoker</servlet-name>
    ; u. r; H2 b3 }& H6 [' H8 ~  @# ?
    2 b6 J1 o* ?6 H) @; l0 W+ d" W<url-pattern>/dwr/*</url-pattern>) A( @2 p% [2 B
    . R5 \! I; z2 L) W* C/ t
    </servlet-mapping>
    : J! u9 L' _) x$ P$ t7 D9 s5 O0 u$ j, ?6 Z$ _
    dwr.xml0 W' O( u, f4 s( ~% s! f) A
    7 ]2 E8 g0 \) r. e/ V! j9 ~
    <allow>
    ; E/ m% Q& p3 ?& `$ s2 D3 U1 S/ e% S
    $ `) Q  U5 Z1 u0 p- i3 z<create creator=”new” javascript=”kc2″>
    ) Y* ^+ r: \! b% {* j  }- n
    0 M3 e6 y( a7 Q, m& B. B& t  C<param name=”class” value=”dwr.Service” />
    9 {) p3 b+ x1 a; E
    $ v* j5 f, C3 ?+ Y" ^9 W7 \6 w</create>  G  N1 I! d) d+ C5 D/ c* Z

    + ~' X* `$ j7 h; [; n7 o( y- O</allow>
    " c0 x& |! [0 d. Q: {3 ~
    3 T" U, ]8 J. \6 r$ M! E②编写service
    1 j1 O% n' b& d
    ; {7 L% R. e: f' {public class Service {
    1 R+ t9 w2 h0 I  z6 [" `# t5 T
    public String sayHello(String yourName) {; j* k( S2 i! H
    % q& N$ Z6 r8 ^* f
    //可以是访问数据库的复杂代码( L" I' F" H) K6 T' W- @1 k
    5 J4 u/ e! f- h: r( \
    return “Hello World ” + yourName;
    - P) a) Z9 z; l7 `$ b' T
    . L8 I, u1 U: n. M}+ G) ^! U: h/ m* |* |
    9 s5 O$ H& `) ?! z  B2 u5 v7 K
    }
    : \. W" W$ M" y/ v+ f( Q
    ; ~3 Y) x6 y8 g* T& ]! O5 V* i/ Q4 N③测试DWR
    6 D5 z4 `+ t1 i0 `+ k
    / J: ?. t# x2 y& v6 x0 O将代码放入应用服务器(比如Tomcat),启动。
    4 x  F, r. c, N! F# z8 K
    " I9 k# h) P4 o' S& O然后在地址栏输入http://localhost:8080/你的工程/dwr5 l" d  y4 R4 o) a7 C8 D$ ]$ Q7 r

    . m5 M# b$ y/ A* X④编写jsp页面
    * B& m2 a% w) d# S8 b$ @# Z/ k, f9 m+ m0 \- U1 U' H
    1) 要引用3个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js
      s* _' b; V* B( [3 M3 J% ^7 \& s. D' q3 ?2 x4 w: G
    2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样+ v3 U( I$ [1 ]7 I% ^- [# x

    , i- n% a- M# E4 U1 N8 |% {* m3) js里的service.sayHello和java类的那个有一点区别,多了一个参数,用来得到返回的数据
    回复

    使用道具 举报

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

       

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