我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > 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
    4 I- q% m! c& }4 g+ s9 C简述JEE2 B/ c% m  J: o. I' P% u, Y
    JEE : JAVA  PLATFORM  ENTERPRISE  EDITION
    ; z; A- p' I' x7 ~9 }6 r  l
    * {8 C) d, `$ C% e3 b$ XJEE是一个规范集;5 B& {+ @. x4 I8 x+ E+ r
    * k" g' D, h) }2 O+ K% X
    JEE是一个框架集;( ~( u- g3 \' Q+ K; i7 ]: `' |
    5 Y# v, @, L# U2 g
    JEE是一个技术集或API集;
    . L6 W+ n6 e& |& [% ~8 s3 u9 D( h  P1 ^6 L
    适用于创建服务器端的大型的软件服务系统
    ' F9 f+ v3 E3 v  O; p" P' F; s- r6 N

    + u0 s: K5 v6 x2 L0 T% Q
    " i: Z4 X2 ?  ]2 Y/ T# tC/S B/S 模式
      V4 `6 H" T# F. K* v" _6 q0 _C/S client/server即客户机/服务器模式,客户端也参与程序的运行与计算(富客户端、胖客户端)
    9 q* }- o/ e: G" a) s6 Y" \
    9 G$ F! q1 d. n+ @  kB/S border/server即浏览器/服务器模式,又称为瘦客户端,客户端不参与程序的运行与计算
    $ F- L" H  z8 c' p8 H! n. X
    8 r: w: t( e8 o& P" w
    9 C' V% t, B8 v
    ( Y7 [1 j4 R/ k$ h企业级应用(大规模的应用)的特点
    ' z) A. A& s% i6 `* @* p! K% q1.生命周期长、稳定、可靠8 Y8 b2 O: |# J* n; w2 w6 W6 `
    0 Y# `* W; i1 w  L: r) [1 h' R
    2.组件往往分布在异构的环境中,能够跨平台
    ( O( E4 s$ b3 a6 z! r
    $ a, \: _4 `6 o1 F1 E( u3.维护性、扩展性、重用性
    ( o4 s7 k2 d& U+ b9 Y) z) {# Q0 Z; E# n$ r
    4.有事务、安全、线程
    " T/ Y; W" _* r  _/ |+ Q& G; C2 ~8 _8 Q. X* Q: P. Z
    2 s3 [& k* W/ f$ a' J

    3 q: b+ J7 o8 o) j! ^6 A6 U什么是业务逻辑?5 z2 W: o/ I; W7 D( G0 n
    依照业务逻辑划分模块,
    8 F9 Z8 W( a! W% v/ l5 A3 G/ x& m# T, m9 K4 V2 V) m- F, |
    所谓判定业务 就是具有以下特征:; ?3 N7 n* j4 O. _9 {
    - f; ?. Z( O8 U! A' y: Q3 s- Q
    1.业务流程
    " T6 w- p, g" _' |! q! A/ S
    ; Y8 |( W" s4 C; F2 f: b+ V  N9 |/ s1 O; s2.业务判断
    ' o: _. ?: N9 \9 S: v8 H- [; p8 G" }  J4 F1 i, ?0 w3 b
    3.功能组合  o1 \% V5 c: o3 b% U! q
    - K0 C3 T4 I7 _) G& r% J* o% W: r& c
    8 y2 x- U1 ^0 |, j
      P% ]3 j) E+ F/ D3 p
    平台(角色)的划分# \4 S- m: Z0 Q4 n( [' j
    1.平台供应商。提供满足API集实现的厂商(BEA weblogic IBM webshphere)
    8 c$ ]  Q8 @3 p
    1 C+ H3 Y; D# u, r: c( _2.组件供应商! P; X+ t8 w" r
    $ m, \: }5 S9 n, I  |5 M
    3.组件装配人员
    / `5 D$ S) I+ G9 F, S
    7 q0 K& d* u3 g2 L9 [4 U" R4.部署人员
    / x; d! n3 F4 u) k: {) C( \/ b" A
    # y' }! j. w1 Z) n- Z5.系统管理人员2 g, L; e7 ]( w. p- n0 w2 c
    4 S- A: l! d( }1 T+ \% K
    6.工具供应商 提供开发组件所使用的工具(Jbuilder、eclipse)
    ; s; ~: \& A6 Q' G3 f7 |! _. @1 Y& T1 N# o

    4 `' X  k# T- ?4 O3 w/ @* ?$ n
    : A( @- o# t9 }2 y- D+ J3 k) _4 Z+ hjava技术分布(设计架构 模块内部设计)
    ( O+ u) y+ R: K7 [1.表现层 Servlet、 Jsp、 JavaBean、 Taglib: c/ S& a2 l/ H( }

    * g8 }0 J3 v+ \2.逻辑层 EJB(SessionBean)8 O) V: m5 O- I4 L9 l: r

    * \% O- U2 e- f& |7 `( I3.数据层 ( JDBC  EJB(EntityBean))
    # z$ E' U1 r; b3 D% J
    ! f1 d0 V7 e- {" j4.服务 JTA(JAVA事务架构) JTS(JAVA事务服务) JAAS(JAVA授权与验证服务)" Y, T, H7 h6 `9 z  o
      A4 w5 d: T7 O- x& A
    5.分布式通讯 RMI(IIOP)+JNDI 、JAXP(JAVA 的 XML 架构)
      ?4 |( f( D$ l, v
    ' l" F. U- i4 E1 x9 k3 QJAVAMAIL(邮件服务)、JMS(消息服务)、IDLC、JCA(JAVA连接器框架 (成))3 R/ y2 A9 l; ]. ~: a+ O* M0 \0 w
    3 S2 n7 x  E0 P$ @

    * N9 L- x. t  d4 c
      R/ H5 P* j# E+ UJEE的体系结构: 是一种组件的体系结构
    6 d, p% U2 Q) l! v( K# H9 t9 K( O8 l1.组件 : 能够完成一定功能的封状体(独立的功能的集合)0 }6 X- M2 f! O8 [5 _  S

    0 p( u8 {' _( `; C" t# @不能单独运行,必须运行在容器上
    " @( ?9 u. Y% D4 p1 [
    # y# q# V. j4 k- b% O分为两类:web组件、ejb组件/ P4 z$ u0 k+ _
    # }" Z# o% J) \
    2.容器 : 提供组件的运行环境,并对组件进行管理(一段程序)
    / x) V4 u8 ^% @) U, I9 U4 r( q$ V" V" ?" o- \
    管理组件的生命周期7 ]/ ~" w1 f1 a' n4 ~! R* B- i: N

    - t7 x; J) i3 J+ w. d% c3 M# {, I( i不能单独运行,必须运行在服务器上7 T* o% k% b% U2 }

    / d9 S# Y) r, O程序(组件)通过上下文来调用容器(context)* y! C7 A  N. I% S- Q/ {7 I  e9 D" D1 e
    ! U0 E7 E. \1 Y: n" T. N
    组件通过web.xml向容器描述自己,使容器能够认识组件) |2 z( {2 H/ i% d

    - h0 X! V* b9 k. M' B! ]9 G2 |/ O4 t容器通过回调方法来调用组件& d% D- M. A/ K- c9 B% g6 I5 O  I

    ) O# L& E, c: k2 z" T分为两类:web容器、ejb容器
    ) l0 ~* N/ W- n2 g; `' }6 C# g0 n9 k
    3.服务器 : 提供容器的运行环境,提供大量的JEE基础服务
    6 \# ], \+ V4 Z' ]: o9 W
      O. `8 w" V: r2 O9 `( hweb服务器(只提供web服务)% m" a) `8 w3 D! x0 M
    5 h6 H$ t. A( s
    jee服务器(提供web、jee服务)# W+ k+ A0 E4 b
    2 G2 u% F# j- c6 G% {! O2 {, _& Y
    5 d) ~# }! W& u8 I% ?

    3 B6 x+ Y  {; V# `什么是回调方法) K3 H, h& ?+ w- |
    由容器自动调用的方法,就叫回调方法。$ i1 D5 d7 ?* ?; S+ V

    + |; h; c3 X) V . Z# N7 w4 y! _2 P9 |  p. ^( V
    5 G9 B9 v9 `, {9 s# p  x# d8 f9 V% F
    RMI远程方法的调用机制
    & [' v4 Z9 M4 \: n4 X例如:A主机有B()方法,C主机有D()方法,A 想调用C主机的D方法* b; i5 Y. U) c& e4 E2 a  I0 l: f

    - K( T6 @  l* y) v( {! B+ R  L
    $ n% O* w$ z& K1 O
    5 y2 `" {' s% E/ J
    8 U! s+ p$ T, a: d0 ~
    , p. H2 b8 [# q5 l学习方法2 n! _' }& U; S+ [- q, b: \
    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
    ) j0 q  ?# ?1 l; ~! k: f. W4 S
    •     描述war包、jar包、ear包的结构
      # k* r7 C- L. M( |

      4 ]/ O: [. u( ~% i) k. b$ ^( {  Z/ I" \4 [2 `; {

    war-                            web文档压缩包

    —WEB-INF

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

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

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


    . F$ D3 l' h, e: }! H. ]' \

    jar-                             java文件压缩包

    —META-INF

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


    ' z4 L3 l3 J$ Z% L# X0 r. n

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

    –META-INF

    —Application.xml 配置文件

    –*.war

    –*.jar


    8 v) U1 G6 _9 U+ S
    • 什么是servlet?servlet主要做什么?3 j0 t0 @0 Q( G

      & @5 M5 i4 R* K( v! w/ V9 u# u: F7 N
      ; y" v3 X1 b# M. }7 u! g$ n

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

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

    - @1 h7 x& X- i" n* r" @
    • servlet 与cgi相比的优点?servlet的缺点
      7 T3 F+ _  U0 G

      * w' g" f, Z' G0 ?' @, K# l- j" q0 \6 r5 K4 h

    优点:

    性能(线程比进程更快)

    可伸缩

    Java强健且面向对象

    Java平台独立

    缺点:

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


    1 x# [* D- {) a
    • 常用的servlet包的名称是?' [" N* L; k. R# c, i1 U

      * n) y8 P/ X$ E# g# C' R
      . r" G- g8 d! J" V3 ^: Z

    javax.servlet

    javax.servlet.http

    & f' Z3 ~% O0 J' |
    • 描述servlet接口的层次结构?/ _& X" {8 c' n2 A& T  i
      ) @/ g( D) w" S: b9 V9 d
      ' l$ a1 i! P/ {. W6 Y. |

    Servlet

    –GenericServlet

    –HttpServlet

    –自己的servlet

    ServletRequest

    –HttpServletRequest

    ServletResponse

    –HttpServletResponse


    + U: L; C3 J6 I1 |4 v7 r* p
    • 对比get方法和post方法?7 n( F% U0 b8 ^( H2 ^7 @5 A

      , T% i' V$ Y- r+ U
      # M# t2 [6 N$ R: s  i# O) |

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

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

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

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


    * |0 K3 U; N+ U. Z8 \5 Z
    • 归类描述HttpServletRequest接口都完成那些功能
      . f; p8 y5 H! v% e. D5 e
      % g( e! z5 M* l4 v: x, u
        e/ {) N7 j* [4 P' l- c3 H$ M8 B
      • 读取HTTP头标' N/ j) k& D& a; F, M
      • 读取cookie8 U8 n3 g  O" h7 K
      • 读取路径信息1 k( W, w, k1 f2 g* x
      • 标识HTTP会话。
        , ^& t) D: |. ^8 |
        # T* x! H4 u2 h+ u. L3 ^) F' y
    0 C6 a( s  h0 w9 o
    • 归类描述HttpServletResponse接口都完成那些功能
      ) ^' g/ ^! A, b( {, z' L  h
      " {2 A2 U' v2 @" \& k9 [
      + u1 y# `9 J# G
      • 设置HTTP头标9 L0 t7 c4 r- a# a  J0 s
      • 设置cookie
        * R: b- g2 H0 x% J- D5 }! D  k
      • 设定响应的content类型
        2 I( t  t" U' F! c$ Y0 s# j  J
      • 输出返回数据
        5 y- l0 h+ D+ C4 c" O0 i% K( ^$ L6 y% b1 n. m
    : Z9 E6 }) {# |9 ^
    • 描述service方法所完成的基本功能?默认是在那里实现的?
      , w8 z' m) ]) t% `5 B
      3 n8 F1 @9 q+ o

        o, q+ }) k5 s

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

    实现:默认在HttpServlet类中实现


    3 ~  B+ f0 j: `* Z& d: ^) q
    • 如何开发自己的Servlet?描述应该做的步骤和每步需要完成的工作
      0 ?- Y  F5 A6 p6 g: Q" u

      $ n8 T% U4 `  }. q' ]% D; R) J; n" P9 H+ c  Z

    1.引jar包

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

    2.开发servlet类

    1)首先继承HttpServlet

    2)重写 doGet( ) doPost( )

    3.部署

    安装web服务器,例如Tomcat

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

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

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

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

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

    4.启动服务器

    / n" Y4 z* r- k: z  a$ P' y4 I  @  N
    • 为何servlet需要部署描述?" x" k6 b, J2 E* N/ ]
      / m0 Q, b% X. ^! b, S  P6 F

      6 X: {- J( d- I8 M; t9 W: U) G4 \

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


    6 n1 A4 \" \5 n1 m
    • Servlet基本的描述应该是?请写出来
      - Y5 w) {3 M" t

      3 W& ]+ X3 Y  ~! ~5 w6 U- U5 D" q! B8 U' ]! w% ]1 `% v

    1 a3 W" h& m' ]( b

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

    % x* L. U; n7 k" q1 F
    • 如何在html中使用servlet
        j( k8 f/ F1 C' x

      * U  T* H; ?2 n7 v9 p
      ! V& D! [* e1 A

    FORM标记

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

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

    语法:

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

    {HTML form tags and other HTML content}

    </FORM>


    ( R) y* i6 h7 {3 B3 y+ n% Q/ P0 A6 \! v
    • 如何接受request中的参数4 |& i( i7 M* {6 P8 a
      3 S8 x' U1 {( U5 x/ y8 B
      String userName = request.getParameter(“userName”)方法
      2 I' y/ B4 |; a% V
      " [9 r3 O2 a5 P
    8 i6 |. g' A4 i  W8 @
    • 如何接受request中header的值
      8 p' G) e: K3 L
      $ H0 ?. b2 f0 w3 }5 ?2 \: z

      & e( {8 c- Q% l5 n* {+ H0 W! ?

    request.getHeader(name);

    request.getIntHeader(name);

    request.getDateHeader(name);

    request.getHeaderNames();

    & u( `, A: b' V" g/ q' N
    • 如何输出html& v2 a7 b3 t% z0 o' ]
      0 P5 \4 |  j" f* K% }* T
      / s: g* D  r: a6 z1 y* `' I

    PrintWriter pw = response.getWriter();

    pw.write(“<html>”);

    pw.write(“Hello”);

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


    6 C* l: P. G. G
    • 如何设置输出的contentType: d5 l# i& ]$ C2 ?6 c- Q; Q* I3 Y( l
      % N& I8 w2 C0 q3 k9 l

      , |/ r/ U8 G8 S+ a

    response.setContentType(“text/html”)


    $ j& d1 d  w5 c" T
    • 描述servlet的生命周期?, [5 y3 `; X  v3 F0 W0 V1 [1 N* x
      ( W! B$ g& M( T) L2 S
      3 s7 m5 B$ E" L6 x7 {( ^# [. E

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

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


    * @& G: ]$ x, }* y, c
    • 描述init,service,destroy方法的功能和特点
      7 F  U6 [: J+ U) w! b! ?9 m

        F# }9 @0 \. y1 P$ V0 u) i
      3 c) D) R0 k# o) n

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

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

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

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

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

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

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


      L( L$ O4 D( e; g' X
    • 什么是回调方法?有什么特点?
      0 o+ O; n! C  a9 @: T2 x5 l
      1 F+ m, l3 f+ M4 C/ {- D
        R7 L6 m- }  k+ M( t0 |& T

    由容器来调用程序的方法

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

    ! H! ?; \( |0 O* X  H  H
    • 如何设置初始化servlet的参数?
      . ~5 |: t+ e, A6 s/ H

      ; {% s2 M5 c- |! L; M在<servlet>中添加如下配置
      & ]8 M' b* r4 ^# P  @  K; M9 W* y# d" k# R* T, z/ x/ ?/ h- B. T

    <init-param>

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

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

    </init-param>

    " F/ f+ L& a7 _5 _+ d
    • 如何获取servlet初始化的参数
      7 f+ ~- B2 v0 ^7 w( _: s$ c
      , B. y4 T0 [5 F. B' t4 H, M+ o# x
      5 R, ?' V/ y. `% n

    public void init() {

    greetingText = getInitParameter(“greetingText”);

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

    }

    . P; H8 N1 d: e. I8 W/ `+ G
    • ServletConfig接口默认实在那里实现的; p) t, v# W$ k: F' f* e% f
      / \: h8 E; ?; ~

        q' |" ]* r9 w7 \

    GenericServlet类实现ServletConfig接口


    : C- T$ c& C# y5 @
    • 什么是ServletContext?有什么作用?/ I+ ^3 Y: ^6 k1 R: ]! w
      ! V$ T  ]" Y& q9 t+ H  P

      2 Z8 g6 \* M& s* t$ a* ~1 H5 f

    Servlet上下文

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

    5 E* `9 I/ ?5 w$ B
    • 如何访问ServletContext接口?是在那里实现的?
      " F' `2 ]: q$ Z& ?0 L" H- o

      7 h' W' C- u1 `# d# B) V7 S' D
      1 N) q  w0 B* }4 q7 x# f. N9 {/ |

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

    GenericServlet类实现了ServletContext接口。

    % k5 H* M' y5 \& N0 ]0 j/ u
    • ServletContext接口的功能包括?分别用代码示例
      " O4 c: R9 G* [1 n8 |& E- o

      % W( Y8 l" c+ ^" B; B) K$ k6 P+ l5 R1 l7 ~, a7 [

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

    1 z$ _7 V1 x) L3 Z9 |. W- ^) n
    • 如何设置ServletContext的参数?+ ?' E% i, k. l1 f1 N
      $ ~) v7 p" j8 A- D1 d
      ) Z- Y( V4 b4 c! a3 i& `1 l, f

    <context-param>

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

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

    </context-param>

    - S8 P( R: Y4 d) j5 Y3 b
    • 如何获取ServletContext设置的参数值?- V2 m  P* N9 m5 a5 D

        y, M! T4 j7 F, x# {
      : w/ i6 T3 [' D1 d9 A

    ServletContext context = this.getServletContext();

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

    8 n5 s  ?! X- u
    • 描述Web应用的生命周期?* P" x1 x' C, [2 d7 h1 f" `8 G

      ) ~: r+ h+ e9 A& ]. ^* Y# Z: n- U$ d1 E" }% r$ F! T3 k* e$ V

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

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

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

    . P2 d0 y) Y$ c9 J) c* [
    • 如何用代码实现监控Web应用的生命周期?& w. E' q2 Q% B
      * Y  c! W0 s! M: A% I0 E

      4 H9 g1 }+ Q: u1 k
        I# K4 {3 J$ V

    public class Test implements ServletContextListener{

    public void contextDestroyed(ServletContextEvent arg0) {

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

    }

    public void contextInitialized(ServletContextEvent arg0) {

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

    }

    }


    $ }2 p) X, r% F6 |

    web.xml文件中的配置:

    <listener>

    <listener-class>

    com.csy.Test

    </listener-class>

    </listener>

    7 M  ]% A* {4 \/ X! S! _& j/ U6 t
    • web应用中如下错误码示什么意思:400,401,404,5006 v+ q! S, R3 D1 `
      5 `( d' }. }. e/ j: ?3 c  s3 m
      400 Bad Request//错误请求
      401 Unauthorized//未被认可
      404 Not Found//没有创建
      500 Internal Server Error//服务器内部错误
      8 W0 K% F  a2 H, I6 o9 ~5 o
    ) u" L3 ?& H8 `2 [2 f" {- W1 G; w
    • 描述Web应用中用声明方式来进行错误处理的两种方法
      6 [# B5 t/ P+ `7 x2 c/ u

      ' O1 m( _% H5 w' t9 W( S6 P' _* d/ o' G: I' _9 \# ]( t" u

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

    <error-page>

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

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

    </error-page>

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

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

    <error-page>

    <exception-type>

    java.lang.ArithmeticException

    </exception-type>

    <location>/error/ExceptionPage</location>

    </error-page>

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

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

    % }9 {# }1 x# Z& v( C! M
    • 描述记录异常日志的方法,都位于那些接口?) {0 W1 L& Y0 l$ ]

      ! t0 E- {: m. X1 U! V7 D  b8 p( d$ o  _/ I

    GenericServlet:

    log(message:String)

    log(message:String, Throwable:excp)

    ServletContext:

    log(message:String)

            log(message:String, excp:Throwable)


    ' s" y# i% t( ^* M9 m
    • 什么是会话?) i0 B3 z+ c3 F5 E# G- P( x' E# S% |

      ) f0 M/ _: g5 I5 m
      + d6 p$ y. @6 W( `* Y+ s

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

    " y: W' m; _$ b
    • 如何获得会话?7 x; B  L* l9 k1 Q+ d5 k; {
      4 P6 b4 [4 r% i) \2 ^, G' a* j
      HttpSession session = request.getSesseion( );

      + J) p1 z8 X2 w% k. z
    1 R+ X% A7 ~9 u) y$ j
    • 会话Api的基本功能?: a4 d) k7 B- }1 [9 s. ^
      ) @+ Q: j. r+ e1 R; e& g4 D3 }' H
      5 r8 s4 y, b8 h9 w0 U0 v

    getID() :String9 A6 H) g; |6 Q& Y

        isNew() :boolean
    . `1 P5 `  @7 g" U& c

        getAttribute(name):Object
    , |% i- B  ~: S* |" K( L/ W, F5 E' W

        setAttribute(name,value)9 S; c5 R1 J9 c) |* |. W5 d  }

        removeAttribute(name)

    4 o9 D1 X# s- {" I# v
    • 如何销毁会话?
      1 ~) V# Y. D( d7 l$ I

      * r7 |( d) t& X1 O- W. I/ l" [, M; G% J

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

    <session-config>. C! v1 v5 v- m# K* i7 v, Q

             <session-timeout>10</session-timeout>
    * S. W. @! x0 h9 N9 n2 ]1 h; u' q

         </session-config>! T; U& Z- b* _4 {, x# i

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

    invalidate()6 Q7 r) p( R2 Q# T

         getCreationTime() :long
    9 U; b2 U" J1 {* |( x8 m8 X

        getLastAccessedTime() :long8 n' J, Z" @( j8 g* T, n

        getMaxInactiveInterval() :int5 n" }( D* Y% z! F' m5 t

         setMaxInactiveInterval(int)

    / b, z2 i7 @% T6 @! [
    • 描述会话保持状态的基本原理
      9 D! W4 @% p' r* X6 Z, ?. M
      2 F) [' l: t) q" u
      / C* _% |9 M0 N0 |* f
    7 N7 b. D0 g5 @- q

        client server
    $ f& p  j9 ]2 P3 ]


    * s; ~' K; l/ @. N9 {

    request
    9 o  j$ T$ K( O8 V" H% l& T" r

    response (sessionid)/ x2 H5 h: D: d& ?" C6 p1 q

    request (cookies)0 c& m* u* r. w- n/ h/ y. O! ?

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

    8 ^, V+ F7 Z0 J1 A; q. }
    • 请描述session和cookie的异同之处0 X# ?8 ^4 _8 r; O" L0 z4 o
      6 x6 g, M* [" q5 X4 Z+ w

      . J# k% F( Y& C
    * c0 _4 i* r7 p- H! @3 p- S- _
    , Y) J1 m+ g  s: j
    • 如何读写cookie,代码示例
      5 }% g, h8 V+ v
      + {* }7 L% p# @& ?4 [/ m! ~+ ]  o
      0 K. K+ o9 \( N& {8 a; v0 c

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

    response.addCookie(c);

    读:Cookie[] cookies = request.getCookies();
    - C3 L* ]6 }, f

            for ( int i=0; i < cookies.length; i++ ) {$ ~0 Z9 v$ x' y5 Y% Q2 z8 _

                String key =cookies.getName();
    - x3 N* ~& v& N1 l1 F: t, t

    String value = cookies.getValue(); 1 W* B0 @7 t( J1 q0 t1 \

    System.out.println(“cook”+i+“:key=”+key+“,value=”+value);. g$ i: s% g7 ~

         }

    ) k+ W' ~8 j# r
    • 什么是URL重写,如何实现,代码示例' }: R3 j- n  t  C

      4 p, F! g7 ^$ C  |1 L3 S6 R# a, y; D4 K; w" |1 H, c( U

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

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

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

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

    $ l7 v; P3 E# Z
    1 S7 Z; F6 {, p
    • 描述web应用的4种认证技术# m, b5 B9 I: U; N) b% a* P( E
      * m) I1 e+ C' h* _, y

      ; N! j% D+ u3 ?% e0 w+ |9 `

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

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

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

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

    " I& k' n+ {4 l: f3 b2 ]& k: a) l" r
    • 什么是授权,什么是验证?
      " \' x/ ?* a* o: _6 x

      8 x' E* Z( ^. z4 k4 F# ~
      : m1 h# Z4 B* n6 }( E: z% I

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

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

    4 L3 y# w5 G$ p: N$ `7 s
    • 什么是HTTPS
      $ J( k6 G9 T5 S! D

      - ^; [$ G- ?3 z& _1 D2 _
      + X, g1 N& ~# h

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


    1 w3 J2 x5 i/ \& k/ X
    • 什么是审计?
      ) F+ e* y1 ~1 L. `& z) O

        M' V$ m; V) J' `8 M4 M5 [  H5 D0 L5 R! W$ U

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


    7 \# a- r# G4 w
    • 如何实现声明性授权9 ~4 @( R5 d. ~: a1 d* ]
      # m  p8 T( f7 O) e' g

      3 X0 ], X2 C5 c8 W7 t/ j

    1、标识web资源集

    2、标识角色

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

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

    在 web.xml里配

    , ^+ C" A9 a9 N% Q9 g
    • 描述servlet并发问题?
      0 q; B% r& x2 n; T1 z9 t5 b
      ) x% ^9 B, j' r" L4 I% f5 d
      + v( V7 P9 ^$ e. g- I2 z1 f% C. p' D

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


    ; B8 N- Y  F6 U; T
    • 描述Web应用中的六种属性范围/ f( p; a. @1 d% H) g4 q

      . V% x9 h6 D' h2 u1 H) x* t) g1 M( k$ Z5 M' W+ g1 \$ Q

    局部变量(页面范围)

    实例变量

    类变量

    请求属性(请求范围)

    会话属性(会话范围)

    上下文属性(应用范围)

    % S: G6 ?2 x, \
    • 指出上述六种哪些是线程安全的7 J- Z: b7 u: d, S% g: q

      9 P* Z% {+ i4 O+ X) s& x
      4 _3 |/ C+ o7 k' i7 G0 s

    局部变量和请求属性

    . l1 D3 H5 w& f  ]* }8 t% i
    • 什么是STM?如何实现?
      6 \: ^6 q0 G* J: i

      # D! Q: o7 d$ Z. ]; y4 q4 g1 G
      7 A2 P! z2 m7 Q# I/ ~

    SingleThreadModel接口

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

    6 [5 c( T5 ^5 z2 Z6 d9 D  r. _$ Z- h
    • 如何实现并发管理?
      $ g  \! J. e4 m: D. x# A

      - b  U9 B! F3 _# z; Q7 q$ X
      7 H+ H5 V! i2 m# C9 h: F4 d) X

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

    使用synchronized语法控制并发

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

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


    # D8 x& x5 @5 l5 m" m% Z/ a
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    13#
    发表于 2014-12-03 12:45:45 |只看该作者
    Jsp! `/ _/ b* u: J+ H
    什么是Jsp?
    " b8 R9 H6 t) r3 d! Y6 m2 OJava Server Page    结合java和html在服务端动态生成web页面的技术
    ) i3 |, }6 ^; Q/ s. m1 u$ t" ^
    4 H* j' M8 N) p! I
    ) D! ?9 w, s+ h6 K' C6 f* c9 \
    3 `" r7 O" M: }- F/ n7 c6 H描述Jsp页面的运行过程?. p! c- s! W4 V: \8 `" j$ C! i
    第一步:
    $ S4 o+ A* `/ g' q
    ! [# d& z* b9 ]: s7 @9 Z请求进入Web容器,将JSP页面翻译成Servlet代码
    + }5 ]9 k2 B9 h6 {2 X  j( R9 e  O- f$ d% }
    第二步:
    - Z! H0 V8 b; O5 S3 J5 [, J$ V; T* H2 r% \( I$ I9 X
    编译Servlet代码,并将编译过的类文件装入Web容器(JVM)环境
    & @6 G  b; U( l1 |  {; i
    , |- s5 L$ g5 q- y第三步:" @2 P( U5 D, H/ g& |, _/ q1 w

    - g( D. _/ D+ w! B% t( g" M8 T- \Web容器为JSP页面创建一个Servlet类实例,并执行jspInit方法
    6 w/ W2 [0 z% s3 k# ]  \2 ~8 D2 `5 J( b$ B& W
    第四步:* R# h' a7 W8 S: P0 a4 u

    # a- F) @+ ?; ?8 c" _Web容器为该JSP页面调用Servlet实例的_jspService方法;将结果发送给用户- {+ @# [  d- ~7 Z, D
    . a( m$ ]$ R' t$ w4 `! p

    , Z; Y6 n. i" \" z5 X- O' D/ q* r; f* X; \9 I0 n* _
    描述Jsp页面的五类脚本元素的功能、写法、并示例
    8 Z) {& V7 l8 |4 k% k注释 <%– –%>
    ' f6 }2 I# `& R9 X7 y& \( d$ x- e
    ; d. |7 p6 P6 V' D0 U<HTML>
    2 }/ B9 B1 S* {+ f' ^! S; \* M
    - y& g2 a+ k8 }9 U* X8 f7 ~# t5 H<%– scripting element –%>/ B1 f8 f9 p8 P, S0 P' H
    $ ]6 S* U4 T& Q2 `
    </HTML>
    : C$ V2 e" V$ {! i4 G  Y1 ~/ n: f4 \) g7 W. r# R# I
    指令标记 <%@ %> 指令标记影响JSP页面的翻译阶段
    , Z! \& U5 B4 a# D3 Z
    , {3 M- N; O3 i* R: c<%@ page session=”false” %>
    ! e4 R9 k# u& b9 Y0 O" _1 Y. M0 C: S% j* g
    声明标记 <%! %> 声明标记允许JSP页面开发人员包含类级声明$ `# U9 J$ J8 ]

    6 z  x" N2 G2 L' A: J2 _. c6 l( o<%! public static final String DEFAULT_NAME = “World”; %>2 Q  z+ j0 S, Q0 D3 H. @  w! [9 M% _* _

    , T3 r4 D2 U3 F) y' G    脚本标记 <% %> 脚本标记允许JSP页面开发人员在_jspService方法中包含任意的Java代码# i/ J+ L+ ~7 N/ E5 j  T# B. [

    / ^' a0 Y6 F; R6 `' }    <% int i = 0; %>
    8 {7 S6 }+ Y) \; Y; ~' R! i$ I0 J
    1 w& I. A4 g& H表达式标记 <%= %> 表达式标记封装Java运行时的表达式,其值被送至HTTP响应流 <B>Ten is <%= (2 * 5) %></B># s) s2 z: z/ x3 c* S9 S( A
    ) y: j8 y6 o$ u& q4 x/ g
    8 ?& N0 H0 z: t4 N8 z4 i" N  l

    ) W" a2 ~* C. R: k, S( ?7 f描述Jsp页面中的注释种类和写法
    # q  m/ j# Y/ P+ ]6 WHTML注释1 m7 E1 o' ^; R7 `$ {. }2 m) }) ^
    " ?1 ]! L. I3 p4 k+ D& ^
    <!– HTML注释显示在响应中 –>7 b" [( [3 B1 b3 U' |6 H
    & o  a- E( u+ a, u& {$ e# s
    JSP页面注释
    9 R5 H& `; c( v- j2 Y
    . c' s7 P+ `$ p5 P' {, B<%– JSP注释只在JSP代码中可见,不显示在servlet代码或响应中。–%>' i9 x; G  K8 ~. w
    $ l  E4 B" J' @8 w0 i/ s) P
    Java注释9 K6 k/ L5 x. t% Z
    ' X0 |8 q( D, n$ ~' K& A" X/ E
    <%
    # O/ a$ P: M1 |8 J$ H6 }* J& m5 }& f& E# \8 d8 u
    /* Java注释显示在servlet代码中,不显示在响应中
    " [, }) t, Z" c9 b& E3 R, e  H8 e3 }/ S4 L! p
    */
    $ B) T: ?! \& G5 ?, j- b5 Q3 X! ~' [1 Y2 h/ s; t
    %>
    3 v6 ]. z% z3 H7 a! p
    . V4 o" W) ?0 _" [( _: {: w 1 i1 Z5 |7 [) T7 |' @! C

    ' q+ [- {4 z6 E, g2 Z' z/ W描述Jsp页面的指令标记的功能、写法、并示例9 {8 {0 D7 T/ X
    指令标记影响JSP页面的翻译阶段3 W8 h6 d- l: f+ ^" p: h; `3 _
    # S; h$ ]2 L; z2 ?" g
    <%@ page session=”false” %>1 K9 f# A& K+ m, y: x7 O
    ; @' p0 A3 Q, p3 s
    <%@ include file=”incl/copyright.html” %>
    * r2 m8 z  r, Q! y; K( v+ G# E: r3 U! p8 v: K9 v
    <%@ taglib %>8 R& k. @# _  n% ]
    & {4 O, ^; e7 j( j
    ) m* A* i  Z& o& c% i
    $ X/ e$ M4 J8 w( {: t
    描述Jsp页面的声明标记的功能、写法、并示例
    1 {$ ~0 y* I8 l) p$ O声明标记允许JSP页面开发人员包含类级声明% @  B8 A% d: f+ E
    ) i7 _+ `5 E$ b7 A; i- x
    写法:  q* v# g; W+ I2 j( v

    ; Q8 w3 s3 x2 |* T+ N$ a# s2 G<%! JavaClassDeclaration %>2 \/ `4 j! {! R- t

    " _  E' _" g4 p" ?1 E( ^* ]7 e例:
    ! j% s3 i* K# s6 p8 Y, O
    ; F7 f* G4 x8 T4 ?5 l6 h& H3 x<%! public static final String DEFAULT_NAME = “World”; %>
    0 D8 U: y0 u% a; Y0 _
    & c- r. b+ Q+ R+ X( T4 S9 U2 o<%! public String getName(HttpServletRequest request) {6 g" q  ]3 W9 y% G/ Z: I& V

    8 d0 n3 Z9 ?, B4 G/ ureturn request.getParameter(“name”);  a) D0 U& r$ y
    & J2 m" q0 K+ J( Y. }
    }
    1 q7 W" u6 e7 Q+ p
    ' a( t2 R/ `# Q- M) T%>! ?' |6 Y4 E3 z& {" l7 D1 ]; B
    & T, N" j1 s5 w7 A' A
    <%! int counter = 0; %>
    ' U% u* W- _8 m8 ?) Q+ l& E3 B+ n) l& Z$ e! v1 w, @
    7 g. A( {$ U  S* o1 b$ o- M5 ?1 ?6 E
    $ Y1 h+ M1 `/ L! j. G
    描述Jsp页面翻译成Servlet的规则# r0 G7 h5 I7 k# L* j' F
    jsp中的注释标记被翻译成Servlet类中的注释5 v5 X% o$ f* v4 f8 w2 s& N: C/ f

    % d0 [+ j6 p, F/ m4 k4 v4 T$ t5 ljsp中的指令标记被翻译成Servlet类中的import语句等
    % e& W: ?& W4 S7 e- Q. J6 ]. o& T9 k; i# P
    jsp中的声明标记被翻译成Servlet类中的属性
    ' |9 e& v: o7 |! @0 o" Q# L' O( T! d0 Z/ }% z
    jsp中的脚本标记被转移到Servlet类中service方法中的代码
      d; l1 j7 ^. D4 W6 @$ S# e7 G" G% \; Q+ I  q. d
    jsp中的表达式标记被翻译成Serlvet类中的write()或者print()方法括号中的代码
    8 I$ h: S, s- \4 X6 c
    : Q; B9 q* d% ^$ `0 \
    / m# K" O* I  k4 F1 [) B/ q# g1 U
    9 Q( u6 h; _; \$ V! Q描述Jsp页面的九个预定义变量的功能、用法、并示例: j( @8 r  H+ Y2 v+ c! N; w, F
    request 与请求相关的HttpServletRequest对象. F$ n( _) c, v! l) Y
    & t- v" l1 M7 C+ H' S
    response 与送回浏览器的响应相关的HttpServletResponse对象
      X% W7 M* M+ S; x( _* y! @% S& {9 J5 C
    out 与响应的输出流相关的JspWriter对象: U2 K7 j' t& v. r
    8 D; M; ?- x$ [( h8 F9 s: r
        session 与给定用户请求会话相关的HttpSession对象,该变量只在JSP页面参
      w1 A- \% @6 J( Y2 i! [
    + u8 _; V+ H& m( H( h: [/ \4 B* z与一个HTTP会话时有意义
    - L  X. |+ V- Z5 b* k7 G$ w+ M
    - s8 M; q% _- S2 Q    application 用于Web应用的ServletContext对象! V( r, v: m: G0 z( h: ]
    3 A3 J+ y. C/ A' S
    config 与该JSP页面的servlet相关的ServletConfig对象' @& u& e# k0 O% ?5 X

    3 G, D5 S& ~& d8 E) c+ apageContext 该对象封装了一个JSP页面请求的环境
    - ?" ~# n: X" V& [* w, y- Z. D% y5 q" w( g2 a2 a3 D% o
    page 该变量与Java编程语言中的this变量等价
    8 Q# M4 T+ T) U# y% z' {" @: a! C% ~/ ~
        exception 由其它JSP页面抛出的Throwable对象,该变量只在”JSP错误页面”中可用5 V0 ~: {  b. Z( C
    + w* j  h+ O5 H/ ^, L
    $ z% L7 R5 o# j2 V. Q, P$ [
    : Z" ?4 }+ n/ K
    page指令的功能,写法、并示例,并描述它的如下属性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding" `% C- d1 M+ f
    import import 定义了一组servlet类定义必须导入的类和包,值是一个由
      ~# y5 b; `0 j4 S: \5 N6 c  V( |2 b+ l5 V/ H
    逗号分隔的完全类名或包的列表。8 V3 h  M( z2 E5 J0 n
    ! x: T1 y6 n" a: M. j" ?) h
    session session 定义JSP页面是否参与HTTP会话,值可以为true(缺省)4 b" `8 V5 W) p0 S8 B! ?

      V& M6 Q' x. @. l4 E/ e& w9 i. }或false。( T0 V: j; P" f, A$ ^
    - X4 x3 h! z  H9 A  X1 T5 g. P
    buffer buffer 定义用于输出流(JspWriter对象)的缓冲区大小,值可以为  K" e( p0 X# g& W

    - J% \7 a/ m1 d. c, Lnone或Nkb,缺省为8KB或更大。' c  t0 Z' y) W8 S

    2 K5 M9 j  P* Y9 p, S2 BerrorPage 用来指定由另一个jsp页面来处理所有该页面抛出的异常
    % |1 X% z1 D( M+ d6 k" A2 N$ t7 Y$ b$ I0 G) i* U
    isErrorPage 定义JSP页面为其它JSP页面errorPage属性的目标,值为true或
    1 n) c; n- L9 I5 p7 @2 M+ b9 O: g
    4 B( Z& n% Z6 L# k9 A0 I% A; nfalse(缺省)。. g. D  r1 A" \* e0 E1 S

    - i5 ?( V+ k  j4 a  l. r2 kContentType 定义输出流的MIME类型,缺省为text/html。+ t: H8 i+ H" V" `: Z
    5 E% W9 N4 {1 x# K0 D
    pageEncoding 定义输出流的字符编码,缺省为ISO-8859-1
    ( s9 d+ T4 ~! |0 I+ ^4 W- i" I$ y$ ]; H( q/ a6 X
    , Z3 I! k  f; F! `8 T# u, p7 @

    % v6 {2 T* R+ K+ b! M% @" R描述MVC各部分的功能?MVC的优点?MVC的缺点?
    * e# j) j- W8 a. B& NMVC各部分的功能:
    $ R5 o6 j; M6 m1 Z) N
    3 f! \, g9 a. f9 pModel(模型表示企业数据和业务逻辑)
    , S8 B& O& u7 e! B7 d' ]- S0 o/ e) y
    封装应用状态
    ! f+ z5 T, g9 |. e. N. {$ f$ a9 f- N! |5 T
    响应状态查询& h- J7 s0 D, Y! B3 t

      {9 j  J4 ?6 q# o- Q: H) W暴露应用的功能' k/ v# W" `4 d- i
    ; F' s% K# s! X( G" b, `
    Controller(控制器接受用户的输入并调用模型和视图去完成用户的需求)5 J/ t& C/ q, B" ^
    + ~9 {9 U# O2 m# c, x& ?' y
    验证HTTP请求的数据
    ; i! f9 u6 `. D$ ~) u) ^+ Y
    # `- X4 \7 N+ S1 F7 C2 G将用户数据与模型的更新相映射
    8 Q- J2 ]4 l! M( ~+ S9 s$ q. H# H  M
    选择用于响应的视图' d. B8 e$ E$ a6 m' G+ A$ C
    2 |! A0 o% o# I
    View(视图是用户看到并与之交互的界面)& \( y5 j2 ]) V8 J& m( Q% b) o

    8 f2 Q; \6 e" [3 [; s( o- ~5 Z产生HTML响应: U0 Q# P5 d. }# n2 E4 z
    # l8 K; p$ D+ f6 j) b$ I( }
    请求模型的更新
    7 n$ ]  ]. F5 R' X' t$ @1 v, M( _) h1 M9 t- }
    提供HTML form用于用户请求8 @2 j; ^% X& I0 ?4 m& U
    $ M" z0 a- d! f/ M- J. ~, v  I
    MVC的优点:7 r/ x9 @' |: z9 L9 g( I" q$ [: P

    ; B" i* M  G( |9 B# G2 y/ K        低耦合性:视图层和业务层分离
    / b; u  @$ g. V: J4 v# v  ^# F# K8 ]9 {, T1 k
    高重用性和可适用性4 n3 ]4 N6 g; h. W
    % o4 N2 D* j: D' ]( y
    较低的生命周期成本; e' Z4 i) B! v6 n6 g/ U4 Q
    $ x7 N7 ]& U$ N3 ]
    快速的部署
    7 F9 |. e! `7 d; {) j" q
    ) b* @0 A$ N8 l3 e可维护性
    - R( y! b+ E: p& ~- Q' u  t) y1 C
    - j% s1 u3 {' Y- U7 K5 w, J有利于软件工程化管理
    7 F$ C) A: O8 i/ K& x0 k, Y7 N8 X3 e
    提高软件的健壮性
    5 r2 ~6 L3 M8 A, f+ P5 @+ W& [9 ]
    5 x% @* ^. k( N7 r. DMVC的缺点:3 h8 k9 [) U: _- l6 W
    % p$ A. v8 y, m2 ~1 h8 u# t* ^' I& h
            工作量大,增加工作的复杂性,MVC不适合小型甚至中等规模的应用程序
    6 L) W* b2 s1 Y5 O) j) f) p; U$ O; T9 Z! Q* L1 b' t

    % J6 X  G. c% I6 j+ b! O3 L
    0 |; j1 L4 q; F3 s什么是Model 1结构,以及结构中各部分的功能8 l" i4 |9 I( D& ~( m/ I2 w/ J% a9 }
    结构:jsp+javabean% u3 A1 T" ]! ~+ C: ~
    6 _( p  a6 d  M1 B& ~' y8 [, V
    Model1中使用jsp来处理web应用中的视图控制部分
    & h6 T! k% U- ^# i9 |  X& r# i) P: L/ Y. m' p, p% p
    Javabean收集参数
    % v3 B; ]( _( d. J
    # D: N8 Y7 A) c0 z# S+ J' ^ * @* t6 q( G! s9 i' C

    ' Z) V9 `. O5 W什么是JavaBean?
    9 h* M" Y4 P: w1 b用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。
    $ R" W4 o, ?# ~3 z, H- L% I  Q1 C2 n5 L0 d
    ) l* ~* o( a. L# {9 D, }

      A/ B' X; a% H* U3 h: z: vJavaBean的规则?8 R! h! \; D+ u( ^) T9 p+ l: l
    使用get和set方法定义属性
    7 w- u8 ~5 R; W4 p: Q/ ?* z. e( A, A4 Z* r7 G& Y" u7 c1 P
    一个无参构造方法
    ) r- ~, O& n# T% S) ~8 |5 a
    0 I# J0 J. R  d% Q: q5 X  y9 ?无public实例变量( 所有属性私有化)& S) Y- o' d9 M7 M7 z

    # E5 W& b7 \3 p% j: a
    * U4 ?2 X+ C8 j' f* p1 k; M
    " S7 n; P, H2 ^% X. ~* [什么是jsp标准动作?包含那些?分别都是什么功能?如何使用?) X* E8 M7 X8 v% b$ U9 h& [/ l. J
    JSP页面中使用类似于XML的标记表示运行时的动作# O2 k4 U0 R7 |7 k6 z

    " h5 _/ C. z  k9 Ejsp:useBean: Y) q5 A( E9 ]; {, v3 F9 e
    ! {0 ?3 c$ c  |, F  d; J
    jsp:setProperty# {9 f8 o; K6 G% _
    % d4 P# B: h5 p
    jsp:getProperty
    : Q7 w6 z& G2 G+ D( w* V$ I3 y! n. H6 |" s$ p" K
    jsp:param
    : d5 \* [5 ]$ X( M: l4 Y& x" Q2 S' c9 i& _- z8 V/ `: r
    jsp:include6 R" e& d6 y, \7 g: P4 q
    $ {1 n% ^+ g1 B# f% q3 d" U
    jsp:forward. h( U3 \/ \, z# U7 c

    ) K6 ~' s9 _, Z  X5 D & q- _2 ?- h* x0 W* ~2 `5 Z

    ) U3 [0 ~: m$ z/ I- E/ j, \用代码示例如下标准动作的使用:useBean、getProperty、setProperty
    + Y) l5 r! P4 `2 I  b: P4 K4 G% p) l6 G9 ]<jsp:useBean
    ' E) `8 p+ g8 x& P& s7 q
    $ M5 v% }  n0 I4 Zid=”myForms”
    * z3 `0 \5 }* i/ ]" _5 T; l8 L
    ' m9 n+ y: {/ K3 f' B  Pclass=”com.base.mystruts.forms.MyActionForm” scope=”session” />
    : k: Z. J' i- G! G6 T/ O8 y$ D8 O
        <jsp:setProperty name=”myForms” property=”name” />& r1 K) d8 N8 B$ Z# v

    9 B& v! m5 f. Y' _' x# t* F$ ^<jsp:getProperty name=”myForms” property=”id” />
    1 {" _* c2 i5 E, x& \
    / U- i+ N  a& H ( E* c& B, L0 v$ S7 v# B
      A) e" e2 C; s* P- D- B
    描述说明Bean的四种scope
    3 N- w2 [/ \2 rpage
    - X) V9 X3 t0 T0 ]1 V: D
    ( a4 B# Q: u8 d" {request
    8 \& E) @: H4 t, v; ~- U
    & r2 T% q5 ~' {) l6 ~session
    9 u9 N* B+ [2 j% Y" K7 {+ P& o) q: p8 W1 c/ T$ _6 s! f
    application
    7 w4 W( V+ W8 t, w$ c  N
    9 w# y5 r4 t5 H; l& g * P: c7 _( O% |  n0 j9 U9 B

    6 H* v6 y$ C9 W8 V描述说明页面上的字段和Bean中属性的对应规则
    4 U7 Z" R/ m7 r5 L- Jid 指javabean的变量名4 m/ o3 p, y1 O8 N( {" Q4 O3 S5 z
    6 r9 I' G- y2 F+ |
    class指javabean类的全路径0 b. b* P* M* \, ~

    1 \2 t: L5 E- z+ r1 ~" }' B" mscope指javabean的应用范围$ G8 x+ g. B0 m- f* w- W4 @

    : x" Y9 f. U+ l9 s  Sname指所用到的javabean的变量名
    0 ]3 e5 Q; _) b
    9 W# J  Z, z( z/ d8 O# }    property指javabean中的属性
    . n% z  A5 F* a* f0 x+ N, e$ Q& ^4 X+ K; m7 F
    9 y8 ^5 j$ X% U5 D+ {+ `

    4 K! ?3 G1 H  y描述useBean动作的处理过程
    $ g. {9 m; }1 r  |/ _' P) P0 o使用id声明变量- ]: Y0 b& u: _) Q
    # [4 }1 L) Y+ X" ^" H' f% D
    试图在指定的范围内查找对象4 D" |) i" G1 V0 F6 t1 r* i2 ?
    , _% e9 x( y' A
    如果没找到; f! I, P# }5 J( [! _
    2 v& y) T% V6 d. N! Z4 x
    创建一个类的实例) n: u! c. i, s

    & j4 y0 Z4 k$ B5 L执行useBean标记体初始化对象7 d: [  k: j$ A7 @% w( `
    " e9 e8 t/ {: |
    如果找到
    ) v( J0 ?# ~! k  e, O: U( u; ?2 M( n! B
         将对象转换为类指定的类型6 n& ?! ^) J6 \% `2 {8 A

    , X3 j: u$ s2 W) S: d( ?7 b 5 [3 z5 _. [/ K5 g# V* j3 Z
    : k( [' @! S$ s: L; d) o# g, C
    描述forward动作的功能
    : D6 C+ t# I) m( v9 ?5 E  J使用脚本代码处理请求时,可用jsp:forward 动作产生一个不同的视图,
      E; i1 {+ d. ]" s5 ?7 i* @* s# ], w& q1 [! s- t. a. R/ v; y4 {
    使用同一个request:
    ; T# S, x3 t: p6 O$ p+ g& G% A3 I* l" d" u" b) b3 x
    1 k6 f" f0 T' A; S6 W; e# v

    6 g0 e' l( o7 x/ i什么是Model 2结构,以及结构中各部分的功能
    1 b3 _& F9 N" t# V) r1 z' j& Njsp+model+servlet9 Z+ [* @3 E6 T

    ! n* `  h$ C) K5 \% cModel 2架构使用MVC模式,JSP页面充当视图,Servlet充当控制器* P; T. c; u1 T9 O

    6 g5 r% Q+ f" _) gServlet控制器:: @2 @" Q6 B5 ], k) A& `9 c1 F

    " G# \7 d' J1 }* _3 I6 g验证HTML form数据- h7 K1 ~# j9 W- N' R% t

    2 p$ N6 b  x8 O5 Z2 w. H) T调用模型中的业务服务
    % c# h# \+ }  o9 {0 F* m1 h* G3 E! k2 C, d( L5 c. J# S+ @1 R
    存储请求(或会话)范围内的域对象, T" D5 M  ?8 a3 {* Y. A- z
    ) _' u' V! ~5 p: x  g  P  B
    选择下一个用户的视图' |# C% F* s( c+ X2 i) j5 ]

    3 q, I; [. h6 j- T$ @# kJSP页面视图:- h/ X1 g- v" K* G0 y! n
    . ]+ P5 k- L9 d
    使用用户界面(在HTML中)( d0 d& h! I3 P

    0 j) n' N) m; ~: ^% I' I0 z        访问域对象
    " U- Y  E, q! V0 E2 m) @  _0 H' T1 o5 G& j

    ' x) @. t' }7 K4 l- K
    ! j8 Z+ Y. W8 \8 K/ M  B+ d6 r如何获得分发器?分发器的功能?
    $ W7 l6 `9 ^; y( w- n上下文对象中的分发器:' w. b# j9 v7 Q5 I9 a, O1 b
    6 m3 y5 T6 e0 M# U! K2 I' j& ?
    ServletContext context = this.getServletContext();
    , i/ ~# U9 D! b3 N
    5 `. [" o2 Z8 l: B7 s( }9 VRequestDispatcher servlet = context.getNamedDispatcher(“MyServlet”);
    9 a! o7 \0 v1 P
    / p; O% c" D% c7 O: mservlet.forward(request, response);
    3 f3 y9 E2 Z; M8 d1 A; s; ]! T
    + |' n  u' `7 E& Q9 O* a% u/ {请求对象中的分发器:( c" ^6 z" n/ \. b9 Y

    3 U& r( O, w  h4 F3 {/ hRequestDispatcher view = request.getRequestDispatcher(“tools/nails.jsp”);" W; {$ Z4 n. _9 \+ F3 l; M# [7 V) U

    7 d( m& B/ _1 f* t  @view.forward(request, response);6 F1 Q; H1 }8 Q$ o! N; ~

    2 @" x1 R. n) i! C* o# g3 n3 B可以将请求转发到另一个jsp页面,并保持请求的传递性
    / R0 A7 B" _, ^3 B$ Y  M, `5 r/ ?0 Q6 p" P! _1 W
    8 B4 _; t1 v2 Q9 V$ [& ?

    ' I) i4 A0 m, wJsp中页面跳转的两种方式?
    5 b' I, e$ B6 S, ?使用分发器跳转页面( I  l. J' S. M2 U
    RequestDispatcher dispatcher = request.getRequestDispatcher(“url”);
    3 g: y$ W$ r  D
    0 `9 m+ c5 A& x- g9 ?2 idispatcher.forword(request);- w, {: R! z9 @2 x( E

    # `2 [3 @8 y/ S/ v, {: w* u) I    特点:保持请求的传递(上一次请求中的数据,在下一个请求中仍然可以得到);
      p3 G& r+ J# l) @* z; a, j/ F. B
            转发的页面只能是同一个Web应用程序的其他Web组件
    ! D* H: @: F# f* |1 a2 J# x4 j( E! n" Z2 q% h" p& O6 P( }
    使用重定向跳转页面
    ; i$ @! T0 [1 X4 y  F2 r. bresponse.sendRedirect(“url”);, f9 F1 h5 @& B
    6 A" `3 t  Q) U5 M/ E7 s
        特点:产生全新的请求,(上一次请求中的数据,在下一个请求中不能得到);3 `* V" S& A3 O/ n
    6 [1 O- V" |: Z3 O' P0 i% |! s
            重新定向的页面可以是任意的URL
    * W8 G5 a! A6 {& E" N1 @
    : `5 g: I9 U$ E8 Y' E 7 F; X7 ^% z1 I( ]) T9 y
    " P! P1 t$ U- ~& f/ L) _0 o7 k
    描述Jsp中引入另外页面的两种方法,并比较两种方法的特点?
    % X( Y& ]. }; T4 A, S2 E( v7 J<%@ include file=””%> 在编译期间把另一个页面完全嵌入这个页面,可以说是一个页面
    + ~2 G% A0 ~9 r1 C6 y( Q* K
    1 G7 @, Z8 O3 o4 o/ K' w在这里可以共享变量, E+ {$ t: n! G0 [4 {
    / Y) t' v+ S( M+ O- M
    <jsp:include page=””> 动态的再运行期间把另一个页面加入这个页面,可以说是两个
    5 c  D9 o+ |' ~; y8 t- I- _
    6 y, a+ C) o' \+ _  G8 o2 Z6 V页面,不可以共享变量2 P, |) i& E2 _$ p$ u

    6 u/ s0 N8 j2 G/ a) ^  W. w
    ( b5 e3 X" `1 o5 o! S$ M' G
    ( L2 e5 q% Z6 T5 b% f什么是自定义标记* |8 {! b; @& |* N, _# C- R
    自定义标记库是一个Web组件,
    ; o8 z2 I5 J+ k+ T: ~
    , f0 O, {2 S7 S6 E( t包括:- e$ z8 |" X+ @
    & F: J6 D0 R1 z5 `7 @
    一个标记库描述符文件(*.tld)$ }! @! `  L- @& c
    0 d- ]1 Q0 I% V  J2 D' i
    所有相关的标记处理器类(*.jar)
    # c- f) T' _" o$ g- c: _0 D) I. l
    " ]* u$ M$ L6 w1 f. n5 A6 ^5 v
    1 B; ]* ?& ?. f) s, Y
    + }9 y/ E, h  G( s描述使用自定义标记的步骤,以及每步详细的工作
    ' F, u- I" G) a- V, x6 Y使用自定义标记前,要拿到.tld和.jar两类文件& Z: e3 c6 c2 m: I) n2 m/ g# _! K
    8 B+ C+ F0 A, I1 x- `
    把.jar文件放到WEB-INF的lib里面。
    9 d$ |9 D8 h1 n! F2 \( y7 ?! I3 O把.tld文件放到WEB-INF根目录下。
    8 t1 |" }( M  |- r4 a在web.xml中配置。
    ( [8 ^3 C8 o( P) |<taglib>
      y% V  ~1 r; T7 s
    ) x2 w5 l( ^+ c, p<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
    : G3 Z( Q9 K1 {4 j; X/ f  `
    - I! T" x) V7 s8 a' A* n. [- o6 k     <taglib-location>/WEB-INF/c.tld</taglib-location>8 o4 p; J+ G/ K
    + J  H9 c8 c" e* c( w* T
    </taglib>& L$ Y( q6 t: q

    0 s  @0 s' K1 f/ f% t- N; Z在页面中引用。
    # J% E2 p7 R; @9 ]0 Y" a. n- k& l<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“s”%>( n; @$ g/ o% f" I( a9 z5 @+ L$ F
    % Z) g4 U$ s7 w: x) }! U6 i
    uri必须与web.xml中的uri对应
    ) I+ w- \% w4 {% c" N4 f0 `' N$ I8 v1 `; S9 U) w6 u- o
    prefix是前缀,用来区分是哪一个taglib
    7 v! X6 u2 L+ \5 R6 S( L
    $ n$ _% x, T) O使用标记- r5 y- l- o& H& t+ Z. ]- m- l
    格式:<prefix:tag名称 属性>6 s  l8 X2 [. Z: s

    5 ?0 \# H! O# N+ c<s:forEach >
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    14#
    发表于 2014-12-03 12:45:59 |只看该作者
    在tomcat下配置数据源$ N, P. ~* c5 }8 M
    1、服务器与数据库的连接( G: @: I2 d6 Y, \' L( n
      m, N* U8 b6 o
    配置server.xml文件9 v. O5 J( n4 Y4 H/ X
    8 h# O1 w4 a' p) Z
    1.oracle( D0 {7 b: \- N4 H5 k2 [. g

    8 ], B5 }8 |4 ]3 Q' i<Resource name=”jdbc/company” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”9 C* d( f& U' s* ]6 q
    + V  k$ T! Z) _3 q5 v1 d
                            factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”
    ) x+ P) |# u7 w# u9 ]
    ) _% \* s4 A" G" _$ A4 P) {  n' Ourl=”jdbcracle:thin127.0.0.1:1521rcl”! H2 M- \0 q) S1 B

    3 T; e5 ^$ x5 Q9 C: [8 Y9 PdriverClassName=”oracle.jdbc.driver.OracleDriver”# }+ E- _, P; M1 S7 w& k
    8 _# D' S3 E% z& Q
    username=”aa”
    8 s4 _! ^- V; Y7 l) z. E  f$ v/ P( g9 g( [
    password=”aa”4 A; f2 k. c" u( M* \7 }$ ]

    % k) j, G; u) Q2 u4 x  I! DmaxActive=”50″) ?* A. u7 M, Z8 ~0 y5 P0 l

    9 K: j! X: @7 nmaxIdle=”10″
    9 k2 R: W# H! O/ @8 L
    ( k; @% e% A0 c. ?  xmaxWait=”-1″  \" j2 L# Z. y6 Y0 O
    6 H: _" I3 r+ x
    />3 {; t) ?) a8 E1 y5 w/ P, Q2 M
    * G2 N. S; a8 L$ J. M9 e* |
    2.sqlserver) E$ P5 T8 I- [7 `3 B2 Z$ u
    7 _0 `% l$ q8 k( `+ F( ?$ |1 H
    <Resource name=”jdbc/webpage” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
    : p; O* g9 M% g; i5 V
    ; I0 X7 o  G9 V5 x: M  y# t        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”
    % q* T+ Q4 }, U; ^5 Z( V
    , C7 k4 e2 {! p% P9 uurl=”jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;
    7 J0 U; R$ [7 T1 g* e, \
    ) q8 z: d0 L; `/ r2 xDatabaseName=webpagetest”; N- c; f7 M9 e' o) B" q
    4 E( n6 P( c8 m3 c$ n
    driverClassName=”net.sourceforge.jtds.jdbc.Driver”
    & x5 R) e5 a9 [0 A* |
    & y# A5 p7 U0 c: Susername=”aa”
    6 Q) r# X# [: V. E! l$ }) N2 a( B) \1 d3 X8 l
    password=”aa”
    5 A  ]+ o1 C6 G- ]
    4 o# w0 j8 Y! u6 X0 `0 G6 d0 DmaxActive=”50″
    7 E3 K$ g6 o3 C) n9 k% g: m. M  V; h- F$ e2 g" o6 b* ]
    maxIdle=”10″* A) D  K6 _# S, p3 ]- g2 V

      Q- {  G: V) ]4 z1 I7 t" w2 ImaxWait=”-1″4 c- S. k9 L  g3 h' w8 y$ L7 S! G

    8 Q) ?. Q9 K; u7 Z& Y8 j3 x/>
      W* ]# K; ?0 ?" m) b) W' B. y# _( ?4 N
    2、配置自己的web应用的xml文件
    , ]% W5 [: W5 W
    8 l1 k; e( i7 i( H5 U 9 g) j5 t0 K& P( P" {3 p
    7 l( _1 z5 g+ \& w/ g3 c$ c; Z# `
    <Context path=”/eb03web” docBase=”F:/workweb/eb03web”
    3 }/ T) ]  P# c# S; E; z3 p, o$ u, V! D% k4 P. p
    privileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>
    $ A, r" ~# g9 q2 Y! H/ P0 n. y* x2 p& ?
    <ResourceLink global=”jdbc/company” name=”jdbc/company” type=”javax.sql.DataSource”/>  J5 V  r# W0 h1 s4 Y0 H
    * e5 L$ P/ _: A2 ~  E: p
    </Context>7 G2 {6 Q% z. B" I

    % C, ]: |" C+ o4 a5 h! l& M 3 l8 T* h0 q+ C' }

    7 e' g; O; V/ l/ B& w3、配置web.xml文件9 D4 d3 |' M9 A& t8 w2 s1 Q+ `

    7 X7 Z9 a% v# `5 ]. t( Q与服务器建立连接$ h+ T+ |1 D/ G3 u+ q

    9 _+ h' q& L, N4 _- l* J<resource-ref>
    + w) i* y2 w' r( t; Z3 \, ]# W
    $ u* w6 @; o" {" W* J) a. M<res-ref-name>jdbc/company</res-ref-name>
    ) {; k* v1 m( ?+ `" _: Q
    ! Y& p' E+ p( u- v. ~, c! S5 Q<res-type>javax.sql.DataSource</res-type>* H( x* H, a- h6 c) ^* [# Q: y

    , E8 M$ K5 I$ Y8 A, o: _<res-auth>Container</res-auth>7 ^! q* L  f+ z) r
    . N0 ~5 g# c$ @3 v0 ~1 |# d
    </resource-ref>
    1 _/ C+ I' @6 |: b5 w" Q" |
    1 R; f; m' l7 ]: A8 g4、在应用程序中不直接与数据库连接,通过DataSource连接池建立连接* ]% M5 e' B2 r, ^& K

    8 G$ y& R/ V; P2 c9 C( a. R//1.在程序单独用时设置系统的属性,在tomcat下可以不用配置,
    & y8 d% T, }, }7 K4 e1 ?! a' Q- [& K9 k! x
    System.setProperty(Context.PROVIDER_URL,””);
    3 Y7 I3 v) R( c* |2 {  C. u2 E- Z# i$ @( d1 f
    System.setProperty(Context.INITIAL_CONTEXT_FACTORY,””);
    ) {9 ?% l' D4 ^6 ?+ d$ Z' D: E, n1 M7 o
    //2.创建一个上下文对象6 |) e$ E% [7 o: b$ X. x' V2 B
    7 X6 W% w+ |. y3 u6 y3 \2 A! u/ u
    InitialContext context = new InitialContext();4 ~" h5 D  C& `- f
    + J9 @+ q5 j1 W3 n* K1 G* ~+ L
    //3.通过上下文对象在连接池中查找DataSource! ]5 H8 i, g. ]+ L. g
    # F# _+ P8 N0 }/ h1 g( Z' g
    DataSource ds = (DataSource)context.lookUp(“java:comp/env/jdbc/company”);
    3 c5 X$ C9 b2 {$ F( Y5 ]( S
    1 w$ i( q6 B+ I7 H; N6 W4 ~' U! s//4.通过数据源建立连接  x: n8 D8 {7 u+ m0 e% u
    7 X3 A1 v( w2 |* ?5 a
    ds.getConnection();
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    15#
    发表于 2014-12-03 12:46:30 |只看该作者
    ORM对象关系型数据库映射$ w% |7 p- z; L9 W0 V! a7 E
    (Object Relation Mapping)
    , C* ^: u  \9 x: ]' I( Q: x
    4 p8 L& l) n  {. U% l; V一、映射的特点6 {% m9 {; a( i  ~

    & l* G7 P. D- i* j& L1.一个对象可以对应多个表
    * B! ~+ s# t. }0 d& w6 r
    8 t" r5 P; m/ A& T4 O2.一个表可以对应多个对象
    9 F% g+ c9 }4 u( v2 T2 z+ R+ k
    * o6 h, k. u1 L5 v; z: t3.对象和表的关系不用完全对应
    1 L" j" j% ~2 o3 _; @2 q( O
      ^: r- r. C7 R8 `4.对象的属性的名称和表字段的名称可以不同! b, {  y$ p) q0 ^% m0 U0 t
    , T) s  e) S  F; l$ v/ v
    5.类型可以不同,但数据类型之间可以转换! M/ ]. Z4 M1 h

      B# N# `4 l4 P5 N# H6.对象中必须有主键,数据库的表对主键无所谓, L, F: o3 |1 |' G3 u3 y

    # i0 m. O8 T4 y- b% ~/ J( v7.数据库中有主外键关系时,对象中可以有,也可以没有
    - e! z$ w. j- y0 ]% ]
    ) M  C. V& A0 R1 W- w5 C& b3 }
    : v8 q' J4 J9 T1 ^) I& }4 f# A, H- {  {0 y
    二 、有一个映射的描述文件————>xml: v6 u4 S3 K6 w3 [' O
    . {2 x, I8 q+ Q% V
    三 、怎样实现描述文件————>一段程序8 R2 N; h. y( u
    8 K6 P; b; S3 i0 k
    对象 映射(mapping) 数据库
    / C8 v3 L# h6 |  W% t) v( r4 l: H5 G- F/ F/ \; [  F
    user' [0 @6 R% C1 ^! |% {% b1 g

      `( x1 j2 C/ u* P, Fid=11, |$ z1 v4 x8 {0 ~; A' F' D. r
    4 s5 F$ o5 A" |3 i- G; u) |* ?
    name=”张三”———— > (1) —————> tbl_user(id,name,age,tel,address)
    9 L3 E7 z! o4 E4 D
    & H" ^6 O1 m# C; w5 v& Dage=25 <————(2) <————) H" T0 }' N( ^

    . Q+ R. T& h* _' X& {, J
    % }- d2 P7 m, i* f/ d$ E3 [4 O
    $ I, c+ G! a+ }8 M; `7 r(1)从对象映射到数据库! I3 V- A7 D8 ]8 n7 f8 T
    3 W1 [' ~( d7 ~: ]- @% Q" G
    1.JDBC
    5 M; l5 x! O6 @3 h# E( C% q/ [) t/ k1 J
    2.根据描述文件来动态拼接sql
    7 d7 ?0 @& _, s% O5 U* L% O
    & X9 h! s, Q, F8 m- ~  v3 Q3.执行,添加到数据库中
    / E8 ], N6 e' S! m8 A0 Q3 t. q0 H" I7 i* G8 R8 l

    9 E1 b5 F, A/ r$ E, {& r5 q7 V& R6 i" {
    (2)从数据库中映射到对象
    & r* O9 z- s* w3 Z! I% M
    % a9 X+ h% m& _8 W; @5 b' n1.JDBC
    " O* }( R1 w4 X7 R% p
    $ `8 a7 r* ?$ k: ~! \( c2.拼接查询sql0 |- R2 I: j( R! f" Z9 o0 b: T

    9 U5 x. c  |1 B% C8 Q$ s5 K3.ResultSet# D& j' T. Q* U8 i4 U* E  d, g- D
    . q6 U/ B2 T$ Z6 t0 W
    4.Model
    ; t8 y/ _7 D# S) O
    6 T- }. x2 L/ Q0 B- n. }4 f 1 o% P# `) k; o+ v

    4 v1 ~, K' J; H, ^hibernate
    ; b( C- v  _& a* u  @% B开发流程:
    5 }4 N5 P0 l4 Z- t( T  C6 P7 ^. r5 u3 ^+ p% ]
    是什么?6 W1 d: }% I+ }# u6 [, S' O! Y
    hibernate是一种基于orm 的轻量级的框架2 m: P' ^1 L& R/ [0 ^' \5 Z2 \
    7 b( w5 @: M- J( q1 Q
    8 j' t/ O. u7 n' r8 x

    ) T) d; H9 {1 S/ v0 G有什么?; x6 k+ j3 b# P, V) \- c
    1. session 保持连接状态(依赖事务和连接池)
    9 y7 A( j) x, ~& P. K, d2 e+ t9 K( v' y2 Q' S! i; \
    2. Transaction事务
    " w- ?6 w1 U3 @, ^  L. H- U  s: N+ _
    5 b8 H; F6 K8 \  c0 f8 ?3./ Q3 S6 ^' P  C3 s0 Y( Q
    Connection Provider 连接池
    7 @* j0 A; ?- v7 k
    5 C5 z. f  I: G
    . [# O$ w  p5 J6 F* j% L0 R0 W; c0 B3 D  Z# Z% q
    能干什么?
    % l: R* j/ t6 D) f1.orm' m! S8 i& ^8 I9 f! M5 q

    & w* ~8 z( e1 x0 L  E/ }/ q2.提供操作数据库的接口,简化数据持久化的编程任务9 A2 @, J$ M+ y# I' Q' c

    4 a1 d$ r" D4 M- ~+ J5 o5 q" g
    & R; n. {6 o' N  u/ ?6 T8 Y+ v' `7 T5 y; V) N% e
    怎么做?( W: k/ ~1 h! S7 L2 w  X
    1.搭建hibernate的运行环境,将hibernate的包和hibernate所需要的包拷贝到lib 文件夹下8 {! c7 s% f% n+ q0 _

    9 g6 F! q- ^# C2.O(vo)
    - T0 O2 G/ v' G: o  Q6 L1 `
    9 W0 ~! _! o5 p" U6 n, p* e: P* b3.R (关系型数据库中的表)
    & y/ F" {& G/ l% Z4 D9 m3 z3 ]( M+ Y3 n. N9 Q0 A. i0 N
    4.配置文件
    1 y' \; t: o# D" n) I( F
    ) N5 _2 `; _% @) W: X- A4.1 cfg.xml 放在classes根目录下,默认名字为hibernate.cfg.xml; D' s5 }7 A4 h( u
    7 S4 T# y+ ?  I" u  ^# z  w
    a.与数据库的连接
    ) W" o: i+ f1 p* d0 ^4 o4 l. }+ o0 a# R; I+ \
    b.可选配置$ d# l' D2 x9 N" N' D

    - n7 Y" @* ~/ R5 _( Gc.映射资源的注册8 `2 u* K( s0 I) f, R0 T
    ! p8 W6 D5 @2 n5 f7 H0 r
    4.2 hbm.xml文件 名字与类名相同 并且与类放在一起5 \$ n# m& y" a& I
    + }& T: x! |8 [* v9 q: f
    a. 对象与数据库表之间的映射# ~2 s& ?6 B) z* b
    3 G  y; h  `; v- C- V
    b. 对象的属性与数据库表的字段之间的映射7 h# I$ s& w# I
    " c) x0 Q( p$ q! _
    c.组件之间的映射) r4 A- ~: ]+ y" i. g# U+ {
    ( }- a! I. k3 F$ b3 v
    d.对象与对象之间的关系映射; Y" U* X2 f' L3 J- L7 w. S* u

    # S# Q1 t# S' D6 \5、客户端
    % _1 K4 [! }) |5 v' U- Z8 K/ U( }
    ( O+ }- D! x* u$ b3 f. M2 L: \  t1.得到SessionFactory) M( b& n8 S$ D) z6 [  M7 e% o

    ; M  K% D5 x% N2 S' e' V2.通过SessionFactory 工厂来创建Session实例0 Q% B! n( R0 ^- {' {5 T

    4 |6 e% b1 N' P( M: P3.打开事务
    / x; {# U, F# t8 u+ L8 M4 k+ C9 `8 c5 t; t+ `' h
    4.操作数据库
    + w7 W: x( O! R/ `3 j( G/ s/ u6 X1 y* I* ]% T
    5.事务提交
    - p* U+ L) h* L, c8 D$ T( v$ r% M' m( K4 D
    6.关闭连接, f8 N, k; W4 @

    # b- U2 d5 ~: S9 W5 N0 j" R运行流程:8 h' K9 W, n/ B) O  P& g' q6 f6 o
    " C9 a4 D. e6 G
    整体流程
    5 A1 \% c6 v6 b9 g; m" d9 w1.通过configuration来读cfg.xml文件
    / x; H8 O! n* r% w' r2 K2 R# u6 y( V, V- c" w6 R. u, B' X/ I
    2.得到SessionFactory 工厂(根据数据库的连接来创建sessionfactory)+ G3 C& `, F0 w  n" f4 v  z- A; E- W1 b
    & V0 |3 n# E' |6 i
    3.通过SessionFactory 工厂来创建Session实例  ?5 ?: c9 X4 m( Y$ L

    0 V: N; v4 @3 b7 ?" h; n$ w4.打开事务
    % g5 C& t/ y1 g7 Z* x* D5 y% G3 l- A/ T  h
    5.通过session的api操作数据库% J1 f6 [$ }: |: y1 G
    : l! P" Z' ^2 L, i: I2 _! v
    6.事务提交5 c# f( G' X" m& y2 w; T
    0 k/ @; R0 z# s, P
    7.关闭连接
    6 h6 b7 {+ e$ c/ C
    8 \6 M( F+ V9 Z6 r* [+ N $ J) W+ _, `" @3 {/ D+ D
    " w4 R! Y! j- z  I0 C
    save
    ) S: m9 N2 M' y( @* `1.to—>po
    8 [( p" d! i, U5 {& Y. G! Y& j7 s+ X' u& M
    2.根据model和cfg.xml中映射文件的注册来找到hbm.xml文件
    ! }4 |  u2 z; I! M. Z
    8 K3 x8 r6 ]9 z3.根据hbm.xml文件和model来动态的拼sql* h! c+ B% w8 g$ P4 x' H( i
    8 l. F: W2 c; N6 b1 `) C/ E; t
    4.客户端提交或者刷新内存+ @+ v& x! N+ Z2 R; G( _- V. s
    ! V1 D) _6 C0 _, R7 }  Q
    5.执行sql,值放到数据库5 J  [3 T2 e8 q  _" y+ t! m

    , y/ Z' T( k& A& M9 D
    3 u+ \0 \* Q  Y7 |6 b* \' ^: j0 }- a# x
    update、delete. @+ F+ p$ p3 s7 y1 x! }
    1.根据model 的id在内存hibernate的缓存中查找该对象+ ]' t& }: x# |

    , u3 `( L- G5 t5 P- M0 i% v如果内存中没有就到数据库中查找来保证对象的存在
    & C- U4 v9 K- o2 R
    ! B( `4 G$ o# g. X! x" m2.根据model和cfg.xml文件中映射文件的注册来找到hbm.xml文件( S9 q* ~3 ~% D9 D: n* F7 Z# k

    & r6 @4 ?- y' Z$ l5 U4 i7 L3.根据model和hbm.xml 文件来动态拼sql; I- `0 F. B. N: K! }2 T' w
    6 h0 H* ?: }. [% I% p9 Y0 x
    4.客户端提交或者刷新内存
    ) P$ v; G4 E7 U1 p2 p9 m6 w3 D3 {' h" d: ?
    5.执行sql  d+ b- g" V$ o$ Y/ t
    6 J8 E; r: _: X' p. J1 R
      M( J- E, Y. K- v
    ! Z) g( y  i8 T' m6 P, U  r" e
    Query
    " f9 b: Y$ o* o+ T% rload
    ; _. C# Q$ L# h
    5 C6 R7 {2 i! w7 p: O1.根据model的类型来找到hbm.xml文件
    ! R3 {8 x- N# I3 M% K7 A! `3 o- m* [# s; p6 V8 E' g
    2.判断id对应的对象在缓存中是否存在,如果存在,就直接使用,如果不存在就进行下一步。
    . J& q  i6 G$ m4 O9 g( b% G, w" D4 h  G. A$ i
    3.用id做为查询条件来动态拼sql/ _* J& V' C6 A8 f2 R

    ; y3 I* z& Y: E" @% s* a4.执行sql 查询(先在内存中查找,如果没有找到(会抛出例外),就去数据库中查找)
    . a$ h( Q- r% P" U+ @& Y4 N. K$ _* V8 \+ R
    5.返回一个model类型的对象
    $ P8 y. Y3 c6 N* Q! p, k2 L5 p" i# j  A9 g
    get: N8 Z% C7 \8 F1 Q( T! B
    8 r& |" _- F! M$ q, u8 e
        1.根据model的类型来找到hbm.xml文件
    / ^" u. z& X+ E8 ?1 h- |3 f7 p' B% _" P% o- V. x- J
    2.用id做为查询条件来动态拼sql' H8 q! {& `, Q! m; i# |2 P; p: H. u

    , d4 \: A- h8 Y3.执行sql 直接在数据库中查找,如果没有查到就会返回null! X7 V  N7 m( s: Z; n

    ' s) k0 W3 I1 b8 N) _query
    / _' d- ?( f$ F2 v& h1 h( j
    " p) W  p" x7 J: L1.分析hql语句,得到model的类型6 R0 d- \& z2 ~/ `2 M# u

    7 H+ I1 \& {3 _% V. ^2.根据moedel和cfg.xml文件中映射文件的注册找到hbm.xml文件
    . q9 j: @3 Z9 w3 ?7 w1 d% i! Y1 z* H: T$ Q* J1 G
    3.根据model和hbm.xml文件来动态拼sql; X& A/ Y, s( T
    1 h1 i) O* N' k0 g& ?/ T/ k
    4.执行sql查询数据库
    " s& ^* V% a5 z
    $ s' @6 x& E! a; {, a5.返回一个resultset! Z5 n% q# L$ m0 r- L

    1 Z1 B% Z$ q2 S% |% c' k" Y6 j6 p6.循环resultset的值,放到model中在放到集合(List)中; G/ D, l/ Q  w( V
    8 L8 F- m/ Y1 g0 {* d
    5 {) q: x* z$ T5 A

    # y0 p0 F# _' S1 J谈谈hibernate缓存机制
    / }5 v( c* |& X2 a- a' ]: i6 W) T  |% D* g; [5 d
    缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了。打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去数据库中取,也省了很多事。
    , ]# ]: o3 X  n& l% Z  d8 ]( i" S
    7 y: L# x- a* ^5 x
    . S* I# m- n5 C* ]. p, R; B
    hibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。9 t  d& L0 o2 z% F& e
    ( w* E. k0 M9 U+ o
    6 ^5 Q! M1 H3 T( L$ T2 y- b
    1 B5 ?3 n; l! L* V3 d
    对一级缓存中的session事务进行数据的预存取,数据在各个session的上下文中存在(单例),当session关闭时,就是session.close( ),整个所有session范围内的数据全部清空;二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二级缓存只有一个区域 ,画个图比较容易理解。" c. h3 N9 k/ Y8 }& {
    & O0 y+ P5 h3 l6 \! c+ i

    0 ?; T4 U. S! i
    $ s$ b3 E& ]9 E" e| 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|+ I& b) e% ^$ I6 q) U  O

    : a# V& p1 ?6 F# v) h2 v3 ]# O| | | |9 h& g- G: _9 H9 O# A, a, P

    ! @) d5 {6 _( m| | | |
    & L" t  `2 U' j1 e7 n
    $ @/ w9 B8 s/ U$ O' d4 I1 [—————————————————————————————————  p8 K& g" U7 U  ?8 h

    * ]% O9 }" Q( C& M" ~9 @3 {& vsessionFactroy级别的二级缓存
    2 j1 `  F% i/ y. V  |3 t$ }4 [# N
    ——————————————————————————————————————-
    ' w: O1 [: P+ N- ^6 \; B! R5 L+ h- n3 n/ |" U: M0 R
    |
    0 l" }( p6 P; K" v) B$ t/ e5 H$ ^1 g+ D% u/ ?$ Y8 E# C6 O
    |
    0 N3 [: S" y) q" ?: g0 K) N# y, R6 n% h8 N+ h9 e* m
    |" U9 F# r* g" d' u; V4 D
    ' |6 t0 R6 L6 A" e
    ——————————————————————————————————————$ l8 {3 g1 s; d8 ~. @' T
    * U' k: A# s$ P, b* |  t' _
    DB" W$ b" t+ J4 A2 Y7 A  C

    . X4 L' b3 G& Y1 ]' `$ F—————————————————————————————————————–! ?* i" r. g0 V$ \  b4 h2 Q
    3 Y( w7 X2 x" @  t7 u2 f6 e
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    16#
    发表于 2014-12-03 12:48:12 |只看该作者
    Spring3 m: d5 E/ L. T5 I
    • 是什么?
      . K5 i  R9 J" A6 A/ ^* [3 ^

      8 }( t- O. u! c# ^3 r; C

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


    + R+ W2 T4 U  c2 J9 J8 b' l+ |
    • 有什么?
      % ~! Q4 o! d* M

        l. T5 ~0 K3 ^. ?3 V5 }' e. U
    6 \# W( r% j4 a  s9 e

    每个包的功能:

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

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

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

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

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

    AOP :面向切面编成

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


      f* |$ ^$ r4 ~- ~
    • 能干什么?1 f2 n+ l& a7 u+ D5 w$ |) z& D

      3 P8 z2 H& g- j: Q: i6 U

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


    + ?0 s8 x# t& ^- g
    • 怎么用?
      8 }" k% D. [+ n
      ; b% M  ^: g( a. y% N0 e( C6 w4 Z
      • 搭建web工程,引入spring的jar包* y) m4 D# P1 T0 ]
      • 在web.xml中添加如下配置3 V. T: W! ^: I0 i( ^+ A2 X  M
        & S6 x! `; p& j# }- e0 M3 ?; j
      # j( _3 R' P( h9 z

      ) f3 {7 Z( ^" s* Y3 L

                contextConfigLocation  _7 _9 G( a( q  ~" F& U* k

                classpath*:applicationContext*.xml
    " O0 ]5 r; N3 V4 r, j

       
    9 q4 a! R; c& e* i/ V- \0 [

            / I' j# Q1 C+ G( Z) p

                struts20 Z- J) g! ^: _4 a( }, j5 l$ P1 p

                . H. U; d8 ?5 P% G7 a) `8 q9 Z% |

                    org.apache.struts2.dispatcher.FilterDispatcher
    ' d7 `" b" [" N2 w

                
    % b# |; F" o8 @8 D( y2 F

            6 L$ X- @7 X( [& B+ z

            + J, C) J' @: e3 V

                struts22 ~$ \- I0 h# _' H

                /*
    6 O( p4 m" @- X# J

    ) U# D: L9 }* w

    0 Q8 ]9 k4 s' d

                - b6 A$ X# A* X

                    org.springframework.web.context.ContextLoaderListener
    ! I/ H  r6 I* O& h4 t

                5 t, p+ m7 y3 T" @0 W# ?1 i8 @' ]

            

    • 部署4 t% o* m- \# N& _. I$ d6 l

      5 }5 [2 d$ F% ~
    4 I- B$ }& c1 g4 c5 R0 F) q  O) x
    0 u7 R& B# U% z: }2 `7 \+ C
    ' L7 C# T* g' D, F$ w" V
    • 容器和bean
      # I- S& t& k) O' I2 H/ y# |& @# S- `

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

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

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

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

    9 o$ o6 R+ u& q7 ?2 T: I- e- ]( g  r
    • IOC控制反转; m" V: L) g: O

      / I% Y& G" f; l( s* H- V; C1 s* k
      7 h8 }- V' W3 F. U1 ^: d" E

      / d. U1 u. }5 S& K5 h+ k# D: j
      从前的应用程序想要得到A的实例他会直接主动的去拿,当用了sping后,应用程序由主动的去取变成被动的等待,由spring来控制应用程序所需要的对象
      " d( {0 G( p& O2 i1 x5 \
      • IOC的优点1 ^5 f& P, R1 t
      1.可以通过IOC来获得实例
      2.可以通过DI来获取注入的资源
      • 配置IOC的原则( D1 v* Y3 Y# z( d
        • 一定是可变的资源才采用依赖注入
        • 一定是层间的接口或者是模块之间的相互调用才采用依赖注入
          ' o" F0 `& J# B! ^# d
    . _% S3 J  ~5 O5 \) F% o6 p
    • DI依赖注入
      5 j2 E6 i0 e' N" b! e

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

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

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

    例如:

    在配置文件中


    " S  l0 ~! a6 ~- W/ c% n8 O& {. P$ D* W! r+ d
    / l/ Y- [6 [. S6 a$ w$ K0 s+ K

    在应用程序中

    Public DBDAO dao ;

    Public void setDao(DBDAO dao){

    This.dao = dao;

    }

    3.构造器注入

    / @& U& f: |5 E0 H

    4.ref 表示参照其它的bean

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

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

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

    6.lookup注入

    7.singleton

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

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

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

    8.DI的优点:

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

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


    4 t6 Z5 b$ [7 x3 {* S
    • Aop面向切面编程5 r0 U  n' b% P/ b2 p1 x
      4 e0 ]- H4 z! E* @3 l

    1.AOP面向切面编程 一些较好的模式或者是示例—-范式
    % L$ u  J- E2 m& W$ S1 x& s3 u2 l8 g

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

    2.AOP的思想: 主动—->被动(追加功能)/ b' y5 u2 h) q. D

    3.AOP 的概念0 F9 M% f4 M1 U: C

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

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

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

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

    5.引入 :扩展的功能

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

    7.aop代理 :实现机制

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

    4.AOP的事件机制
      d  l3 f! A  @$ u$ I8 ^5 @( T

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

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

    3.找到切入点

    4.确定连接点

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

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


    ( A$ B7 U2 i, u& s% L; W) F/ Y0 @/ ^. O2 J5 T$ l
    4 X- z$ |/ G" L, w' M
    0 E7 T5 c  A+ E8 o. D

    5 P: v) p& Y# S. W  ?, b$ d
    ( U& d5 a7 ]1 U, i0 d2 r1 ]4 n& M  Y  X* e7 P) m$ N

    5. AspectJ
    0 X/ s/ x! t! p, S4 z) t

    5.1.在xml中配置比较烦琐/ l. \6 F( u8 ]1 W5 K; \

    所有的入口必须从一个代理(ProxyFactoryBean)开始3 \) _3 e$ V: x% L5 I- U


    , }2 r, Q2 j! g; [
    5 r8 C/ ]; B$ y# o  r1 c+ e) G

             & o+ e' x  ^2 M8 J3 O, z# Y

    ( o1 m$ P: L' y2 C) Z
    0 d+ n- l" I( N  w! d         8 v# Y& }9 o0 u( N: w9 N

            
    + P, F0 I" p0 i$ \6 U

            

    3 f$ g. F2 `1 W& N
    expression=“execution(* com.javakc.aop.MyTarget.t*())”/>
    , ?7 c& }+ ^$ N( r8 F. p

            
    0 V/ o  p" h* [, l( t9 O

            $ r+ d% b$ I0 {7 ]. t: C

       
    / J" i: r* U8 `! ~& v; [+ z# H


    ' B2 O" \* l# C0 I3 v9 V' z9 o! W' C* @1 @+ p

    5.3.使用注解的方法相对简单" ~7 M( @2 A2 h1 S4 R5 ]

    @AspectJ的基本语法; }* p/ O; `+ p, H. b

    1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面
    ) S7 D! [9 N. ~" v; r

    直接在类上定义@Aspect$ g9 d$ ^4 z5 _$ T. M. Y5 R1 D

    2.@Pointcut声明切入点! R8 V1 T) R0 x3 |2 y* D

    2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字
    0 {  T* W( L! P8 v& ?

    2.2、可以使用匿名的pointcut+ ^: b; F. M$ Z- |: I

    2.3、执行切点的几种方法# i% m6 E8 O( b: o1 t9 ~

    2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法
    ' K' M; Z' m/ @

    2.3.2 within 指定到包,不能指定到类
    + i$ S* q% w* i7 u* u

    within(”com.javakc.spring..*”)
    6 A9 h3 Q4 m  F5 J& s

    2.3.3 this 指定到实现接口的所有的实现类) y% h6 _2 k6 M4 ?

    2.3.4 target 指定具体的实现类( _9 b: O6 d4 e, v8 p; f- v# _

    5.4.advice的五种类型的示例
    % r3 W, U- c" `/ b4 {; `% {) Q

        客户端必须从接口走才能得到监控,实现想要追加的功能7 g# h+ I' T) U' U1 t# Q+ h

    5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)$ z8 h7 \3 }# z- p/ e7 d  @6 u

    追加的方法的参数名字一定要与retrning的名字相同1 m* p9 A9 C3 Z0 Q$ t: Q& `# W

    在注解@AfterReturning中必须加上pointcut和returning两个参数
    : z% ~. Z/ ^/ w, M

    pointcut指所要监控的目标对象的方法$ B, }. Z. [% Q. J$ s

    得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配
    : x0 W. d  E7 }/ _* i0 h# m

    完成追加的功能; J# ~1 C3 F+ o& S4 k

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    ! X5 Y0 b8 k+ M: F

    (1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)2 v3 [  W  Z/ u8 w8 z

    (2).
    6 _$ P$ W7 Q! }3 z1 A/ v

         2.直接引用匿名的pointcut
    ' K& n; c5 P) f) d1 e

         (1).@AfterReturning(“execution(
    * j' y1 \2 q1 q. f, M

    * com.javakc.spring.schemaaop.Api.test4())”)
    ' E: F% _" x/ q7 s4 k

         (2).@AfterReturning(pointcut=2 ^7 c- O( W! o3 G+ Y) ~* w1 A' c  Q

    “com.javakc.spring.schemaaop.TestPointcut.t4() &&: v$ V* \5 H( t

    args(str)”, returning=”retVal”)
    , B+ C; i$ i, k$ N1 `) w

    @AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)
    ; V% p* N1 d1 ]% Z

    public void testAfterReturning(String str,Object retVal){
    - l/ m/ Q- w: m

        System.out.println(“afterReturning1=>”+retVal+”=>”+str);! Q6 S( E% |' U' T" Y

        }" K  g5 w; A( ]- ^9 z

    5.4.2.@Aronud3 {- y6 y: j( C( @, ~3 H' A$ ^

         注解@Around环绕追加功能;- _/ W5 O7 K: p

         在执行目标对象的方法的前、后追加功能;3 W/ D3 a/ h1 V( A- \  j5 H$ [+ z

         必须有参数;第一个参数的类型必须为ProceedingJoinPoint;
    & x" ?/ `! ^% P# H2 \. e3 ^# T9 n

         通过ProceedingJoinPoint的实例的proceed来调用所监控的) u. U- J1 @, J) m8 \

    目标对象的方法/ j0 D/ W% v3 P, V; }1 u

         1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    ( v2 @6 S1 p! |) n

         (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)7 A  p1 _# G- `% W, ]! U# l. [# x

         (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()0 i- o! e# A- G& R

    && args(str)”)
    1 l8 m% y; x4 a4 d. X2 J* U

    2.直接引用匿名的pointcut+ |1 M% g* L* `$ \( N# p9 b

         (1).@Around(“execution(
    7 l2 ~' f# {$ L/ v  X1 ]5 U* l

    * com.javakc.spring.schemaaop.Api.test1())”)
    6 L; N) D: {: u$ l

         (2).@Around(“execution(7 y. v; K. W/ P4 W/ ^

    * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)0 I' p$ q2 `+ ]' P0 C# {

    // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”); ~6 t2 ]4 @9 Z7 j

         @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”); f6 D  R! `- H: v

    public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{1 B6 b' A  @( t/ p4 z/ s

        System.out.println(“around1==========before1pointcut==>”+str)
    2 x+ X7 v+ I- x5 B8 X4 ]$ a

            Object obj = prj.proceed();
    # ?0 z5 K" n! M& V: m8 j& p

            System.out.println(“around1==========after1pointcut==>”+str);
    ' G. ^8 c3 u$ m$ W2 P) {2 L

        }
    1 X! V  {7 H/ D7 r! R. t, _

    5.4.3.@Before6 I( v9 N$ K) W, H; h8 R$ T' o

    注解@Before在执行目标对象的方法前追加相应的功能3 u. Q4 w+ f# c

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    4 u! G/ y0 [: _" Z3 B5 F- c* D& s

    (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    5 U4 o% h# w0 X1 X' r; r

    (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    4 E  K: M4 p6 {( g. ~7 G& D

    注意args后的名称与参数名相同
    ! |5 ~, H( C9 @! t7 R0 f+ c

    2.直接引用匿名的pointcut" z1 K) r- c! @5 f

    (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)6 g( D8 J$ F) k! j8 h# u5 A

    (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    5 e) x6 R7 ^% m( U2 `  d$ L+ i

    注意args后的名称与参数名相同
    / I5 k+ }( ?& {3 U6 x0 f

    // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)8 |9 C7 V: N% f5 l& {( W* L& P+ f

    @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)  F' w- }" m* j

    public void testBeforeParam(String str){& I8 C# w8 t+ [$ e

        System.out.println(“before1=param=>”+str);9 R5 G' W7 l: j( `

    }, D+ v. i4 i' Z. d, b

    6 @+ \8 H7 T0 o2 i: m6 A( v

    5.4.4.@After" k; t8 E* A8 i5 i' |+ u( z" ~

    注解@After在执行目标对象的方法后追加相应的功能
    2 }8 @' b, B0 H1 {0 ?: Q

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    7 c1 @) Q& ]3 u: j0 k. W( V

         (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    , R# T& _$ h+ H  v' j

         2.直接引用匿名的pointcut; [* q- t) b4 U

         (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”): p/ n/ Q7 Z6 ^# T' o

    @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”), j8 m( x2 j) B# f' W

        public void testAfter(){- R% V! i7 [# Y) ^7 W

        System.out.println(“after1== >pointcut”);# R* `2 P! V4 x' }' ]3 z7 y* P

        }
    2 r6 G  ?! U1 F  i; k% _" W9 {: b! A3 Y

    5.4.5.@AfterThorwing
    * A" U1 \& @/ u  ?$ Z; _' m+ ~


    % j* G  Y- ]$ N  r
    ' c2 }- z/ l) U! @
    • 描述一下spring中BeanFactory和ApplicationContext的差别& G! O/ @, q; Q# o
      % ^& Z9 M  r" h8 O* @. ]% P* x! }) V

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


    ! M4 I. @  ]9 e: g
    • 谈谈spring对DAO的支持. u2 L' w* R1 |6 O5 Z9 {: \! f
      0 p  U" b* D& W0 [* `' ^

    Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。
      `, W' C1 w5 F

    简化 DAO 组件的开发。/ J  c, h- P' p8 _, n* a: r6 k
    Spring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。
    5 k, f7 r% r$ O; g2 S( t

    IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。
    9 p& g! D3 T' `; Q! z" l+ i

    面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。
    ; Q  u2 F& N3 {( T. L5 g

    方便的事务管理: Spring的声明式事务管理力度是方法级。/ p1 a: p$ B* Y

    异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。
    & F0 P- G- j' U, k) Q0 W


    2 X2 u9 e4 o7 F/ X  p3 D+ [+ \, I4 L& o; J) [
    • 谈谈spring对hibernate的支持1 ]' R- g4 N& @

      2 l0 O2 q3 |" f: Q& O

    在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。
    / p9 x6 M7 J$ o' S3 I8 ^

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

    1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:
    : K1 u9 v4 Y3 k1 d5 l

    ; b/ d6 \  \0 p- _# R2 k! l

            class=“org.apache.commons.dbcp.BasicDataSource”>
    " Q' Z% ?6 k- S0 L4 ]( d/ s

            ) u; w2 b+ X# L# r+ I- t

                oracle.jdbc.driver.OracleDriver' w8 F2 |6 h6 K2 M+ |6 E

            4 v  ^9 ~& T. t5 W) v7 Q

            
    4 |4 i: c* y% q' N) A3 i; {/ {

                jdbcracle:thinlocalhost:1521rcl
    3 B! j% G2 e7 E% Z+ p8 V9 P

            
    * ]4 n/ e: H$ o5 o1 I) R6 I

            
      f8 ^" e6 G: |1 o4 t

                javakc2
    3 z: K4 ?* q0 _- z4 T! f/ b

            % k+ H! q$ J- O  Q5 h

            + M1 [) d+ g% h# _1 w. U

                javakc2# u6 w6 o1 i5 ^

            
    5 I1 g# k! l1 H2 ]! V) \3 h$ A' `

        / H, ~' J7 D4 c: o

    " i( D. F0 Y, u0 k# E+ ]" p! L# e( N4 g

       

            class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>
    8 R* v- H- y$ Q

            
    0 r& S+ L4 k3 M4 z- c% h

            4 |' P7 {& |; S2 n3 [0 a& \4 H0 x$ R

                
    , @& d! j; @* A1 ?/ k

                    com/javakc/spring/h3/UserModel.hbm.xml( X1 a$ |0 \5 q% ]+ q

                
    - u' M, z/ u! c0 M# F4 p- s

            ) x0 H5 W& P! d, v$ f$ ^

            
    + Z! ~. A7 _! M* _

                ; r  k: V: T0 L) I7 d

                    hibernate.dialect=org.hibernate.dialect.OracleDialect1 x- V0 S1 @  @% k7 l- d& c

                
    ' i7 a& i% i& Y

            
    " X& c0 E" O1 ^

        & j# J& j, r) n- \$ K

        7 c1 T. K7 S3 Q/ f9 a: T

            8 \9 n1 e$ r* ?' r

       
    8 T- D  K, a: {% {* Y

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

       

            class=“org.springframework.jndi.JndiObjectFactoryBean”>. \9 g/ ]/ s( b. \

            
    ; @- j' r" Z, L4 u

                java:comp/env/jdbc/myds
    % H5 B  X9 o5 y

            : x3 l1 V( n8 I7 _6 l: O% k

       

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

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

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

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

       
    , I# F: z! p. |$ @7 x

            
    $ w5 n0 z/ {4 c* A# p

       
    4 G0 B9 E% p2 ?7 J

    - C, z+ R& p7 i. A0 R

       
    ; ^+ R! g* L4 \

            " g# `7 x# v6 g; }7 Z& ~: C

                7 o. R2 y- v% }, n# {

            
    % W- r: m' b( C  U& Q

        4 C1 k& A( }+ p6 J: C! W


    " r( v8 S  Y& i* x$ p7 U

       
    + G. p% |! q" @

            + Y) {& q6 K4 S

            
    $ h8 h5 y9 k: A$ ]" F

        8 W+ I6 ~& N) x/ V* ~0 t: U! H

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

    . R/ i* S( T! L$ V% i
    Spring2.0之前事务的写法/ ^8 ]. ?) L% H8 S6 y  {

    - |$ }9 E. u+ q8 h+ F1 E0 T" q3 L* b. k2 @/ r
            class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”( a% D& ^0 S! T% A- c7 t5 R. M

    ; y' W' y8 X- v. g        abstract=”true”>
    . g8 w! I2 J7 }" N
    % W: {% P% G0 ~
    ' _! \' x. y8 I3 G
    6 I6 ~6 O3 F) j6 w$ U5 a5 h% p
    5 F1 t2 Y! p4 W! q4 X: L) E
                    PROPAGATION_REQUIRED,readOnly
    6 e: D; E& }/ t* }+ ]
    ! M3 I% Q; k8 o
                    PROPAGATION_REQUIRED, ?( V3 h2 _- }( ]/ k' {

    - M: Z( v7 a/ I4 k& T- _9 \& Y# z. z+ f) i; |  ^

    % h/ @6 u1 k2 ~$ Q$ g: z; }
    / J( y% V  u: q

    ! g; y0 k$ b' O/ k, @% I( b+ P& {2 q. A: u. [/ z
    • 谈谈Spring对事务的支持! {' Y* L# z  R
      ! W7 y1 V3 h- g  p  e% ~7 V


    3 ~. G; x6 ^  _. A1、声明式事务管理:

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

    2.做法:

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

    2.2

    2.3 注入数据源

    2 U. M* l* j0 ~1 Q$ N
    3 e( \1 V5 l7 ]7 |1 |& o: `3 R
    & E" R3 h3 @! }8 s; j) u( K4 r& H. Z

    " P+ X6 B) [, T0 h0 O
    ) ?3 c: a0 ?7 ]# [, W( X( k* ^. T* `

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


      }' }$ c- S3 I& i. T5 e* A( Q9 w% ^, i' Q* \3 b

    $ W; ?- o. I4 P# k$ k) F

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

    2 `4 j& T( `! N& t7 i7 |" }; @# d
    " @! M9 D4 V, C) U

    , E4 D+ R9 x/ G0 X6 Z7 v4 H( k* e! h. R) b
    . J8 q6 A0 b8 T  f1 L6 _  E& n

    2.6 定义切入点

    , [" D* I# e# T: R$ l4 x
    2 r6 x6 t4 F# |* s# E% f; w

    2 }0 Z5 P! q1 V; S
    9 O& J. _+ F6 \. |
    6 G7 z' f2 S3 K# P7 T- K9 v! o- I

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

    1.注解@Transcational

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

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

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


    : F% ?& w! L2 j
    ; K: J' x2 O! c. F) `2 b' j9 \

    如何在Spring中使用Hibernate的事务:
    + f" l: W, g2 M$ [; x2 G# D

    5 N3 D9 X8 ^; |1 O

    # V* ]5 j! ^/ h0 v) B7 F3 d


    " H; P5 Z8 v, z% e# F

    如何在Spring中使用JTA的事务:6 `4 u% F/ g, p8 M


    ) O" h3 _, t0 W1 @6 x7 |% R
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    17#
    发表于 2014-12-03 12:48:32 |只看该作者
    事务5 A3 s& k. `% m9 E8 x- K0 H
    ACID
    9 c+ e( k3 l4 G; q- x- e1 z9 ~(1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失败
    3 [! C5 Z% x: E- ^- k$ X3 w& ?
    , k3 z& a& L3 o$ W4 O) ^(2)一致性 :操作的前后满足同样的规则,保持平衡。
    . D4 v# r3 p5 u1 v2 X- Q, V0 \
    : e! F  ~3 X! b: H- r1 ~(3)隔离性 :在事务运行的过程中。事务内的数据对外的可见性和可操作性(必需由数据库的支持)
    7 p, d: \- v/ }9 a. N4 j3 D# `: U+ N" ]$ L8 L
    (4)稳定性 :保证数据在事务的操作的过程中不会遭到破坏,而且是永久性存储的$ r, j3 d; W( t& @3 r9 ~

    4 o. t  ^' ]+ p0 G" D, c/ h% X
    # B9 G' n! E  K$ I6 b4 P
    ! b8 z3 O* L  v( X6 x) O, e2 L5 `$ {事务模型- ]/ V  _5 W8 s! }6 f
    (1)经典事务模型又叫平面事务模型(JDBC) 事务不允许嵌套8 v+ k: q. Q4 I" z

    + |: C' K! E' S$ A/ O(2)嵌套事务模型
    ) L. N& |  i, O% `. Q4 h
    6 a/ s, F- f, M" R) F & C& w/ P7 v# j; H# U

    $ i* l4 w" m9 k: s事务的两种方式
    , W4 I. c. Z) d$ [(1)声明式
    5 a* w8 Z/ o3 E4 ~3 _
    + V, \+ c. Z) w1 [) S* @+ e在配置文件中设置以下6项
      F4 I3 H. V, y0 s- y8 p1 D( z; V0 d% D  g. w5 D' B
    (1).required
    5 W5 V4 p: P  d0 V: D
    : M) }0 e1 G: Z0 @8 i如果客户端没有事务 在bean中新起一个事务
    ! l, B4 G/ u1 V7 ~, j+ I0 x/ M7 w6 b. O
    如果客户端有事务bean 中就加进去
    ) n2 n! Q# e; X) @# s& T9 q% J
    4 [% j5 e2 e7 n(2)、 requiresNew# i- l. S) J* R8 X) ~
    $ d; D# J" O' W. w' _1 o2 ?% k
    不管客户端有没有事务服务器段都新起一个事务9 T  ?1 A" V) [) b- l

    9 ?/ a6 D- L8 x! [5 y7 C如果客户端有事务就将事务挂起
    7 H, m6 @/ k$ Y; u# [: R# s0 ^0 f& o$ X
    (3)、supports
    : @; O2 H$ d- g  q
    ! U5 W/ e4 v  t: d如果客户端没有事务服务端也没有事务
    * |% _4 f9 A2 G9 b
    2 v# D4 d1 H/ `+ d4 Q8 m如果客户端有事务服务端就加一个事务3 f) |  l% u1 `. |9 @0 s6 x* ]1 ^
    , [* [, }% z2 K- z
    (4)、mandatcry, ^9 S; Y( m0 Z0 l5 c/ M  I3 u7 C
    / ]$ N" ^/ k) x
    如果客户端没有事务服务端就会报错
    , j+ W9 r' y* [* M, h+ Z7 [. J
    : p' l* u: y; w' n, N  A6 x, t如果客户端有事务服务端就加事务
    ( I+ b% f2 o2 S; \9 ]) T7 L' p; f! J7 V& X* q, G4 f. {
    (5)、notSupported
    8 C; U. ^8 }" r3 g8 u% e0 A, i9 d- c  }+ g# }( f9 ^5 u
    不管客户端有没有事务服务端都没有事务$ ^9 m8 U2 E" g2 q6 J5 ]2 b
    # b( P3 V1 L  p6 W: K
    如果客户端有事务服务端就挂起4 l1 {" I' ~. [3 O( ]+ |& F
    , Z  h- H2 E. y
    (6)、never
    0 D& R8 X5 p2 q1 t$ q: V3 N" N$ E( J& R6 T1 E9 ]- k+ ?8 Z& v* T7 ?
    不管客户端有没有事务服务端都没有事务
    1 ^/ V: g2 m* x5 J9 u4 q* N+ v; x
    8 g0 r9 V# M/ J2 B  I0 j如果客户端有事务就报错4 k6 K# t% {! S+ Q3 g3 E6 z
      V: ^8 W3 ~# N) r4 B
    (2)编程式事务
    . i* n! S6 p7 _2 l' I" T) V% t: r& w8 J+ u9 j1 X& i
    Javax.transaction.UserTranscation+ `1 y4 Z& x7 @- M+ v. T: y

    % ?0 D% q# D4 l' e4 B4 DJTA 事务可以精确到事务的开始和结束9 L' O2 h$ K0 s# q9 B8 ^5 M$ y/ e

    ; Z  m$ S: e7 @! X $ F2 v# J# k4 C, }
    ) l8 E: j# m; M+ G& e% }
    事务的隔离性3 [% `  `  p" g: f
    Read-uncommited
    & [4 _* j1 `5 N1 M" E
    , @0 `# l* @7 y: d9 B, t7 \读取未提交的数据(基本上没有锁)脏读,存在不当读取的问题。% {# |' h, F4 u

    1 Q* T/ h- p. A* |Read-commited
    4 x4 M) b% ]9 K+ s9 X; w8 w1 K3 k/ p- y' o  [! j
    读取已提交的数据(行级锁)
    , J# w; f) D9 ^1 I1 K
    ( \$ K1 C& a4 l无法读取已经写入,但没有被提交的数据。1 Z8 c$ |; U) Y
    6 I. K% C  N$ p; n' t
    Repeatable_read' C- v" m1 e2 g: ?1 W' {( x/ q/ ?+ n
    6 C* K% L* d+ I  ]% h
    读取的数据不允许修改或删除
    9 _) X% T/ F9 Q' \2 Y- q3 p1 p# f9 v* ~4 \4 R* i1 |( w- ^
    不可重复读(行级锁+不允许修改/删除), j4 _- b9 b( B' ^7 G
    4 n' c* z: y/ ]7 T$ t! e+ H3 a# l
    Serializable
    . l) Y! p& n2 z
    5 @- x% z! K7 h8 h( u幻影读(表级锁)
    7 `4 n+ t) @1 a7 e, ~( U  a; J& Y0 u6 M7 c/ l. d3 E  q# X
    9 m; m. p( b; ^  ~6 G6 L
    5 O' k4 Z; E( t# s7 g2 Z5 _
    struts
    ( d; a- K. [- L& Z3 g* {% t开发流程
    / K3 D& t& e! ~4 F+ h
    $ u! G0 Q6 }: X3 y7 Z: S: p& s6 U1、创建表单
    & }) C5 h( X, V2 O: y. E8 a" m3 K3 U- [; S8 D- C
    2、从表单中获得输入, ^0 H6 J" b7 V

    & d& w9 T' C+ U0 U4 m5 ]+ T, p3、处理输入(业务逻辑)  ]( W, ~: v; p6 E+ Z* `' @1 D* g

    / a8 u8 Y9 r. A5 ^: {) O$ @4、根据动态输入改变输入流: ], A; G/ e/ {1 L. |

      j' a5 G. v3 M1 d# U' a要完成上述四步,我们需要创建
    9 x- ^+ F* A$ |7 X2 {8 x# B" n* a3 v+ H( o& _8 ^9 h! |1 g
    1、一个ActionForm2 Q1 m( s) {# R& Q/ q
    5 P! e  g: R0 x
    2、一个action5 {" c6 T) u7 V; @! K9 k2 S% s
      e2 z* b- A9 R9 x2 D! Q4 R
    3、一个配置文件struts-config.xml
    ' _' ]0 `  z6 Q* p$ v+ }
    + j+ _7 W2 k' D# x4、创建页面9 m/ d3 G) f* Y/ ~3 G
    3 Y6 W3 v$ Y. @, n+ N! t. C
    创建ActionForm
    " K. s. o0 \6 C; U0 p, C+ X, m% Z# }
    1、写一个类继承ActionForm
    + N& J' Q" k: d* E1 h8 u- C1 J& P* K
    2、私有的属性
    6 A2 `! u& s3 t' ]4 C
    7 n# k7 m* a2 D$ D6 z: E  l3、相应的get、set方法& K: Q" X7 k( g& p
    6 Z: [: {& ]% j/ s) \
    4、重写tostring、equals、hashcode三个方法+ J) T9 d: O- [& w
    & [' C/ r+ \0 V$ ?% P6 i' t
    创建action
    2 j7 Z/ a. \  [  n- n9 B: ~/ n/ ~6 p* o# \7 z& f! W
    1、写一个类继承Action5 L+ j0 ^' w) K6 I6 X  g* j" H, `
    ' K: I9 i4 k, q4 S1 r
    2、实现一个公有的方法(回调方法)% G* o# V& O/ a6 D
    9 j: ], \7 w% D6 T: T0 b* F
    public ActionForward execute(ActionMapping mapping,
    % U! n/ ~  l* d" d  f
    0 ^( U4 ~( f& G- J, V' i, bActionForm form,
    + `) ~9 g5 Q6 B" N
    ) q9 f  B3 G( r- x: Y3 n( lHttpServletRequest request,
    8 w4 V) y% y% g( b( [! Z1 ]! z! D; P5 Q% K* H  p
    HttpServletResponse response)
    & S4 Q7 R7 l- Y
    , c, r+ u  b* F6 j9 R, |{; E; U# Y  |* Z5 i7 `0 T8 Q
    % o% M, i' {  G+ v
    //1.收集参数
    / u$ t( A8 {+ @6 f) {
    8 D2 E! i, p$ G" r9 ~7 b8 gMyActionForm myForm = (MyActionForm)form;
    + \4 l1 k- H# ?, o! ^; V% q, L- L: P0 c. o/ p+ b9 F% r
    //2.组织参数5 p3 F; g! B/ n: s& \
      i% {8 d) q# Z  V& i! Q9 z! u3 E
    1 ~- D; Q0 M- w1 n

    % Z6 E/ `* X1 r# h//3.调用逻辑层4 R. V% L9 X: D% }1 J  c6 h6 m: {" h

    / N+ N7 l6 [' W8 K! h+ \boolean flag = true;
    4 A/ D+ [& A0 [5 b' ]; l2 y0 e& n7 @8 }* \2 U# H2 h
    //4.根据返回值来跳转到相应的页面( D& n9 o4 ]% r) u/ X

    . a8 R3 N  B  ?6 K, M$ VActionForward af = new ActionForward();
    6 [: ~. T7 e8 k$ F& c. {& G4 v  t- R0 `
    if(flag){, V" S6 G- q0 A6 f! m0 }6 f- Z
    $ i7 C9 B1 ?; K9 `& u) W" v1 |9 a
    af = mapping.findForward(“1″);! E/ X, P: S9 I1 H( x2 E4 i7 ~
    # v  e3 K" @1 Z9 Z  I
    }else{* ~/ @) c' n: u- S0 o: O- W

    6 e! v+ j5 P9 h1 q1 qaf = mapping.findForward(“2″);
    ( Q( Z, }# ]. L+ i9 l0 ?9 J7 `  H6 l$ _! {
    }
    + l( K7 [, M2 h. x* L2 X' k6 B9 K( M# d# \; w
    return af;
    2 s/ x: z, `( {% t. U! n# \: @- _& `; y+ V. @* u! v; x* p) h
    }
    0 O, R/ h) {) Z5 |
    ) o5 B: M6 b9 T) l; M6 M9 d配置struts-config.xml文件" n7 z. [) k; E/ s: I% X9 j
    $ `( I6 w* ?1 Y5 y$ z9 _) n
    1.<form-beans>
    . M1 J- b" ]) N3 s8 }, n+ u
    + z% G0 `0 V5 F7 {8 \8 I<form-bean name=”myActionForm” type=”全路径.MyActionForm”/>
    ) f# \7 y2 @0 L- {
    - Y" T- X) t( U* u9 ^% ]7 H# H<form-bean />
    * v1 a: v/ r6 J& Q% |, N3 E8 h: N2 o7 j7 j- g* B
    </form-beans>8 M- s3 A& a+ @0 C/ t

    ) r$ O% i+ W! O6 C2.<action-mappings>* r0 A& l" T' m. p
    ' G# {2 |# x9 A$ y9 ?1 t9 u
    <action path=”/sll”
    % I$ ?9 F2 i0 }4 E+ m" b) I5 V) \# }
    name=”myActionForm”
    6 d# g7 ?5 {0 I+ @& l7 p  [' i9 g) q! i  P
    type=”全路径.MyAction”
    6 X4 l( h' ]* ^7 g. }, c7 ^
    # i. a* y0 W( Sscope=”session”
    , W! \6 _' q, F2 {# f. ?' [: T
    ; N. Z+ i+ e7 s1 a* ^input=”错误返回的页面”>/ q  O  M2 V6 m, z

    ; S/ m  m8 k8 h<forward name=”1″ path=”/1.jsp”>
    % [) {, I4 v: M5 \( c; A
    4 t. l+ r! G# g. f- Z. _<forward name=”2″ path=”/2.jsp”>
    & T& y' z) i' g- J$ k$ l3 Y
    7 U4 _7 B0 |/ P9 _, @% ~  Q, l</action>% k" w5 n5 ^! d7 t1 K. M" U; |

    + |* c/ O1 Z* N5 Y4 i% z</action-mappings>
      \5 K& M" b; }; F3 w) M
    5 F. Y4 d! I( V1 S, x- d步骤:' V+ A$ N8 d6 H* C* \' r
    + _- r3 u: Q) r1 t; n2 O
    1.创建一个空的web应用
    ) I# A. I3 O, @- w: r/ R, t" r- O" C2 |* w
    2.将struts的包放到lib文件夹下! j3 [5 R+ X; q6 r1 {3 w

    0 C% n: m! B' s# _5 w- K/ k: A3.将.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目录下+ }1 o; l2 B" ?$ W! ]! Z9 [

    0 J% h0 X) ~- R* b$ [4.配置struts-config.xml文件和web.xml文件/ p! \  ~/ k+ k/ F
    5 M" R. P+ s8 t9 U2 J" ?
    5.在页面引入tag文件uri; x# ~$ k9 m- Y
    6 G4 A, u5 \! y
    STRUTS运行机制
    1 m7 i+ W/ A, R& c/ [0 r
    ( ?2 ?% |9 E) a% D1、界面点击产生请求
    5 p8 `$ q7 G0 ]" F- B# ]7 @
    ' R5 V* y1 L. Y2 w6 h* @8 }' p2、容器接到请求
    3 I4 G: z' ^* U; \" {) \" B3 }* i- O" |8 m8 h" L
    3、匹配web.xml文件中的*.do来调用ActionServlet
    9 k& P7 a  d. |) _
    % c3 v1 }9 }' A: ^4、ActionServlet的处理
    7 j- g6 ?- S+ \7 O3 H+ \4 _4 G( Q+ \% U' b/ t4 d/ q/ u' L7 a8 |2 Q  W
    4.1 读struts-congfig.xml文件形成ActionMapping( R: Z6 l  Y5 X
    - l$ Z& m) O0 c% @* X
    4.2 通过path 来匹配Action类,通过Action的name属性来匹配ActionForm类
    3 i' e5 v) k7 p! C3 t" R) G" S2 G. E+ E+ U
    4.3 通过反射机制来给Form添数据
    ( E5 [/ v% U& d# S! V2 [2 g" `* ], n. d& V
    4.4 由ActionServlet转调Action的execute方法6 m1 V0 E2 y: E. P: w
    & u& J# x9 E5 e% r! S: v' M
    4.5 得到execute方法的返回值,跳转页面
    ' |- m! A; N# {! K, |: o
    * X8 O2 O) h5 `0 @) h3 \. |; |4.5.1 RequestDispatcher6 U& n- A( O% d- O
    & X( X" C7 H' R# D/ ]/ t6 ]; f
    4.5.2 response.sendRedirect(“list.jsp”);
    " r6 \% n. _. Y1 a, E* ^
    - q& B! |8 o- B3 h8 f; @5 c / ]1 g; T9 N( R

    : l2 ^8 U5 t* k, f进入execute方法0 _* g4 U5 G! f: f4 U2 d: |5 G

    ! i0 Y& t8 C5 x1 收集参数9 u% s* V* R2 X2 ]6 P! @

    6 p/ k, T) ?2 ?" i! x2 组织参数( ?7 I: }" g1 s1 |& b* n4 ?

    3 M) {4 Z+ R! C& j8 ^3 调用,逻辑层
    8 Y" F5 B6 e* x( J3 d3 ^3 U! M
    " }: I6 t+ d8 x+ u% s4 返回值
    4 z+ e# V# j" f9 E$ ]+ e! w. E) {! i
    4.1 选择下一个页面 (ActionForward)4 j# C; P6 I3 T  X6 U' B" f8 d5 E

    : E/ i9 ?5 w. e. s. z; G! X4.2 把值传给下一个页面6 J, ]0 k4 z8 t; v+ }$ l3 x
    ! ~9 b- K2 x1 z1 Y' Z& B8 D+ u
    % t  a5 d- l' F, ^  R& B5 A
    / B! h- H8 t5 ]2 {& X
    比较struts和struts2的不同) L8 @$ `" C8 N9 c; G

    # D" t* {# ]  s0 U& @Struts
    - @7 Q8 R+ D; u3 X2 g3 k: [7 q+ I# A
    Struts2
    : j$ G2 f! {- _% W$ t1 n: g: R  u* T* Z* u# H8 z
    组成        五个部分:ActionServlet,ActionMapping,AtcionForward,ActionForm,Action        十个部分:AcionContext,FilterDispatcher,ActionMapper,ActionProxy,Configuration Manager,Action Invocation,Interceptot,Action,Result,Taglib# ^5 E* I* T) T* l* }+ t
    url        .do        .action
    ! r8 q5 k! T/ x5 ^& S- @分发控制        AtcionServlet        FilterDispatcher
    + f6 J6 p) e: |收集参数        利用JavaBean技术,将数据封装到ActionForm的子类中;
    0 U: V( a' t: x. N" m1 I5 U一个Action对应一个ActionForm的子类
    - O6 E" f, N. X! M& O: @8 F7 n& @, t1 Z3 ]- D: W3 l, A
    使用拦截器将数据封装到值栈中。
    & R+ t- t" Y! H( t. t使用域模型,一个Action对应多个值栈中的Model
    3 @5 V8 }- v" N- \( {, b# l
    / T. M7 V: l& \- o0 B& J3 s读取配置文件        ActionMapping        Configuration Manager: i! G( B( |6 n1 ^$ |
    拦截器        无拦截器        执行Action前后有拦截器: R+ f5 d, Y; ?6 e0 l7 q  c# ]
    返回页面        将字符串封装到AtcionForward,进行跳转页面        Action中直接返回字符串,通过Result跳转页面. M: o6 `6 `2 [8 a4 T) `2 {" X
    页面跳转方式        两种:dispatch,redirect        三种:dispatch,redirect,chain/ p2 t) n' C( B* D# V! I
    值栈        无值栈,Action通过在request范围内设置属性,向jsp页面传递数据        有值栈,Action和jsp页面通过值栈传递数据,jsp页面通过OGNL取得值栈中的数据: ^8 Y4 v# X6 A; r/ s* M8 Z' H$ S4 P* F
    配置文件        struts-config.xml        struts.xml, k9 M* E  O$ J+ |' z9 o' |: Y, `
    中文问题        不能解决(需要使用filter)        可以解决中文问题:' U7 L! ]* r9 Z/ i" h. H
    1、在jsp页面添加Meta;* j3 H& U8 d# d2 ]- i! k

    & P$ k( I& }0 T. \; @* m# f0 n5 @2、修改struts.properties中的设置。
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    18#
    发表于 2014-12-03 12:49:03 |只看该作者
    其他开发工具和技术, e8 V7 _+ _" K, U3 ?
    Ant5 \5 e; U; m, M4 E9 G! ?' G
    Ant是基于java的批处理工具
    1 @4 j' |; p+ A+ R8 _" h
    * I* v) O9 u/ g- L- W3 U5 A9 U7 x一、配置ant的运行环境
    8 M7 m1 S, v2 W- \6 P! w; `+ U+ q
    1.将ant的bin目录添加到path中
    . l" q9 u! g; F+ b( O' b) S" x
    # O& O' J5 {( I2.配置JAVA_HOME* |0 E% w1 H9 Y/ \, r. q7 G0 s
    % F' a9 R- @* g3 l) B6 p$ O, K4 w
    3.配置ANT_HOME
    2 I! D. D- G% M6 i8 U+ R' `/ g/ D; q/ y5 v: ]; Q, I) U
    二、配制build.xml文件,该文件放在应用程序的根目录下
    , p0 G5 [3 F2 V3 m6 ~/ m# X4 v/ [- b4 }( A
    编译java文件
    , Z8 b% C% p9 H+ }' _
    % ~! p1 Z& K1 q4 g3 ]执行java文件5 t2 n. p# }" {) k& \% Z" a9 ]

    ' [* y: h  |! ~5 c& v; Jcopy& J+ `& i' O5 f
    8 X) Y1 \0 M6 S5 C
    删除( P0 P: K0 X. f( @

    & x0 b9 Z. K2 g2 f5 |& U打jar包
    0 N, q6 q* A( z) {4 k5 A2 h2 f5 g
    , O, Q! \" Y$ c7 w9 @2 z( [2 I0 @根据注解生成配置文件% @5 X0 V" P: X

    $ `% m, y: j9 n& `9 ~Xdoclet
      v, H, `0 |: m& s6 D, t! Z3 m通过注释生成一系列文件的工具(txt、xml、java、html等)
    2 `% U. F( ], j/ I( u7 a4 {4 B
    + |5 a' N. t5 P  j3 Lxdoclet本质是摸板技术+字符串的替换
    5 h7 H  A/ Z3 r( \7 }* P% F* X/ Q: V+ g% j! i3 ~- @% K
    1.在java文件中写符合要求的注释(将hbm.xml文件的内容搬到java文件中去写)
    # t2 @3 Y' A. z7 w$ a' X6 i) U% e
    4 ~# ?  p9 P: I, F! y* {7 `0 y1.1 在类的上面 写与表的对应7 z" ~9 G% {$ Q2 x' V
    $ X* g. v+ K1 ]& O2 x
    1.2 将每一个属性的注释都写到get方法的上面
    4 g: W/ H2 z) }/ ?+ e3 F% k2 o, E* ^! G2 g6 O
    2.在ant中引入相应的task来驱动xdoclet
    ( W  Y  U+ h/ o) G( P) W- F. j, ~) ~: ^/ @# Q3 W3 f
      W! u, t" ?; O4 N3 \4 C
    ( r8 d$ r  ]) W/ @9 ^$ a
    log4j日志管理2 e9 H$ v$ X0 }
    1、是什么?
    2 o4 v+ l* R; r6 s6 T2 c! A4 W3 D5 T2 U$ T. e9 t9 k8 K2 o8 V
    在开发期间用来测试、对整个日志信息进行管理的工具
    2 y1 q% k2 u$ `$ d. k2 }0 [) o( A2 d' z* X- X. ~( M! K: q
    2、功能1 n. k! _  |$ M* S
    + h2 b1 Z1 U- m
    1.控制输出的目的地
    % r' O3 j: Z, a
    # w* z5 h9 Z6 \3 }0 I* ~+ G) i2. 控制输出的格式* u( G7 q1 Y# L8 x  Q, V! u
    ) k- r# y4 V3 {# C& }' Y) E1 F* f4 Y
    3. 控制输出的级别2 K3 [  P. C  ?/ }1 ~% q
    # t4 Z0 N4 M$ |- v& E) f+ o7 Z9 u  L
    3、日志的级别: B2 w) ?! r: q9 k1 X0 F
    8 O6 U( @$ x0 u! L2 n5 |9 ~) v% i
    1. debug 调试
    4 g3 _# H. E7 A
    / W5 e7 ]1 X" `2 M  K8 u# c) ~2. info 给用户的提示信息
    ; S: @: [/ Z% a( F2 o. c" j  b& T& z* K. L. e, i
    3. warn 给用户的警告信息
    6 z8 N" \: {; u- U3 n+ F. `4 r5 q: @& }
    4.error 给程序员用来调试8 K! X/ o" s  M. c1 q+ l! ?
      M" G# ?+ m  D
    Debug—-〉info—-〉warn——–〉error( S! L% ^3 d6 p$ i
    9 b+ a  N& o; m! o9 J5 B% f4 `
    4、配置
    6 ?1 w; ^7 ~, @/ [. B6 Z$ H5 ~7 X# M7 z! \5 r' C
    1.配置级别; \# z% g7 {: e6 E1 u  b
    3 f  t6 d' Q% z# p6 `0 r
    2.输入源 (控制台和文件)+ S7 P" O1 ~. v
    + [" a5 y* f% V6 D; d9 t
    3.可以进行分包控制
    - B6 u4 V6 ?! g: j2 O1 T* ~2 S4 a1 ^: {% q; E' }2 I7 f
    Log4f.logger.包结构 = 级别
    7 A/ p2 u: e3 ~4 i( o8 G, o4 J9 C1 L# @  y
    5、使用
    3 z  c$ g* n4 ?9 D% x/ l+ }' {2 D+ V! u5 g4 o
    Logger log=Logger.getLogger(Test.class);
    / Q% u, T6 W' _0 _, E9 c8 R( ?6 ~, _" V4 [3 x; I2 n
        public, p2 D4 l% Z3 L1 q+ G
    void t3(){
    7 Q7 i1 p& U5 d" L3 ^4 v, v' W* w
    ; Y& E' {4 y/ j6 R/ J/ c        log.debug(“this is debug”);
    + I3 V4 u0 C% x) D, y
    ; d2 \- p3 p. ~        log.info(“this is info”);9 @5 c* V' M/ t( l7 \( _" ~

    4 @7 t4 y6 m- J* y/ J( e4 {4 }        log.warn(“this is warn “);
    / `- D6 F% U5 t( r
    % L, g" c# J) X/ A        log.error(“this is error”);
    " @3 s! l1 H: \- v3 E2 e( s1 u6 D# U7 n: Y& i  |, K1 }
        }
    5 W7 R" p" d' o( d
    ; j4 v0 c( g9 q7 y8 j1 LJunit$ c2 V2 r# ]- b, U% F
    1.是什么?" c6 O4 n' M: ^; o  q  U4 x" [
    $ |) c; c7 a: g7 ^
    单元测试的框架1 T- H  ^) H0 {( Y$ t4 K
    2 b9 Y! J. o8 N( P9 {7 a- q( s* R6 z
    2.怎么做?7 i" W6 V1 Z. T5 l( \
    $ _: k, Z+ a2 q+ o/ E: s
    写一个类继承TestCase$ t. |9 D0 W" w

    2 O3 `+ }& L/ [& I( Q; O+ t测试的方法一般都以test开头并且没有参数
    6 I' A4 X, ]2 [
    6 n' E( b3 p: Z- Z在测试方法前执行的方法public void setUp( )
    % o% b0 d2 n; Q8 W8 N0 _) R" ?6 g+ P7 g1 E! C1 X
    在测试方法后执行的方法public void tearDown( )) \% l' ^4 |" Q$ J$ ~0 k& H& Q
    : x- M$ ]' z; ^  r( \) ?6 W
    error和故障的区别  K% A1 T( n' \. V

    . q' p; S5 w7 R3 J  s; d  f+ ierror :代码有问题9 O: X/ S- F: s2 ?- Z

    - O9 e! w; |2 x+ z/ k2 l' u5 u故障 :逻辑有问题与祈望的值不相符合+ i7 S# g7 l( U; b1 Q' D

    4 L4 j  I( u; R4 g! J7 l/ K/ w生命周期. c6 U& N  d0 _- i( m1 M! A" S3 q9 o

    8 T% n, [4 q5 A# ]6 \测试—〉SetUp()—〉testXX()—〉tearDown()—〉结束;
    0 [5 @5 {* z7 i2 E6 E: Q) i+ D  G5 g4 {( q
    TestCase套件
    # h9 W4 S1 G: Q8 j" ?
    + v. G3 U7 I0 h0 ^# {public class MyTest{2 F6 m) d4 `, L/ a+ \

    5 t/ T, b4 Z9 ~# N  F0 d        Public static Test suite(){# H1 T8 u, k# M/ m. S. G4 d' `

    : O: G# e( |9 v6 ?TestSuite suite = new TestSuite();: w6 O+ }9 U) m, ?: _4 ]

    # X' H( ^- T$ @0 jsuite.addTestCase(Test1.class);
    0 V, C, W' Z* E2 Z& r+ d( r
    ; Z* C/ j* p! `2 s8 H2 a! Ksuite.addTestCase(Test2.class);+ b7 \3 w5 o2 S1 e* G

    ; h8 r; J- H2 {$ _: N9 `}) T) T- h: r9 k; R

    , A5 Y! d6 ?8 o# D2 P  D5 d7 \& K0 g}7 k' P+ i# J/ h! v
    / ]6 [' @$ _* A8 _8 O0 C  F8 `
    6 M% b- B- S6 ?" O4 p
    , `: m" F# j" k' L, g6 \( x/ X
    Ajax1 T; D: V" f" N4 w6 p- ~( }
    是什么?
    1 X2 Y$ D5 t8 j. A# C' k- fAJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。是一种创建交互式网页应用的网页开发技术。
    : M5 U; L! h$ d% h8 U5 r$ n: E9 Q
    % ]$ K/ r/ c8 i; D/ t! K. t; j无刷新页面。
    ! u" m3 a0 w/ b: R% J8 f3 a, x* I, _- v
    有什么?
    $ j0 ^) r) I2 w) xAJAX是多种技术的综合,包括JavaScript、XHTML和CSS、DOM、XML 和 XSLT、XMLHttpRequest。
    : g) ~& f6 h  n9 ]
    ; }& `/ G2 k* s" c/ j) i3 p能干什么?) i+ a3 K( q: M  B) N0 X! m
    使用XHTML+CSS标准化呈现;
    + t6 V  ]) a5 ^使用DOM进行动态显示及交互;
    / P7 ~( J( a# c* v& o# j; }: e使用 XML 和 XSLT 进行数据交换及相关操作;$ t) q# S6 U" o6 l6 r
    使用 XMLHttpRequest 进行异步数据查询、检索;
    . x& o( b  _( Y' Q1 D, B* F7 r使用JavaScript绑定和处理有所得数据;  z" `' A- F8 B" P6 \
    7 M4 F; B( b* g0 _% P7 E8 d. }5 d
    传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。
    0 H5 I  x& _: j, L7 h9 N! L1 [. t( x; e: W4 t8 ~1 P
    与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。+ n7 q0 M9 p: d* B7 Z/ ^' [' x- Q

    ! i. x  t, D0 n0 r使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。
    4 L; G7 C$ }) i, i- z9 T0 w% ~, W; g" r0 @
    对应用Ajax最主要的批评就是:' p# ^4 H4 w( g3 S( I1 ?3 o
    1 它破坏了浏览器后退按钮的正常行为,就是用户点击后退按钮后不能看到之前的数据;% V1 O) `7 `5 E# I0 [; F
    2 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;7 U+ r8 b. i0 \' Y5 `) z
    3 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;+ A3 w- |, e7 E* P
    4 Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;+ e( t5 F8 E- I9 |# u
    " ]$ z" Z2 v8 u7 f4 {$ M* W& i
    怎么做?
    : F" V8 X' a$ b5 w+ ^0 |0 J' p6 w<script language=”javascript”>
    8 N9 C$ l9 ~( U1 X! @8 G; Z5 l5 W7 {7 k* `  U- a0 c7 ~- }
    var req;
    ( e9 ]  A' ?7 K1 @7 E
    & E' Y; I' G1 m* C4 @/ U- Kfunction add(){) X. ?6 U# g& S' p* ?, J& p
    ' g. O4 f& W6 _# a7 E
    //1:创建用于传输的对象$ W, z0 q, J# _. U* @

    3 A$ \  K( |1 @" Areq=new ActiveXObject(“Microsoft.XMLHTTP”);
    . q5 @* ?; P# v6 u
    3 W# Q$ R' z3 V5 A! [8 W3 A9 y( g# V# t// 声明返回后,处理数据的方法3 i% ?) }8 ^1 K8 M; a( {; _* v/ d

    ) l0 q; c6 T9 V$ V# U& f  d: Dreq.onreadystatechange=manage;
    5 O! m# ^5 r/ A
    : X+ V" [4 U# c9 v//2:准备传输的内容6 c) ?, E; M4 i4 j2 e4 U1 V
    6 A: q" Y3 M( k* k4 c: e7 t) r+ [/ i
    var str=”test1111″;
    1 t. ]& @) ~1 z+ V" U) R8 c( H+ o- v8 n( [. |
    //3:发出请求. x% M& ?2 [, e' ~8 Y- ~

      r$ V- p! E+ L( Nreq.open(“GET” ,”/others/ajax/test/t2.jsp?str=”+str);
    ! K  e9 d/ f4 {* i! c) X$ T: j
    . r5 E: r) C( i4 `, F+ Ereq.send(null);( B; t% o9 S  {* C' u% Y" v

    : W3 Y: k" L8 e, F0 B}
    ) g1 P7 g6 V* o! Y7 a% ?+ G) }' u3 j/ z6 B8 h8 L
    //4:接受返回并处理3 K3 d. B/ A0 |0 Q/ B5 ~

    ( W$ x. S' x$ ~2 I, V- ffunction manage(){
    / {. W7 I% @/ p8 C$ N$ w9 ]1 ]& H# K
    if(req.readyState==4){% j& N, O4 t6 \2 W+ c
      K0 ]8 I- w4 i" \- j: T* Q
    alert(“r==”+req.responseText);
      o6 v+ E, f/ e7 o+ k7 N" N! B# J
    6 |7 V/ n1 ]- d}6 J' t7 k3 q/ r2 }: z* y; ~2 Y/ q

    6 [$ h; l7 X# F) t5 C}
    $ h4 D) A6 k* d0 a+ W
    - J" H/ t( V* y& J0 x</script>& v9 r2 I1 X8 }

    9 g( t- x3 Q& H! I0 c( LreadyState的取值如下:; P0 ?1 K5 s9 T; G1 n
    ! J7 e5 q, |; |% ]6 p2 p
      0 (未初始化)
    3 }% p: Z. O) M4 B% Q& q
    % J! m6 Q: l$ Y6 f- J* o  1 (正在装载)
    # W; y+ P: p( {) S+ a" s. s
    * ^7 Z' ~+ u! h4 |; {  b+ o  2 (装载完毕)& z3 o& d6 d/ B( T  ?( y* s7 n4 X
    . ?% G6 b) ]$ ^, P( ~2 Z
      3 (交互中)0 D. a- n  Z' E3 V3 e! v' J$ i1 }
      n8 Q1 f8 k8 I) |2 `, Z9 w
      4 (完成)1 G! V. A$ B5 h7 L
    2 v& ^  u7 z' {# a7 u9 x% @" P/ ]

    9 v# |! e6 H" E
      v9 X. a2 N: g" V7 I原理
    % ]& f) u4 T! \8 D: kAjax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,可以是xml格式,也可以是一个字符串,然后用javascript来操作DOM而更新页面。. f$ e* o7 }$ q+ X5 {  B; {" R. A
    1 `/ n# ]$ E: O, y, q
    Dwr
    ( r6 X/ `' J3 p7 M/ w/ W2 P3 @是什么?) c* t: u$ f' s- I  u- l) @
    DWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的页面。它可以允许在页面中使用运行在WEB服务器上的JAVA函数,被调用的JAVA函数就像是在页面中JavaScript方法一样。
    2 Q* p  _/ W: w( [. d* g, I
    4 y% y, B  `! r有什么?  d1 W1 O8 z) i* {% {6 y. V) L
    它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据;另外一方面提供了一个JavaScript库可以帮助web开发人员轻松地利用获取的数据来动态改变网页的内容。
    " I- Y5 k" `" j+ w% e; M% x0 c3 @+ a6 T$ {$ Z
    1 y$ v1 N. d" B) [' j0 [
    ) f, Y, v" \3 s3 m' }2 u
    能干什么?
      ]: B9 P4 N5 C% }& `! p$ z动态地把java类生成为JavaScript,感觉调用就像发生在浏览器端,实际上代码调用发生在服务器端,Dwr负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制。
    # w- D9 w& J1 Q* `, d1 m6 j2 m1 I9 N2 a6 z8 E

    ; Y' R, C0 E* [& f  ?, {
    7 e6 Z  O0 Y+ ~% `9 b怎么做?' @! s# I& Y0 q% {
    ① 编写配置文件
      M' V+ h+ D0 F: D% J, s* V' v7 }8 Q# b/ `/ n+ g( i9 u! u
    web.xml
    9 S. y3 r" p# ?3 x# d/ |' h
    2 j3 O. D7 I0 I7 M) S5 I: W<servlet>
    % u% y) j6 a7 K) C; G8 M, W
    & N5 j1 p3 f, x( Y+ c& u0 _8 \3 ~- x<servlet-name>dwr-invoker</servlet-name>
    & i0 }  V6 o* b/ b% n8 \' J  h/ d: H" ]2 s5 J  F+ f6 A
    <servlet-class>
    2 W/ b" a$ }: |
    % [' W4 y! Q* ?/ Morg.directwebremoting.servlet.DwrServlet& w0 i5 g1 ^4 o2 a" Y) p! b& k
    . f( @( b- ?- Z7 B! x' ^2 @1 l
    </servlet-class>
    1 j: S+ p+ E: P+ _* ^
    % H; a+ b0 Z# o$ j. @4 k( u1 `3 i. I<init-param>
    0 M( v, R1 @- a: `
    2 n, I9 y; g# u9 Z<param-name>debug</param-name>/ o" u" Z# Y; h4 H/ V- V# [6 {! V
    ) l' V( g/ R1 m, x7 ?1 P
    <param-value>true</param-value>
    . C3 I7 k3 w5 A8 _" t, W! m2 c' t
    ' S) u7 `- t, K! E# a# w2 \- j4 L</init-param>
    4 C8 v: `" ~4 a3 }& a; ^& @9 r- h$ a* i6 ?; r  F& D
    </servlet>% u3 }9 n5 X$ o# c/ @$ A1 P
    8 ~0 A# @" u$ H0 G4 k
    <servlet-mapping>
    ' m( e5 f( [4 T  |' A0 |* F. v: N# `, v$ j0 q
    <servlet-name>dwr-invoker</servlet-name>
      Y6 w5 G# k# p6 a# M& |% p# t: T# m% Y' O) ?* v* _' w5 s
    <url-pattern>/dwr/*</url-pattern>, a2 b6 ]' ^8 {- Z( L1 k, Z' b, J
    4 ?' V2 ?' B' p0 d& a/ n& b' y$ l/ H
    </servlet-mapping>9 t9 v" m- T" q: J! ]
    3 T8 o1 b6 `( u. V% f9 F
    dwr.xml
    1 a6 M4 `3 A) i# ~
    ! S6 o, o/ I: j  W6 x6 L<allow>
    0 N' D: m9 N8 V
    + H0 g, s  N7 K: ^$ J<create creator=”new” javascript=”kc2″>" A* \+ V. H: f8 X2 _. ?8 _3 J
    + \7 e+ T) F$ M  s3 {% `
    <param name=”class” value=”dwr.Service” />. I! B4 C9 b  g8 Z; n$ `2 T# p  V
    3 I7 \7 D( w5 ~: R" I8 d$ e) |$ a
    </create>
    $ l! {; v- G+ {3 q+ W. k& T+ f+ d- T2 l$ F2 G
    </allow>
    9 b/ ^1 l5 n2 K7 P3 [$ k: E! i
    ②编写service
    1 R9 a6 c5 h% K6 W3 n! l2 n) G) _+ y4 t1 u" Q- r7 J, @! e* p4 o* F
    public class Service {* Z; [) t. T: u9 J

    $ I9 x: V9 S7 c& Z! h1 u% Vpublic String sayHello(String yourName) {
    5 W- o/ B9 s) F5 s# G
    6 P% b! m( y: P+ o//可以是访问数据库的复杂代码: J/ w$ `) z/ [$ b# D) @; ]
    . @0 I. l3 ?! s2 t
    return “Hello World ” + yourName;5 K# e5 r, u# y

    9 W' W; ?3 ~1 \0 G# }: d}: w! u( K4 ?( i/ X
    5 q+ X& p- W8 u. M) I' t7 k3 t, e
    }+ q! @6 r2 b5 n  V/ t: Q8 ~
    . N8 B- X3 @5 c, R* H) m, e
    ③测试DWR" T, G) ?7 |- H/ r) S2 W# }4 R

    7 T/ Y9 i. x( c/ F$ O  S将代码放入应用服务器(比如Tomcat),启动。
    ( y) A; u6 a& s. ^/ W6 u8 [8 Y' L+ x0 f
    然后在地址栏输入http://localhost:8080/你的工程/dwr7 C: W9 o9 P1 ~7 l. C

    " g- `! u7 P, q/ Q3 r④编写jsp页面$ p1 D0 |0 a( t0 Z

    % L$ }3 Q1 W. |7 S! r# N1) 要引用3个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js
    : a8 n- D; K1 F1 f# {/ }7 _/ N7 C( i. `3 ?. Y( @
    2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样
    * J' }0 L4 U; D7 A- U
    2 B( n* A* G% E; E# T4 u3) js里的service.sayHello和java类的那个有一点区别,多了一个参数,用来得到返回的数据
    回复

    使用道具 举报

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

       

    关闭

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

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