我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > 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/ ]% q, g8 R  h) y; r9 {
    简述JEE
    / d% L0 o+ l- w' a! z: YJEE : JAVA  PLATFORM  ENTERPRISE  EDITION9 f  q0 u* y0 Q

    2 M) w8 q% n! XJEE是一个规范集;
    ; u1 r- P7 z, v: ^5 p$ C5 N+ j
    5 \/ F* `- G+ s6 R6 V( H7 E: C( HJEE是一个框架集;) j- g/ F: l! u* Q1 Z) a& E
    * z) R6 F4 J4 n% m
    JEE是一个技术集或API集;
    ! O4 m3 G+ b1 E
    6 L3 T8 W9 Y0 M适用于创建服务器端的大型的软件服务系统
    * \2 A; m2 b8 R2 q( l; c! E4 U% E. A

    # @/ {5 u5 V" ~* C1 w% v
    - x- V* P* T7 c1 UC/S B/S 模式
    " `" d+ H8 \: P% T  J+ SC/S client/server即客户机/服务器模式,客户端也参与程序的运行与计算(富客户端、胖客户端)
    ; Y' J4 Z9 K: x* h
    ' H3 }2 x4 u0 N) z2 K  D. TB/S border/server即浏览器/服务器模式,又称为瘦客户端,客户端不参与程序的运行与计算# w: ~: p0 U' L
    , o( F0 d) C. E# s& K" g/ H0 @
    ; @6 \. u2 ~' X$ ]  _( j" k+ ?
    , G% P9 R- g6 J5 y6 ?* R" ?7 N
    企业级应用(大规模的应用)的特点
    * O% d9 J' M# g* k7 I, o1.生命周期长、稳定、可靠. r2 d1 g8 ~- Z  f

    8 X5 |6 Q0 l8 U. \( V2.组件往往分布在异构的环境中,能够跨平台
    + U, T( t. w% ]. b- G- A$ q* E( b* x9 g
    3.维护性、扩展性、重用性
    : X5 H9 j/ O6 ?
    % B- Q. L8 `0 \& H4.有事务、安全、线程
    % ]  R9 L# W) h  l* Z% \8 X+ v; T( `1 J! g; C6 V

    . @9 ]  c8 u2 P9 X; [5 m& m3 \1 w# D2 b% t4 j
    什么是业务逻辑?
    , E- n& [# a! ^; w依照业务逻辑划分模块,
    4 L; H! c& C, ?5 d# \6 s! {* j( O( v
    5 f5 D# f+ o  {9 g- h所谓判定业务 就是具有以下特征:' d3 B; k# w1 L$ d" m, {5 V. s
    + @/ T% j5 k5 {: g' S" ]
    1.业务流程; E" G* ?$ A# S; _
    9 S( k) t+ R  t
    2.业务判断( P" J6 _, G+ W) T) E
    ( g2 }5 n. w' ]1 r+ E3 Q  E
    3.功能组合
    2 |* n( T8 `1 s  J% G. G* _. ?5 i8 H+ B/ P9 g- K
    7 c/ ~, ^" N' h% K/ ^

    2 Q8 u0 L# G) L' z5 y) i平台(角色)的划分' m/ D7 C+ I% r/ N' s
    1.平台供应商。提供满足API集实现的厂商(BEA weblogic IBM webshphere); D( l7 d5 l+ p+ H5 i* O
    . h: Z2 F& G4 @6 k& V% K
    2.组件供应商3 ]" ]; i, F4 T; t: ?
    ( [7 g) {5 ^' b; n6 `
    3.组件装配人员
    8 D1 B  A& K6 @9 A4 @+ N$ \9 k5 n+ p  {' h) i4 d
    4.部署人员
    ; h: H/ u, C/ t% }- b% ?
    3 I/ P: V4 a7 B. q, V5.系统管理人员
    1 V& y. R5 i* t# D9 |/ m
    + U- J" i9 Z# Y# K* l% y6.工具供应商 提供开发组件所使用的工具(Jbuilder、eclipse)0 O& s* G, p1 ]

    % e1 R1 C) f* w. _
    . J; [8 a1 s. }& \  o" \5 O+ H/ S9 `4 u  A# k! ^# h6 A" g- M
    java技术分布(设计架构 模块内部设计)3 q3 p/ Y6 o8 e1 M
    1.表现层 Servlet、 Jsp、 JavaBean、 Taglib
    & z, {2 @% |' X5 R* l7 Z4 o5 _7 Y6 E$ Y8 F3 s: M& V
    2.逻辑层 EJB(SessionBean)
    5 \# u! V# `; O% z5 p4 F. Y  P1 k+ P3 r1 S2 m8 ?
    3.数据层 ( JDBC  EJB(EntityBean))# J3 _2 o- ]$ M1 A/ P4 A. H# d

    . G$ [" k- w7 t8 _4.服务 JTA(JAVA事务架构) JTS(JAVA事务服务) JAAS(JAVA授权与验证服务)8 Y! T1 `' n2 Z

    ) t6 K1 _+ ~. _5.分布式通讯 RMI(IIOP)+JNDI 、JAXP(JAVA 的 XML 架构)
    % S1 I) a" P0 K
    $ [7 b  Y. z) Q- q. S, q! {2 h2 ?JAVAMAIL(邮件服务)、JMS(消息服务)、IDLC、JCA(JAVA连接器框架 (成))
      D! j+ d2 l% q5 @4 n  J, D9 a, V' ?, `8 B2 ]+ k, t; o# f' t
    , g8 q( h# o/ N- c6 Z
    8 E! o3 S" p9 s/ u+ O: V% s
    JEE的体系结构: 是一种组件的体系结构# M% X8 q, _" R& N: W
    1.组件 : 能够完成一定功能的封状体(独立的功能的集合)
    0 p8 H# e. `6 G& b" i7 y1 |& \% h: T- o4 B+ p
    不能单独运行,必须运行在容器上3 @3 M5 R; f8 g5 R

    8 _8 i" f. k6 Z* Y分为两类:web组件、ejb组件8 Q0 C* M0 w) K2 u1 w1 T. U

    1 c$ E& l$ B; N  P% J4 S: P2.容器 : 提供组件的运行环境,并对组件进行管理(一段程序)
    5 Z$ ?( U  c. E
    3 l2 i1 F1 [+ S4 ]8 I2 H6 w管理组件的生命周期3 ?+ f/ P2 \: n
    5 e1 e8 k5 X6 ^& m
    不能单独运行,必须运行在服务器上
    & ]$ G' W' t# C7 e, z
    5 n- S5 H8 R  h/ h# M程序(组件)通过上下文来调用容器(context)- I; A4 v8 G0 ?4 Z, Z: N

    . G/ [: l) t+ @% V* ^( y组件通过web.xml向容器描述自己,使容器能够认识组件
    / ^# C7 f2 h2 f  d8 g0 L( @& @0 z1 x# ~$ f$ _( K! W5 z. w
    容器通过回调方法来调用组件* r/ h8 o; P1 T- Q% p

    + r" w. L' b9 W/ {0 b: i! U* \; R分为两类:web容器、ejb容器% `$ }& w3 n$ A" E! w- B
    0 Y6 ~- s7 @& s) b! ^0 Z
    3.服务器 : 提供容器的运行环境,提供大量的JEE基础服务
    7 P1 ?! a3 p2 r! p7 G% q: J# n2 W- g" g
    web服务器(只提供web服务)! m0 D$ e  e! K* i* U2 H2 ?' @

    % J3 \8 I, [" V9 tjee服务器(提供web、jee服务)
    & J) N, H6 |3 ~9 o6 V0 Y& {' m: ^6 H

    8 d. g- @  j* y  e
    0 t; y. Q" c7 T( A) K0 |' n' r) }什么是回调方法
    ' |" U/ v  M; |1 W由容器自动调用的方法,就叫回调方法。
    1 t; R9 _+ ^  o1 B0 \0 @4 b7 ^/ t& p* N( `# R  @1 [
    , N8 K1 d; w$ S  `( M

    + H( \% Q( q1 f$ v8 F% x7 t4 x) [RMI远程方法的调用机制8 s9 e3 O4 ?3 k$ `8 f( |) W5 \5 g
    例如:A主机有B()方法,C主机有D()方法,A 想调用C主机的D方法
    * P! \, r0 V% }0 I
    3 H' m& b( y  o* O1 U
    ' d- ~8 F* w: c0 T& Y! @; {* l9 q7 ]" n0 Z( |% h% y+ [6 o* {
    3 c- _# W: x- Z; D$ A

    7 H7 u, p# I; [$ C. c学习方法
    7 J& ^3 J( f3 v7 E/ d$ z! U) K7 N1.规范(熟记) 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
    ( X  R- b, R7 r; s& u& a
    •     描述war包、jar包、ear包的结构
      0 u) s6 C* g: r
      / `% I2 f, u. i1 V
      9 k. `# q9 \3 ^( H2 F& `  B

    war-                            web文档压缩包

    —WEB-INF

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

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

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


    2 s4 \  v# [8 ^+ f7 ~1 |" w

    jar-                             java文件压缩包

    —META-INF

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


    3 m( t1 s" L! l9 N, S  g: |& j

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

    –META-INF

    —Application.xml 配置文件

    –*.war

    –*.jar


      C8 v% e$ J) @) b' H$ }0 |( e
    • 什么是servlet?servlet主要做什么?
        h1 s, D0 ^; n# o% L9 A

      ; d: h- r2 Y& J1 L3 I3 s% }/ I4 B
      " q: x/ J8 g. n6 v

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

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

    8 E1 v; [) c9 g+ I  v
    • servlet 与cgi相比的优点?servlet的缺点
      , E- ^0 v4 r1 l$ m- E5 I. h

      6 [. w% ^  N" ~) j. ]. b! W. \2 A

    优点:

    性能(线程比进程更快)

    可伸缩

    Java强健且面向对象

    Java平台独立

    缺点:

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


    ' A  r8 z- I$ |2 G+ P9 ^) W& G/ \
    • 常用的servlet包的名称是?
      9 x3 J4 t, A0 ~6 l0 ]$ h

      3 o/ t& W8 s" S1 x+ g& i* X" t. |. ]9 o3 J# Y2 w

    javax.servlet

    javax.servlet.http


    ) Q4 F0 t/ C, f. [' m
    • 描述servlet接口的层次结构?
      ) A) i. C4 Z( k- [6 Z* r7 G
      ! S/ L, z6 U: m9 }1 a5 J' n/ S
      5 p9 b& C8 B3 [$ f

    Servlet

    –GenericServlet

    –HttpServlet

    –自己的servlet

    ServletRequest

    –HttpServletRequest

    ServletResponse

    –HttpServletResponse


    ( |! U( c% ~/ z, _" M% W  X; I
    • 对比get方法和post方法?
      - J. t6 ?# Y7 X" i% N8 n2 G* B
      + a& h* e, k9 ~: s! f

      5 C* g8 m. p1 o

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

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

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

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


    1 v1 t( h$ S$ q6 @( O9 M
    • 归类描述HttpServletRequest接口都完成那些功能# V. k$ D- H# k

      3 n7 F* r% w, K3 D+ X7 H2 o5 Q0 B5 ?2 _2 `6 Y0 p. \; A  \; ]
      • 读取HTTP头标
        ; Q/ g1 Z" H5 H- }* _; v2 \( a
      • 读取cookie
        - z% ^# c4 g" T. T
      • 读取路径信息( R, t) [6 R% w9 s6 E- g6 J
      • 标识HTTP会话。' x5 ]# t) j: X" H. |4 _- D

        % e: ~7 t2 R# \" M# V/ w' ^
    5 ]5 H" |( g/ ?; N. |
    • 归类描述HttpServletResponse接口都完成那些功能
      1 o/ R8 k4 a/ ?- r' j- U1 x
      0 U5 Q, O. W3 |

      4 f4 r; K% W& i
      • 设置HTTP头标% p. \4 v+ T" s( i8 O( _( {
      • 设置cookie4 x3 X" p. z5 j
      • 设定响应的content类型
        4 e& a4 u) U# a7 {: H
      • 输出返回数据: H/ P5 J1 P3 R- E7 v; F0 n
        % |+ O9 N4 _; o9 `) ^8 ]; Y- c

    5 |9 C6 e& G' _" N
    • 描述service方法所完成的基本功能?默认是在那里实现的?2 z. R) O2 x0 H0 B# r8 E! d
      * |, X. Z  U1 [1 O1 g. @0 ~: s9 ~1 j
      2 V# N0 V) Z, G: T" c1 b

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

    实现:默认在HttpServlet类中实现


    6 _2 F1 r/ r, Y. D- m, \
    • 如何开发自己的Servlet?描述应该做的步骤和每步需要完成的工作9 Z- E/ t; i9 ~, F$ T  M
      ' u8 z5 s3 Q% Y5 _

      ' e; g* ]5 V4 D% O4 g3 \- y; v* f$ s

    1.引jar包

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

    2.开发servlet类

    1)首先继承HttpServlet

    2)重写 doGet( ) doPost( )

    3.部署

    安装web服务器,例如Tomcat

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

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

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

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

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

    4.启动服务器

    0 d# X9 ~: g# I9 ]
    • 为何servlet需要部署描述?5 R3 y0 E7 x2 L1 T; I2 K# e& W

      0 x% U( a0 M3 ]! Z' D! c( V
      . S- Y+ A# q0 L. J

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


    . F5 q, h# o5 ^6 \2 X
    • Servlet基本的描述应该是?请写出来/ _) a" r5 u2 N: @
      ( U* h2 i7 E) X" J9 w$ U" H

      , w! q& S5 C+ U5 X
    . h8 Y* J! o( s. q; c/ U8 |

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


    ' @* l7 L% O. }7 R$ V
    • 如何在html中使用servlet
      ! \9 |3 [0 c( J# t6 h  f  t

      # |; @6 d& ?2 h  [7 |2 Z& }0 y$ e3 E, A6 E4 }& F9 t6 b/ w

    FORM标记

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

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

    语法:

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

    {HTML form tags and other HTML content}

    </FORM>


    % y+ E$ H* W2 f4 s
    • 如何接受request中的参数
      1 J7 E; \1 B8 K/ ^# f. m

      5 \3 `7 G/ o1 \- t5 AString userName = request.getParameter(“userName”)方法
      3 d6 }9 B' h& s( }3 y  X
      9 ]: ?# R6 ?/ m  o6 }$ p
    ' }) j& y- i. {  P
    • 如何接受request中header的值& @, I0 j0 K, @8 k5 e

      * S4 x# R3 j+ g$ m* `& h( D
      6 O. F! k5 N% x5 Z+ @* Q9 V$ N

    request.getHeader(name);

    request.getIntHeader(name);

    request.getDateHeader(name);

    request.getHeaderNames();


    * f% a: |% y0 m  m$ ?' \- L' a$ q
    • 如何输出html- B7 T4 C  w6 O1 r# Z0 K* F% X7 Y4 b( U
      " H! o) O1 s: N1 d- c4 Z
      ( R  @7 Z1 U! d! h. `- V

    PrintWriter pw = response.getWriter();

    pw.write(“<html>”);

    pw.write(“Hello”);

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


    / t0 R2 S$ i4 b
    • 如何设置输出的contentType
      ' G* G9 z) h* k4 v4 N
      3 ^6 Q. e, [5 X. W: {, E

      $ \# o+ P1 X" i4 I

    response.setContentType(“text/html”)

    & d! {% ]( s( R8 A& M  S1 h
    • 描述servlet的生命周期?0 W' s: W6 U: A% N! l. v
      6 _0 }; ]9 U# R. r( e4 e
      & g9 _5 K$ \0 i; s/ A6 H5 u

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

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

    # m4 d3 ]' N7 C
    • 描述init,service,destroy方法的功能和特点" I: l+ s2 P) P0 d# y$ G% v0 F
      ( z& T) I% H  {, O+ v
      + N  Y+ T; X/ S1 y0 x

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

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

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

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

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

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

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

    ) O& P! x( a' q/ z' v" ~
    • 什么是回调方法?有什么特点?
      9 ~/ w4 P, ^$ r6 m; D2 J, ~7 _
      & I. w9 p* F1 L; _$ r

      ! L- h# j, c) d9 @  L- {* V

    由容器来调用程序的方法

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


    6 P& q0 N% t, \& [& x+ P. L3 X8 q
    • 如何设置初始化servlet的参数?
      % N: E: v3 }3 A& m
      1 v5 F/ T7 o) o% t# Q# p  B3 {
      在<servlet>中添加如下配置) y  Z, n+ f' P' c& S- r6 w
      7 y$ _" h  @0 m& D, }5 n

    <init-param>

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

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

    </init-param>

    7 [8 u) ^9 ?, [* T! H# b- p
    • 如何获取servlet初始化的参数& f0 m; j0 m( [
      / {, s6 M0 P4 H& X
      / Q8 e0 ]& M' C- Y

    public void init() {

    greetingText = getInitParameter(“greetingText”);

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

    }


    . A6 I$ t& O. d, f+ F1 I0 ]
    • ServletConfig接口默认实在那里实现的
      / N" T! V5 U) A9 ~* ?4 c+ p; @

      ! y( J# ~/ X) l3 k5 l7 w
      " k7 w8 x+ ~/ F, {; w* X

    GenericServlet类实现ServletConfig接口

    6 m9 E' y$ j+ _+ P( d
    • 什么是ServletContext?有什么作用?
      : y$ d$ j& @3 o+ h1 F* G

      4 T# s% [* D  m7 K( G2 t
      5 a/ P, W, [6 f% n3 U' ~8 P  P) g

    Servlet上下文

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

    1 x( j! L0 n. J4 Y$ \
    • 如何访问ServletContext接口?是在那里实现的?* L+ B7 u6 t% t. [' @8 f7 F$ `( i

      ( Z4 V: K0 F) ?- x, u
      " d2 d9 n2 }/ z$ e

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

    GenericServlet类实现了ServletContext接口。


    " R% j; J' B$ H( P" c- n  [
    • ServletContext接口的功能包括?分别用代码示例
      6 R. [4 |, b4 h: T0 S) K2 T

      2 v! J- u: h* O* d
      $ i1 L4 H/ e9 [; W

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


      ?# Y7 x! V) \) a/ W9 Y
    • 如何设置ServletContext的参数?- k3 T  Y% y% t
      ) W9 P( T4 {% A' A( t: o
      8 o0 \1 h  @% I

    <context-param>

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

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

    </context-param>

    0 A: q$ w0 w' H6 W7 s
    • 如何获取ServletContext设置的参数值?8 n. U* t6 Y$ P& `
      " R) S5 l  `* m+ A3 \* M9 w( X: I

      7 D7 \" D, N6 q4 K

    ServletContext context = this.getServletContext();

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

    0 r6 v, ]) K. Z$ ~8 |0 A. A
    • 描述Web应用的生命周期?- a! k" x. L2 D

      9 v; O% Y" @% Z/ K9 v! N5 _8 W. `( V) I( ~5 B

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

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

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


    6 V) `+ o. _4 S
    • 如何用代码实现监控Web应用的生命周期?+ ~9 |: e5 u; h7 D& `( u# q/ K

      + O+ ?( @$ a2 m% G: c/ p. }* y& h1 _- a2 L5 t7 j( i" f

      & \. d) F) h1 M& v+ V

    public class Test implements ServletContextListener{

    public void contextDestroyed(ServletContextEvent arg0) {

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

    }

    public void contextInitialized(ServletContextEvent arg0) {

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

    }

    }


    * I. e6 [' p/ Y1 l0 K- y+ r/ d

    web.xml文件中的配置:

    <listener>

    <listener-class>

    com.csy.Test

    </listener-class>

    </listener>


    9 H( J$ s. r8 ]
    • web应用中如下错误码示什么意思:400,401,404,500
        f' C" r* U- l
      8 a$ T0 q* W: h- _
      400 Bad Request//错误请求
      401 Unauthorized//未被认可
      404 Not Found//没有创建
      500 Internal Server Error//服务器内部错误
      # }; |: P; I: ~' @

    ' A, v' F3 ~6 y9 G
    • 描述Web应用中用声明方式来进行错误处理的两种方法1 F. f) W1 H% v$ a" L) R$ M

      9 M8 U6 z) b9 E( t) A. y
      + R0 b3 ]* o4 j" {- v1 |' b) n! v

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

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

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

    - q( t' X+ i5 N9 B# S& D  T) K+ I
    • 描述记录异常日志的方法,都位于那些接口?
      % h' U. L' H- [* f2 v1 a7 ^

      % T2 H) D% }1 m; b( b
      + _  n1 H4 F+ {/ U

    GenericServlet:

    log(message:String)

    log(message:String, Throwable:excp)

    ServletContext:

    log(message:String)

            log(message:String, excp:Throwable)

    & o+ F9 S; j( y1 }( K9 U7 ~2 x- {9 R0 ?
    • 什么是会话?
      # l# l* ?* {% V  z2 E* }
      ' p/ E: T; M7 H! {
      / G# a8 Z, U8 H# i* z7 p

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


    , `% b( m4 ]+ U3 P5 ~
    • 如何获得会话?
      9 x' G' K. i9 w3 v. C7 k4 _
      6 m" @6 n8 ^1 H$ R4 z
      HttpSession session = request.getSesseion( );

      0 `7 c/ a( p, W
    * L  }$ s$ ?: {4 s2 }0 d
    • 会话Api的基本功能?. y" I$ L4 K6 U9 K  |

      % b) |  K4 A9 S. ^( C7 `2 J* O1 }; I7 J1 A

    getID() :String
    $ l2 n* l) V  y8 G/ u6 J# j( g7 f

        isNew() :boolean- m/ K4 y' `8 [

        getAttribute(name):Object
    9 A# P+ ?1 {- a) |0 S. l

        setAttribute(name,value)
    ' y2 c  U  \1 p) ~) C* l4 u

        removeAttribute(name)

    2 ~" s. R0 X% N+ r/ r2 O4 Y
    • 如何销毁会话?5 l7 V8 e. g" }9 k$ s5 a( S
        q1 k- U% j4 i( t* S0 E7 j0 T

      2 F8 }5 L; s8 _- i# O

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

    <session-config>
    ' a3 S, }5 b1 P$ {6 h3 M

             <session-timeout>10</session-timeout>2 u0 v9 f* `4 h6 t3 V; r

         </session-config>
    % Z: r0 F3 G( I: `5 t' G2 `

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

    invalidate()
    4 z: u) J; l$ x+ v7 o

         getCreationTime() :long
    , W6 N7 \. O3 O; v

        getLastAccessedTime() :long" o- z2 w3 L( x

        getMaxInactiveInterval() :int
    1 c" G) |, B  q* g' N, O

         setMaxInactiveInterval(int)


    - \; d; i7 u! A  w& `" I8 Q
    • 描述会话保持状态的基本原理- p$ y9 [) G: n0 Y+ u* N7 Q

      / _' r& Y" W+ R, o5 ^6 N/ V3 n' A1 v! _

    7 l: B  C  N& [: P  [2 s

        client server3 z: X/ M; J: _9 b+ f7 }, L# B; w$ L+ J

    ; _2 K6 R1 Z' f$ E! H% _

    request
    % k7 ~. V. S! [$ i( ]% i/ l% N

    response (sessionid)
    , N5 b" G- g7 H" R

    request (cookies)" D* T$ R* a. R* I2 A9 W5 C

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


    3 M1 {6 D) Y1 g9 f# T  ^
    • 请描述session和cookie的异同之处! v0 }+ F$ O$ k( B
      . d9 t5 F9 {  B# R
      : H) l4 B% G; h0 A. ~

    ! I" r/ @! t8 x* g4 @9 ^
    2 v. k; i" |* }; e& g
    • 如何读写cookie,代码示例5 b. o+ Z2 D5 \! l( R# E

      7 z6 k+ `6 U( o. R1 A
      , U0 D  r! R% y1 U

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

    response.addCookie(c);

    读:Cookie[] cookies = request.getCookies();
    " Z( L6 A* A/ q# U

            for ( int i=0; i < cookies.length; i++ ) {
    $ R% ^# K# F$ N6 [7 R9 h# U* K5 x8 B

                String key =cookies.getName();
    & S; Y4 o, G" k+ p7 A2 G% a

    String value = cookies.getValue();
    ; R. m4 y* {6 `. W: q

    System.out.println(“cook”+i+“:key=”+key+“,value=”+value);  e: Q; [& T) _$ a! }

         }

    , }0 D' r% z: e
    • 什么是URL重写,如何实现,代码示例# F7 Q2 |3 `% `+ k

      8 x. r9 C) S! X/ c; C0 l$ F6 b* T7 e6 F' J+ X5 R$ F4 J: c

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

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

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

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


    : A9 F2 W+ Q7 O8 P( p7 p' f
    5 v* P. J  N5 V4 c
    • 描述web应用的4种认证技术
      ) }0 J6 u. Z) a: O. Z$ F
      3 ^: I* L7 n, B/ [3 [$ Q% P

      9 U0 `3 V0 M$ S! @9 W

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

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

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

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


    # `- Z# g% T& h- Q) v( u
    • 什么是授权,什么是验证?
      3 w. P9 @+ j( T. f

      ; O2 O3 S& h" J( m* O$ U2 c' ^; v8 R2 n

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

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


    ) ~& y0 K, t% z9 N8 `
    • 什么是HTTPS
      9 q5 q/ x& Q5 G

      / g3 P0 c+ o8 I
      ! U4 i( f/ t: G- u# ?

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

    9 f' F* J- S& g3 m' H. e3 i
    • 什么是审计?4 Y0 p/ e3 \* x. `9 J7 B9 a  Z+ q
      ; Z! @* W6 b# Y
      ( u. c. G# E. A/ G

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

    ( s4 e. v5 e: {
    • 如何实现声明性授权
      7 S- f- a: U, ]7 W" F; \! f7 M* i

      . Z5 G% G. C1 n$ Q9 o, u& D- v( h# W7 K# g/ i

    1、标识web资源集

    2、标识角色

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

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

    在 web.xml里配


    1 B, |. q6 @% {" m
    • 描述servlet并发问题?
      7 z: m) y1 \: o3 }
      2 V2 w: h6 E3 d- x
      ; _5 A" Z5 |. L  ~

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

    : e# Z1 m  z9 T1 M: Y  p4 J
    • 描述Web应用中的六种属性范围
      : x2 `( _6 H/ h" s* y) F  c  O

      , d) l5 U* C1 w: `- }8 W
      . H, T3 b3 O: s# A' i5 [: j3 \

    局部变量(页面范围)

    实例变量

    类变量

    请求属性(请求范围)

    会话属性(会话范围)

    上下文属性(应用范围)


    - o: r; E! U7 x
    • 指出上述六种哪些是线程安全的4 y& `: N. h% e

      , N8 E* I; L7 l. |$ [: i5 t6 U2 h" e& W* L" e

    局部变量和请求属性

    # k* I  n3 y9 o/ Q2 c2 g- F3 j' x
    • 什么是STM?如何实现?
      * ^- Z$ Z. C3 A6 D/ J) O& O. M
      # V' ~5 W; F4 W

      3 A4 c% A' j3 K

    SingleThreadModel接口

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

    ' z. U, q0 |' @9 r7 ~
    • 如何实现并发管理?
      3 [( M- v4 i. X+ r4 Q/ E

        X$ B" F6 N! z& H3 z, Z! ]7 [+ ~3 w5 y! C& O

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

    使用synchronized语法控制并发

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

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

    8 S% w# h- T: H7 a
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    13#
    发表于 2014-12-03 12:45:45 |只看该作者
    Jsp7 y7 q- O$ N+ \$ w, N  P3 q1 v
    什么是Jsp?
    : _2 E* I; b5 Y' MJava Server Page    结合java和html在服务端动态生成web页面的技术8 |& a$ u8 t4 d- L9 S2 K$ w
    ) Z! d$ ?) X+ ]: j" J. p- g
    ) W3 |0 a% c6 L9 A3 p( ?. ]& a
    : M, ?" k& n5 o  A- h
    描述Jsp页面的运行过程?! `7 B' W- I7 {; m0 `
    第一步:
    5 B6 K. [0 r; d& ^9 U, z* |9 S2 j
    请求进入Web容器,将JSP页面翻译成Servlet代码
    ( X9 h' ^3 u) i, q7 [! [2 N
    ' E/ A6 K6 V' D  j5 ?( E8 }第二步:. R# \5 j7 j" P$ K" N
    9 P. w) r! y8 i. E* H9 v  V
    编译Servlet代码,并将编译过的类文件装入Web容器(JVM)环境$ E/ {0 P, S6 A0 u0 s" X

    $ x& K( X7 i4 N! q第三步:
    3 {/ `$ e0 ~% f; ]4 @: O( T5 I3 W* [
    ; D" }+ q1 O. a' ^: C! mWeb容器为JSP页面创建一个Servlet类实例,并执行jspInit方法% _) [+ w. m) u2 e1 `  L+ d# v% e

    ! z3 J- j0 R/ ^4 i第四步:
    ; D8 u1 F! d" K: j$ V' S3 j# E$ s+ F2 ^0 \7 A; X& e- A& P
    Web容器为该JSP页面调用Servlet实例的_jspService方法;将结果发送给用户
    ' z0 U5 ~- `. u+ P& N. d/ G  T
    * y+ W  d7 n1 L1 ^5 C
      K$ @9 _- X; }  z" x$ G
    / @' C  k' Z; g0 r8 z描述Jsp页面的五类脚本元素的功能、写法、并示例
    / V; H/ o& D9 ?: \注释 <%– –%>
    + Q  j6 V; I2 Q9 y; ?# H4 H. ?1 r. ]0 q# Q& q
    <HTML>
    + ~: y2 C- \* L3 i$ l7 }$ u/ n$ m& B$ _6 }6 b
    <%– scripting element –%>- d7 k& ?1 r% u0 ?6 O

    * T) O/ Q( o1 b3 `</HTML>! C0 I& M; {% X+ e  a

    6 j& {: F$ T" D, E% @- @6 Y  u指令标记 <%@ %> 指令标记影响JSP页面的翻译阶段# R1 R. o0 y  J

    % e3 G5 Y9 H5 a: i9 x; ]) P<%@ page session=”false” %>& v  U4 x3 K" g6 Q  h0 l

    4 m- @# ^4 V$ R3 f, O: Y, i6 R声明标记 <%! %> 声明标记允许JSP页面开发人员包含类级声明
    3 w! e2 D# t$ e$ j$ h, K8 h) L- N8 L. U% G; W+ m
    <%! public static final String DEFAULT_NAME = “World”; %>
    + Q$ V9 d2 j. ~* b% V: C' Q2 f7 b( p/ i0 D
        脚本标记 <% %> 脚本标记允许JSP页面开发人员在_jspService方法中包含任意的Java代码
    & w: @" R+ W8 c) g3 W/ r# w" g, \  h) j
        <% int i = 0; %>
    # u, L! P# G* ~8 w
    ) V2 `* H# X7 Y3 C* f4 O! N' A表达式标记 <%= %> 表达式标记封装Java运行时的表达式,其值被送至HTTP响应流 <B>Ten is <%= (2 * 5) %></B>/ Q- l' e- w, d# b# P3 \7 b8 Z
    * |. Z1 \; H3 N/ a; F
    ( j. g- s" G9 Z: `3 ]* \2 _
    & _3 q2 a" {8 |% L
    描述Jsp页面中的注释种类和写法
    9 J% u! X' P% R4 UHTML注释
    / N+ d4 v& a, ^+ k  y% S! F: U% z' D5 C& C" @9 e6 y! S
    <!– HTML注释显示在响应中 –>
    6 Z& v, \0 m! e9 \0 o7 i# ?
    ; X! j9 a/ R) i, R  z; yJSP页面注释" r/ G! j  r; H, t' f1 ]3 {
    ! l' b: }/ R8 I' L5 t( `5 [* u
    <%– JSP注释只在JSP代码中可见,不显示在servlet代码或响应中。–%>
      l7 \$ ?9 A: |+ F$ P6 S2 Y0 s( y9 t; i5 h# p9 [6 Y
    Java注释, y$ x# p! ^' R! T2 ~  n& R1 w
    : D9 }: I2 k/ Q% N1 G" o# E; O
    <%' j; t9 d' W5 ?+ K  b+ D
    # B1 T9 l' y. m" s# H
    /* Java注释显示在servlet代码中,不显示在响应中
    ; N0 F4 R7 x1 U) |( ]6 m# k! t, f3 d
    */
    5 {- N( h% l7 M' ^* e% R1 ~
    " ~! O! {/ ~( ?, }& N" z%>0 S' a8 Q2 _  ]$ y; ~
    ! h7 i9 E# o4 l
    " k9 {- k/ j+ ]8 e6 M; e0 R& y

    % ]4 \" U* d* l) b2 R描述Jsp页面的指令标记的功能、写法、并示例
    8 j8 G: p- S7 t2 _" H  _指令标记影响JSP页面的翻译阶段
    ! q% `! D# O8 v$ @+ V* J$ z2 h
    8 o6 r( l+ ]6 F' s& l<%@ page session=”false” %>/ w; D( |5 X# k9 U0 F6 G
    ( g4 [8 B: v- L% A
    <%@ include file=”incl/copyright.html” %>, O+ a3 S& Z8 ]+ h7 T: N8 W# O2 G
    + K* n; n1 _, b& @0 {" C
    <%@ taglib %>
    1 N6 m% e, ~( a
      G( G" n5 h$ r: V* [ 1 S' n0 b- [2 v8 r& K
    + P. q8 J1 m2 k/ N
    描述Jsp页面的声明标记的功能、写法、并示例4 {! M( f/ T, o% m8 l* c/ o
    声明标记允许JSP页面开发人员包含类级声明# ^* @& n0 l9 P9 E2 C! o: q6 h

    ( W. @! B$ d0 S$ l6 _写法:
    / w/ l8 W7 m% u' ?  U4 q+ H5 `/ I1 a9 O% ?- p
    <%! JavaClassDeclaration %>8 M: ^7 B4 x. M  l- r- |, a; I
    * L2 W7 J& T$ r7 K9 s
    例:
    * s. o9 l! M( V/ [, s/ L* f; @2 g& F( D$ m: |, y
    <%! public static final String DEFAULT_NAME = “World”; %>
    ; p; F0 ]  s5 a- i; Q0 D- z! d
    - R" ^  _0 W$ F5 W% e; W<%! public String getName(HttpServletRequest request) {
    8 S" ?0 I0 Z! I# E! J  f
    " K1 W  b% F+ E* Zreturn request.getParameter(“name”);) B- p6 `. R- N$ k

    ) @& |9 t6 q- I) Z3 A- n* v- j}
    , i; A& }3 A9 Q; ]4 o& }* I' t( {1 V$ B, {. N; d8 Q
    %>
    ( O# D, {- S6 S& [9 W, T9 W9 n: T+ a% C- x! @) v
    <%! int counter = 0; %>3 }; A* e9 |. b5 ?1 l
    ; D' K6 _! F  y4 Z: Y- Q( r

    & r/ o- Y/ H9 B9 @5 \5 X
    + q2 `9 p1 E* L4 p  `+ J' _/ s) m4 R描述Jsp页面翻译成Servlet的规则
    # J$ Z; P9 m6 A9 H  V: c. @jsp中的注释标记被翻译成Servlet类中的注释
    $ ?% L; D( b( e& c% ?/ F# q, @0 f! ^) _
    jsp中的指令标记被翻译成Servlet类中的import语句等
    ( W1 V( u8 ]1 I: y$ L2 \4 J6 c# d7 q+ O
    jsp中的声明标记被翻译成Servlet类中的属性# {6 m3 I8 x9 h6 G
    + X9 U. r" |) {8 T" [) l
    jsp中的脚本标记被转移到Servlet类中service方法中的代码/ x6 x2 B! s* _9 g' A  q
    4 @8 v9 E2 n6 k) @: w, e
    jsp中的表达式标记被翻译成Serlvet类中的write()或者print()方法括号中的代码
    , y( F/ R* ~0 H/ `; {3 r2 b$ a: _6 @+ k; J3 m
    / H: A# G, v) ]) j: q

    0 U; F  t7 U: C: o2 q+ L描述Jsp页面的九个预定义变量的功能、用法、并示例
    2 ]( e5 }) x, n% ^request 与请求相关的HttpServletRequest对象
    & v5 W& @. m. O. x/ i0 }& q5 r! S* o6 p* h6 n) g& j9 t
    response 与送回浏览器的响应相关的HttpServletResponse对象
    5 x; E9 q$ w8 P  U- P+ L8 t0 d. a  p. _
    out 与响应的输出流相关的JspWriter对象- ~3 m7 k3 L+ K! U
    4 e3 e. \! n8 @% l# j
        session 与给定用户请求会话相关的HttpSession对象,该变量只在JSP页面参' a" ^& Q2 w: \6 i0 u7 V# W
    , K% c5 F. t. d' [5 S% x
    与一个HTTP会话时有意义5 T9 p/ {! p8 B, u+ S9 N2 a( [5 P4 J
    $ `, X6 U& h% m: Y" J
        application 用于Web应用的ServletContext对象
    + D2 P3 k" t4 ~, }% r
    1 ?1 A& X( W) F& {7 k; p" h* bconfig 与该JSP页面的servlet相关的ServletConfig对象
    # d8 \* j2 b4 Y8 X6 s" E" o7 M- g+ H
    pageContext 该对象封装了一个JSP页面请求的环境
    ) W: j7 a$ c7 U( |
    3 Z8 u) R4 E3 k6 {9 c2 epage 该变量与Java编程语言中的this变量等价* u2 l" K+ W" c: c& J4 ^& r5 @( {6 O
    9 Z* O) w6 Q, A5 {1 p
        exception 由其它JSP页面抛出的Throwable对象,该变量只在”JSP错误页面”中可用
    5 \0 C& Z% s8 W8 t6 c. D+ _! B2 v& g3 h# C" n0 g' P% I( D4 \( }
    % A7 x6 ^) J3 `  t5 l% j8 v
    1 t2 c' E$ r) K$ ~
    page指令的功能,写法、并示例,并描述它的如下属性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding3 D7 C; M  b; s- V+ R7 H
    import import 定义了一组servlet类定义必须导入的类和包,值是一个由
    ; ^$ A. F9 q4 N- g. p4 @
    2 ?1 ]0 T9 J/ [' x' v* Z逗号分隔的完全类名或包的列表。
    8 a' D- |: T/ I5 A) o! L4 |7 C6 d+ `# l; L4 t1 d; N
    session session 定义JSP页面是否参与HTTP会话,值可以为true(缺省)
    0 f" h1 |, q, {" g4 q1 \% M7 J( o! |5 T' q3 c7 r6 Z
    或false。
    8 n' R, y6 p4 O5 H7 `4 Z7 I0 Q4 a! ^0 F( h0 a
    buffer buffer 定义用于输出流(JspWriter对象)的缓冲区大小,值可以为
    ; m  u# e) T' C- {3 [1 E5 o
    , _. S" V. H$ L  `0 a  W/ }! Mnone或Nkb,缺省为8KB或更大。
    + B6 a6 S6 r3 ]' ~# r! M4 d  B) o- k) M7 \( m1 r: r
    errorPage 用来指定由另一个jsp页面来处理所有该页面抛出的异常
    ( k" z6 O1 M) c0 @* \! m  G/ f) E7 F# l: _: M
    isErrorPage 定义JSP页面为其它JSP页面errorPage属性的目标,值为true或
    8 k/ s' K7 @; `$ g" u: W) y( T" D" S
    false(缺省)。
    ( J$ r4 v  Y$ ~1 T! ^" J9 n6 C( F' }# c6 r- G3 e7 W" U+ \3 _
    ContentType 定义输出流的MIME类型,缺省为text/html。
    ' G7 l3 y4 {, @6 q/ h5 `0 H1 C( l4 [% J
    pageEncoding 定义输出流的字符编码,缺省为ISO-8859-1
    9 e- V" x+ f. |' I' i8 v  B/ P
    6 a, }9 U! h9 [* H6 L5 F7 {4 d & o9 V: `5 w+ s

    2 z6 w: r2 p, U: R描述MVC各部分的功能?MVC的优点?MVC的缺点?
    , g) {3 C, g- ^  T8 ^MVC各部分的功能:/ ~/ c# s. \5 U

    5 A" q- t/ y% N: U4 ?Model(模型表示企业数据和业务逻辑)7 _/ E9 d2 n* }6 a* ^
    4 X) L* |: b, f: C, A
    封装应用状态6 _9 l2 x+ ], y6 ^
    9 u9 i7 \; |; `: d- g
    响应状态查询' \6 W6 ?( E; e7 s& e# S. M# n
    / m! z1 a$ l9 v! `' J
    暴露应用的功能7 a9 p& t; h( C4 \0 b
    / O3 b& G& X1 _  E, E% o: X
    Controller(控制器接受用户的输入并调用模型和视图去完成用户的需求)
    : y1 c- r' @6 r$ t/ R  o2 ~- J, w; R$ {  u' _0 |$ Q5 N
    验证HTTP请求的数据
    & R: W2 z/ \5 P8 w# Z' k' ]; d; U) r" c4 m
    将用户数据与模型的更新相映射
    4 C' W# o* Y2 X" y* Y/ k* @$ h
    7 Z! q2 w1 P" [7 Q1 V选择用于响应的视图% A2 r3 L) X4 [7 W& V
    # \4 M; R% |# f3 H. a. t/ ^* W, z
    View(视图是用户看到并与之交互的界面)3 ~7 A  ]8 g% b7 p: {) ?! g  C; c
    & D, Y/ ?) {7 p# W% g/ t
    产生HTML响应$ `; e+ j0 X6 X) [# s5 @+ E, r

    . D, t" A' A8 e请求模型的更新0 e* N0 S1 C2 G  ~, e( r
    5 m9 W/ _  T. ?8 m: u. U2 g
    提供HTML form用于用户请求4 e: c  C5 n# ?/ Y+ _1 R
    ; H, ^; R# y7 Q
    MVC的优点:
    4 m5 v2 O2 |$ r5 t: i4 J6 f( l7 K* C
            低耦合性:视图层和业务层分离
    0 Y- p5 G  u1 ]/ l( n2 h: c# B
    1 D- s* P, V! i5 B; H' S0 y% M1 z高重用性和可适用性
    2 o1 a9 `  P, ^. O0 ]" A
      M4 A6 @4 q% Q9 {9 Z较低的生命周期成本5 H% q4 ?% C% {( s1 P1 R7 e% i

    : O$ I+ h% ]( \! ~/ f9 O+ d快速的部署" v, B0 R: B, a
    2 N% a$ _' m* J5 f( R% }
    可维护性
    3 [4 k6 s) y& s  [8 X$ s/ c5 l  N0 X; }; n6 A1 g
    有利于软件工程化管理% c1 Z+ K- Y1 H& l3 I8 u

      v4 r/ K! o# @提高软件的健壮性2 D, d9 a+ ^: F9 z- U

      n* `" k' w! `3 ]2 ^  UMVC的缺点:5 P* v1 K2 J4 g+ j

    0 R7 _: ]; Y" p9 O6 z9 I        工作量大,增加工作的复杂性,MVC不适合小型甚至中等规模的应用程序
    ! T* [  [6 {& A8 ]. |8 s+ [& f& T7 {
    & U' P- c4 r# E$ U5 g1 S 3 a5 `# S, _. p" @: y6 Y3 p
    # k; h8 V' U* _  A; M
    什么是Model 1结构,以及结构中各部分的功能
    & p% k/ m, I( a( u# f9 L8 t. d3 m结构:jsp+javabean
    . D2 J; L7 w, B+ w) l( R+ Z* s' {. A  P" P# ^8 H+ q- Y
    Model1中使用jsp来处理web应用中的视图控制部分
    8 q2 O* y# \! t# S; V4 R& \# Y
    + w1 @+ Y; S* A' {Javabean收集参数5 b0 L; U4 q/ U# _6 ?

    * |: ?" x  [* G: [6 \' q2 u 9 ?3 B# o7 U5 d" f* N

    # }% [; T! F; n" A( o$ C什么是JavaBean?4 B9 n1 x8 @$ y; b+ G) U  C5 r
    用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。6 [# V0 u$ U" f) ~* I

    ( h3 w/ Z/ [% x& i 9 h$ O0 z  t4 @% A  ^# p% M
    9 h' u6 C& v$ m
    JavaBean的规则?5 @9 ^/ u9 W$ u, P
    使用get和set方法定义属性
    ' ~; T2 K$ Y. U# G8 |2 G3 b' [3 Q+ D5 j9 d; u3 t
    一个无参构造方法
    ' \7 |0 ?* f5 p# D
    * _  A) m/ u% ~% v无public实例变量( 所有属性私有化)' q  m9 W+ P5 p/ o
    ) P" W6 }1 T8 D  I/ Z
    6 `9 _4 ?0 {5 r- `& D, a) Q
    ( N" \6 I- M& S) W- h; p, E
    什么是jsp标准动作?包含那些?分别都是什么功能?如何使用?) u9 ~: _& h  Y$ _3 [4 E! `2 \9 K$ k! U
    JSP页面中使用类似于XML的标记表示运行时的动作
    4 w* n/ u' r! ]5 G8 @  D3 [7 d7 M1 t8 p, w' O) \; |+ y
    jsp:useBean( k3 i" U9 i* j$ w
    6 n8 e- D! G4 q5 F8 m* z1 \# E
    jsp:setProperty# ~0 K8 g% J& t, R" s

    : ]% S$ W/ g, b( H; i9 o4 G2 d7 j0 R: Zjsp:getProperty8 c" A. Y! x- t# X

    $ n$ Q: L8 q0 J6 Mjsp:param/ F" b, V6 P( i# ]

    - K' f' N; A  pjsp:include; a# P& ]6 h- D2 K

    . B' T4 N1 O* m- v" g! Mjsp:forward) l2 \5 I7 t5 p2 M

    + k8 B3 R- t8 @$ w 1 o& B% Z- V/ r) \2 v
    # f% V) W* G6 y4 r
    用代码示例如下标准动作的使用:useBean、getProperty、setProperty
    7 {- D8 f3 X! W3 x) @<jsp:useBean
    ! ]% S) q/ E4 m& [/ Q8 ~$ F; _( N) N$ X! g6 `0 Q
    id=”myForms”1 t) e  t6 d/ q; l' n% o4 |; p+ g

    ( {4 x: T/ I* {" z2 Vclass=”com.base.mystruts.forms.MyActionForm” scope=”session” />% C2 C1 P/ }  {1 O" K

    2 [1 P' Q+ L% b, R  V4 J; K    <jsp:setProperty name=”myForms” property=”name” />
      D$ x# ~$ C2 S. u! E3 b
    * k8 o: h% c1 e/ w! ?9 c( c<jsp:getProperty name=”myForms” property=”id” />, j  v- W" J) ?; [: f) `
    1 Q# i' t# y. t

    ) _9 ^" T4 A. i! I0 E' ]" A9 i! k( \+ Q8 L
    描述说明Bean的四种scope
    ; K, n/ I& T' P1 ^3 C5 C; lpage" S# g- q5 |/ P1 g  Q6 k/ T
    7 T$ ~- p2 K( g& o1 Q  k
    request
    3 a2 T* ?+ f2 L
    8 h/ z7 g9 m5 W, ]3 Z# x2 Isession4 [# p7 k1 e& u7 P1 N5 s: n& @, G! l7 k

    1 ]: m: m0 X6 g/ F7 Napplication
    + M1 ]3 S( T6 g8 U4 r6 g+ X( |, R# Z5 ~7 I) k9 {

    9 y8 w4 y* m8 L/ s7 V* E- R$ N# b
    ' V6 M! ~/ ^4 F- x) `描述说明页面上的字段和Bean中属性的对应规则# a) L  D9 M0 \0 E6 c: T
    id 指javabean的变量名2 O, h. v: m! P, _% U/ J
    , Z4 Z# P  W4 R+ \5 h0 ~* d
    class指javabean类的全路径: ]( [* e" W6 I6 N2 C9 P1 F

    ! J8 W/ ~4 |5 f( ^! M' P# pscope指javabean的应用范围
    # E& E& p8 B/ \3 w) s; S" T. z& E! S' I; n$ k
    name指所用到的javabean的变量名
    9 z' k* Z8 p, X- U0 Q& ?% R# R% Q) m" ]$ V
        property指javabean中的属性7 s' O$ ?; g" N9 h# ^; V6 J
    , {) H9 \! ^) |  I0 J
    8 S5 P9 T0 ~- C" }" L
    ' i. p$ w8 g5 K+ w+ b6 |
    描述useBean动作的处理过程
    $ ~) M8 G7 @, Y: f2 ^使用id声明变量
    / `8 r) i$ @3 E) y1 J) ]  \
    0 M) b" M% u- l  d6 i试图在指定的范围内查找对象
    ! {; E7 W/ w5 V2 D: Q
    * \# c% N3 o2 Z& t8 I4 p如果没找到1 \" u- V$ {* L) X1 d
    1 p( ?; e# y9 P5 ]5 Y/ \8 g' v
    创建一个类的实例
    % V5 M1 R* y6 K% c5 X3 v" y& C; O( N& o
    执行useBean标记体初始化对象
    - _3 L2 j, A5 C. s# E" t6 t( X: Z! a* d$ u' v
    如果找到
    2 p  _: c0 i1 W4 O' J
    ' y6 ]& a0 r9 L% v! O     将对象转换为类指定的类型! o( c* q+ x9 K

      `- \6 P6 r2 Y% n/ t7 p( m1 \8 v& x
    2 D; t( ^4 X  S7 V
    ' `7 ^/ C0 |9 K描述forward动作的功能* f# B$ g5 |8 j0 t/ I8 ^
    使用脚本代码处理请求时,可用jsp:forward 动作产生一个不同的视图,# C0 W1 R. [1 Q2 {' \8 _$ y" U

    # X# `. s1 n3 W2 @  ^使用同一个request:
    ; A: X) p2 z9 k$ G  X& `$ G; ^/ v1 b% B

    ( v* P9 D+ B. R: T/ |1 Q
    ; ^3 T2 ~0 `& t3 G/ |8 t什么是Model 2结构,以及结构中各部分的功能
    2 U1 M! y; @8 D( njsp+model+servlet
    9 M7 M& k6 K4 g! X5 j/ {* [
    ; s8 t. Y' n) tModel 2架构使用MVC模式,JSP页面充当视图,Servlet充当控制器3 d# ]1 m( U# c  y& Q! C5 Y

    3 J5 i$ ~# Y6 S7 D! k( B+ wServlet控制器:
    0 e& u" l8 ^' ?. G2 `' V# Z; \9 f1 B& o2 k6 d) B
    验证HTML form数据
    # T; i4 q; B+ s# V1 F0 Z3 q$ r- _; a
    调用模型中的业务服务
    ( j. Y7 ~( y5 ?2 a; [" v7 u# \2 @, H: m3 L- `6 ?
    存储请求(或会话)范围内的域对象4 u' C2 Z0 _$ e' E4 R; K

    , f  x0 C- Z! J: }选择下一个用户的视图6 _' J4 b! |7 i* d) _
    ) G- {; ?; g$ K- C$ Z- H  D" E
    JSP页面视图:
    0 |4 K# N" |! g, x
    / [7 ^: f/ e# T使用用户界面(在HTML中)
    " `0 M; ?5 Z+ A8 O2 R5 L8 N1 a) Q3 z% _- ?# g9 f
            访问域对象+ S' v: T, i( {3 P: N
    + Q! j& _/ ^( [+ Y  I* F$ u
    + A; F% f* [$ e& c' U$ }8 f9 S1 P
    ! N, u8 a0 J1 {1 l  _+ N- _% i: l' ~+ V
    如何获得分发器?分发器的功能?$ P# S8 e; X7 M+ y3 Z: {
    上下文对象中的分发器:
    $ c. {6 B# x5 v* n) [; C
    7 z7 g  \, E# [! x& {ServletContext context = this.getServletContext();
      o; P6 l+ J& A6 q$ L) i
    # f0 k6 U3 m* `# O  `9 RRequestDispatcher servlet = context.getNamedDispatcher(“MyServlet”);
    4 Y% Y$ N6 I. H2 b1 C3 {0 f8 b5 p/ d0 T
    ' x$ r* u( h$ M9 ?* _+ Lservlet.forward(request, response);+ y+ h( V/ l% ~7 w& @) m. e6 t

    , d. T7 R: C% s; n( _* O请求对象中的分发器:
    . _% U9 z1 I( N+ e, ~: B
    0 E7 @1 t' m2 n. Z0 lRequestDispatcher view = request.getRequestDispatcher(“tools/nails.jsp”);
    # o/ K; F  q; }+ A6 F4 n* i9 R9 G6 x6 T3 x
    view.forward(request, response);4 ]7 f/ w; m  \8 T* I# C- Q  f
    1 s! h3 t# h1 _% ^+ y; s. [
    可以将请求转发到另一个jsp页面,并保持请求的传递性4 o3 P0 R9 d; V' [9 f+ @

    ' p) a  F0 M8 V& d# o
    ) c# D# L3 {' `0 d8 ^
    2 |: @0 T7 g& ?4 RJsp中页面跳转的两种方式?0 J1 z2 D, V9 d" x& \
    使用分发器跳转页面3 {9 f; F6 Y! y& o: S2 y" e- G
    RequestDispatcher dispatcher = request.getRequestDispatcher(“url”);
    " E' d6 B- z) ?7 e6 z4 h; d6 d( Y5 j: W+ O* g4 H3 b
    dispatcher.forword(request);
    : v: ?* f$ u# n8 M. d; d1 s1 y' Z
        特点:保持请求的传递(上一次请求中的数据,在下一个请求中仍然可以得到);# }! p8 f/ |  E8 t

    . E  v) j9 \& S# M        转发的页面只能是同一个Web应用程序的其他Web组件; _: d7 W" l/ x3 x2 `- J
    ; G$ m7 g* z* G3 J) x- y" C
    使用重定向跳转页面
    " B. d7 c; P# E9 Z0 H8 hresponse.sendRedirect(“url”);
    " M5 W: [0 |+ L( R' x6 I+ ^; m. P
    + m9 |6 a1 }; B% d/ S0 d1 G' l    特点:产生全新的请求,(上一次请求中的数据,在下一个请求中不能得到);  Y3 J! p4 B0 _# W4 ?& a' }

    ; \% X/ U8 \9 i2 E        重新定向的页面可以是任意的URL1 U. D- D6 Y  D* r+ E0 Y: t& d: \
    ! r6 n( U) q; B  w' o- L  r
    2 S4 J  A2 {4 u2 ?0 I0 M! Y6 W; h
      P: |( e  }+ |
    描述Jsp中引入另外页面的两种方法,并比较两种方法的特点?, ~+ l2 b6 m# i5 o
    <%@ include file=””%> 在编译期间把另一个页面完全嵌入这个页面,可以说是一个页面& i8 D; |" U8 K" ?. m* ?+ g8 n7 `

    4 H/ U$ a: Z- Y; {( |在这里可以共享变量
    * J$ R5 p4 B; c+ d  F  c9 W* O
    ; J" P) p$ e# U- @' c2 W, |$ f, w<jsp:include page=””> 动态的再运行期间把另一个页面加入这个页面,可以说是两个
    8 g0 r& }: w+ V# i  M! |
    % K# p1 v* M1 ]$ {/ C/ \页面,不可以共享变量
    3 N3 z6 G: u& N* C* m& v9 R$ e7 n! N$ A* ?3 ~& K. _

    ' |) A( |. |6 M' }8 j- w! Y/ \, _& `  b
    什么是自定义标记
    2 V3 Q4 u8 N4 ^  h, Y自定义标记库是一个Web组件,
    0 a, R  I6 ]$ ~( {* [' }3 s8 t7 V6 n2 Z
    包括:
    ) b/ L/ j0 w% e; F3 P# t% c
    ( I, i) J4 k! B0 {4 L! l- l% Q* o一个标记库描述符文件(*.tld)
    0 c$ R8 O6 [8 E  L6 A" R. d- o$ G# L7 e) D
    所有相关的标记处理器类(*.jar)
    3 q4 k8 K8 m% L" K: h' q! I: c5 h+ P2 r2 v
    6 [- \/ ]. a% x$ U: b/ A
    3 c' n- b( h$ d& r* `
    描述使用自定义标记的步骤,以及每步详细的工作
    3 s: P  a4 c" Z; f: q( F使用自定义标记前,要拿到.tld和.jar两类文件
    4 `7 n1 U9 L; A7 \% J
    + x9 \8 i# g4 \把.jar文件放到WEB-INF的lib里面。5 O2 x: S# u; R  t
    把.tld文件放到WEB-INF根目录下。' X1 E% \4 |! \  F/ l% E9 _# u
    在web.xml中配置。
    7 r5 }% g) N0 t7 h( Z' z4 w<taglib>1 q6 S& D: m! _

    1 u! W3 D, z3 C6 j, M) m<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>; E6 x, Z, p: g

      i: j" T: c0 ^+ z" |) ]     <taglib-location>/WEB-INF/c.tld</taglib-location>' n9 K0 D9 i* K( K

    - i; B3 h% J  D- L9 D</taglib>1 r; Y# c& z& V4 m' H% a
    : E# D) ~0 m: c/ f- `: G5 i
    在页面中引用。% g0 N0 Z0 R7 ~2 ^
    <%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“s”%>9 j5 C/ z/ o( w9 n
    7 L: m/ Y$ M& F2 v' f  {+ _. k
    uri必须与web.xml中的uri对应
    % X- S( e0 R6 T1 W' }" [2 J! _# C# }4 I" \8 I) z
    prefix是前缀,用来区分是哪一个taglib4 m) \- ?  N3 m/ A- z
    % l  i$ Z# @0 v. J% c$ i. d2 V
    使用标记
    8 j% `' \" o5 y) r' O格式:<prefix:tag名称 属性>
    ! ~& A3 Z# @% [: [! T3 Z$ Y, \& c7 Q6 r& q
    <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( C! Y2 X% B: m4 I: f5 @0 M
    1、服务器与数据库的连接5 z( t/ m; {+ k/ i( d
    ; Z4 g0 r+ y+ O( G$ j% _0 V
    配置server.xml文件, S! F# a' v, \8 I- w  A( y

    & U' b% h0 ~. ~# Z* |1.oracle
    % |4 \" [9 A8 T2 R8 \
    ' {5 p7 D6 D2 @9 L% s<Resource name=”jdbc/company” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”* G2 R$ G1 V: R' x( f$ u; T: n
    ! R, x  x1 b9 V" x5 [
                            factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”
    4 E( {2 F! U4 w+ u7 y/ {9 R; K0 k7 |" b. s  L4 @# S/ I
    url=”jdbcracle:thin127.0.0.1:1521rcl”! d( \1 t/ L% i4 ?0 R  {9 }7 ^

    - \+ i" V) m  _9 w( m" FdriverClassName=”oracle.jdbc.driver.OracleDriver”
    6 \+ l# q7 B4 `, Z1 d! R* j) W
    9 r) W7 ?+ s1 M) A4 T7 g2 T  kusername=”aa”
    , I' J, O3 G) Q: w( C5 q8 h! d$ [
    * {9 O- e! f  o" D. l. P6 ?, ?password=”aa”9 q9 z( d/ C7 \1 W# ^, W
    7 S5 P  x3 L* f) o) P8 X6 r
    maxActive=”50″% Y, h; v3 u' Q% [1 _

    8 e0 z/ n, B+ f' f5 \0 LmaxIdle=”10″
    & V6 g- Z! p6 p3 h
    & h1 r- [2 J0 T7 j5 r5 u6 Q+ f! T7 }4 \maxWait=”-1″
    6 Q8 F$ l- {: v6 p) I* u1 g, Y  |& Q9 O4 B. {
    />6 ~( M% u2 M3 y7 G! Y

    - y- Z4 j5 \7 g8 Z. x6 n2.sqlserver
    ) h. z1 j* T0 Q3 ^& Y, r8 o
    2 D$ S2 V7 @1 ~! B<Resource name=”jdbc/webpage” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
    - t8 u% i: a1 |/ k  u
    / ?5 G( Z$ Z6 J: u4 n+ m9 _- I        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”
    4 m, p& S0 v9 Z
    ( q; G: p; e' x% {3 ]0 a% W! curl=”jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;
    + y) q7 V; u0 R
    5 e+ @- [) [3 m/ s5 \& i+ XDatabaseName=webpagetest”- q7 T* r$ B- g( }  B: J

    1 ~4 B4 u5 j+ X0 b: d9 @' VdriverClassName=”net.sourceforge.jtds.jdbc.Driver”/ [6 N. B0 O9 N; i
    0 Z- O+ k3 M& J2 W3 a5 `
    username=”aa”
    2 k2 R6 G4 x/ t. }/ _$ B& p! C/ t, w3 M
    password=”aa”
    ! B9 E- g7 x3 x5 C( h' H
    / b) @5 r0 t5 L+ G4 k& ]% BmaxActive=”50″
    ' s  d0 G0 e, U6 m: ^( x* l% E4 R5 ^; ^* [' U7 ~& ^
    maxIdle=”10″$ F% B: J* N- m* `% r, d

    2 w6 F4 g& \4 Z* }- e) @4 UmaxWait=”-1″; \9 h9 L2 B8 ?# A) z& M

    " Q  J# o' x7 v  M. R/>% Z$ l. [, ~( X8 ^5 O1 h  j
    5 X' I, ~6 F. ?+ b. d3 Z# b
    2、配置自己的web应用的xml文件" K+ E) y$ j) l! d

    . E, I7 [1 s  C& J
    $ K3 }( F5 G1 L9 D1 A1 Y, R
    4 S; q+ {7 P2 X  g% I8 _4 z! V5 e<Context path=”/eb03web” docBase=”F:/workweb/eb03web”8 q" G) w0 o5 A+ H; u, y$ j4 W2 S
    9 l7 e5 I: _7 z% L
    privileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>
    ; ?3 ~# |) T& m. h# i) _. @" S) x" g( y# ~, g( ^, N0 C: ~" [
    <ResourceLink global=”jdbc/company” name=”jdbc/company” type=”javax.sql.DataSource”/>5 R* R) P0 d2 _9 e1 ^2 I

    4 f' e# n4 k# ^</Context>
    , i& A2 l: V0 v  n2 a1 j9 N8 k% K& R5 m! \9 y
    5 \# H  X# w5 Z" s8 ?* J
    0 N+ ^5 U; @2 |$ B; W9 P7 W
    3、配置web.xml文件
    * S) Q4 D& U  P2 E" f
    8 X$ y! ^* B7 a4 \4 [与服务器建立连接
    ( H' n8 e# c( w2 |+ `
    . K2 Y# M# o' L0 H1 D" W7 M% m+ ]<resource-ref>/ h- }) i- i6 T

    % _# X3 n* h' ~1 h: K<res-ref-name>jdbc/company</res-ref-name>
    ! H) j" }& h) Q7 T/ _
      i1 e5 X  |. k& @3 G$ e* d3 ]; _<res-type>javax.sql.DataSource</res-type>- n# u% z( \# u' M: Q7 T4 l

    ; B8 q$ {5 D0 A: A$ ?<res-auth>Container</res-auth>6 ?* i5 D( s+ w4 v

    * S! k* e+ X5 K, s) a2 Z</resource-ref>
    : X% f0 k4 n" n" c; l: ]5 i/ F
    % |; |# U! r( x% b2 v4、在应用程序中不直接与数据库连接,通过DataSource连接池建立连接
    1 e% `/ x' r3 y& Q3 i' r: o6 w9 ^: j1 }" a( ?/ @
    //1.在程序单独用时设置系统的属性,在tomcat下可以不用配置,
    2 g/ P: c- H5 }+ b- y: o0 h
    7 T2 t+ t5 i/ z( Y2 wSystem.setProperty(Context.PROVIDER_URL,””);
    + c$ G+ P3 V* ]2 S4 d" {
    1 ]1 F. a9 j2 n7 F, H& B; I% j0 t$ {System.setProperty(Context.INITIAL_CONTEXT_FACTORY,””);
    & c2 ?  L* b9 ?" n9 W: n
    ) M0 L2 r2 N! _, V//2.创建一个上下文对象9 s- ~5 \6 h9 I0 T8 M/ }! d
    6 j& A: F  A- l1 N% M
    InitialContext context = new InitialContext();+ \3 f& Z3 I+ \) ~2 @- Q) G
    2 u& C) `6 q6 |' w
    //3.通过上下文对象在连接池中查找DataSource
    $ {; n4 [$ u4 ^6 b# ]
    & @0 U) `- i8 ?( _, k. ?5 ]* jDataSource ds = (DataSource)context.lookUp(“java:comp/env/jdbc/company”);
    ( x* s- \7 H# s/ _: C, h  R) {9 E; i' R* o0 v; r0 _/ O9 D% [9 M: H0 ?) ~8 }
    //4.通过数据源建立连接+ `& T$ V( X% n; h

    3 P* p7 G( p9 P1 d7 ids.getConnection();
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    15#
    发表于 2014-12-03 12:46:30 |只看该作者
    ORM对象关系型数据库映射
    2 ]  a8 W8 v8 t) V5 _  S(Object Relation Mapping)
    " w$ b# T/ C8 m* G; H$ R( B# i* z, N) \+ H( L+ r4 r" I
    一、映射的特点0 Y. f" j$ _* G
    0 u8 h6 i: N$ m+ G
    1.一个对象可以对应多个表
    ; R9 Y. s; _: K  j2 z5 e
      c/ K6 }7 W% @; ?2.一个表可以对应多个对象
      u8 J$ w) k4 D9 M7 w& I+ `
    % ]4 t- Y* U" T) D3.对象和表的关系不用完全对应
    5 V1 s$ b. o: L& h* I
    1 E( X! q# ~0 B1 s/ e4.对象的属性的名称和表字段的名称可以不同
    " p. u8 e) c) v: ~9 Y! o; S8 i
    7 C" e+ m! b: [5.类型可以不同,但数据类型之间可以转换. T7 _3 C- l) o+ Q
    ! l. W3 f' W8 h1 N
    6.对象中必须有主键,数据库的表对主键无所谓
    4 V  E& s, c8 ?' @, G# x# D9 L  {" X; B. t6 t; \, @% u
    7.数据库中有主外键关系时,对象中可以有,也可以没有
    3 L& O" {) T, l* D; U+ v' q2 t- H" [9 a& v3 D
    4 V& x& k" p" C; D2 @( ^2 T

    " o; w/ y# p0 _& Z5 b二 、有一个映射的描述文件————>xml+ V1 N1 J3 M9 \5 k( m% i, t+ h* @" x
    ) x( ?6 l+ v: X; |' }
    三 、怎样实现描述文件————>一段程序, D/ G: u  x  g2 S) @5 C( H$ J

    ' Y5 M7 Z% U  s/ w5 ]2 d对象 映射(mapping) 数据库- D* i3 M3 F4 U& h
    ' v1 }! v* v9 g7 g8 a" k' w: D3 Y# Q1 J
    user
    - T. V% O! s- ~0 L2 Q
    4 e& X( P" e* ?. wid=11
    ! r( b( o, ~' s( P% e
    # [' X* ]$ Z( y. m( u3 b( qname=”张三”———— > (1) —————> tbl_user(id,name,age,tel,address)
    : M5 [* T$ ]7 z! A3 [) c' t. d$ D# a" M* X% n9 G
    age=25 <————(2) <————
    : }" V6 ^# D4 A! b& T, m# v% X8 X! M
    % n5 t  z* q& m9 a

    & e% C- W2 X) l, f' Y(1)从对象映射到数据库
    . U4 [. z9 O2 S$ F, E. g1 n  _. u" ~- x# `4 S
    1.JDBC, r# n; n8 v, p  t

    ; q9 U( t/ \4 t! b# V: }& h3 ~2.根据描述文件来动态拼接sql+ X# u- C/ w2 E6 C) n
    ' [% e! u7 O; V3 h
    3.执行,添加到数据库中
    8 D; d: y0 d4 ]1 Z& `" K2 g5 S* {! q" ]/ P3 v
    0 y# `; S" }1 X6 U) L, q* F6 n
      V) U! c; m  o$ a) }7 }/ T
    (2)从数据库中映射到对象
    ! ?* T# N- j2 K+ x9 d* h+ E; ]4 E" R. G9 ~2 I0 h
    1.JDBC+ x2 E: W8 P  X& {& E
    ' q, H) `" j. e4 _& ~" b2 j
    2.拼接查询sql; G1 Z( P5 l; G
    9 D% T3 C$ i, N' A( w
    3.ResultSet7 p, y$ s4 y  I* C9 Y# y8 [/ Y9 [2 t

    0 C& G7 G6 E  B* Z) y; M2 [4.Model 5 h  T/ [& {* j$ S7 E( q- D
    % P! U, h- y. Y5 z) p: e2 k( ]% r
    0 R7 R3 T5 P/ [7 F
    7 L' a# E& o/ `- X$ s& Q( i9 W
    hibernate) C; W4 @. Q0 s3 w8 k8 s6 J3 ?; Q
    开发流程:5 U( C+ u$ W. v; u9 P7 J

    5 t8 Z4 y5 ^1 g7 m  t  K6 E是什么?: z5 C8 ~  L- w9 h7 G) O7 ~
    hibernate是一种基于orm 的轻量级的框架
    . t' H8 @  M; E1 Z1 w9 K( Q
    ( O! `; K! N8 a3 U' ~- ^
    4 I% ~. L9 T7 Y4 a7 U% [- [3 S' y/ a; s% C2 W4 U
    有什么?
    2 [- E, j; C0 b! }, Q! i1. session 保持连接状态(依赖事务和连接池)
    $ j* Z3 I1 F- j  c
    2 L3 `% [* u7 _- w2 e2. Transaction事务
    2 B2 p! k% W) ?' C, h# A" i1 k
    ' l* M' I* n. [# i* I/ q3.
    5 C4 D, J$ g9 _4 T5 }2 Y/ HConnection Provider 连接池, b8 a4 ]( ?4 ]; T* q
    " T( g  ?! a( a5 T" Z* N5 }
    $ K( K) i& o2 [' n2 q+ x$ n
    2 A3 T# {3 I% n! ?1 _) m
    能干什么?# l3 ^* L0 C; G
    1.orm
    " m1 K1 m9 O2 Q' R
    1 }" a' {; s3 [+ B+ {( a. a$ m- z& h2.提供操作数据库的接口,简化数据持久化的编程任务
    , D0 U$ z& Z# W9 D: |9 }7 l& S: l
    0 k" u% G$ X( n8 n( ~7 d! c
    1 C4 k5 l- @3 e& b
    ! |6 ^2 O( \; g0 Q% R) v& k怎么做?, s  q2 v; [% @2 O/ N
    1.搭建hibernate的运行环境,将hibernate的包和hibernate所需要的包拷贝到lib 文件夹下9 x1 j2 K+ _* a8 O* s- r% C/ E3 B

    $ ?1 P1 a1 Z- k8 [2.O(vo)
    % t: C5 H/ h  u, v" l0 k& [) a) ~6 S6 c( ^$ ^# \6 J, i  F
    3.R (关系型数据库中的表); @# D- w# K1 C

    4 y& C% O6 d4 O2 |4.配置文件
    - U" q% H8 v5 r5 [) v; [( Q% \  r; c+ q0 }) E' p1 ~  X
    4.1 cfg.xml 放在classes根目录下,默认名字为hibernate.cfg.xml' |. N# `# J/ F

    # ]+ G, `4 f6 Y% ^0 c( Qa.与数据库的连接
      Z+ g8 u& [6 D2 Z' t& h/ |3 r# b# L& @
    b.可选配置
    . l7 q2 ^8 D6 R+ o3 w( |2 \6 [. u' W+ m4 L( B9 ?/ T9 x
    c.映射资源的注册' ?3 z; p* h3 j

    * w/ w) a7 O7 j1 j4.2 hbm.xml文件 名字与类名相同 并且与类放在一起
    7 g' q/ Z9 l3 X- G+ J
    - Y. O& M7 ?2 }9 j# _a. 对象与数据库表之间的映射. K% `* A) _' H( v$ P" M( c

    ! Z+ o9 \4 k8 h8 L  X9 ]/ q! Ib. 对象的属性与数据库表的字段之间的映射) Y: R( Z9 O! b' V$ n; _% w) q

    ; b% ~! N9 B5 I7 ^' i; ?c.组件之间的映射
    - G# g$ h- V- w6 Z% N, D( [' s  d  W$ k
    d.对象与对象之间的关系映射) c0 [0 X7 k8 G4 A( i9 S
    & S: B! y0 K! K3 z- E9 j* A' E
    5、客户端2 f& M3 Y% v0 Y2 l8 t2 t5 b- q
    : |1 C( K& N9 h% Z) m# d: P
    1.得到SessionFactory
    6 R% }2 x# c! C
    6 d4 ]" S# L$ A- F! M% z( L: [2.通过SessionFactory 工厂来创建Session实例
    2 h/ D9 M; y# p; L5 h  c1 v
    " {( ?: L9 f0 U; o3.打开事务. |# x8 w: t- N) |
    8 b- n4 e! H1 c; T; m* L# {% [+ }/ B! u
    4.操作数据库; C& V- J, R0 i5 q/ }& d# q( P
    " h! w' G: O; h9 j9 n2 z" S
    5.事务提交
    " Q* m& s/ j; f# \- t* c: _, I
    ( T) u# D/ m7 \4 t8 K6.关闭连接
    " E6 `$ a5 u# Z: Z8 W' w
    " E, o% M0 ~: \运行流程:7 l% ^7 Y0 x! @4 S1 ~; m
    3 H& M, v2 W6 P. y- f
    整体流程
    # A  _) f4 o5 n; U1.通过configuration来读cfg.xml文件
    6 m% S+ T. @' ^7 a4 i6 s) V% D8 y7 P5 i0 p) e8 [6 G2 y  x; a* h/ x
    2.得到SessionFactory 工厂(根据数据库的连接来创建sessionfactory)
    , n2 k4 _, [8 `/ {0 t, ]) M' R
    * D. E! o3 w* u" F+ H& R2 f% O3.通过SessionFactory 工厂来创建Session实例" m8 @* k3 ]7 J* s- e6 y/ P, w
    & i" b3 S# F: u" V
    4.打开事务
    . i2 v! ~1 c; O7 O1 H
    8 ]6 o% q" c2 a1 O4 |, c1 d5.通过session的api操作数据库* N8 f5 _  n2 G4 Q# h% |

    2 i3 R, k+ ]( o; m& H, ^+ {6.事务提交% k1 ?# J! k. y$ U! m4 I
    3 p: C. v2 g9 \: U8 u2 E) R, }
    7.关闭连接) j0 |! n* O( X. T. x: K+ U

    $ {6 b5 b# |* B( K% R5 W" C1 ?
    2 _, C& l, K& W* L1 ?4 M7 B3 L* G# c/ g/ m
    save) m3 [# [: H8 N. j$ i9 \
    1.to—>po7 |" G( X, q$ c
    0 X( O9 T5 B7 Q9 F$ j. ?
    2.根据model和cfg.xml中映射文件的注册来找到hbm.xml文件
    + a5 V. D  j& }' F9 h: t
    * l/ {" C8 b+ v# B5 I3.根据hbm.xml文件和model来动态的拼sql
    0 O9 U  T. t" G3 R! Y: J% R8 {- D9 I3 C2 n8 ~
    4.客户端提交或者刷新内存) t) h9 I9 I: s# }; n

    6 C! i& Q+ t# p4 t' |/ Z5.执行sql,值放到数据库
    ( {. Z) l2 l8 q; Z) [$ F9 `* ^7 T; i: {. d. x+ n% Z8 [
    2 v( E& K  b$ ~# f2 w
    5 j; ]" U$ ~0 P4 _, n9 X
    update、delete$ K# K# R' Q- X8 O8 _! h! ~
    1.根据model 的id在内存hibernate的缓存中查找该对象
    % s5 ^, u; Y! ^, S& U" R
    ; Y- L) M9 b7 O8 V$ a如果内存中没有就到数据库中查找来保证对象的存在- U$ k7 l) ^% w5 u# t3 R7 r
    8 L% K; {0 g; @* O+ @" Q3 y
    2.根据model和cfg.xml文件中映射文件的注册来找到hbm.xml文件8 o7 ?+ Q) U% j. C
    9 r) D# ~1 H% Q5 y2 O
    3.根据model和hbm.xml 文件来动态拼sql/ ^( T" |3 p2 k0 B) W- t/ {5 h
    . S/ ?$ z7 M$ t# r8 Z! @5 s% |) o
    4.客户端提交或者刷新内存, u4 ~0 S1 R  c* t7 T# I
    8 h! m9 ^" Y/ [" G" l5 Q+ a0 _
    5.执行sql
    ' x! r4 J& V/ G( m& p, [2 {" y0 S, L( z  f$ g2 c
    0 g" ]$ @1 [& c3 B
    8 v* B, [' |9 x( M9 r3 G  a
    Query; T8 U6 g0 ^6 x
    load
    , [, {. h3 n6 Y2 s
    : n/ [8 ?( G6 _7 K1.根据model的类型来找到hbm.xml文件3 ?+ R  ?( @2 H' }
    4 w% G3 m7 L, E. x5 D: P5 E. S$ f
    2.判断id对应的对象在缓存中是否存在,如果存在,就直接使用,如果不存在就进行下一步。: k8 G) ^" [5 I, `/ P9 q
    ( q) F' h6 ]4 a3 n  s6 [7 M
    3.用id做为查询条件来动态拼sql
    + f$ m  l4 O0 h: ]' W. N
    : \5 l" ^* w9 ?4.执行sql 查询(先在内存中查找,如果没有找到(会抛出例外),就去数据库中查找)% e" t9 g, {( [5 \! v& \% ~
    8 x# U9 O  Z8 _" [1 [, G- s7 k
    5.返回一个model类型的对象
    & z6 }" ]- G9 F# R% P1 [
    # n/ R! p5 u* `) wget& C- b+ X# Q" j5 D2 U2 d- p
    ) i2 I% [4 g0 s/ v% ]+ i
        1.根据model的类型来找到hbm.xml文件' h4 M' I* s0 V( p( ^0 @
    : D1 \+ x; Z* ]" f( n% M* ^5 \
    2.用id做为查询条件来动态拼sql8 P% O: R0 s" y; z
    6 ~0 s0 \. R, S6 J: Q$ r
    3.执行sql 直接在数据库中查找,如果没有查到就会返回null. R1 f# y  ~+ f/ |# y- s7 l

    , s, y. k0 l4 i+ pquery# d* f1 v: G/ U( w# ~, X& C
    * j% K7 c2 m9 r# l8 `0 k5 q) y1 [
    1.分析hql语句,得到model的类型( o9 o% x1 W2 G& ?

    ( V" @2 S9 q. b+ Y2.根据moedel和cfg.xml文件中映射文件的注册找到hbm.xml文件' ~% k0 o( `! M" }% s3 B

    : X& I. f# x; r2 ~9 Q3.根据model和hbm.xml文件来动态拼sql
    * m% j3 X2 X, ]! {  {$ w8 ]0 J* s
    4.执行sql查询数据库' L7 }  \/ h: d5 x

    * L8 ^' {+ @" _" X3 Y5.返回一个resultset: A/ @" m, z# ~8 [3 `+ t+ L, W
    . @, v! c- T9 _) i- \; \: j  ~
    6.循环resultset的值,放到model中在放到集合(List)中6 w( |; B& V' U

    1 a' I; H0 x8 ]9 M8 |: @# C, t
    1 l5 y( W1 q8 d( y* w' K: N. O, S, N, l4 _! p* t& U. c
    谈谈hibernate缓存机制5 O! L3 O" ^1 [# @$ W+ I& z$ L: e
    . R' Z7 z4 {) I
    缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了。打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去数据库中取,也省了很多事。% u; U6 A1 g& i* ]5 g8 n# S
    0 [4 b- K. l6 Q
    ) j& T/ {" L( s
    9 L/ O+ H% l; t* l' O
    hibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。
    " L8 F6 i+ j3 K1 u6 `* R
    0 ^6 ]2 Z. Y& Q$ p- e6 ~
    4 Z2 o! _3 `1 Q: F1 h7 ]" j8 F. l
    对一级缓存中的session事务进行数据的预存取,数据在各个session的上下文中存在(单例),当session关闭时,就是session.close( ),整个所有session范围内的数据全部清空;二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二级缓存只有一个区域 ,画个图比较容易理解。
    7 B" S9 g" w6 }* j0 K: l
    4 b0 b" t$ w6 D) j# x- ]& G3 W
    $ _" p0 J: K8 ]" f6 A
    ' l) }& T* Q8 C1 t' m| 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|' h) ~4 X: O1 E/ ?. d' Q
    8 i9 D3 I$ d6 x$ u  m) Z$ m7 m
    | | | |: x1 M, i: h! B' R, {

    7 s# u* K& }& E8 e| | | |
    , {8 S# u+ u* C: h. W+ Z# ?# i2 |9 A
    —————————————————————————————————, a- S; {# y. y+ X0 O, H. V3 ^

    . S" K- P) j1 o7 \) G3 T' m7 KsessionFactroy级别的二级缓存
    0 K& i  I$ K" s; ~2 \0 D
    0 _1 o$ P* V5 I- b+ g" z9 X$ v3 J+ G——————————————————————————————————————-
    * O9 ^2 C- p& ?3 t! K9 s. h9 ?+ M3 M" C( d. ?" m4 a- j
    |
    / o8 C$ B; L0 U/ a  D3 c/ c6 I& k5 ]3 T
    |
    , \- w8 @! `$ M4 ?( M: y0 R8 e2 |( Z
    ) K" M8 ]. K. x7 T6 B* T& }|. V7 U0 K, j* H4 P: i4 w" {& r

    , j/ G  d  z* T9 [4 c% Z8 B——————————————————————————————————————
      F- L0 n! g( g% \6 {- D" P4 Z4 O" T: C) G* O. D- R
    DB
    ; v; e9 Z% }6 i, S$ A3 u8 C, W& n0 k: C
    —————————————————————————————————————–
    & q. E/ g! b7 F& ?$ A% U$ g& e6 K. \
      l2 f5 Z; m2 a- Q
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    16#
    发表于 2014-12-03 12:48:12 |只看该作者
    Spring, A7 q* q- d  |) Y% [$ c! O
    • 是什么?0 h9 z9 t; h! J& s" s  w4 h

      0 s' ?; g/ ]7 V: N; N

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


    # y% S  u2 y* F5 ]  X1 J" c* x
    • 有什么?
      % S+ Y1 F$ y( u9 z" Y1 c: Z
      & G8 U, r2 H! `+ C1 c+ ~, V5 y5 r# a
    2 X" m/ \2 O+ O( o1 J* s! `+ A* M

    每个包的功能:

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

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

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

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

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

    AOP :面向切面编成

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

    $ k0 v1 f8 q8 z6 U+ P! v/ ?8 Q
    • 能干什么?5 J& o- ~3 F2 O$ X, {$ d9 U7 z
      - w6 {8 j2 A7 d/ D

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


    0 F- N. o& @- L8 o+ q: u* t& _* e2 q) @
    • 怎么用?
      0 @: u, F/ p# X7 k1 K3 q

      5 D/ l  w* |! X: K- \6 E, P
      • 搭建web工程,引入spring的jar包* P1 l3 P1 o3 i" @; D4 j  n1 K- F6 i
      • 在web.xml中添加如下配置
        0 h. a9 y: ]! r+ L) J, _* l" c2 U) p
        ) ~1 n$ B+ l% n9 K* N
      * I3 @. Q7 W, k% D/ h. w

      , \9 }  v+ C+ |$ Z3 T) m- s

                contextConfigLocation' p/ @. d$ x5 X

                classpath*:applicationContext*.xml
    $ y' L% w$ a6 _: @  e2 d% m& C9 I2 Y+ ?

        6 ?2 K5 y& R3 s# `1 g5 T# M7 M

            
    ; l% C( P+ a( y4 b1 Q7 H

                struts26 L  t2 ~, [2 H% g

                
    " Y2 Q% ]( i# @& k( g: U* t/ s2 i

                    org.apache.struts2.dispatcher.FilterDispatcher
    ! Q6 O  t5 X: B! t1 f8 T9 O' Z

                . h- Q& Z1 Y5 M4 f

            2 ?+ W4 j1 T* [1 |

            0 `; n! L  m) _0 m

                struts2
    ! b) j+ `$ n; n. a& {, [+ h& n

                /*
    ; e3 ]6 D+ E3 ?# P7 S3 X

    0 [' V5 f( X, ]


    ) J1 _. o7 u4 f  ]. c* p6 [

                - q' {* Y3 r5 t. a  e! w

                    org.springframework.web.context.ContextLoaderListener, L# F* a5 Z+ S

                
    / z3 U- l9 x% j9 i9 U. A4 _% f

            

    • 部署2 J# P" L  K& @/ b) ~7 {1 T

      2 q# K2 F+ z3 ?( M1 f( Y7 a2 F' o
    ; {& l+ Y. Z$ `2 G

    . ?, v8 b# H2 e/ J0 C( v
    + k5 O9 T3 A' W
    • 容器和bean4 m" z) p5 B9 w% I

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

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

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

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

    1 d) {9 C- i+ U
    • IOC控制反转& c1 u) n$ ?$ W& w, r) u

      1 ?* Z. o4 m3 Y) b$ j* J& f
      , ]2 @' t" M- p5 ~: i' o* H

      : H/ i; j9 c6 k6 E! w/ X% a$ u
      从前的应用程序想要得到A的实例他会直接主动的去拿,当用了sping后,应用程序由主动的去取变成被动的等待,由spring来控制应用程序所需要的对象

      . y1 i8 o1 c, Y% j) g7 G
      • IOC的优点
        ' i; A5 E' |6 U, C3 T7 h: ^
      1.可以通过IOC来获得实例
      2.可以通过DI来获取注入的资源
      • 配置IOC的原则
        5 M7 e3 L& O; n
        • 一定是可变的资源才采用依赖注入
        • 一定是层间的接口或者是模块之间的相互调用才采用依赖注入
          # d! a4 G3 T# g5 [- O

    , k" ?$ h: Z3 C( b" t8 U/ \
    • DI依赖注入
      ' s/ {5 ?. P  ]% q& t

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

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

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

    例如:

    在配置文件中


    - y" b6 T% T( ~* o& ?! Y, h& d! N9 n* D! N6 S
    0 y1 S% u7 Z9 q7 \

    在应用程序中

    Public DBDAO dao ;

    Public void setDao(DBDAO dao){

    This.dao = dao;

    }

    3.构造器注入

    ; b& K4 c7 o, _  f# m

    4.ref 表示参照其它的bean

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

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

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

    6.lookup注入

    7.singleton

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

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

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

    8.DI的优点:

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

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


    2 u; `' I5 F5 V6 l
    • Aop面向切面编程7 I0 W" P8 v+ d8 n6 i
      0 }: P% b6 j4 |  _+ A. A

    1.AOP面向切面编程 一些较好的模式或者是示例—-范式+ W  z* G5 o8 V0 i2 q

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

    2.AOP的思想: 主动—->被动(追加功能)
    . K& _0 J8 z9 u& n' |

    3.AOP 的概念& S, G: C5 y& I; G8 e

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

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

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

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

    5.引入 :扩展的功能

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

    7.aop代理 :实现机制

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

    4.AOP的事件机制& \. q' d6 k; w

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

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

    3.找到切入点

    4.确定连接点

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

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

    ! q; X1 d% J6 m# h% A
    9 p3 b9 \3 [; r$ Q
    5 V* p; t) @5 Z+ T2 d' _

    ' b1 U  ~/ G6 k7 F
      m8 l9 Y8 `8 y( w1 I. ^( C6 [9 a- w3 ~) i( l. ]/ L) B
    ) V, s) M/ T& V' R$ b; D( D

    5. AspectJ
    4 Z, R  n; |$ {( E) p! d

    5.1.在xml中配置比较烦琐
    % t) g& C7 U1 d4 y' t* i7 f

    所有的入口必须从一个代理(ProxyFactoryBean)开始! \% K* ~2 b; ?( t8 _: E


    ; R2 |" @7 \! t$ m" T0 ]3 V 5 K* }. N1 J% T9 I$ ^

             5 [* U+ N( \8 b  g( ^, Q
    9 K# F+ u. ~2 \0 F: W

    * y+ I4 E/ w. Z: L& j1 l) G         * H6 o) ^+ M3 z" d. k% u" j

            
    7 D! j  k9 ]3 y; ]$ R( R* q* X$ Y

            

    5 Z, o- B$ I" B4 v% ?* |
    expression=“execution(* com.javakc.aop.MyTarget.t*())”/>; v* M- _7 w* e. P; }+ |

            ( g# [7 H* b7 r4 l* D9 A

            + p3 h6 v* `! f% A# D: p# e% U

        * B8 t3 s! t/ H, ~" B& R# c


    $ Z) v5 r, \- h/ n! Y, W# r5 ~  J+ T# l  o+ F9 |1 w

    5.3.使用注解的方法相对简单6 @( _( b0 t, O# _/ j$ Q

    @AspectJ的基本语法
    6 ]- [: x. s5 D% f/ @

    1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面
    " y! o9 H0 P0 Z# \

    直接在类上定义@Aspect
    5 V! z0 X- J: o0 ]1 _

    2.@Pointcut声明切入点
    ; |9 A2 n" J$ `' }' s: C

    2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字
    " ]% ?! I" c* n8 s8 A

    2.2、可以使用匿名的pointcut
    7 [. ^  P" Z8 E6 G; _9 `$ t, m6 \

    2.3、执行切点的几种方法0 n/ m3 X) Z' b' P8 s6 N& x

    2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法; w4 X9 p% B4 {" t9 e6 D

    2.3.2 within 指定到包,不能指定到类
    9 G8 A6 }/ z; {" I6 n

    within(”com.javakc.spring..*”)
      R5 w( b7 I: w( M

    2.3.3 this 指定到实现接口的所有的实现类
    2 v3 o5 Y, e% {

    2.3.4 target 指定具体的实现类
    $ {! z/ R7 b3 r; Y$ ]

    5.4.advice的五种类型的示例5 q8 w' L9 l0 F# K

        客户端必须从接口走才能得到监控,实现想要追加的功能: E( x2 A- t7 c

    5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)
    / u9 Y0 B" x' g/ j6 g& V4 u

    追加的方法的参数名字一定要与retrning的名字相同$ _! @7 G& z, o" y0 W7 Q

    在注解@AfterReturning中必须加上pointcut和returning两个参数
    : V  U' w2 v1 Q$ K% C

    pointcut指所要监控的目标对象的方法9 b  L- H! N. Q/ O

    得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配
    3 C. p5 W  X# _% @

    完成追加的功能1 v0 J3 b" j1 o7 r4 c( Y& l

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用# P5 y' I/ u& p- j+ ?

    (1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)$ x0 O2 {. A( D7 a

    (2).5 G5 \8 o; g( h4 n8 U7 M- \

         2.直接引用匿名的pointcut' R1 ]( G: m+ A- b+ Q2 R3 h

         (1).@AfterReturning(“execution(% p$ _2 e9 X* F4 g: X, ^" Y, X$ K

    * com.javakc.spring.schemaaop.Api.test4())”)" n& n# `$ p2 X9 t* s1 \/ g. W- i

         (2).@AfterReturning(pointcut=
    0 L. e9 D1 Z' k+ m

    “com.javakc.spring.schemaaop.TestPointcut.t4() &&
    2 Z( g8 M9 o! t+ [

    args(str)”, returning=”retVal”)8 K- j5 u% n; P# l

    @AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)
    5 ?& ~9 U1 p# k; A; @) j

    public void testAfterReturning(String str,Object retVal){
    8 |0 D1 s$ q8 L7 w9 L8 |

        System.out.println(“afterReturning1=>”+retVal+”=>”+str);
    . V' o* @) a( ?

        }1 j0 O" t9 r) J) s  k

    5.4.2.@Aronud
    7 C! w! G! |, L3 X, ]7 j9 P

         注解@Around环绕追加功能;
    ' q+ T+ _1 u' g- `4 F

         在执行目标对象的方法的前、后追加功能;1 d6 n$ [/ z& W5 o8 Y/ }

         必须有参数;第一个参数的类型必须为ProceedingJoinPoint;
    % [% _1 x. U0 b8 R: p- q7 |

         通过ProceedingJoinPoint的实例的proceed来调用所监控的
    * H1 H8 T3 V1 [! b" z4 D

    目标对象的方法
    * w+ ?# [# L  I+ d% q

         1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    3 V0 n) n8 e/ @3 A

         (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)* K6 \5 k* w2 G' f" n: Y6 p

         (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2(); C# j: M" J1 n

    && args(str)”)
    ' c6 A# n/ ~' V4 z7 T: j5 ]

    2.直接引用匿名的pointcut
    : T2 N7 q7 H' ?# S3 }8 I7 D

         (1).@Around(“execution(
    / q( l7 ~& Y# N- z; l

    * com.javakc.spring.schemaaop.Api.test1())”)
    : p0 f: t7 S& X4 S

         (2).@Around(“execution() G1 w/ ^4 H9 D/ v& A( A

    * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    8 U& v# c3 ]. [: u6 T0 g" \

    // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    7 m5 @+ j0 T" c2 {; r3 a9 I9 m

         @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)4 U! ]' t$ i/ U9 [

    public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{+ m7 t) }: u/ F3 \9 P* `, H3 K1 P: e1 b

        System.out.println(“around1==========before1pointcut==>”+str)
    & C7 m3 v  p4 d' o+ K' @3 W

            Object obj = prj.proceed();
    ( g. ~# t7 a$ K

            System.out.println(“around1==========after1pointcut==>”+str);1 b2 c: N  J& Z1 R. `5 z  A8 d0 K

        }
    6 f7 `2 h* k, j: b$ r

    5.4.3.@Before/ D0 g% W/ T' {$ N: B1 c

    注解@Before在执行目标对象的方法前追加相应的功能5 _( [# n+ C  }* C

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用0 m  y/ `/ }' e0 {. r. _; m

    (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)1 A1 k" a  p& D& ~% ?5 q

    (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)2 \+ a  }, G" T

    注意args后的名称与参数名相同6 F" V! `0 r6 v+ S3 _9 f

    2.直接引用匿名的pointcut
    1 ~! F0 _' `. r; H+ y  r4 V

    (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
    " y& y; x! r4 n' N

    (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    0 C. F  [; |+ |1 v4 ]

    注意args后的名称与参数名相同. M% v  C" Y5 M; o# p3 K- c

    // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    ; w8 T/ Y& O/ N& ]( y- d0 s$ U7 m

    @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    % Q! y# T* K- {  `. D( K' C% h

    public void testBeforeParam(String str){% r9 z  n$ _4 X% w" N9 y

        System.out.println(“before1=param=>”+str);
    $ b( m5 g4 B# |

    }! ^. v' V: m& ]

    ! d  S4 y4 h# ]$ r0 u

    5.4.4.@After2 g7 V- E3 k3 ?, Q- K

    注解@After在执行目标对象的方法后追加相应的功能
    & s4 i& L( e" B0 ]0 o+ N. a

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用0 m; B' ~* ?& l6 [$ R# H& A( K, g$ |" I

         (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)7 m/ T5 V2 _8 Z1 v+ @6 \2 ]- g

         2.直接引用匿名的pointcut- A3 S8 R% \" A5 g' G' ?+ Z

         (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
    + K5 Y! [& a5 T) I1 m0 s

    @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    . V2 m, A4 w- e

        public void testAfter(){" v" P9 E/ f: u) o1 s9 v/ ^

        System.out.println(“after1== >pointcut”);- f! M- e' h7 q( m) t

        }
    4 p- i8 L8 P- r7 y8 J

    5.4.5.@AfterThorwing
    9 s% g9 q4 b$ T; }8 F; d

    7 w) O. y" ]* f" W8 _# a

    0 Z6 g8 f' a+ i: T) L
    • 描述一下spring中BeanFactory和ApplicationContext的差别, q7 Y: g$ I; [$ f+ E1 S: |, k6 c
      . Z3 ~; X5 r* Z: u0 U6 j9 p

    BeanFactory是一个Interface,这是Spring的核心。它仅仅只是提供的一些基本功能。ApplicaionContext 也是一个interface,这是从BeanFactory继承过来的所以它具备了BeanFactory的所有功能。但它也从其它的类或interface得到了一些特性。比如提供国际化的消息访问,资源访问,事件传播。

    但其主要区别在于BeanFactory是延迟加载,如果Bean的某一个属性没有注入,BeanFactory加载后,直至第一次使用getBean方法调用此Bean时才会抛出异常;而ApplicationContext则在初始化自身时检验,这样有利于检查所依赖属性是否注入;所以通常情况下我们选择使用ApplicationContext.

    代码示例:

    BeanFactory beanFactory = new XmlBeanFactory(new FileSystemResource(“beans.xml”));

    ApplicationContext cxt = new ClassPathXmlApplicationContext(“beans.xml”);


    3 V* Q' w* v9 h; r+ [
    • 谈谈spring对DAO的支持
      $ T) W& U: m' a' u3 ~  d2 t
      ; J' s7 y  B9 S" @; g

    Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。
    " \& ^* S( P/ P; h! V0 L( [

    简化 DAO 组件的开发。+ G  b6 f% w7 d5 y3 c5 R* V" ~
    Spring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。
    6 y5 n1 l) o3 q, t, V) @8 h8 a7 b+ s

    IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。& a+ H$ Y/ U: ]' e! {

    面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。% W8 B- p1 [  f& i0 U7 w& u9 y

    方便的事务管理: Spring的声明式事务管理力度是方法级。8 T6 G. _; p& A( S4 F

    异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。
    ) w6 A& x3 ^% E& z5 Z  l


    & a7 c# |+ E; ]% M  i( B$ w
    , b% D$ c: u5 w. H! \
    • 谈谈spring对hibernate的支持
      . `: r* _2 s+ C6 h8 n( D

      $ K, q, `- ~4 W

    在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。. `( c* K) a- K

    一旦 Hibernate 处于 Spring 的管理下, Hibernate 所需要的基础资源,都由 Spring 提供注入。Hibernate 创建 SessionFactory 必需的 DataSource ,执行持久化必需的 Session 及持久层访问必需的事务控制等,这些原本必须通过代码控制的逻辑,都将由Spring 接管ataSource, SessionFactory, TransactionManager等,都将作为 Spring 容器中的 bean。将这些bean 放在配置文件中管理。
    1 l' X/ ^$ {/ Z& v: _; a

    1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:5 v4 @8 [! Q+ _, P" f0 C# O$ u

    $ o* H0 z; R. N3 m; q4 J

            class=“org.apache.commons.dbcp.BasicDataSource”>/ }5 K) f+ I! l6 ~/ f9 p

            9 R- k0 j0 j( F! t+ H2 Z* N

                oracle.jdbc.driver.OracleDriver9 G' l' a) `% {

            ! A1 w, T$ V6 u+ d. Y

            
    ' u8 @: z! I4 C5 k: U, t9 G6 J0 {3 @

                jdbcracle:thinlocalhost:1521rcl
    ; V4 q5 J* W* t3 R( N. g) b

            9 ?4 _  a1 z- S

            + s  c7 e- U& i4 c" i' A7 n7 k

                javakc2
    9 L6 G. N3 y1 `( T8 `

            3 \7 o3 Q" |8 C

            
    7 y, q- |# {. _, ?

                javakc22 o6 r* r/ l! X# O

            
    ) P6 {+ s9 e8 D+ B5 @( K

       
    . b3 i! l. n9 ]- \


    ; @  g/ r% w6 f: {# z3 l

       

            class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>
    7 S' s5 H  |" c) _! m- }/ z9 @

            
    # N/ r1 O: j! m2 v0 Z5 p

            5 G% I1 i/ I) m* _$ z7 Z

                3 t8 q. {7 A! i; h' ^" _

                    com/javakc/spring/h3/UserModel.hbm.xml9 I, O2 ^- f1 S: T1 G

                
    ' R+ c2 n  }( A

            + e9 a+ m/ G: G

            ! {  H; E  L0 }& \$ z

                3 v3 k6 G- v3 ^% Y

                    hibernate.dialect=org.hibernate.dialect.OracleDialect
    / ]( K5 Z2 [% Q# @/ a: a

                  E. X1 K( x- h. h+ h0 }- Z

            / Q7 {4 S3 g) i4 K. e+ N7 b

       
    - Y1 ?5 J, ]4 _; d

       
    1 _" D% W" @) o+ L

            
      t2 ^* G& w* x( ?# x2 D

        4 G* ]8 \/ d0 ?) T

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

       

            class=“org.springframework.jndi.JndiObjectFactoryBean”>
    8 B) v  h! h) y- i

            ; _( N0 B) r3 w) H& }" l7 k' ~* ?

                java:comp/env/jdbc/myds  N2 [5 K# K" V) p& c# o

            
    7 O2 Z6 A* u: l- a

       

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

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

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

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

       
    , o' O# N3 E! x/ C. N0 f5 o% W; X

            7 J# d3 q( H# D+ t3 A

       
    5 j- s7 m. n" f

    $ N8 W2 |( O+ F

        ; V' K9 d; r) {' V6 L# e

            3 L" l( r7 O' V; k* Z" K

                
    & `  A2 a( V3 f- l3 c# C

            
    $ H1 U/ h. ^, s6 N4 z% L

        4 `0 f4 r, @" `) W+ Q* _

    9 ~; I0 P4 @( w+ `- c; I( a2 `

        ( F9 r: [: I  U2 f

            
    $ n' H4 [# D9 _, V

            
    * n0 `0 Q& f; a5 b2 T

       
    % A4 d) k) p  j) E, L) H1 E

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


    " x( @& _) f1 C  M* R
    Spring2.0之前事务的写法
    & \3 j$ w$ t2 G  @0 W% n8 @

    7 e! T' [& X8 Y4 U$ O3 Z, a  i- m( g/ P7 B3 R: }
            class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”7 c- D3 c' n" `. M# e7 r$ J  u

    0 ^% K, N1 t& r  i6 k: \( w' Z. G! ~/ N        abstract=”true”>
    ! f. a5 ^/ S! x" d, p
    3 |; u- S2 ^) Y8 X

    , d0 x/ ]$ v$ v8 W; B7 O7 T  }0 i! A) O  p* Y  P' P; i& f9 s
    / g; V- }% w; O
                    PROPAGATION_REQUIRED,readOnly% m4 `/ Z0 D# X1 w, a+ L3 {! v
    3 l  u0 \7 i9 R6 j# N% T
                    PROPAGATION_REQUIRED
    : x, r- U* ^9 E9 f7 ?/ S# a8 W9 J

    : F0 F3 t5 A) {" G8 u2 u9 o  _( T3 A# J& F
    ) E0 R3 j3 m% D) ^* @# a; X) \" t
    ) X7 E5 h" M* l" v7 A5 A
    6 r3 U1 ?& B, S" l2 p8 a: f3 L1 x1 p

    ! z, S! j8 b6 {# t; R
    • 谈谈Spring对事务的支持
      ) M/ O, M/ V. f% K* x! y
      . ~2 ^/ u  p! R( `4 B9 s

    , y1 m! q8 z: X4 X4 T4 b3 N" K
    1、声明式事务管理:

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

    2.做法:

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

    2.2

    2.3 注入数据源

    ' W& j# q  y  N0 H- j
    $ @* t# P. M5 E3 j/ {7 s5 C% k
    $ c9 o3 ^2 S, i: Q4 K6 v
    ! Q" [$ ~3 T; y6 x( z- e/ v

    # g, X) h" X& g* e5 k
    8 j. d! E& p: }7 b9 T; j  U, {# v

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

    ; x" G, h: o1 _, z! p) r+ M

    0 t( T. z! u2 Z( `) d1 q# G% C; g5 V. J5 D3 F- d' I# ?

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

    ( Z0 r1 |" H% d' P

    6 o8 }5 V0 C2 ^" W/ Y
    2 ^4 S% y: y) a1 Q* l
    6 e7 u9 O+ x# Q9 h/ h
    " `, Y. U! K" l8 i

    2.6 定义切入点

    ' \  @1 [0 u2 j  P" C% C' L: n

    ( `9 Z9 Z& n' D! j; |7 X# \! V4 B2 W5 Q8 O, @8 Q" W; A$ v* I" g& H2 r

    8 M! E, {# _+ Q. g3 W- S* _* M( K
    ; D& L3 i% }* D; H; w, N

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

    1.注解@Transcational

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

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

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

    ! \+ Y/ c8 p! o& F6 E+ J& x

    0 E) u. W$ a7 v' h

    如何在Spring中使用Hibernate的事务:# P, r) `9 C( ^- q# o* P


      b* _# u) R2 u


    ; k; S! o. Y+ A


    ( _, s1 S3 p8 |

    如何在Spring中使用JTA的事务:
    6 R. q8 I4 C! q; }2 G( T5 c4 d3 B

    8 y5 R4 M$ n; P* t
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    17#
    发表于 2014-12-03 12:48:32 |只看该作者
    事务  S% j0 I8 V3 |% T7 }3 K
    ACID
    9 }- H$ ^/ r4 X(1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失败
    # u9 {- X. b# V& `- v) n
    $ T# B4 p1 k* R' w* _(2)一致性 :操作的前后满足同样的规则,保持平衡。1 G0 C( e* c) C9 l: h- @: l
    - |- N. Z6 k4 i6 N- ]' H% M
    (3)隔离性 :在事务运行的过程中。事务内的数据对外的可见性和可操作性(必需由数据库的支持)
    8 i7 ^! f! p; X4 x: X3 @+ F
    5 G0 y" V" a, p(4)稳定性 :保证数据在事务的操作的过程中不会遭到破坏,而且是永久性存储的
    3 X* a4 O0 g$ E% m% U& v
    $ }3 p6 |' E; [/ i& M . F3 X9 B: @7 Z% U' C" L
    3 S1 N- ]8 j1 G( k
    事务模型; s" q& z7 S: T6 Y! j0 T  `
    (1)经典事务模型又叫平面事务模型(JDBC) 事务不允许嵌套
    . K+ G9 v* F- o5 e, P) P, \: C
    9 L) J& e2 Q& A+ k. |& z2 W(2)嵌套事务模型3 B6 F- Z* W: i# l

    ' E+ Y/ @* `1 w' K2 F  U7 y; } ) ^  J, I. v7 _/ W
    4 M- Q: u: Y/ T: u
    事务的两种方式" f) g, }1 i; N
    (1)声明式8 u0 @2 x9 c8 k. P3 l1 U

    % c! G. Q9 N5 M2 }在配置文件中设置以下6项1 W+ W( A+ I( j) w/ E4 O' F
    . K9 X8 G' y; f
    (1).required, M& d1 r. z% [" ^" u, X$ {" i
    5 g% J. V* i: }' |0 I8 v
    如果客户端没有事务 在bean中新起一个事务
    . X3 ]. c8 j. D# H. d& H0 A
    * L( z' Q) W+ E8 h/ K/ q8 A9 M如果客户端有事务bean 中就加进去5 P' {6 m; x2 {

    9 q" k. F5 Q3 S, ](2)、 requiresNew) a" u! e9 B8 a. h1 @4 P/ m
    - S/ g! ^8 A5 [% D6 c! _- i
    不管客户端有没有事务服务器段都新起一个事务
    1 i( o5 e- {# u2 d" I& \
    & ]* Z" q4 u2 f# ]5 M, \. d: K9 ?$ v如果客户端有事务就将事务挂起2 P+ N; x& Z( P0 `

    9 ], H  ^+ G: M4 t; @(3)、supports
    , N/ M1 ^( |! l3 ?+ u! k- t1 G+ `8 ]1 B- L9 x
    如果客户端没有事务服务端也没有事务
    , v' O0 Z! e; y, g' M6 d( s# ]9 H  j, [+ W2 B  E+ c: }% J5 {! [
    如果客户端有事务服务端就加一个事务% a3 q, `+ p( G, _7 U1 S
    & @  R: y% w( Q6 C
    (4)、mandatcry, q8 H- I# @( F

    " r1 N2 E" j& F  U3 }$ P如果客户端没有事务服务端就会报错
    & P" e) P- b- t& \, u7 }% {2 d& f  H  B: U5 I1 d
    如果客户端有事务服务端就加事务
    3 \% M. ~0 \; z6 q- v5 C7 m# A, z" C' }& Z9 }
    (5)、notSupported
    5 p5 b) J1 q' l; o! c+ }( C/ z* A4 o3 _# W$ N: S
    不管客户端有没有事务服务端都没有事务& C; L# F; _# B  i# ?1 b' f# y
    ; a, m, A, z3 p; I1 `
    如果客户端有事务服务端就挂起
    # l$ q/ C: t  G: [! V5 d' _' R9 a! h( _1 b. Q& {+ m7 L/ l
    (6)、never
    & ^( Y6 Z; q0 ?- f) g) T9 c" [- Z% t/ r' g6 w0 R8 V9 W' W1 G
    不管客户端有没有事务服务端都没有事务/ {) D6 e  q3 o* \% U' c

    6 ^6 O, s% o" c3 V, g如果客户端有事务就报错. h7 I( `9 W3 x

    9 a2 ?8 T/ e+ M6 i* C(2)编程式事务
    $ K* ?8 J. M/ }& I6 n4 \( `  w1 U' ^* R' l/ w! r: c
    Javax.transaction.UserTranscation, B8 D# B. Z3 i- s( J% K% p1 `

    2 y1 y# z% e, L/ ^( OJTA 事务可以精确到事务的开始和结束: `5 ^  ^; ~& J" J) d# U3 ^, J7 Z
    1 g  ^9 G* g1 A* ^$ s2 Y' d
    4 u) F' \1 t5 s# \1 R9 Q# u( H8 W/ ~

    0 @* F/ X( u) X" ~事务的隔离性
    3 f6 T( y* i+ p9 f8 w( @5 MRead-uncommited( l8 v7 y6 f+ _. X
    ! {5 s1 K2 p2 l) \4 L6 a( d
    读取未提交的数据(基本上没有锁)脏读,存在不当读取的问题。
    0 u, _# @( f# M# _2 M+ l/ c$ |" Z2 W; r4 [# ]# j. D( t
    Read-commited
    % u% g5 A: w$ I) K; `2 f
    ! H7 _( ~/ ?2 h' e2 G5 N读取已提交的数据(行级锁)6 J; R: [8 _: Y9 e
    4 B1 U+ x( K/ F% a" d& O
    无法读取已经写入,但没有被提交的数据。
    : a, ~- ^( z2 g+ n# Y$ T
    . K; C) ^% Q  P9 ~- x( CRepeatable_read2 ~  w$ J  O" F4 o% o( S

    + d1 s* F0 W- U& |8 b读取的数据不允许修改或删除
    0 j8 @4 v( P2 t  [+ k% U- j# b! b
    . ^6 }0 x) \* T% |) w不可重复读(行级锁+不允许修改/删除)
    ( y; r) P$ d! ]! H6 ^/ y
    $ R  B8 _0 `: r1 BSerializable
    0 ~+ `8 o! ?$ {2 ?. P9 l  z% i3 r  U2 O5 p
    幻影读(表级锁)
    9 B9 T5 `( L$ e' q  Y+ {
      `1 ]( J8 P5 @  G: Z 6 ]- t+ w$ {* r- k
    . u7 g; ^3 z+ O4 c, x
    struts  F* m9 E7 `3 V) w% D, F
    开发流程
    - a/ j8 w; q0 O! P! ~) E
    4 ^4 C3 B6 V3 c" S( Y7 K8 G1、创建表单$ b6 T* D4 L: F# l. r
    4 R# f9 p: N7 ^2 _' X$ L
    2、从表单中获得输入
    + p5 T' u. ]+ {$ s; l3 I1 r) L. u! R4 U- t# ?6 C0 x- H
    3、处理输入(业务逻辑)$ H4 {4 _9 X9 z; T! N4 w

    7 p0 M4 O6 g  m  ?1 S6 t/ D4、根据动态输入改变输入流9 i: C( ?6 e0 s7 F5 Z7 Q  E
    . ?7 g( i' h5 B7 R4 b2 ~
    要完成上述四步,我们需要创建1 j. }% u9 r/ S) \* M

    / i! U) R  l4 S* G7 U& i/ b# Z2 Y1、一个ActionForm
    ! ^( C3 N9 W* g' ~
    " F: N. d, _# j& [! T6 X6 N3 d8 G2、一个action
    ; V" P) m4 e, X& |1 t2 `: t4 ~! ~  ]" d5 w3 v+ }/ n' D
    3、一个配置文件struts-config.xml# k: ~* i: O# N! B6 d

    " n& x$ q& F2 ?4、创建页面# {, \" v4 x# f9 @) K) U( \5 S

    $ y6 T* m/ O5 B7 i创建ActionForm
    2 L- @3 ^7 B+ n; W) E; N5 Y
    7 {* m. g  ]5 J( D( m1、写一个类继承ActionForm
    3 h% c& M) ~5 c: {, P0 o& i5 L7 D4 s4 \+ |- f- U6 ]
    2、私有的属性+ h9 p6 E# a" J8 y. H8 \3 Q, h0 K
    ' L# n9 P4 B, f' i$ s4 c/ o9 j. x$ G
    3、相应的get、set方法# E, E) s- R4 a* W
    / z" J8 E& I; Y  J$ S# F" }
    4、重写tostring、equals、hashcode三个方法) R# C0 v5 }& M3 y% O

      M4 l# B) ?+ I% r1 }创建action* O; V& S, h4 _5 Z6 P

    ; F; s# u3 j2 x/ _1、写一个类继承Action7 Z# f* ^3 Y5 M3 B" ]

    & V# X  Y; |/ f. V$ G2、实现一个公有的方法(回调方法)
    / X$ r# p+ X* e6 R. O8 G0 |
    / Y" D4 h; h9 C5 L/ r! ppublic ActionForward execute(ActionMapping mapping,% o8 r/ K5 Q2 B- y; Q
    * R7 _$ r3 I8 L0 \& {
    ActionForm form,) ?/ G! G5 D8 B0 G8 x. q4 A
    * j& C, w8 m7 P6 [5 h% K) M
    HttpServletRequest request,8 u6 w  D# m; `: {+ ^: h# l

    $ c5 m. x( z5 F% pHttpServletResponse response)6 H" p0 Z) |: o$ p2 ]; _* V

    2 y% r0 u* ^+ }. x& E5 X2 g{. W3 E) G8 G# X- x. N* ^
    " O, F1 w3 n* `0 R
    //1.收集参数
    , _3 ?0 }! \( F+ N& c5 A- p6 z* h/ n. f( E
    MyActionForm myForm = (MyActionForm)form;
    - V- g' b+ |1 ~! o4 E: l. ]  o3 [6 W! h4 {8 O9 f0 w
    //2.组织参数
    # `  P* t3 n) e+ J. \6 ~) S/ C, Q1 ^0 o; N1 V

    7 b% a+ a* {( j
    0 p! N4 ~5 }9 r  Q5 C//3.调用逻辑层8 A0 D% Z, J4 Q4 p) T$ |5 P
    * q  s! T: l5 A1 Z2 B
    boolean flag = true;
    ( m0 z' o, T; ?  a/ n  x  N
    ; ~$ \+ A9 C0 O7 I( I1 L7 }: H//4.根据返回值来跳转到相应的页面" k- Q: k5 q8 }2 K2 X
    ' j" W" T  {* P
    ActionForward af = new ActionForward();1 C3 ^( i' d! w) `+ M
    ) \9 Z$ c6 c" n5 J, a; [* p# r
    if(flag){" h1 Z" \/ l, a: W4 I
    5 T7 _" V. q5 g5 F  q: M
    af = mapping.findForward(“1″);
    ( x8 x6 M& K, O
    3 W' H, `: K  e  n, M}else{" [3 b$ K/ P+ |) {5 ~. w

      z- W* Y  c5 P8 O2 X2 A7 T" Gaf = mapping.findForward(“2″);
    : }6 g" M+ g4 E4 J5 b
    + @- g% [2 f/ s4 ~; d}
    ' `2 v1 E' O- |  q' `8 ^5 \5 Q) p
    ' f2 Z) y. ^4 c( Y1 ereturn af;
    # w6 M; j, `% t% c
    . g  @/ e9 O2 V/ B}
    6 |. q, P3 }) a* d. n* M0 j& B1 A* W  K! W8 Z
    配置struts-config.xml文件
    " m# _1 g; I8 u2 l) h8 F# N; u+ u7 u$ n$ {+ P; S6 _( S" U* l
    1.<form-beans>) v, l; W& q& v( a7 d  w2 n
    9 ~7 u+ R1 C3 [0 @+ o" ?
    <form-bean name=”myActionForm” type=”全路径.MyActionForm”/>+ p7 D" \9 N- o1 k
    : F9 b- U+ M3 I" x( {
    <form-bean />
    - S2 C* a4 \- P, U6 l3 s3 E% H& V) g- O' u; K
    </form-beans>/ _' P2 _+ h( p6 q- T% ?5 f

      Z+ Q- g% Z6 |  C2.<action-mappings>' j% @1 O8 _/ Y/ V

    + M- K. f' |( d<action path=”/sll”
    ( a( K% d# F$ B$ X# A
    " C, M; u: n4 t4 {' b' Aname=”myActionForm”
    7 v$ ?/ y/ F7 M3 q9 i
    & Z$ Q* I; T  d5 ^type=”全路径.MyAction”0 t: U0 U9 T! X+ P& R

    ( q' ?6 d; G- Sscope=”session”
    $ y, j& |' t3 g1 n* V" n& u1 _- ]; c' Z8 b6 D+ m; f! s3 r2 N0 c1 a
    input=”错误返回的页面”>" c$ x: d" b5 Y; Y

    6 K& S; k" }, k8 i6 W$ v<forward name=”1″ path=”/1.jsp”>
    ! z$ X& Q$ \+ a6 r1 ?$ p1 d# x9 X* J8 x5 G+ Z4 O( y* i
    <forward name=”2″ path=”/2.jsp”>
    + e  r4 ?" \6 p' S  X: G' c7 R, x, B# {7 G3 {
    </action>
    ; I' y/ ~9 T) d; K3 W; p$ ~1 }
    ; y. D, j2 \; U</action-mappings>
    , X8 W5 |2 L- n% y1 u  b; P( b: n, V# q. r( I% U7 H
    步骤:# j/ ~1 J6 g0 @
    ' K! T: z. W* _" ~6 u4 N; l
    1.创建一个空的web应用
    * M: T4 |, ^: V- d1 J6 Z+ `* Y
    : l0 D, |- X1 h2.将struts的包放到lib文件夹下8 E7 M; ?1 f( S- Q
    ' N- T/ i( [; I0 [
    3.将.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目录下' ~, Q1 P$ a: }

    7 M9 _  L! v: T7 W; B4.配置struts-config.xml文件和web.xml文件
    + M2 v( C( y: o1 @
    ; i% Y3 m4 T; `$ z/ K5.在页面引入tag文件uri* m3 d" k  ^2 o# o; r' T
    ) X3 z( M) `* I- a3 O. P
    STRUTS运行机制% h+ y/ e2 B, X  j+ j# T

    ) @, e$ B6 E  p& v5 d+ K1、界面点击产生请求) f& {; S& r* t0 G2 I

    7 E: o' ?: T% H. j# }+ E2、容器接到请求
      L. i# [, x8 `" C! _% U( a6 ~1 e5 F' k4 a' Q
    3、匹配web.xml文件中的*.do来调用ActionServlet
    * c3 D/ \8 V2 s8 r: V. W) B( q; e) e+ E+ V. x& U% K
    4、ActionServlet的处理5 {! o, O! T& Z6 M& _
    ; s; h, I7 z  B2 Z  m
    4.1 读struts-congfig.xml文件形成ActionMapping8 H! y, n6 D8 J" B4 r% j& P/ I

    # {1 V3 p2 ]! {$ e  Y8 R7 l3 {, s1 a4.2 通过path 来匹配Action类,通过Action的name属性来匹配ActionForm类
    3 k! y3 Z8 g" @5 Q# B. S, O# I/ Y6 Q8 a" l4 L$ _6 V
    4.3 通过反射机制来给Form添数据& @$ m0 U4 I6 Q  ?

    ; c% c! u, I) g0 F+ C) x8 U4.4 由ActionServlet转调Action的execute方法3 c9 ^8 N( n& f7 V
    * R" @% S; o7 O) o5 `% c7 y' Z
    4.5 得到execute方法的返回值,跳转页面6 e: K+ O4 {9 k& f+ z5 ^
    4 [/ e8 K; q5 ~8 e
    4.5.1 RequestDispatcher
    7 r1 D& |# M. T( L$ |6 h7 ~( n" v5 W$ C  _# b# I
    4.5.2 response.sendRedirect(“list.jsp”);
    4 D. p4 ~8 o8 f% z. [3 O. j
    6 \5 ^, d; C4 ?$ |, j 3 a' ^* l( e0 y4 g8 m" u7 H

    ! ]. j. J; l( J" Z( l: }; j7 v进入execute方法
    % R3 p0 g# I2 }* `
    ( ?7 f1 x! Z2 s; I& y1 x% g1 收集参数
    6 v1 H1 ^& T3 l) ]! o% P9 h1 a- ^, [& ^. w
    2 组织参数5 m9 I. h1 g* C8 d2 X& L9 s& _0 u
    * o8 F" [( z( l0 R( c0 i$ `6 a* Q
    3 调用,逻辑层
    ! K- m" x! n$ o* E& H$ J
    0 T% X0 z5 w' e$ F& @4 返回值1 C, }* z2 l+ v% ?& y! {5 u# j

    . B" l/ S* A/ E8 \) R/ g; }$ H8 `4.1 选择下一个页面 (ActionForward)
    # h0 O7 M1 X- I3 V" t
    ) o: Q* w) f% q" W8 D* K, b4.2 把值传给下一个页面
    & a* h& [: t- s0 s. ?' b
    7 l+ F# g# K  q( s 1 V# n( U2 Z. F* k8 c& o/ M

    & o" N6 P" Y7 x. [( v4 J, H) s9 ?! W比较struts和struts2的不同9 Z9 t6 y" M" r7 d2 ]
    1 N1 V& W- z" `# ]) g
    Struts
    3 F% B1 Q% D6 x- Z7 _& G0 X9 `7 k
    Struts2
    % s: n5 u1 D8 M8 ]8 |5 q: ^& @! U% H6 ]* d3 _6 j! k
    组成        五个部分:ActionServlet,ActionMapping,AtcionForward,ActionForm,Action        十个部分:AcionContext,FilterDispatcher,ActionMapper,ActionProxy,Configuration Manager,Action Invocation,Interceptot,Action,Result,Taglib$ G3 h2 H+ V3 |/ S
    url        .do        .action
    ! P# I* S+ t' n分发控制        AtcionServlet        FilterDispatcher
    ! Q6 D  M; S2 c+ }/ i收集参数        利用JavaBean技术,将数据封装到ActionForm的子类中;
    - Z% _' Q) I% |) i一个Action对应一个ActionForm的子类
    3 [5 n2 f3 Q) e% w8 i( z( k" `1 `! H* R; \5 M' H4 ~/ p
    使用拦截器将数据封装到值栈中。. d4 \( k+ `6 s' a; j" r( I4 w
    使用域模型,一个Action对应多个值栈中的Model- l/ s+ c. N5 u' X4 b; C
    + a; e* O9 h' v. V' x0 ^
    读取配置文件        ActionMapping        Configuration Manager) |1 W# a- t" }' j: x
    拦截器        无拦截器        执行Action前后有拦截器
    5 d5 J# o5 n6 A0 \+ q返回页面        将字符串封装到AtcionForward,进行跳转页面        Action中直接返回字符串,通过Result跳转页面3 Z- D9 X" u- @4 m' i* i  ^0 }
    页面跳转方式        两种:dispatch,redirect        三种:dispatch,redirect,chain
    + m) v7 r, ]( Y% B值栈        无值栈,Action通过在request范围内设置属性,向jsp页面传递数据        有值栈,Action和jsp页面通过值栈传递数据,jsp页面通过OGNL取得值栈中的数据& k9 c: c. v! D9 z, U
    配置文件        struts-config.xml        struts.xml
    & O3 h& D. U' H8 z- j  u+ T7 T4 ~中文问题        不能解决(需要使用filter)        可以解决中文问题:2 `5 U! C! g! X! _; A" I. |# \% V
    1、在jsp页面添加Meta;* s& C& a9 Q3 E% _8 Q' ]

    % L$ g. X$ I3 O+ u1 o# v2、修改struts.properties中的设置。
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    18#
    发表于 2014-12-03 12:49:03 |只看该作者
    其他开发工具和技术2 z) ?& y" ?( N6 c* w
    Ant/ Q- f1 J1 i) h& q9 H3 B5 @' D
    Ant是基于java的批处理工具
    & e: j( c3 B9 Q; ~6 P$ [* h/ K0 }9 f, G1 h/ I/ n6 v1 f6 M* O0 h
    一、配置ant的运行环境
    " x4 j( R3 c% B( q( N* W) v4 d4 v% ?0 f$ V, Y$ m  m: N
    1.将ant的bin目录添加到path中/ U: t  D4 [. M0 D; j6 [

    / V+ n( }8 [3 e9 a6 h, F  N( b7 h2.配置JAVA_HOME
    4 I+ f( q; }9 k3 e
    7 K7 a! a$ J# i& z# Z0 J3.配置ANT_HOME
    + }+ y! o& l- l& j: e' U) M5 Y2 o6 J2 ?& c4 J) l
    二、配制build.xml文件,该文件放在应用程序的根目录下! J5 \! [& R/ E: B

    ) h8 D1 \" D/ x+ Z编译java文件
    , X- G0 P6 k  Q& _$ f
    $ r# [8 a/ y4 |+ n) q* Y执行java文件
    : f( `" Z" q# u! m6 \; F! r$ w! s! i( l5 D& r5 u8 Y% J
    copy
    " j- b# v$ X! H& L3 b3 E
    $ i% H* ^$ I# J6 G" R3 z# d删除- [5 Z5 U# q0 s1 Q, e; D: q

    - ?4 |9 w( a) X+ e) r5 }5 n打jar包
    0 O* e* k; G5 b0 \& D9 x: f, q
    $ q# _5 c8 u* X根据注解生成配置文件
    ' h: Z2 l: g9 k$ B2 R7 `
    - r9 U6 a0 H3 M/ T5 xXdoclet
    6 t) K7 s! l) O" N通过注释生成一系列文件的工具(txt、xml、java、html等)5 g! w- k) W* J
    / ?% x9 ?, [" o) f$ n/ h& L( a
    xdoclet本质是摸板技术+字符串的替换
    6 ^2 z2 J2 N5 b* q; H* O+ R' `6 {' H* S" Z( @' B
    1.在java文件中写符合要求的注释(将hbm.xml文件的内容搬到java文件中去写)4 t' I( G0 c1 r! A

    * C% L6 n" p) J( m" m1.1 在类的上面 写与表的对应7 E( T4 {  i/ d' c$ D$ s1 B

    , z* Z. x8 u4 T2 @% b  [: r2 ]7 _# }1.2 将每一个属性的注释都写到get方法的上面
    9 A( G% o" a  B: v/ D: x0 z6 J9 Q4 c$ _: a9 b
    2.在ant中引入相应的task来驱动xdoclet
      ~# o2 h5 a( \1 |. a& t% _, O5 N: q. q: c

      f/ Z5 W1 S4 M$ |2 B  l1 ~: H* ~  Q* G5 L( J
    log4j日志管理% h: o' i& ~2 q2 _7 M5 ^2 w: H( _) o
    1、是什么?! R0 H7 [) b8 y5 M
    4 U/ n! |, R8 `$ k" N& J5 s
    在开发期间用来测试、对整个日志信息进行管理的工具
    ) S. Z; Z4 X$ \
    * z! G8 g" p2 {" x2、功能0 u& ]! q6 v1 x2 ]

    - _0 ^, P0 g0 Q1 |6 Z' k" y3 l  R1.控制输出的目的地$ x, `; ~% I0 w) r0 @6 K

    % X5 \$ s) N4 F3 o2. 控制输出的格式  g' _2 z; {2 g' f/ X
    4 r9 q. P% ^( |$ i
    3. 控制输出的级别, d5 P/ @1 O- r
    ' ~2 _5 ^) d9 t  U# x/ R5 h6 e
    3、日志的级别
    6 b% f3 b* D% L+ N- n  |/ M( k! B; p1 P$ ^& q1 }9 U* r
    1. debug 调试
    0 J# {, B6 f4 E1 x! F0 g6 L
    ; W! j) R. J% P2 P$ Z  F2. info 给用户的提示信息
    ) `; I' c: l: |2 b( C3 ~. j# @7 P. b! J# o- }/ }4 n
    3. warn 给用户的警告信息
    ) o: g* D9 ?3 D$ m  ^, C; l3 n
    ! I( g: ]8 G3 O$ w- i- O4.error 给程序员用来调试: R  h' H6 `: Z

    0 ~2 ]+ A; Z$ a3 ?" G0 {Debug—-〉info—-〉warn——–〉error
    . }4 @! [3 B6 i/ E; }$ n6 @3 F7 f3 [( y$ `2 C
    4、配置9 A, C* I8 y$ x* Z2 c  ~8 J3 J

    2 D& O! e0 A% ]. n& L1.配置级别0 v4 Z" o& [' O- ?! n
    ) M) G( i2 _7 \$ v
    2.输入源 (控制台和文件)
    ( O! w1 \% X5 t( k& H
    6 Z" Y# m" U) O6 _8 u0 o$ f3.可以进行分包控制
    ' W( Z! j/ h2 p1 J; `/ ?" a  _8 T( J3 {, U8 |
    Log4f.logger.包结构 = 级别
    - L  {$ `( T0 C% m0 S& @: Q
    9 s* G& x* j) }5、使用& d4 M! ]/ t5 l% \
    ' t# }: }& t8 `
    Logger log=Logger.getLogger(Test.class);& s- R6 P+ I% p' F
    2 e2 R; z% o) d1 d# ^- z( h
        public2 Y' j* C* g, j: `+ q' i/ S
    void t3(){
    : G3 }% v8 C' [1 n% H+ S$ P
    % t  D4 i, U- y' T        log.debug(“this is debug”);
    " m  I0 ]0 ]0 S" o9 F7 w1 z. A5 y/ J3 a; i( E$ f. P7 q9 o
            log.info(“this is info”);) k* T! U4 |9 f  m9 {0 ]

    ! i8 U4 e! R+ y& ?2 T+ {5 v        log.warn(“this is warn “);
    2 V" [4 l& \" |+ d* R4 S. z$ H; n$ B/ y# W6 e/ e
            log.error(“this is error”);
    $ ~+ @( v9 S; h0 C! \$ I& [" m2 l
    , j: j4 R8 [8 D5 L    }. V6 Y$ t. }; L3 c: s. b+ x. C

    7 P% g$ ?' @- \" F# kJunit
    : ]- j* X; V, }5 H1.是什么?2 s& P4 C4 m% ~# Q& ~6 ~% Y/ `' @- W
    * ?5 \2 Y5 M! M. c* C" E& e1 I
    单元测试的框架
    # z5 }' [/ O* J
    # _, Y. r3 o8 G. v2.怎么做?
    * W2 B6 g* ^& e* j9 _9 a) ?% R
    # k9 i; z( ?# p! d" C写一个类继承TestCase* i$ G" V  ]6 S" A1 E  }
    , x1 }- u) O- ?' E5 r+ V& F/ P; w8 b
    测试的方法一般都以test开头并且没有参数
    / o4 \/ L8 h, }  O0 S( X. t
    3 m6 Q- z+ R0 k' h: O在测试方法前执行的方法public void setUp( )6 ]  k7 {! z$ f. d2 O+ t
    2 {1 r2 D+ F& _& U4 o  P
    在测试方法后执行的方法public void tearDown( )
    , m# [, O3 g: D0 T! O1 \) @' P& ~
    ' n5 t2 Q: M* U+ V9 w6 Y+ U2 e& Derror和故障的区别
    ' A8 o$ _" L: V- c, D
      v/ c1 _& c# S- Herror :代码有问题
    ! j( U( q& ?  A: R' S- B; h
    6 _; e9 T- w8 ~( Q7 A1 ~" x故障 :逻辑有问题与祈望的值不相符合  z4 U8 Z  ^- O7 J

    " }3 `8 ~* D9 i" b1 q; b生命周期" e5 s- W1 S- m4 a6 c& H
    7 B  ?# s: e( n% W" w% m  i
    测试—〉SetUp()—〉testXX()—〉tearDown()—〉结束;$ `5 q: T2 B9 x2 P
    6 [% Z! o! L) D5 a
    TestCase套件$ X5 V& a0 M  Y) _% W4 p
    ! ~0 ?) e% e: o0 T# a2 Q5 {
    public class MyTest{0 ^" p, _7 L7 N6 p6 M

    % W1 h% p" Q3 b) I- r6 ?: z2 d        Public static Test suite(){- w% z8 E7 f4 U/ [# \+ e  `
    ' ~4 c. @' _' c
    TestSuite suite = new TestSuite();( ~4 V# X2 Y7 n$ u5 w
    % b: E0 y  a0 i! P4 d  z! K
    suite.addTestCase(Test1.class);% v: I- a- v# e" k7 Q0 C7 i$ |$ [5 q2 T
    & z0 L' s! N# I
    suite.addTestCase(Test2.class);2 L  S8 z8 t5 S+ U& a+ [

    : L& s+ b* I9 Q8 U; ?}
    : _( S5 n" E+ {4 v" ~3 y0 ^, \! z# f3 l4 }
    }
    6 R$ ?6 O4 m& n3 [% y4 [, q' G, g4 _; F- G2 O

    9 `" X# m' N4 D; K8 ^/ l* F* [3 @1 [9 {( m% g
    Ajax; [8 g2 {& k/ `6 f
    是什么?( ^1 O0 E- ^5 t3 t9 m1 s5 s) R; T1 z
    AJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。是一种创建交互式网页应用的网页开发技术。
    # J/ h, S6 \$ S/ J4 g& h; |: {$ z) i4 A7 v$ M3 b/ @# W$ F
    无刷新页面。
    5 R0 o0 f% Z& i. k  p+ m* ~5 u& R8 M6 F+ j
    有什么?* X' R" ~: ?* [4 T4 U, D
    AJAX是多种技术的综合,包括JavaScript、XHTML和CSS、DOM、XML 和 XSLT、XMLHttpRequest。; |/ x) T# [% U' C
    9 @% c% y$ h' @. ?0 k* J
    能干什么?
    ) C# ~* ~* D1 b使用XHTML+CSS标准化呈现;  a0 ~1 a9 u  V& z, N, d# O
    使用DOM进行动态显示及交互;
    / P1 Z* }3 Z4 S1 i& K/ X) O# ^& ]使用 XML 和 XSLT 进行数据交换及相关操作;
    ( Q' f" v1 y; j* N, ~* w* H0 q使用 XMLHttpRequest 进行异步数据查询、检索;/ o# S. k5 ~6 u$ U* Y9 f
    使用JavaScript绑定和处理有所得数据;3 R# o+ [5 t0 f6 c
    & }& x" z5 c7 I, g( t- j
    传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。
    ; {4 K2 H* @5 G8 U/ |) x1 h: {7 R& `$ D. }& m, a. {
    与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。
    8 v' S( G4 H) j- u: C/ O8 d- ~% j  b
    . k9 B, a. ~$ |1 o" u) m使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。
    + {( K1 U5 [) S# P: }: \9 r/ e% Z3 r0 w" Z  |& H5 ^9 u* k
    对应用Ajax最主要的批评就是:! x) \3 \* K8 s/ Y7 U3 i! D  R
    1 它破坏了浏览器后退按钮的正常行为,就是用户点击后退按钮后不能看到之前的数据;
    . ^; [. A' z9 w; S7 J+ E2 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;  D/ Q. K3 z9 w8 q4 n0 w
    3 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;7 D3 _( K& I2 s; O
    4 Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;8 Q; R7 v$ p% N
    8 E- V; N' o7 Z8 ~, T; P4 o* C+ o9 |
    怎么做?
    & a  T3 s8 O4 m+ T, `<script language=”javascript”>
    . o. u- `4 W/ O
    0 H2 y5 d( b) i. ~var req;% ^2 H4 L& z; Z3 r
    5 N" x7 O) x/ U1 e% q& ~
    function add(){
    ; }( `, a# V% @$ r' \. R* L8 ?
    //1:创建用于传输的对象( _5 I% f# i, J3 x1 ~$ A

    : D+ X2 L! n! V6 ^req=new ActiveXObject(“Microsoft.XMLHTTP”);
    ( ]! I( p: w( e( T& E- g
    $ w) Z6 G+ w4 i# Z// 声明返回后,处理数据的方法- @' F' Y9 j" t6 P  P/ e
    + Q' a  z$ A& z
    req.onreadystatechange=manage;
    % A: w" s2 L3 d& J. P  s5 t; V
    0 j4 U) F/ Q% N- J, w4 w5 a4 F//2:准备传输的内容
    0 X7 y: Y; m7 g; W% X8 U( ~% G4 {, H; g# v& C6 S
    var str=”test1111″;" V0 d: g5 ^- W5 y
    0 ?- l5 G4 s3 n1 T$ S9 r
    //3:发出请求, W; @8 X$ |% b6 j" j4 h' z

    1 o  p/ O3 O$ f5 B* X9 y: ^* `req.open(“GET” ,”/others/ajax/test/t2.jsp?str=”+str);& u2 Q  ?1 `% O1 z$ `

    : P! ^( |6 E) L# D  b* {: T( xreq.send(null);
    - D9 d+ o$ m; B+ A0 M$ @6 g
    ) U. x& j5 |9 v  Z7 x7 z}0 Y+ `$ g7 N6 }# j' I: v8 Y3 X! c

    ) C; O0 d, j! A! S//4:接受返回并处理
    ( y( N( e, x# B7 ~: _3 U. W2 L1 J# e  ?4 D
    function manage(){
    % b0 F- m) ]5 F/ Q& B. i
    * e) R0 s2 X& P! Y# i9 Aif(req.readyState==4){! D; u& N& B) }9 m4 y

    6 S: {: s- y, malert(“r==”+req.responseText);
    / ^* E& Z/ I) _7 C0 ]% O8 y
    " B* G: J/ R( f# \9 L7 @; B( M}! G6 q9 I3 G+ q/ W: t5 H

    # l( E4 c2 k) s& h}
    % c0 Q3 T1 X( {& h5 Y9 F% n/ s, a9 s9 K( e
    </script>
    * }& I, M0 R1 l+ m) k3 A0 k+ n
    # u. `0 i% Q) C3 hreadyState的取值如下:
    8 c. ~. n9 [6 p; f' e9 n- N* R9 Q; N8 ]
      0 (未初始化)( u9 c% M, H3 G4 I6 V% B
    8 \+ l7 z/ g3 A+ P& ^
      1 (正在装载)
    9 P- ]) C  D3 _; D
    7 l2 m2 b0 O0 s  2 (装载完毕)
    ' X. @+ d. }+ E+ |/ ?
    3 Q/ B, z* F! h$ i7 e/ I  @+ X7 I  3 (交互中)
    4 |- H+ w5 F$ M& U+ J4 J9 f
    ( A% H; u5 w. x6 r  4 (完成)8 f; L- V! A( O; M  ^
    $ T6 Y+ g5 k9 g8 T/ L9 M: x
    . w2 C2 M: V* y
    $ A+ M' j0 k# e& g5 _  I
    原理
    $ P% V. O$ L" AAjax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,可以是xml格式,也可以是一个字符串,然后用javascript来操作DOM而更新页面。" M1 }" j, [6 `* L7 m
    : p7 G! g: x/ O  S6 ?6 E
    Dwr/ ~/ p- Q# E! {* ^! K
    是什么?: a1 K  R2 j! Q$ A' Q5 g, q1 u3 M
    DWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的页面。它可以允许在页面中使用运行在WEB服务器上的JAVA函数,被调用的JAVA函数就像是在页面中JavaScript方法一样。
    # X# X( w& n) [5 }% O! {5 ?- H9 _0 e4 w  s) ~6 e
    有什么?2 m4 l# t. _0 P% f! O3 x
    它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据;另外一方面提供了一个JavaScript库可以帮助web开发人员轻松地利用获取的数据来动态改变网页的内容。4 c8 {$ h, [0 @; H6 f2 I

    ! P" O% J  |& D# j7 A- f/ N! z  C ! N; I9 B2 G3 }+ X) l
    6 x  s1 ^& E( W
    能干什么?
    % i+ w6 I, E# p, ^! K动态地把java类生成为JavaScript,感觉调用就像发生在浏览器端,实际上代码调用发生在服务器端,Dwr负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制。5 c3 |. m& i* f2 T5 D

    ' r5 I3 \# Y4 X  N# n, n1 m3 I % \/ C0 m7 d* y* Y& g$ t6 G! y

    8 ~( h3 k$ p& }5 y: |  x2 @怎么做?
    : `/ ]$ T& V2 i- S, a% L2 C+ X! H① 编写配置文件% K+ m- ^' t6 q8 R
    ( [& i: G3 s- Z- M" i
    web.xml: U1 r: h& {% E0 R2 h  b/ {

    0 [+ W% b' i% g1 ]! w! P# v<servlet>/ d! y8 k* h6 _! R" o
      e6 e# z- _3 i' I4 X! M
    <servlet-name>dwr-invoker</servlet-name>
    $ l2 H( X' ~# V! F, \: s* {$ i
    2 @& a. x, t! e' H, z. X2 C2 M<servlet-class>
    : A* ~8 |7 q5 k0 C* r  }9 @; \! H
    org.directwebremoting.servlet.DwrServlet# P  a3 z( M$ u, M6 |

    $ Y) Y/ y, k/ N" k</servlet-class>- D8 }  ^% _5 T3 n! U& w* Z" o
    & l+ D9 x: w7 y, @0 x6 m
    <init-param>  |3 S0 B* Q' r4 u& T* x4 D
    1 d: W& G1 V7 t7 B
    <param-name>debug</param-name>
    * D0 V: S: L( f6 C% f3 s. m' k. [1 L
    & v/ k# O4 m$ L% d+ y<param-value>true</param-value>$ m' W/ x# R1 d

    $ u+ ~1 \2 x/ H" W. S</init-param># P& w2 u5 P$ X7 S7 ?$ g
    9 e3 N% O& C+ P% n: X
    </servlet>& u4 n$ _$ K+ B( ]

    ' x" q- O5 V) a3 @; O<servlet-mapping>* ?- S$ l9 h5 s0 }4 `
    ) W5 I6 V4 r' _  y5 B) x
    <servlet-name>dwr-invoker</servlet-name>
    # H5 L3 }; {3 ^! B8 q2 b* f' X& m7 D) H
    <url-pattern>/dwr/*</url-pattern>" A0 S: w; H0 Y8 z* p& K
    : k2 S* u* O8 l6 X
    </servlet-mapping>" v: A& v# I" c* R% O

    8 ^2 }! H( O0 H! n2 I' s* Bdwr.xml& P; `  U% G5 R
    " J; i4 u' q! z+ X3 ~" d
    <allow>
    + I5 g, E: Z2 x0 Y/ U/ w1 d
    6 M9 E$ U, d4 F9 U* N2 i; M<create creator=”new” javascript=”kc2″>
    ) u0 I# {1 u, Z, i: `5 p& y# [0 L* C) X6 l  X( \
    <param name=”class” value=”dwr.Service” />
    6 L4 p. D9 W+ A8 N! A- ^2 e6 z4 D  o( v$ Y7 C7 ?  j8 W  D
    </create>( r. b9 T% o  v  U2 m
    6 A/ j% i+ I9 _4 b, P/ c' U
    </allow>5 [  r5 B' |. o5 E( Z. V
    : }: d' H- h2 C
    ②编写service# K! l5 d' r! C3 N/ L/ b
    " @3 l: }3 m8 I9 y8 h* M# z3 X
    public class Service {
    ' }( |5 k; o  F6 b: q; Q* M# e0 f5 }0 e: z$ o: A! l3 Y
    public String sayHello(String yourName) {8 ^( |4 c" ?3 P! ]

    " J& [5 k4 u, T' _) W//可以是访问数据库的复杂代码, O1 c5 C2 u6 I

    # ^! Y, w+ \- U& G$ Xreturn “Hello World ” + yourName;; W3 r4 z- z1 h+ m3 Z* c5 h/ m) P
    & A* ?' I  b7 D. y8 @
    }
    ) h- H3 v! ~( e/ K9 }+ K# ^$ o9 d# e/ t, S
    }
    ; N' P9 w# N( T4 U0 L: b
    6 a6 N( m# _$ m3 x) ]2 s③测试DWR
    $ r3 U) L+ v# c% x4 Q( C7 z# o) F
    6 L- J9 ?9 V7 s: C! Z将代码放入应用服务器(比如Tomcat),启动。
    ! f7 ?( P3 ^$ J
    $ B: x( Y! H+ E9 N1 I然后在地址栏输入http://localhost:8080/你的工程/dwr
    3 T9 A; e5 A: o' Y
    , z: j& d7 _9 O8 w7 `! X6 F④编写jsp页面- f9 h' w% w: K- V0 ]3 n

    ' \& x5 Z4 D6 p) R/ ]% |1) 要引用3个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js& _% H* N8 Y! i$ O* F" Q
    8 `9 @2 e" r% c# l; n
    2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样
    ) H! L& i- `- Z+ Q$ a0 h
    # ]7 C7 R+ R9 ~; Y3) js里的service.sayHello和java类的那个有一点区别,多了一个参数,用来得到返回的数据
    回复

    使用道具 举报

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

       

    关闭

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

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