我的日常

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

动态微博

12
楼主: admin

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

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    11#
    发表于 2014-12-03 12:43:50 |只看该作者
    JEE. w( g" k: K# O3 m2 i
    简述JEE1 B) A0 V4 O0 R! o( I
    JEE : JAVA  PLATFORM  ENTERPRISE  EDITION
    * w0 ?( c( N& }! Y7 d6 j8 j8 ]- K7 A9 C3 k  d
    JEE是一个规范集;2 J5 T5 [8 ?) d( c- O2 G; _- X
      i+ Y4 Z  i5 E" M/ w
    JEE是一个框架集;0 c- R, k$ _, g- y

    0 |# ]# g2 m# u# nJEE是一个技术集或API集;+ [+ B; ~! V4 |! C2 E2 @# {

    + Z* y: [& y+ ]# b& ~1 _适用于创建服务器端的大型的软件服务系统: P" a0 C+ V/ t% ^4 X4 \
    & c+ E; N+ E7 G

    8 K  f+ J4 q3 Z
    : o, u- _+ L  P6 H" W3 u. d4 b# pC/S B/S 模式0 H6 l. s0 {* `& p8 |: T" h
    C/S client/server即客户机/服务器模式,客户端也参与程序的运行与计算(富客户端、胖客户端)( \3 f$ j$ \* E9 p( p+ i0 ?# M- u0 l
    ) _4 P) y) }7 x' m0 I
    B/S border/server即浏览器/服务器模式,又称为瘦客户端,客户端不参与程序的运行与计算3 _% r8 C. S, s+ s6 K; T

    * z+ h% A- I3 A1 W( y7 C5 U6 I& ~ 4 S" f, v' q6 n+ {2 ~0 J

      G) n; ~( Q( O企业级应用(大规模的应用)的特点
    ! {; a3 \0 G5 T3 h1.生命周期长、稳定、可靠" R7 |1 ]5 \* o* C6 P1 F

    4 S0 T5 X  X% N  L. j  n# L2.组件往往分布在异构的环境中,能够跨平台
    5 i. g0 g1 {4 `
    ' ~; X6 n+ n7 C' T5 w8 l! {3.维护性、扩展性、重用性
    % M0 l0 A3 B/ t+ L8 Z
    ( N. f4 g. n9 P% K2 r4.有事务、安全、线程; O+ k: J- }8 W7 {' ?

    & p! v! h. w- f: k* @
    1 p, k9 w% z- G+ f$ R. S8 M+ s2 F
    # |0 R, F" Y' r什么是业务逻辑?
      F- Z3 g' z( E7 P! t依照业务逻辑划分模块,
    . {& S5 F% x3 E- k4 t8 E5 y1 Q, R- l  F9 k7 j1 x% m. t3 k
    所谓判定业务 就是具有以下特征:9 W! }0 J% v# w7 V
    & ?4 v( J8 F- p6 c" Y% x( j
    1.业务流程
      P+ r1 \, I! w+ q" u* n
    3 v# w: l$ Q0 B& f$ B: q2.业务判断
    ! V9 W4 e4 c* l, a/ e. r* K
    : A, s: X2 O5 K/ Z; P4 z" Z3.功能组合2 E8 L  k+ X+ K
    4 u" e: t, N2 p. G

    ( P: s1 I+ F5 O0 R+ q
    5 t- L% l" G- l0 M  s& k+ }" z, z平台(角色)的划分
    . |9 q! i+ {( q0 ~1.平台供应商。提供满足API集实现的厂商(BEA weblogic IBM webshphere)4 I0 ]2 A( u: h7 j- R

    7 @3 Q- l0 O% \2 K2.组件供应商  n$ \5 l% b) q( V; U
    4 f1 n% [! ?  k' P; h% l" a, l
    3.组件装配人员7 Q; e3 ^6 q! ^" G, A; v- \

    ' I# U5 \, k3 E4.部署人员! L" S( }+ W, J

    6 H" A- U0 p% }. n2 z+ f3 l0 |5.系统管理人员, a. a& m3 ?$ j; D

    " e% J9 ?+ N6 Z; H6.工具供应商 提供开发组件所使用的工具(Jbuilder、eclipse)
    ; ?# p/ B7 K' y6 }0 U# `  ^9 p4 I
    3 U  ^! P% B8 s
      q: t5 @9 j- I! s3 ]8 o* K
    java技术分布(设计架构 模块内部设计). U6 i& ~& @. d# `7 u0 \/ ~" l
    1.表现层 Servlet、 Jsp、 JavaBean、 Taglib
    * H- d) D! ^: Z5 l; L2 [+ i* F" ^! m6 s  i; s; R9 ]3 u6 N# m
    2.逻辑层 EJB(SessionBean)
    9 k, x9 A# o0 M( h" q$ x& J# r, R+ V4 x+ g+ I( Y4 J. v/ Q# G: m
    3.数据层 ( JDBC  EJB(EntityBean))
    4 ^) D8 z) M* k4 A) r( X/ F# x
    ! w9 a6 Y. b+ H4.服务 JTA(JAVA事务架构) JTS(JAVA事务服务) JAAS(JAVA授权与验证服务)* Q4 |- r$ Y2 C2 |
    * ?1 Y, J4 ~- n* }% X5 a
    5.分布式通讯 RMI(IIOP)+JNDI 、JAXP(JAVA 的 XML 架构)/ c7 L2 N6 ]" l2 W

    + m" a! [1 D7 U0 e2 C. k$ u5 oJAVAMAIL(邮件服务)、JMS(消息服务)、IDLC、JCA(JAVA连接器框架 (成))
    ) {3 E4 V9 i/ u/ U1 _6 b9 n  `8 D4 t% d8 q+ k9 y2 G

    6 C! L) p1 E- ^. M, p2 Q9 @+ N! b: p+ F7 B3 v; M% c
    JEE的体系结构: 是一种组件的体系结构) A/ @" ^) B1 ]' J% H
    1.组件 : 能够完成一定功能的封状体(独立的功能的集合)- @6 B+ |6 q% u/ y! M. o9 S

    : i* _/ J+ J7 F: T- s0 {不能单独运行,必须运行在容器上
    ! {, s6 d3 `5 K! B
    0 ?9 ?6 S% V( J3 g' O8 K分为两类:web组件、ejb组件
      Y# A: K, I8 N. X2 x7 s0 c3 R8 y
    2.容器 : 提供组件的运行环境,并对组件进行管理(一段程序)  X( \- m1 S: \! L7 j
    5 P# h7 R# d( L2 c
    管理组件的生命周期
    # ?, {/ g9 D2 U! N% |9 @- ?# y  `. [+ ~; T4 h5 B
    不能单独运行,必须运行在服务器上
    & i8 `- |8 ]: r  j# w- s7 c' \1 ^
    ' e/ A' M, r* n# H7 @" g3 H程序(组件)通过上下文来调用容器(context)$ y: V, o( U# G9 i7 _) @

      k! {% {. Y7 W  L1 }  f4 w组件通过web.xml向容器描述自己,使容器能够认识组件
    0 K- N$ G1 Q& v4 H( `4 ^' a- J% w" i4 Y. }  v8 ^
    容器通过回调方法来调用组件
    , p  X$ H1 p0 f' Y9 b+ o# F& `# P* I6 ^( P4 a8 t4 Z6 l+ ~
    分为两类:web容器、ejb容器
    ' ~8 K+ ?/ E9 a4 b3 y* f! {& C2 K. L, H8 y
    3.服务器 : 提供容器的运行环境,提供大量的JEE基础服务  J" m6 m# N: Z2 N" v2 Y, z
    # j) h0 f& [9 Q$ x9 W
    web服务器(只提供web服务)& S9 W( {' ^$ s
    - \6 H* s7 s1 P9 m9 [( T* j
    jee服务器(提供web、jee服务)
    : Y5 O# F& e1 C! o* }% _! d
    " B) o- n& z! ]& L) p
    & F0 D. L, U; ]7 B% {  Z3 `0 j: g+ l6 P; Y( S, [1 y  Y4 X. Y1 k
    什么是回调方法% b$ @: R* }* M  o5 g' u! r- c4 z
    由容器自动调用的方法,就叫回调方法。
    4 L. i' K# o: `% \' W6 m2 b, f$ a6 s/ L: G5 i

    . r8 o, I" d2 k4 g: M0 {* W
    7 m9 y" v* V6 E6 R$ e: p1 ZRMI远程方法的调用机制' E7 r4 D4 U0 B+ E, q
    例如:A主机有B()方法,C主机有D()方法,A 想调用C主机的D方法! @/ A, I& C# v! a) v7 G
    : W$ c3 U& o" t" h
    # @0 j: {- t3 c  Y' Z& T
    : h9 S) D4 D& I1 _% L* C# O: \! S

    7 u  y( L3 v7 I3 g# D2 |& g- T' r, G7 W) Q- G5 {
    学习方法( K, h* F. t/ M( K% x
    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' q. a5 z: ^1 C: z2 a, z9 K* |
    •     描述war包、jar包、ear包的结构8 M! ~( f) L# A1 o
      + f* e9 V, S. G/ j
      / _/ G: s& b" [! `

    war-                            web文档压缩包

    —WEB-INF

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

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

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


    ' P$ |5 T* G" P8 ?8 j# D8 a

    jar-                             java文件压缩包

    —META-INF

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

    / q5 S4 N/ z" P  h5 B8 U

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

    –META-INF

    —Application.xml 配置文件

    –*.war

    –*.jar

    - o& o# f9 Z/ X! m# x$ u. |
    • 什么是servlet?servlet主要做什么?8 k- B9 v. Q7 d

      5 n% ^7 k( ^! f& e- M6 D( a# D7 Y& H9 a) T- P

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

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


    ! L( ]0 `. }! Z4 W. X  }" L; c
    • servlet 与cgi相比的优点?servlet的缺点
      2 I9 {" C) V# d! E9 p- _. J

      / ^! R3 r; `2 G" w' s; {* W% r- ?* l' R; z

    优点:

    性能(线程比进程更快)

    可伸缩

    Java强健且面向对象

    Java平台独立

    缺点:

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


    ; t% e/ L5 Y9 V4 E9 a; J
    • 常用的servlet包的名称是?: F: Q( ]' z5 ^  |

      + p+ \" K" U  f. S0 n! d0 `# H  j* l( N# X0 [3 o

    javax.servlet

    javax.servlet.http

    : Z( u- w' v1 h4 L( M- R' q
    • 描述servlet接口的层次结构?8 s; j% W! y/ f2 D/ E
      1 q! J( k2 L( o# X

      4 V% {( I& _+ H# `# l1 o) u5 c# P& G

    Servlet

    –GenericServlet

    –HttpServlet

    –自己的servlet

    ServletRequest

    –HttpServletRequest

    ServletResponse

    –HttpServletResponse


    ) ?! o& @* R1 }1 @! c- ^9 ?7 B
    • 对比get方法和post方法?# o& r9 U* K" Z8 s
      , u: \( b$ w7 v1 {

      % L! ^2 L' Q$ h" s( u) {

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

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

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

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


    ' e4 t; l! \) @( R0 }
    • 归类描述HttpServletRequest接口都完成那些功能
      9 W" g1 u, Z  V& t: g

      1 j& O0 Z* J5 t3 h9 O) h; p3 I
      ; {# V8 h4 |% N" ?8 K% P! F7 I
      • 读取HTTP头标2 o1 l+ I  f( g% r
      • 读取cookie% r' K) {/ L  w4 o) |
      • 读取路径信息8 V- `3 m: v) A' ?3 k" T8 z# F
      • 标识HTTP会话。% {" h% ~5 D: z' Q0 v" A
        2 @* S' Y0 v8 y/ L3 o/ R6 `* ]

    6 |5 W6 ?& a" `
    • 归类描述HttpServletResponse接口都完成那些功能  w9 T8 l) \( F) B
      8 u* R( X) C. d; e) m

      ' {  p0 L7 \# Z: Q
      • 设置HTTP头标4 O% v; @% @9 \
      • 设置cookie: ]5 q, O/ x1 y4 Y& j" V
      • 设定响应的content类型
        3 C. z  W" p" l9 Z5 L0 d3 _
      • 输出返回数据
        : q+ X- G! P& `) q8 n  j6 Y/ y& \+ f; ]& o2 h

    , n; ~$ E1 S! G; o  g
    • 描述service方法所完成的基本功能?默认是在那里实现的?
      - N- P. |4 E/ L7 {

      , P; l: u' g* }1 ^1 @! B1 q' ]$ E7 V+ P' F. h1 v' B2 v- t0 ~

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

    实现:默认在HttpServlet类中实现


    3 b5 \$ @% ]3 m& v5 j
    • 如何开发自己的Servlet?描述应该做的步骤和每步需要完成的工作0 F9 l$ M* [! }5 ]7 F; k

      7 k5 ?, P* x) F! e# _+ ]1 g8 q

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

    0 i9 b( Z+ b$ L" W$ v: r
    • 为何servlet需要部署描述?3 w& a0 r7 q& Q+ G/ R! b

      9 c* L$ L6 g: l0 b( G
      2 T+ v3 [! B% u6 y, M8 i& }) B

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


    " p4 x/ r' \9 V) i- I, y
    • Servlet基本的描述应该是?请写出来; y% [" X4 u1 k$ h5 K
      8 `) `$ S( K" }; a
      - ]8 v. L8 {+ S) O: T
    : `! R% @: N# o0 U0 C; x

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


    ' R' ?" m; p$ E; h$ J
    • 如何在html中使用servlet5 v  I3 D3 v! g  l; X7 W" {8 [
      % ]' ~) a0 z( H* {! I. E
      ( J; l- r# m# u5 G3 q7 U

    FORM标记

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

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

    语法:

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

    {HTML form tags and other HTML content}

    </FORM>

    6 D, x7 o  ^& c8 `3 a
    • 如何接受request中的参数
        f; X, L$ \0 L% B2 \7 ?6 n: @

      1 ]6 i- X% F3 UString userName = request.getParameter(“userName”)方法! O( g/ G2 V( u8 s1 }
      ) [; g' c4 \8 u0 W1 g9 l5 e, u

    " Q5 b! _5 v% j9 @0 Q, y9 G
    • 如何接受request中header的值( o& F8 {' K: L. o) }

      - J+ r6 g0 h: ~
      7 @0 e) A+ X9 N/ h) D+ j% L# s" Y1 g0 U; m

    request.getHeader(name);

    request.getIntHeader(name);

    request.getDateHeader(name);

    request.getHeaderNames();

    , J7 O- ^6 b8 a+ Q' K
    • 如何输出html: |# a; R0 c% C9 Z6 f: t, e
      " `/ W* T. m$ l9 [6 l7 l7 r- K
      4 T) T8 d( D( s& q+ q0 u1 [

    PrintWriter pw = response.getWriter();

    pw.write(“<html>”);

    pw.write(“Hello”);

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


    ' {' K2 R$ ]6 c$ \- c. R+ e% ^
    • 如何设置输出的contentType+ R2 }: t$ {% V7 T% w) F. g

      ; n* K' |- K0 l4 {' p6 H3 o) e9 L$ s0 r) P$ P2 s2 B1 @

    response.setContentType(“text/html”)

    # ^& q$ q! N; X9 ]+ Q- `
    • 描述servlet的生命周期?, s, q& a1 Y3 }1 |' l  g: H$ b- T; f
      1 b1 @( M- U+ g, \8 N' p

      ( E- S$ Q- o: Y. \: R7 w- m

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

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


    ; d7 M2 K* n3 z0 U3 w
    • 描述init,service,destroy方法的功能和特点
      : _( R+ i& m  K4 U) q& g: l

        B. `) O+ D0 C8 K% K8 j) i' J" p8 L5 r) D$ n! O4 D* f  Q; y3 N6 \

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

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

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

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

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

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

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

    . l* [- n( ^$ v$ a& J4 M
    • 什么是回调方法?有什么特点?
      9 f; Y6 s4 G2 v% P9 t4 X( G

      9 @, ~' Z6 ~& u" n0 }! S! j9 ?$ B+ D

    由容器来调用程序的方法

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

    0 V. M7 M# a4 U3 d* O
    • 如何设置初始化servlet的参数?2 Z' ^: S3 n; P% i# s: f9 _
      1 H& F* V5 y  x1 C* j* J/ F
      在<servlet>中添加如下配置
      6 W- a$ D9 u" r! n3 Z/ T
      * Z( M/ A. R: g$ o6 \! M

    <init-param>

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

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

    </init-param>


      e0 N% ]. ^5 Q; ?, T
    • 如何获取servlet初始化的参数: E- ~- a3 m9 B# r  c  N

      % U9 E* l4 P: l, W
      0 k+ z% ~* {7 r6 y

    public void init() {

    greetingText = getInitParameter(“greetingText”);

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

    }

    , e- I" U  G7 r; y
    • ServletConfig接口默认实在那里实现的
      8 m% q4 [. A- W* ^: J, w

      ! i/ I* K6 H" a0 K: v5 }: S: ], n/ x2 [" q  C- w1 |

    GenericServlet类实现ServletConfig接口

    # L$ B9 x# s  C. H2 Q9 A" F
    • 什么是ServletContext?有什么作用?
      5 X: |8 {# w4 S6 t

      / N- k" v  [: c! G8 ^, q4 N( k1 q* s. W2 }9 u" w

    Servlet上下文

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

    - V: R& N$ f+ J% B
    • 如何访问ServletContext接口?是在那里实现的?1 n6 y2 i1 r: K3 }* ?

      1 y! V9 `* i4 i5 h& s, H& a  c& Z# s2 t

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

    GenericServlet类实现了ServletContext接口。

    ! R% k, @& s* t+ N! I
    • ServletContext接口的功能包括?分别用代码示例0 u: a& v2 A# A0 t4 w. s" p5 L
      $ Y# O7 l. j6 {9 _% r

      5 i" g( ^2 N  ?0 w3 b

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


    ) G0 {6 }- C1 Y
    • 如何设置ServletContext的参数?
      4 G1 T( q% V: R! Y

      : w$ A4 l3 J* ^! R; o
      3 }4 k( J% a. m- s

    <context-param>

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

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

    </context-param>


    7 ?4 e" J4 J- E5 \
    • 如何获取ServletContext设置的参数值?
      4 z; Y1 ^: k4 W4 q% F

      ( M0 D. N) l  V4 E% ~4 S8 U9 z: `- d5 }1 w* P2 \) Y9 `0 N

    ServletContext context = this.getServletContext();

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

    / l$ Z+ y5 X! w1 b8 Y) z
    • 描述Web应用的生命周期?
      ' a9 H# A6 ~* a/ K- l6 q6 Q

      9 P9 T5 A' R% o. d! ^  w  m" }+ I1 Y& z9 ~$ o; j* M5 X6 B

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

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

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


    ) g6 s# r4 y5 p5 L0 I: F! `7 ?
    • 如何用代码实现监控Web应用的生命周期?5 I- f- d0 a# x# H& {, n

        C' W3 z& E6 n: Q# ~# x1 j7 g/ G: J( S  b5 E% a9 W

      8 m* t/ p% X2 P) B! i" ]9 R

    public class Test implements ServletContextListener{

    public void contextDestroyed(ServletContextEvent arg0) {

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

    }

    public void contextInitialized(ServletContextEvent arg0) {

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

    }

    }

    - f( k, {+ S) \" |, c

    web.xml文件中的配置:

    <listener>

    <listener-class>

    com.csy.Test

    </listener-class>

    </listener>


    6 Y  e$ C/ k) p3 O$ r5 F# t- l
    • web应用中如下错误码示什么意思:400,401,404,500
        Y  F! n" q0 S# ^' H# T" P

      ! _: F9 r6 r" y+ M1 @- B
      400 Bad Request//错误请求
      401 Unauthorized//未被认可
      404 Not Found//没有创建
      500 Internal Server Error//服务器内部错误
      ) T5 u5 T2 {" {. V
    * v6 t- V1 N' ~  E; j" r. K
    • 描述Web应用中用声明方式来进行错误处理的两种方法; ?2 h, Y: u, w, |, M& k
      / W: V5 R0 x- F+ B6 }+ M3 j: @. O6 Z

      " H+ V+ e" j5 h; Q: Q" f

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

    <error-page>

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

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

    </error-page>

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

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

    <error-page>

    <exception-type>

    java.lang.ArithmeticException

    </exception-type>

    <location>/error/ExceptionPage</location>

    </error-page>

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

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

    ' [4 R9 ^9 R* k
    • 描述记录异常日志的方法,都位于那些接口?
      ( F8 ]- F+ M4 N# t
      3 L# o7 _# P; |4 Z7 {

      ( v; C- W- @9 c4 ?$ L3 a, j) I% V

    GenericServlet:

    log(message:String)

    log(message:String, Throwable:excp)

    ServletContext:

    log(message:String)

            log(message:String, excp:Throwable)


    . o% c/ ~+ h3 J: W/ ~8 _
    • 什么是会话?
      $ j4 ?* w, _; i+ j3 d5 `) |
      ( v  o# w$ e& `4 c% a$ |/ Z
      ( \7 c4 ]& X6 b

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


    ) ~5 I, z: i; s6 K
    • 如何获得会话?5 i" T! I3 ~! n9 m# @5 J& J

      / }% J3 z' U4 a9 m; ?: b5 f  _
      HttpSession session = request.getSesseion( );

      9 v7 j: K$ \+ v$ P2 V0 W% `  a: _# N
      V- W2 ^  @3 x' @7 t
    • 会话Api的基本功能?  n0 I4 ]- q; n
      6 a( i1 ^7 a) u

      & Q& c" H4 I7 v  H7 a- u6 r

    getID() :String
    ( m6 }1 c! _1 l1 l

        isNew() :boolean
    : K6 e) k3 {- N* [! E" X

        getAttribute(name):Object. u# k' k/ x7 k) T/ ]- @

        setAttribute(name,value)
    & y! \% U5 [( L7 ^2 x, P

        removeAttribute(name)


    0 D$ a7 q7 v6 K. N
    • 如何销毁会话?. g$ R, Q$ Y  Z0 d

      1 H1 [! x5 S- N) g% F4 R2 j8 v& k. j0 U7 m2 C

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

    <session-config>& _, g1 X3 |. I9 P5 B

             <session-timeout>10</session-timeout>, q# F8 c+ L$ U6 {4 I+ f$ k" ?

         </session-config>- W1 C( {( u' b! v2 C

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

    invalidate()
    . ?+ }" W2 q4 E$ N

         getCreationTime() :long* u) j7 O/ D& l' H

        getLastAccessedTime() :long
    - D" x$ ]  g/ D) V& I6 Q

        getMaxInactiveInterval() :int
    % b$ K9 f! r9 ^

         setMaxInactiveInterval(int)

    ( g* u# t# S  h: K; i. {9 l
    • 描述会话保持状态的基本原理
      1 t( E  ?! D4 c2 Q- n" o4 q$ V
      ; m% l0 @  t3 u3 U: `
      # y/ A* L3 D$ t. f

    ( N% x  M# X" ]( i* n5 _. P! R+ s

        client server
    3 _( h7 e5 W3 \* _' S# F7 j3 Q% `

    : k0 K" f# x& }; e& K

    request
    % H3 B6 Z2 Z. L

    response (sessionid)
    8 T- u2 q5 A  }0 Z

    request (cookies)
    8 c! j# o  `$ G4 h* V) e

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

    ) b6 _6 V' n* E, C5 C# t, P' @
    • 请描述session和cookie的异同之处
      0 Q5 e/ \/ U* m- z/ m! o9 L

      5 o6 L$ ~4 [1 M: Z' N# P" {+ }7 F- L# d6 t: N

    ) b( }/ m: ^0 C6 |5 n6 ]5 K' v" D, ~+ _2 q% }
    • 如何读写cookie,代码示例
        S/ A5 P4 |! ~2 ]

      ) T/ k% r/ _7 K3 b; n5 _( }, o' q/ i( p7 f. x1 b

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

    response.addCookie(c);

    读:Cookie[] cookies = request.getCookies();' [) c( ?+ J* K! D$ `

            for ( int i=0; i < cookies.length; i++ ) {, z& t7 `/ w0 {3 j9 W

                String key =cookies.getName();  E8 G7 T9 I, ?

    String value = cookies.getValue();
    # l0 X& W0 g9 P6 G1 P4 A! ^8 H; t$ |9 B

    System.out.println(“cook”+i+“:key=”+key+“,value=”+value);
    ' N) p; l$ o/ f; _

         }


    7 x. D+ [' x4 a* L. D; S6 f
    • 什么是URL重写,如何实现,代码示例9 A/ W) D+ O9 V; U# I+ n8 Z

      7 o+ J5 E5 I$ ?; `8 H( w6 e" A( V0 r" X0 K

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

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

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

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


    ; f+ N/ U! A( |0 K7 d( ~& q% j% l+ F: C6 K+ l7 K( K# P
    • 描述web应用的4种认证技术. T4 g* p' s1 {1 v7 v- x
      . L1 J6 R& T0 F# G* r

      9 V  v+ U) V: N: c) {9 |' n& k7 H

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

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

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

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

    0 d# {1 i4 n1 M$ X1 d$ _
    • 什么是授权,什么是验证?0 r+ m& ?) P" o3 A5 z0 l2 |
        C& S* o- t) E+ u1 [% R9 v8 |( d
      $ q  G+ c* a  r7 C1 G  H

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

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

    + @& A4 Y  U5 F- d
    • 什么是HTTPS/ a# R6 V6 }, ?7 E3 z
      $ m' u8 Y$ G$ M+ I9 g5 a: U) C
      5 ?( U$ \. O; y

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

    ) v: q4 t) k# e7 ~/ {; {
    • 什么是审计?
      " T+ O6 p# {7 i" Z! }* Y  v2 c

      % G- W* e. D3 X$ m: L- h" M3 D2 L( g9 @

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


    4 c2 E# Z, y  L# T
    • 如何实现声明性授权/ o5 [6 Z: b5 X$ G# i

      . }$ Q6 r9 h0 W# @" q- B& {( M' Q- y! t) z# U/ H6 N" v; q

    1、标识web资源集

    2、标识角色

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

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

    在 web.xml里配


    . m$ B$ ]4 o+ Q6 r2 c- O
    • 描述servlet并发问题?0 M3 q# D$ z1 S, }7 X5 |. Z

      8 S! l8 m" n: m/ _- A$ m; m# V( _
        C  c/ ^" J+ S) F# N

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


    5 h' ~, `5 T3 K' k8 b* @
    • 描述Web应用中的六种属性范围
      * E* T, G3 g& O; O8 Q4 L# Y) y

      : ?8 I7 P$ L& P: m& j8 @, U" `- ]# i- A8 W2 x9 j, v

    局部变量(页面范围)

    实例变量

    类变量

    请求属性(请求范围)

    会话属性(会话范围)

    上下文属性(应用范围)


    ( a. E( g+ s) s' m
    • 指出上述六种哪些是线程安全的* ]# z( |$ n4 w( R

      " `5 K# Z8 W! L/ ?# S: Z! p/ \( `% b1 K" z" v# ?3 o% ?" R  j

    局部变量和请求属性

    # T+ V* u* n: R
    • 什么是STM?如何实现?
      7 H+ j- i. {/ i. G  m3 [5 a

      % p9 O( `7 T, g( v1 \) P$ ~: _1 h" t* H! @& ?+ B( ]  @" I2 d

    SingleThreadModel接口

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


    , a+ x1 T0 O& u; m: V$ B1 }* n( k
    • 如何实现并发管理?
      / n% b) d: K1 B) t- T4 |

      9 `% {3 A! E8 T/ ?% G) U& p+ D$ |/ h+ u) i, i' P8 U/ w

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

    使用synchronized语法控制并发

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

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

    . X! k+ w  p; Q  m  Q
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    13#
    发表于 2014-12-03 12:45:45 |只看该作者
    Jsp+ U, X& k! [5 ?5 Y0 I$ F
    什么是Jsp?! y  S. ]* y! u
    Java Server Page    结合java和html在服务端动态生成web页面的技术; |& E0 W, f' ]

    . I6 @" l& G9 I
    % D5 j1 ~$ Y' K2 e( ^5 z+ \. t2 Z0 V0 \$ ?  Z
    描述Jsp页面的运行过程?- f! n  M# l/ ^1 Q: J
    第一步:
    " y/ w! b4 H. t' [! s# G( j
    " n( K2 _2 B. d/ h- u- y1 ]请求进入Web容器,将JSP页面翻译成Servlet代码
    ! c6 i; _! X+ U) O! j* k
    * l  @; t9 |4 ~! f5 N( z/ E第二步:
    3 I* y4 h7 N' {. j1 d9 e% h9 ~* S" s( r; E% E6 T; _" u4 j0 O
    编译Servlet代码,并将编译过的类文件装入Web容器(JVM)环境
    4 t6 m) m: s/ Z- U  a
    : m3 t( A: y* [6 K第三步:+ W& U6 l7 Y/ X4 f5 S& @" L

    1 {! t$ p, F6 f) I6 h" O- X( pWeb容器为JSP页面创建一个Servlet类实例,并执行jspInit方法
    . B$ g) V! b7 M5 ^5 p  D) C) u9 |- Q8 [
    第四步:
    ; J6 i1 O& ?# `6 f. v! E
    ' s8 I$ G! W3 M% }- TWeb容器为该JSP页面调用Servlet实例的_jspService方法;将结果发送给用户" S* E7 B+ n1 q, ^9 C) }4 _* y
    7 X$ t! W( h. w$ v  ]
    0 V2 _( \' i  ]2 L" B7 n# X

    - U' }, k6 X+ x. j描述Jsp页面的五类脚本元素的功能、写法、并示例- `5 \  D5 C1 g5 F
    注释 <%– –%>
    4 Z8 W. O$ F1 ~  G) S) y9 e8 A" p, g# S. J
    <HTML>2 q6 G8 z  N  ?8 |2 E

    & w6 r8 N, m3 ]  {; c2 N& `<%– scripting element –%>
    5 H9 g* v- L5 n8 E" q2 F' l' t; h/ ~, j3 y: |' n! h) G' ^+ d9 h
    </HTML>- n/ i5 l+ @; o
    & p6 P, x0 ~" Y0 @
    指令标记 <%@ %> 指令标记影响JSP页面的翻译阶段
    ; L5 ]) O+ J6 |+ @3 ]+ A
    # c. ]+ C* r% v( W$ _& e<%@ page session=”false” %>
    : q# m9 O* t- b  |( d" K' d
      Y# r, o) y  X' z5 P, [) i0 l声明标记 <%! %> 声明标记允许JSP页面开发人员包含类级声明0 p. z3 I$ a* H9 x" o/ w

    : n) L7 c7 C0 L- N. t<%! public static final String DEFAULT_NAME = “World”; %>2 l5 @' p5 l4 w3 H
    , |* F  h# S* e7 L% `+ W
        脚本标记 <% %> 脚本标记允许JSP页面开发人员在_jspService方法中包含任意的Java代码: U8 Y# y1 u! r$ [( v; i$ b. K

    & c$ Y- b& p/ S; j" {2 f    <% int i = 0; %>
    # I& e7 ~& F: @& X2 r! d+ _! m' m
    表达式标记 <%= %> 表达式标记封装Java运行时的表达式,其值被送至HTTP响应流 <B>Ten is <%= (2 * 5) %></B>$ M0 {8 l% |; E2 k. z9 S" \
    & j5 ^  g; h3 x9 U/ i, [' `

    $ A7 o3 G  t3 o/ r! z0 e: F9 Z& f9 z2 D* f$ D& E6 k
    描述Jsp页面中的注释种类和写法" w6 `1 E  s$ ?) t; r) t. u. N+ A
    HTML注释) p1 l' F6 @! C, \9 ^  b

      @8 a1 C1 m+ w  z0 q( x<!– HTML注释显示在响应中 –>
    , w7 `* E4 S9 _% X& o- ?' m
    * L0 ~  `7 |* ^. U7 T( eJSP页面注释. a6 P9 |  f: Y) c3 j' ?6 v  ?
    0 ^8 p! C" {! v3 M
    <%– JSP注释只在JSP代码中可见,不显示在servlet代码或响应中。–%>
    2 i/ w0 J( q# y$ g7 q5 b) u- T& N9 l: w' ]0 r* q# [! A/ Q4 m+ k
    Java注释( Z: l  }( J. q$ f) \
    5 q: Q* Y  r# |% |
    <%. ]5 a) c, h' u  j$ U

    & r8 y# J' i& S% A! \' E/* Java注释显示在servlet代码中,不显示在响应中
    0 h8 z5 n% t6 V9 Y* ?" W1 V
    ) [* `" s/ I3 {! o; b2 L*/" n5 U/ @/ h8 }$ d# X2 \7 u
    4 m! u2 [' W, {& [7 j# Y
    %>/ s) X8 j' y- ?* n

    ; n8 i& T# Q! E. S9 r, f. O
    0 g4 X- I- i" o2 i' J3 R$ s& e$ e3 d9 v+ x  d" A! A
    描述Jsp页面的指令标记的功能、写法、并示例- {2 W) q% [- j" b
    指令标记影响JSP页面的翻译阶段0 u0 G1 c9 K) j: Q6 t% M
    ' y- Y2 g. L/ [# F8 M5 m# |, j
    <%@ page session=”false” %>
    ) W/ s' p, m: W: q7 M! M9 D' W* O/ r/ i+ e8 j0 ]' h9 _
    <%@ include file=”incl/copyright.html” %>. @' E1 x% h( P' Z; E) U

    * T# W( u  p  M<%@ taglib %>" D: S% W3 |8 h/ S
    : y1 ?/ D1 u; R, l" M

    $ x1 e  E5 S5 e5 o) f5 r6 M
    2 ~, ]2 X+ {2 e% c1 }9 \( q描述Jsp页面的声明标记的功能、写法、并示例" m/ G, j1 T7 v
    声明标记允许JSP页面开发人员包含类级声明9 j- [. w- V, V1 k# ]- I' ~
    3 \2 r7 s8 P( s
    写法:
    - b, d% x+ W9 p5 e% \# R0 B, G: g! h& O: [
    <%! JavaClassDeclaration %>
    7 u4 k3 v* p$ e$ X" @$ K5 ~
    & f* g2 Z# m9 v! b2 F% @  d例:1 E! Q  |: }' n* r( H/ i. r
    2 t) c1 x9 w) @# F: a. M# q
    <%! public static final String DEFAULT_NAME = “World”; %>5 k' p3 m& C, c" V' S, U9 _  g' ~. m

    + L- k  j) L" L5 Z+ t/ {<%! public String getName(HttpServletRequest request) {( l7 m8 S( `- X
    , u7 u4 s% B& r& k6 S- H
    return request.getParameter(“name”);
    ! C4 r% W/ N+ M2 O) A- T) a( U- E% E& r
    }
    # z5 P* V0 _* R8 H# a( Z  R0 J8 e: v, v: U% S- {
    %>+ ~! l' `0 H8 t$ J

    1 X" F* g( ~+ v; r) t* {9 m& F<%! int counter = 0; %>! t" A" `/ ]; d: B2 H% L! @# l
    ) c% x% `3 l9 i0 U( F- Z4 ~
    2 l9 }" `9 ?* m% V% z8 b7 X
    3 Z1 w: ]( Q4 X/ I6 g& @
    描述Jsp页面翻译成Servlet的规则( r1 N& a/ ?: R' m4 O" e
    jsp中的注释标记被翻译成Servlet类中的注释. P7 Y; S. j& [3 J
    ( ?7 m% F9 E& y$ K2 I; f
    jsp中的指令标记被翻译成Servlet类中的import语句等
    3 x' A" a' c" @1 U$ U$ C2 X
    $ ~) Q# j: h/ F! Gjsp中的声明标记被翻译成Servlet类中的属性' R( _: t5 j+ U& W# y
    3 |7 u$ {; n6 J( [$ n
    jsp中的脚本标记被转移到Servlet类中service方法中的代码
    + z+ m; f# U' r
    1 k3 r/ T5 j/ i* k; ljsp中的表达式标记被翻译成Serlvet类中的write()或者print()方法括号中的代码
    * u- D+ N& o4 h4 c7 _
    ( q! B  S+ Z3 N  e) m# @, f' q
    - Y/ T" x- P6 A# T: T" X) j$ T; ]0 l8 Y" j" D8 s
    描述Jsp页面的九个预定义变量的功能、用法、并示例) v- x; t# g- w9 L: a
    request 与请求相关的HttpServletRequest对象
    3 P  h/ E) ^; d' ]) l6 s6 T. }9 n% }2 E
    response 与送回浏览器的响应相关的HttpServletResponse对象
    % v  M: ~7 }6 i# p2 i1 R: `: H0 T" W2 S# j( F
    out 与响应的输出流相关的JspWriter对象
    / b4 a6 \$ G1 e- A0 b* |9 Q* [, R% J; l  u
        session 与给定用户请求会话相关的HttpSession对象,该变量只在JSP页面参
    ! ]1 d. K( j: @# P
      r6 Q( X7 [% p: x1 F  K/ u与一个HTTP会话时有意义6 s. B& r* N! M; ~) t3 j

    + K/ z/ _2 ]. k2 z1 F# p4 ~    application 用于Web应用的ServletContext对象7 ]7 \  W! }9 Y* d8 L: ?' B* z
    . _/ d& M  G& ]1 c2 |9 s% h
    config 与该JSP页面的servlet相关的ServletConfig对象
    & x; Z% M0 U' B/ n* V5 H3 [6 A) Q% @# T4 A. t
    pageContext 该对象封装了一个JSP页面请求的环境, I4 m2 C6 `" ?
    # h* q. f- L3 j4 z7 h. l
    page 该变量与Java编程语言中的this变量等价3 g; t1 e* D5 u1 _3 A! O) N9 J

    6 O- m6 e: w0 a, f. g4 ~8 _: N    exception 由其它JSP页面抛出的Throwable对象,该变量只在”JSP错误页面”中可用' |! T: F; L0 R( Z( A1 u( k
    2 V1 R6 V; u* L  l8 \
    5 K* s5 p# `, Z* r$ ?

    ( `, \+ A) {" Q3 u! Zpage指令的功能,写法、并示例,并描述它的如下属性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding
    5 v, C7 _& G6 mimport import 定义了一组servlet类定义必须导入的类和包,值是一个由
    3 n' ?) n1 ^7 C" l- x
    + l  G$ z3 f/ E* s; D  R' a逗号分隔的完全类名或包的列表。  `) u$ L8 q$ ^
    ( `. @$ S' i* |& @
    session session 定义JSP页面是否参与HTTP会话,值可以为true(缺省)! T$ H: g' w6 h& _+ B  F6 P: `
    ! e, z) V" q& x4 g- u
    或false。
    & y$ s. @5 ^3 {5 L3 w( M4 y
    : L' p2 ^! b/ Z  ~5 R8 y% lbuffer buffer 定义用于输出流(JspWriter对象)的缓冲区大小,值可以为
    8 @2 _' @/ m! g7 v* e8 B
    4 X3 G) {% t. nnone或Nkb,缺省为8KB或更大。
    - g" O5 P' P4 O. K8 }1 S1 d
    , I- y! ?4 ^9 K4 {errorPage 用来指定由另一个jsp页面来处理所有该页面抛出的异常
    % @/ _4 ?7 b( \+ a+ g" @% G! n  Z% K3 Q8 F) c
    isErrorPage 定义JSP页面为其它JSP页面errorPage属性的目标,值为true或
    0 w1 O% `- X8 Q/ u. c" V% y1 b" |- x% E  k; r
    false(缺省)。
    . c/ R3 h0 ]" v  i0 D: n
    * q2 L" V" F! \5 mContentType 定义输出流的MIME类型,缺省为text/html。
    3 n) j  S: `" X" V3 z3 g3 n- H
      H" M" \2 [2 z1 u, D# w! JpageEncoding 定义输出流的字符编码,缺省为ISO-8859-1' x1 S1 _8 ]4 d0 y
    - S, E, _2 k' r0 F. z4 Q; `4 }
    ; u* y6 f) A2 m! X

      C! K1 ^3 S! r3 q描述MVC各部分的功能?MVC的优点?MVC的缺点?
    ) Z: G. z1 `  V0 C# T: E& bMVC各部分的功能:9 ~+ u8 W* b" h, @5 \. ?
    0 j' u# v; L% q! z
    Model(模型表示企业数据和业务逻辑)
    6 `! ~7 U  f0 F- F1 k" C$ ?8 i
    8 v- ]5 x! h0 C' c7 B; c封装应用状态
    ( g6 x# s* _% X, i/ \' \2 O
    8 K& Z- T* c6 T响应状态查询
    & _: C) v5 |( c; r! V$ _% }- G8 O. l4 C$ r& A5 k3 @9 P; L
    暴露应用的功能
    , B* ?+ {; G" A$ h
    " `6 ~6 {8 b7 ]5 a" k/ wController(控制器接受用户的输入并调用模型和视图去完成用户的需求)4 H/ B: Z+ m- Q, W* E

    " d4 z. c0 E1 y$ s6 X- i$ p3 k验证HTTP请求的数据
    ( m4 ], C3 X) B4 Y# g! a$ @  O- c* Z
    4 S7 [% N" A' C$ @" F  j5 @将用户数据与模型的更新相映射; p" e( Y8 R" Z" t: K% ?7 C( l

      |$ e; ^) V' [* v5 [选择用于响应的视图  m4 B9 p: c3 u. B

    0 e1 J# @: S/ c0 z, R/ b) QView(视图是用户看到并与之交互的界面)
    2 i: M  d; E; O2 P5 F, j3 g4 U, b
    . N$ Q0 s& l$ K  Y产生HTML响应% j( R. T) g- p' t; d  a
    . f6 |' @0 K* ?4 e# F4 m
    请求模型的更新4 o' m2 z1 V- A! m

    $ @7 W3 U$ k! U提供HTML form用于用户请求* l+ l0 J  ~, M! g+ r# r+ ~* R

    9 `0 _1 Z4 U6 PMVC的优点:
    ' N3 N; N/ y* y$ ?+ \7 J, C) F) H) [& ]5 N
            低耦合性:视图层和业务层分离* C! a2 q& |% M  ]" w0 M
    & ]+ w0 Y/ N# V8 v+ c; s/ t
    高重用性和可适用性
    & q, ~2 @/ _' b' V3 x. X) r  z3 w
    6 S$ u" y% m, k6 D+ N较低的生命周期成本. @3 F" S) D4 r

    8 B! ]+ a9 K0 D4 ]快速的部署
    6 O7 z( i, P( X6 t
    4 k0 C1 z# u! H6 S可维护性
    8 b% `1 g# N% e6 K: D
    8 _2 g. L8 |, e: x有利于软件工程化管理& G& y/ B; h7 Y6 {

      [2 h6 N. G/ ~+ H8 P; L/ z$ Y提高软件的健壮性8 J8 C5 y. K. u( j

    % o" P2 d) I  W9 `6 p8 IMVC的缺点:
    & u' |; }. f: e
    , G/ z& R* a3 f9 g! N        工作量大,增加工作的复杂性,MVC不适合小型甚至中等规模的应用程序: l' A3 }' q9 P6 {/ ^/ L/ ~& z
    $ Y0 W7 o/ C. F; G' R. [. v/ \9 h

    / H0 `. r+ k. y' ]$ f3 o- i
    & T7 [# [* e: `' T- G# Q6 q什么是Model 1结构,以及结构中各部分的功能: u( b; D. v/ j( U6 \" _
    结构:jsp+javabean2 R# a4 O0 j  m0 H  g! n  t. s
    ' }. m# F  C1 \3 U4 n( {$ M2 C/ Z& W
    Model1中使用jsp来处理web应用中的视图控制部分
    . k9 x( R, d" A* g4 ?1 l* N& d$ U+ i, Y! P( W$ |! H
    Javabean收集参数/ C3 {+ S* i/ ^

    . c' f, Y5 E! R ) r; n5 I. y+ a4 w+ s% q: }

    8 W# e9 g% ^7 o( i/ f什么是JavaBean?* K0 b/ p$ X+ ?
    用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。
    0 I" p' O8 |. J4 y- b; |
    ( j6 U. x+ T& S  n+ d
    $ C6 G* z" O) b8 f
    ! Z, j  H9 f+ q6 N: O9 k1 r) H7 \JavaBean的规则?$ p6 Z' T* |& X9 ~
    使用get和set方法定义属性2 F1 ?" |5 c6 t# j4 ^' g
    ( \* b/ Z4 |1 W* G% O8 L
    一个无参构造方法
    # O7 y) \* a0 J3 x
    : G$ B, j1 a) ]: i# Y0 v: q  b1 B# A无public实例变量( 所有属性私有化)
    . y" W, b$ ~6 W
    / l3 {& U  s- }! N) n: |
    4 ~$ f. b" l3 r: E: Y
    ; G1 e& p' ~( y6 G0 J什么是jsp标准动作?包含那些?分别都是什么功能?如何使用?8 Z! u: }0 ~( e$ ?
    JSP页面中使用类似于XML的标记表示运行时的动作1 h3 A, g: Y, W$ v$ T1 X2 @4 ~

    9 S) A/ z! y% b( K6 S8 Fjsp:useBean) W3 m: f& ~, w
    # S' p0 w/ ^$ i, N" C# x
    jsp:setProperty' D( R! [/ ]& {* _
    0 f0 L( h3 S1 _1 q! l
    jsp:getProperty
    % t8 a7 s  h7 J# X2 O- W8 H8 }% ~! h5 d( h2 j/ R0 u/ m( `
    jsp:param
    . E/ u  E! c  Q5 R5 E- ~9 T' y" ~  y6 l8 k& N9 U2 l' {: q
    jsp:include
    " F' P, a' s. F: ^) A& ?$ S1 I; y( w9 w
    jsp:forward" P1 p- w; v5 U5 {& I& Y% Q4 Z: w

    2 Z" O% L% \3 i% I
    : ^% i3 s4 {+ ?- v# Z. G8 b/ F7 R: x$ w- H. `7 _
    用代码示例如下标准动作的使用:useBean、getProperty、setProperty
    3 B+ {6 q3 R( a) _& @<jsp:useBean
    * ]4 X) u; G2 K' W" a+ X
    # N2 v; Y5 \! k5 M& v$ mid=”myForms”! w3 z' @& Y4 F' i3 X

    / J2 r$ M6 J* {0 o: Sclass=”com.base.mystruts.forms.MyActionForm” scope=”session” />8 p+ S% }# N6 D3 o, V. d
    8 A& G) c# f6 L3 A% J* q
        <jsp:setProperty name=”myForms” property=”name” />
    " I; K/ k1 g% O) v4 x6 P
    % q8 z" c( j& M( Q' k9 f<jsp:getProperty name=”myForms” property=”id” />" ^7 E5 D( j& X
    8 N$ V! ]+ C% P7 i: H/ q
    $ \. g: z+ J- P1 m9 m
    " N* m- Y( H+ Q) b9 F4 J
    描述说明Bean的四种scope
    5 S. V  s" G. f, S1 jpage$ {8 a6 ]6 r: C2 B; A1 o6 u
    - p8 K2 U5 D9 W  y
    request6 k* u6 O: d% L6 g9 O4 A
    % h! y) I  w5 w# ^
    session  @# l/ O8 ]' h- P

    9 f5 C: M3 E6 Wapplication
    ) w6 N7 A$ q$ y) I" o. `* D
    - k: [7 s0 L8 e  ?
    : R* B& c  f' ~8 E) F/ O. A3 v7 E2 R3 J7 g
    描述说明页面上的字段和Bean中属性的对应规则
    9 _' q, R7 S6 Y8 m" y" g3 |id 指javabean的变量名
    + g7 F2 q0 ]# a) G" Z% _
    / d& E7 P" C% L  Nclass指javabean类的全路径5 I( K/ T* L- g/ R* D
    1 ~0 O5 b- L, n/ ^/ |3 {6 b( Q
    scope指javabean的应用范围
    / r/ D/ g, X7 {; m' p! ?' |, X' C7 j6 ~/ p6 a  Z+ }
    name指所用到的javabean的变量名: d; W" h0 E+ f; \. U' l3 m
    7 `3 h' \4 l3 }- a. M7 Y
        property指javabean中的属性
    + \7 U, x; [- u* |' [
    2 d% D; {5 K3 I  j* N
    : d* m0 R* Y" Q0 h; e0 C2 q% Q+ V. r4 K
    描述useBean动作的处理过程
    2 P  ^+ \, n, J! I使用id声明变量- D, T! E0 z% g& m' ^6 W3 W
    & }. j- o; ]( x& H5 I, b
    试图在指定的范围内查找对象
    3 }0 }8 o! ^1 g# B, u6 a3 f4 r- E0 G) T
    如果没找到
      j6 T+ I" \1 C3 S9 H( t( b$ R  w- N4 \4 t) j8 P  V
    创建一个类的实例0 `4 l7 M/ ?5 X" R& A0 Z! q' W
    + M% P" f! i, m6 e
    执行useBean标记体初始化对象
    % B) Z. i8 u* O5 q
    4 c' E0 [2 Q1 Q) b如果找到
    4 W, V1 T* S' n3 |
    2 c6 l, i' }5 E7 x1 v9 M2 W     将对象转换为类指定的类型
      X9 Q( s. e& n) d& R6 ]6 u" V; g" ~) y7 @) o% `3 e( ~# U

    - X; L8 N' u% U  m! h. y
      H6 K" n' w9 ~8 _% h# b描述forward动作的功能
    , ^" H  y5 R6 v9 g3 Y使用脚本代码处理请求时,可用jsp:forward 动作产生一个不同的视图,' c! p/ q. k1 g; S6 M. J0 q4 D

    ! N! h/ n" }+ S& g, Y" C! I使用同一个request:
    ! K( G6 d, y2 h( T7 ?6 U0 |
    " {9 {4 p3 z# N- T' W! e$ t & W, L2 O; \+ X9 n+ y! b

    ; e2 j) p! C. ~0 A5 G什么是Model 2结构,以及结构中各部分的功能: b6 W5 ^- `2 k9 H8 [# H" x! \. ?
    jsp+model+servlet/ Q  T  I* H9 t1 y5 K; }+ R
    $ p. B9 r1 \( b! g
    Model 2架构使用MVC模式,JSP页面充当视图,Servlet充当控制器1 Q6 j" ^. m) @7 _) C

    - Z- P- U% F4 U7 M: o7 `Servlet控制器:1 K& ~  B' f+ ^, C

    - d1 i, F; D7 `& G验证HTML form数据
    8 H3 L) ]. @8 Y) @% i3 t& v# e! }; v5 _1 s, q  |
    调用模型中的业务服务- y: S$ A  S0 h+ T& ^8 \/ _; |

    + @* O+ j! I8 m: W( T存储请求(或会话)范围内的域对象
    ) c5 }& ~* v8 g0 C0 T/ _4 B7 B. A3 o5 J& t
    选择下一个用户的视图- d$ s& r& e& r& u
    ' f& ~/ q0 B; F& _2 F2 f
    JSP页面视图:
    $ {, e; ]% f. |6 G$ o2 p* T; C/ T2 h* a
    使用用户界面(在HTML中)
    & c# F9 |% y$ z) m( X6 ]
    8 @4 D! A6 h6 x4 ?0 \% s        访问域对象
    ; W- K+ O* @, W3 d* h% r( m0 l) `! P) }& Y

    1 D5 Y. t3 f8 _  H& _; B* `$ Q7 O7 `& O5 l
    如何获得分发器?分发器的功能?
    4 a( v6 |, q0 U; ^9 Y上下文对象中的分发器:
    " l/ b3 h7 ?& P+ N- d! w. f2 I% I4 ?( r, e$ W5 L
    ServletContext context = this.getServletContext();2 Q+ V& N3 N% }# ?( B& ]
    ' \$ ^8 B/ @# s  }2 ?* q. h7 Z
    RequestDispatcher servlet = context.getNamedDispatcher(“MyServlet”);
    0 `% h! b# @* m7 r  ]. [" B
    / C9 m" k: v+ X. t3 T/ z& sservlet.forward(request, response);
    , G2 X: _1 \9 D, D- B9 A
    . j0 ?& c5 }; |. _( U请求对象中的分发器:
    7 M; {, w* \! b' [; D( u
    - [% f' l: a- C# ]* v  NRequestDispatcher view = request.getRequestDispatcher(“tools/nails.jsp”);
    ! Y9 @" ?5 {7 ?1 ~3 p4 P/ ]$ Q. M1 g/ i& `: I
    view.forward(request, response);8 U& M7 q& T2 c( n  w) _

    ' z' G& h4 c7 [0 C0 V/ H* L可以将请求转发到另一个jsp页面,并保持请求的传递性1 H- c& ~7 V& w6 v0 y

    4 o! h. ]3 Z+ E6 b# d6 R - `3 e( @6 E2 Q5 h9 N
    - B; f0 s, Y/ k) w' f, ~
    Jsp中页面跳转的两种方式?. ], d  z9 N% b$ w& F
    使用分发器跳转页面8 ?7 Y& g: J1 g) X. G4 j! r
    RequestDispatcher dispatcher = request.getRequestDispatcher(“url”);
    . G# k5 S3 ~$ i- ^# B2 t3 W, ^+ v; u! v% W# ^$ @* P$ b
    dispatcher.forword(request);$ d7 t  i$ z5 k/ R; Q) S8 I$ c
    - m& R7 n6 C+ H# c/ |
        特点:保持请求的传递(上一次请求中的数据,在下一个请求中仍然可以得到);
    $ N- m5 ~' e2 ]; V7 ?( w
    8 h4 @" d- T3 t        转发的页面只能是同一个Web应用程序的其他Web组件. k1 q1 T* j0 L4 V2 Y% u
    : P/ q' P% B5 {( t5 K
    使用重定向跳转页面
    * c  [' ?" J8 `response.sendRedirect(“url”);4 @: j1 ?- E5 r

    ) x; L7 u! \& C8 v6 ?    特点:产生全新的请求,(上一次请求中的数据,在下一个请求中不能得到);  H4 e0 u4 u3 g8 [; h2 q

    7 Z/ M# }& D1 S! k$ a& l        重新定向的页面可以是任意的URL+ ~; y: t# h3 O, Y# d
    7 M6 x2 [# U# P4 Q7 I! S6 i* a1 A! A6 K

    8 H) Y7 E& p$ m
    / F, n3 N9 ^$ l2 ~$ `描述Jsp中引入另外页面的两种方法,并比较两种方法的特点?# ?, J( w6 \: [& T  Q  R5 b5 E
    <%@ include file=””%> 在编译期间把另一个页面完全嵌入这个页面,可以说是一个页面
      N0 E! \! u- ?/ }
    ; ]" |6 F' ^5 A1 @0 t在这里可以共享变量; w3 r* V( m9 C  p, c! N6 |/ U

    $ {: j3 ^$ A8 A& l<jsp:include page=””> 动态的再运行期间把另一个页面加入这个页面,可以说是两个) Q2 v9 m/ M7 B8 p# H9 B0 g7 n
    * c# @+ f/ u" o5 a$ r$ p# S/ @1 x
    页面,不可以共享变量
    ) w4 e, t% a: v! m* A7 c2 _- a5 T7 f% t
    / z7 ~% D- s% r8 o4 T' f; @; ?
    ( j7 c& M  t& m% U
    什么是自定义标记
    6 m; p0 h# e' U. _- b自定义标记库是一个Web组件,5 |1 `% M$ [# s; U
    9 {: X4 h0 M0 ~' l* M& o
    包括:
    & X/ I$ V  C9 y; u& Q1 _0 [6 g! l# N8 p6 d0 c- t7 {
    一个标记库描述符文件(*.tld)
    . N6 [5 k; s  |) ]# Z1 D8 L) w4 \) ]) s5 M- ]- H/ e
    所有相关的标记处理器类(*.jar)
    & c3 |) @5 _# C3 }- M$ y
    1 B: q9 ?1 ~- C8 ^8 U! v ) S8 m9 S  {. H1 d# H# X+ _2 z

    5 N7 k+ u2 h& v描述使用自定义标记的步骤,以及每步详细的工作# K+ k0 y* A" K! Z# U
    使用自定义标记前,要拿到.tld和.jar两类文件
    , Y2 e' t! j1 i& Z
    & K1 D8 Y+ J7 S把.jar文件放到WEB-INF的lib里面。
    : }4 Z  J) o* L5 W把.tld文件放到WEB-INF根目录下。$ y. g' @+ K( s- N8 [9 V, w
    在web.xml中配置。
    % [" V6 e' t2 G8 y" f2 l- F( z) f<taglib>; ]3 g! p& U0 _- i9 Z: l( Q, h

    - s( @, x, Q  g# W% a6 c1 w: K4 f3 s4 \$ V<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
    + B3 L9 c$ v0 t  l& _" k" x7 P3 ]/ I3 u& L; d
         <taglib-location>/WEB-INF/c.tld</taglib-location>; X, |7 J! U5 L+ D* Z; n' c0 [

    8 B6 t/ m! }  I, U$ T</taglib>
    / @  b) C9 G" D# r" h' x8 [+ k
      B5 h6 v+ H" Y" _. t7 F在页面中引用。
    5 M* e% I* n- D, w# Q<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“s”%>5 A, v9 N& r3 O0 o) G
      W( L1 A2 n4 J/ E1 ^
    uri必须与web.xml中的uri对应
    : b5 B# e( o9 j7 g1 d; V  q& f# c: `/ a. C+ m6 x* c% A
    prefix是前缀,用来区分是哪一个taglib
    1 `8 m" Q* a' |- k: a0 M- Y# C
    # ^+ N& F2 O& F& X7 ?使用标记7 Y; |+ u& q6 L3 x; _
    格式:<prefix:tag名称 属性>8 Y: n2 S0 E3 Q5 X$ O9 o
    ; j' D/ a% v. G5 g( g4 e
    <s:forEach >
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    14#
    发表于 2014-12-03 12:45:59 |只看该作者
    在tomcat下配置数据源4 [& O# e  Z4 q3 u
    1、服务器与数据库的连接/ n' B8 {( U3 Y3 S7 v$ ]! N
    ' b$ C. d+ v& ~& \) i) r
    配置server.xml文件
    4 R% c$ N/ j3 H# K
    " N( v4 y8 S9 K8 [9 s# x/ V% o1.oracle
    7 `1 P) K- w0 ^; }* ^7 m
    ! y2 B$ e( `; `/ k+ z<Resource name=”jdbc/company” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”5 g3 h5 u; D" }- k5 X

    , p+ _, f4 D- j- Q" z  A9 P) Z                        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”
    5 h2 v$ H3 B' p% l' C. l6 e* j% i4 ^* ?* i' I2 {
    url=”jdbcracle:thin127.0.0.1:1521rcl”. m; G- W& L2 y2 V% F9 b  q: n& @

    3 B" g. c' L  ndriverClassName=”oracle.jdbc.driver.OracleDriver”
    ) t  T3 S! t# V$ U
      h0 K6 E: N/ q: H, `username=”aa”
    ) i& _0 r1 y& T8 ~; B2 z( }' A& \
    password=”aa”
    " z8 Z( b, X, d6 e3 b$ j! E2 X! \7 ~. v" w
    maxActive=”50″* p* @0 O1 O5 i1 Z# l4 P& X

    . g; _. T5 O) v' P5 a  M; x* P( kmaxIdle=”10″6 q1 @9 C0 [2 f0 k2 X% a+ d5 a) q, d
    ; a8 f, ~* t/ a0 w
    maxWait=”-1″
    , K4 p7 s; J" q4 t# B% c& Z3 J. r7 v( F4 ?! [2 h4 s4 F9 a1 P* Y
    />6 t% ~; G( b8 S. [  ?/ Y

    / X5 C  K$ _4 Q" T3 g/ e, ~5 m6 T2.sqlserver. L' u6 u& U& B( N/ L7 W* ^

    - m7 `' F& S3 a+ ~7 i  w: v9 b2 i<Resource name=”jdbc/webpage” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
    * m- T0 N6 N0 n8 M  c: ]0 {2 K! c3 l0 b7 |: ^& Y
            factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”/ Y% U' S5 C# W, ]2 @4 s
    9 O0 C  S# k5 I# x7 g) z
    url=”jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;
    ( A/ H. O" Y. y9 [. Y$ q: A3 b2 n7 C, \5 L* Y
    DatabaseName=webpagetest”- P; a# M" V5 |, Z& {0 s/ W$ T
    - h3 E( Q( J9 P
    driverClassName=”net.sourceforge.jtds.jdbc.Driver”. A0 f& h6 k2 K" l* |. ~

    , n0 E- i' y% _2 ]" ausername=”aa”
    3 x$ j4 ?* A/ t; ?' _6 `
    " K: s- d% U& M  w2 hpassword=”aa”; m# w8 Q  P8 {. |  C+ A* y% _& P

    ; s6 M, x; H) h+ N$ nmaxActive=”50″
    ; N9 f# `: i& @1 W1 e9 l( P5 C! N1 z2 ?
    maxIdle=”10″
    ) V% }, ]0 V& u7 Y1 C7 t& m8 z) [, y. k3 D3 p/ Z* A! e
    maxWait=”-1″
    ' s+ t! L2 q7 b" ?5 r
      q: F9 x" S$ Q5 J% }  w$ w1 H/>
    , E; ^! P1 a: v. M- H
    $ _/ z9 ~( ]) j! k' p2、配置自己的web应用的xml文件# H! i- ^+ B8 Q0 D* `
    ' u" _, Z; x3 x" W
    ' H9 K/ l! z  h3 \. E
    0 n3 B5 A5 Q) `  w
    <Context path=”/eb03web” docBase=”F:/workweb/eb03web”
    ' |6 P+ T* T3 m* ~2 n$ A, Y) K/ `# s
    privileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>
    $ ^9 e; D( K# ~6 l' u1 X5 [+ X4 o7 s0 Q* L# j9 I
    <ResourceLink global=”jdbc/company” name=”jdbc/company” type=”javax.sql.DataSource”/>
      H0 T9 H/ [' _- N. J
    4 \5 M* e+ b. t, J" n6 H' _8 q</Context>
    7 s. q4 q3 S6 Q" h- ?& _1 P
    & e7 i6 |( h) f" p% O ) }& O$ l  t% ^' f' U3 h
    ) L- q# D. H9 I0 t. }
    3、配置web.xml文件
    , R8 B* s) P6 l* g% o, I% d' P0 a0 c* U) S+ u. m) W
    与服务器建立连接" m+ p* n) ~$ D& O* A

    1 Y- w1 `& k0 ?* z! ?0 i! F6 p: ^; l<resource-ref>) b- K) e, ^& d- l2 F5 A0 v
    : \, s& v5 d* X* o  j( P9 O
    <res-ref-name>jdbc/company</res-ref-name>5 f/ r/ X9 Q2 A: Y- j0 d

    , m2 B3 c) g, j6 ^; L<res-type>javax.sql.DataSource</res-type>3 ?, P' V- A1 L$ F; i2 N& y
    ' I5 _6 A9 M# G# s3 ~1 h6 p, x
    <res-auth>Container</res-auth>0 g) d' d# {4 h1 S; h2 B6 H
    9 }4 ?5 g( ~" q( Z/ [  ?
    </resource-ref>
    6 p) [$ k; y4 d& |  M- N7 A7 f4 y0 t" w# ^
    4、在应用程序中不直接与数据库连接,通过DataSource连接池建立连接$ B! ^) v, x& w9 S$ S

    7 d2 u& V- z3 G! d0 w: Y//1.在程序单独用时设置系统的属性,在tomcat下可以不用配置,* j( E, J. {% S& O7 _* ]2 j
    9 _% D! e4 ~' r; O: O
    System.setProperty(Context.PROVIDER_URL,””);
    + ?+ }) H! |5 d% z4 h2 e3 a7 e7 ~, t; h; @
    System.setProperty(Context.INITIAL_CONTEXT_FACTORY,””);& w6 Z' U2 T2 L' b, Z* E

    $ _; C7 r8 v9 Y; |. G8 |6 g3 L//2.创建一个上下文对象  v% A3 f, t" e+ b6 v: @: b! N  U( a

    0 J" B0 e# y/ M4 PInitialContext context = new InitialContext();7 G' u- F' J- ?2 r6 q7 G
    * I7 ]+ Z: B( Y4 _, j' h
    //3.通过上下文对象在连接池中查找DataSource. `: u, |: U3 w4 v6 _
    7 Z( r. n$ c7 g% L
    DataSource ds = (DataSource)context.lookUp(“java:comp/env/jdbc/company”);
    4 L) n" V% F( S! @% N2 ?0 [' }: M8 Y% O) ^; K3 w& A
    //4.通过数据源建立连接
    6 a2 l/ U6 [2 z* O( c, t- z& ?
    & M8 S+ J$ C5 Y4 tds.getConnection();
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    15#
    发表于 2014-12-03 12:46:30 |只看该作者
    ORM对象关系型数据库映射  u1 ]6 n, g, @2 s" E
    (Object Relation Mapping)" U7 u1 G# V1 ^  N! G
    5 m! ?+ j  o- s8 I
    一、映射的特点. M3 V7 P( E( A. F& L2 c  c3 X

    ( {' W0 o# v  P' J8 J1.一个对象可以对应多个表
    " j! T$ \) V% c4 T# s# _9 \+ b& G' @2 u$ V
    2.一个表可以对应多个对象
    0 W" ?7 X/ q/ j: S6 t8 g; D! l: w; C) G
    3.对象和表的关系不用完全对应
    8 a+ Z3 {% E/ }
    + H9 x' k- ^4 W: ~; f& Q+ p: G0 g4.对象的属性的名称和表字段的名称可以不同" W- G4 h5 H# \2 D
    " e8 @( s8 z5 s( Q
    5.类型可以不同,但数据类型之间可以转换
    / W% J: t6 N) F& z% Y: n( |3 P7 ~6 Q3 \. }# }
    6.对象中必须有主键,数据库的表对主键无所谓5 l3 {+ u! o% B& g' V( Y

    + O( L  d- D' f& Q+ `7.数据库中有主外键关系时,对象中可以有,也可以没有
    1 p# P) G( U2 s& H2 z, {& z) n' _  B/ w

    2 i+ ?/ N4 n; d9 e' x- s* s" v" s6 I& w/ c, D; I8 D% _! H
    二 、有一个映射的描述文件————>xml) x: v% w# Y% \5 s' G8 H

      o" I4 R: f3 _9 b三 、怎样实现描述文件————>一段程序
    8 m/ ~8 p7 O( w% p7 W% l% R
    ) f  G& i4 |1 I对象 映射(mapping) 数据库1 _# h! d5 N: W1 Q( o. Z/ i! b1 |
    * P: w% V+ n' s  B6 U
    user/ k, k6 N+ [) \/ s( n! h
    1 D! z1 O. O+ v' q, i/ d$ S
    id=11) L/ I5 x( A# f- ?6 c4 z' z- `5 Z
    3 _9 |* ~7 d# s+ S  t: q$ e
    name=”张三”———— > (1) —————> tbl_user(id,name,age,tel,address)
    8 h* U) J  ]2 K+ F) A. K& ^, u
    6 W. M- u# v0 I3 _age=25 <————(2) <————
    8 d) c; h- O* {& a1 y. u
    4 _; C! q' l8 U4 D. [ * t  f! H! r2 b( M, s
    8 m, J( C! O, t3 n3 {2 S$ |
    (1)从对象映射到数据库' p* @, y) K# y2 t8 e8 [2 z
    , j# c1 Y3 n- ]; Y  ]  Z
    1.JDBC
    ) ~- q9 P9 `# {/ K+ C) q
    ) {: l7 U5 t5 R6 X) x2.根据描述文件来动态拼接sql
    + {3 f- L+ ]* w" y
    : Z6 E0 L; i( G5 X2 V4 g& E! p3.执行,添加到数据库中% D% g4 b7 B5 b" o; C
    . I/ I1 O  ^* S& ?

    , m2 y; P8 B3 F9 ]- s
    9 k: G+ G0 V2 ]& p% J3 R(2)从数据库中映射到对象5 A% e/ ]3 m. D" ~, t" p6 o$ s+ R
    , t- ^9 i7 X6 X, H0 ^7 i, G& R) f8 o
    1.JDBC9 [$ K; V) c/ U: ~/ d
    7 g! H$ K& F7 e3 g
    2.拼接查询sql
      ~5 Z3 }1 l7 r1 O$ d9 e% C' u0 a7 W' O& _
    3.ResultSet5 \( ^7 y5 h! u, Z

    . h! z: y1 d/ I5 [+ ~/ v4.Model & b4 v. a+ P$ k8 [7 S$ U$ [* A7 l

    " I9 N, n  u  Q1 w " s! [5 {9 B0 i

    ) Z- m6 }& J5 Y- V# K- r) Phibernate2 y: M8 k$ Y1 j( o* G; B
    开发流程:" r5 m# Q' z( a) x
    ; g, a# p7 Q0 P. v- `( q$ t- U% K
    是什么?- y) S. t) M6 K: J3 p
    hibernate是一种基于orm 的轻量级的框架
    1 Q& D: t( ^1 j$ u7 G9 |( l
    2 z! u' G" T3 c5 h  ]: O  a
    & t9 T' }2 Q( q+ Q6 v' \0 a9 G. ?8 C, |8 {5 k. Q+ w
    有什么?
    / n8 z! @* F. c9 D1 V/ O1. session 保持连接状态(依赖事务和连接池)" \, S' l  x$ T& ]5 U9 x  a& c

    4 q* l2 z4 Q1 N+ }7 N2 F2. Transaction事务
    - v& |. c) J4 c2 [9 @% F3 V" [/ O* s# R3 c3 ^
    3.
    * i4 y5 W( R# X( g5 ]Connection Provider 连接池
    # j4 _& s/ K8 t. F2 F3 W% e- K3 g3 o8 D
    $ w5 f& w1 f- y/ S* x2 t
    0 P/ b7 v" J' P+ P8 d. D
    能干什么?5 |8 w( |3 B/ [
    1.orm/ N! k2 @) t; [
    , E0 @& {, _& q' d, ~8 Q
    2.提供操作数据库的接口,简化数据持久化的编程任务
    % T- D9 i% {- Y; \3 z( K7 Z' R0 P2 t0 _. ]) p; M9 S* q6 E  m

    & n9 g: V. l2 m2 M1 K
    - ]& ^; ]- g4 b, d3 }: A) G怎么做?
    4 H. C! x+ B4 i1.搭建hibernate的运行环境,将hibernate的包和hibernate所需要的包拷贝到lib 文件夹下
    4 T8 R0 J0 F1 g$ q  r9 Q- r6 r4 a% K; h3 K
    2.O(vo): T( ]- C0 F  l; [3 w  U' [5 A7 t
    % |" s" N" w; @4 s5 J/ @: _
    3.R (关系型数据库中的表)* @) l+ k2 i/ c. Y* ^, k3 P
    " z4 n6 p# j, x5 a2 n8 R% v
    4.配置文件
    9 X$ B1 c) W2 ]4 l1 e* H3 w, p
    4 v$ K" k) q. X* H4.1 cfg.xml 放在classes根目录下,默认名字为hibernate.cfg.xml$ s( b6 Q0 L6 e5 f6 e+ K

    ' j* ?0 H  F" a) Ba.与数据库的连接7 u, V# k5 Y5 z) l2 \( s
    * w' L6 a9 K4 q$ a% X
    b.可选配置
    - P: \! ~  D  ~/ j  o6 J7 A9 }( R( ?
    c.映射资源的注册) F! C5 A+ y# Q# {; o$ @2 J

    0 Z$ M3 B: u9 f8 o' r, U4 D4.2 hbm.xml文件 名字与类名相同 并且与类放在一起
      j9 }5 `9 e" I# k
    + O) ^' Q, ?" ma. 对象与数据库表之间的映射
    , v3 E" Y# q! t8 M# V/ ~5 o, ~, L9 m& I
    b. 对象的属性与数据库表的字段之间的映射
    1 q- \; u, R4 J- |. Q7 s; i# e) A/ B% N0 U
    c.组件之间的映射7 b5 Y7 D  _. f5 W
    ! x! j, k3 }# a7 l( F
    d.对象与对象之间的关系映射. g" j# U  e7 w* z) I5 N
    " m8 s) k9 _: q  s4 U4 h% o
    5、客户端
      @2 b! q" S& \* C, C3 l1 }
    " E* t( g9 g( L4 k4 }0 i  m3 Z/ P1.得到SessionFactory* ^* ^, Y! i# |) V6 S3 e! K" [  h

    * Z, f: q  Z  H8 y1 R8 _  X! v/ O& M& F2.通过SessionFactory 工厂来创建Session实例
    & C2 R: p" A7 Y( ^9 Q2 `& J: l4 |7 p( A) m% ~, P
    3.打开事务
    6 `! z: x& G: R; {/ m; R, W: o# B) h3 I& G5 l
    4.操作数据库' [% E6 W' J' L2 n
    $ C- V" q: C# R! O  y  {* t: Q
    5.事务提交
    7 M3 _! f8 |) N$ a7 ^2 A* X& s
    6.关闭连接& K+ J0 p& d5 K& I3 J
    ( z7 D) K) m% I
    运行流程:+ I9 V5 V: j8 w3 ~: p
    , _  ^: C0 D# q/ {' R
    整体流程
    ; o' G+ e# D( z9 x% x# X5 D7 O. I$ J1.通过configuration来读cfg.xml文件
    ( w- J6 k* G4 g! I! P5 v
    ' r; N! H+ d6 w7 X% D2.得到SessionFactory 工厂(根据数据库的连接来创建sessionfactory)
      `  o' J6 M) f' N  k: F  x. K, f; ]7 Z1 {
    3.通过SessionFactory 工厂来创建Session实例1 [0 l  j* n" S
    8 [: O$ I6 e* \6 M) {
    4.打开事务. \. H! D+ v5 z7 `& v, h1 b  h
    " d  s: a) u% r& O* T: U
    5.通过session的api操作数据库6 p+ N. T  r/ N0 x% H

    * ]5 \; [# ^5 Q8 M. L9 t8 V$ A) K6.事务提交: M" ?$ K, w4 ?3 {3 I5 x; M

    7 i4 v( |! b0 n: s  L9 R3 ]7.关闭连接
    ; j& w$ t. |4 _# F, L- f1 @5 }! ?

    ' H' Z$ a1 U! `/ X- X+ A
    9 J/ n* i  U0 Csave4 D$ p3 o: }% Y& y
    1.to—>po' z9 D. a2 M9 H& _5 I# V
    ; r. v* ]; b/ w8 {2 j1 N# T# t
    2.根据model和cfg.xml中映射文件的注册来找到hbm.xml文件
    : X; G* z& x7 K5 R$ {" X/ N/ k/ K8 y8 ]- e
    3.根据hbm.xml文件和model来动态的拼sql  o! t6 ^. ^: L2 m

    . J" _8 u2 }, I% D; E* T( y- f4.客户端提交或者刷新内存& e0 h5 T/ E- E3 A4 z

    - v1 W2 k. q( D5.执行sql,值放到数据库
    ' m& u! j, v" G( _0 ]+ g  a" x* ]* ], H/ A" y: I8 R8 A; J

    , X* r# m! y& a- i
    4 f/ e5 v3 D: n, Lupdate、delete, ^# j/ O0 X1 _7 W) u
    1.根据model 的id在内存hibernate的缓存中查找该对象
    " \* b1 c# v# r9 g( L8 t, p) W* c/ X& O1 M+ Y' n+ m' D
    如果内存中没有就到数据库中查找来保证对象的存在; z. t4 N& D& l  |5 P# j( ~, s
    - k2 P" C  E8 @5 i' x
    2.根据model和cfg.xml文件中映射文件的注册来找到hbm.xml文件( k- t* Z1 \" B2 |5 U
    & r7 ^, [& y& d7 {% [
    3.根据model和hbm.xml 文件来动态拼sql0 h! W" R. j4 G" K. f( g* z

    + }" `8 k6 r! N8 r* J4.客户端提交或者刷新内存: e& I+ V6 A  |: j  L
      n; S+ [. r+ [4 ?( P& x
    5.执行sql
    % ^  s- c9 A! R8 U) {3 r% J: v" ?* s) u: A: i
    ; t7 m! Z- O! H6 `' O+ C

    4 L$ N* o: C* T3 m% Q  PQuery
    : e- P/ E( o& p' k' X% Rload/ w' \" W& Q! ^5 L2 y" j
    + h& X4 [/ t* @0 \. b! K* R- l; H5 L: l
    1.根据model的类型来找到hbm.xml文件
    " K. ]- ~+ L7 v- [5 \5 y# u, y1 v$ H1 u+ J0 }
    2.判断id对应的对象在缓存中是否存在,如果存在,就直接使用,如果不存在就进行下一步。' h$ g: t. z9 D- t: G. T! D
    . h; }& M. o8 }( r5 c% o: N
    3.用id做为查询条件来动态拼sql
    % r1 Z. x8 k2 `4 n4 p; W- c4 C0 K" m7 Y& T) c
    4.执行sql 查询(先在内存中查找,如果没有找到(会抛出例外),就去数据库中查找)
      Y! R$ ~: K5 D6 U1 l1 h# d5 |0 S' d8 o
    5.返回一个model类型的对象- s: F, m# N1 @. S1 S
    7 p3 J7 N4 ^! m, r+ V" w/ f+ K! ^
    get
    ! a3 _1 d$ Q* Y, O2 x  c9 r# A; ?$ ]' m2 C$ ?+ h+ ]
        1.根据model的类型来找到hbm.xml文件& W5 _$ \- _9 C/ ?0 y' s) c

    , }- J# W& z% K) _) T3 z1 _2.用id做为查询条件来动态拼sql
    ) p$ g# k+ h: z8 l+ Y3 S7 o" T; h4 X2 [6 l7 r; A
    3.执行sql 直接在数据库中查找,如果没有查到就会返回null! {( \3 I0 m( q" o1 q

    0 L  ?; Z, Z& u4 l1 aquery- x- P" V- g6 @4 e: i

    " z; u8 v! g* C1.分析hql语句,得到model的类型  U) _! l; m8 C9 d0 D
    3 B' c' f" g; u3 k/ ^) `
    2.根据moedel和cfg.xml文件中映射文件的注册找到hbm.xml文件; f2 H4 J4 o! v) ^) Z
      C6 {6 I' ]& w. ^& P" O! m
    3.根据model和hbm.xml文件来动态拼sql) ~; ?( D9 M. y1 \
    3 T" l  O. h; b/ x/ W
    4.执行sql查询数据库
    ! F; t7 G' Q3 ^. b/ M
    ! `; s" u, C; |) R5.返回一个resultset
    8 u8 v- l  I; N; G  O2 A) s
    - P0 o4 ?* B, ^$ c' T6.循环resultset的值,放到model中在放到集合(List)中  H' N7 i" f( J6 H

    . U$ D& P% G7 i# P% ?4 z* H* I
    $ t3 ]0 d* G2 w% a+ E: q
    % b0 N. R( k% I0 ~2 x谈谈hibernate缓存机制
    " @/ \# V9 {) |3 Q5 V& F3 w
    3 k. A# q$ Y, {/ v缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了。打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去数据库中取,也省了很多事。
    . d3 D+ A, V! l) N: Q
    + S; k; O' @  N4 |" e: M8 O2 G
    9 T7 }7 j+ B' R  [& `
    . X* i8 O& \! X/ ^hibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。
    ; D- u3 A/ x6 [$ o/ T
    / x+ B, o- c/ M! o$ Y 0 W4 m: o& L" O7 u+ ~6 `: k& \

    5 `9 K! f% e4 Y对一级缓存中的session事务进行数据的预存取,数据在各个session的上下文中存在(单例),当session关闭时,就是session.close( ),整个所有session范围内的数据全部清空;二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二级缓存只有一个区域 ,画个图比较容易理解。
    # D9 y& y8 n5 S/ v, X
      T) i! k$ N% T/ I- V6 J5 C+ W$ ? - c# z0 j7 e! J6 @
    - |: d6 u6 X0 l; _% E! Y: F
    | 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|" @* N- [# T% v
    ! ?6 L0 l4 s! ?$ U. u
    | | | |
    ; ~, Y5 J) L; _* ^0 B$ d! R) N' \% ~. F7 C  S' \4 Q* m+ ]
    | | | |
    $ ~! K; E  }8 X% ^/ c
    4 A# L' M5 ]$ N5 R4 ?8 l8 b—————————————————————————————————) y9 u& k5 b$ h+ d

    * t( U7 {6 h1 w7 N$ z$ f' FsessionFactroy级别的二级缓存
    5 T3 R! s& i5 p5 y, y6 a" z6 ^; q  @/ s  {+ f
    ——————————————————————————————————————-
    0 e( E0 _' k1 X* j# U4 J4 y3 ?' g) F) |
    |7 r$ M, y, M) s5 x" b+ p7 H
    ) ]+ D# L: G$ Y; }8 B0 ^
    |5 U6 h# h' M, ], `) i6 D& Q

    1 {7 E7 `7 |0 p) Z% i3 j' c0 w|
    / N% B: x2 V5 a1 m) b, T# Y( f
    ! E1 c% ?: c! i: ?/ N! X# B% N- n+ |——————————————————————————————————————
    - _& n( Z) `0 v- g# t
    ) m, ~0 y& W$ x* s' }- @DB* m/ i9 l. Y% C

    ; \% y0 l0 O9 q2 `: Q—————————————————————————————————————–# s1 L$ U7 h1 u- \) N

    3 `' V% l6 D- `9 d' x
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    16#
    发表于 2014-12-03 12:48:12 |只看该作者
    Spring6 ]# b( [, ]# \
    • 是什么?
      : s, ]! m( o9 N+ q3 f
      ' c( N4 m0 q" H: z9 B9 B

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


    : S' G- g0 M) ], b+ v. J. X$ G
    • 有什么?
      : `( n/ F2 l2 h/ Z7 g

      2 g$ M2 A0 t8 I; [- |2 k
    , _# e: X' j# `+ P  ?' @; t1 ^; ?

    每个包的功能:

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

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

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

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

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

    AOP :面向切面编成

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


    . @; p, P8 J3 Z/ J5 o% d  p0 Q
    • 能干什么?2 g* G1 u+ j$ `- x6 B

      - y5 O3 k) z$ v9 z

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

    5 m' y! o1 N, b6 Z
    • 怎么用?
      ! I. K! F5 p# X# `

      . b# E$ ~  P7 d& q- g% b
      • 搭建web工程,引入spring的jar包# p4 e$ `" `4 c9 F
      • 在web.xml中添加如下配置) t4 F7 v6 ~7 C! C/ a) T5 ]& c( p

        ; o1 `6 L$ F$ @% L, ~1 L- @& S

      4 D8 [9 O6 z& j% S$ F# r2 d0 @% V2 H8 r
      ; }2 v" R: T, @

                contextConfigLocation3 W6 ^& u/ j' W4 H1 F) j

                classpath*:applicationContext*.xml
    + R/ r' X  L5 O6 |

       
    , ^5 a# @) ^/ z$ D% O

            " L  U* G. g  C% Q

                struts20 W+ [: W3 K. D

                7 g1 l$ N1 A! s' a

                    org.apache.struts2.dispatcher.FilterDispatcher* r7 Q' s+ J! S4 \( X  @9 V$ p

                
    0 v+ I- q* S' E# |" \

            + P: ^1 r0 y. a6 t9 v: C+ p* U) g

            2 }2 k1 Q% o* F( V0 _+ Y9 ~! d4 ]

                struts2
    ( f2 M# u2 u, q

                /*
    ) S/ z- k1 `2 R7 C& s# x


    * p0 G% O6 B! v9 |


    - G, b0 s2 W6 Q0 Z/ o

                7 Q/ l2 D+ Z8 C, N+ b9 k

                    org.springframework.web.context.ContextLoaderListener
    " i4 V7 {  G8 Y- y9 u  _0 K

                
    & X0 B% D2 d4 S6 u, c( A

            

    • 部署
      & B2 M) Q9 v/ |, ^7 z! x
      7 X5 }% f! ]& S; E# O
    6 U! q( b$ \9 z. J& d& ?' v- t0 P) |
    . _3 W6 P& h9 s% A  o
    7 q! x, `4 X. ~7 J7 i
    • 容器和bean( i$ [6 D; k: i& J

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

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

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

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

    4 R: X% Q4 I( K7 J
    • IOC控制反转
      ) i: B  K0 ?$ @; ~6 M- D5 H- [3 m* M0 m& S) Y# B9 k" S

      ' v) ~" M' B  `. M" k. i* B& W
      ( ^) Q3 c% j& e5 n, }5 M
      从前的应用程序想要得到A的实例他会直接主动的去拿,当用了sping后,应用程序由主动的去取变成被动的等待,由spring来控制应用程序所需要的对象
      6 Q! U2 P) R$ Z5 C- u! w
      • IOC的优点
        : K  c/ s7 {) D8 ~1 G9 d1 y" A( H
      1.可以通过IOC来获得实例
      2.可以通过DI来获取注入的资源
      • 配置IOC的原则( E3 `  P$ I6 ?# m
        • 一定是可变的资源才采用依赖注入
        • 一定是层间的接口或者是模块之间的相互调用才采用依赖注入2 D. e* t- v' q' x- N' @$ R
    6 @$ ?) ^( a* L) c$ _
    • DI依赖注入& d. v* _0 c3 t" _% b- `. d

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

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

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

    例如:

    在配置文件中

    : A& I0 v& V# C0 a) c, @7 G
    7 e) z% G3 G. o

    ) y: w( s: d8 q$ E, s2 s

    在应用程序中

    Public DBDAO dao ;

    Public void setDao(DBDAO dao){

    This.dao = dao;

    }

    3.构造器注入


    2 P: R. G4 G& ~( f# ~. B# ^- q/ U

    4.ref 表示参照其它的bean

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

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

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

    6.lookup注入

    7.singleton

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

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

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

    8.DI的优点:

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

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


    9 ^- O7 P0 y7 R  {
    • Aop面向切面编程" B0 g0 g- _0 o" Z' U0 K5 ~+ D

      ! y" E! Q  z! b( y' @

    1.AOP面向切面编程 一些较好的模式或者是示例—-范式
    # n% O0 n- o0 {4 W7 I# D

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

    2.AOP的思想: 主动—->被动(追加功能)
    / C# T% x; ]7 C2 I3 e- P  M

    3.AOP 的概念, |0 x# l8 D5 H+ |

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

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

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

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

    5.引入 :扩展的功能

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

    7.aop代理 :实现机制

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

    4.AOP的事件机制
    " \' s/ U# g/ ?# g9 Q# f7 d# U9 F  X

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

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

    3.找到切入点

    4.确定连接点

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

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

    2 z+ }" C& h1 Q. Q7 \1 I6 f# q" t

    - X4 R. q! @) f/ x3 J/ r/ f
    ( h* F- v5 X4 \& N  U2 y0 F* Y+ v$ X8 z8 Q6 @; H% L- X
    + A# o7 a1 M0 F3 Q3 V5 U/ O6 j

    : d8 a9 i) A7 ?* ~. y8 W  p$ B- _$ P9 Y, ~9 W# j: D# C) P6 `" X

    5. AspectJ$ t3 U! l$ n' u* k6 }; Q

    5.1.在xml中配置比较烦琐
    ( Q2 ^0 ^; T. h8 [9 _, ?

    所有的入口必须从一个代理(ProxyFactoryBean)开始
    + d- U% K% O, D$ t/ S

    ; w1 y: J- u. v8 Q% \
    + o8 S& x' g" ~3 W6 H, m2 J4 @* n" b

             
    + j& j# W5 `! m6 u1 X6 r1 w' h1 C2 H! o& L
      _! L) B+ L! G0 {
             1 p5 {6 Q! Z$ L/ O+ V

            8 C$ p7 u% o) u! P/ R. M

            


    ; ^8 a  h4 N/ A: z% ^1 \5 V  W" I# ~expression=“execution(* com.javakc.aop.MyTarget.t*())”/>
    ! x# ^9 `) ^  y& r  X+ I$ G1 q

            
    8 o) a. ]+ n: `/ @" H# @/ U

            7 ?7 C7 D' N8 O8 @. ]# M2 U9 s

       
    ) l& ~, `7 X! |8 b


      {0 Q/ `" R/ A3 M5 p
    3 U& l5 W( g) }# x

    5.3.使用注解的方法相对简单4 R' P; T/ k, f$ I' K% ?$ o: S

    @AspectJ的基本语法
    # s0 W- J$ g! t

    1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面
    5 i3 ]0 [& N0 {, u: p4 F6 x1 P/ p: H

    直接在类上定义@Aspect
    3 K! O0 i8 K; z

    2.@Pointcut声明切入点6 t4 K5 v3 q/ n! q0 i4 j

    2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字: w" X) y  Y2 j* L# S' D+ r0 r

    2.2、可以使用匿名的pointcut
    6 p0 a' ^# W) v6 i  s, N9 G5 O& ?

    2.3、执行切点的几种方法6 E) g. p! ~" k+ A' c

    2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法
    & ~: Q. ^( H) ^5 P

    2.3.2 within 指定到包,不能指定到类' f8 y: a5 g! b9 j/ H' S1 D

    within(”com.javakc.spring..*”)- G  M5 E3 t- H- r! S; }* o

    2.3.3 this 指定到实现接口的所有的实现类
    ( w8 ?8 a8 o9 U9 p+ D! m. S

    2.3.4 target 指定具体的实现类5 `3 |1 N! Q, s! i* \

    5.4.advice的五种类型的示例8 \5 y  P- l2 U' w% i' v

        客户端必须从接口走才能得到监控,实现想要追加的功能; n$ R1 o1 D7 R: v' C- N

    5.4.1.@AfterReturning(pointcut=”” returning=”retVal”): L! a9 O" g1 `; @" t4 v

    追加的方法的参数名字一定要与retrning的名字相同; U2 B$ w$ x- {( z" X5 U; T% z& ~% `

    在注解@AfterReturning中必须加上pointcut和returning两个参数% r4 U; v3 {  D3 s

    pointcut指所要监控的目标对象的方法# e" i5 x# }4 Q  G& u; E& o

    得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配; z- q" b! H! B/ ?- W" i

    完成追加的功能& p# ^- P* I" r

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用4 V6 O7 H8 Q$ m4 B2 F; B

    (1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)
    $ l7 C* L8 r$ k; J% X4 ]4 u

    (2).
    5 m/ L; X  {9 n+ j0 T+ h+ Z$ M

         2.直接引用匿名的pointcut8 b) G& ~+ s8 F- M  \7 R8 k, w

         (1).@AfterReturning(“execution(
    % x# A1 W  q6 k1 S- {2 H! c

    * com.javakc.spring.schemaaop.Api.test4())”)
    / ]! z% ~. o$ u$ O' `& @9 b

         (2).@AfterReturning(pointcut=0 x. Y0 B6 G6 R4 O! \! c2 y. [

    “com.javakc.spring.schemaaop.TestPointcut.t4() &&! A9 ?3 I. F  k8 }/ z6 ?% m

    args(str)”, returning=”retVal”)
    : f1 d. y; n: v0 w) I8 H

    @AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”): J+ x6 }( n8 i0 c9 J! g5 q5 g

    public void testAfterReturning(String str,Object retVal){
    , }0 z. M+ l- O8 A/ Y' {3 C

        System.out.println(“afterReturning1=>”+retVal+”=>”+str);/ R4 R; @3 M: W' G$ v! y: H

        }
    1 ], ]  a/ G7 A  _

    5.4.2.@Aronud( S, X, p5 [) y; R) L4 M3 \6 h% O

         注解@Around环绕追加功能;* a# v; [1 Z7 K+ l. H2 d

         在执行目标对象的方法的前、后追加功能;% U+ j$ ], t. R

         必须有参数;第一个参数的类型必须为ProceedingJoinPoint;% D0 f5 X! |2 _4 q" y

         通过ProceedingJoinPoint的实例的proceed来调用所监控的1 x+ ~6 f4 O2 s& p& B6 x3 W- z

    目标对象的方法0 x; K" R7 @6 c# ]

         1 定义一个pointcut,通过方法名来作为pointcut的名称来引用5 T0 \( N5 T$ I

         (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    ! L4 j2 G: M( m  V$ O5 R! N  I

         (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()' X6 B0 t# l% u6 `% G' S0 k/ D

    && args(str)”)
    ! w% `; `1 Y1 H

    2.直接引用匿名的pointcut
    5 o. r- \: W" b" {  P

         (1).@Around(“execution(% z! x2 m" u- V5 X

    * com.javakc.spring.schemaaop.Api.test1())”)( I+ t2 [$ D2 Z

         (2).@Around(“execution(
    ' B4 a8 w! a9 q) e/ H* M2 M

    * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)! \0 ]5 q2 C, ?1 A# r. D! V; Q6 S

    // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    8 L1 r; |5 M* Y( S; h8 G. m

         @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    , [2 o- q6 ]% k9 ?$ J) T

    public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{- N% w1 c' N* x0 s

        System.out.println(“around1==========before1pointcut==>”+str)
    # A8 Z3 |8 ~) l( Q

            Object obj = prj.proceed();
    ! c# U. k" I1 x" ^; j* \* G8 K

            System.out.println(“around1==========after1pointcut==>”+str);" L9 i$ ~6 U! L; ]1 o" ]% P

        }  \6 l. @, }& J$ `* z4 a% N

    5.4.3.@Before8 R8 b2 G' q$ [% j0 k

    注解@Before在执行目标对象的方法前追加相应的功能
      q+ ?* \7 b$ ?

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
      g: P- V6 l, `2 v( d6 G

    (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)+ c( R2 c& F; M3 b! @2 Y& b

    (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    / X: Q6 |( w  I

    注意args后的名称与参数名相同
    0 T+ v6 T" @. k

    2.直接引用匿名的pointcut
    ; }$ b: Y" w2 M' j* q- Z( i

    (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)" y2 l3 S9 O# t; t( n: D( u5 O

    (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)& Q/ ^  {3 F. y/ h( W, @- K

    注意args后的名称与参数名相同. G3 ]( Z6 N" W2 ~) C

    // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)$ U% M6 \2 u  C! g" ^3 ~5 J! ]

    @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    ' \: S! F) K3 }4 H8 [; J. D

    public void testBeforeParam(String str){
    ! L, t4 G: q& c$ X

        System.out.println(“before1=param=>”+str);
    " a/ O5 X$ A6 a$ Z3 o0 {- `- c

    }
    ; y0 r1 r$ s! S! d7 v2 Q


    . p5 k4 u$ l1 {

    5.4.4.@After: ?& \& J9 U0 \+ i; Y

    注解@After在执行目标对象的方法后追加相应的功能) u0 f. U: S* F* `

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用2 u: u: M& T; R  J

         (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    : E; u. n" \/ a1 A+ p  N

         2.直接引用匿名的pointcut4 L: Z* F. n5 L8 S% l) R

         (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)8 @' m4 J( |# T6 u* J' K1 T7 [8 Y

    @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
      D) g9 E& s: w

        public void testAfter(){
    . @6 z4 X& M& t

        System.out.println(“after1== >pointcut”);9 m0 ?- x6 j9 j

        }( P8 I' Q0 A3 ]: P

    5.4.5.@AfterThorwing! G5 l/ {1 {; V# x, D% w

    + v  O  {8 [( X! D; Q" X' i
    # I% B& O" z7 Q; t% ~
    • 描述一下spring中BeanFactory和ApplicationContext的差别1 u1 P; s2 J+ C  r, S3 Z  n
      $ g. E- Y- d3 x+ P4 t

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

    ! V. ^2 X; _" O' G
    • 谈谈spring对DAO的支持
      4 J' n( I7 A" L# e; D: v
      ; k3 a' d' I0 g

    Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。1 C5 d, P0 {) Z- G1 M

    简化 DAO 组件的开发。
    3 S# A1 m- f& u; |0 ^$ ?7 R7 ASpring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。
    9 G" j! z/ L& E, p

    IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。
    0 @' }+ ~5 N: A1 C+ V

    面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。4 a+ l4 R1 q3 f0 M- Q# T( q- s# O

    方便的事务管理: Spring的声明式事务管理力度是方法级。5 I' n2 U" o% V( ]; U

    异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。
    + c: p$ P( j* l. L  {9 B* F

    5 G% K: k* L1 O% c

    . [" w& t) B! j' v  q% d5 ]
    • 谈谈spring对hibernate的支持# P* D5 ~7 G$ q4 I

      3 I( U- {) G- ]

    在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。- f! N; ?; j- m! R/ l/ m; l

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

    1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:
    ) ~. E6 e" E: ]' |

    * g' W4 Y7 s* @3 j. ]0 c; E

            class=“org.apache.commons.dbcp.BasicDataSource”>
    3 {* [. \2 o3 |0 D

            7 B) y% N( s/ w# N  d7 E4 o, y

                oracle.jdbc.driver.OracleDriver  V- u  Y5 ~/ e% W- B

            
    " t) ]( d6 r$ z7 W

            
    : N( u; a$ B& C1 x* j  Q

                jdbcracle:thinlocalhost:1521rcl# O# M/ q+ [4 C

            
    $ l% N, u6 f$ U4 \2 X8 {7 Z8 N( z. h

            * V# y; i" O" s6 B

                javakc2  V& q2 O4 }9 O

            
    + `8 U6 E5 Y9 {2 l5 ]

            , F  w5 H' T9 v! Y! Y, c9 n

                javakc2( g- _8 a$ f# F1 n

            8 \# @' V, I3 _6 W( f+ \

       
    5 U9 t. c# Y4 g/ O2 O

    , Q( C5 [2 A( o6 @

       

            class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>* u$ M, b1 q: _

            
    % r0 V+ Z) S0 ?* ~" x- C4 A( y* ?

            
    . V/ x: E& G3 R  u2 K# O! g

                
    - X. H8 B% W) S, o5 ~" v, p

                    com/javakc/spring/h3/UserModel.hbm.xml
    - ^$ V  q6 J/ C2 T, e

                  Y2 e- U, h! R9 ~

            
    ! S  q7 ]9 |9 h1 y+ {

            
      N. t5 M! s  E) L/ x

                
    & A" a- R( M* a7 k2 i: G

                    hibernate.dialect=org.hibernate.dialect.OracleDialect6 H% }% Z8 o- x) `/ ?! Y

                
    4 ~5 L. i& `5 r- \4 R4 }

            
    2 i. G7 ~# W1 M' }$ p3 \/ P

       
    " J. ]$ ^, d' T  i* ~5 v

       
    ) Y2 b8 r. s6 Y/ }1 Q' ^3 b

            
    5 |: o' j( O4 i% K, M8 J

        6 t. R6 K  y" }, o

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

       

            class=“org.springframework.jndi.JndiObjectFactoryBean”>
    0 J+ i! o. Y: y% y  a! e, i

            ( {: A2 a1 B' P6 ^

                java:comp/env/jdbc/myds
    3 {5 f3 r# \6 m$ X

            4 h" t! Y  `) e. B3 O' N

       

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

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

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

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

        ) V7 V, j; d  h4 x' z0 P8 D$ O

            ! j3 t/ R7 `2 z- P  P9 \

        $ D, {7 g0 o: K% d% i


    . i5 L  }: R% m  G8 A  ^% @  V

        1 z6 c8 Z! B  D# s; d  _( B

            
    , I$ K0 [7 e; s# p: Z! f

                1 ~$ I+ ^7 {9 h; A+ @* U, K

            
    5 \2 X3 x; K- `- l3 V

        % H! k2 r5 s2 S/ K' H. M+ h4 q0 Q


    ! V8 T+ [# `/ U9 O2 z7 L- s

        7 y# ~; M: n8 O6 c& G' H8 Y

            
    8 `/ \$ p2 Q: A, |* ]3 x

            
      G+ y( p8 @8 p% P* ?5 R

       
    % r2 @# Z% m; o

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

    ; q& s0 d) ~3 b/ ?2 M
    Spring2.0之前事务的写法
    1 b: _* y* c! I4 A) F

    7 n, H+ w3 E  }3 a
    * e% A, E; Y9 B0 ~8 b8 g8 I1 h        class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”0 T" U6 q4 ?4 `3 \/ r* d0 U
    3 f8 _# v+ ^4 N! ^
            abstract=”true”>' ]: q- Z: j6 ?  C6 f

    6 a' F: Q; B; [0 C! H0 |" S. _& ]7 D% Z5 T$ q# l; K

      ~" p- Z5 J& o' r, x9 [4 T
    0 _2 k) H: A: ?' ?                PROPAGATION_REQUIRED,readOnly3 D' m: p0 c$ d& v7 q
    $ T0 r  F4 v+ B
                    PROPAGATION_REQUIRED
    3 O4 ?4 g$ z: L; M! G# L* Q

      R1 q( o; `0 A7 ?: R+ V  Y3 W4 ]
    ! t2 l0 Q" m; f. w! t1 Q9 q/ Q
    % I* X' B! J, [
    3 W* z' v+ I7 ?8 `1 P% P* g3 j% ?$ o

    5 y, M1 R1 f) ^) j/ i
    , \3 p' P# F4 }/ E1 q: L2 L
    • 谈谈Spring对事务的支持
      * [9 x2 G; X4 h/ o$ A

      : a0 Y1 q9 d( G# w

    1 W; [7 q% `; b: K( G
    1、声明式事务管理:

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

    2.做法:

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

    2.2

    2.3 注入数据源

    ; O6 }& @( S/ O. x
    4 l, o: F9 X$ W2 _2 Z
    . {9 r% `1 v4 P4 h4 ~* l
    , E, X, @1 I: L* z3 H; o
    . e) l) e% ^& E+ A+ H. n  a, W

    * x  r6 b5 P, i1 H9 N; w8 {

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


    ; Z0 p7 \3 J! G! x- ?' Q. o. ?2 D. D' ?7 _% N( ]2 I) T
    . H8 B/ {- F  J* w

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

    8 f% \4 R& W' Q* z9 `3 ]

    3 L" V; W' ], i1 _, k+ h( |# |3 |, I6 p+ a
    - V1 }% B  _& U1 B9 [# f

    ) f. x9 ^. X/ v# f5 h1 B! ?; L+ E1 Y

    2.6 定义切入点

    : R+ U' Z" n# L8 G) ?2 ]

    , s( P. A. ]- m: s# j
    # P8 h$ f' C1 h: o
    ; E) b! ]) d& Y2 Y9 A$ `
    % ^# i9 u! o/ ~5 K2 D: l: K9 ^# c. ^

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

    1.注解@Transcational

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

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

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

    7 ^5 H- x& i! q: x. @( j
    ! t, {% B9 H5 s% z7 G, A

    如何在Spring中使用Hibernate的事务:
    9 k. {, X" l+ j. t: |+ b


    4 {5 S7 f5 a  k7 W( n8 L3 u


    $ S& }9 Z: q6 B: i( C


    * d( B  b; Q  M. d. C, }+ T

    如何在Spring中使用JTA的事务:, I0 S- A1 c, ~, i0 O

    & Z7 Z  z* C* m$ d+ Y, a# D: {
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    17#
    发表于 2014-12-03 12:48:32 |只看该作者
    事务! F. F- _" i6 u; `9 j" U
    ACID
    3 Y: g8 c' z* k2 t4 n# O(1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失败
    " U# ^& ]; S2 ^2 W+ u! ~; I) k" h& Y, N
    (2)一致性 :操作的前后满足同样的规则,保持平衡。
    * J+ B6 e2 y, X1 ]: a; w, O, p. p! C2 z4 Z7 V% w% W/ [) `
    (3)隔离性 :在事务运行的过程中。事务内的数据对外的可见性和可操作性(必需由数据库的支持)
    0 t( m# @9 f* V6 y1 p: z5 e  B# ~1 }- H
    (4)稳定性 :保证数据在事务的操作的过程中不会遭到破坏,而且是永久性存储的
    . v/ \9 M2 b$ u6 R/ i- n8 K4 t7 \) F

    " s3 [3 F7 ^+ V$ `5 |8 O( N
    " j9 P; L# k8 E/ y' Y事务模型% {. W, A9 P4 Q
    (1)经典事务模型又叫平面事务模型(JDBC) 事务不允许嵌套
    : R% S, M  I5 Y8 O; j8 p3 c: y  @9 k; Y: m1 N# a& u3 M
    (2)嵌套事务模型
    # m3 @, I* j/ |5 y# Z1 y+ ^2 M% Y0 ~9 M) d) g) }
    ! {- |) Y  Y+ T) y  T

    # E0 K) E' V) y0 B) |事务的两种方式" X, O+ c% Q3 K- R5 l" B
    (1)声明式7 }8 J. X+ i. _+ O
    3 @% A8 |+ Y) g- j" t3 |
    在配置文件中设置以下6项
      x/ ]) Q, y$ D# Z
    : u1 K: E. u: g1 @5 p4 V(1).required. o2 i3 ]/ V* ~9 h

    : z* O8 y: e6 J5 j. f如果客户端没有事务 在bean中新起一个事务8 }2 p. @! o% B6 g
    / K) G( G2 ~4 i5 n  b) B: V% X- c
    如果客户端有事务bean 中就加进去
    $ h% r  V" S1 V5 L  S, a. z1 x* h5 O5 Z4 r: k4 E
    (2)、 requiresNew
      l# f* i& h5 h8 d- r# l% R/ Z8 e" ?: o
    不管客户端有没有事务服务器段都新起一个事务) r6 |' ]: e1 }# h0 M. G4 o
    , [7 D" e3 Z: M2 V1 X* l
    如果客户端有事务就将事务挂起) O# }, A* T  }: W

    + N3 s% v; E) c6 r; g(3)、supports
    1 U3 N$ B$ Y7 Y1 s3 A1 u, @: {
    ! [( W& s+ c/ M; b/ k1 `如果客户端没有事务服务端也没有事务& U4 R. Z$ c3 p3 H& G

    6 T4 C2 _. y) a; {7 \, m如果客户端有事务服务端就加一个事务
    & v1 B7 d  ~  L! w0 ~* j6 L
    2 I, ?2 r# ?* {3 k  c( c5 `/ N(4)、mandatcry
    6 n: F# d5 ^5 U* n3 X9 L( W
    9 t0 M' g# [0 J3 |' L) d如果客户端没有事务服务端就会报错
    % t# X6 g2 E) c, o( W) k% j9 Z2 r
    如果客户端有事务服务端就加事务. y7 x' |& l* v  B% W
    8 g1 L/ `3 f6 u# b
    (5)、notSupported
    & K, a% S, k  a+ E* C# |8 s/ Q
    不管客户端有没有事务服务端都没有事务
    $ p) p; J; X9 L  K0 M) v) K9 d, b6 M: G# B$ ~- U; L3 u: B- E' D3 F
    如果客户端有事务服务端就挂起
    ; `2 D- h2 S9 A4 {/ y/ K
    4 ^  @2 _2 A" p1 s. X' H(6)、never& r: r' }( {, G) g& d6 c( n
    9 U- {! t& I. f4 [$ H
    不管客户端有没有事务服务端都没有事务
    . s6 R2 S5 @1 X+ ?- d7 m, |7 {7 L! [+ O5 x. w% c: |+ F& s
    如果客户端有事务就报错
    $ n3 k1 q9 C6 m# k' p4 y
    8 E; O2 V* k# H( [(2)编程式事务
    6 D! }1 o, M; y/ x& t
    " d# @2 j# I+ J0 U7 GJavax.transaction.UserTranscation
    9 v9 u, w$ A( c3 B4 f/ K0 R( D9 K) [& U
    JTA 事务可以精确到事务的开始和结束
    " M1 e# ~- w, x& u9 _/ }: R( z1 @4 [, m) U) r* S

    1 F; y, p9 z# q: [; C+ V* y3 r- C( a& |( T1 r' d
    事务的隔离性% W3 v' o3 b& q2 F
    Read-uncommited
    * H8 A6 ?7 t/ {# ]0 @
    6 S  Y4 R4 Q0 ]2 F) \' ~1 f读取未提交的数据(基本上没有锁)脏读,存在不当读取的问题。
    ' T! H* N( X9 V4 b
    2 t6 t" E: a- aRead-commited
    2 X  s) i/ E! d5 `0 h- k3 Z4 C
    % Y1 M- u: i0 i. x) Q- m- U& p读取已提交的数据(行级锁)1 c1 {4 `, R  y  q, a3 M# O5 |  L
    / ?" v2 C2 [( U9 ~1 ~" \
    无法读取已经写入,但没有被提交的数据。
    5 s: @  }: D3 V- j
    . d7 J, V" `; |Repeatable_read
    / \" ]. W( k* m% f$ h
      N8 r; \* F2 `! S8 i6 m/ C) `读取的数据不允许修改或删除+ P3 h1 P1 ~  V4 M$ D1 ?' G4 z

    7 [3 p  k9 j* b1 L4 |+ w$ n不可重复读(行级锁+不允许修改/删除)
      z& D1 c1 o& P5 O9 r4 d. A/ |9 w: z6 m/ `* a' k/ V4 p, S
    Serializable. q; @/ J: Z+ G5 R4 I3 ?# v  q

    + @( c- h0 v0 Y3 Z幻影读(表级锁)
    1 E3 t& \. ]  l# L% ~5 _8 h0 e9 _
    3 ?" {% A/ X: ^! b/ T% t
    * e# c3 |; d8 t& Q, q; `" R
    struts4 g$ I4 I- p0 z
    开发流程
    & I  ]5 p& R; e3 |' U- E* y! u$ P- K. Y+ V1 i& |
    1、创建表单
    6 D7 B* n' e5 X4 \7 ]: P( n5 z- B6 u) E
    2、从表单中获得输入
    9 T. N4 K5 I! e6 S& `: ]8 s5 Y9 `# c) q- p1 y1 \3 Q# \5 C
    3、处理输入(业务逻辑)6 n. U, ?% A/ d, c' E
    ! v) g6 |! @. i
    4、根据动态输入改变输入流
    8 t6 ]) D* K/ a' {: x
    1 D# n# C8 u, S$ E$ _# n; T要完成上述四步,我们需要创建) Y5 A7 q( M: q& G! e, ?  k/ d* p
    . f- n6 L# h% H7 D2 [  |; a
    1、一个ActionForm8 s8 Y4 p3 m1 ^5 u$ r& o% C  @

    0 @' @: L' }6 s, [2、一个action
    $ _7 r8 {. }0 Z' w* c2 q
    . @" b. H0 _* j" k/ S1 o" Q2 W3、一个配置文件struts-config.xml9 |) n1 I2 K' v+ ]% B
    4 {* c0 P  \, j. A# C$ K! {: }
    4、创建页面
    7 A* z" j1 S0 M5 X/ i7 [7 Q* L
    " J+ a4 Y( {0 ]3 C创建ActionForm& k/ [8 K, ^& W, R& {/ d

      O7 T! h. D: j) X' |: x+ T! q1、写一个类继承ActionForm) n1 m' w. f2 X* N. O' g1 a" [
    7 S; h& i2 _/ }* P$ o
    2、私有的属性
    7 {5 l$ R4 ^3 Z$ @# F
    ; j# j9 M% C$ d) W3、相应的get、set方法# {8 {1 a& B4 {/ Q: w% Q$ Z

    2 L7 m2 y/ a" e! K# }4、重写tostring、equals、hashcode三个方法
    6 O* y' d' A6 i2 {& q3 s% N1 y! W5 Y
    创建action
    ( ]) ^$ I7 Z1 c/ z
    & T$ T0 G: Y  `/ C1、写一个类继承Action3 D7 A# y/ a4 l) z9 F
    6 z1 l& D, G* `! [1 T. d
    2、实现一个公有的方法(回调方法)7 d' @' x" `& s: N- {3 P0 A; [+ B0 L
    ! J6 X( q1 _$ u4 Y; v, g3 C1 z
    public ActionForward execute(ActionMapping mapping,- E3 u. y" Z: A$ b3 n
    9 @2 K# Z7 r; r- H
    ActionForm form,
    " L5 H' o0 [1 S' e' `
    ) {8 r. R) j4 ?& ]6 GHttpServletRequest request,; W/ \" U. Z8 H
    : n2 V7 l9 p3 D- b# K
    HttpServletResponse response)4 W# V( R5 u8 R9 A4 _

      m+ U5 ]* l+ S- l; ~6 l& [{
    % ?& l  [: @8 F; L. V6 q( n8 F- j9 {1 f: A
    //1.收集参数
    $ J* o2 d4 @3 x; Z# R9 d
    1 f. H1 M2 b# t& x* l7 \MyActionForm myForm = (MyActionForm)form;& q" \7 x. X) V6 L$ W' @! Z9 j
    & N- D: R0 T# l6 d# u7 Q
    //2.组织参数8 z3 t' j6 Q; @! y4 P+ x) ~0 X. V
    + F# |/ H" X( K6 t0 ?

    6 R+ d) l. ^6 r. p5 }7 L. H' B
    0 k/ C2 U- O9 K: B//3.调用逻辑层5 E% |  E" H; `& a: Z

    % w/ `8 H. T. k0 E' W/ aboolean flag = true;
    8 H  j4 E& A" H9 f" C4 B* N$ o5 s2 w
    ) `& r' ~' h+ i; x: W1 W2 B( i//4.根据返回值来跳转到相应的页面6 N6 O+ L, O1 y- W

    7 \7 K& L" J; A1 \+ cActionForward af = new ActionForward();# ]/ Z! O! @( ~* g
      p2 `5 D, U" R2 [" @
    if(flag){) v( g7 ~- J7 a* }- u& P1 H, O' v% Q
    ( j1 z6 U; K% M, M& Q
    af = mapping.findForward(“1″);
    . X, i6 K  _6 f
    ! \; G9 R) \* j& S9 O& n}else{! L+ _/ g& E4 r. ^+ y# V& a
    $ c6 j! O/ N  Q$ Y
    af = mapping.findForward(“2″);5 s5 Q, i2 w8 i4 N+ u. V

    ( |* t8 B1 G8 ^. f# h! p}
    # Z5 u: T  R. t" s: Q& ]
    5 G$ J' i0 z6 e1 E! kreturn af;
    3 k3 B' m% ^5 U2 t+ j- Q! H8 F3 c
    ; S6 G/ _9 l: ?/ N! V}
      }# K, e: b! g) u" ~+ v3 `, `1 D3 n$ S
    配置struts-config.xml文件% S3 a/ T1 J( J0 ?* D0 j
    8 _" V0 ^5 x8 O+ H8 V; l) i
    1.<form-beans>- ]; [4 s, E) R9 Y0 z* R
    - B% j# [8 h' G0 A* B
    <form-bean name=”myActionForm” type=”全路径.MyActionForm”/>
    + [2 e  Z  K; i  o! X( b* m7 N- E! W: u/ U
    <form-bean />8 D9 R) Y: P& a+ `& S5 x

    % \9 T* C; d/ Z( M0 X3 u# j</form-beans>: @& j* `% u* [7 n

    . M% R$ G: I3 [' }' |, m2.<action-mappings>
    ' i* w# n, A+ w5 ^. a& K3 x# C0 C" Y
    <action path=”/sll”- y; g; ~# Y1 b8 L  B/ {

    ( n# k! p7 s, v, j5 Bname=”myActionForm”' L$ j' f& Q" Q

    9 a/ R5 Z4 j; H2 H1 {7 o: Dtype=”全路径.MyAction”5 f* B/ u6 B1 Q/ g
    7 Y" ]3 r  c& p9 L
    scope=”session”) |0 b) P: K/ w# E; |/ [) ^; x
    4 t9 F' p% t4 U! W' [3 M0 t
    input=”错误返回的页面”>" f: n: [! S1 Z3 `5 N

    % P  O; ?+ C& U% l9 x) k<forward name=”1″ path=”/1.jsp”>
    - b3 w! {: s, D4 N4 ~& B
    ' I4 F; i/ N" ^4 y6 o. e4 ~4 H<forward name=”2″ path=”/2.jsp”>. d! f' B  O7 M- H+ u* i+ D
    6 y7 _: U" N/ J( F7 g; M. A
    </action>7 D# R7 g9 J; o* \7 r& A! p4 q
    - H+ f, e6 r9 D, `: `2 F; r$ o  n" C
    </action-mappings>
    9 F# _: o, l6 w& X- g( G  I
    : d; S+ U7 _2 ^6 U2 _步骤:
    % p% h0 [! l2 ~: Z; M8 F9 H* l1 H4 t, U
    1.创建一个空的web应用
    / }" b+ ]5 A7 [* T$ E$ W1 {
    6 p; F$ i8 d" S4 A' ?9 R5 Z2.将struts的包放到lib文件夹下8 p( Q' }6 d* N) x, T
    # `9 R: X. u, X
    3.将.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目录下
    / V  K3 m& A1 V2 i4 d* L* g: [, ]9 e  v" M
    4.配置struts-config.xml文件和web.xml文件
    . o, }" E8 V; G( Z# r( q9 F" Q9 E2 U7 D, F7 [
    5.在页面引入tag文件uri
    / I( p" X' v, [+ d) J3 v* x) j$ t( ^; i% N3 _. X/ }
    STRUTS运行机制
    9 g; z. {+ |$ N2 O( c) o% w7 W
    ) [) d: c0 E1 f5 L: i2 y% }1、界面点击产生请求6 D, N& H: k: Q' E4 L* K

    ( q. ~# X3 j* Q. M: B2、容器接到请求
    6 b4 d2 A! W- J- x1 s- C, L2 E, _$ c/ o2 F( \" e! t6 _
    3、匹配web.xml文件中的*.do来调用ActionServlet
    3 B0 ^& X) y/ m
    / C) Z" e9 \% C  |4 w3 f4、ActionServlet的处理
    " N9 G+ O% a. W9 M4 n4 ?
    3 s' V# u# _; F4.1 读struts-congfig.xml文件形成ActionMapping
    $ c. t, J/ g6 `$ V8 f; S& m9 v
    # y) M. m$ d1 q3 k) U0 T# Y4.2 通过path 来匹配Action类,通过Action的name属性来匹配ActionForm类
    # d, M8 e7 T$ u/ ~. X1 r7 m% P8 K$ t/ B0 z& z0 K/ B
    4.3 通过反射机制来给Form添数据
      R! |* C/ f' ]% d  q" s; C7 E
    - h  z+ a" I- d8 j; P" Y4.4 由ActionServlet转调Action的execute方法" F0 k, N) ]( n0 x
    0 R* C: d9 t$ a! E0 s2 O; q
    4.5 得到execute方法的返回值,跳转页面, j' K' ^5 a# i0 y& _
    / b+ g& ^# ?5 ]" g# U4 J% a
    4.5.1 RequestDispatcher5 w$ J/ B6 ?6 C' d9 ~$ \

    ! R- a* @- z- ?* R& c4.5.2 response.sendRedirect(“list.jsp”);9 s; _# d+ a9 B3 F3 F

    # E$ c& w" a& s
    & W5 R3 K- x4 Z- w/ A  t  h1 N7 h' l4 h* s% b; _& u7 v
    进入execute方法1 c5 A! u! y/ n, D3 d4 v" B

    / R$ q+ p% C3 m1 收集参数
    3 c1 |3 D" F4 j4 o5 t
    ) }  L7 f, p+ V  S/ E6 l2 组织参数: \+ W  @+ n5 T
      j  ~; `4 V# @9 }
    3 调用,逻辑层
    & k% C7 f; O2 h5 l2 r* n, O" `2 N, j. r4 p% y3 Y1 h
    4 返回值6 n" A! B4 _1 M- {0 {% ^
    # d0 G  {/ `  o
    4.1 选择下一个页面 (ActionForward)
    : n* K4 o6 ^. ^9 u# Y5 p+ ?& H
    4 M: v1 C+ E0 j! R4.2 把值传给下一个页面1 R( X1 s4 P" W6 o  |
    / S8 k- P8 k4 \/ ~: X' c

    5 D6 \' J# c$ l+ P0 _2 _7 G+ v. H8 M0 H3 i5 _  ^+ {: ~1 j7 q
    比较struts和struts2的不同
    8 e% Q( w5 F8 ?4 M" |1 _) u' ^/ h) Y/ C4 j0 o9 ?
    Struts
    : B2 Q' l% ]7 `, J9 Z# w7 c9 ?7 ?/ I- J0 s
    Struts2
    # S  _% m2 e" D8 t# X
    $ |# J8 Y. y; e1 \8 H- W# t2 o组成        五个部分:ActionServlet,ActionMapping,AtcionForward,ActionForm,Action        十个部分:AcionContext,FilterDispatcher,ActionMapper,ActionProxy,Configuration Manager,Action Invocation,Interceptot,Action,Result,Taglib
    5 R0 ?0 ]! F9 Z$ P( n# b* L' furl        .do        .action
      w9 A8 y! |4 l- t分发控制        AtcionServlet        FilterDispatcher
    4 q, b! i2 G1 x& f; ~# ^/ k6 H  }收集参数        利用JavaBean技术,将数据封装到ActionForm的子类中;$ B) ?- y- z$ d$ _$ g3 }- d
    一个Action对应一个ActionForm的子类% j8 m. |( ~2 s0 W3 C0 e

    ; \1 ?! Q1 s7 M; ^; ]3 a使用拦截器将数据封装到值栈中。
    & K+ N- V+ U, }3 \3 q: w使用域模型,一个Action对应多个值栈中的Model
    + e* f6 N8 _7 I0 O' X& H: ^! t/ h1 ?1 x. i! ^0 A
    读取配置文件        ActionMapping        Configuration Manager
    6 g. `2 d* N8 @7 @/ x  s拦截器        无拦截器        执行Action前后有拦截器4 W1 N4 J& `6 A
    返回页面        将字符串封装到AtcionForward,进行跳转页面        Action中直接返回字符串,通过Result跳转页面
    # ^0 N- V, v1 ^' ]) Y页面跳转方式        两种:dispatch,redirect        三种:dispatch,redirect,chain& w4 o! W- z. I& S' A+ W. z8 k
    值栈        无值栈,Action通过在request范围内设置属性,向jsp页面传递数据        有值栈,Action和jsp页面通过值栈传递数据,jsp页面通过OGNL取得值栈中的数据
    - X; u( x7 p3 [' t配置文件        struts-config.xml        struts.xml1 q0 i( J9 k1 }1 y8 j: B- \7 @7 N
    中文问题        不能解决(需要使用filter)        可以解决中文问题:' @- M; d$ r8 V! L: ^
    1、在jsp页面添加Meta;
    & a* x+ F" \; r6 Q, T$ b" i
    2 }4 Z9 C6 N6 x8 ?6 b* y2、修改struts.properties中的设置。
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    18#
    发表于 2014-12-03 12:49:03 |只看该作者
    其他开发工具和技术
    . b; z# ^4 X0 v4 Q5 _2 P8 h" dAnt
    3 E" s; V$ V5 t5 kAnt是基于java的批处理工具
    / x) ?+ A) o: w
    # R/ i$ K) D. l, a6 w- X1 E一、配置ant的运行环境, }* e, ]7 b& V! d: U

    * O/ [- L5 t% [0 I! ^5 |. W" ]1.将ant的bin目录添加到path中
    9 F6 h" X) G$ G6 |1 x1 E8 z8 e4 i( l6 g7 U2 ?
    2.配置JAVA_HOME' q& F9 n8 G0 v5 T- H8 d% c
    , \& X; v$ D. @9 Y9 Y# Q  \6 X
    3.配置ANT_HOME5 W/ Y3 B/ ~% n
    : T6 ]; r) Y$ c/ S6 m) B, x  N% m
    二、配制build.xml文件,该文件放在应用程序的根目录下
    & ?/ W9 x$ h7 i1 t( O% a6 z5 q- ~6 n1 h" H$ |1 l; F1 d' }
    编译java文件' {6 ^1 z% d8 u' T8 F
    ; N" o! o  C8 G! L' N+ H2 S' T
    执行java文件/ y! D  N6 {. m6 u) w- B+ v" M/ l

    : ]  @' R3 E. M- \$ Vcopy0 ]3 g- l8 R4 r" H% a& y- J, d

    . P. P* _( u/ {: ?6 z2 ^! k+ y( o删除
    ' t, y& ]* |7 ?8 `4 z0 b2 }! N0 a$ `
    % X; L5 A# Y! v6 L打jar包/ z) K2 Z' l7 n" s8 ?
    ( l1 p7 g8 {2 p( S- }8 E" X  W+ A9 F( m# P
    根据注解生成配置文件
    : G4 s$ v$ q* b; ~
    ' G8 Y8 l" @/ E- _: [Xdoclet& X8 D! x+ J; U& \# H7 w
    通过注释生成一系列文件的工具(txt、xml、java、html等)
    " j% r: h' `) Y3 H- E; T' G! {$ E! e
    xdoclet本质是摸板技术+字符串的替换
    , p* q  \) M7 X$ v/ r) Z  b# A% v% P
    1.在java文件中写符合要求的注释(将hbm.xml文件的内容搬到java文件中去写)
    + w" M- m# @8 f1 P' f/ r' V7 ^  D2 Q4 o% S5 T) @
    1.1 在类的上面 写与表的对应
    1 o3 Q/ ~: {9 C0 [, L: V
    ! ^4 b" l: o" y7 E1.2 将每一个属性的注释都写到get方法的上面
    ! J# ]; P/ F. U7 \: D/ J/ L' w9 `+ x
    4 T) s8 _# Q: ^2.在ant中引入相应的task来驱动xdoclet  ]' R! s' L. ^2 x. ^
    : s3 U! W$ D& f+ h
    ! b/ |4 r8 G1 |% H, d% H
    + V7 u$ @1 E7 R5 c% K+ k8 D
    log4j日志管理6 N9 W9 h, C$ j# I! `
    1、是什么?
    * y. P7 c( B7 X) {) S9 I) }3 s4 z- U# w' n/ ?7 F3 W
    在开发期间用来测试、对整个日志信息进行管理的工具$ W" r2 L) E# s9 H5 c8 a! S

    % L# r7 J/ r$ ~% G- G2、功能
    $ X, x. E# O1 l* C* a0 j, R# I3 i0 i& K4 d% v
    1.控制输出的目的地5 s7 X1 ^4 a+ B; J% B
    3 L0 Z: V# r5 p! r( H  y
    2. 控制输出的格式
    % y* W3 j! B8 F1 B: Y4 a  C+ q- K7 M, @% }% ~
    3. 控制输出的级别
    8 g$ V+ Q, Y( N  C: q) h; n# ?# p5 _
    3、日志的级别
    ' A3 l$ f# m1 {! L) F4 D) U, M% p/ R
    1. debug 调试
    6 X& u% A! }- G" h9 x+ ]' ^! q* Y! c9 S; _
    2. info 给用户的提示信息
    9 O2 ~& k3 K: P# ^- t4 E+ b2 `) c* q2 ?/ B' C" R
    3. warn 给用户的警告信息
    % P; \6 _2 N' w, o6 s: N* |, G8 D1 D/ k2 H7 K) J# o+ m
    4.error 给程序员用来调试
    4 A% k, Y$ J4 j" z. ]0 e4 E' v% b5 g
    Debug—-〉info—-〉warn——–〉error/ P9 O) c& p3 |0 U

    ! r2 D8 T, l4 q+ `4、配置
      @; Q2 C5 ?8 B8 F
    * a, J$ S% D) d$ B7 h  v1.配置级别% V# T7 ]$ {: h
    ! |4 Y0 i) G1 d4 ~
    2.输入源 (控制台和文件)! W. a+ [1 q8 c. Y& ~- y

    2 i5 o+ B0 K& x  H& L1 g1 P3.可以进行分包控制  V0 r4 u" n% N- z2 }

    : \/ O& M4 a: _/ T* @Log4f.logger.包结构 = 级别5 E! O3 R+ ]8 ~6 H# F' x+ b7 s8 a

    ' B. {! f0 c2 d, K4 J5、使用& t! [+ q1 _$ K. h3 q

      j0 z/ ?6 @% v3 u6 P0 L* zLogger log=Logger.getLogger(Test.class);
    0 }2 H3 U9 ~2 q; U$ b
    # `* `9 J: G1 K4 }5 E3 |8 A1 |    public
    ( m# `( r" O* ^; ~& Ivoid t3(){
    $ G; M2 n/ N4 Q  l
    ) a( `! O8 T* `# v. k, `, B        log.debug(“this is debug”);) f8 e2 U* k& d
    8 A, q3 e) O7 g2 k  Z8 N0 U
            log.info(“this is info”);
    4 o. f! n, \: V, G1 a+ x% M. }  @7 W6 u$ e: O' u7 @1 q" q: F
            log.warn(“this is warn “);# x  v0 Z2 N) F- ^$ ~: I  }+ e

      f  x( K/ e2 H0 c- V        log.error(“this is error”);2 H; F9 w8 z  ~
    ! @# I% R. _& ?# W; f/ z
        }
    * z% k% v1 I& y. b# o
    + N" H" u& Q/ w3 X$ M; ~; `7 |Junit
    1 D0 b% Q' v$ p! {+ O% t3 B4 B1.是什么?$ t5 ^6 a) |* I3 f

    & G# \; }0 t6 I" ]* I单元测试的框架
    & a0 b6 m1 n2 e, k% s3 a
    ! h$ u( v) s: x* f+ g3 R5 V3 W/ \; W% r2.怎么做?$ K, h+ \! C# @! q. r9 n

    : ~- T0 T" h1 {写一个类继承TestCase
    , {% X, X0 Q: j
    0 q9 P0 W' C: J" P测试的方法一般都以test开头并且没有参数
    ' c) ~4 m- T( A  r' Q0 I/ w" I4 F, }2 i2 [' d( k
    在测试方法前执行的方法public void setUp( )( B6 w/ b& K2 N2 d! f) u

    & R4 D- D6 C  B5 c* B" K0 R在测试方法后执行的方法public void tearDown( )* {8 z) u5 |" W" E; B
    + j! V; J! j2 d) d3 _9 X5 `. A
    error和故障的区别
    + u0 v1 Z+ r5 e- r6 e
    9 G2 `  ]) m! F' M2 uerror :代码有问题
    " p" J1 s  t5 F5 A! N' L$ Q7 O4 |! G; s+ x* I: l
    故障 :逻辑有问题与祈望的值不相符合
    5 o. M3 L' N* d9 b: k8 r3 o- M0 W, l8 ^
    生命周期
    : k( O2 k3 ]) k2 b8 f8 k
    0 o) e- r( C4 ^# @5 L6 ^7 p# k" {3 T测试—〉SetUp()—〉testXX()—〉tearDown()—〉结束;
    8 g' q! I) m, C( U9 P0 `7 T
    9 t. t0 _3 R3 `7 ~TestCase套件8 h$ h5 j9 U7 d, W: I4 ~$ }" \

    , {1 f" m8 y9 }$ ?5 S* Ypublic class MyTest{
    2 C$ a2 u7 q  W# k+ Y" Y1 i' ?! b
    6 P0 O7 e) U/ r% f6 ?        Public static Test suite(){6 o* }% _8 D1 _8 e" j7 ^  \8 {. y0 P) J
    / Z2 ^# D3 C! W$ f
    TestSuite suite = new TestSuite();* T* T) e6 K; I( s4 _
    6 s% \( e$ ^3 j( `
    suite.addTestCase(Test1.class);2 [% k* h, t! Y: f3 v
    8 U& c2 a6 H* `0 ^. u
    suite.addTestCase(Test2.class);" Q( Z+ _9 _. W8 D3 _

    . ]! ^, @; j# S2 ~' U: B8 K% q}
    ) }0 ?* ~+ }: T' y  L/ }( Q3 J. h. Y1 j* U
    }
    2 Y- L! u) i' I1 A! y; j: p- T- O7 ^4 f/ Y4 M# ~
    & g4 i. q$ g( ^$ @

    $ C1 ^$ a& W# ^, M3 VAjax
    ! Z, b5 U; j6 Y2 h是什么?
    ) v' L% _& v2 m: X! w- K% oAJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。是一种创建交互式网页应用的网页开发技术。
    2 T& v- K5 U; J; ~, l, Y4 k; B* p$ q! v$ _2 R6 d% d/ z) i# L. q
    无刷新页面。
    * m1 {9 w0 t8 }7 \2 s" S; b- f; k3 a
    有什么?
    * u3 c4 s7 I; [AJAX是多种技术的综合,包括JavaScript、XHTML和CSS、DOM、XML 和 XSLT、XMLHttpRequest。; f9 J) x$ q/ w0 k2 m% `# f

    ' R- D9 j6 V5 @$ E- N能干什么?
    ) N4 @  e5 r4 m6 e  \使用XHTML+CSS标准化呈现;# b" F6 O6 m  }5 S# U, G
    使用DOM进行动态显示及交互;
    6 }5 Q* R$ i( a% {$ z使用 XML 和 XSLT 进行数据交换及相关操作;
    3 G5 }. |# Q* X& d% i使用 XMLHttpRequest 进行异步数据查询、检索;% L. e% F  S9 T9 s9 L' _3 D8 M( B
    使用JavaScript绑定和处理有所得数据;
    , Q% t5 v+ T& m7 v1 q$ o' e' m& _: t) T' }: }. G
    传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。9 T; u" S9 ^6 `- g& r

    * d( {4 `# W7 _' X( D$ @$ Q与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。
    3 d0 x& Y# l: l1 F' ?- |) z7 B" ]2 V- p8 W4 }
    使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。
    4 r/ l( b0 N3 c& c  Z
    4 g7 W! e, f% p3 T6 W. F对应用Ajax最主要的批评就是:4 @  ?: _& q! o, y# l" w
    1 它破坏了浏览器后退按钮的正常行为,就是用户点击后退按钮后不能看到之前的数据;# i& ~2 @" P* j, e9 E9 c
    2 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;
    " L0 L6 W& _6 N8 V7 o# `3 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;( S+ \6 M* C4 Y, Z8 l/ a" r* r: C7 b
    4 Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;6 r& P/ |5 Z0 N7 v3 Q8 p
    7 M5 j5 X" E1 h  F; ~
    怎么做?/ B7 x# h$ C4 o9 B
    <script language=”javascript”>
    * I8 j, Z, ~1 A. ?0 o: y/ ~: j  G* y0 B( o. U; V$ Q! ^; N, c% I% U
    var req;
    ( L' {$ a- f6 D0 `
    6 s2 e7 P8 X8 `0 y8 N/ t" C% Hfunction add(){
    6 ?$ a$ G  u' z6 W
    ; }: ~' n# E; [# m( V$ |6 r2 C//1:创建用于传输的对象
    ; {! ?8 T3 U1 G6 ]8 v7 \" P( N; A5 g) l" w% f- a: ~  h
    req=new ActiveXObject(“Microsoft.XMLHTTP”);
    ; E: t9 U: c1 `7 Q9 m0 r
      W8 q5 ~+ u1 J6 l6 v3 M2 A// 声明返回后,处理数据的方法3 u1 J* E2 v6 `7 b, K9 k' h

    / L9 O. t4 s* |- @* f/ o9 hreq.onreadystatechange=manage;0 s. P; X  z! _' p

    2 m) \6 ?9 m" }1 A: b3 Z//2:准备传输的内容, @0 P/ ?2 P- Z, }

    - X4 ?% h& ]: w; J' H  bvar str=”test1111″;
    2 E: T0 g7 W- U- w- _, `
    - L0 n  P3 P% B& g1 p: j% Y//3:发出请求
    ( e, C2 {0 R( j
    ! T$ @/ |8 H) e$ {0 Wreq.open(“GET” ,”/others/ajax/test/t2.jsp?str=”+str);
    7 u; i) g$ W  J$ T$ ~
    , r1 e4 z( ?: W) @* b3 L) Ureq.send(null);  h1 Q5 h6 h! U, C
    1 q. n% ]* H5 z! ^+ v: p
    }3 D+ m; T* }9 |9 \% G* {
    6 p# X6 k2 p5 T6 P, k
    //4:接受返回并处理
    4 J8 ]2 [8 A* i9 t' O$ i2 Y4 }1 V9 V2 `7 H
    function manage(){% z' @. i) b1 G; o

    9 p" u" H: q4 Sif(req.readyState==4){& v3 A7 I2 A% X. u4 t# O$ ?" j0 n# ]

    9 t1 `6 ~6 a- L" xalert(“r==”+req.responseText);
    1 g* x9 {' v" @& e1 F+ D$ ]4 s8 O
    }
    0 z% o: L! F5 q( O% X, W, k
    0 K' E6 m% `& ^! O}" w& J8 G6 Q( `7 U) `7 d! R9 t4 b( P
    1 ~/ Y' h" [6 @$ z" Q
    </script>
    8 H2 ]) O1 S$ i$ n" n3 ^* E- w/ q! e
    readyState的取值如下:
    6 V) \+ @0 n3 o  z, I. q7 x
    6 E4 ^% i* @" n: P' J# Z. B  0 (未初始化)
    1 p3 i% o) ~7 I/ `: y3 o
    % i9 k% }/ q" K0 ^3 ^3 [  1 (正在装载)
    2 Y  j7 \6 a0 w& h$ E: i
    ! D& X/ Q) c* `  2 (装载完毕)" O/ ]0 B( K  b1 }/ M9 S

    % w9 D  u+ [# D# f  3 (交互中)
    : j# w+ y$ a: N/ |: d" n$ j( j* s1 z9 M1 d+ w* R4 W
      4 (完成), T9 r* E$ }( H; `) v/ L
    : I0 E6 U! Z/ E0 B- ?9 a! [
    5 P# R& L$ n* h8 P( h6 I
    8 }' K3 n( o5 }# S8 H
    原理3 `5 Y# x0 a( K' P) b3 T% n, v
    Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,可以是xml格式,也可以是一个字符串,然后用javascript来操作DOM而更新页面。
    5 Q2 `+ q& q, r: e" W8 f5 K( ~6 Z& }) Q9 u
    Dwr
    / ]: w/ t& E" Z+ g9 }& h  H是什么?
    . o2 _. Y/ R" ?0 u5 c. p1 d( wDWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的页面。它可以允许在页面中使用运行在WEB服务器上的JAVA函数,被调用的JAVA函数就像是在页面中JavaScript方法一样。
    . i7 y! z$ b* w6 t# X/ H2 C
    # ^3 ]& e0 r1 ]  R* c有什么?7 s1 Y; M7 c/ f7 G1 ~' V3 Z5 I$ h
    它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据;另外一方面提供了一个JavaScript库可以帮助web开发人员轻松地利用获取的数据来动态改变网页的内容。
    - V" T4 o# m# P7 W  A: a' M
    + ^7 \+ k( K( k# w# m, ^
    9 H/ h7 K- g2 R! ^! o2 e+ v+ Z- i$ A/ D
    能干什么?
    4 a& A' Y- W* @% j动态地把java类生成为JavaScript,感觉调用就像发生在浏览器端,实际上代码调用发生在服务器端,Dwr负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制。
    9 d' J6 G& ^0 L, Q! G/ {5 |- I
    2 {; y4 s& z) Y # r  h3 h2 L; }1 |; \
    ) [9 k* w8 ]. c: O
    怎么做?
    : p8 s& B2 n6 h. R# O① 编写配置文件
    * I7 W' v) o' q, _+ f* d! k
    % |3 k. s3 L8 A( [+ q6 kweb.xml
    7 J/ S# b- Q6 k
    & O" {$ {9 C. U2 u. B& T0 S<servlet>/ r+ C, W# h1 v& s( u: f
    5 j5 g& C' e  X
    <servlet-name>dwr-invoker</servlet-name>( R" y8 Y" }0 [4 q
    & s. m) T  T4 p/ J2 r+ L
    <servlet-class>- J3 I  ?& \; ~" x

    ' P3 n' Z/ O- Rorg.directwebremoting.servlet.DwrServlet1 }. b. D1 _+ Z$ S( S

    - v. M9 ?+ L% ^7 U  A- Z</servlet-class>$ n9 _3 x8 i" m, x6 K$ b, r! o
    1 f5 w, K3 [- a+ s- z; Q$ v* a
    <init-param>; U3 b, ?$ A7 G0 y0 W4 r1 u+ |; a

    . ?  D) \& r& [6 I' T' n<param-name>debug</param-name>
    & B+ S4 `* |: Q9 _! W- U+ A! _# N  W/ g; V
    <param-value>true</param-value>3 w9 ?" [  F% Y$ E2 y# [- z# P

    * e" N8 P4 k2 |- c: D1 _' x</init-param>. k2 R/ M" {7 k. N- M& I5 X! s3 k# |

    5 V- r: B; o& A2 V; O</servlet>
    - A: I' I/ {  e" ]9 j+ Q. h
    ) @3 d6 i! \5 V! r+ g) w9 y<servlet-mapping>/ X3 o* g4 F( u4 q- x8 `" h

    : ^- i2 m. @8 F5 d/ r<servlet-name>dwr-invoker</servlet-name>+ N$ b) Q% X* e/ x
    9 T  U& A8 C7 o) O8 Q
    <url-pattern>/dwr/*</url-pattern>
    7 f! [& r3 K2 ]2 s9 W
    7 |/ E& s! n" {; o/ v</servlet-mapping>1 T2 S: \) L+ a1 f
    & ]7 n8 p7 D+ R' p5 O
    dwr.xml
      q3 h  u* ?# }% d4 P% [' G( r. {# b0 K- G( Q+ f& A2 [
    <allow>
    " O2 ]7 k& f$ `' a/ K2 K
    - B. Y  H1 j3 ]8 o+ {: I<create creator=”new” javascript=”kc2″>
    4 J: Q; S( ~- R; b9 C6 q( D5 M
    ( a$ q. a: {: ~# o! O<param name=”class” value=”dwr.Service” />& G" f4 a3 y! t. T7 F" ^
    6 }( r3 }9 k% @& V
    </create>! y" v2 y7 B2 t. `/ h3 m+ l

    ! j+ X+ g( P  W$ z6 }</allow>; I; k6 z+ ]% h7 J4 n

    3 A$ W8 ^/ L9 `②编写service
    4 {  i* G/ O% b3 J. U9 m
    1 ?! ]9 G* n) G% h) S/ _public class Service {
    8 D2 u  g! v: T2 v) g5 ?4 ~& `& T& W3 V! _7 E  |2 q+ D
    public String sayHello(String yourName) {
    $ Z4 k! B0 }9 [- ]0 Z; n( j$ \9 b- M( p- f
    //可以是访问数据库的复杂代码
    + c3 K0 y) y5 @: T; M% K, f, @. ], L+ `1 c6 C
    return “Hello World ” + yourName;/ R; D! t  A% \1 ?

    * M! q0 d8 ]8 J3 X" I}- T, u9 y8 }# ~: }7 a

    3 V4 ]! q1 l9 d( b! t# a% q}3 l" {6 W" \$ ~/ x8 c# S* x9 j- a. z" c
    ) r/ f, T3 y. H3 p3 ^# i2 u* J
    ③测试DWR! c2 W# h8 H4 R; E
    ) [3 b' ]3 T* P2 a5 f
    将代码放入应用服务器(比如Tomcat),启动。, D+ P, o5 B2 |* S7 t* n$ {
    / U; r% e+ G* h
    然后在地址栏输入http://localhost:8080/你的工程/dwr
    % ~* G) H+ j+ n" q" Z
    8 l0 G6 y1 P! W: E3 W( o④编写jsp页面7 h6 t8 b* @; s2 r  |( B

    1 U  t: e+ |5 ^, ~2 K1) 要引用3个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js0 `7 {$ D3 q1 R- X

    * N7 ^6 ?! Y/ V' |8 L* z" O- A# y8 ~- ~2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样
    3 R. G0 K* R) {% _4 [+ A7 n7 I" K
    3) js里的service.sayHello和java类的那个有一点区别,多了一个参数,用来得到返回的数据
    回复

    使用道具 举报

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

       

    关闭

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

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