我的日常

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

动态微博

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
    : E+ d+ t; r3 K% |( r$ E: k简述JEE
    * C+ n$ C" _$ B. H: D/ r/ w2 B& @JEE : JAVA  PLATFORM  ENTERPRISE  EDITION
    6 P) A$ D3 w  P+ T  T
    $ y' t  s. M' h3 ^- K7 F0 G$ MJEE是一个规范集;
    & I* Y0 C) H9 v
    8 `6 ^9 v' j: g7 E: JJEE是一个框架集;9 E4 ]2 X, I7 C' S) f) }8 c
    , ~% ^, ]6 p8 \( @6 G0 J  l
    JEE是一个技术集或API集;
    9 l6 L7 p% ?8 T$ y& a; ]7 K+ F+ c$ e, U9 f# z+ M" w
    适用于创建服务器端的大型的软件服务系统; E2 V. K9 k# r) v2 ], n
      d# H6 Q. A$ [
    + ~5 {) E8 \" j4 l

    , h$ ]9 @3 L9 S, _% sC/S B/S 模式
    & d* D1 {4 Y0 x" i& R& |6 ^* z0 VC/S client/server即客户机/服务器模式,客户端也参与程序的运行与计算(富客户端、胖客户端)- d$ E: \( b3 L( a- c
    . E3 U9 J% L% v: C
    B/S border/server即浏览器/服务器模式,又称为瘦客户端,客户端不参与程序的运行与计算& u4 [3 h4 @- T( {4 o
    , r5 _* g8 H* p, k3 b* K) L
    ( f0 N: _+ u* Z4 ~. O; P7 Z

    / i6 X1 Y- F/ F  ~1 x% C; V企业级应用(大规模的应用)的特点
    5 u& K. l! B  t4 v( _8 |) N1.生命周期长、稳定、可靠* h5 k5 c( @& E) K8 T5 Y: B

    8 H$ q$ j7 Z+ c, Q* k2.组件往往分布在异构的环境中,能够跨平台
    ( I, J( `: O" Q/ t. v  r/ B, C6 Q! M* x& `! J( j
    3.维护性、扩展性、重用性
    " B, I3 A" i- x: }/ g2 G. j+ T
    " m% g$ k# f0 G4 v3 n4.有事务、安全、线程
    . Q& D2 J! `3 O  Z. M8 D8 I0 B! k5 N2 d. |

    ) j1 a0 m7 @! M2 _+ r
    # ?/ J7 ?/ N# c+ a5 @, _什么是业务逻辑?
    : y- @2 {6 D( Z依照业务逻辑划分模块,
    0 ]% x2 E* F; |$ c0 K8 D8 K  X6 ^4 r( x% t5 ?
    所谓判定业务 就是具有以下特征:) w7 g, b8 N6 F4 X: _+ |4 \4 [; A
    6 E8 g, v# |1 m! M
    1.业务流程% y: G9 K/ B3 [. C8 d! R' [6 \; i
    " G# @# a) q! e. d. Y
    2.业务判断
    * R: F1 {5 i& y0 \+ o$ w
    # t4 h4 n7 B+ V, Z8 U% Q7 \3.功能组合7 P2 f4 K4 o' X& J% m, U2 P9 v0 `
    ( r& x$ w( o! g; e) o8 ]

    ) j& q  I: V/ j# h" |
    - I7 R* ~! X1 |8 O+ x平台(角色)的划分
    ! h1 Z) H" K& B$ D/ ?. S" I3 C0 O1.平台供应商。提供满足API集实现的厂商(BEA weblogic IBM webshphere)0 ~& N+ @( S. q# P8 a) @+ {2 `
    4 ]( N3 L. v! k. E: |; }# s" l- Y5 N: |0 o
    2.组件供应商9 Z; _1 O, ~/ E6 G1 m. M
    % P' |9 }% [) b( B; _6 s' R- v( U+ \
    3.组件装配人员* {# B' ~9 x- K0 {; q

    ; b% ~1 w" ?6 c, ?3 P) `0 ^4.部署人员
    8 o; h; m  l% [+ g
    ) z$ C; ?1 A! ]: m2 Y( F5.系统管理人员
    , c) z, f$ U+ w
    ; z4 M- J7 I; G# D6.工具供应商 提供开发组件所使用的工具(Jbuilder、eclipse)6 i+ ]4 a; U" x3 O/ F1 L
    ' i2 q- f* y6 @

    4 z8 Y% D4 z; r' _* g+ t1 |, p+ \: n$ e6 }: o" C! o+ D: p& Z+ n
    java技术分布(设计架构 模块内部设计)* F/ E: \; C7 D" r
    1.表现层 Servlet、 Jsp、 JavaBean、 Taglib
    6 s8 j; W: |1 ^; n
    # c9 |- E) K  P0 l0 J6 Z- D5 Y2.逻辑层 EJB(SessionBean)( H/ E" L  c: ]5 T7 f8 z5 r

    " e# E. `# r' l' v3.数据层 ( JDBC  EJB(EntityBean))3 y/ \  J) B0 d  _

    : `1 J! }. N' `+ G( k4.服务 JTA(JAVA事务架构) JTS(JAVA事务服务) JAAS(JAVA授权与验证服务)
    . C7 L% M* W8 Q% T
    ; ]& z0 h% S" {" q2 s5.分布式通讯 RMI(IIOP)+JNDI 、JAXP(JAVA 的 XML 架构)- j7 ^  t  I  p* U3 ]% i+ P' G

    + E. }# ^& [* S- g+ YJAVAMAIL(邮件服务)、JMS(消息服务)、IDLC、JCA(JAVA连接器框架 (成))  ?9 q' v$ H. c) h6 M
    2 ]& T" Q3 c) e2 T) q% R& e
    9 ^7 H  K& _+ q6 C  S  X4 d
    % o9 j( I# E( D4 h. j
    JEE的体系结构: 是一种组件的体系结构
      j$ r1 {0 x0 B4 n1.组件 : 能够完成一定功能的封状体(独立的功能的集合)& h* a2 Y8 d- r
    ' w) _* p( v, m. Q2 R) p0 L; L
    不能单独运行,必须运行在容器上1 U* F/ M$ t' {5 I1 B: Y: a0 f
    1 l- L( K: q9 ]
    分为两类:web组件、ejb组件( _2 S7 a! x* {% m! Y; w, P' R

    2 Y1 E- d4 m6 W, d$ n; ?2.容器 : 提供组件的运行环境,并对组件进行管理(一段程序)
    . a+ l" w; e. M" e$ ?2 l
    $ A& k" f9 T& d* w0 G! q- Z管理组件的生命周期7 r0 c6 m& M) P! X7 M
    & Y7 }# H  D. }2 Q+ w
    不能单独运行,必须运行在服务器上) f  _, x& N4 [2 [
    : d6 P0 I7 D6 |+ g, r4 h
    程序(组件)通过上下文来调用容器(context)
      i+ S, ~) D( q$ s( o( `6 m  m' N! _9 O- N9 S2 {- ?' o
    组件通过web.xml向容器描述自己,使容器能够认识组件, C7 v. H4 ?$ U0 p: h# y7 {

    * I. i6 r- `, z( {( ^, [9 e容器通过回调方法来调用组件3 B2 @$ N8 p$ s: Y9 s4 w! ]

    : c# R3 r7 S! b( }' }分为两类:web容器、ejb容器
    9 a' @) L- D! h: V7 m
      L# n/ \! I# \3 z" E* N7 }3.服务器 : 提供容器的运行环境,提供大量的JEE基础服务
    : H- h0 `3 A- A# K1 T9 A0 ?, d
    4 U$ K" S( ?* ]  [$ ]9 b- w! fweb服务器(只提供web服务)
    9 Y$ C3 n9 A! O  V# F( @3 }! N( F7 A" u# q% l7 n2 W
    jee服务器(提供web、jee服务): U2 Q4 b! \1 h5 D6 {$ e
    0 v4 F  H; X2 A& G& G! o
    # Z& X3 E: A1 J# x

    3 z# R+ z' h2 O* x) w什么是回调方法
    4 w3 i, K! S/ y' F4 _3 H由容器自动调用的方法,就叫回调方法。2 b( M& C5 J2 b3 h- U- t! v2 W  ~6 w

    - S- X9 W6 D/ I" h/ q& s5 ^+ r0 t ! j8 r, Y0 B+ C7 y; Z0 C8 D

    / x8 Z4 @% @. a/ q# ^RMI远程方法的调用机制; E: K' Y% l) N8 D
    例如:A主机有B()方法,C主机有D()方法,A 想调用C主机的D方法! m6 N" }8 J4 s; l8 r

    + B, |& K- v/ V( @% t; U! G) V0 q5 O

    6 C$ a0 J9 ^9 C/ x7 w; ~  i7 s+ v8 @
    # s/ a3 ?' g3 g$ Y; e
    8 F+ K  t- c/ Z. w  x$ Y5 f# |6 [学习方法% l9 i1 p$ D& N
    1.规范(熟记) 2.熟悉API 3.多练 4.多想
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    12#
    发表于 2014-12-03 12:45:29 |只看该作者
    Servlet: p7 E/ t$ Y' b3 {
    •     描述war包、jar包、ear包的结构9 d+ \/ ]* c+ x2 v: i) W8 f7 H

      + v! T2 ~6 e' E. ~8 T4 v# L% P: Y5 o2 N! h

    war-                            web文档压缩包

    —WEB-INF

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

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

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

    & d, Y& Y# _' G0 W( O

    jar-                             java文件压缩包

    —META-INF

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

    - Q; {: t# P7 J3 z& L1 ]& H$ A

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

    –META-INF

    —Application.xml 配置文件

    –*.war

    –*.jar

    2 I% _( v3 X  e' ?* W7 z. [+ F: b; f
    • 什么是servlet?servlet主要做什么?# f4 i) L# m' }; ]  U- W. T
      . y6 F5 g9 F, k( D
      4 @2 r, s& u! |9 W3 C1 @0 z) m

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

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


    ! r+ e! @: F! _
    • servlet 与cgi相比的优点?servlet的缺点
      0 H( `% \6 \, w/ g3 r$ f* b7 u0 N

      # j# S& R* @% ^
      # t3 J# U1 w9 L! N

    优点:

    性能(线程比进程更快)

    可伸缩

    Java强健且面向对象

    Java平台独立

    缺点:

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


    - c6 T3 a3 l& K& I4 Q5 M
    • 常用的servlet包的名称是?* k9 o2 S  }+ I1 [. E

      , |  z9 N+ S& L2 h; N( N( B9 z# e9 I( ?5 O0 p5 p2 U& Q: z- V

    javax.servlet

    javax.servlet.http


    / f' w1 k: L0 r4 _5 s/ l: L' x
    • 描述servlet接口的层次结构?- t5 d9 q6 r9 K: H' T8 f

      1 f3 }" I; x5 ^9 ]  |2 @/ X9 n" \' R" }8 [7 Y( [- Y. {& |

    Servlet

    –GenericServlet

    –HttpServlet

    –自己的servlet

    ServletRequest

    –HttpServletRequest

    ServletResponse

    –HttpServletResponse

    # R- v; e0 s8 |% p; g. c$ a
    • 对比get方法和post方法?4 T+ k  n9 n. Z
      6 p9 U' x& S2 j/ n
      9 E$ [$ y4 V2 b% ]* G

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

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

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

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


    6 B3 W0 K$ n8 t* w+ d: W
    • 归类描述HttpServletRequest接口都完成那些功能4 n9 P8 D9 G* K5 e! N3 o. Q  e3 h; m

      5 {8 C7 {# h: J, y4 [) \. l6 V/ w0 j! \3 [& |$ x! Z) q
      • 读取HTTP头标) A3 }) W/ K  a% }! D9 B" x$ R6 L
      • 读取cookie
        8 n: L5 c" I4 ^7 R+ W
      • 读取路径信息
        8 X9 N  |4 Z1 ]$ U1 r7 j& P* n
      • 标识HTTP会话。: a4 o& f) J3 x  i) O7 D6 P

        4 s+ R+ g: p2 P: d( }7 E! F

    / S7 |: Z5 {; r8 h8 L) n
    • 归类描述HttpServletResponse接口都完成那些功能
      , D7 k( A( g; Q. o. ~" K+ Y: E
      9 L4 T1 I: \  _, |; J' `, v

      2 u4 h' G. Y0 L
      • 设置HTTP头标/ o' q1 q7 W, Q1 F/ n5 J9 |
      • 设置cookie( g" Q2 {5 v* e# e# {
      • 设定响应的content类型" k/ F" S% Z7 y6 R5 B, T5 ~- g
      • 输出返回数据
        6 I' k$ X5 g! R3 Y" z
        " Z/ k# a* J* j2 @
    3 A: B5 ^% k" k( {5 _- Y
    • 描述service方法所完成的基本功能?默认是在那里实现的?
      % C6 @9 S2 a) g0 a1 X7 {( v
      4 j. o# `$ |  h

      ' V# T* s2 q# ~$ y

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

    实现:默认在HttpServlet类中实现

    % l" }1 L2 Y1 G- B4 M% t* I
    • 如何开发自己的Servlet?描述应该做的步骤和每步需要完成的工作
      0 ]5 P8 m/ q) Z7 v# z* j- C
      7 [+ m1 L9 s' ~: |7 J

      5 Q$ k4 L$ f& \7 A, x- x$ j

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

    : W- b; c( G) l$ S
    • 为何servlet需要部署描述?7 ?( f5 a; k" B
      ! @8 ^1 p7 a; ~
      & u/ j0 i: @% W

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

    2 _3 u2 V* F  b- O5 J1 C+ |  U
    • Servlet基本的描述应该是?请写出来
      2 z$ V; m' i9 y. _* {3 w

      - C+ l# C! W7 B) v, P0 Z
      : L+ q8 ]* e, i8 Y

    & K2 ^% e  E7 ~' L7 d' Z. b* e

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

      y6 q1 V2 ]2 f) p* S3 [
    • 如何在html中使用servlet
      * N- U* }* \/ H8 B+ O; k
      & C- b' b$ H! r( ]) F( m

      ! w) s) X" J3 k5 G- j! Z( q( ]

    FORM标记

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

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

    语法:

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

    {HTML form tags and other HTML content}

    </FORM>


    2 X8 g. F) R, r+ W: N3 g0 ~, v
    • 如何接受request中的参数
      5 c. U- [5 K( K2 ?) V

        t) D2 h  Q. q/ }String userName = request.getParameter(“userName”)方法4 `3 V; p0 k9 O* ?* |; J

      ; [* V8 k* l5 w+ ~, c+ C
    6 X# Z0 G8 A6 y& f/ i2 S
    • 如何接受request中header的值3 q/ F1 X$ J- a5 n& T

      6 R% z; T( v5 m  N0 W! R7 C" x2 o$ }; ^. i) V7 _9 Z# j' j; ]

    request.getHeader(name);

    request.getIntHeader(name);

    request.getDateHeader(name);

    request.getHeaderNames();

    1 S. v+ ~$ O, q4 p! w* c6 t
    • 如何输出html
      6 @1 Z5 S, c3 ^$ L. H

      7 t/ Z/ \( H) J' J0 e3 s1 b
      ' T4 w2 K* M9 l! z* ^* ]

    PrintWriter pw = response.getWriter();

    pw.write(“<html>”);

    pw.write(“Hello”);

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

    2 e  E% l- B2 j8 o0 c1 j7 {) _
    • 如何设置输出的contentType
      $ s, z: F$ c) n7 v; n! l

      " H3 s0 h7 x$ i2 R- i+ W( s& r2 v8 k' r, |+ C

    response.setContentType(“text/html”)

    ' Z- t- @( g: t$ u
    • 描述servlet的生命周期?
      & O- v. }, }, t( w3 H8 v& D
      0 ]  I; ?3 c5 V/ ^/ t: P
      6 |# ?" d, K) w" s7 r, b

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

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


    ' F) l8 w0 N4 G" ?& H
    • 描述init,service,destroy方法的功能和特点
      / Y' F( U- z0 I7 h
      % V, R+ b$ V9 K
      ; ]  ~2 v+ I. z, O0 a, |3 r4 X& B

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

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

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

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

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

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

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


    0 Q9 ^$ n- h& _, D  m# b* v$ l8 W
    • 什么是回调方法?有什么特点?1 S- e; p3 Y5 I! W

      " U& b8 G7 C3 v7 ?. c; N* v8 ]
      * _0 [7 U, i' f

    由容器来调用程序的方法

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


    ; P& @. D9 Q3 r
    • 如何设置初始化servlet的参数?9 n# x. Y. b6 y- s# g
      ! t6 D1 T: K$ R  x$ K2 w
      在<servlet>中添加如下配置
      4 Y, ]3 `5 Z2 Q+ o- p* `" H+ Q6 i) m% |8 b  U3 K

    <init-param>

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

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

    </init-param>


    - V) q+ R; `8 e+ k4 E
    • 如何获取servlet初始化的参数
      / z' i6 k: k, U4 P/ `4 _' E) w# r

      . @5 v# L* k( X) l* J: ?4 R8 F
      + @7 q1 Q/ s7 {. I3 j

    public void init() {

    greetingText = getInitParameter(“greetingText”);

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

    }


    6 ]3 C2 n. k0 X
    • ServletConfig接口默认实在那里实现的  r1 p6 D$ d% E' q6 j# p6 [* B

      2 L; ?- @/ e) g: U( d0 @9 D* Q) f% L& H1 m* e

    GenericServlet类实现ServletConfig接口


    " I5 o5 u( U1 b/ ~0 W% ?4 j* K3 c
    • 什么是ServletContext?有什么作用?  A2 H" ^( D6 z* P/ J8 g. g

      , Q6 G7 ?' {  A, x7 P' i2 `  S
      ( R0 h6 s& Q+ S2 E7 r. C1 O

    Servlet上下文

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


    : \) _, r( v  {3 X7 ]: t! T" i) `# y
    • 如何访问ServletContext接口?是在那里实现的?: K8 P' c- E3 Y( T

      4 y$ r' j8 [/ F
      ) z  W% v. ]) q' a2 m

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

    GenericServlet类实现了ServletContext接口。

    . ~  q  H9 l4 [0 ]! k
    • ServletContext接口的功能包括?分别用代码示例
      7 m( B/ O( N4 N' U" f$ P8 n8 z2 D

      3 i. P( ^: g0 `( e6 H
      : J, `1 J" _7 Y# r

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


    + K2 u1 G! N- z  j# |& V/ E
    • 如何设置ServletContext的参数?& h) e0 S2 r9 v4 q

      5 `; J9 Q( t$ _. q0 K
      0 A2 C7 {- d7 l/ H$ W

    <context-param>

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

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

    </context-param>

    7 K" B7 k7 h: H( i( Q$ i8 w7 M
    • 如何获取ServletContext设置的参数值?
      4 x; O  ?# l* ~( I7 b  j  I8 Q6 I+ _* U

      $ ?3 c( Y" V* R9 @6 ?. Z) H
      5 ]: b9 @- A5 g# D* H

    ServletContext context = this.getServletContext();

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

    9 `# ?/ J# X6 s
    • 描述Web应用的生命周期?
      + S% P  v9 G3 l* x& G6 G# d
      ' D/ X$ N; t! c, j6 T2 z' b
      5 z  Y6 `' k) H. M

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

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

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

    3 F+ \- j( f* }4 Y4 C8 s$ e
    • 如何用代码实现监控Web应用的生命周期?
      6 P% Y/ q- Z7 U, J  ~
      5 ^3 S# _- i$ z# l$ r  T4 n9 K9 N

      ( w3 K2 \5 V5 H, H' j
      7 S4 l; n# H  r! C6 Q, [6 Y# G

    public class Test implements ServletContextListener{

    public void contextDestroyed(ServletContextEvent arg0) {

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

    }

    public void contextInitialized(ServletContextEvent arg0) {

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

    }

    }

    ; K. J6 j4 w* \; C. r( }, L

    web.xml文件中的配置:

    <listener>

    <listener-class>

    com.csy.Test

    </listener-class>

    </listener>


    $ ]& l) P0 n4 M3 W' Q: q) m
    • web应用中如下错误码示什么意思:400,401,404,500- ?& b( z. z7 I$ J

      3 \2 s  ]: o- p# J, `. H& E0 |% {  i
      400 Bad Request//错误请求
      401 Unauthorized//未被认可
      404 Not Found//没有创建
      500 Internal Server Error//服务器内部错误

      $ ]) O) d( s4 c- f
    + M8 s$ h  A3 u" b# b" P" I& k
    • 描述Web应用中用声明方式来进行错误处理的两种方法2 w9 R( F4 ?7 w- r! H! ?
      5 v4 A0 A/ o4 O

      ; D* O, Y  D8 {. A& X

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

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

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


    9 p+ g$ F' T% }, W' S
    • 描述记录异常日志的方法,都位于那些接口?6 k: B; ^" M* C/ F
      6 j" F+ a6 Q$ [; l

      : v' o; S& T' i2 V7 b- [/ R

    GenericServlet:

    log(message:String)

    log(message:String, Throwable:excp)

    ServletContext:

    log(message:String)

            log(message:String, excp:Throwable)

    . B; Q# I* D- b* S/ r$ w% Y9 b7 k
    • 什么是会话?
      ; B5 P! G8 C$ H. w% e
      , W/ F* z" K! M  z5 `7 ?9 d
      2 W" \9 L) i" N6 [: ]: F

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


    ) @6 P; W. h9 h# @& Y; W; T: _
    • 如何获得会话?/ M' U& _: Q* N* `

      ! T% @7 w# `9 Z
      HttpSession session = request.getSesseion( );
      / I0 E* d5 \& m* N
    5 B& l# l: E) Z- T# ?+ R/ j
    • 会话Api的基本功能?
      " U/ V" i) N: E, i* |9 }# h% i

      3 r/ N0 L& r% R% [6 X8 \/ C" y2 l. p- ?& s& X9 A2 l/ S. e6 ]

    getID() :String/ v2 T8 S& T6 e$ I' l. P- F

        isNew() :boolean
    & W) r3 a3 w8 i3 f% t, H% P

        getAttribute(name):Object
    8 m" r9 k; y5 l

        setAttribute(name,value)
    2 J! L7 |% i5 @$ v1 B( R

        removeAttribute(name)


    " N4 }0 K3 ~/ m# ^) O
    • 如何销毁会话?6 w9 \3 p. U% m( f
      % g6 H, i8 ]! D  m3 U" ?

      # y2 O: Z* J% P8 W6 R! d

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

    <session-config>. F; F2 X; G4 o

             <session-timeout>10</session-timeout>
    ; _& T9 o0 V$ s6 k) q3 L% B9 Q

         </session-config>4 Q: p1 f# Y/ C" T: v) m# H& v

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

    invalidate()4 I; }" d4 g" f; Q

         getCreationTime() :long
      }/ \; Y2 m) f, j; z) |% ^

        getLastAccessedTime() :long. ~8 x. |$ b7 S8 Z5 g

        getMaxInactiveInterval() :int3 O; [0 B# W# e4 a

         setMaxInactiveInterval(int)

      g2 P" r( `2 N; i% k8 ]
    • 描述会话保持状态的基本原理
      : D7 K: f4 }! U+ r& `

      - {  C, i& G& U
      + X! m0 D- N8 Q) f

      @7 v, q* C$ Y; r8 O9 i

        client server
    ) q3 A. Z3 h. @' Z+ K


    & v2 ?7 ^' {5 d4 \5 C9 n

    request/ E; l: H4 D9 b4 n+ D% }4 i  k

    response (sessionid)1 u# I' d5 L- V; z7 N: b

    request (cookies)6 ^8 O6 E, q' \/ d) G) b

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


    9 G- k. C# d1 h* ?
    • 请描述session和cookie的异同之处* s) x& ^$ K' u5 ?) m" n+ e) f

      5 k& V6 u1 r# Z5 }; f" c
      8 A/ f$ G# P6 a* d+ W0 |

    2 @. c/ \5 p* k1 I- V4 n" s* b- w- Q9 R, J) h; y
    • 如何读写cookie,代码示例5 H3 A4 G! I5 `8 d/ t

      ) k/ q5 t+ j& m% N
      1 J, J1 `/ \; o1 F9 d

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

    response.addCookie(c);

    读:Cookie[] cookies = request.getCookies();: U2 m, |' k8 w4 J& U% w+ J4 C2 S

            for ( int i=0; i < cookies.length; i++ ) {
    ! m/ P, {& O, i

                String key =cookies.getName();
    / ^) K% ^' l+ L( y

    String value = cookies.getValue();
    9 H( P5 P: k( {" a7 _

    System.out.println(“cook”+i+“:key=”+key+“,value=”+value);$ h$ s  w2 P, J+ b! N3 m* X

         }


    0 L/ V0 o. w, E7 T
    • 什么是URL重写,如何实现,代码示例
      ( G8 o' O1 A7 g+ F
      ) e$ p7 V! O) @

      5 U( K8 M% X) C$ Q0 R! a

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

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

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

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

    ' ^8 Q3 m0 R4 l: J$ E( F: }) G* i
    9 M, u$ x8 |4 z) r$ `0 K0 P
    • 描述web应用的4种认证技术
      + s1 `, d7 I; I: Y
      , t1 n& ~: a. S! G6 U: g7 A% g
      4 t2 O9 s' h: o5 q3 A1 h1 T

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

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

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

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

    7 ]/ @: n2 {# H, n' y+ K* C
    • 什么是授权,什么是验证?) a- c5 X! z; O' ]$ r- _

      ! h( d6 n0 w( K: _0 A& f1 f5 c4 y7 E. E0 R
      8 x4 X: g* t' ^" b; z" r7 e1 M9 A

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

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

    0 Q$ S4 j3 ?  D/ {3 w
    • 什么是HTTPS# E0 O) D& Y( D' N2 ~! m
      9 o' u  _! K# u# A: R# w

      ) P2 ^; K: [# Y6 K4 E9 `! b

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


    ) u. Y7 y9 ^- \/ j4 p# e% U
    • 什么是审计?2 t) E- O6 Q* j3 y! U" e1 [/ d/ E
      9 s2 y* X+ k$ t; {; D
      $ N& u" j4 i9 {" h6 o

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

    # Y5 x8 ^2 d! G9 o
    • 如何实现声明性授权
        [  n) T; I4 E0 h$ q0 i) }( l8 R3 l

      ( g. Z/ C7 u% N0 g& c( q- u" ~$ Z- q! G" _5 P+ p5 o

    1、标识web资源集

    2、标识角色

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

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

    在 web.xml里配

    ! N7 j) O6 P# z" t$ \1 d
    • 描述servlet并发问题?3 z1 k& I. ?! P3 g3 L7 n

      & n/ p# ]( `9 n+ x) w
      0 y! g. ^: A5 s6 b# H+ }; ^0 u* Y; x8 B

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

    1 ]$ |* N- F4 l8 r
    • 描述Web应用中的六种属性范围# L, j) ?. z$ G

      $ l" T, _# q4 |! G: `8 m% R7 ]. @8 v" Z' q+ O4 r) R

    局部变量(页面范围)

    实例变量

    类变量

    请求属性(请求范围)

    会话属性(会话范围)

    上下文属性(应用范围)


    ; F/ Q# \9 `" }5 j5 B
    • 指出上述六种哪些是线程安全的
      ! D- E; c8 K) M1 \7 [" {
      / @6 V* `4 D+ v% B/ O; n5 F  W* E
      8 N& g. Q1 E/ ~/ x& a7 W, \

    局部变量和请求属性


    9 c4 s$ N: K0 S* ~; [
    • 什么是STM?如何实现?
      ' B6 h6 C9 R; k) r

      $ N6 G1 M- H5 `0 ~  _6 M2 k' Y$ p* E# O1 I+ |) |- k

    SingleThreadModel接口

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


    ( ~# F  L" n! O6 r
    • 如何实现并发管理?2 ?4 q* s7 D* M; M5 A8 ]* {

      , M/ J9 A/ T+ G+ ~: `
      ! X* f2 l3 r& x" Z( P$ E+ I

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

    使用synchronized语法控制并发

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

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


    6 i* {6 A) O- w* B/ Q8 q
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    13#
    发表于 2014-12-03 12:45:45 |只看该作者
    Jsp
    ! ?0 F* ?4 W7 z8 W; x& A什么是Jsp?
    * D  X1 @$ m: ]. j" [Java Server Page    结合java和html在服务端动态生成web页面的技术& S/ }$ |* u. R6 z6 W9 s/ ~$ U

    ) o; ~3 r+ [5 l6 g  ]' s+ g
    ! R0 Y# Y6 c6 k' V5 A* c. ^0 |7 R  R# e$ `* z! i
    描述Jsp页面的运行过程?! Z1 U/ e4 G- U% t) |" s
    第一步:5 @1 z2 ~6 R1 J

    " t8 l) R- ]2 g) S+ d5 l请求进入Web容器,将JSP页面翻译成Servlet代码
    ! [% U- I$ {- r8 E. r0 B+ M: I% I5 N9 _: @% t
    第二步:! N+ h" a% G1 v6 ^4 u' `6 L
    * @2 y! o! W; Z5 A4 n
    编译Servlet代码,并将编译过的类文件装入Web容器(JVM)环境
    1 q- A" ]0 l7 E% H9 w
    & G7 C* E/ y* {* z8 e7 W/ |第三步:- B% A5 |/ @8 f: R
    . P# |' W% ?* ]  ?; ?2 a; U5 x, X
    Web容器为JSP页面创建一个Servlet类实例,并执行jspInit方法
    2 P1 T3 L' d6 V  y( e# U
    0 C# J/ e  q8 h第四步:: U* t3 u* l2 g& [
    , r# I' d2 P7 x$ L: G: g  z- W
    Web容器为该JSP页面调用Servlet实例的_jspService方法;将结果发送给用户8 r/ v5 {8 K# o7 p" Y

    1 L" K0 D/ b6 ] 8 L/ w+ @! ]& A' u

    ' j: K) h' a. a* G9 r$ ?9 S描述Jsp页面的五类脚本元素的功能、写法、并示例
    ( w: ~2 A* i8 ~; M; @: N注释 <%– –%>
    / C9 X5 a1 Y' ~' S2 @
    8 l% w2 O" Y, v- ~$ V8 W<HTML>( }9 Q& [# X% A. ?( z( ?
    5 S) M7 R* m7 v9 G
    <%– scripting element –%>! c* F) S, Q! z* K. |1 ?4 k

    - ^" V0 m% j7 \0 G- }2 C) X</HTML>
    % {( K- F. {1 g# \; L4 x5 h5 c. m* x' ]% T. b# ]- I3 V
    指令标记 <%@ %> 指令标记影响JSP页面的翻译阶段
    ( X: d4 f  f) ]' N/ m' z
      z3 G$ e$ a" l5 V* z<%@ page session=”false” %>
    6 {; c  l" U5 h3 j3 v6 \( {5 h( D8 a; L$ i* `3 R' R' Z* T
    声明标记 <%! %> 声明标记允许JSP页面开发人员包含类级声明
    4 ]! b% q* O' m' S, o# @/ x: m: t, l3 o9 [, l
    <%! public static final String DEFAULT_NAME = “World”; %>0 U: j1 K7 S& N- X

    : ~1 U- y8 r  O9 }3 F$ e    脚本标记 <% %> 脚本标记允许JSP页面开发人员在_jspService方法中包含任意的Java代码- j4 c  A" I8 ~

    ; ~- Z/ H6 S, ?& o# {    <% int i = 0; %>& m" M7 E" Q. k' f. Z$ J/ M

    7 a3 d$ O$ M& ^5 w/ w, @表达式标记 <%= %> 表达式标记封装Java运行时的表达式,其值被送至HTTP响应流 <B>Ten is <%= (2 * 5) %></B>
    6 @+ A0 Z9 D8 @7 }- h$ x) [3 c& K- M) X
    % |( c, ^/ i! a; `! h1 W" V5 U
    - r# j( t7 t3 u. [6 J
    描述Jsp页面中的注释种类和写法
    # @4 |1 j( E: i. A; n2 M  fHTML注释
    2 E/ L. y0 J4 t) V" n/ ?( Q
    # \! y/ L1 \  U' O2 w5 _# ]<!– HTML注释显示在响应中 –>1 J( M( c( j( o5 T8 ~3 `) R8 L7 J

    & |! Q! U, t& v4 fJSP页面注释
    . P9 s* ?" Q2 @4 w/ K8 y3 t( y, P: Y; r( Z
    <%– JSP注释只在JSP代码中可见,不显示在servlet代码或响应中。–%>; {1 X5 F. k5 L5 M0 w# [4 O
    / o+ x: N. @5 E0 i% o2 [
    Java注释4 T0 t5 V& B  r( N# ~& x

    6 R/ T; k2 y& P# l8 Z% v<%3 `: c( h& J! y* j% t

    / p, T9 p5 ?0 r9 ]/* Java注释显示在servlet代码中,不显示在响应中
    " ^2 P# ?) }6 V! u3 r
    & a  Q5 i$ g3 z  L: G* |*/* {  \' w5 i" a( T# i& v

    . z( f) V! Z$ B, }( z3 T%>9 }' c  K" R4 T% l9 Z) J

    - Q4 j# b4 x- G; Y+ @% K: U# G 5 |$ A- q. s2 n8 N+ P2 Q
    3 y" w4 o# D* A7 C, U, V- {
    描述Jsp页面的指令标记的功能、写法、并示例7 J5 i3 {) \$ \. A: ^
    指令标记影响JSP页面的翻译阶段/ G& P& y" i3 T
    . I$ z. ^/ c' D- J& [) K+ Q7 H
    <%@ page session=”false” %>
    6 t2 z; m9 [$ G9 R# l4 X8 A6 l& \9 Z4 i* j$ b. z4 m
    <%@ include file=”incl/copyright.html” %>% H" G$ c& E/ `. D
    + L, t7 _6 o- C6 ]+ L
    <%@ taglib %>
    4 l+ p! {& i5 ^
    3 l7 i1 N; U2 A6 A3 Z' W6 p  g ( _9 p! I' w, ~7 u3 K1 O. X

    ! f1 H: l* c7 j3 ]描述Jsp页面的声明标记的功能、写法、并示例. e: h- |; x* [+ \* Y
    声明标记允许JSP页面开发人员包含类级声明
    - F1 \6 O2 l; c" k5 T7 i, D9 Q; `$ w' E
    写法:+ i) [% _7 G. w
    0 N3 A/ }9 Z, s
    <%! JavaClassDeclaration %>
    9 I+ b# A; t% ]" b3 B. H
    ) A; ^! [! h* X; [% f& s/ t6 n例:. u" o: o0 e3 X) B# M
    1 v0 h4 j- Q4 P
    <%! public static final String DEFAULT_NAME = “World”; %>
    , ~* _1 C5 W7 }! s
    8 `; s' \' Z! D% o; a' x<%! public String getName(HttpServletRequest request) {, g% {0 v+ r# v$ c$ i

    - F8 T8 |4 N$ r6 k4 n. @return request.getParameter(“name”);
    - x( {! ]4 E4 a# t) o- Z/ j, J* k1 V( W, ^" G0 l
    }* C, S7 v. V3 z3 M  y8 t0 k
    - \4 m$ o9 r, ^$ N
    %>
    3 x: l- D: ?8 k; b* T
    % }7 F4 P% O' f9 O<%! int counter = 0; %>9 ~" }2 O& s0 l4 b9 o
    ' t" ^5 b$ C# m/ v
    ; e5 O' }4 i  Y- K: m1 U# J5 k
    " H8 Q' g! q' i# k4 U" D& M
    描述Jsp页面翻译成Servlet的规则
    ! d$ J- b7 \& q9 A5 F  Gjsp中的注释标记被翻译成Servlet类中的注释
    . t7 w( l. Z" j  j1 `6 K
    & f( T3 C  i* B; S4 O2 v. T& I( Tjsp中的指令标记被翻译成Servlet类中的import语句等
    6 @6 [; X& a' q) b5 N; r0 k" [6 O: m- `' W
    jsp中的声明标记被翻译成Servlet类中的属性
    ( j) i0 ^. s0 r: Q& j# _" L
    ! b1 v4 t- v. s- `jsp中的脚本标记被转移到Servlet类中service方法中的代码. C- }7 X: N. |: e* a" |. S3 G

    2 C; Q1 f" d( S" L; \jsp中的表达式标记被翻译成Serlvet类中的write()或者print()方法括号中的代码  ^7 x2 |. ]9 x, a

    ' }" n% W1 [- `) W. d. j/ E3 i; @6 u 8 f. v; K% W. `9 t

    4 n9 W& x6 `% ^; l+ [6 h. z2 B描述Jsp页面的九个预定义变量的功能、用法、并示例
    $ k. M. ?1 A- P# a; g' @, Srequest 与请求相关的HttpServletRequest对象7 a, U) u$ c' F; ]
    2 ]- h9 E9 I6 n* B" H2 `4 Z
    response 与送回浏览器的响应相关的HttpServletResponse对象
    % P1 s1 i4 z4 X  V* j' f% c" X7 I/ p3 o  A6 U$ G+ g# `! r; r% I/ u1 T
    out 与响应的输出流相关的JspWriter对象) u6 O: V% a# u
    " X. n' P% P3 i1 G( i4 V- Y
        session 与给定用户请求会话相关的HttpSession对象,该变量只在JSP页面参
    ) a' u1 L9 l: t6 ^6 s. S- V& M4 s' h2 F
    与一个HTTP会话时有意义. c: t' c) Y( g2 R0 y6 S
    ( H- I2 I# A$ ~  I+ a
        application 用于Web应用的ServletContext对象9 R+ R: @! y7 N

    - M0 o$ W- q3 Uconfig 与该JSP页面的servlet相关的ServletConfig对象
    : e$ B6 x4 {1 X+ y$ E5 m0 m- x, r" A9 f5 X# v
    pageContext 该对象封装了一个JSP页面请求的环境
    ) v9 E4 W- O  T
    5 {5 Q3 K+ Y3 w3 }  Q$ r& ^; d7 v8 a" upage 该变量与Java编程语言中的this变量等价0 L4 G$ q! A+ y* G

    4 T/ _- }( P, s. ]; ]0 f( O' t/ o    exception 由其它JSP页面抛出的Throwable对象,该变量只在”JSP错误页面”中可用2 H( `  w" |2 i$ N

    / z# p4 q/ R+ M
    : k4 s, _9 _4 Z+ c. Q
    4 U5 {- T" o& U( Q3 Xpage指令的功能,写法、并示例,并描述它的如下属性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding, ^3 d5 o; B2 {2 ^, x0 i5 I8 V6 l* d
    import import 定义了一组servlet类定义必须导入的类和包,值是一个由
    4 ]) G* M* E7 x+ j$ q$ B$ _# }8 a
    0 Z4 \# R( `/ o0 `" r& L( k逗号分隔的完全类名或包的列表。6 b% b3 N0 q* q  p+ t1 Y

    + V6 N, {) }$ r; _- ~% xsession session 定义JSP页面是否参与HTTP会话,值可以为true(缺省)
    5 I# E- c/ s& I; M2 Z  [4 W
    ) s  F7 d% h4 x/ I) a6 A或false。
    4 l# Y( v% c. g! J# f
    ; c5 t' R  c; s# [8 P8 b5 nbuffer buffer 定义用于输出流(JspWriter对象)的缓冲区大小,值可以为9 L& h; D# V, \  G: F
    4 l, W1 `, d  ~2 C' z  i1 ]
    none或Nkb,缺省为8KB或更大。  ?, h/ w, n9 B+ V( g7 z1 f* O

    8 X3 E# l0 q# ]7 DerrorPage 用来指定由另一个jsp页面来处理所有该页面抛出的异常
    $ P/ |& {( ]& b$ J  Q- D, L9 f
    $ I2 |4 q" W9 v# l- o% NisErrorPage 定义JSP页面为其它JSP页面errorPage属性的目标,值为true或" d9 {/ z# }, R6 Q6 Q% [$ @2 B- H

    4 |( O; e0 I5 B" M: J1 g% z- \( ~false(缺省)。% a( o0 N) p3 H( I' x
    * A2 `0 j5 T$ g- K+ [+ m7 i0 T' e
    ContentType 定义输出流的MIME类型,缺省为text/html。6 x) R9 k  |9 ^; R: i

    9 F: }8 n( t  Z1 |pageEncoding 定义输出流的字符编码,缺省为ISO-8859-1
    9 ]: |5 L2 P1 L& R
    , {; w0 y6 a. z, ^! v4 a
      z8 X3 I4 u0 q( z, Z: D  y/ G
    # ^: W' T. x7 y描述MVC各部分的功能?MVC的优点?MVC的缺点?! K# q4 D$ C  s1 _; E  h
    MVC各部分的功能:) y6 m3 a6 h4 C: x7 p6 L
    9 b# z, [& {+ U8 N
    Model(模型表示企业数据和业务逻辑)
    ) {4 d+ `3 ~/ z' \( T+ E- L  m4 r. [9 V0 b
    封装应用状态
    / t0 s) ~6 c. V1 f- ?+ S5 k
    ) J' f( }6 E6 x( |响应状态查询. k1 T1 D) n% r& n3 p' v5 Q
    ) j4 z& W/ n8 ?8 n) _/ K: q7 g; ]
    暴露应用的功能
    . \# H% C  ?  V! r& H
    - X" l- O/ D! ]5 v) h6 PController(控制器接受用户的输入并调用模型和视图去完成用户的需求)" ~6 _* }* {2 e# G" b; p

    - {# B- S1 F6 f; ]% B0 c7 `验证HTTP请求的数据& h% Q4 a  i8 F4 S2 J+ n

    3 ^1 U2 {, h! V6 V将用户数据与模型的更新相映射* U4 K8 T* }8 t1 f- k1 E. |
    : y0 f/ l) g, ~0 p( g/ c7 W  q
    选择用于响应的视图
      z( J. _" o8 `4 J. F. ]! k1 d3 r$ U2 {4 a/ f& X2 H7 }
    View(视图是用户看到并与之交互的界面)
    - i; ^* P1 a& k9 _7 ~
    ; d% k* R  a6 t3 l- I5 f产生HTML响应
    5 W% ?! G5 w- r6 n- B, f4 g0 q# Q% F3 J- R4 z. A8 s
    请求模型的更新
    / \# `2 }3 U1 L6 r9 Y5 U. @4 @) Z, f% g
    提供HTML form用于用户请求! U8 U& o6 J- D9 A% w' y+ j4 R

    6 E5 @! X+ i) J  lMVC的优点:3 [1 p& x; T1 |& ~2 K; w$ o5 O
    4 r0 u8 _' r9 _8 X* |% [
            低耦合性:视图层和业务层分离
    * z# p/ P; \7 S$ n; C* Z  Y& i0 |1 `8 F5 `2 G
    高重用性和可适用性8 \: a( s) h# j' A) ^6 \* {

    " E0 n! V2 m9 G& y$ c6 v较低的生命周期成本
    3 N6 \- K/ ~2 p. v8 S$ U3 z0 i
    & E4 b1 ^. l- F4 `  W$ a7 Y9 o( k- B快速的部署, ~+ b$ ?% ~  b+ s1 }5 }

    5 h9 w, G" r5 A3 |2 Q, Y可维护性
    # i1 A' H  N: v: m( s; {
    ) V4 P; Z8 C, w: m: r! Y有利于软件工程化管理" a4 m& {( C: M) i" m* a
    , A5 X" G  y3 ]% [/ q
    提高软件的健壮性, B8 J* Q- O6 g1 N2 _/ ~! c
    / V" d3 U( A. S, o, n# X( o* _
    MVC的缺点:, [  T! n3 F( v8 _! L

    7 c9 O; [  V9 T        工作量大,增加工作的复杂性,MVC不适合小型甚至中等规模的应用程序
    & m/ \0 W0 K7 O( e+ h
    ' f( h/ ?( j; s. u6 E8 F- R
    6 K' H% D5 q, I2 d7 v) y: \0 H3 i7 i6 g
    什么是Model 1结构,以及结构中各部分的功能# J, W/ R) E, q' P2 ^
    结构:jsp+javabean
    2 j6 b1 b6 |' H" S0 d" R9 q( w
    ; z: @* H- F" O2 BModel1中使用jsp来处理web应用中的视图控制部分# [* H" D# w8 \. U, m+ Z+ X5 x, n/ |

    ( X8 P5 Y) g8 _' V6 p" B( P% TJavabean收集参数
    - Z& K  n0 i4 p1 k) j% O# r% \) E# n. T* J

    6 `1 P- z' m& X3 ~( c
    . @+ \% k% n1 T* ]9 h* h& i什么是JavaBean?
    # N) ]6 J" K) ^用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。4 B/ {8 P) V7 H6 d5 \9 o

    - y' r% P, {1 ]& r$ `2 n# P , w5 x1 O0 |  _* v5 w

    , E. ]  c. P/ }& {JavaBean的规则?8 M# P+ [" U3 H" N
    使用get和set方法定义属性
    + |, P( R8 p) @' w& l+ F+ ^/ ~1 K+ M/ l' x6 o# H8 e$ T  Z
    一个无参构造方法
    $ j& `- M5 b% p$ o& J/ j: b
    , x6 O# }; P6 Z# g7 j4 h  E) {& a3 Q无public实例变量( 所有属性私有化)' r" |0 G6 b0 _7 ~$ p
    9 w4 j+ N* V2 D# q' L! I& G6 V) c
    9 j* v" D) G. p, X
    : L& w3 H7 d, D
    什么是jsp标准动作?包含那些?分别都是什么功能?如何使用?
    % ?) [3 d5 A) E9 Z4 F5 OJSP页面中使用类似于XML的标记表示运行时的动作
    2 O9 i1 G$ M" T1 }" m" i+ E
    ) S# b( Z. Z' O8 b! Y# _jsp:useBean# g& l7 O3 r/ F5 R9 n" E: g* O0 ]# Y9 ~
    ( b; @& {0 L! x6 C
    jsp:setProperty# y9 U3 \7 m  V* j! n

    ' ^0 o4 B9 d/ L8 Xjsp:getProperty; B6 K$ A8 K  }8 \/ h5 |2 S& {
    : n5 G+ k1 l- T! y2 v
    jsp:param
    / N: A  C5 ]) w% `  j% J1 ^
    # j2 e4 `; v2 M* L0 b& Ljsp:include, z7 p! u5 J1 y4 b) H: P

    9 D) E) D( J. F, ^# T( ljsp:forward
    0 X0 F" L7 x# ^3 s
    2 l) w: `5 `& N 9 l# n/ _9 |$ Q8 |% N% E1 p( h

    7 z! n1 K7 R: O2 J# Q+ H5 a/ w% W用代码示例如下标准动作的使用:useBean、getProperty、setProperty( E( k) N* k0 o! y, J
    <jsp:useBean; y- y! P4 B3 t
    : C# D. Q* l% o( B6 v
    id=”myForms”
    + W, q5 h# `$ g* ]( X: J& ?
    9 B6 D7 i) z( L6 wclass=”com.base.mystruts.forms.MyActionForm” scope=”session” />% L3 T3 t  o, p4 K9 K

    . U- d3 I5 ]0 h8 j9 A    <jsp:setProperty name=”myForms” property=”name” />
    ) f3 S. M* X, V0 H8 n
    3 U# }4 c3 g! D; L7 x+ t* L) I<jsp:getProperty name=”myForms” property=”id” />5 J1 }- f/ o$ A! O, H; o: E. L
    . z- \# F) A; o3 T0 y/ M3 ^

    * i9 N- x2 ]6 w$ q; l. f, M- V+ Q8 G( V
    描述说明Bean的四种scope/ L# @9 \4 [9 i( G9 t) R
    page+ u7 ]3 J# U0 c$ j$ i' Z  H' A

    $ t' s& s& ^1 e& U! w0 Xrequest
    ) Z  [) F% w- @8 H: P$ O. S' B# y% V9 A2 i
    session
    # r6 ]. p. k6 I1 Y4 J
    % ]- \: n4 \! v7 n, dapplication- [, N% K  T1 I) A

    % C% Q" x. C! p- L5 U/ k5 W) P
    - U0 \! P9 [8 e: j3 v( |9 W
    , {- o" p. h$ U" r7 ?  I3 o7 W9 ?描述说明页面上的字段和Bean中属性的对应规则
    8 R" g' |" l: y0 W# [id 指javabean的变量名
    ! ?. `5 _# [& `$ Y9 J. a3 E5 |% r# [! t5 r! C% N
    class指javabean类的全路径/ @# T- G- [: W9 v0 o! j
    0 o% n+ G5 D0 y3 A# m* V2 [
    scope指javabean的应用范围
    ' N5 \1 R6 w3 ^& K6 g# \' \2 n, Z! }1 M+ k; ?8 P( x
    name指所用到的javabean的变量名% S$ q7 t9 n& g" J! z" `
    ) C  M! m) f# B; v5 h
        property指javabean中的属性( s+ V; p% @& s% I6 \( ^1 t4 z
    " {4 l# K( F7 D4 Z3 v6 B
    8 |: H) {* p9 @$ h

    : P) D, d$ b; S! t4 {描述useBean动作的处理过程8 m$ p+ s% M. m& O! n
    使用id声明变量
    7 I4 p7 g% \  P% R- A- D8 ^# Q- Q& E5 x, g0 k. W% A
    试图在指定的范围内查找对象
    & n' `3 J% h1 ?! M
    / F: e: F! }8 P2 [& T) F' p如果没找到
    # s; u: [- e1 ^$ ~$ s9 C" B( O1 V! C5 g
    创建一个类的实例
    ( W& l0 k& c6 d
    4 j5 Z' Q2 I4 S执行useBean标记体初始化对象
    3 z0 K3 b4 B0 L1 q7 b1 d
      ^, j7 o& J3 |: ~; x如果找到
    * q4 t# ?& }0 w1 P2 r0 P# M, E: b) g% \! e6 `* e# H* Z
         将对象转换为类指定的类型$ S$ W8 t6 U6 \. Y0 c8 e
    ( E  N- ^$ ~! M1 H* _

    & ~* m9 U+ A* ^1 s+ C+ p
    % U: o1 K4 ]$ [4 F# k0 d描述forward动作的功能  m7 H3 T6 `8 J& W) F* ^
    使用脚本代码处理请求时,可用jsp:forward 动作产生一个不同的视图,) w' ?" K) k9 N! C

    / {: X# A* i1 W: Z: @+ G& q使用同一个request:
    9 i6 H9 o6 g4 O8 R7 G$ \0 c$ X  j$ e' O6 x+ e

    3 s  A. P% M% G" `- R; K0 i% ?7 V* G7 y+ X
    什么是Model 2结构,以及结构中各部分的功能% M# v, r5 R& T
    jsp+model+servlet
    1 k) W, q/ s' N/ ^% X2 E4 q7 s: M7 a( f
    Model 2架构使用MVC模式,JSP页面充当视图,Servlet充当控制器
    3 a+ H5 E( U$ z/ ]) V# ^  n
    / L6 J. T! h' w# E+ y5 eServlet控制器:2 z  T& n: C) W+ J* I/ {  ^  r

    ) ^" L1 F7 J$ ]4 H! h3 H2 T% U0 d' O验证HTML form数据
    0 V/ ]0 a+ X  [& S
      B6 f1 A/ C& H+ O/ X7 E; w7 q调用模型中的业务服务! m. p# j! x6 x% X! i; P6 ?% Q8 Y
    ! }& u, f3 z' E& D
    存储请求(或会话)范围内的域对象7 y3 l1 k! w! U6 ]8 A0 H: k
    9 C5 K$ V4 L1 ]: I1 P
    选择下一个用户的视图2 I& E/ [: o! _

    " O- \+ s$ v2 X1 M$ QJSP页面视图:
    6 s8 ]% z3 X! L
      b0 s3 [5 C* B4 a使用用户界面(在HTML中)& \. X) l. a* R/ r" Q
    1 c3 w$ S- I, H8 l) @. m: {: S, K
            访问域对象% ~# Y2 L' f1 s0 U# X( O
    $ u3 i& ?( l4 k( f: H  z

    0 o6 o& i. J0 |1 q* j# d4 e5 ^. ~
    + p& I, L" _0 w: U9 t8 c0 e如何获得分发器?分发器的功能?' o! h9 |7 C7 x; M
    上下文对象中的分发器:
    " s" B3 X; _3 K! }3 {. F# q( n+ C
    / @. y$ R& P: z9 s' l3 x5 b& AServletContext context = this.getServletContext();6 x% j7 M9 `! w0 X

    1 P7 p$ j2 O8 s& F& l) CRequestDispatcher servlet = context.getNamedDispatcher(“MyServlet”);+ p: o6 M7 d1 a. P0 b) N

    2 d# }4 K6 u/ \2 H5 ]: F) zservlet.forward(request, response);
    1 \2 H) h) I/ b/ V* F/ y% k9 G$ g) b* ?+ a( m- F1 ^# i7 Q, a0 D
    请求对象中的分发器:
    0 a' `; n- Y  d( h8 ]% n& K
    - \& o! V0 Y% A$ j! jRequestDispatcher view = request.getRequestDispatcher(“tools/nails.jsp”);
    , Z9 N: t4 _# Y9 I
    ; r( L/ U; r( |) j: M. f1 aview.forward(request, response);
    0 k8 ^6 i$ Q& W: F+ l4 {, ]! e- \  j: U5 J8 T7 N' @
    可以将请求转发到另一个jsp页面,并保持请求的传递性# K3 w% C: d1 v  F
    * M% F+ x2 V6 M4 L7 g; L. L
    - L2 [7 I! [$ i* |
    * @6 c/ r0 c+ V9 \/ T7 [
    Jsp中页面跳转的两种方式?4 t% @+ y2 \! C! R  _
    使用分发器跳转页面
    5 R* W& d5 B! g/ N7 G/ ZRequestDispatcher dispatcher = request.getRequestDispatcher(“url”);
    / c% r$ @4 R) {1 W4 J
    9 A3 h$ v( v* d9 l. t8 P0 q& Udispatcher.forword(request);. S% G9 R0 g5 M
    ! A3 a! c1 m1 d% S3 z9 Q
        特点:保持请求的传递(上一次请求中的数据,在下一个请求中仍然可以得到);
    9 t  Z1 v8 t5 j) B$ T, v8 b! \
    & R) N0 g% }$ {# m! j, m  d' C  _        转发的页面只能是同一个Web应用程序的其他Web组件
    7 J! j8 t) e; c7 S2 t) w$ ~! L2 A* |3 ?5 H: v6 n, S1 Q  P$ f- m
    使用重定向跳转页面
    ) }7 j$ ]. P  l  tresponse.sendRedirect(“url”);
    7 K6 h9 {' E0 s6 W  I5 x: k% n' }; X8 V' e' |3 ~) Q, V* ]
        特点:产生全新的请求,(上一次请求中的数据,在下一个请求中不能得到);$ q) e8 X) r! T5 C$ p+ i

    9 x0 w+ w. c9 B( P        重新定向的页面可以是任意的URL$ [7 S4 a/ H* c
    ; D, j/ H3 ?! F

    9 M0 e! I2 t) n# i* H  R6 {0 E$ q5 n5 i! ~% |, o
    描述Jsp中引入另外页面的两种方法,并比较两种方法的特点?3 ^  Q+ p# ^+ N3 y  d4 ]
    <%@ include file=””%> 在编译期间把另一个页面完全嵌入这个页面,可以说是一个页面6 U. g) _( J& e/ Q+ e: U; Q

    / T* n+ X+ \2 G) E- d. ~9 b在这里可以共享变量
    ( ^" M! J: K5 ?2 f& p# y4 ^6 P- q4 B, |
    <jsp:include page=””> 动态的再运行期间把另一个页面加入这个页面,可以说是两个% C6 M* H9 |8 _2 j9 x7 M3 o

    9 h& m! P7 ?7 z! K+ I页面,不可以共享变量& N  g. e$ B5 m) \' W  {( R' D+ y

    . c4 p) H1 W. Z   r5 q" E: j: ?$ ^" u1 _

    9 N- d' z: D- X9 c) w" g什么是自定义标记- G7 q; N8 Z  e( u8 N) J2 D1 Y
    自定义标记库是一个Web组件,+ U1 T( Z4 D) z* G5 m
    # W! f0 p; e8 n2 P+ T$ E2 z
    包括:0 Q' x9 ]5 s: M+ p+ }" M

    5 z8 W6 t5 x7 i' h一个标记库描述符文件(*.tld)0 I/ Q! g' s1 X* m3 _3 c
    + Y# S: b5 `) f
    所有相关的标记处理器类(*.jar)- T& O% R0 M, l, ]! x6 w" ^
    , f+ c" V5 [8 ~5 h& _* E

    ( k5 N  B! R) O0 H2 m$ I
    6 D8 f  _7 r7 T' W' \2 J. C描述使用自定义标记的步骤,以及每步详细的工作
      m8 k( Q+ J& L6 t: j! D+ i使用自定义标记前,要拿到.tld和.jar两类文件
    4 Z0 I5 Z9 a6 l- W9 K! ^
    ) ^0 e7 e' f$ w/ c* |把.jar文件放到WEB-INF的lib里面。# P7 V/ ?# e/ d2 s' ~
    把.tld文件放到WEB-INF根目录下。
    % E6 b. j9 }& a& I9 g! v* j在web.xml中配置。
    5 N8 P# _2 |: k- ^% V: ~, s2 P<taglib>$ j( X1 e+ g, u; @) G. {

    3 s9 b" Z) e: Y/ l7 L<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
    / m5 m2 ^4 Z- R% P) }. X8 z
    ; H. N- o. ]) E! y     <taglib-location>/WEB-INF/c.tld</taglib-location>! h; Z# ]. e2 l2 c2 ?: K; N5 L

    - k8 a7 s2 a( q! X* k/ g# y</taglib>( D: |3 E0 S2 P/ S
      F1 x1 A* \) N0 T7 J( s5 I
    在页面中引用。
    ' {4 T( q8 V& T* [<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“s”%>& X! {+ t0 `; P8 i9 d2 @
    3 l5 g+ A4 }+ O! @4 Y+ O" m
    uri必须与web.xml中的uri对应& Q! ^/ p5 N$ x
    6 t* L, C9 N" G; w1 H6 S
    prefix是前缀,用来区分是哪一个taglib
    7 I! ^3 ?6 v) \
    0 \( ^4 n' [3 U使用标记4 V% Y, G3 V/ U9 O* s+ l: {
    格式:<prefix:tag名称 属性>$ v: Z* W  |/ ]3 j! e# j% }

    : a' Z0 I; g% k5 m6 Y1 b+ `<s:forEach >
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    14#
    发表于 2014-12-03 12:45:59 |只看该作者
    在tomcat下配置数据源) f7 d8 q- e& B! b7 F
    1、服务器与数据库的连接  H; |5 A0 U7 a# g% y6 k2 ]
    + |% B" {7 J+ e) P
    配置server.xml文件
    5 s( k( r) j1 S6 j7 h  d! }) C* a" b+ i# o! t# f: {
    1.oracle
    $ ~5 s7 G$ V/ R( {. d& _! S/ ~  a; R" y# k5 J& k
    <Resource name=”jdbc/company” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
    / z6 Y6 h5 @! D* e0 ~" G
    1 r7 s8 O  M. o  X8 O                        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”$ ?& i, w8 m0 w0 Q% J* D1 `6 Y% h5 F2 ^4 Q
    % C. T! P) O$ a$ B2 d% Y4 k8 v
    url=”jdbcracle:thin127.0.0.1:1521rcl”
    # T* K/ X( @% }# I9 v. n8 C0 @8 J! F
    driverClassName=”oracle.jdbc.driver.OracleDriver”. o2 s% e( I- D5 k; ~/ ]

    * ^  A. R1 C* Y% r% husername=”aa”" Y, T' L' ]7 y' y, i5 i
    & u$ J8 ~3 ^' M' @* w3 m1 E
    password=”aa”
    ; V: e; Y0 }3 H# y5 r5 u# u, \3 i1 ?6 o3 N6 s' s
    maxActive=”50″/ I# Q% D8 ~. u7 Q5 [' y' c& u; B
    # Q) |( x. r6 A4 t, C
    maxIdle=”10″
    5 A- v( `4 M' a5 N
    " \4 A" p9 Z% M* ^" r8 S3 h. `% i1 CmaxWait=”-1″
    ! H. d# _5 H9 e1 R5 S5 Q% L5 J  ]
    />
    , q& ~* _/ [" P( z8 [
    # [: f" @; f" X/ E5 u2.sqlserver0 w0 T4 d7 j/ ~3 W. R% ?& u" y" |

    9 r, C7 z2 K3 k! i5 u! h<Resource name=”jdbc/webpage” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
    & m. R$ h) {1 q: l5 A# f
    - v/ S/ X6 T1 r        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”
    : Y5 i0 `$ a! d5 K: H- H( s% H& J" A/ Z5 T0 \! `5 m  x: ]
    url=”jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;( k. U' ]8 U9 n0 O- q! ]$ f

    2 ?1 n( h% {5 _+ W8 v8 KDatabaseName=webpagetest”
    3 I) z+ _+ X% A3 j2 F+ ~
    ( `' O3 O  p( I2 l, jdriverClassName=”net.sourceforge.jtds.jdbc.Driver”& n: L) k7 o- Q+ L7 t* c% C
    8 B& j  r0 F+ g3 }
    username=”aa”
    ) \; F: Q1 \$ q5 L7 i( e5 n: K
    / w' G5 D* w- Z; `0 q) W9 mpassword=”aa”
    5 l5 `) c% X# A- R; d5 w* g& F' J3 r% T
    maxActive=”50″
    , ?1 F& \/ Q% n3 ?1 z6 G! o1 @
    ! v4 E, @# h+ _3 p2 ?6 {maxIdle=”10″
    5 G0 t2 Y1 F+ x
    ! V3 _% m2 U  x/ B" E, z" ?( AmaxWait=”-1″
    / x" {. p6 k6 Y- ~  u! v0 w0 `3 m" T
    / U2 y# z$ @$ L; {4 @6 D/>
    . l* m! B- L1 b! {3 s* M: T# ]* w% G6 t0 v2 m2 f6 H
    2、配置自己的web应用的xml文件; {3 S- ?; T; t" K2 M

    + f! p4 j) O( m+ W3 U
    1 P' S% a% d: g* b# @; N" ^
    * n3 p4 k" x0 M<Context path=”/eb03web” docBase=”F:/workweb/eb03web”
    % g0 C$ d8 T/ ^1 {: f; F1 H' s7 v$ x: C" g
    privileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>2 A% Z! i2 G0 p$ u* A" D

    - ]- k3 {/ e! |/ `/ l# P, \<ResourceLink global=”jdbc/company” name=”jdbc/company” type=”javax.sql.DataSource”/>
    & g* E. c: q6 ~+ k, \5 q6 K2 h! d6 n7 q5 R0 q2 V; E( H% J
    </Context>
    $ F) r0 d/ s' V1 z9 `+ a7 ~! a1 c/ o8 z  e

    * q8 j. ]4 J( u, `
    / }% B8 k) }9 \, ~5 A" b' j' U$ L3、配置web.xml文件: H( L$ l8 ^# s0 v( z
    & P) c4 w0 ^/ N% s; ~/ Q
    与服务器建立连接
    & ^4 R5 c3 q: v! u5 [3 e+ J/ R) `
    3 ?, {2 H! N7 H9 a/ n<resource-ref>
    / D8 i4 i) X; ~5 p
    & a: M& e: k2 D7 {) O( p/ o' W' E<res-ref-name>jdbc/company</res-ref-name># d. ?/ |4 A# Z) U* {+ Q

    & X2 L0 z$ h+ X1 n4 p<res-type>javax.sql.DataSource</res-type>4 N3 a+ D1 F1 j. e/ S6 T9 b. Z' G
    / J% h  l% R! Y: o1 H
    <res-auth>Container</res-auth>
    $ H2 k* J, {6 c, p* g7 ?
    5 F8 F% p4 \7 s  ~0 W% d# e</resource-ref>' s  {! B8 g1 t" H! T+ S
    . g! e/ o$ P. s8 s; X! h) X4 |3 v
    4、在应用程序中不直接与数据库连接,通过DataSource连接池建立连接$ F" b2 e; ^, K) |

    # S3 w1 @* ?  p* [4 b- @" g//1.在程序单独用时设置系统的属性,在tomcat下可以不用配置,9 y9 U. o; |9 S( w: H. k

    3 z. ~% ]9 O  _1 Q6 F3 W3 aSystem.setProperty(Context.PROVIDER_URL,””);* p" _7 J' N1 ]0 Z' l& {  j$ g+ l
    # ]/ d9 e3 \! h; P! {5 I5 L( A' X4 o
    System.setProperty(Context.INITIAL_CONTEXT_FACTORY,””);
    % f6 T  A* E# G1 j* M$ I; I& u6 `6 c, E- D5 i" {' \& x
    //2.创建一个上下文对象0 _! E0 d6 E5 g! y6 l! K+ k
    ) _2 d; O& a4 ]% K( c) ]
    InitialContext context = new InitialContext();
    7 u* `3 j; V) J) I& U
    1 b! I  K( q/ t* @2 N//3.通过上下文对象在连接池中查找DataSource
    $ l$ ~1 ^+ O  J4 D# a$ T
    ) t& [( M5 F% n( r% m; |7 YDataSource ds = (DataSource)context.lookUp(“java:comp/env/jdbc/company”);
    / C- N9 p/ @) _) Z+ u
    * I; _0 f8 N& Q* u+ z//4.通过数据源建立连接
    ! n( X% n# w! a  L- t4 u7 v; i
    $ O: q( m! W: yds.getConnection();
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    15#
    发表于 2014-12-03 12:46:30 |只看该作者
    ORM对象关系型数据库映射
    # q9 C  Y0 G$ x4 O(Object Relation Mapping)3 D5 d3 G" T4 o% E
    8 T5 i% T$ P4 o# R+ q$ [( f
    一、映射的特点- c% k' u* [* h+ ?8 n7 h
    + H+ s* w5 `7 q* _& Y% p: m5 J+ }
    1.一个对象可以对应多个表
    5 F6 x5 t' h, M8 l& f( }
    ! x0 ]! [- @0 ~9 }8 @8 k2 ~2.一个表可以对应多个对象3 j. L4 A: v; P7 @
    1 _- v4 z. q3 V7 g
    3.对象和表的关系不用完全对应
    6 X$ A: V1 u9 M7 n5 n; a& `1 m1 g! ?/ G  k
    4.对象的属性的名称和表字段的名称可以不同3 U+ h# \% I; M3 o* h# j+ A

    & V  a& z5 {8 E( n6 i" j1 `5.类型可以不同,但数据类型之间可以转换
    8 K- V6 U  V8 m1 S' Y2 ]
    ) W4 g  _! d  @1 t5 ]* |& P6.对象中必须有主键,数据库的表对主键无所谓
    ' B( @& i+ e8 G- |# {4 L, b( _9 a3 d% ?& d0 f  |9 g" ?+ ~
    7.数据库中有主外键关系时,对象中可以有,也可以没有
    5 K4 l+ O; h2 E/ t6 K$ k9 c- L+ k7 R' {) d, H8 G8 B+ o0 T* C
    3 }& t3 d2 [% B2 b! f1 A

    0 E5 p; {  n3 x二 、有一个映射的描述文件————>xml& e& o! O. l& i/ x9 M

    / c7 y4 N1 o# C: O三 、怎样实现描述文件————>一段程序2 A9 }( }; r  s) E3 K5 ?7 Y, i
    # _# [! T) L' d5 m
    对象 映射(mapping) 数据库
    * X2 y' }, K2 \4 d4 l3 I
    % E  e/ i7 a6 j5 _5 n! Guser
    3 U9 S" i* t/ x- B8 {( }+ L% U3 j' x. q7 {2 A2 }1 |1 m9 U
    id=11
    - ]- k7 i# V! a9 B3 T; R6 }
    & c% G* @2 j. ?+ Tname=”张三”———— > (1) —————> tbl_user(id,name,age,tel,address)
    5 a4 y- c2 d: D2 m" E
    0 d9 m2 g6 F9 t& J: i1 L" k8 lage=25 <————(2) <————/ e0 Y) q+ l  X6 J

    * F- J* T; I3 i0 A) G! _# ] " b9 x8 X$ z2 y7 |! W9 d# t% S

    $ o4 F! s$ a- r! n5 A: T+ x9 }. G(1)从对象映射到数据库
    . m( Z. ~. h0 Z. S  U) o
    / O1 t) |! P6 o2 y1.JDBC
    . r4 u2 O% ]) g+ e1 |. a: h
    $ a' ?- v) v4 f& L  k2.根据描述文件来动态拼接sql: G, V% }- }3 L, R6 {5 b
    , Q0 \4 h* }/ Z! m9 U% a1 z
    3.执行,添加到数据库中: h$ `# ~  P1 ^- f% }# J4 x" v; c

    7 q. U: x' t+ R5 n# J ! f" C+ O! P5 x" G
    ; `% P/ s. i  b7 |8 U
    (2)从数据库中映射到对象2 {0 x% [3 `6 @2 F3 m- s

    . D7 |* S5 a9 Y/ N+ w1.JDBC
    3 d% m) V' X( n5 g0 F. t+ h: W
    0 d" I* Z+ A. o+ A' x8 @2.拼接查询sql; T, J7 ]1 T7 B* X

    2 c' ]  \3 k- q3.ResultSet
    ' X/ v& N' D7 Z: p  R
    ! ~7 Y4 n3 g1 g  N0 r/ R% Q' t; I, i4.Model
    . w! S  Q7 L- W3 E9 R1 J9 P
    4 j$ E" Q7 _4 B4 u0 h
    & H* p! {2 n! ^( E+ N) i' O& Z9 R/ w$ |: f+ Z2 M
    hibernate
    7 x& ?& n* o: b1 S2 |开发流程:/ x5 b4 x( L8 @8 C! w& W4 r

    : \$ N. E; A; C% r6 r! T7 {5 u是什么?
    2 E8 o9 h) W+ s; `2 Hhibernate是一种基于orm 的轻量级的框架
    8 R: v  V- n' k% d4 ?5 [0 S8 G/ y- P# m: }+ }. \) Z
    / ], C  o- r, L+ c
    5 T8 a& K5 L3 A9 ]
    有什么?- d, L! E( f8 l
    1. session 保持连接状态(依赖事务和连接池)
    8 |, c. R- v& e; J7 z$ o) Q$ R; c+ B+ G
    2. Transaction事务
    % X, u0 {2 R7 X/ y, I0 s& q
    3 Q: l1 M* m& k8 [3.
    $ k. m2 W# T+ \Connection Provider 连接池
    % `; p4 o' W/ l' t1 _  s5 r
    4 O& N1 ]! u: K2 j& z( e * P  B5 \5 H/ q9 m3 y% y% M" h

    ' s3 V% _4 M7 d1 |$ i9 u能干什么?: y; }4 R5 M( d2 a" X& O
    1.orm
    5 p+ `6 L' p* }2 K2 ^3 L( [  R' w. _+ e) c! i1 ?& [( w+ r
    2.提供操作数据库的接口,简化数据持久化的编程任务" w8 N, k" t: e0 E
    3 f' u( P/ h4 e7 x! a3 u

    . i0 w: y8 T1 u# j# E
    2 U4 h. W5 Q" S怎么做?
    ) L2 F, r* f6 R# [- B1.搭建hibernate的运行环境,将hibernate的包和hibernate所需要的包拷贝到lib 文件夹下
    # i8 o: l% T. Y5 D1 N. ]' ~8 F! V7 l- v$ n. r
    2.O(vo)  s) g" Z5 H( E

    4 [" O; t6 l2 s" k- S3.R (关系型数据库中的表)
    % f3 W& d6 a( m9 g" U& D/ n) W$ S! g& M# X3 a
    4.配置文件. F9 e6 s$ `4 p7 s1 \: J1 d1 I

      q. H5 ^% a' U& p' q4 F4.1 cfg.xml 放在classes根目录下,默认名字为hibernate.cfg.xml
    4 x; s# L5 I3 q; y! h  z. m
    / X4 ]: {) Y  a- L/ o7 a, f: d2 Ia.与数据库的连接# M! x7 Q& P0 F' e1 U

    9 A* m( f6 C# S% s" W, Lb.可选配置
    : J  t$ y8 ]* |7 p* ?% s* q+ }2 B2 l" m2 F+ J( f. b% i
    c.映射资源的注册( R$ R) m* ^4 _" r0 w
    9 H. \# }, X9 p
    4.2 hbm.xml文件 名字与类名相同 并且与类放在一起
    # b& c7 O5 t8 X* ~2 B/ x+ B* v! H. Q  I- p. J/ h( S
    a. 对象与数据库表之间的映射/ D1 z+ T9 K4 z
    ) w; J' E/ F$ ]% b. f
    b. 对象的属性与数据库表的字段之间的映射
    . K- e) z2 e# c% ]) W
    ; H5 o: T/ ]( c9 u+ ~c.组件之间的映射
    + e8 t- p- w$ E. j6 d7 G+ R' B1 o2 `" g/ o
    d.对象与对象之间的关系映射
    1 e" u. N# O  K; S) _" ]( g4 A/ {4 R$ I$ W
    5、客户端
    8 Q. {8 |5 h: e$ l' k- s) x
    ' X+ c6 ^; p1 ^, l- o9 {1.得到SessionFactory6 O) C8 D; b' \- z. Q
    ( Z8 C8 G$ q( G
    2.通过SessionFactory 工厂来创建Session实例
    0 a3 \* t' F: W7 I& ^8 {1 `/ U1 |" N
    3.打开事务
    & G' B( l' c( |0 x) |
    # h/ C+ |3 Z+ ~/ |- O4.操作数据库
    ) c) C" |9 b$ K" n7 v
    , m# O5 j* C& {; Z' I, U) V( Q& Z5.事务提交
    0 K( f9 I4 V* p1 H! H: ]  I3 r$ m& Y6 h- C' i  l7 `
    6.关闭连接
    4 I3 D# X& K" I/ u' W  a4 O3 y3 X0 L2 V7 _0 L$ ]; e2 H, t
    运行流程:! l- p& A4 h& K4 Z( T
    + @" A! \  q/ R4 ~
    整体流程5 _6 r/ B0 V( J, o, v# F+ H* z
    1.通过configuration来读cfg.xml文件
      o& g0 K5 f5 P( S* ~) }: _' E5 Y+ W- }, {) J- F% z( a
    2.得到SessionFactory 工厂(根据数据库的连接来创建sessionfactory)
    0 b* w0 [7 F$ Z1 @3 n1 t" J3 x
    ! C& Z9 e- s* W; ]( ^2 n) |3.通过SessionFactory 工厂来创建Session实例& [1 E2 ?) y8 G# ?

    6 y( @' J6 i/ ^, t& C/ V: T0 j4.打开事务' o9 H9 ?/ P$ V$ O
    ' B1 g, @  O8 z2 u) Z1 k
    5.通过session的api操作数据库- X- u; I4 P) ~0 G! S! `% A
    , O$ i, o: e: f: K6 S% ^( c
    6.事务提交
    ' f# b8 m) c( ^5 k5 l. b8 w: L' y# I7 s6 I; I
    7.关闭连接
    4 v7 s* P: K+ e! \* t* M
    . h7 }3 O2 t4 O' F# {# w2 p 2 Z* E/ B/ I( E! h) a2 Q* C* n
    9 ]' c* ]. Q; U: R7 ]8 u) a
    save+ a  @( A4 M9 O+ D# u6 T
    1.to—>po
    ) O8 H; c* L8 Z# p' M
    5 L+ g+ ~7 `( ]* e0 _! g2.根据model和cfg.xml中映射文件的注册来找到hbm.xml文件
    8 V3 ]/ |* o$ H# s6 w+ N" ?) e8 j! Q+ b% ^
    3.根据hbm.xml文件和model来动态的拼sql
    4 T4 E$ q4 O3 R( j) F5 w
      J- F, K3 \2 y8 T1 _- `4.客户端提交或者刷新内存. a: {0 _0 x, G" z8 x

    % a& |( K2 j. y1 k0 y* c" R5.执行sql,值放到数据库0 O& I1 ^) F/ L1 C) y2 g2 U
    - D6 T9 R$ G! G: @
    ; `0 a( B/ y& |+ P

    : z- X4 Q- p# X+ _" Xupdate、delete' E: Z- N# i" [- O8 ~9 q
    1.根据model 的id在内存hibernate的缓存中查找该对象, J$ B4 ^' X7 o9 u, r2 o3 A, V( D3 ]& E
    # ^8 n! y# A7 d
    如果内存中没有就到数据库中查找来保证对象的存在% S* m. z0 e  Z

    * ~" P3 R. y- ?7 f. r" H  f1 U2.根据model和cfg.xml文件中映射文件的注册来找到hbm.xml文件6 I8 y  l# h) V+ ^$ X7 ?" A
    $ h5 \+ Y; p: J2 W$ v7 T
    3.根据model和hbm.xml 文件来动态拼sql7 u  A5 k% ~) X( J6 k6 M3 t
    ) y0 m9 W# _1 X' i4 I" Y# V% t
    4.客户端提交或者刷新内存
    , A: }& I& ^6 f+ I# B3 @* y; d. i) @$ ]$ P
    5.执行sql, A; \$ w; l  M

    7 b4 q$ h' ^* K( L3 T4 w# G/ m 2 c; I4 I3 Y8 D

    " j. P; N+ N  S2 Z/ h9 @Query
    . X. v2 p1 C* k% ^. E/ D0 F3 iload( b# z* Z6 a! g7 {3 x
    / n/ {/ Z6 q# x& F: j9 P6 D3 a2 E
    1.根据model的类型来找到hbm.xml文件
    " G4 S7 s: Z: h) }" }! L, H/ r2 r6 {6 I6 J/ M4 J( m
    2.判断id对应的对象在缓存中是否存在,如果存在,就直接使用,如果不存在就进行下一步。
    ' R5 w; Q' a+ r; D8 g' s1 \. S, _5 \8 g& K0 x: p* a+ U
    3.用id做为查询条件来动态拼sql' g8 }3 r  H2 ?' H0 e# m

    # b% Q$ [! T* A8 f5 \7 u2 L4.执行sql 查询(先在内存中查找,如果没有找到(会抛出例外),就去数据库中查找)3 E" m6 f0 y5 f% {6 u$ @; k% @

    0 t3 }3 K7 \# j; M/ Y$ o3 U5.返回一个model类型的对象. s' U" H  s, R

    9 C# R+ z. R5 d& z; }get
    ! ^0 i; R+ X3 N% F- e* r! f) v$ D: `/ c$ }/ w" a# {2 E: j: z/ B
        1.根据model的类型来找到hbm.xml文件5 V3 V" Y  }) e: T
    ! t  w$ F, H+ t* ], @% g) R
    2.用id做为查询条件来动态拼sql! F8 ~, |) v" J6 i

    ; N+ J/ o2 ~/ ?! u  B$ h8 w2 |; t3.执行sql 直接在数据库中查找,如果没有查到就会返回null
    * P4 J$ G7 A/ f) k; o
    3 @$ i9 g0 K* ^) Fquery
    3 F' U' l2 R5 G0 Y2 [5 H- E* Q5 `+ |2 |! c% E9 p$ K
    1.分析hql语句,得到model的类型+ G/ A& {$ B4 E- }; _3 j

    ' r& U; X! Z  t2.根据moedel和cfg.xml文件中映射文件的注册找到hbm.xml文件! Y7 O5 _" G2 L$ M# Z5 l

    6 Z; O; Y* q4 N7 E$ I5 f- m% g3.根据model和hbm.xml文件来动态拼sql
    ' m4 X/ ~  B' D% Q9 d3 }
    ) d) S3 \4 E' |9 Q9 o, s4.执行sql查询数据库/ ]' }! N+ k$ t" f5 U) b
    2 n) T9 M+ }3 p7 L7 s$ x
    5.返回一个resultset! R) @1 ~% _4 q) A  x

    . K+ G9 I* |9 j+ m, T! n6.循环resultset的值,放到model中在放到集合(List)中, m9 y4 Y. d. [5 D% n( e

    9 q2 Y$ R+ ^% `& |, Q
    ( ^: T, {! T7 |$ i1 G0 n  g: z  Y: P' n8 M0 V6 s
    谈谈hibernate缓存机制1 a9 ?, J  l. s; |2 Z4 G# N# Q
    8 m, s1 R/ r8 j( C; c3 D# R
    缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了。打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去数据库中取,也省了很多事。* S7 d! k5 V) _

    6 c9 f# [& V1 C3 M. c
    3 ?# O* p) N  u3 a- d& R8 v6 Q4 Q. {, O7 o/ o, |3 y" f/ X; Q
    hibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。. p) g  F+ E+ S

    ' }6 y7 g; B5 ]! m6 p 5 r) B4 P* h. J# f7 R4 s/ E" G
    2 G# q( N9 H5 x1 x+ h0 V
    对一级缓存中的session事务进行数据的预存取,数据在各个session的上下文中存在(单例),当session关闭时,就是session.close( ),整个所有session范围内的数据全部清空;二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二级缓存只有一个区域 ,画个图比较容易理解。) x' G$ y+ A* w- w7 e' D# D
    - k* P) {( `# Q

    " X- R- U8 Q7 T9 P; G) {* p! N
    . e$ L0 a* p5 K| 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|
    4 @! l% m  y# I, ?$ K% J" |, u  X
    0 D0 \+ F3 y* m5 J; x6 ]| | | |( \* i; ^. }, F) ?' F3 r" O, w4 v
    1 j  o6 {; S" k& e' |% k
    | | | |. F+ z  }% U2 ]% D5 v
    ' |( {* B7 U; e) w7 Q
    —————————————————————————————————
    9 M% d& p9 o/ j5 L
    " x+ \7 s! H; I4 isessionFactroy级别的二级缓存# C6 C& i0 e" M8 ]+ a" T
    7 B8 \7 d0 f" r+ a9 n& U2 q
    ——————————————————————————————————————-, S. ]( z) \+ ]9 [7 V! u$ c

    # e& j/ K1 Q: D2 l|
    8 E1 T8 D( T% a+ E6 K, i7 d+ B/ h+ J: l9 `7 {6 Y3 ^8 @6 N, h
    |
    " N& O) ?! B) M6 x9 ?1 p/ w. ?$ U  p. L- F3 u# K3 a* o1 `
    |
    5 I/ ?. b! `1 O1 f$ v( G  m
    ( q+ \) }5 W, a2 `/ L——————————————————————————————————————
    ! y5 ~& m8 X1 x7 @# m6 X( G+ _1 o- M. Q1 r3 Z1 {5 p% r
    DB( E# G6 @# d2 U# R

    / a, @6 y0 s& K1 p6 u+ a  a—————————————————————————————————————–
    # n( a0 t( x$ }, R* x  r6 M+ O
    ) H; d, H8 i* w( c
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    16#
    发表于 2014-12-03 12:48:12 |只看该作者
    Spring
    $ Z3 s+ i" A+ X# p" w: w# H, l
    • 是什么?2 Y  P0 k8 y  u! e5 U2 b

      ! R& N) D3 J& `/ e6 Q9 V

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

    ' ]* P- j. G" T( `! H9 v% N. }
    • 有什么?
      ' {% C$ L3 I7 m; h" c+ T' C* J
      / y8 H) [/ h$ s. A

      r# F+ v) D/ l4 ^

    每个包的功能:

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

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

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

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

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

    AOP :面向切面编成

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

    : K" _+ e# B' |! T
    • 能干什么?
      # e$ m; O$ l2 v( I4 ~6 k

      5 r2 }' ~+ I# L7 Z  K6 k9 j

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


    ) }% P) ^: U! P4 a8 X
    • 怎么用?
      / W" w5 l! m' ^1 Y, O& ?" G

      ' D- {7 c- M6 W8 }' n  s
      • 搭建web工程,引入spring的jar包& j: H$ b% s  F. b  }4 [
      • 在web.xml中添加如下配置
        . X0 f" g  M4 E4 u
        : d3 {% o2 _. W: o

      $ N7 K/ A8 D9 y5 u8 H" k: I
      : Z0 X& n! S& P6 y7 D3 B  [

                contextConfigLocation+ ^1 v/ e0 N; {# T: D& \

                classpath*:applicationContext*.xml) ~7 h8 l2 s/ v0 ?6 h( \

       
    5 B2 f- L! X. r7 W1 \' k, B. I

            
    $ R1 M# a4 P" E# d8 i

                struts2, f1 H$ U, K3 T6 Z- T  x8 w

                0 f! O9 J* \9 F# i

                    org.apache.struts2.dispatcher.FilterDispatcher
    ( U0 I4 @5 c* w) k) E

                
    ) j! W& O5 x! D

            / H& i7 s6 U( Q7 ~. C

            ; X2 S- s+ n. w

                struts2
    ( f2 g& `7 n* h8 l5 O

                /*; q5 Z4 q) l7 o3 B# D

    : e3 Z- v% @0 c" f, p6 D0 o9 Q


    3 D) A+ v7 F+ o8 @- @

                
    9 ~1 z! D  t& u  p

                    org.springframework.web.context.ContextLoaderListener
    2 s7 e' B& u2 s1 o/ u( M

                
    1 e  B3 a* N; B( A' M

            

    • 部署; M' O6 s$ b2 R

      4 U! h, `+ C3 Z% A- b" F  l

    8 T; ]9 Q0 ~" N- Z. a& G
    , H8 X4 d& X' C( g* R+ |6 v! a/ I0 c% i. F1 ~% x
    • 容器和bean3 C% |  g1 w2 m. t  b/ ^7 ^8 k) ]

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

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

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

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

    2 w" b6 ~4 b! B4 Z
    • IOC控制反转8 d" ~$ R0 D( g% c. F

      6 O7 L+ \  D$ U" n/ k1 U
      , s$ L# U5 {7 \& V" {; _
      0 D) g3 G0 W; {6 q
      从前的应用程序想要得到A的实例他会直接主动的去拿,当用了sping后,应用程序由主动的去取变成被动的等待,由spring来控制应用程序所需要的对象
      , ]7 h: ]. B: w. ~: E- t
      • IOC的优点8 V/ H! |8 T& y- [, \5 i
      1.可以通过IOC来获得实例
      2.可以通过DI来获取注入的资源
      • 配置IOC的原则
        * i9 ]. I0 Q1 J: j& K& k
        • 一定是可变的资源才采用依赖注入
        • 一定是层间的接口或者是模块之间的相互调用才采用依赖注入) d% H1 |- q  D5 S! P3 V+ o
    * C$ v& V0 F/ [& F, y5 _3 ?
    • DI依赖注入
      , t( @9 W9 b7 l7 C! F7 S

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

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

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

    例如:

    在配置文件中


    3 M5 d# U8 h+ ?2 g+ a3 P7 R5 t# {% B: I9 P* F! `
    4 i0 f8 R2 ^* H2 G1 S3 `+ n' y& j3 x

    在应用程序中

    Public DBDAO dao ;

    Public void setDao(DBDAO dao){

    This.dao = dao;

    }

    3.构造器注入

    - E1 B4 \4 L! l; Y; |4 ]

    4.ref 表示参照其它的bean

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

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

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

    6.lookup注入

    7.singleton

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

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

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

    8.DI的优点:

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

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


    . ?7 v% ]( \! a0 e, `$ p3 I
    • Aop面向切面编程3 }/ f* w0 w; B7 H5 y- z/ z

      ' ]7 A% X; w, i' i8 Z

    1.AOP面向切面编程 一些较好的模式或者是示例—-范式
    ; j6 A3 v: _6 I  M0 m+ U" j8 m

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

    2.AOP的思想: 主动—->被动(追加功能)1 _/ G( p0 f  Y& m. w

    3.AOP 的概念
    . c2 c* M6 Q( t( }" @

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

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

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

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

    5.引入 :扩展的功能

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

    7.aop代理 :实现机制

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

    4.AOP的事件机制
    0 L+ W- H0 G, @. g+ q$ @

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

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

    3.找到切入点

    4.确定连接点

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

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


    % W2 h8 \; a' i+ i6 e5 Y  @3 ^+ e) E9 ]3 T% s# ]9 i
    * ~/ r% m. \% d: c) d! ~
      @/ W  l0 B4 _0 P  q
    0 x  V1 m) |# I: f0 k- F0 E4 f  \
      ]: \. A2 O9 X: U! N8 m4 k0 f

    ( p0 n5 p0 r% Q8 E& Y+ E' N

    5. AspectJ
    ! r  o4 y8 Y4 ]. d

    5.1.在xml中配置比较烦琐
    " v' u0 A: X) x- z% n

    所有的入口必须从一个代理(ProxyFactoryBean)开始# {" E$ f, h4 w; p# r) s


    # X: \3 O! W5 h* o+ B / j* q) ~  `8 G1 h, P, V% [

             
    # P/ X% E% P- t1 M5 g, r7 O) D! |3 `
    8 w+ c9 k3 \5 d0 I
             
    & f% A8 t4 f+ K4 s3 |7 J8 o: C; k) W

            
    , V' w. b$ I7 r: v  c! h

            


    : G' T( h& ]2 [expression=“execution(* com.javakc.aop.MyTarget.t*())”/>
    ' o' ?7 T# ^( g1 x3 w

            1 Z; l/ @! q; e7 L

            * v9 k" `- `5 P! d. m/ x) J

       
    % O: i& S3 Z( E* K$ u: P

    , x: [+ e7 _/ ^: G/ [$ @
    2 a. ?. C* L0 q1 g0 \

    5.3.使用注解的方法相对简单! p9 o5 m1 F3 i$ @4 ~

    @AspectJ的基本语法* {( ~8 x* n1 I5 B% b7 c2 ]: d

    1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面1 P5 A* Z0 z! L: s% [* k

    直接在类上定义@Aspect; L* d1 ~. p+ ~) [) S* g

    2.@Pointcut声明切入点# q6 K, N# ~2 \/ O

    2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字
    " @: ^) B9 _2 n% `  E

    2.2、可以使用匿名的pointcut
    * A: v4 Z% M+ S, q3 H' N

    2.3、执行切点的几种方法" D! t8 y! b+ x2 L( f8 {1 ~

    2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法
      |+ g  f  a4 h! o4 c, T# k

    2.3.2 within 指定到包,不能指定到类" p0 X8 S9 p6 t$ K

    within(”com.javakc.spring..*”)
    # E! x: {+ V$ d2 X2 i

    2.3.3 this 指定到实现接口的所有的实现类
    4 V& O8 f6 A3 X4 D9 j

    2.3.4 target 指定具体的实现类
    / S( M, q# D- K# Z1 N9 T/ ^8 a% q9 {

    5.4.advice的五种类型的示例* U3 w; W6 r0 C- I2 E2 h, i

        客户端必须从接口走才能得到监控,实现想要追加的功能& q7 }7 V  m4 n8 r7 k

    5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)
    4 V) j' Y, x6 i* O0 Z, V

    追加的方法的参数名字一定要与retrning的名字相同
    8 M! e5 }. J: q: z% T. ~: T' k6 {1 [

    在注解@AfterReturning中必须加上pointcut和returning两个参数+ i  L; f& \) Y  N6 I! u

    pointcut指所要监控的目标对象的方法! y) |& S# @" b+ O$ H7 ^& G- l

    得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配0 ^) ~. O0 d1 d2 d, E, i8 F) Y

    完成追加的功能6 }( h; T1 `4 \. }9 X0 L, Q

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用2 ?  |* B4 S; H+ n0 F

    (1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)
    " J: {. u) b; k& @% I! `+ B$ r: b

    (2).
    ! l# b  Y8 m/ E& @* B) Z, N& T$ S

         2.直接引用匿名的pointcut
    6 j% x$ p( }" z9 o7 u, ^# B7 y

         (1).@AfterReturning(“execution(+ U, X3 [3 H( g0 ^6 y

    * com.javakc.spring.schemaaop.Api.test4())”)7 v; x# E0 ?5 [7 Y6 Q

         (2).@AfterReturning(pointcut=  g" v2 g/ u- \, ?" F- k. \* A

    “com.javakc.spring.schemaaop.TestPointcut.t4() &&& q# r  C0 M* U# W8 T

    args(str)”, returning=”retVal”)
    - M& G; L9 q  @" b- \! J

    @AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)
    ) ]: ~+ ~7 `# i

    public void testAfterReturning(String str,Object retVal){  m! L' e4 ?. g& j: T% S# f( ?: y

        System.out.println(“afterReturning1=>”+retVal+”=>”+str);
    $ G0 c' ~( Z  H4 r& W0 }' @

        }
    1 N; G$ n' l1 O9 q. l4 Q1 V

    5.4.2.@Aronud
    * a4 I' }5 ?8 Z" C0 O% [

         注解@Around环绕追加功能;
    2 ]4 w. b, c$ P/ s

         在执行目标对象的方法的前、后追加功能;
    , O2 |3 B. U% c, L$ c5 h

         必须有参数;第一个参数的类型必须为ProceedingJoinPoint;
    8 _" Y% h9 Q- c5 |

         通过ProceedingJoinPoint的实例的proceed来调用所监控的
    + n% A  j0 U- L4 b

    目标对象的方法
    " \6 t. P8 j. f  F" [9 U, _

         1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    " d' ?  \" `% l- D. s

         (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)" s& s& j' q* q8 I

         (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()% v" S+ x, S9 h$ c+ p9 t6 o* C

    && args(str)”)2 H. i& v+ [+ ^  e0 i+ S0 r" |

    2.直接引用匿名的pointcut
    - O  `5 y7 o/ j8 h

         (1).@Around(“execution(
    * c# X/ T5 H$ }" f+ S: K

    * com.javakc.spring.schemaaop.Api.test1())”)
    0 [- @7 a, D2 C3 R3 h* \2 V

         (2).@Around(“execution(
    ) U& J4 P/ |6 w2 L0 }% ?# [2 A

    * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    ! i$ D: [$ H) P. n/ U" Z/ W

    // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)2 y( C% G7 [6 ^& F: i7 l8 A

         @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)/ k6 s3 Q- r: Q

    public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{
    - t$ v: j6 V1 c: C- B% y

        System.out.println(“around1==========before1pointcut==>”+str)  q+ H; I: N( V: I

            Object obj = prj.proceed();$ c8 k: T' Z; }! g9 a# L

            System.out.println(“around1==========after1pointcut==>”+str);
    6 N8 Z( r2 K- G: {  S+ D; R

        }/ R& e- R  d% x! I; e

    5.4.3.@Before
    5 o& ~8 i' I" p; i

    注解@Before在执行目标对象的方法前追加相应的功能
    % g. \5 m2 n" q5 Z( g+ k' h; |* k

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    7 O, k& }" A  X

    (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    0 k6 }. L$ ~8 x6 w$ I

    (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    & ^1 s5 S% y, s. m0 ^7 }

    注意args后的名称与参数名相同8 r( t" m9 |0 b3 x/ ^$ z  x

    2.直接引用匿名的pointcut6 D/ X2 l8 j+ e5 y

    (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
    0 y8 c1 x" J4 U7 v

    (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)5 q* }, A5 B! ~1 w

    注意args后的名称与参数名相同
    " h) x5 N8 z/ P! r/ t, f

    // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    0 U! @1 H+ ^4 X' v; W4 G

    @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)* n* \$ d1 D# j5 u/ Y6 t2 V7 o

    public void testBeforeParam(String str){
    7 G8 B2 @( p! b: ]( n

        System.out.println(“before1=param=>”+str);8 k7 Y2 F3 U& ]9 Y8 A

    }
    1 \% N5 v# I* c6 c5 I$ b

    4 n2 Z+ w9 n! R4 P* f: n

    5.4.4.@After
    9 }  d4 P/ m6 B1 y

    注解@After在执行目标对象的方法后追加相应的功能! i! p4 @% s; P- K5 B

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用3 j% U; O3 N$ I. [

         (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    5 V* [* d  h; X  i5 Z% O9 g' a: C

         2.直接引用匿名的pointcut
    9 E  U1 ^/ m9 i

         (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
    : C. n( K# U3 E' Z( r  s

    @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)+ t. V$ k/ b3 R5 I! Y

        public void testAfter(){# h" ~  u5 w2 U) U" Y

        System.out.println(“after1== >pointcut”);
    % s, _4 g& L; Z, ~8 V8 R

        }9 z( T: m+ f, r2 B8 k

    5.4.5.@AfterThorwing9 Q3 _5 o! j* ?& y

    % O! ~+ [6 i. f& j7 @" Z
    % Z& {# _% z% R, \
    • 描述一下spring中BeanFactory和ApplicationContext的差别
      ! `! L: ?% l2 F5 U1 T5 Z

      1 P2 s9 [& d# d0 j' h

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


    & F7 X; j! @7 D( m& ^& i
    • 谈谈spring对DAO的支持3 J! e: `3 [6 ?

      " [/ ^- r7 d/ G/ k( _

    Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。
    3 q, X- u% X; M6 f( q

    简化 DAO 组件的开发。
    4 ^: |) d, m% \9 [$ t6 W' e; ^# xSpring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。
    . P3 @9 j% w8 y. w$ T% Y2 H) P

    IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。
    3 Z* v. `3 G& p1 V

    面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。
    3 e8 F% f% E# x  B. t/ l3 o$ o

    方便的事务管理: Spring的声明式事务管理力度是方法级。
    . c0 U9 \) f3 X7 W  I2 c& [3 K$ P

    异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。" {$ K3 f# t9 }: c. V5 n' `


    + i% J* V" u7 b# S
    % z* F, n% v# E0 d. N4 d0 X
    • 谈谈spring对hibernate的支持
      ' Z- Q& }0 N% q

      " }3 a( x8 z+ K" z

    在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。3 W. o- b1 v" f/ i( O0 N- y# u, u

    一旦 Hibernate 处于 Spring 的管理下, Hibernate 所需要的基础资源,都由 Spring 提供注入。Hibernate 创建 SessionFactory 必需的 DataSource ,执行持久化必需的 Session 及持久层访问必需的事务控制等,这些原本必须通过代码控制的逻辑,都将由Spring 接管ataSource, SessionFactory, TransactionManager等,都将作为 Spring 容器中的 bean。将这些bean 放在配置文件中管理。+ W1 K0 I. v1 B" Q3 K, Q+ O# a

    1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:
    1 p' \" ^1 ~9 Z/ m4 q9 y

      T( D5 W2 g0 ^

            class=“org.apache.commons.dbcp.BasicDataSource”>
    " u& R  U, p# c$ s" |

            
    6 \& A  Z) X# A% Y

                oracle.jdbc.driver.OracleDriver
    ; T2 \, \. U1 v1 n

            
    ( \6 L, N8 p1 ~) f

            
      o% f! Q$ s! \2 y5 p8 h5 s8 C

                jdbcracle:thinlocalhost:1521rcl
    " S  p+ M1 h( i& x: ?

            
    7 \0 w4 ~6 J/ N+ }/ a- _( m1 i

            0 o* u1 b" L8 X

                javakc2% ]. S- X. `" k$ y$ w7 n- C

            
    9 I$ z) H5 |: f. O. q8 o8 _

            
    : r% P' Y5 n7 H6 `

                javakc2
    ! p- C0 V8 R1 l* D# v

            - B1 T9 v/ J& c3 X- Y

        $ ]& k$ _# p* o6 p# S" A5 ?


    6 ^7 `6 `7 v+ r! A, s" t. n

       

            class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>5 G( R& J. O) v3 o! d- R9 y

            
    4 k9 \5 R* p# R  k1 `$ `1 E" w/ F

            
    ; ]5 M; b' X& @0 B& K

                3 u; L& T2 n$ x6 x1 T- P4 G

                    com/javakc/spring/h3/UserModel.hbm.xml/ K; ^' H# X) E5 c$ O

                . c; N; E  R! q; h5 F& M

            
    3 }7 `5 a7 W- V3 \. |! X) ^) x! r

            
    , C, D( t- Q6 o+ Z" B9 e

                3 ?' \8 g4 @9 N/ {! l7 u" h& f

                    hibernate.dialect=org.hibernate.dialect.OracleDialect" E- d4 ]) k* p  n9 e, w

                , R% W* E* I( Z8 _, V

            ( z' q4 Q: L! m& i9 ?" C" G

       
    4 J8 Z/ T8 x- w; p  W# z

        5 m9 q, d  w) d8 y3 M

            
    . B& Y) E- _- Q, ]' u

        0 X2 @  a2 X' w  o

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

       

            class=“org.springframework.jndi.JndiObjectFactoryBean”>
    7 X7 u) Y; o: t: Q

            7 i0 r. C0 X% Y

                java:comp/env/jdbc/myds  ]! [7 H! o4 Y3 v  w8 L

            % W1 L4 V/ _6 ^8 w  r0 ~

       

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

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

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

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

        ) A, k/ o8 ^5 S) }  l

            
    . }* E# E: n" f* v

       
    8 B9 h7 R6 t6 K


    & d+ g4 p" d: l* o% U

       
    7 W% m% w# n- n8 P

            
    , Y5 k% v1 L( ~, E1 F/ A  x

                
    6 j( |# a' ?2 r0 s1 W" ~; T

            
    # D9 i5 [' o9 p" _& x7 F7 ?5 q1 ^

       
    " f( W- F) s% x' q6 y+ B$ c


    ) B# U, W7 Q5 r2 F, g7 c4 t

       
    , ?$ C. J* S$ S  c

            / U' p; j' ?. `' |

            
    # z+ w. N- ~! K! F: }% `; p

        7 |; q2 S) Y) r3 @5 }

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

    - P' l/ \9 }  z3 w
    Spring2.0之前事务的写法
    7 A8 T4 P' y: W3 f' p

    4 ]$ U6 P6 _4 h3 S
    ; O; q2 V- i' Q6 h! E3 I        class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”6 Z2 x5 }5 x6 w  Z+ w( g0 m7 T5 z+ D5 g5 d

    4 H0 S- @! _) F7 K8 K* @- a1 ]        abstract=”true”>
    + N2 E- C4 z' v3 Y/ i6 O7 W

    $ D/ |, Z. u8 ^6 O3 z9 e8 W/ }- t: w6 F7 C- M# s5 @$ l

    8 Q- {. I4 A3 y) N7 i1 ~. b
    1 O7 e' i. J. S% o( D: W                PROPAGATION_REQUIRED,readOnly8 ]. _5 K/ g" Y, E: t

    6 O& ]$ l: ~) @1 b: l8 V                PROPAGATION_REQUIRED1 u% ^8 T3 U/ g, V
    $ R6 ~4 d/ s/ \5 I# U6 ^( d6 n

      V( D; M5 g9 x1 S9 C% k# M/ F0 f) y, L9 [; `( J

    ' i& ~4 j3 `8 x/ Z

    3 q0 k5 j- u/ u2 M  P# O! Q- ?
    + P# x$ Z; _2 D4 g6 p
    • 谈谈Spring对事务的支持. P& `, a3 m/ \1 ^1 |2 k9 o
      + K9 T3 ?; q- E) w8 C" A

    4 O  \6 _- m$ k) m" @  P2 P! A( B
    1、声明式事务管理:

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

    2.做法:

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

    2.2

    2.3 注入数据源


    " O* u) }, h2 w7 p! d4 ^
      ~% V( k5 u7 z% x6 m: r. |$ a) \9 O
    # X" O2 e/ A$ X* Z" Q( I
    ) u1 Q" j$ N0 V  t' Z
    & D4 C+ G: @* S. x, H( @- A

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

    ) j7 V2 L" c! Z( C

    6 {1 Z6 C/ P* Q( X4 t( e8 o
    ) j; u2 x# j+ L

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

    * y# ]3 k* ]) M: m4 |
    - Y' e; n8 R* ^- `5 p( c5 R

    & y  l9 G" F) r  d) F3 g( Z$ C7 ^  E1 P

    & U3 g& |7 w" e. p* G# Y

    2.6 定义切入点


    - T8 D1 q" `, v0 |" R9 I' j+ N6 V  m( Y8 r: ~1 i' ]7 D( ]
    % @+ M% e+ o, Y( v7 ~" W! |& N3 A, g

    1 X. H# |) C# ^0 s" D. F1 d& O" e. {5 b+ |1 M+ a$ Z; u3 X

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

    1.注解@Transcational

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

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

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


    + O) t' [. H% a9 v; Y$ m3 [4 j1 ?; d: S) D  I7 h

    如何在Spring中使用Hibernate的事务:
    : w5 }/ W; o/ g$ Y

    8 Q5 V$ @+ u: b$ G: P& A5 Q

    ' `( @! c" \2 Y3 a" A

    8 M, Z, ~. H+ M+ X' u

    如何在Spring中使用JTA的事务:
    + T# C, G) j  |, G: b

    1 w( X  q: {0 V$ P
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    17#
    发表于 2014-12-03 12:48:32 |只看该作者
    事务
    * V/ x4 \3 t$ f" E/ Z% ZACID
    1 i% d! O2 b1 D: r(1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失败- i0 `# N7 a* ]) c7 u' h" ?- p4 d
    ' s6 L* J1 B3 ^2 M/ M
    (2)一致性 :操作的前后满足同样的规则,保持平衡。4 K) O! K6 [  E+ i8 o9 U& z

    4 z0 E: W0 P+ W: z) e(3)隔离性 :在事务运行的过程中。事务内的数据对外的可见性和可操作性(必需由数据库的支持)
    ( k- F2 n* q+ \0 X+ M. f/ ~( s7 m! S- m; e  r/ @
    (4)稳定性 :保证数据在事务的操作的过程中不会遭到破坏,而且是永久性存储的
    : J. |+ x% ^: W. |
    0 [1 m. U4 b3 n. b
    / `! P( l( q/ C, o6 P; L! V. M) p; |# M8 d
    事务模型
      ^2 X! V. L" A(1)经典事务模型又叫平面事务模型(JDBC) 事务不允许嵌套
    7 D4 @+ k4 o9 X
      Y* O7 V, f) n9 d, i! {: H/ B- ](2)嵌套事务模型
    ) `8 B7 ~, O9 B4 P; q, w# o0 C7 k- Z& y4 K

    5 h+ {4 |3 v3 R3 f' C0 q
    " }& h% L5 F! k* |, T  s. t3 C事务的两种方式
    / d* C* [, `$ O) [+ |(1)声明式) ]8 U; C: n9 S+ ~6 I' f' s+ v  ]

      D- K  U7 |& T# \2 t8 Q在配置文件中设置以下6项& s/ G& F5 l1 Y1 n$ L
    7 z! I; g$ X2 X0 @) V4 w2 t
    (1).required
    1 W) z8 R; w8 g5 C0 ^6 m
    / g" g" s$ K8 V! @如果客户端没有事务 在bean中新起一个事务
    4 j3 D" w% B' \, k/ J6 d" L) i2 I% v  i4 B6 _
    如果客户端有事务bean 中就加进去
      F2 Z+ W% }! k/ f; R- r4 m, v
    ) S: E3 \! `4 g+ g4 k) ]& X1 C(2)、 requiresNew* A! e: C* h3 r7 O

    9 @; m& k+ X+ z不管客户端有没有事务服务器段都新起一个事务
    / b5 S9 h7 U8 R- y; G6 _, x' Q6 O+ \* c! _0 W. Y* j0 }
    如果客户端有事务就将事务挂起
    ' K& \9 }) I  a7 |% T
    3 X+ K" Y  p6 g2 U# y. K) I(3)、supports7 ^6 \% t7 B0 g* H6 O4 D' O$ P; h
    * Y+ d7 n) k% y0 d0 G
    如果客户端没有事务服务端也没有事务
    7 V) f( b4 F2 e$ g) ~& _7 r: `, `7 u
    如果客户端有事务服务端就加一个事务7 b5 m. G9 V; d1 C
    ' c: @' x* N- t7 |; N0 M
    (4)、mandatcry
    9 L# D1 I: O+ W) a: E- ^+ E+ d/ Y1 J1 X8 G/ E- e# Z: |" ~
    如果客户端没有事务服务端就会报错& @0 b# @* {& o# `0 i0 m. C! W% V

    . W/ x8 J' ?! n如果客户端有事务服务端就加事务
    . z2 @+ @" f8 l$ @2 C3 Q
    ( A3 |2 ]% X/ c3 o(5)、notSupported
    ! @4 y. `0 _" \- R1 F. L# A$ P6 x$ W
    不管客户端有没有事务服务端都没有事务
    7 Y: r3 t- ^) r
      ]! B4 m7 |* \9 @7 T% I如果客户端有事务服务端就挂起
    4 P* [2 K. A) g1 l: l+ y8 m! q/ `, G$ |9 u- c% q
    (6)、never& e; ^) ~- m% i" G8 P; C2 `# d5 B8 M( o

    0 e9 A- o8 ~- D# `- i7 I! x5 O不管客户端有没有事务服务端都没有事务
    ! z* ^' V% N5 M3 n+ F
    ! P, F, A7 O+ J如果客户端有事务就报错1 F, I4 c/ @6 ?

    3 m- c" n( G9 h: @(2)编程式事务
    7 J5 k5 ~4 _5 R- @2 _4 A% V% m' O
    Javax.transaction.UserTranscation% D1 g( M( @3 w

    5 U/ L" e( N- D9 UJTA 事务可以精确到事务的开始和结束: J" f5 o. Y! p4 _
    * ^- h* h0 ~5 E: V
    + A5 e7 {/ E9 i7 @
    ( K; U' x2 \" m# ~& ?' d& P
    事务的隔离性0 y/ N( P! F0 K, A" L
    Read-uncommited
    # X4 W- R7 E0 P9 t0 B
    0 ~& F! ?6 u+ b, R读取未提交的数据(基本上没有锁)脏读,存在不当读取的问题。
    2 p( F4 y; y  b& U8 N6 x
    , n! o2 Z- n0 D3 i7 QRead-commited; e% \' h: j/ j, J

    8 U5 Y+ M. K; v8 y/ J% a读取已提交的数据(行级锁)
    9 t6 B+ H& z# c4 k! ]  s' f: k7 W$ K& r9 B: o- ~
    无法读取已经写入,但没有被提交的数据。
    0 x, g% [, ~- d( r3 x5 e+ M  u' `+ \  p
    + [6 \5 F6 B. H/ YRepeatable_read4 P3 |7 N: t, ^) V
    8 V3 R) l  U* T/ K% v
    读取的数据不允许修改或删除
    * d: x9 I7 l0 k' i4 U* I( Y$ I' c! H% ~/ Y) e; t2 E- ^
    不可重复读(行级锁+不允许修改/删除)- D2 [' R& d$ G, L1 H- j) j3 V

    1 N; |1 H2 j: F  h! N9 z& z# E0 DSerializable
    3 C; Q( G4 U' `6 h- K! O" G8 a
    幻影读(表级锁), }- S# n7 y# h+ [! r6 t
    * S/ @% Q" ~: t: k' ^7 D/ w

    / |5 ~" o5 c/ c+ Q
    8 K* i8 A. g# ustruts
    7 I) `& |* d4 y开发流程6 i/ y8 H! o, w4 t# R& L( r7 E% f
    * r& _8 K  P! o7 t) Z) R6 n% l4 f
    1、创建表单( h# p1 {" Y7 M1 \3 j% h9 \
    + k& y+ X% ~1 I
    2、从表单中获得输入
    3 G, c" M) l) S
    . d1 s$ A6 q( E- u1 g3、处理输入(业务逻辑)
    ; M0 I. D, U; d. x$ `8 A  z3 T! ]
    4、根据动态输入改变输入流8 O- F6 D% K! P# k2 |! r; J3 n; x- Y
    1 c$ o6 q7 ~5 L( B/ B+ G4 e' t
    要完成上述四步,我们需要创建, E3 c) u3 G- _
    ! c, ~% y5 U- H0 b  u
    1、一个ActionForm
    & _  l( X: K+ O( r& S9 x; d+ A# c
    8 {# N, b. ]& X6 `2、一个action
    ) t  j& B, }3 H" V4 l. W, r3 |* q5 A5 R3 i7 ?7 X. q
    3、一个配置文件struts-config.xml) U$ ^) ]+ h1 G9 ?

    ( m4 W- \& R/ T6 E2 y# V+ b4、创建页面
    $ y9 d: l" j! S1 b* u
    2 |6 ^9 T) g! F& f" C创建ActionForm+ w2 c0 {/ X' k! T6 f1 l

    . c1 k" G! Q' e5 D( T, M1、写一个类继承ActionForm
    8 v4 l1 s; S. \7 g" @3 E4 X: k, x/ M. A" H9 J- o1 f0 \' I/ v
    2、私有的属性" ?3 J5 W7 ?! P% K3 l+ m

    ( H! k4 c3 Q( H+ k3、相应的get、set方法
    ! ~0 U3 ^0 l6 M% s$ U; S& D# X
    % h+ u# `- _: H  m4 q4 L1 Z4、重写tostring、equals、hashcode三个方法
    ; z% e' I. u  Y: H3 `& L7 x1 Y4 V7 M/ D! _1 O8 r% J+ @
    创建action! o/ J4 Y2 e: r) S: z' J
    ) s% F5 W- Z4 n% R" J4 w
    1、写一个类继承Action3 a1 y. a5 F/ N, C5 ?
    7 T' U( c1 c- s- j0 ^1 o1 y
    2、实现一个公有的方法(回调方法)1 m4 B* d+ `2 M
    4 p( S) J" X1 z: t1 z0 }
    public ActionForward execute(ActionMapping mapping,
    2 N4 c5 \4 \9 {" V% G  d* N* o6 ^" b+ h! d
    ActionForm form,* i( |3 d4 F% H" `
    5 v0 _2 {  e8 b7 z
    HttpServletRequest request,; C) I7 t7 X3 E; T2 V' l3 T
    # q+ J2 i2 M5 ?0 D( x4 W
    HttpServletResponse response)) y4 S3 u# I4 f, p% \

    5 x. c7 j; R' W) I0 X0 ~{
    # t$ y6 [+ S& i" s! d
    + p" b) @5 Z8 t: y4 |: F$ D  b4 f//1.收集参数" h2 G' k1 {5 k/ B

    ' Z& Y: j3 @/ |% V8 y$ {MyActionForm myForm = (MyActionForm)form;3 ^, d7 B5 O0 k% [8 G

    " z9 K8 R' U* d7 v+ O  F//2.组织参数
      Q1 r( p* U0 v! ~! G
    ! Q' m: M" D+ ` & x5 x  j5 n9 P. l
    6 A8 Z8 q( P6 b* l, U  V
    //3.调用逻辑层# u& ~9 H. X2 O( Z+ |0 {

    , U+ t# e5 B, Tboolean flag = true;$ z! h, f* \* r  _! m  i. \

    ! `4 Z6 E2 O. y( }3 f//4.根据返回值来跳转到相应的页面
    9 z0 C; C! z& [4 n9 S. }6 g$ N- @+ f7 t3 R; {7 L, d* v
    ActionForward af = new ActionForward();1 e, U# y4 e* J" _3 R3 P+ K& F' o4 W
    , u4 v. x5 u# @2 |0 S! Q* J! B
    if(flag){
    6 b" h/ `7 W: G# g# l
    " [" ]2 \# o' f5 }4 f' A5 P% Kaf = mapping.findForward(“1″);
    - P# e; W) p3 ^: m, |2 S* i) S& y, T: {# Q
    }else{
    / p1 f. g* [0 D5 h' L# ?7 a+ m+ }( @' y5 f5 N* _3 u; ^
    af = mapping.findForward(“2″);! b' L: ~, G" ]* g
    & p! ]0 u. ]' _7 ]5 N
    }
    3 z* @( n9 C0 Z! H& a3 @3 i! U2 w" z3 M+ g
    return af;
      E- _6 m( w/ M  `) y3 I1 @) U7 |, r) d4 r* u% }0 N' T# V
    }
    , T  \- l$ s3 K2 l0 z4 c& l$ R$ H* F6 x) h' U+ o3 @9 _0 ?' N
    配置struts-config.xml文件
    8 w& z- U& ~: |4 }: Y# e6 H
    * A$ t+ N) }3 X( M5 {* h1.<form-beans>
      L; c( y3 h. ]; _8 H' A  Z% ?3 t: Z3 U: |6 k% U3 e1 w
    <form-bean name=”myActionForm” type=”全路径.MyActionForm”/>
    / W# u, \# J5 e$ d) U7 ~+ T9 X
    7 Y8 L8 d( o4 n; C7 t* ~<form-bean />
    1 ?4 o1 {6 c5 {# U# b3 O& u: n9 E, v+ @
    </form-beans>) z7 T- p7 K+ u
    5 b- X5 h9 m( T8 G9 A" \* [
    2.<action-mappings>8 n# g' H& R& E+ J, Q* h* z( y$ z
    # V, b! p/ L! k1 n+ a$ J
    <action path=”/sll”
    " F/ [5 m! O/ w0 f, G2 ~2 }" F! O. I0 Q
    name=”myActionForm”
    4 z: p0 x5 c7 o1 A
    : z6 x+ n5 ~' [8 C) s+ c3 Itype=”全路径.MyAction”$ |3 g$ {9 w9 O* F. h6 l# `5 l
    : h  N: l/ s+ q8 \# Z, i" J
    scope=”session”
      X* g' g% M# v9 n% S0 z  d' ~& I% ~
    input=”错误返回的页面”>
    + f. T' y; C' q8 F1 S/ ?2 z% x; U. ^
    <forward name=”1″ path=”/1.jsp”>) [1 r1 l6 k5 m/ \( Y7 |4 M0 [, G
    6 r+ S1 H( Q2 e! I% Z7 Y
    <forward name=”2″ path=”/2.jsp”>
    9 k6 N. A- B" e: o+ f3 f; z8 K; L: l  u. \; ]) I3 K2 P
    </action>
    8 c& P# T6 t* w# w5 ?
    : [8 p* ^, \: h0 \1 K, C  H</action-mappings>/ I9 M7 r  N' k3 m7 q0 {

    5 B5 F& I8 S# T: e$ L8 o0 `步骤:7 t: Q; n" I4 D
    / z* J  R7 L. e9 I+ y# R4 W: A
    1.创建一个空的web应用( N) b/ g! H/ n5 y
    5 Y4 e, Z% E1 g
    2.将struts的包放到lib文件夹下2 i9 I0 l! h, ^5 b0 T

    ' b6 m2 |- b5 q4 L, a3.将.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目录下9 t1 m* s9 A3 O, T3 j$ P* t' I1 O4 ]
    ! T+ F/ R3 g( T8 q8 A  q
    4.配置struts-config.xml文件和web.xml文件
    ; G9 ?9 ?' O+ h4 c. O5 B
    $ i# K) Y& X. ^' x; g8 O5.在页面引入tag文件uri
    & T" Y( s# n4 z# Z5 q/ Z, e. J3 _: P6 z- n! d4 O
    STRUTS运行机制% h2 x! Y5 z& _  W
    + `9 Z) x+ \# ]6 E
    1、界面点击产生请求# b0 Y# v4 K8 s% M2 k1 v* z0 X

    1 d8 U- M6 f2 E5 [& E, Z4 |$ e# D2、容器接到请求
    ' M9 \; \2 n* Q- d2 X* Z( k' {
    3、匹配web.xml文件中的*.do来调用ActionServlet$ J6 r" G; c$ r
    % O4 r4 f, V6 ?4 i! A4 D
    4、ActionServlet的处理, n$ T) |2 I6 W" U! j. B/ z/ X

    / r1 M. e) Y2 G3 H% k4.1 读struts-congfig.xml文件形成ActionMapping! z; i1 [6 {7 g! S% g
    & V& Z# p; q" G5 t
    4.2 通过path 来匹配Action类,通过Action的name属性来匹配ActionForm类: d8 g" O# I! W( Q
    + {& X; \, t0 N% \' x
    4.3 通过反射机制来给Form添数据
    * b" P" y) j) B5 y) G) N* |. e% |( Z. n2 U4 ?
    4.4 由ActionServlet转调Action的execute方法1 G& W- Y- P( b3 _$ E5 r+ X
    ; H% m* b4 N  V, l* n' h8 o/ L% W
    4.5 得到execute方法的返回值,跳转页面" p$ a$ e$ _+ y4 K; W  B

    : `, n5 u4 [0 \6 ~+ k/ K  K  p1 n4 f4.5.1 RequestDispatcher
    , H/ y* L, W% N0 R) O
    % h" N9 {2 o* S) J7 G: e4.5.2 response.sendRedirect(“list.jsp”);
    7 n5 X0 [% j& c! v+ m, J& ?! u1 P7 b: @% L! j7 y9 x3 G- o3 F. T) Z& B
    : u' Y3 M9 b2 S$ x
    $ h0 z3 q0 v3 i9 c7 s& x
    进入execute方法/ _' }3 u. ~$ _( S3 P5 `: h" s
    - q) e5 m# F5 {+ S+ |
    1 收集参数
    ! [! M( E$ o( J3 T5 O/ p5 C: Z( g
    ( Y4 c; h( j& r2 组织参数' D& _4 }* C' L: h2 r
      D. ^- P! X3 F7 \6 u
    3 调用,逻辑层( N; m* Y4 X/ U5 @2 c' U

    & q- ^$ z" P+ B& p4 返回值* _$ K+ ?' h( C# U
    7 k+ O$ r7 u" i2 ~) B) o
    4.1 选择下一个页面 (ActionForward)
      ^, C, V- Q0 @% m: Q
    ! a6 h5 Y5 U  t- b9 N5 F, `4.2 把值传给下一个页面
    ; ?' x2 J7 ?4 z/ @$ p3 d$ k5 C6 f) h& h8 l9 A$ r! ~  a! w; I- p
    4 P8 \+ X! q( w+ `  r1 w/ p9 A
    # }- p" n* G1 n# V+ G7 m7 u  q4 e
    比较struts和struts2的不同
    + ?) T: M3 A8 K% X" Z3 A- v  q% }. X( T- L, c
    Struts4 [$ Z' f' _4 M( p0 v, Q3 a
    2 X; N' q0 |: T; v) ]+ D
    Struts2; D8 I1 p  u2 S( S, C' K* M
    * Z: I( m2 `. P9 x7 \
    组成        五个部分:ActionServlet,ActionMapping,AtcionForward,ActionForm,Action        十个部分:AcionContext,FilterDispatcher,ActionMapper,ActionProxy,Configuration Manager,Action Invocation,Interceptot,Action,Result,Taglib+ b) {2 w9 U8 `0 P- v7 ]
    url        .do        .action/ }: D# N8 D+ R$ L5 S, l7 i2 j
    分发控制        AtcionServlet        FilterDispatcher' m$ p) o/ K) Y' t
    收集参数        利用JavaBean技术,将数据封装到ActionForm的子类中;; i, S6 A' I/ |& f0 K* x, q
    一个Action对应一个ActionForm的子类/ U5 `& M( y: U/ C8 a. C9 }) Z& A) _/ A

    " n3 `; t4 c& T8 \) Z" [使用拦截器将数据封装到值栈中。2 X5 Y: I2 d7 l9 }) p
    使用域模型,一个Action对应多个值栈中的Model
      {/ m! O7 n  B) L4 B; f; Z, h: x+ I. H. a4 P& B
    读取配置文件        ActionMapping        Configuration Manager
    + y: G. E& q& k" M; {1 W6 `  s拦截器        无拦截器        执行Action前后有拦截器
    7 p, H# ~* Z0 F2 g返回页面        将字符串封装到AtcionForward,进行跳转页面        Action中直接返回字符串,通过Result跳转页面
    ; J  o4 b7 z3 `' s& ^( K页面跳转方式        两种:dispatch,redirect        三种:dispatch,redirect,chain
    / T( f+ u6 z5 u+ n6 C8 Q7 ^0 l值栈        无值栈,Action通过在request范围内设置属性,向jsp页面传递数据        有值栈,Action和jsp页面通过值栈传递数据,jsp页面通过OGNL取得值栈中的数据
    " m  T1 x4 o# Z6 ~$ X# Z7 n7 J2 Q配置文件        struts-config.xml        struts.xml# d% t8 P$ x+ R# T7 l0 O
    中文问题        不能解决(需要使用filter)        可以解决中文问题:9 X+ q) J: @. d) B& |
    1、在jsp页面添加Meta;
    5 G- y% y' Y- k) V# u
    " U0 y5 v. F5 g7 U- Q2、修改struts.properties中的设置。
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    18#
    发表于 2014-12-03 12:49:03 |只看该作者
    其他开发工具和技术0 c5 r* p* s% `. S; o0 r
    Ant
    1 A  e" b+ d4 t( I5 c; o, ]# OAnt是基于java的批处理工具
    ! }# A  q: o& q; j/ L' D7 \( V; D. |. I  H1 a/ }
    一、配置ant的运行环境
    2 W, ^! ]  ], a1 W/ B: x1 M3 T1 b1 v+ t' X
    1.将ant的bin目录添加到path中4 ]. ]2 C! j) u

    : Q& y& o. L6 ]$ z% K( q6 Z2.配置JAVA_HOME
    ) D7 e* [5 l" W- o% p, C1 k/ f. v! x4 W, Y5 l7 b6 Y
    3.配置ANT_HOME
    9 T3 o- _' O" ~: Y% Z, u5 ^2 Z& T& ?9 w" I  m4 k3 u& \
    二、配制build.xml文件,该文件放在应用程序的根目录下
    0 j: W: v" a( o% y2 F/ p* j5 ]0 R7 f/ N4 \. O1 a% p2 b- y: y& h- B; q
    编译java文件
    9 G1 t7 Q1 F  r; d
    & b' K8 w  c) d3 G0 a执行java文件
    / z! i9 H: J/ e* c: f3 }8 ]3 _8 I1 g- ~: e% O
    copy
    ( |5 }" ]1 F% O  F
    3 @4 q; _( W6 H$ a. n2 b删除
    7 q- d4 D. Q4 \  N5 H
    7 B+ E1 n# F* V: [打jar包7 ?! ~' D; @3 `( }5 u

    " o$ j; ~4 x+ f3 Y/ [, I6 e根据注解生成配置文件* Z9 U6 S+ ]$ o% Q; I  b7 `

    2 a+ m9 @1 T: lXdoclet
    9 S: y5 E4 E! m1 p通过注释生成一系列文件的工具(txt、xml、java、html等)
    ( x' f6 z5 K" G$ z! |
    % u" O3 r) v6 a, x3 fxdoclet本质是摸板技术+字符串的替换
    * E1 i9 m0 h( P. Y3 c/ w1 h" m; g9 z. k" C+ ^6 R! z- g3 H0 z
    1.在java文件中写符合要求的注释(将hbm.xml文件的内容搬到java文件中去写)
      Y3 E9 L4 o6 o- N1 u# x# \% l
    # n2 z1 B; d' t  Z8 h' ]  A& Q0 n1.1 在类的上面 写与表的对应9 k" b5 _6 h0 J' ^3 b+ g. f7 R1 o  D

    $ J7 ~1 }0 B% j3 L& r1.2 将每一个属性的注释都写到get方法的上面
    ) }; ?4 i" q% k& g
    6 J! v# ~( t0 G8 t8 N& C+ C2.在ant中引入相应的task来驱动xdoclet
    0 |7 o6 B. }% d* R' W0 @; e# t) K% Q
    # }6 M4 Z( ?( R  f' P" F/ Q
    : E6 d2 Q8 c1 ?8 D* g( H5 n, Z: q( i# k- u# I4 G+ |' G, {
    log4j日志管理4 L& k3 l! {1 C" d' W  l
    1、是什么?
    % n- J4 d) q9 f: r% s: q2 J% A# ?, {
    在开发期间用来测试、对整个日志信息进行管理的工具
    ! Q  P9 C; y, l: N% \- M" P; N/ R) O
    2、功能' a$ Z  o9 ]  M! V
    0 t) y: N$ }/ d8 H+ }$ U
    1.控制输出的目的地
    6 ?) R- p; ~( {6 \6 U! P& n$ F" g# C1 v: \  z' L/ Z
    2. 控制输出的格式
    ; b3 B( x2 c7 C
    * i, y" E8 `* f1 D" G. t0 y3. 控制输出的级别) |: x7 g0 R0 d9 E; w3 ~; |- l

    & J3 W( {0 Y% i" n" q1 {3、日志的级别
    / b" P, j: \5 h  m! u: l5 K# a; t% g( R
    1. debug 调试  b- L5 K3 z$ S, y. L* |2 h$ H( C
    1 D2 `7 r& O/ q9 I  b
    2. info 给用户的提示信息% c7 Y4 _' a8 y& J8 Q5 }( m+ b: I4 F
    ! H, ]+ x; [5 U! V: K
    3. warn 给用户的警告信息
    ! H' w2 I, ~7 _& L8 s& z3 q# @3 j& B& o+ k
    4.error 给程序员用来调试2 a6 _* j6 T2 b$ j3 f; }: d3 ^

    $ q# M* A$ f" Y4 z5 ]# {0 D1 b% [Debug—-〉info—-〉warn——–〉error
    + g9 z# V3 \  }2 C5 V! p  }- L- B. |
    4、配置
    5 ]& W$ z4 l7 h* z5 V! J2 d" q5 I2 u3 X/ f4 q. `- f
    1.配置级别
      H  Y' j" F8 W0 h# m" G3 A5 _; S2 W8 Y
    2.输入源 (控制台和文件)  S( d) _! O% V4 ]! B  D

    3 b! v0 R* N/ b9 A3.可以进行分包控制
    7 w  ^+ o. n! Y+ M: }6 f7 j! W+ }. d: M, J
    Log4f.logger.包结构 = 级别$ T' g( t8 V2 T% [  L: f8 u# k

    1 U* A' }' u7 h& n5 h5、使用
    ; C; p4 o& s+ |7 e
    - r, ~- U9 w& U. w! e8 }2 gLogger log=Logger.getLogger(Test.class);
    8 D# K+ N1 y1 I! Q5 [0 I5 q- U% N9 B9 i7 [
        public
    ' |4 \6 {6 \) V& x3 S: J/ @. E4 A( Pvoid t3(){
    ; s9 N$ `: E0 y% T  I
    . R  a+ v+ K" a* j9 C        log.debug(“this is debug”);* [- P% p' B( l, ~7 l' T" _
    1 Y! x9 e. X) Y4 D8 f
            log.info(“this is info”);( ?: l! N. O* @& [1 M1 d; @
    & S0 B) i/ l/ z, }9 B" Q5 X% `
            log.warn(“this is warn “);( n+ J9 _4 G4 b0 E+ R8 e2 c

    ! F; f' k( B/ g: E0 x; u9 }        log.error(“this is error”);! E' O6 k1 Z' g3 x' k3 b! k3 Q

    4 z$ V1 @  e; I! B. C. z' U    }
    6 b) T. I7 A. B/ A
    ( L( o! A6 @! C, `' ?$ H8 W/ K! }) MJunit
    % K% h/ ]) G- q9 L1.是什么?
    4 W1 D0 @! D0 S8 Q0 @  U
    , N4 w8 X  V+ @! H单元测试的框架5 f& S% K! a& y+ u3 K( ~
    ! T: I; {' Q7 D% G/ {
    2.怎么做?: J% c$ }2 g# g  u$ C
    0 {) q1 q) |6 ?5 L
    写一个类继承TestCase" A! E! b' \) @

    ' j) J+ M. o3 g+ W. V8 K测试的方法一般都以test开头并且没有参数  ^% @3 U  y7 Q" r

    7 C& p3 n9 b, f  h6 ^5 H; s* V4 d  n在测试方法前执行的方法public void setUp( )
    7 K* f9 y. t2 v5 |1 g$ ^$ o. p: Y9 N/ S5 D9 \3 h& d
    在测试方法后执行的方法public void tearDown( )) N3 x1 ]. ]* N: W5 N! G& H4 J/ _

    % F) H9 |# i, N3 herror和故障的区别
    * a* z2 T0 g# U1 ?, ?; t. Z% l% a$ f' P, v0 j3 ~1 `
    error :代码有问题
    $ ?5 f/ ]% z' I: B1 @
    + U$ n! r& y$ c1 e7 h故障 :逻辑有问题与祈望的值不相符合
    6 P$ X8 n6 o9 S/ d: Y
    . [5 Q3 }* e! _; B- @# T' C! |4 @! z生命周期9 s* X) U3 \! B6 _
    3 x7 [. y* a! T3 \- ]
    测试—〉SetUp()—〉testXX()—〉tearDown()—〉结束;
    8 A& S+ K2 w3 ^. u$ F- z
    ; t+ r  C$ v* j* \1 F- t7 X" M: STestCase套件0 K2 A: T  U3 {' P
    5 g+ ]0 i: J% s) j4 q
    public class MyTest{" X1 Z, Y! i" `! k0 v. j

    " c  G: q! \8 G# H; [% h/ t        Public static Test suite(){0 V2 ]  {/ G% y4 a6 \

    ; a7 h- U6 \, c3 ?7 S, U) [  ?TestSuite suite = new TestSuite();3 p% {" i* ~+ P. N" l" ]5 l

      V3 ?% q1 U6 A! h1 K( }0 ^" K. `suite.addTestCase(Test1.class);
    , `2 X! {) h7 U( l
      e  B+ N, ^9 m& p' ]3 Ksuite.addTestCase(Test2.class);
    $ Y4 {5 `* D5 ?- N7 W) b# c. L$ f; H- o$ l3 N: z
    }
    ; y, h! `, P# D7 u# a" c9 ~/ ]  `+ J! _2 t4 J( o9 x) |% o- S
    }
    0 ^6 i! H8 v6 Y; \( h+ \, W6 l) W3 Z( C# i, D# X

    1 g5 Z2 ^$ |" F: o1 z$ G/ i0 Y/ J- X& Q
    Ajax4 a& s! j9 z4 f0 o) ^8 E$ ?! w
    是什么?
    : Y; a! a+ `& f; X7 VAJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。是一种创建交互式网页应用的网页开发技术。1 j; I. K4 w+ P, b' r
    6 D% y& i8 \5 L( _
    无刷新页面。: @$ s! L8 m. R3 I% N/ V) ?

    0 U# f& M! y% O- |8 s$ y# a1 A有什么?- Y' ~. o  R/ Z' @" [1 S
    AJAX是多种技术的综合,包括JavaScript、XHTML和CSS、DOM、XML 和 XSLT、XMLHttpRequest。
    , p+ L; [5 N7 c& K: r2 }$ M7 ~2 m/ d$ A! j* G
    能干什么?* u$ D- [8 j6 j% ?  h: }, h
    使用XHTML+CSS标准化呈现;9 S, B) b6 m7 t# D1 v& W
    使用DOM进行动态显示及交互;) n' \6 w# m! ]# }; [& b% G' K0 Q
    使用 XML 和 XSLT 进行数据交换及相关操作;
    2 D$ P' ^+ G) s* t6 W2 g* A使用 XMLHttpRequest 进行异步数据查询、检索;
    ) z/ g  J' J; `# v! ?& U使用JavaScript绑定和处理有所得数据;
    - p% U+ Z1 U) g! i$ ^; R/ }2 K; T3 P  t4 |, e0 l% K/ b7 }
    传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。
    . ~! Y* w4 f* ~1 {6 t6 k$ ^# l
    ; Q6 ^5 h; o1 x% Y/ K2 w( B. @与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。9 ]( x+ d& H, j6 y6 K2 S' @
      _3 F' @4 @6 j! A- h
    使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。
    ' h* |* O9 }' F7 M% j
    % u2 H  o3 [! t  G对应用Ajax最主要的批评就是:) \: ^% F, ~/ l2 o
    1 它破坏了浏览器后退按钮的正常行为,就是用户点击后退按钮后不能看到之前的数据;* d) z# u6 q" n6 E: C1 X( \
    2 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;+ I& [3 |# D9 K' R5 j9 ]2 S% A- w
    3 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;
    * o1 W% L# h8 K2 I" N2 }. n8 I4 Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;% z  q# Y* n' ]% O7 M

    ! d5 V- K5 l8 z怎么做?* R" w8 _: g2 R$ }3 n
    <script language=”javascript”>1 K! j3 F+ d0 h4 F# H# l* Y1 h, m
    " Y; n( |) ]! G& @. s' D* q9 J
    var req;5 u' B/ Z7 J, R( q2 s

    ; ]5 n- U, J/ x6 p' |9 Nfunction add(){
    , @' o. n2 }) R" x- m" |( z, Z/ `* o' ]  k
    //1:创建用于传输的对象
    ; z6 Z* H2 a5 d9 i! |  o% r- c2 D2 Y' G5 _. l7 |8 S; K
    req=new ActiveXObject(“Microsoft.XMLHTTP”);
    * z- B9 j- O; r* L
    8 T& c0 J7 P/ F9 c* [0 W// 声明返回后,处理数据的方法
    $ D/ W* u& |0 `0 @( `9 W" c
    5 z5 V! C# A4 z1 _req.onreadystatechange=manage;; |+ Z* I( D& ~

    2 S( D  e+ u, k; _' Q, z//2:准备传输的内容! ]% [& P- ^" Q9 x3 b6 g
    & X9 C( r1 k3 [8 x9 ?) _
    var str=”test1111″;
    3 ?5 r: i, |; m: {
    ( m. Z6 a, s7 U//3:发出请求
    . V2 ?: K* l( r4 T0 C
    8 K+ Q. R7 p/ E: b1 Vreq.open(“GET” ,”/others/ajax/test/t2.jsp?str=”+str);( z8 I4 D& v! X2 P! a! }

    - \- L; P/ `0 i! Ereq.send(null);
    9 h' b1 `. c; i* F! _3 y- f% w9 N  ?, C% ~0 H$ P& o! f
    }
    3 {$ @: w6 u& l+ I: N* \1 i4 w. [) G7 {8 ^4 a
    //4:接受返回并处理, L  h5 k8 E: Q  X& N( s( x3 h  k  g

    + ^% O; A. ^9 s+ Z8 Xfunction manage(){. Y# W( ^0 Y6 t3 H
    / C/ Q' f" k  Y+ s) v! y1 _
    if(req.readyState==4){7 k5 b: G/ X7 C) Q  h( q

    % j/ A8 M& {2 Yalert(“r==”+req.responseText);
    * c7 i$ u, z. g/ X6 a4 R* d1 x& ~/ h! U6 I0 M
    }" o- L; u9 V( n- C6 z; [4 r* r

    " h4 y# ^* J! [# f: V- q! z% U}
    % V/ Y  N  Q: j( j4 v
    ; c9 l2 f! l. i1 |</script>
    ; A2 r& c# ?$ T. q& }& b6 f
    . l8 ~  `1 M- X' j2 @2 creadyState的取值如下:4 ?  C0 M3 V5 x  N7 r4 s
    & u7 D/ S) Q0 j  x! ]( C" \" C
      0 (未初始化)7 r5 f) L9 k; m
    ) p" Z" t0 N$ P' O' L! K
      1 (正在装载)$ c; G% e% @4 p5 _# P# v

    4 c; f6 }$ C" I) i  2 (装载完毕)) q( T- Z7 ?, `/ I0 ~/ {9 }; M

    3 U. a$ i+ V  n/ i: y* z  3 (交互中)
    : C4 \0 f/ v1 z& y: P
    7 y6 g( @, |$ v3 Q& b  4 (完成)# j) B8 f# `5 T. D! d- n9 k

    " P+ g3 [% J  q* [  ^1 b3 U$ K 4 D) [% V$ I8 C) r6 Q
    3 T, l: p. m' N# c9 P3 ]
    原理8 c7 \2 X+ s3 p- Y
    Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,可以是xml格式,也可以是一个字符串,然后用javascript来操作DOM而更新页面。1 `7 t: L' ]+ a2 ]% J  y) T7 W
    ' {& z6 C! I2 n) {! @! U4 \0 J- h
    Dwr: Z2 w! S) J, ^- j4 k3 \
    是什么?- f. S  U- `0 Z3 O9 w  m8 V4 {
    DWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的页面。它可以允许在页面中使用运行在WEB服务器上的JAVA函数,被调用的JAVA函数就像是在页面中JavaScript方法一样。# ]. ]& v; n  i  h7 x/ E

    / i1 I9 C7 Z- c3 x- p4 }: W) O有什么?
    4 S5 c- X$ p2 _, `  Y. o, G它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据;另外一方面提供了一个JavaScript库可以帮助web开发人员轻松地利用获取的数据来动态改变网页的内容。# j0 Q/ h- X* z1 {
      \1 \) W6 h) a9 A  M# v: ^

    7 I" W) r; G6 V& y/ N
    - T* a$ E3 @) {能干什么?3 J* z' H" D9 n  _
    动态地把java类生成为JavaScript,感觉调用就像发生在浏览器端,实际上代码调用发生在服务器端,Dwr负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制。
    * o5 I" H' m7 I' ?' }$ d, [
    ; E7 }. _  A$ p4 C - `2 f$ x6 ?; S* e) ~
    4 d4 l% v8 |3 N# Q2 [
    怎么做?
    5 j, \  i$ D" l/ y0 e① 编写配置文件: N5 ^3 |7 m1 M9 N/ @
    4 G/ @7 P2 y6 [9 |- G+ U$ ^. p
    web.xml
    . H2 i! ]# q; S# Z1 l, t4 O9 W! T6 A
    & }" ]! ~5 w3 k0 O6 x<servlet>* U5 K9 y" G5 p+ q
    4 q3 O- J! H; z2 a' b# W, m
    <servlet-name>dwr-invoker</servlet-name>
    6 j6 _- R  ^% F$ R; J$ P0 B4 f3 ]: W1 P3 N* o% j9 a
    <servlet-class>
    : k" E& K6 b4 ^0 ~0 p/ f- X5 x, }" ^4 U2 n
    org.directwebremoting.servlet.DwrServlet# @0 v/ e) y8 h5 }' ~* o  c. D

    ; m1 j$ H0 V: R# B. J) w</servlet-class>
    * m2 ^2 e) s( r( J
    5 O* R  f/ ~& u' T+ ~, m, p<init-param>
    ( E3 F! v; \  m+ ?2 ^5 N! r
    % T* C+ s8 c# _/ y# L<param-name>debug</param-name>
    5 @3 V) ~3 q  \( j6 L& m7 t7 _( B  E2 I
    <param-value>true</param-value>
    ; s3 {/ A6 `( `" X2 r) i7 L. i7 X% u* I6 L2 e) \) J
    </init-param>. |! W- j9 N/ `7 t, L
    , H- J( \1 _2 K5 _
    </servlet>
    / K, b" ?& u2 H+ s+ n
    * C6 k) x' Z2 s0 T8 T4 L' H9 S3 V2 [<servlet-mapping>
    6 g1 t9 S# I( D7 a* I
    $ X0 v) u7 a- v) }! j3 R<servlet-name>dwr-invoker</servlet-name>
    3 L" I9 P6 a5 C& g9 X# X, r- T+ \) N2 t2 |' a. P
    <url-pattern>/dwr/*</url-pattern>4 Z& ?  k+ k! f/ y6 M, M8 o  I* i
    % N+ T* G) D) h* @. a- w
    </servlet-mapping>
    + H, B0 ]5 [, e: G7 @/ [6 O* x  A- ?7 Q! R  J( n3 l& B
    dwr.xml
    ) [& {3 w; O6 q# z9 T! N- \- f# q* b& `) P$ X! M
    <allow>
    & M5 Q4 @6 L% c: F6 Y, O
      W' u0 V% z' ~0 S$ e5 ~5 o<create creator=”new” javascript=”kc2″>
    / |4 i# q' M3 N9 Z. A+ l
    * g6 J3 i5 f) F+ _<param name=”class” value=”dwr.Service” />. n" Y+ u3 f% N8 j: _

    8 Q; a: |( i9 ~; W  {</create>
    ( m4 R) ~, l: X: }7 t. R: V) Y* Q1 r7 w! c7 f
    </allow>
    8 P) a9 @4 s% ?0 ?$ b; b$ m# B8 l) M- U8 \. R% U
    ②编写service$ V6 u/ P% q% f  }- g& ~! p
    2 {9 q0 C; j( r7 |
    public class Service {
    0 V- e" b' L9 s# H' @4 w- y* Y0 u/ H5 `
    public String sayHello(String yourName) {- b) S0 \/ w& s# M* o( S5 q
    2 `2 f2 T( j% {$ M3 R7 ]
    //可以是访问数据库的复杂代码
    6 K' Y8 q; Y6 d- i( G. S2 v1 @; N! m$ Y7 f
    return “Hello World ” + yourName;
    8 G* E, N$ t. d9 Y+ A9 y6 R# v" q" v1 V/ ]- d
    }
    6 B2 }2 |# k8 J0 F- R5 h2 W. J! y( K) @! @
    }
    + T! X, Q: ?) Z4 \4 W
    7 a% P0 P* C+ h' ^- l6 F③测试DWR' l7 W# _/ a5 V* C) s$ r, \4 U
    ! C7 q9 R* k& ?0 L; Q( X
    将代码放入应用服务器(比如Tomcat),启动。
    4 t, [+ @/ O! m0 \/ Z# e. U" s6 u. M; d/ \$ F8 ^$ X$ y6 I
    然后在地址栏输入http://localhost:8080/你的工程/dwr; @& J0 N2 I+ y% R2 |

    1 v* i( B9 U+ u④编写jsp页面
    7 j! g. O3 X- H! z* C3 n1 q& c, o+ D4 |; ^. E6 ^) }0 S
    1) 要引用3个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js
    % C. z) `: v7 E, Y* a4 H6 q+ k& U) i3 B) A9 E  D
    2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样
    " m7 {9 t: o$ l! i* v  `+ e  g
    6 [" a( ~" [3 ^4 Y9 e3) js里的service.sayHello和java类的那个有一点区别,多了一个参数,用来得到返回的数据
    回复

    使用道具 举报

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

       

    关闭

    站长推荐上一条 /1 下一条

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