科帮网-Java论坛、Java社区、JavaWeb毕业设计

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

动态微博

12
楼主: admin

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

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    11#
    发表于 2014-12-03 12:43:50 |只看该作者
    JEE" p7 }) W; r! w" s
    简述JEE' X9 r& p% p' G% ]/ D* m4 S
    JEE : JAVA  PLATFORM  ENTERPRISE  EDITION- K. z: r# b; I6 m2 b! x
    3 @1 Z/ o  m, p8 _: p+ R7 }" l
    JEE是一个规范集;
    , S9 t& R2 h, \- |& `5 K: W( ]2 h. m! z
    JEE是一个框架集;# a; F& Z3 o- H: e

    1 u6 s- X* \0 H" g, g! Q6 s7 Q7 q! bJEE是一个技术集或API集;
    6 d% D( N2 i9 q% ]2 R) v! w2 h) X, R
    适用于创建服务器端的大型的软件服务系统, Q. P, f+ ]: o- v( ?

    / c# K6 k+ u! ~( t9 L 1 N3 Y$ `/ P1 C' z% R( e2 u( B
    % a3 X; L: [9 n* g- f! m
    C/S B/S 模式* y: z: ?: D4 n/ j# m/ {6 Z
    C/S client/server即客户机/服务器模式,客户端也参与程序的运行与计算(富客户端、胖客户端)
    % `% t& u: q: t6 c
    . `$ y1 r! k1 k# J" P* JB/S border/server即浏览器/服务器模式,又称为瘦客户端,客户端不参与程序的运行与计算) {7 b  ]) c0 G: O, \9 r* J
    % J/ J" [& d- F6 U& p# n

    1 Q$ ^, m+ `: t* M+ e
    6 k# F6 _" h5 S* }& U企业级应用(大规模的应用)的特点( h; {- I; ~; |) ?
    1.生命周期长、稳定、可靠
    3 _9 n$ m5 }; W3 E+ t6 D" P' f( B; H6 F
    2.组件往往分布在异构的环境中,能够跨平台
    5 W4 L2 ~+ E: O" }& e0 u  W% v' i
    ! h7 C; Q0 {/ a4 C. [6 f# \1 L3.维护性、扩展性、重用性) C: h8 i" j& M7 v. X- H9 a

      G+ D$ x: F  W4.有事务、安全、线程
    , G1 q4 Y0 @* T& ]- G9 V, [) e$ w* N; h: w0 `% t

    4 E( u& ^% a# {4 n4 d: m4 U4 _, {6 _  N1 W5 h* Q
    什么是业务逻辑?
    ( [* R+ S0 t* |7 Y依照业务逻辑划分模块,: [6 W; P# X% J; Q' i) X' p
    3 F. ]( R% m1 X
    所谓判定业务 就是具有以下特征:
    + S' h$ v5 ]+ h% O* W1 g7 L2 X/ Q* ^- g8 ]# l5 \
    1.业务流程
    . C* C+ h6 K. l; E9 a
    9 h: Q. X, ^' d) t+ B2 J: o2 Z2 j8 h2.业务判断( P. S5 l/ A% }% Q) G$ ], j& P
    * S2 v3 G& a) X, [$ W- Z6 C
    3.功能组合) T0 V4 T& k, G- s0 f
    3 S9 C8 d6 t' ]; D- b
    # {9 s; f/ |9 V
    7 }3 ~. h# G" R6 L
    平台(角色)的划分
    2 D; {& L- y6 \% \1.平台供应商。提供满足API集实现的厂商(BEA weblogic IBM webshphere)
    . F; S* e( u/ {& m/ G' a8 k! \
      S/ u) Y0 y6 D( w: l7 k2.组件供应商; P( A5 ~& Z  b  [% r! `& y
      \, q8 g8 `$ o' i* \$ V
    3.组件装配人员* q( M/ h; m/ ^

    & p' g/ M9 f) t' k: n4.部署人员8 ?5 Q2 J( x* O* ?

    : H$ L  @# u, X2 u5.系统管理人员- l2 K/ L" w8 a

    2 r* u7 k/ u% Y# h% X" k  ?' P6.工具供应商 提供开发组件所使用的工具(Jbuilder、eclipse)
    + Z+ p; ^& v3 r3 D; g: a6 ^& i; y9 B' J

    ( c: U! C: x2 e4 ?2 {4 N
    $ u% T% F5 ?. ajava技术分布(设计架构 模块内部设计)
    " U8 b+ K7 X7 L) P( s1.表现层 Servlet、 Jsp、 JavaBean、 Taglib% @! p) G) b5 E* s
    ) o) x& n2 P, D, S2 s) U/ K
    2.逻辑层 EJB(SessionBean)
    4 V+ R- u" D4 \5 d* l: Y
    + I8 ]' W$ N. |- H( v. q5 V0 W" V3.数据层 ( JDBC  EJB(EntityBean))
    & E2 B/ G! E7 S& q9 m
    $ `* s, U% F3 A: Z/ Q. o) B: S4.服务 JTA(JAVA事务架构) JTS(JAVA事务服务) JAAS(JAVA授权与验证服务)
    " B4 h7 P9 X+ R1 X% E) Y8 j& p3 i
    ! K3 b9 b+ W7 o8 l, g  g: P) }5.分布式通讯 RMI(IIOP)+JNDI 、JAXP(JAVA 的 XML 架构)
    6 {9 H( W  M! H1 f) {- g
    0 @' V. `" b4 h/ ~) p4 xJAVAMAIL(邮件服务)、JMS(消息服务)、IDLC、JCA(JAVA连接器框架 (成))9 L6 I- W" ~7 l- B, ~! S% O4 l" \4 g
    & _% F1 X0 q! \1 Q6 \
    1 P! ~- Y/ |$ J
      B* H& q" \- P
    JEE的体系结构: 是一种组件的体系结构
    2 V, O3 J5 a5 M4 v! l1.组件 : 能够完成一定功能的封状体(独立的功能的集合)/ n- b- n- p+ e! ~( U  ^3 O

    + }! \9 c- N* W' W, q  R不能单独运行,必须运行在容器上
      f! e% o. V' n1 d, V/ d5 U9 \3 h! j8 Y. \7 M
    分为两类:web组件、ejb组件* c$ s$ ^! F  |" ^9 Z9 L
    3 n0 c9 ]% H5 b' }' n6 r) p
    2.容器 : 提供组件的运行环境,并对组件进行管理(一段程序)
    2 w2 x- q' {4 o. E; b3 n/ Y* a& x
    & Z4 C- J/ o; l8 ^1 x管理组件的生命周期
    1 N& G: T  Z" Q* a8 |
    ( I3 V1 B% ~( n: y$ q1 x不能单独运行,必须运行在服务器上$ j$ E% L8 ^% b9 @3 m
    8 S2 _3 P: p# M7 e7 V% a  G
    程序(组件)通过上下文来调用容器(context)
    ) t# L8 D9 @4 H  s6 }. z  d" X) @" u
    . f* a0 F; g+ c! p; P组件通过web.xml向容器描述自己,使容器能够认识组件
    8 `: w: o' g0 j% e. \$ i4 w# |0 y8 o$ C
    容器通过回调方法来调用组件! v  q& `9 [9 o4 n, u! F0 L& l

    5 {& v6 T  R+ n分为两类:web容器、ejb容器' B- y0 |: w0 }1 D! B5 G2 L

    + A: p, a, i/ y7 _3.服务器 : 提供容器的运行环境,提供大量的JEE基础服务
    & y2 c6 ~) }) a7 f+ k- S0 N; w0 H. `7 \# I" |+ A
    web服务器(只提供web服务)$ a1 k$ a$ ^5 `6 I/ k& J
    % I4 r7 q# a" Q: Q% m) i6 T3 N
    jee服务器(提供web、jee服务)
    ; o! `4 w8 q' o/ E" x0 f4 C
    ( s( r$ N; J0 @' k5 O4 s5 J/ [ ( p( D- B: B: Z  M' q/ k

    + s. S' c4 j7 K6 k- [什么是回调方法
    " ^  Z- V/ N6 ?7 B+ b由容器自动调用的方法,就叫回调方法。
    ! x7 Z4 B  u% q4 y) s; k' Q+ u* T% V4 [
    $ I* W$ x  R, c; s

    7 g- k, G& ?' w( c3 fRMI远程方法的调用机制1 C: G, s' I, a- Y5 r5 e' `2 s
    例如:A主机有B()方法,C主机有D()方法,A 想调用C主机的D方法
    4 T4 v) T: @) t2 i4 `$ l7 ^
    5 N" a$ [2 ^% m& F3 i, `1 i3 |* j, N4 Q) B1 f: i7 w

    4 ?* M' G0 G9 t& Q  q$ v % Y3 D" n% k( E9 l  Y$ W5 D

    - d0 @( ?! j: D/ Y0 d/ Y7 F0 _学习方法( C9 J. e  ]! A" [. G9 \* p8 l
    1.规范(熟记) 2.熟悉API 3.多练 4.多想
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    12#
    发表于 2014-12-03 12:45:29 |只看该作者
    Servlet
    " v% {2 ^7 s. v0 d/ k" z
    •     描述war包、jar包、ear包的结构
      5 @# N& A1 e- D+ G7 e. v* ?
      $ Q* Q! f+ d; D+ ?
      ' ~( ^  u& a  G: Q8 ^

    war-                            web文档压缩包

    —WEB-INF

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

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

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


    ( {: e0 |+ K' c! Z; f3 s; R+ B

    jar-                             java文件压缩包

    —META-INF

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


    ( e5 ]+ [: N/ w, \- F" B0 p& V6 K- K

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

    –META-INF

    —Application.xml 配置文件

    –*.war

    –*.jar


    # ]: f) q( E* |5 s+ [  O
    • 什么是servlet?servlet主要做什么?* q  S% b& T7 _  L, w9 K
      ) e- O" m6 Y" J" C

        W1 |1 S" ~3 ~8 E

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

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


    2 q* d' J8 U. T5 Z5 {
    • servlet 与cgi相比的优点?servlet的缺点  Y7 q, r% H4 X. S9 |' M+ c+ I7 k

      ( {9 M, D4 `# u7 H2 x
      $ B; F: e, M8 P* l

    优点:

    性能(线程比进程更快)

    可伸缩

    Java强健且面向对象

    Java平台独立

    缺点:

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

    . `# J0 |5 F) d, W5 [# E2 _
    • 常用的servlet包的名称是?' Z- `: w' Y0 G, l: V5 n
      / n6 y8 n8 s# G0 z$ ~

      2 n' ^2 b# }$ t" w/ n" f

    javax.servlet

    javax.servlet.http

    & y" {9 K" i  ?, h/ L" E1 ?& y
    • 描述servlet接口的层次结构?
      9 P; Z( r9 \* s

      5 R/ v! K5 Q3 p2 C2 ]3 a& Y% r% n

    Servlet

    –GenericServlet

    –HttpServlet

    –自己的servlet

    ServletRequest

    –HttpServletRequest

    ServletResponse

    –HttpServletResponse


    - B; I  \8 R( O; E1 |  s
    • 对比get方法和post方法?$ F2 Y9 b. t6 k2 ]+ t

      9 ^- X9 a6 w$ V. |9 ^4 T6 E2 V9 \: |. K- O# l  ]

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

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

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

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

    7 Z/ n' D6 T& a! s7 w
    • 归类描述HttpServletRequest接口都完成那些功能
      , S! Z( m; g2 S9 ^/ C! ]7 ^6 m

      * X* i% o4 P4 `; f  K( Z: a! \3 I: P
      • 读取HTTP头标/ s$ p7 e+ ^0 W4 Z9 o9 U. v
      • 读取cookie
        ! k( ^) @; R) C6 A/ j/ L4 R: R0 E
      • 读取路径信息: {. y- [+ S9 x
      • 标识HTTP会话。
        1 d# p9 e  u1 ~+ F' f
        + ~( A/ P3 m% J1 Y1 D5 h2 E% g3 r8 v
    - o+ l: t" _/ T( Q$ C6 r8 n
    • 归类描述HttpServletResponse接口都完成那些功能9 i( E8 p& Y* j

      5 h( y7 E! w/ [3 r4 d2 l& t  a* T! m$ S: D6 [# y% ^
      • 设置HTTP头标
        1 F: ~, `$ `; r
      • 设置cookie+ G  V, m" T  ~" K
      • 设定响应的content类型. ^1 p8 l+ g  F* v& d! e  i+ Y
      • 输出返回数据
        $ y1 T( I  N7 k2 {
        5 r4 ~7 b0 P+ B3 M4 _

      J' j; {. g; C, \, N
    • 描述service方法所完成的基本功能?默认是在那里实现的?+ M1 R# H5 I9 @8 e' {8 H/ W

      : u" p# c/ X# w# L
      + i; E3 |9 d1 T$ `+ |5 ?' {

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

    实现:默认在HttpServlet类中实现

    7 X/ [+ ^$ O( c5 m7 p
    • 如何开发自己的Servlet?描述应该做的步骤和每步需要完成的工作* X/ ^* w! T& c+ N" \
      # ~+ {" o' g6 L& B8 S& v

      : D2 Y9 N& L4 y$ z

    1.引jar包

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

    2.开发servlet类

    1)首先继承HttpServlet

    2)重写 doGet( ) doPost( )

    3.部署

    安装web服务器,例如Tomcat

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

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

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

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

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

    4.启动服务器


    + B5 [/ X! Z4 s; H+ b: z
    • 为何servlet需要部署描述?
      ! a0 {6 X7 @) d0 j1 P8 d& R
      ! k  [+ d9 f: \* c9 s5 Z3 d
      / A  z8 w1 m7 @  s

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


    : _. ~0 D2 E; W- V/ K
    • Servlet基本的描述应该是?请写出来
      & F* K- o5 {6 T$ T' L0 q) I+ T% z9 [. `

      - w/ s8 G1 a; `8 X* k$ H9 N* N
      2 r4 a) C0 |- T
    . _6 p& y5 W$ V& L2 @

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

    3 n# y% F. i; }- j- [9 T9 ]
    • 如何在html中使用servlet
      % u% B' ?; t/ b) C# a- b; e$ [

      - F% D# y/ a& m  S" ~% A
      # A" n: R. s. E% ^+ p7 G. r+ \  K

    FORM标记

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

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

    语法:

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

    {HTML form tags and other HTML content}

    </FORM>

    / Z4 ]2 O! K2 l  G% k) S" ?8 `6 h  R
    • 如何接受request中的参数
      9 P" W6 w# l" P1 _. m. e

      / o% W' L' ?) WString userName = request.getParameter(“userName”)方法
      5 x4 ~4 R) ?* l- W" `' P  U) `# s. X% M
    ! h2 }! O7 U% Z( m& O1 s
    • 如何接受request中header的值, Y8 d0 N$ J5 p; g! a
      - j& j+ M. W; o# p1 a" p* \
        W0 G% c1 X! L/ q

    request.getHeader(name);

    request.getIntHeader(name);

    request.getDateHeader(name);

    request.getHeaderNames();

    % q/ |" A; ^5 U7 j$ f! Z" x
    • 如何输出html; p/ c! u/ [* @  ]6 y
      - k8 G* i. X  H- b! g

      ; E! i5 Y" ]. E

    PrintWriter pw = response.getWriter();

    pw.write(“<html>”);

    pw.write(“Hello”);

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

    $ r4 z# q# G( x( ?+ P- O* {
    • 如何设置输出的contentType2 e, w" }8 X. u' n+ \6 Z+ w$ U

      7 v) c6 _& j7 r2 d/ z% q' ^5 _( H: {+ t. @- K

    response.setContentType(“text/html”)

    ' t3 L3 ]' ~+ h+ d
    • 描述servlet的生命周期?" l" `6 C) h. v" i/ J$ B

      8 Q0 c/ P$ p+ o/ M4 U3 l8 T$ X% x4 f

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

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

    ( \( t& F8 X. m
    • 描述init,service,destroy方法的功能和特点1 r/ |# Y) c. `5 b

      - r# }* o& V3 x1 [# ]/ c( j: N0 B
      4 v; e$ d( B6 e0 g/ G  }1 q0 g* |

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

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

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

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

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

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

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


    : [) }6 _% B, q9 }% t+ g5 g% X
    • 什么是回调方法?有什么特点?" y7 ~. o" z' B/ W
      5 ?. |9 s7 v1 n9 H1 g

      - J8 a; ~. K9 ^

    由容器来调用程序的方法

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

    , m, [$ G, V5 ~
    • 如何设置初始化servlet的参数?2 A! J( Z' c5 J: D
      1 h9 x# C' V+ [1 }$ f( b6 o
      在<servlet>中添加如下配置' p$ o! c5 l, f4 J8 T
      ! n+ `- j3 m5 [' U# C

    <init-param>

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

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

    </init-param>

    ! }' D9 o, B, C
    • 如何获取servlet初始化的参数
      2 U! I1 V6 S5 {8 g5 U
      & _3 i6 e1 o- X

      9 W4 l( c) s+ i& {! O7 R" i. h

    public void init() {

    greetingText = getInitParameter(“greetingText”);

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

    }

    ' W1 D) R7 s) |. M
    • ServletConfig接口默认实在那里实现的
      2 B  O; [1 w' y- S) i

      1 C  T  c  l$ v5 r6 D9 o9 F/ S9 ^4 \+ a8 F

    GenericServlet类实现ServletConfig接口

      ~2 g! U5 U# N5 B2 j$ p
    • 什么是ServletContext?有什么作用?
        C' V( x- n5 `4 A
      8 u: }. M2 h) Y+ U# f4 a  R% o

      ; \' ]2 R6 d. e: V* ~

    Servlet上下文

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

    0 @' ^9 j0 J$ V3 s( u
    • 如何访问ServletContext接口?是在那里实现的?
      . m: |) I0 ~! H% t6 K& i# Q
      4 A3 B% n) {. W: f( u" Y' |

      2 i. e% `  w! M) x7 \6 N, @1 n

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

    GenericServlet类实现了ServletContext接口。


    ( g% w3 h/ K% e" y" E
    • ServletContext接口的功能包括?分别用代码示例
      * x. r1 \& X+ ?2 [' Q/ [  F( w' _
      - c4 m/ z  B4 z* [

      ' `4 S7 k. r- T7 O, B9 ]

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


    2 B  g) [9 o$ i9 |* B# H
    • 如何设置ServletContext的参数?
      # ^% T/ A& c: m. Y; N" @
      " s+ v6 z2 y0 o% L5 f$ X
      - l& i$ I; d0 o* ~# e* I

    <context-param>

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

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

    </context-param>

    3 q3 @$ Y. `! q& N. e6 }
    • 如何获取ServletContext设置的参数值?
      0 z! Q2 g7 |0 a; N  e; D' |7 v
      1 [0 Q% g3 o  F( G' g! g" ?3 Y% _$ f

      ; @( f0 S# @# ?2 V

    ServletContext context = this.getServletContext();

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


    * j" D& G7 b" {! j1 R% u
    • 描述Web应用的生命周期?
      ! `2 P+ q- y0 S$ ^' J% s: G# ?
      6 s/ z3 y, @4 u/ |& Z" m+ C

      1 d; Z8 w& \% C6 A8 H

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

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

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


    * n! H2 U5 h6 a
    • 如何用代码实现监控Web应用的生命周期?
      9 }* y% m+ m, D  g

      % _3 j% q( p3 Q1 U- E+ O% Z8 m
      7 V# x- w% d9 B: \* E! j' }
      , e  B, \" h1 e! }) K$ X

    public class Test implements ServletContextListener{

    public void contextDestroyed(ServletContextEvent arg0) {

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

    }

    public void contextInitialized(ServletContextEvent arg0) {

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

    }

    }


    # g5 ?6 \% b, e* w5 [8 P

    web.xml文件中的配置:

    <listener>

    <listener-class>

    com.csy.Test

    </listener-class>

    </listener>


    7 X; Z, U) X  j
    • web应用中如下错误码示什么意思:400,401,404,500" ~# F( w! S. S2 P
      2 @$ y8 }/ G, e  j! z/ E( Z
      400 Bad Request//错误请求
      401 Unauthorized//未被认可
      404 Not Found//没有创建
      500 Internal Server Error//服务器内部错误

      8 Y0 E3 f7 B# d1 m- f

    6 T6 q' `+ q8 H6 j, b# j
    • 描述Web应用中用声明方式来进行错误处理的两种方法" K6 z- V$ w" n3 ~4 ^2 D- A: _. H
      8 U& [* A9 z' r6 i; m0 D, K
      $ Q% @; E9 y- W* l

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

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

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


    . V* V' Q7 W- U
    • 描述记录异常日志的方法,都位于那些接口?& i( R! f; q1 ^

      ' E8 T4 w8 l! w  E! W, x. D  @: u2 g0 H3 q

    GenericServlet:

    log(message:String)

    log(message:String, Throwable:excp)

    ServletContext:

    log(message:String)

            log(message:String, excp:Throwable)

      T+ g/ t- T9 t
    • 什么是会话?4 @. o4 }. C' {: @" r' a: B

      9 j4 T( R5 N  F2 y% c! }/ P3 |! P3 s: ]. K

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


    $ @6 a' `) _0 N9 B4 F
    • 如何获得会话?
      4 W6 b- i' }' b3 Y/ w% C
      2 T4 Q9 i% `* e; V/ u6 }9 W) x2 ~
      HttpSession session = request.getSesseion( );

      8 t; p. u  l( |0 t
    4 i/ n7 I1 y, h% x4 [
    • 会话Api的基本功能?. |5 j7 G) o6 ]3 B9 L- R* F
      0 e2 Z( Y+ Q0 R

      . {3 e" `0 m' `( C

    getID() :String
    ; P$ A$ w. I0 ]* m' a

        isNew() :boolean
    & A$ S5 w/ P' A- K! W( L- t  S- V7 q& O

        getAttribute(name):Object0 O9 \4 v) d# @$ u- X# y

        setAttribute(name,value)* x- d3 F9 o% ]4 I; a( S. i* ^

        removeAttribute(name)

    3 {, L% i& {8 ]' g! Q" m& _
    • 如何销毁会话?# O) i1 g) p# v/ V; U4 E$ B+ t
      $ x# A( s9 s3 [; H; \

      * x- }& x: H  w  V

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

    <session-config>
    ) y4 }! L& R( M8 {9 e% }" M

             <session-timeout>10</session-timeout>
    ) R" G2 S4 R% {$ Q/ K# h

         </session-config>( ~; Z9 g5 w% P; m3 C$ [& J1 W" |

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

    invalidate()
    . d4 y7 Q+ h8 a( y; ?

         getCreationTime() :long; h' U; Z' V& ]; m

        getLastAccessedTime() :long$ t* X+ t! _3 f9 O% p

        getMaxInactiveInterval() :int1 S" b1 o. ^" e9 Q

         setMaxInactiveInterval(int)


    6 n/ q8 f& B7 Y
    • 描述会话保持状态的基本原理5 J7 t# g8 k# L  [5 e

      8 m" g% \2 C5 q
      , E2 b/ u( g/ s0 P' L0 x8 K

    $ N: U: D" {8 A# @  J% Z8 D

        client server+ C$ O; Z% c' ]0 A- P- f8 O+ ~

    4 C1 {2 e/ \% o% @3 O9 T

    request/ T, g' K, M; r; _. Q# r% f3 h

    response (sessionid): g& h; H8 w* Z  H5 i

    request (cookies)$ B8 D# E6 s$ g& ^, z% a6 R

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

    ' i5 z, c" p: A) o: f
    • 请描述session和cookie的异同之处
      8 K* O8 o. }$ }$ J7 P

      0 X2 d" r! e% H- W9 r6 j
      4 w( f& P) M, O5 o5 Q0 S" p1 [
    7 Y) I0 H, `  h
    1 W# Z4 ]1 G; N% S% U
    • 如何读写cookie,代码示例2 b, Z# ~6 m' V! y* s( d  {

      7 P  Q7 |; x* I& c* l! j5 n" K6 ^+ T+ Q7 z! U. W

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

    response.addCookie(c);

    读:Cookie[] cookies = request.getCookies();. M- `# y6 @5 j$ \  q( x- D

            for ( int i=0; i < cookies.length; i++ ) {5 X9 }+ M4 T4 o! j

                String key =cookies.getName();8 q$ S& b+ L3 |; O# K: l, N

    String value = cookies.getValue();
    & S. L# q; I  f6 g8 m

    System.out.println(“cook”+i+“:key=”+key+“,value=”+value);5 `: W, t4 l3 [  W7 U

         }


    9 U! g9 |& u, x2 }) L: g2 h
    • 什么是URL重写,如何实现,代码示例% {/ ~7 B- @! A/ N! \

      ( S- |7 s* ~# b0 C$ B) Y2 A. @- c2 K

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

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

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

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


    6 s/ Q/ q. Z" n# A' s
    6 T, j: i: K+ T+ {4 c
    • 描述web应用的4种认证技术7 f; V4 l2 p  y7 _
      % e' k! S8 o6 C( D

      * T' T& h8 ~! Y7 Z- D1 A- V1 x7 c

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

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

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

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

    / o! _3 P0 q4 o) [+ W3 k, ]
    • 什么是授权,什么是验证?. A3 ]7 _6 h) n% m, T
      ( c7 r. y' }& _5 X$ [; {
      6 ~8 Q9 w! J) U8 o) i

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

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

    ' h! q* b5 [2 }8 y; _$ R
    • 什么是HTTPS$ f: q  e2 V3 A' o3 \& V

      9 ]* @' X* Y. Q2 n: N! X5 f8 J; f8 N% ]2 |( k) i

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


    + K8 l' a* ^2 N0 U+ L: d) v
    • 什么是审计?) w; Y$ t2 r: ^( v, C, J( B- u
      - W7 }3 A* k7 r  r& O, \0 R0 R* ]

      $ [3 y+ b% e  Y4 z% m+ O+ m

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

    % _) k9 L+ S) \& K. j- C0 |8 X
    • 如何实现声明性授权
      1 i) C! k: k. R' m7 c6 N- a. \9 d

      6 b5 [7 v. W8 F( [/ j
      / p3 s6 p5 a0 A' z

    1、标识web资源集

    2、标识角色

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

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

    在 web.xml里配

    0 h. a+ q0 p- d
    • 描述servlet并发问题?
      # l* o! Z* ~6 H. M1 i
      5 H) W) n3 ?/ {, N
      % S. P* D9 C9 P) `! b% O

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

    * X8 y2 b' _- h) L- Y3 @
    • 描述Web应用中的六种属性范围
      & C+ u, V3 T8 e+ z/ _/ z6 H. z
      ! h" s$ x9 q" b$ p/ k
      4 l7 \2 A5 r) G# Q& r

    局部变量(页面范围)

    实例变量

    类变量

    请求属性(请求范围)

    会话属性(会话范围)

    上下文属性(应用范围)


    . `1 u" X# Z$ `7 g
    • 指出上述六种哪些是线程安全的
      / z0 L  V" g( \7 M; K8 |

      8 @7 d! v3 c7 L7 k
      4 g9 o/ F% q3 g4 O. A1 y2 Q( w% x

    局部变量和请求属性

    7 m" V! N! O, e/ y8 G9 f: J; K
    • 什么是STM?如何实现?* ^# p: B9 _5 o6 H

      # k% ^4 j9 y, r% U% }
      , Q. Z8 j' L- n. v

    SingleThreadModel接口

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

    9 ]0 H, v' i9 l5 l4 O- _  Z$ F
    • 如何实现并发管理?
      3 x) ^* \  s9 D3 `3 ?/ k8 J

      0 n5 Y1 a4 Y9 _3 w9 P! C# l9 m4 a/ n0 u# z' z/ i

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

    使用synchronized语法控制并发

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

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


    + q, i& ?; t# H8 ^- N: [
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    13#
    发表于 2014-12-03 12:45:45 |只看该作者
    Jsp
    % r# H+ j& I, L4 b0 \. s3 |什么是Jsp?
    / _/ W) H' ?3 P+ C+ AJava Server Page    结合java和html在服务端动态生成web页面的技术
    , O- W- m6 g' x
    9 \, ~/ o. y. e3 U  E2 n4 G - O. W5 A/ J0 o  p- i
    0 m6 a, ]( g0 A% O, n+ O
    描述Jsp页面的运行过程?4 Q2 ]- b" W7 n7 s! _  J
    第一步:9 A1 o! `6 F5 T9 u( m" r* ?: B+ @7 h9 h5 h
    9 q! [! X8 e4 V" _1 G% _% A% z
    请求进入Web容器,将JSP页面翻译成Servlet代码
    1 t4 S/ @- h# P( i& }* l5 I7 q; z# Y
    第二步:
    # O: ]" J) G5 e+ D8 e$ C' f+ o
    ) ?' X; Y! M" Z- v" e编译Servlet代码,并将编译过的类文件装入Web容器(JVM)环境
    3 Q3 f8 x4 u$ s9 Q- Q; C( m& M/ t/ z; {5 P( h' a) Y
    第三步:
    , Y8 V  p  D  Q/ z( X
    1 @5 ~' |3 |1 F# X4 N" T0 N# |Web容器为JSP页面创建一个Servlet类实例,并执行jspInit方法
    ! A6 p. {/ x& w, G5 B* u, r
    0 X7 l3 l$ Q3 _  X第四步:' a# A  C2 y6 f
    ' U, h: ^" W" B8 @% J
    Web容器为该JSP页面调用Servlet实例的_jspService方法;将结果发送给用户
    9 }/ ]( @/ N% h& T. ?: [5 s. \
    3 M2 a/ ~" m' _- ]6 ?  @1 Z + u, F5 d5 G- H* W8 k
    * h) @' u. e+ m5 [* Z5 V
    描述Jsp页面的五类脚本元素的功能、写法、并示例
    # f- T, }3 x% g6 ]/ Q6 a注释 <%– –%>+ V* k3 q, b; v' T; y- z- s

    + k. J/ s; v  w<HTML>
    - V  A5 U" M; x( ], ]! P
    . f! k9 J3 d* a<%– scripting element –%>
    3 y' b7 X; m  A+ b% S& T4 ]& e3 h6 d2 X1 N8 r1 ^4 Y
    </HTML># L5 D. {& Y) D
    $ J* {! e* G# y8 r- @1 W5 ^
    指令标记 <%@ %> 指令标记影响JSP页面的翻译阶段3 ]! p( ~# Z3 Y8 l, y

    * @# r1 u2 V" g5 U7 Z<%@ page session=”false” %>
    & F4 u6 }: Y' Q: ?
    6 D' y: D  i( [' ]+ j( N( N" c声明标记 <%! %> 声明标记允许JSP页面开发人员包含类级声明. q. q2 B9 Y+ W! k

    8 V4 [" B1 n) f  j& q; _$ n<%! public static final String DEFAULT_NAME = “World”; %>
    # V7 R3 S% w8 e. F  ~5 j: l; l7 V  D8 S- k" h) u6 M
        脚本标记 <% %> 脚本标记允许JSP页面开发人员在_jspService方法中包含任意的Java代码6 o6 K9 s  X. A4 R% t8 O
    6 i: Z* _7 x; v  a1 x
        <% int i = 0; %>. v- X% E8 s( z0 M
    1 h3 Q/ b7 n# @: X, f
    表达式标记 <%= %> 表达式标记封装Java运行时的表达式,其值被送至HTTP响应流 <B>Ten is <%= (2 * 5) %></B>
    ( M# r2 w$ q+ M* P9 A
    9 m: S! v) S3 z9 P5 W" k  r0 P
    # F5 Q- c# I% Q" C* m
    9 _! [! l! c6 N6 H描述Jsp页面中的注释种类和写法
    . q4 O9 M! o2 }HTML注释/ M% w7 t% }, S7 R- ]

    ' `9 S# k" B7 D8 ~6 `- w7 i<!– HTML注释显示在响应中 –>+ E& W2 _9 C2 A+ y" j

    * t. [8 J. y8 h& l( s% BJSP页面注释, V' C8 h$ ~! `. y1 Y* y2 O; z
    - w. S2 F& |1 s- b  _$ u
    <%– JSP注释只在JSP代码中可见,不显示在servlet代码或响应中。–%>
    0 D( p* _( I" c" G* v- O4 r- z2 V
    Java注释! j' R) ]6 e6 J" _# V! `* b) o7 A
    ! o6 P$ X; z+ o) ?5 e# ~1 t# |
    <%
    % B8 ]. b4 E, u( f
    ) b0 K; z7 a( Q+ V' w3 v/ w/* Java注释显示在servlet代码中,不显示在响应中
    / C! \7 E# ?+ U( O; |0 P
    & z8 [& x$ P( s0 h, t) j*/9 r, S3 j1 _2 b

    $ }, v  M9 K0 N( G, }3 O%>
    * \6 [0 c6 o7 b1 i0 J! H& Y
    + G6 H. h% h+ @" U- ~/ h" H
    0 ^" T0 }( [  T: [* S- K: W! N9 z  J
    描述Jsp页面的指令标记的功能、写法、并示例
    2 r9 h' C3 o  w' i2 z$ `指令标记影响JSP页面的翻译阶段
    5 P. C4 `1 f( C! |& T9 u4 u: u6 U" V! X1 x
    <%@ page session=”false” %>5 Z, e, H  {: P8 q- ^8 `
    8 F6 p- q6 ~* I& D( G
    <%@ include file=”incl/copyright.html” %>
    2 R7 }: ^/ M, c& E! v) @
    + z  |2 |3 D* }/ {  q% S<%@ taglib %>
    & y; J; R5 x; O5 Z0 [% {% y+ n6 y. ]
    8 f7 f$ n* V2 x' O& C: C
    5 n# L9 F/ `0 A& ?" [
    描述Jsp页面的声明标记的功能、写法、并示例- F+ ]3 ^  F  {2 ]
    声明标记允许JSP页面开发人员包含类级声明0 f& M2 W2 a5 }3 ?  G& l- T

    - N5 Z% T; t* @  ~% `/ m% ?4 @写法:
    % Q: l2 D* t; u& Z! X: u4 ?
    7 F1 `5 H6 i% g8 s0 I4 |6 K) ]<%! JavaClassDeclaration %>
    , R% j7 V7 Y' @- J1 B
      [& ?6 C1 u; B. S6 {& x3 t; D* ~例:8 Q3 N+ n6 L; H
    / {! T" R% j5 }  |9 l7 ~
    <%! public static final String DEFAULT_NAME = “World”; %>* e- o  {7 e: Z

    9 ?( F+ L/ U# H; I2 m% C: e2 a& M<%! public String getName(HttpServletRequest request) {: b$ J: ?$ I' p% Y' O

    5 w( L1 \, U6 N2 R5 q* F' t/ s: Qreturn request.getParameter(“name”);
    4 x9 I2 U' T4 [; e; @
      _; F% a4 K; j1 O}% R; t: B1 ]/ ~

    3 {  m/ E  t% U+ B%>+ O( Q: k* S7 y  H* n9 u- T

    $ z. i7 z6 e" T  ?* ~3 C; ^<%! int counter = 0; %>
    6 a' h! Q9 ]; B' Z5 `' E$ l4 u+ r4 i* q* [+ n- T, A
    ) f9 K( U/ J$ H

    5 t6 s2 b8 K' a' k9 l( o  Z描述Jsp页面翻译成Servlet的规则; S5 C+ j! w8 |
    jsp中的注释标记被翻译成Servlet类中的注释0 T) N. r4 R8 ?/ N
    & z' M( p! W1 ~9 `
    jsp中的指令标记被翻译成Servlet类中的import语句等, j9 N( {0 @; G" F5 K

    ( _7 L, Y2 v1 g) bjsp中的声明标记被翻译成Servlet类中的属性7 W9 p$ x+ q' _9 |$ @4 Z! b

    # J& n+ H/ s, ~% hjsp中的脚本标记被转移到Servlet类中service方法中的代码0 D4 [7 p' d) _! H$ c
    ; C# N: {' H% M' k
    jsp中的表达式标记被翻译成Serlvet类中的write()或者print()方法括号中的代码/ `( b8 C4 F6 s; x' ]

    ! U; D2 v3 n, [& H1 b  f; I 9 b7 \* G5 Y7 g& F) g8 n. T

    8 @6 w: f. L" O* K描述Jsp页面的九个预定义变量的功能、用法、并示例% A' ~; p3 S5 l
    request 与请求相关的HttpServletRequest对象
    7 r6 g, h  m( z7 Q% T
    ; K( i% r+ g# q, y( X/ h: jresponse 与送回浏览器的响应相关的HttpServletResponse对象  G7 e! `' C0 M

    - v! I. n! o& }( Qout 与响应的输出流相关的JspWriter对象2 ~; q: [/ K$ o# {9 Z

    $ B$ \- n, y8 a* D    session 与给定用户请求会话相关的HttpSession对象,该变量只在JSP页面参0 G, E4 x  G7 v! z5 Q
    5 B' \' @& Z6 M' k1 G$ g/ w  f- R# F
    与一个HTTP会话时有意义; m- ?( L, X& d2 `, s. W
    + g6 c3 z- i6 Y: K' {
        application 用于Web应用的ServletContext对象4 u" Q+ E! E/ {
    8 t" r# m  K) h9 m  H& V7 z
    config 与该JSP页面的servlet相关的ServletConfig对象
    . S$ N4 @3 {! X3 \% V8 D" V3 j0 m' a7 Q0 _# A3 @
    pageContext 该对象封装了一个JSP页面请求的环境
    + a- b4 b2 @8 W; ?
    : O" n  C1 \& T5 M/ w6 `  {2 [page 该变量与Java编程语言中的this变量等价0 C1 G; a+ f2 F

    ! K) {" h, Y3 M    exception 由其它JSP页面抛出的Throwable对象,该变量只在”JSP错误页面”中可用8 X& i% h' F$ e: d# K) k- u

    ' e3 f5 r7 s3 i! i# B0 @ ! y# \& S4 ?! B  X9 D; B
      ]2 n4 A6 j1 C& u# ]/ P, E  I# q3 Y, M
    page指令的功能,写法、并示例,并描述它的如下属性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding
    8 h+ c# ~2 P: Jimport import 定义了一组servlet类定义必须导入的类和包,值是一个由
    9 R) @6 N$ O& l3 Z' u
    : C" B' q9 @6 h! J3 g逗号分隔的完全类名或包的列表。
      u! _2 w, m. \0 I" S6 U9 T- i: N' g( K' j- A
    session session 定义JSP页面是否参与HTTP会话,值可以为true(缺省)3 _% f9 \6 m  e% P" y

    1 f" n; b. W0 {* w5 `/ |或false。# [- c) r9 M" K' O7 z- q
    9 h8 v8 B6 [7 y* N! K" g
    buffer buffer 定义用于输出流(JspWriter对象)的缓冲区大小,值可以为
    7 W6 J2 K3 D, \$ a, x+ i2 Y$ o* j2 |7 s+ @( x) F
    none或Nkb,缺省为8KB或更大。
    2 T! \3 e: b$ q4 T0 ?
    * f/ y# `' ?6 u" B1 _errorPage 用来指定由另一个jsp页面来处理所有该页面抛出的异常2 Z0 I0 s6 g1 T4 |$ n2 o: P' _
    5 z' ~, M4 V2 ]
    isErrorPage 定义JSP页面为其它JSP页面errorPage属性的目标,值为true或
    ( z% G7 g, p/ t$ H; c5 t( K$ s* z% S( L* x4 v( r, t; Q+ d( u7 i* Y1 N
    false(缺省)。. E& K, }  s% [3 f- t+ M. l7 [
    : B1 Q3 e9 i8 G: H, Z
    ContentType 定义输出流的MIME类型,缺省为text/html。
    ; W8 H- t# e6 r) B; u( Y2 ^6 u1 i. b& l0 d
    pageEncoding 定义输出流的字符编码,缺省为ISO-8859-1
    $ C; x/ [. f% ~/ y7 g0 ]! R! c0 P% F

    $ x% ^6 u# H5 u+ R+ T  u0 R$ M; [4 B4 {& N5 ]( q/ o
    描述MVC各部分的功能?MVC的优点?MVC的缺点?: k0 d. h1 }$ s' @: N
    MVC各部分的功能:
    : e# G& ]7 I; K# [
    " I* S* h' Z! t4 `Model(模型表示企业数据和业务逻辑)
    ! {: G4 w' S( f  N
    1 N# U. M: z* O4 Y# e$ J- ^封装应用状态
    + \/ ]7 l5 h3 i4 H4 f0 y& P" O) J) N3 @8 L/ S
    响应状态查询& j" i9 k2 G( b- B  J5 c
    , O9 R" Y' k- _3 D& W$ R) C
    暴露应用的功能9 W* Z0 }+ `/ O% ^3 ?" L; ?- D+ j! @$ }
      b0 _, o0 q8 ?% x! X. c
    Controller(控制器接受用户的输入并调用模型和视图去完成用户的需求)
    + b) a( w$ D3 |7 ]: H: y
    ! `, P$ w) E: o& n# `: y% P验证HTTP请求的数据
    0 ^% L  |8 j* }) p1 n- [+ h2 Q0 S3 X4 g( N$ Z( {8 o  v, Y) u" t
    将用户数据与模型的更新相映射
    ' b. |* l( t1 |% L, {3 [
    - W- I; p  S8 i, }( {& y选择用于响应的视图
    7 U* }* P" r, G, i( }* _% \5 l3 f6 u6 h/ s2 S2 s& C
    View(视图是用户看到并与之交互的界面)
    9 Y1 Y" K2 W/ I+ c7 Q  |& g) k2 B! W0 U
    产生HTML响应
    : s( m/ f4 t5 ]2 m9 v! y5 Q1 T8 z1 ?( ^+ Y% [; @) m; e2 N
    请求模型的更新7 T1 j  @3 h8 g8 v
    - O: s3 [# r) \+ S% q; R
    提供HTML form用于用户请求
    1 f- I3 R3 v: A- V# u; U. w$ ]9 I5 I' H" ]$ r; E9 {
    MVC的优点:, {2 m. @9 k9 L# f! t

    6 ^: G, }2 J2 B3 K3 u+ w& N2 [        低耦合性:视图层和业务层分离" L" l% z" A: U) Z/ w. f
    # |# A9 o7 c3 w! }
    高重用性和可适用性8 T5 X$ |5 P) s' C
    6 e; w3 o7 m6 P" A$ f# F/ g
    较低的生命周期成本; f+ K" ?) Y, o

    ) g; H7 @+ f) [6 n快速的部署
    # D5 ~% s1 D) A& z! N. j
    1 j2 M* Z# D) X2 O可维护性' x: X+ j6 f4 L" E

    $ _+ K' k& w1 \& z: v有利于软件工程化管理: c; ]2 ^5 W( S5 q" X! I6 M
    3 w( }5 L/ U/ K5 c; D4 Z; l
    提高软件的健壮性
    " @5 H6 G, v/ @- \6 g( ~  \
    1 Z# h9 j2 e6 p2 xMVC的缺点:
    2 m( v% h% I* m6 g' D$ U
    8 R( K7 M) e# y" s# |        工作量大,增加工作的复杂性,MVC不适合小型甚至中等规模的应用程序1 m, }; g- ^3 J- T- F
    0 Z, t6 v* S: w8 V% B. b" a

    9 h: y) ~- i) [! ?% j5 _' T' j( o! r2 Y4 Q" K
    什么是Model 1结构,以及结构中各部分的功能& M3 R1 |9 r+ w: d" Q- k4 ^
    结构:jsp+javabean8 e7 F- ~; g( b/ L9 e! F! V

    0 P/ t8 j1 K6 L5 HModel1中使用jsp来处理web应用中的视图控制部分
    + A& n: \" E/ @  {1 v
    $ p' Y4 U. D- O3 Q& w- JJavabean收集参数
      i, q# h0 w9 Z* k) E; T: g
    " L3 c* p- Y  e1 `6 P 4 H6 Q9 E; M4 g  O
    7 U9 Y. }; S( @- \+ e/ g
    什么是JavaBean?" ~3 X7 Z$ C. E4 I4 l( V
    用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。
    8 C  Z( c1 j7 I. \: s, W
    3 ]; q$ G1 p+ U2 z( k  F) l & w. y' ~1 f7 x( f1 r
    ) y& R/ Y: m9 G, y$ z& u% C
    JavaBean的规则?
    + ~0 _- _5 D$ q1 L$ ~使用get和set方法定义属性
    . ]: Q& V3 [( i& j
    % f$ q' Q  j- w0 x3 }3 ?* g一个无参构造方法
    # r" {% b3 e/ N: O8 ^
    , Q3 J6 X( ]+ L6 r无public实例变量( 所有属性私有化)
    1 C2 \! F8 B7 G( z. L
    " p: _4 ~# C( g2 d* \4 k2 h0 \ ! H& T1 C# P0 D* N! V* B  z3 w
    # X# Y9 W3 W3 @: G' B, }" {' p* j
    什么是jsp标准动作?包含那些?分别都是什么功能?如何使用?
    ! j5 Z- K' T/ z: jJSP页面中使用类似于XML的标记表示运行时的动作5 t% L; d, z- W; l# I( F+ ^
    + p3 A* c" \+ K6 @6 l# A4 v0 [
    jsp:useBean
    ; e% n* ~7 o7 `% J; S8 ^
    1 k9 R9 }  [; q3 c: [2 g  t, [  ijsp:setProperty4 c9 Z  x6 U* [

    ) w! h/ m% x  t# x( f  A" djsp:getProperty6 J7 C* V8 Z- ^/ g% X. ~3 s+ @9 f! _

    6 Q9 R' q8 _4 p  P; i' \% m6 I, q/ `jsp:param* ?) _0 |! J3 a, A. g( J- o0 y' W

    $ r6 i6 p7 `* ^# G7 j# z! A' l8 ijsp:include
    . @9 m. E' _, c+ Z4 F
    ; f+ z" J1 d, ?: P, }jsp:forward
    5 S4 k6 h5 h3 m9 I$ w" S% v
    + g4 O/ k8 M  z8 p  i  r
    3 n9 u+ \$ Y4 {7 m
    8 T9 Y& B9 m. K) {用代码示例如下标准动作的使用:useBean、getProperty、setProperty
    - [' A9 q5 m$ G" l<jsp:useBean
    , h) f; c' d% ], w& h1 q( l5 u0 b& B
    id=”myForms”
    " V. V( W3 G% \
    " B) y: V# d  M6 F6 y. eclass=”com.base.mystruts.forms.MyActionForm” scope=”session” />
      n; p. m7 z  @8 B" A0 }: ?+ B5 u
    7 m& N( c# j6 B  O. [; j    <jsp:setProperty name=”myForms” property=”name” />
    8 R# z; U; e: \& S
    : m: d; P$ i2 M; c4 O; ]<jsp:getProperty name=”myForms” property=”id” />
    # f) Q7 Z3 c+ [" ^9 h1 m+ D- `# A3 u9 y/ G, h6 N
    ! {1 u: s5 z, T( j* w
    0 v+ d* {+ i- y( K  |7 P
    描述说明Bean的四种scope
    1 ^3 R, P3 G" b9 bpage
    3 v4 d* I/ F7 [  Q1 t% n; y; T, j% v
    request
    * Y, G4 B* |5 t9 [8 V2 f* t- h5 ~% R4 s1 ~$ n( K. v
    session/ v0 q( U! i/ J; I* E: L5 S' o" _8 q
    8 \8 C+ a* y3 `: D5 f6 {. x- K
    application
    5 H& X. y+ A: W/ p7 d" z6 W
    & A4 ^) ~! [! A2 j $ d" a9 K" k# G4 u2 f& u
    & r! P- H3 Z3 u; O' j0 ?
    描述说明页面上的字段和Bean中属性的对应规则
    $ @  i; y$ e+ c# N' N( Rid 指javabean的变量名
    - d& ~7 q* Q, g# v& S
    ' E  _2 d2 J2 _, r" Pclass指javabean类的全路径
    " {$ j' w  F# D# m0 }- z
    6 `8 c6 O. A) Q# ^# Mscope指javabean的应用范围
    ) Y: x: e" ^9 B1 D& Z  q% x0 S* ^/ W. a, _
    name指所用到的javabean的变量名
    / c2 V7 R, j) z" f0 D6 [9 t5 H( D9 l) A4 |" Q  z/ ^
        property指javabean中的属性
    ! i' }1 \# h  B  w4 [  O9 u" z6 N9 b1 |

    3 P5 B( e) M) t( n; ~
    # r  q( d3 E: l1 s/ ]& r% T& i" e描述useBean动作的处理过程
    + }9 Q" F% e& B: n2 b使用id声明变量& \2 X! C' l: j; N: ~. ~2 t
    2 H2 I/ o4 l5 ^9 X! r1 Z/ q1 O
    试图在指定的范围内查找对象2 s4 j6 H$ S+ A! U! c2 ?+ a

    9 L$ q  m0 h$ f& }/ _如果没找到
    : z& o" G' Z. p6 e6 B2 Q3 t% V. X: W5 G- B. Y/ C0 j2 e
    创建一个类的实例
    ' y: f/ X3 @% |! S
    $ R' j0 ?9 ^: U2 T; z# R执行useBean标记体初始化对象
    ! r' q: `7 T* f: l1 p
    : P, ]5 P7 ?4 l/ l8 n# q1 b+ b如果找到
    ' @. R6 D2 {1 V* _
      \) f% W  B& P3 U  T9 o: e     将对象转换为类指定的类型
    & M' b. n" t" Y' K# C2 D8 i
    & A0 ?( H& c, b$ u9 R - ?4 t/ T2 s1 s8 G+ a/ v
    ( e' g) Y# ~# m! h' g
    描述forward动作的功能
    " K; e, b( O/ m& i使用脚本代码处理请求时,可用jsp:forward 动作产生一个不同的视图,# v1 N2 C4 ~8 h0 Q$ M
    8 \# k, g4 x/ d
    使用同一个request:
    2 K2 `+ r! Y3 K+ o6 @; Q5 X4 I: o% ]6 n9 K7 m' X; |
    1 p. A' [+ x6 r' c2 A# }
    0 W6 Q+ W1 j. K' L3 ~2 W4 Y1 d
    什么是Model 2结构,以及结构中各部分的功能
    , z3 ~6 l* s* A( f- pjsp+model+servlet
    0 E5 X$ p4 X; E2 {, S' [
    " B8 V: z. J% R+ P: w! d9 ?Model 2架构使用MVC模式,JSP页面充当视图,Servlet充当控制器, y3 [8 t5 u, g1 N  r

    * W7 k# w( k- gServlet控制器:
    2 y8 U% u' j0 `( ^; W  J; a$ G
      s4 @/ Q2 Y8 `- m: }验证HTML form数据- j/ V! \/ }/ y2 S; R5 o, i1 B7 u  ~
    , z! o4 j/ Y' \
    调用模型中的业务服务5 E' W" C' z5 b) w$ u7 f# T" @
    : C8 k' z6 W/ Q! l! X6 O
    存储请求(或会话)范围内的域对象( A, y8 d; B7 c- }5 Z3 U& ?. U) M
    1 p1 C7 Q6 g$ M
    选择下一个用户的视图/ g7 m: J! s6 T& d8 r9 m" D) \
    1 \& y3 r' h: W- [, ?
    JSP页面视图:6 t, `& j; a$ s2 F
    7 A1 c0 e% f5 ?4 b. }7 g
    使用用户界面(在HTML中), L6 j( ^+ P: M" D
    * J" O6 _  N9 E" L, R2 Y. h
            访问域对象
    6 M( ]# L4 s5 C3 @& Z" g8 z! }2 @2 o7 M
    $ D: ?( U8 b. z" }' l" s" H+ t
    + a. Y5 r' e& J. Y) z
    如何获得分发器?分发器的功能?
    7 T! K' \/ N5 M上下文对象中的分发器:0 S/ w3 U' ~( ^. m: U2 G- P
      {% i* c6 [' t+ G/ v  e/ q" q4 _/ v
    ServletContext context = this.getServletContext();8 Y" e4 Y2 e1 y0 ~  p. K/ h5 {; Q
    - R) K  g8 {3 E# U: R" Z/ {( j. k
    RequestDispatcher servlet = context.getNamedDispatcher(“MyServlet”);. u9 N( U% ]0 E4 d. B* p( ^

    8 X5 H5 L9 W5 J9 y8 ^! Dservlet.forward(request, response);, B! x; u! J6 M( l; R1 U6 f* \
    " @3 |; S/ z  U$ J! J  l& D. H
    请求对象中的分发器:
    3 J3 i& d7 i1 p) x. @
    ) O$ b' O5 }$ i9 r7 jRequestDispatcher view = request.getRequestDispatcher(“tools/nails.jsp”);0 L. l. U# H. F: R0 m; J) `% F- g

    / v1 m* ^, x9 l" x: J6 r4 @view.forward(request, response);  v* D, a2 I4 H( s$ c$ H

    8 c2 ^% Z* T. R, m) h可以将请求转发到另一个jsp页面,并保持请求的传递性
    . |% i: T3 y% ~8 d* b; ^+ Q" k5 r- K4 ]
    4 e' @+ A( i/ c9 X# u# M. E

    : S2 R+ `: F2 q) h8 i0 IJsp中页面跳转的两种方式?
    , O+ }% c" Q% x1 R使用分发器跳转页面% e: \7 Z; b" S' `7 [: m" S# M! V7 I
    RequestDispatcher dispatcher = request.getRequestDispatcher(“url”);5 ]4 I' M$ q# k7 g" c
    , u5 q+ C: W# k$ e
    dispatcher.forword(request);
    % w5 z9 T9 V& U/ m" x3 K: o* i! z; B2 }' P
        特点:保持请求的传递(上一次请求中的数据,在下一个请求中仍然可以得到);& p/ F, l7 ?+ g

    2 h/ D- G( G3 a; t# i5 b  u        转发的页面只能是同一个Web应用程序的其他Web组件8 n' R6 V/ v, T  f7 z# G0 ]- }
    8 L$ ^/ u3 _' v1 [( \; K$ Q1 h
    使用重定向跳转页面
    # e$ P! z- a+ Z" u+ Presponse.sendRedirect(“url”);
    : J, l1 a: \, [1 O, u1 V3 I* s8 _9 ~2 @: }
        特点:产生全新的请求,(上一次请求中的数据,在下一个请求中不能得到);$ p$ G: q8 I) t

    ) A3 z. E$ Z" w" H# W        重新定向的页面可以是任意的URL
    5 p/ @7 j/ f8 |% U& ]1 C) J, o9 [1 j. D
    ) ]: W0 _4 m) g5 H' M- n8 {

    + |0 _- f- @! h描述Jsp中引入另外页面的两种方法,并比较两种方法的特点?+ _, {$ j  U+ s+ L5 I2 T2 A
    <%@ include file=””%> 在编译期间把另一个页面完全嵌入这个页面,可以说是一个页面9 |, S* H/ l! u: x8 @+ `7 r
    ( i0 h8 ~6 L3 @' ~9 Z9 b( V, k( y3 l8 j
    在这里可以共享变量
    : [$ S7 V+ m: w4 p4 x- u; b5 S$ c8 R- [2 T- q
    <jsp:include page=””> 动态的再运行期间把另一个页面加入这个页面,可以说是两个- |3 |+ u% S7 z

    ! F" F% i  l1 w/ v8 Z, f页面,不可以共享变量5 F) X6 [; Y6 p; r8 }/ b3 l

    - a/ [5 b+ [9 f& ~( R- g
    2 ^# |  q" g% l4 D
    " f# L5 c  {; ^* ]什么是自定义标记
    7 G+ ?6 ?- \+ ]$ \2 _0 `! o: T4 F自定义标记库是一个Web组件,
    : J6 u# Y3 K3 q( S% Y- F% M# O
    ; g3 g) W4 Q# ~% R' g7 c- L包括:
      z% c  }2 K9 U9 w3 }- B' U4 o4 ~$ \  W3 z3 [
    一个标记库描述符文件(*.tld)" t) e/ t" E% k( S2 P" f/ s8 z
    ) n7 r, N1 D- Q3 o* j! w3 ]
    所有相关的标记处理器类(*.jar)# \* O: v* M# j! c/ k

    8 V0 w7 \* p5 ~4 E6 n. ?
    . {, m& @& S! v" M+ n, d
    ( o; }* y6 A  b* f描述使用自定义标记的步骤,以及每步详细的工作9 j; ~% q/ Q. c/ Q! m
    使用自定义标记前,要拿到.tld和.jar两类文件( O8 r3 _2 l) Z2 m1 Z. o+ I5 B; R
    * g+ e5 y& \5 \' ]8 i7 X$ r
    把.jar文件放到WEB-INF的lib里面。% \( o1 J/ `* {2 [1 E3 \
    把.tld文件放到WEB-INF根目录下。* x$ l; \( v" k3 [7 V! N6 \, {
    在web.xml中配置。
    & N8 g/ a- u& d<taglib>
    ' o0 l$ `6 T* l  p0 q( _
    1 B# i- a: C3 y<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>0 Q2 t- ?7 a: ?
    6 _7 {5 [% u4 H5 a# I8 V7 U# t( ?
         <taglib-location>/WEB-INF/c.tld</taglib-location>1 ~6 w  G) s3 Z, y

    : p3 C; b% p4 p) E: y</taglib>
    # M9 |9 {# M$ F9 U8 v: \6 N' e' U$ N2 n4 X* G( u
    在页面中引用。
    . R! X) F. h0 H0 E; U<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“s”%>
    7 I) c% h  H$ c7 s' A$ E2 q7 A) i! b. X* f+ s4 }7 `9 c
    uri必须与web.xml中的uri对应) d" A2 F; m$ i) k- Z8 p
    9 r& ~( n! E: L6 Z, _7 s
    prefix是前缀,用来区分是哪一个taglib9 Y7 e; v  f4 _
    " d; p5 v, T) O: i& A
    使用标记
    1 [5 P0 o+ U( |) x* f格式:<prefix:tag名称 属性>
    " o. X. u; Q* d. ~. o% n' Q
      }' W) Z  e6 L6 {9 v& r6 L+ P* d<s:forEach >
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    14#
    发表于 2014-12-03 12:45:59 |只看该作者
    在tomcat下配置数据源
    & V! A7 U7 s0 ?3 Q1、服务器与数据库的连接! L! b) Z: K# m4 M) ]
    % k) ^2 f2 U; ]0 o
    配置server.xml文件/ B5 K* c% _9 \
    , ^! T9 ?5 `" Q5 H
    1.oracle, Z5 B! i; A" J- [& I
    . e/ z# e4 R* y2 H9 J8 T) A
    <Resource name=”jdbc/company” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
    ' {! e7 s. |: y/ A5 C
    9 j: y& t7 _3 q                        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”" i7 I4 i0 R+ E

      e2 l( a( Y: B  g) R/ turl=”jdbcracle:thin127.0.0.1:1521rcl”- l# ^' J. Z& V# X' G
    1 Z" l4 _" F; c; c/ ]7 r* P' l
    driverClassName=”oracle.jdbc.driver.OracleDriver”
    ' B0 w/ Y6 o7 e; V3 S$ J, i( S* c7 r, N& {6 b
    username=”aa”# Q3 e0 T5 B+ r6 u

    2 i3 y" L) t0 E6 K+ Epassword=”aa”
    ! r0 B; p. M! r: l4 U2 J2 f+ n7 E) b7 s7 v: h6 H) Z
    maxActive=”50″
    3 ~1 I) P! O+ K* P2 Q1 {' j2 V) e; ]5 Z& g, [
    maxIdle=”10″
    8 z) t/ C& }  w8 S& [) {6 C& I" Z2 E+ m" H( r/ x* T: {; h3 G
    maxWait=”-1″; F& i: X: V. r

    2 |3 a% v4 q6 ^3 _) p, D/>
    ! z2 y. T/ l6 u; |1 v# V# C# r! ?0 ]
    2.sqlserver, t6 z9 N) H2 Z" c& c

    % S6 @' e  w0 p8 U, A! n6 B7 P<Resource name=”jdbc/webpage” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
    0 \) K/ L- d' `- v& k- a1 j  |6 @
    & `5 S3 Z8 q$ V. P: s% `( W: w        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”- s' X0 s, D. \0 B, u( r! u
    - C0 r' p. |9 o
    url=”jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;
    , _1 H% |0 x  g+ S: T2 W2 P; H/ M9 X4 r# [
    DatabaseName=webpagetest”
    1 A; _9 c) g3 P/ n$ ?3 h
    * X7 f' _) w0 G" X/ Q. n2 jdriverClassName=”net.sourceforge.jtds.jdbc.Driver”+ b, P1 M5 ^: g( [& ]5 r

    9 Y5 ]- N6 {% F6 @username=”aa”
    % c" i5 H5 z: @6 G- {
    - \$ l! p4 g3 o. dpassword=”aa”, e9 I: J( W( p! ^
      y/ S  s. q* P7 l4 n3 W
    maxActive=”50″' c0 a8 m2 y! m, q
    + s& o# Z# I. w/ t; g: c
    maxIdle=”10″( @! Z- L+ M$ Q

    7 V# C8 V; \: f+ ^5 a; `! MmaxWait=”-1″
    8 {; T! N$ j" g( ]' u
    ) c$ e; a9 n6 J/ d/>  a; A5 o" g  U# N

    6 a0 \' o7 l; r, O  M7 G2、配置自己的web应用的xml文件" d3 q3 ~9 T& {

    . z4 r5 @' [  T& L) B8 c+ z& _2 K* U ( D' t8 M' x* e% ?

    % Q; l- n/ G( T5 f7 ?8 I' H0 R5 T<Context path=”/eb03web” docBase=”F:/workweb/eb03web”, Z3 k, b6 ~2 G! m4 u
    # H+ q$ h# x5 F. b0 Z
    privileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>' G. }1 ?7 T9 i* e9 G
    : G0 |( b* b& N( F
    <ResourceLink global=”jdbc/company” name=”jdbc/company” type=”javax.sql.DataSource”/>
    1 C  ^0 g" \& Y! ]  ]9 N
    ( @2 E4 J0 Y) `; P- x</Context>
    4 d0 }/ ?8 m! ^8 s9 V9 E% ]1 S
    7 d2 M# i& d  k" `5 @7 H. x) x
    ' z7 {4 o5 ]; o9 c& u& S8 ]9 U8 h$ G2 B' a& ^8 I
    3、配置web.xml文件
    $ n) M. K  L8 i$ ~$ e- L$ H: g$ l  X
    7 b8 v% x$ ?/ t; x与服务器建立连接
    8 `# U, n  F) I, S6 h% N; M3 y9 D3 }4 Z: {+ e; Y0 f/ Y0 |* D& E
    <resource-ref>
    / R  R: Y# A$ R7 U6 i9 ]5 Y0 j* |/ G
    <res-ref-name>jdbc/company</res-ref-name>
    " l; v( L7 E& a0 a" w% \0 A9 r# e
    ; U2 u& ^0 S! O# i1 T: B2 _- g<res-type>javax.sql.DataSource</res-type>! J/ W8 m8 i# \# d7 r7 D

    & E9 @* j) u* N! l1 t<res-auth>Container</res-auth>
    * m' h2 O2 w; ?, F( V: l
    * N4 Y7 |2 p( j) g+ R7 b; g5 ~4 B7 T</resource-ref>; ^  c/ H  ]$ N8 G7 L$ v" _# Q

    & G/ Z% y# R" O4、在应用程序中不直接与数据库连接,通过DataSource连接池建立连接
    0 R% W- ?9 c6 Q8 }5 J8 Y2 `* D$ S* `! X' H
    //1.在程序单独用时设置系统的属性,在tomcat下可以不用配置,
    # H$ L' D" c% [8 k
    0 Y0 w* C0 K5 W; i% d% R6 B; aSystem.setProperty(Context.PROVIDER_URL,””);
    5 }' h+ Z: ?. @# J! S+ j9 b5 r7 u( Z+ k. D
    System.setProperty(Context.INITIAL_CONTEXT_FACTORY,””);
    8 U" q$ m  C" ]2 b8 b  u6 J- J* F  T, b% v* Y  w- M
    //2.创建一个上下文对象! d+ ?" V0 @3 p, O  u

    2 k3 {& g; e" C& }+ s! GInitialContext context = new InitialContext();
    " S' L/ J8 q. L+ g7 O6 t5 J" g* N4 ?
    //3.通过上下文对象在连接池中查找DataSource# @8 `- t& q$ w" B2 _

    8 m5 I) R9 c* F0 SDataSource ds = (DataSource)context.lookUp(“java:comp/env/jdbc/company”);
    6 X8 W9 }! h9 s$ A7 {+ y% d" V: \5 B( q0 d! O# d5 x
    //4.通过数据源建立连接& W/ v, T6 R+ X7 m5 A5 V

    7 A/ R2 s% G( A# [3 W' i8 Bds.getConnection();
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    15#
    发表于 2014-12-03 12:46:30 |只看该作者
    ORM对象关系型数据库映射
    3 N+ ?0 P! l! ?4 ]9 y$ |$ J9 y) |(Object Relation Mapping)1 X; e" n! O! I8 W' J" t6 e& N' @" M

      s, k' v* S$ ~* b2 ^+ a一、映射的特点
    3 @. h8 ]  N! T2 h) Q; k9 g
    $ p. f1 G, P* P1.一个对象可以对应多个表7 F3 M3 ?" }5 z* B

    + D6 |0 A2 f$ l, g0 `2.一个表可以对应多个对象
      G& G/ G2 J; i# F# E9 j0 O* y
    4 R5 J, y4 U- u3.对象和表的关系不用完全对应, c) T' u  {6 B9 ]) _! }

    % }* V% G/ x/ i! Y( Q4.对象的属性的名称和表字段的名称可以不同
      e. ]- E5 m4 ^: k
    * }7 M/ W5 j$ Y( t. o" x/ t5.类型可以不同,但数据类型之间可以转换1 Q. R% f4 Q" J9 O* R
    * I& _9 N* q; \7 m' c$ b. z! u
    6.对象中必须有主键,数据库的表对主键无所谓9 ?  T1 v$ d. ^# P+ V) k0 F

    3 ?7 I; B# D( }) u, r& x! O9 P7.数据库中有主外键关系时,对象中可以有,也可以没有
    1 u1 w" c5 R6 m" n& K
    5 n5 R7 N+ S2 P) a5 z' H- T, e/ d
    4 [% {% f# M$ U0 W
    , k& i) ?# ?. B) l, [9 W二 、有一个映射的描述文件————>xml
    ! v- a, [0 K7 R" [/ J! s+ g7 ~- Y  O
    三 、怎样实现描述文件————>一段程序
    ! u  P4 I( f) F. V% p9 t: m+ W; q
    / N4 G) F+ `, }( |对象 映射(mapping) 数据库; ^* h3 g% r5 j  p/ I1 W4 V
    : A! S- J% ~; C) j5 d0 B" V
    user7 b) E+ ~, B0 a. {3 Q/ u
    ( ]3 O- H$ P4 k7 {0 N/ g
    id=11& W6 b% K- O0 W1 X1 E6 m4 f
    8 l. Z6 v7 Z1 i" h2 D7 G; i
    name=”张三”———— > (1) —————> tbl_user(id,name,age,tel,address)
    % t+ [) h, \" X5 v( V6 W( B2 X" c9 s* @1 b% }1 Q9 O6 K
    age=25 <————(2) <————
    ( `2 f+ \* \; O6 D0 W9 E. i
    ' O$ |3 A) r' [) v4 I7 O0 }# b% ^
    ' X! ~; S/ K# y+ K0 d; ^, Y
    ( w% r9 c& k( }' e(1)从对象映射到数据库! X, c( h8 s+ i# y9 }
    6 L% q% y  \/ A; M& M: x6 R* M
    1.JDBC
    / c' B# P* `0 a: M: `! c0 T6 T. v5 J# B- _- a; k- b
    2.根据描述文件来动态拼接sql
    ) o) a: V% G7 w0 ]4 q8 s( U! m# Q( R  x4 R5 ~* [4 S1 @
    3.执行,添加到数据库中
    * R0 `* m6 i4 ^* o8 C; {2 {/ }6 ~+ i5 R2 J; o' S% x5 }% h# K1 K
    8 v0 b* k& l+ I# C' n% ^" M0 c
    + G6 K$ X; @1 s- J& H- {1 k( s
    (2)从数据库中映射到对象7 |6 c! p4 e* F

    % t; I( T: n/ K, w9 w- }1.JDBC
    ; @$ ]# e& ]- J* I/ O3 O
    5 Y, F# M9 f3 v- K2.拼接查询sql4 _! Y0 N0 l' Q* b
    , A8 G6 e+ e3 |  l
    3.ResultSet" v% ?8 @0 l3 C  D

    ) [2 G- S. [9 j. T5 E. f+ A; b; T4.Model ! X# D# p0 y  h. w
    . M: o; Q. W: Q" `. ~) I! [; H
    2 d4 q7 U9 @; m9 i4 F0 b

    7 C- {, z8 |8 O* Uhibernate5 g$ D% x+ a$ z+ P- X
    开发流程:
    * o' e6 r$ r5 U7 G9 F7 _5 V, M2 b, T
    是什么?" u& m1 W  I0 Q$ \! j, I7 s
    hibernate是一种基于orm 的轻量级的框架
    0 P$ \" {% h$ s6 N! b# O( l; m7 Y" v; V6 U! ~1 L# e

      j: t* n! {5 p* T# y" ?" u# B& l
    . f6 q' t; ~/ @% ]! i& H$ \0 Y  s4 A有什么?  Q( |7 s4 S2 O3 R
    1. session 保持连接状态(依赖事务和连接池)( c: V5 s! Q: U2 |
    4 M% n, y2 Q. G
    2. Transaction事务; z& P+ n% U" m; C! X7 c! o
    . D7 n9 e' F+ ?% T0 {4 V
    3.
    ) `' T+ ^( U2 s3 \: Q% gConnection Provider 连接池; E; d9 H2 N2 c2 v
    - W( I  c; Q2 D
    . X, e. G: }! Z# G
    ( B0 Z) C( a9 I6 B' R
    能干什么?( \2 N6 C- c9 ^/ l* s
    1.orm
    - ~. `0 Q# a$ S9 A
    , R5 \' B- ]( @: t, r: M  r2.提供操作数据库的接口,简化数据持久化的编程任务
    4 _0 f) Z3 O# \% Z* O$ u3 ~5 y
      K! k( M! u! B% r + N- Y! Z, i, h% g) b

    # f3 J- b$ @! V4 }怎么做?8 m8 C' p9 |: h! |5 Q, S9 z" b
    1.搭建hibernate的运行环境,将hibernate的包和hibernate所需要的包拷贝到lib 文件夹下' }; f- r5 J9 }' I
    ! H' n; @' I5 L+ i9 t6 \2 }  B$ ?
    2.O(vo)% E$ B9 T& [) P" o* `( Z

    : s. N1 d7 H  `* D& l3.R (关系型数据库中的表)( v9 i& z* i* ~% D( p0 u

    % H' Z& R. C/ C4.配置文件. r4 `- D- T7 g9 J2 O2 q  k( R

    # T5 _) N1 u' ], y, d( z& w4.1 cfg.xml 放在classes根目录下,默认名字为hibernate.cfg.xml
    ( `# S6 q9 A% G' Y- H0 h& N. b  N% L4 F8 ~
    a.与数据库的连接
    , C; _% P" q' M; L6 T
    / G+ |- w! s& h7 \, Y' lb.可选配置
    - |6 C2 E3 _/ Q' `8 h3 U
      y. M! }/ v( E# K) I- Hc.映射资源的注册. J! ^3 N/ E$ H5 M6 f

    ( B; F6 d8 c1 P" M4.2 hbm.xml文件 名字与类名相同 并且与类放在一起
    2 M7 D, q9 j; y+ d8 r' x( ?1 W
    ' {! T$ h0 @4 K4 T1 \a. 对象与数据库表之间的映射
    ' z" ]6 w. \# E  L) Z7 N8 p! d3 l1 H
    b. 对象的属性与数据库表的字段之间的映射
    4 I  b0 k& O* e4 h+ e) w+ A2 U& f/ l8 M! Q- _. f1 }8 D8 e. x+ f: u
    c.组件之间的映射: r$ R. B& n( `! z; ^" t, L

    . y4 k! i, k: [2 w2 L. e' nd.对象与对象之间的关系映射* C$ V( W+ H' O& E: g
      e/ p8 i. k+ p. f
    5、客户端) A" `8 F+ m  J5 F, [* p/ A7 J2 L! K" u4 Q

    7 s: z* c9 _% @- N5 D3 y1.得到SessionFactory7 ?' F. q* ~4 }# {, y9 `* r
    + S7 b% }& u5 U2 E
    2.通过SessionFactory 工厂来创建Session实例
    : E5 S) S6 p7 y% W0 \5 w' x5 B! E7 |: p
    3.打开事务
    9 m, b6 ~# z- W& ~2 \' g2 K1 c6 A% y+ e* [
    4.操作数据库
    " ?; j) k0 @9 o. \2 F+ ^- r0 o. |$ h1 d
    5.事务提交9 W" h* Y' l& t3 |: i

    5 d% o+ _3 X0 [+ q# Z3 \+ x# y' ^# V6.关闭连接
    3 E2 u; K* m4 {5 Y4 s/ v4 l4 R* A& `" @( a) A. y
    运行流程:( c1 ^+ o' N' }- O' R
    5 ?" l( f8 T0 q
    整体流程
    , g6 v9 y3 z% `1.通过configuration来读cfg.xml文件4 B+ ^5 K6 ~, V* M4 w- y# W

    1 i$ {8 p$ v: @2.得到SessionFactory 工厂(根据数据库的连接来创建sessionfactory)8 ?4 x! q/ N+ f; D7 M

    8 ?2 b* M% r% Z) g3.通过SessionFactory 工厂来创建Session实例
    1 o$ n. t6 c' u- {! L3 T: @* @
    1 O7 [$ _+ v8 G/ e! ^4.打开事务
    ( j9 J5 z9 O* {" J& K/ q- W/ g4 S
    5.通过session的api操作数据库2 a& H) |* }. \
    9 g  T, w7 h) c. d3 j
    6.事务提交: o5 D! H8 M: `$ z1 o' a: Q
    * q/ c' B6 m; {/ `, W9 S) v
    7.关闭连接
    0 ~$ y6 j! s. r/ g  R6 Z1 r" C1 |0 d

    7 p: \( p% u4 C% c. n: w) u% n! f/ N! S- e/ `
    save( H" C  C" ]4 t  m% w# Y
    1.to—>po
    ' Y+ @8 p0 H, h; o% O. V0 q  f0 f+ n( z8 _0 G
    2.根据model和cfg.xml中映射文件的注册来找到hbm.xml文件, B% C& o6 T. m4 T
    ! ~: `4 j( e) ?0 |0 U; b* u
    3.根据hbm.xml文件和model来动态的拼sql0 ~) L4 c/ K+ |- g
    + L9 @. f6 l9 d" L
    4.客户端提交或者刷新内存- Z! ]5 F) W' `/ o2 L. u9 y3 D3 s

    4 z( @. k- }: i2 Z! P4 y: Y5.执行sql,值放到数据库
    7 y2 {% I3 k7 C( ^* T/ H" H" |
    + B6 |) I7 a" T9 J
      R8 }6 a$ Q2 F
    $ P) |; O% z- s2 \8 xupdate、delete
    $ E# d+ |4 G3 L1.根据model 的id在内存hibernate的缓存中查找该对象
    + @8 L: V" b7 }/ {4 E( f; a+ W: _% l. j
    如果内存中没有就到数据库中查找来保证对象的存在
    + Y* ^$ b0 ^: D# N( l2 g  `
    3 x+ o  _$ ~+ U* c2 M2.根据model和cfg.xml文件中映射文件的注册来找到hbm.xml文件/ O1 v1 S1 X" o
    " Q7 I- d' @* A* ~2 W4 a
    3.根据model和hbm.xml 文件来动态拼sql# m' ~/ g) \0 l+ F1 j0 q; g
    7 w7 S# o' y8 X) u
    4.客户端提交或者刷新内存
    : d7 Y5 e) \# d9 i% N9 f, c  C* e9 t4 I& {
    5.执行sql
    5 }4 _# P+ ?' v, m( Y/ \; b1 O0 N! d4 C8 X% y  _. J2 [
    $ g- R. j- G0 O6 y

    - u* u, p1 d) t" Y* J2 J+ R; kQuery' ~/ \3 k0 V7 d' k- {6 w6 u# @+ o1 a
    load  e% B3 x: z- R# f- w+ q

    + ~0 T; |, f4 F, O* L, I1.根据model的类型来找到hbm.xml文件
    ) }1 f8 ^: ~% |  ]  x' Q  I2 {1 Z7 ?0 ~/ {) P% M% L1 X6 p
    2.判断id对应的对象在缓存中是否存在,如果存在,就直接使用,如果不存在就进行下一步。
    ! q( [1 p/ ], H0 _
    ) b! M% t  t: H3.用id做为查询条件来动态拼sql6 h$ ?/ U2 q0 k( m& K- d. U
    4 v6 b. U3 W' @. r7 I: f
    4.执行sql 查询(先在内存中查找,如果没有找到(会抛出例外),就去数据库中查找): O. O  l! B6 \" ]: i+ {! |; y" _$ l

    5 `# Y/ ^4 s9 A6 t! |; w0 C- a% N5.返回一个model类型的对象
    ' j: a3 W$ k; e" [4 g
    8 Q: ^2 Z3 E. r. o* Dget
    8 C6 k! b; S2 o4 J3 O4 F7 ~) [9 Z- \) ~6 T* e! ?8 P: O
        1.根据model的类型来找到hbm.xml文件
    - n9 ]3 }4 N* |% I+ V
    # V/ s2 g& `8 v$ |, Q; i$ c! j2.用id做为查询条件来动态拼sql+ _% q4 a; U5 d

    1 Z: Y0 g# a2 j3.执行sql 直接在数据库中查找,如果没有查到就会返回null
    , N# T# y& [7 B9 n) n% `
    2 |- F# z0 ]. S& f3 Wquery
    ! l6 o0 i4 X# C* P9 T
      M( r5 B( D5 I# v4 x1.分析hql语句,得到model的类型
    8 q8 I7 Q+ ?% L! E2 Z3 Q/ K
    # N: g" b. x  B2.根据moedel和cfg.xml文件中映射文件的注册找到hbm.xml文件! y, Y( n- P1 i6 l% x8 N. l7 q, y

    / i3 u1 I: c+ Q8 j& u/ [2 q$ f3.根据model和hbm.xml文件来动态拼sql
    : w# j6 g, q7 z8 o' z
      _  \6 w. }9 U: ]4.执行sql查询数据库
    ! r! a, O7 f6 Z+ J$ R2 h& P3 S, J, K' P  ]. K' H( p6 t
    5.返回一个resultset
    * s: |* C' K3 \
    ; A; \. B( f! b# p' \6.循环resultset的值,放到model中在放到集合(List)中9 m! F9 t! J4 W2 D' p1 P5 }
    2 r9 z+ F$ [+ `8 q9 {2 G

    6 @4 H8 l- {# _$ J7 w* X, `/ A
    ) t+ T+ C6 @( d  U/ F9 f! y$ O谈谈hibernate缓存机制
    * l7 M" R' V# k# z: s- U
    8 n1 J5 J6 v5 a: ~+ n* I缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了。打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去数据库中取,也省了很多事。
    " C5 q8 A+ P1 a5 H
    1 l; {& O! x, N/ N: A  X
    5 f( w: w" @5 U; n
    ; ^# b& g# U1 A7 \/ S, u: N) r* e+ bhibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。
    $ O, @) Z  T# E5 k+ W' K# i" @% h. r
    3 C: E, Y% z( C! g/ } 8 z+ U& j' A; K6 `

      R) h) ~. a6 A对一级缓存中的session事务进行数据的预存取,数据在各个session的上下文中存在(单例),当session关闭时,就是session.close( ),整个所有session范围内的数据全部清空;二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二级缓存只有一个区域 ,画个图比较容易理解。4 \. x+ T* Q3 x0 X+ s7 L; x# r- V
    2 l# R' T/ Y. ^( H9 S
    0 _, h$ z- l; {% ^

    # c( A0 J. x4 o0 _| 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|
    : A' W4 i+ r8 N0 g; M
    & W( W# u5 j- P8 W5 M0 I6 N| | | |5 J9 N! A: r4 g0 }7 r+ X' i
    , d+ P4 q# G+ \$ C/ d
    | | | |
    0 L, S4 L3 i- y: O
    7 B$ z) k8 ?$ O: v4 `—————————————————————————————————4 v: u- X" n, a* p1 ]2 U0 d$ Y% F
    $ D# ]- J& E3 L1 _: f3 G
    sessionFactroy级别的二级缓存
    ) B( d" v; p4 t) _" H2 r/ ]1 ^; ]' C' b, d  ~
    ——————————————————————————————————————-
    , T( e1 T5 `, _' l: f  L! H7 P1 t. |/ A: W
    |0 B; z0 F) A* t) B: D7 c2 {& n: I

    ) o* o2 t& a* d, n8 b# Z% y1 }|
    * e$ I3 a4 \2 F  w( F5 ~2 P; v/ K5 B: v* A  y2 W0 y
    |; s+ H7 k4 ?9 O) y! Z

    ) V' n- n# j$ f1 L0 V——————————————————————————————————————
    7 ]; W0 _# p0 s$ V( J
    & |6 k+ X- q, L4 BDB
    6 k: @; W; Z  i1 ]9 l) n; _) v. _3 A: k' d0 s% q
    —————————————————————————————————————–
    ! b. W+ V+ |, F' P: h9 ^5 L' r  z" J8 i+ G+ B3 m1 [5 Y
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    16#
    发表于 2014-12-03 12:48:12 |只看该作者
    Spring8 A- I9 w' c/ {, C1 f; j. s
    • 是什么?
      & D" g! o3 {/ {

      $ @" W9 ~8 f, x6 t, k# K" v

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


    : \( C. K4 C: x3 s& U0 O
    • 有什么?+ @. k( T! X5 R) }3 a% g: E- w
      3 C0 T6 N1 G, r1 r+ n

    ! ]% H( [3 _* g

    每个包的功能:

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

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

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

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

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

    AOP :面向切面编成

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

    % s# S7 H4 d1 s/ n) Y/ |& C5 @
    • 能干什么?
      + g+ X9 y) T( E

      ) x( D9 `; E: v7 k

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


    2 }/ x$ A$ b  t$ F$ l8 g; E
    • 怎么用?
      : x% Y# ?1 M* ^; o+ f3 Q$ e

      - X8 G& t! E: @' {& P4 V; _
      • 搭建web工程,引入spring的jar包, r6 C" t7 p" n& g0 t
      • 在web.xml中添加如下配置% s' p9 G" V% w2 E( H/ N4 o* s

        # n7 [- I& x" G- d" d
      / K* _9 f/ E0 [: {

      9 i7 K& j! {/ r& ^6 z# ^# c

                contextConfigLocation
    ) N* s; Y+ q3 t* I

                classpath*:applicationContext*.xml, Y+ u/ _( R3 [  F- d! t, I

       
    4 ?7 P2 u9 R' s/ r, S

            / _8 O( \! P: B/ s- i

                struts2
    9 s" @# L3 O8 p4 d" L. P

                # f) z2 y1 G* Q

                    org.apache.struts2.dispatcher.FilterDispatcher% j- h: O) q5 ^1 k+ x6 ]

                
    3 W7 G. h0 v9 U- m5 W; E

            
    0 b3 c3 V$ j7 N& V# U* x* x- q: O7 E

            
    . A1 }# h6 C" ?& |1 I# D

                struts2
    ( g' r1 Y. k  V9 q

                /** c' C# V2 G' I7 G5 Q; U

    $ |: t9 P: v' ^& H2 z3 R

    8 O, [7 k$ Q. D5 |/ k, L

                6 Q; p; h9 m3 T2 M( _1 n4 t

                    org.springframework.web.context.ContextLoaderListener
    % n* X0 n- q" I2 J& X' v1 ~

                ; _7 q0 N, Q! {

            

    • 部署$ |0 y% p- X6 l: G8 e. E, ?
      " D# _  b9 I2 C9 W/ K/ w5 m. D
    # [% I$ g' }* t: v3 A# o! k4 s( X! \% o

    * C8 Z* k% `+ j
    - R/ U3 l; `, T# s) j& k
    • 容器和bean" m  [' Z) q4 B

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

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

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

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


    $ E, z8 l- T5 G. |; z9 L
    • IOC控制反转. {* r& _. W) F. _
      2 x6 _, _- R, v8 v
      6 P% I3 ?) }! G9 k" a
      $ \- l1 y& n! ~1 _2 N
      从前的应用程序想要得到A的实例他会直接主动的去拿,当用了sping后,应用程序由主动的去取变成被动的等待,由spring来控制应用程序所需要的对象
        {2 x/ _; Z0 m! C
      • IOC的优点( c0 _" D7 a, H, K
      1.可以通过IOC来获得实例
      2.可以通过DI来获取注入的资源
      • 配置IOC的原则% `- f6 k% f1 L: p+ M8 e% `
        • 一定是可变的资源才采用依赖注入
        • 一定是层间的接口或者是模块之间的相互调用才采用依赖注入
          & I) w1 h9 {0 d; u
    7 e- s9 Z5 W( p' b6 {2 C8 g: M5 _8 l
    • DI依赖注入# @% s2 Z9 z0 I; X) i  K9 k5 ?" z

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

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

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

    例如:

    在配置文件中

    # M# x7 i7 u& s+ ?/ i( S

    8 q) W7 O- {! X: |9 j. O! u& R  R2 r  j

    在应用程序中

    Public DBDAO dao ;

    Public void setDao(DBDAO dao){

    This.dao = dao;

    }

    3.构造器注入

    0 r5 }9 \0 U7 f4 T/ ^; `

    4.ref 表示参照其它的bean

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

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

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

    6.lookup注入

    7.singleton

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

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

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

    8.DI的优点:

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

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


    ) ]3 e8 [! _' q" ]. q
    • Aop面向切面编程
      8 S* x- e7 |/ O6 E, k

      * w  ]4 `( U* d$ ^5 d  }

    1.AOP面向切面编程 一些较好的模式或者是示例—-范式
    1 d3 m. {9 Y& ]0 o+ ^5 y  a  h

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

    2.AOP的思想: 主动—->被动(追加功能)
    ) }1 V/ s+ j$ C! U. O6 N

    3.AOP 的概念; r$ |+ _; R  b% A) X# b9 {- E

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

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

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

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

    5.引入 :扩展的功能

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

    7.aop代理 :实现机制

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

    4.AOP的事件机制
    " \8 z7 M) z3 u: w% y& H

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

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

    3.找到切入点

    4.确定连接点

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

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

    $ P8 E! I; p5 A4 b( V* w

    $ i+ H) h1 J$ q1 l0 O1 ^" Y2 M1 N2 g$ r/ \3 b9 c. [& \

    6 J, b( G# i6 `; D7 _9 g( \
    3 g1 `4 `. K7 c: i4 V+ f8 b  U  a) C9 U$ E# k. U
    - D1 p! D1 z5 y- U' R

    5. AspectJ8 k' B: K/ @& D- v9 Y

    5.1.在xml中配置比较烦琐
    7 x4 U7 k) ^  h& s- ]! |

    所有的入口必须从一个代理(ProxyFactoryBean)开始
    7 T6 c6 ^" d5 i1 B. x  r


    4 B: J$ }9 ?$ t' e
    4 P8 d7 n4 }' N5 P. L: X

             9 R- N% S4 h( [  a  b$ Z" R5 c
    6 X0 d, ?) y3 \0 y' F. J
    ' y2 g8 L! g. m  U. u8 T- C4 {
             6 U+ i( ^$ r# A( v0 Z

            
    ; I8 t3 \/ X' {' r3 ~

            


    & V; q' i9 i+ Z$ _expression=“execution(* com.javakc.aop.MyTarget.t*())”/>
    ; C6 d# ?7 M: ]2 t" o1 S$ z6 e* q

            7 _/ G0 ?6 v/ E: K

            
    3 L+ o& V. y3 m* F% N0 S9 B

        4 J4 V. u6 N' a( S5 z. n0 H0 z


    . F3 l$ U$ l8 D2 V
    - N( f3 J! S6 N" F+ n3 w; \& i

    5.3.使用注解的方法相对简单# X5 G! m- X& z0 q2 ^

    @AspectJ的基本语法) {4 v+ Y. [( W! i6 Y3 H( Q

    1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面
    0 m, u* K+ t7 s

    直接在类上定义@Aspect
    + d3 g6 Q% P& N8 W

    2.@Pointcut声明切入点
    - d% f& o! ^7 \, M- Q7 s  w

    2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字, ?0 R% B8 A7 T  z4 h/ n; n$ W

    2.2、可以使用匿名的pointcut
    1 r8 G: U. K; c2 C( |  E/ H5 T

    2.3、执行切点的几种方法- ~6 z% _/ y# _

    2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法0 P0 \8 R4 b& \! u! H$ D

    2.3.2 within 指定到包,不能指定到类
    6 p& N* U* V/ ]- f

    within(”com.javakc.spring..*”)
    7 }& W& ^) m* j2 V; ~/ j: T" @

    2.3.3 this 指定到实现接口的所有的实现类% }! A7 n9 X. l9 U' l* {( m

    2.3.4 target 指定具体的实现类
    " M+ b3 [# y0 Z: Q& w; W! [8 O! F5 R

    5.4.advice的五种类型的示例. z6 p. x2 Y/ g" W. C$ v

        客户端必须从接口走才能得到监控,实现想要追加的功能0 k+ g) {9 Q1 t

    5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)& ^' E" I; d' i% n9 p* O% H' V& U

    追加的方法的参数名字一定要与retrning的名字相同
    & t/ W" E1 W( u! D5 P- o( Y

    在注解@AfterReturning中必须加上pointcut和returning两个参数& c8 v: i2 N7 [$ B# k8 m6 x- r3 j) u

    pointcut指所要监控的目标对象的方法* i4 @" c+ X( x( |0 h6 B. g

    得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配
    % m' R7 p1 @) o& K) `% Q) E) J9 c! U

    完成追加的功能
    , u; ?' M; K3 l$ {

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用! N) n* r  ~7 W8 \0 a5 A

    (1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)
    7 ]' O4 J% k) F9 j, W! l8 K1 q% Z0 ?

    (2).
    ! O: H) e: M: |  \3 F

         2.直接引用匿名的pointcut
    9 S8 y  e2 ~7 g" I1 O

         (1).@AfterReturning(“execution(
    7 X( A+ Y' r( i- a2 p2 p

    * com.javakc.spring.schemaaop.Api.test4())”), @4 W) H, f$ y$ M0 Z' ?( T9 M

         (2).@AfterReturning(pointcut=
    % Q( [, F' k( S# m: ]3 |

    “com.javakc.spring.schemaaop.TestPointcut.t4() &&1 p" i( X5 `; G" f: w/ o: F- k

    args(str)”, returning=”retVal”)4 L. S- }  `0 q3 g

    @AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)1 @8 J! A( O9 x# ~8 \/ [! E

    public void testAfterReturning(String str,Object retVal){
    / n0 c% @' Z" _- h

        System.out.println(“afterReturning1=>”+retVal+”=>”+str);! }  Y- m6 O/ t( c6 \4 N

        }) o0 Z' Z- P8 J; u

    5.4.2.@Aronud+ I2 j% ~" J3 S

         注解@Around环绕追加功能;
    4 `5 L- ~+ @4 s8 a* d- G- ~

         在执行目标对象的方法的前、后追加功能;
    - g; E! B& Y1 M( Z$ K! k' c

         必须有参数;第一个参数的类型必须为ProceedingJoinPoint;
    ; r' {- U5 R  M5 i9 C/ H- j$ e. r

         通过ProceedingJoinPoint的实例的proceed来调用所监控的$ c0 m8 B- v6 b, z( F8 Y

    目标对象的方法
    7 [8 k2 F8 ~& j  F* f, a0 E4 D

         1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    " P* R0 B5 Q- L7 Y2 c

         (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)! b# v* K3 C! I1 X7 G

         (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()
    + R1 u* ~% t5 |9 G0 p

    && args(str)”)- T. f# T! v% |; Z. b, N7 H

    2.直接引用匿名的pointcut# h) Y& P+ L& w6 R" t3 Q8 @

         (1).@Around(“execution(# ?" w3 c, }7 G  P0 ^

    * com.javakc.spring.schemaaop.Api.test1())”)
    ' M/ f( `0 C/ A

         (2).@Around(“execution(  [) s* S# W  f" ]8 g

    * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    3 B0 F4 a" |& f. C

    // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    - _, @2 ^0 e! j+ _/ X, N3 w3 c7 L

         @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    1 y- x9 e  Y4 u- A. Z1 D6 R6 p

    public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{( Q* k9 [: |+ b6 e& p% {; S

        System.out.println(“around1==========before1pointcut==>”+str)
    . m/ X: e) W, }+ R: q2 I+ B  r

            Object obj = prj.proceed();* |9 a+ A( m8 H" U- X& g0 L

            System.out.println(“around1==========after1pointcut==>”+str);
    ! k* Q( n0 A0 n1 A. x

        }+ D- W1 v4 ^4 D5 t

    5.4.3.@Before
    ) r) Q" M2 y$ g9 n% x6 t

    注解@Before在执行目标对象的方法前追加相应的功能( w' M4 B% R! d7 j: S

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用7 G0 j* U! O0 _; w. L8 H

    (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”). g* d* `) F% e( @# N, V5 z/ K

    (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    5 o8 o7 M+ I6 u1 J

    注意args后的名称与参数名相同
    $ B( f) w/ b9 W

    2.直接引用匿名的pointcut7 x5 R+ n! k% }9 m0 B0 T1 G9 J

    (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
    , ^7 r% `/ C6 j9 n5 w$ U

    (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”), j' D# o! j0 Z

    注意args后的名称与参数名相同
    . \4 [/ k2 Q/ P1 \7 E  \

    // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    8 H) K! j7 c8 z

    @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    9 X- y( v5 K+ C4 c6 _

    public void testBeforeParam(String str){
    ' D, W4 s' r2 p5 Z" ^+ O! t4 g

        System.out.println(“before1=param=>”+str);
    5 r: L$ Q8 Q4 M. X

    }6 d3 {# f3 [2 O0 d) z- B

    * M: W$ y% {3 W# `- s

    5.4.4.@After
    , N& g) K2 J" \8 H5 F

    注解@After在执行目标对象的方法后追加相应的功能
    ! ~6 l1 @# D- a4 L

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    ! J/ V  m9 @* d! h

         (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    1 J- Y$ M+ {" K

         2.直接引用匿名的pointcut: L* C$ v  y" s

         (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
    ! c" i5 n% }6 F5 `, i" L( z9 a- d

    @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    - Q8 s7 t5 s, N& E' F" F

        public void testAfter(){* Z! l0 \; w/ `$ i9 K

        System.out.println(“after1== >pointcut”);& t) K, `( V' A* @

        }
    # f; O% z! y5 l6 }0 q& c

    5.4.5.@AfterThorwing8 t/ e3 o2 Q3 B# P& F$ H- X


    . C7 B1 I# t. X! T' O, [+ Q; g9 k" L" n  [4 E
    • 描述一下spring中BeanFactory和ApplicationContext的差别# o* d+ u& r0 X) _" ]6 y; d* E0 F

      ' q0 a% y( ]9 Z7 U% V4 K

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


    + b5 l4 ?; D# l& w+ x5 N
    • 谈谈spring对DAO的支持* n* ]8 V8 f$ _: }+ d& j

      5 O5 n5 H: C1 n' j3 |

    Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。) B7 U+ n; }; P  V$ j$ @  w

    简化 DAO 组件的开发。
    * f- h9 x$ y8 _Spring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。$ u2 B0 S4 Y: B# |% b

    IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。
    6 E5 h3 o2 }0 p/ |

    面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。
    3 p. M6 K' I) b2 i' N7 i8 ^

    方便的事务管理: Spring的声明式事务管理力度是方法级。
    $ |2 i5 a4 l% ^" ^4 Z

    异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。: D3 `* O( I6 Q5 M+ M* T

    5 l( I& C. u% ^: L6 D0 J* c
    ' \% U# N0 Z8 z. L8 z( \$ k
    • 谈谈spring对hibernate的支持
      7 [/ D7 x* V8 }3 j
      * Q5 {, F4 C. {2 `/ G( i2 T7 d

    在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。! b/ e- f- h3 V1 j0 X' h! m. t

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

    1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:: c1 h/ C- a( B' L+ ?2 X

    ! {0 {  Q6 J& Q( a& P) U  U

            class=“org.apache.commons.dbcp.BasicDataSource”>2 K3 N, c7 f' @' j8 M& Z

            
    $ D7 _. J* b* H

                oracle.jdbc.driver.OracleDriver" l, p/ x# E) e! M5 a

            ; g. n* O* C' H/ n) k0 X

            - M) b- f: a. q

                jdbcracle:thinlocalhost:1521rcl
    * l3 ]% L* W) S& I: f" t

            
    - t6 {: `1 U9 T" S4 Y

            $ E( |2 W0 O9 H" S

                javakc2$ J( Z2 m/ F) q3 |* M! G

            5 v1 J+ V' |+ V

            " |3 I% ]/ i- @  X- Q; f

                javakc2
    ( f+ H- X# G5 G5 a" b

            ! L( B  Z9 n" h+ m

        " L$ p+ Z2 r7 P6 V  x# [- B3 h2 H5 L

    9 I4 D" p/ l9 h$ O" p; J$ n  j+ [

       

            class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>
    3 C( d  G* T5 ^& h+ T/ t

            
    # ~( Y9 z* X, ]5 c

            
    , }  b. C: u# |6 x7 F

                
    4 x2 N/ M0 a2 l, v! W& N* |

                    com/javakc/spring/h3/UserModel.hbm.xml
    * g, M! T9 T) x  v& ^

                ; U8 Y- W3 `) I# ^6 v/ d" {& z( r

            
    1 n8 H# \6 S0 n

            ' q* T& _( K- w* S9 Y' l

                
    ) v/ e( u+ m$ l/ W( R8 X

                    hibernate.dialect=org.hibernate.dialect.OracleDialect
    $ R+ D$ K( g" x* A/ A! i9 A

                
      U. E& }1 X; s, p. D

            
    8 G, o6 V& E4 z* U" r% y- h5 Z

       
    7 M. f" |; E  d( B/ o9 X) L1 ^

       
    6 y# Y* T: V( o2 R3 U

            
    ) a" G9 s4 z3 s* h

        5 w1 F# R4 Q, q9 S( |. N7 o

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

       

            class=“org.springframework.jndi.JndiObjectFactoryBean”>
    5 X3 k( b$ Z, w! V

            7 t8 k  `1 M, ?7 |5 Q3 F8 M

                java:comp/env/jdbc/myds" N, v+ |( l; c7 A

            
    ( \3 I$ D2 E# O# [0 ?" P

       

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

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

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

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

        " n. x3 @3 c, a, u

            0 R( T$ r: ^( Y) P

        % W8 q' F$ Z9 C  S


    9 [% U) C: M) a& }

       
    5 K% v3 p, c9 y$ Q

            : a) W& G% N! v# y- ?$ b8 t

                
    ' E1 o# v* z1 w% `2 [

            
    ' I+ @7 ~1 h/ J' }# Y

        * D% k4 G7 F. M! t  E$ C# e


    0 [2 j& f0 [7 C

       
    # ?  P8 k0 x& @# a/ I

            % V9 ^" l& V% W+ {

            
    7 i( h/ z2 A! D! L6 Z- A: ]7 l8 x, i

       
    ) z" w9 B0 ?2 S7 G/ T

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


    3 o2 E) |" U( r/ c+ r1 m2 ~" d
    Spring2.0之前事务的写法
    3 N  x6 J, R+ |. O& t7 q% B
    : c+ v) n9 }+ h+ ~2 P

    7 u7 ?+ w9 h5 E        class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”
    5 e7 j4 y( f/ V7 h" B! k$ p& ~

    , L7 S3 }0 R( m  z+ M        abstract=”true”>
    # S5 i: E8 ^; V, @
    4 z' s+ }5 m% c1 L# f, Y4 D

    , T7 M4 S' ~+ W& \0 z0 @2 u, d

    ; K$ C# T6 V; W1 q5 e0 B$ R                PROPAGATION_REQUIRED,readOnly
    2 r" Y6 l9 m; q' z  e) @
    ' A/ {! |7 M) |/ t3 q. \& M& r" E/ b
                    PROPAGATION_REQUIRED
    + \4 m. ^8 _$ ?7 R" p0 N# Y
    ! K2 u) H! D- _" x7 }, N
    . o( W9 v: [! H4 R- z$ x) b: Q

    $ P& {" H+ h  n! |) u4 J" D3 l7 b$ [3 i/ ^7 Z4 N
    2 _0 R3 i* f# M- q5 D
    5 B+ ~/ Y. q  F- K
    • 谈谈Spring对事务的支持
      & v* g* x( x7 @  M/ V& Q, Y
      - w+ H( V& V* k' G% ?


    9 ~; q4 T9 V4 X+ O( B+ o& T/ y1、声明式事务管理:

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

    2.做法:

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

    2.2

    2.3 注入数据源

    : H5 k$ Z4 z$ s# @( {
      P( S# p- i1 D! i

    ; ?  t' r, }2 x0 @  e( v6 \9 {( e

    / r9 m0 u$ _% T% V! p  `& w! b' B7 H! d! ^' Y8 o% A$ L4 Q! J$ z

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

    / ?9 _$ k7 v+ v2 Q

    ; G+ K& Q% X+ z8 @0 c) }% j0 S1 S* z( Q( @. }

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

    " T. e9 T. X2 Y1 f1 q( C

    5 K# q6 d0 Q" X# h9 }. Y0 r! T4 L7 H( w7 n/ {$ y8 }& G/ U+ Q) {
    " y/ k3 F& b4 y3 N5 v+ I: K
    3 L8 x3 K( m( ^6 A: P# ~

    2.6 定义切入点


    % M' }/ ]; i- J! }8 c( ^, }; C! t, R8 W+ |- Y8 a- d

    . P0 {* t8 K) a) {. K4 _* h0 Y( p6 v  }& L0 j# E. h

    ) b( r  R( o; J; c2 `

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

    1.注解@Transcational

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

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

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

    4 ^4 e( b0 G3 b5 c, _
    : s0 C) O% @' [8 R; @

    如何在Spring中使用Hibernate的事务:6 L+ Y  S' O- R& r* P" t

    & d" y+ G4 L0 w; O, M9 m


    6 v" x( V1 n2 c. i, {. n

    $ T" m- f( t, g) W! a

    如何在Spring中使用JTA的事务:
    & U: G$ V0 u) [


    ! n2 H( ^  ]# `0 ^( M/ l
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    17#
    发表于 2014-12-03 12:48:32 |只看该作者
    事务
    6 O/ v  {  c+ ]) eACID
    # y* y6 m. x; a+ M2 d4 _(1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失败
    9 i% Y' p- e8 M2 {; U9 [- `+ ]
    (2)一致性 :操作的前后满足同样的规则,保持平衡。
    8 H  m, S! M$ [
    ' }, X; ~+ p. _+ s, _(3)隔离性 :在事务运行的过程中。事务内的数据对外的可见性和可操作性(必需由数据库的支持)  H, y$ k' V" _  f$ E5 h

    0 b9 {" T* J: n7 w(4)稳定性 :保证数据在事务的操作的过程中不会遭到破坏,而且是永久性存储的# n- A1 W4 {5 X: H
    / f; ]! P) D% [4 v- p0 ?2 j$ ]

    - e! q7 a& J5 t* m$ T+ B1 E2 m, v! |- G0 Y: {6 `( S
    事务模型8 L% W+ C5 n) A$ ~4 s
    (1)经典事务模型又叫平面事务模型(JDBC) 事务不允许嵌套
    * a; H( H8 Y) L) @
    . ^* H: v# m+ i. I(2)嵌套事务模型
    9 g0 E8 ?( p: [7 g- B
    5 Z  j* x+ O5 M  N4 z  h9 ? - b9 ?4 \/ ]; S

    % {) k8 q. h5 A4 i事务的两种方式( u& o% s7 n2 X" n+ u
    (1)声明式
    8 A( F! Q0 {$ V/ A( R- O4 `, c$ }5 ]- ^! ~$ h9 ]! _
    在配置文件中设置以下6项! {% w2 f/ L% d! W: G( w2 Z

    4 l/ n& v# S! y: @! W(1).required
    3 P: v3 d. O/ h5 g5 T7 Y, x* Q
    9 P5 S; O8 C% G/ f& a$ m如果客户端没有事务 在bean中新起一个事务
    3 U' J4 ]* }0 y* K5 f4 K( G7 u3 B  _/ H* z+ W7 d: F
    如果客户端有事务bean 中就加进去
    8 J$ Q6 |% U6 [7 {! v
    & v, ~& ?/ n" L1 u(2)、 requiresNew7 J2 r( Q( l3 L" U) [+ V# D

    ' j6 G9 T2 C% {不管客户端有没有事务服务器段都新起一个事务
    - b7 L8 W! |/ i* z
    6 L: v, a! R6 I; m, N6 x( }% b如果客户端有事务就将事务挂起
    1 l8 {! F4 H6 I2 Q, {& O% |1 A, s
    2 a! B# Y' e1 w" W8 C2 W$ }0 w1 i' D3 X(3)、supports
    . E/ Y. f- {8 ?, {% h* O2 H( o
    ; u8 y  z) S% Z# q如果客户端没有事务服务端也没有事务
    ; [8 A* A2 m2 ?4 A) _; T% o: @) h; L1 j* t5 j- X! i6 P
    如果客户端有事务服务端就加一个事务
    ) n/ S5 t8 G7 I: U1 E# ~
    2 z6 F+ n' A( t(4)、mandatcry
    3 [# E: z: D. l6 s2 t, C1 E* @2 z  |7 q( I( \$ y( s8 r
    如果客户端没有事务服务端就会报错/ `, n: m% A. }( E' r/ j7 h: n
    ) S2 c/ w1 L  W  H/ c
    如果客户端有事务服务端就加事务
    3 D* d: N4 O/ E3 q4 C' M! C6 X; C1 U2 z  _% A8 v! P
    (5)、notSupported' x! \& q1 Z# _8 A
    / ]& D. N1 r4 K. y1 x# @
    不管客户端有没有事务服务端都没有事务2 }* \0 Z" W+ _/ ^

    5 [1 w8 N" g' }+ [2 l" c' B6 q如果客户端有事务服务端就挂起% {  [4 z$ ^" {. e- k

    / M5 ^7 E6 B6 ]& Y5 Q3 A/ ~(6)、never# o. @9 e+ L  V6 }7 S  @; F
    * j* a6 T/ I( b
    不管客户端有没有事务服务端都没有事务: u1 \+ V7 E) E" U

    ) l8 ]& V. d% T4 B* u& K. _如果客户端有事务就报错) |& b# J- z+ `+ P, e* \
    6 f: W4 d" E6 Z
    (2)编程式事务
    : L( n  T& L0 ?
    " Y8 p( o6 f% r' U& N' iJavax.transaction.UserTranscation
    3 l0 ~3 q$ h5 @8 I1 }) x$ }/ {0 _+ d# ~+ D$ J. J- L+ u: U, K
    JTA 事务可以精确到事务的开始和结束
    + q5 d6 o7 [# V7 d- N* q: \3 }$ @' Z* g* T) @6 F' c
    ' b6 s0 j- q) y9 p: x! t5 V  m
    5 K( Y% u1 `: C2 B) M; X
    事务的隔离性) b$ X- Y( j7 E5 Q5 x
    Read-uncommited2 b/ a& S7 }+ F/ ~8 w5 i

    ' B. r+ X1 b, g& O' f: A读取未提交的数据(基本上没有锁)脏读,存在不当读取的问题。8 o5 G5 W5 r: o) s9 x- b& \

    & Y/ e# u6 M' P# }. Q# S  H# B9 XRead-commited
    * C2 E+ X& a8 M  ~' a3 R( t
    + E) L1 h+ [  |# y* u读取已提交的数据(行级锁)
    : h9 }/ ?1 I( Y0 N& u; D* j8 `$ n4 g, f+ A; L
    无法读取已经写入,但没有被提交的数据。
    * N+ H* J' R0 o& g9 K' @* ?' l6 N4 K3 r- M, U2 D' A/ w9 Q
    Repeatable_read" ~3 o* n& k2 \0 z' H: ~
      F$ Q! x( {3 I$ n! S1 A. d
    读取的数据不允许修改或删除. i* V$ {. i; g) _' i# n
    ; j# L- L! V- ^+ M
    不可重复读(行级锁+不允许修改/删除)
    ) t6 j, K" _" _; d2 I1 P5 h: x1 {  q$ C( h  E
    Serializable
    3 X& S8 ?9 P$ n2 [. c4 V1 s  s9 `  o' \# `2 z" B" v$ G- u0 Y% s
    幻影读(表级锁)
    ) m+ A4 E, l+ P* n# {( l  l8 I) H: m/ ~$ q" S! u4 X) D

    5 K( c9 o4 u& L, O; d6 j& x5 @0 n: ~1 z0 Y. q
    struts
    4 m- E% B& l% W* S6 u; u1 G开发流程3 e$ X( a6 ~8 V

    3 a; v" i( [7 C, W1、创建表单$ R8 N  {  I/ K1 w  u0 r5 n

    " Z% V/ y. ?0 E" E( X, [4 u4 Z2、从表单中获得输入
    2 O4 s' F/ s& R. w7 X! f# |
    ; u/ H' E1 c* H: X- X3、处理输入(业务逻辑)* D- y; I; P+ y; W5 j
    - Q- `# I# k; y9 W" y. ~
    4、根据动态输入改变输入流( v/ |" V9 m8 T6 B* }* L

    # }) z) l5 R% ?5 z- ?1 ]; |$ R- A要完成上述四步,我们需要创建
    $ M+ P9 t% I) R6 F; a6 |% Q* E: B
    , [+ R( u+ E. p; X) [% f0 x$ [1、一个ActionForm/ n5 m, V/ `+ C' e

    ; h6 w3 b* L9 ]' j' ?: u2、一个action
    8 c5 a- m2 P# A
    ) Y# d. g$ P1 ^) m4 M3、一个配置文件struts-config.xml
    & x" j/ ^0 A. B# F3 ?0 C# C
    1 g7 ~9 ~' E/ Y- w9 a, E4、创建页面
    " c' T1 }9 o+ ]6 O% c. u
    5 i3 G7 ~6 Q8 c; P; I8 p4 ^7 W创建ActionForm% N% V3 b) z* |; q  ?( i# c1 m

    % l5 e8 m! c2 t: g; I# |8 s, o1、写一个类继承ActionForm
    . F5 s+ Y6 \6 z7 f. j
    % P- o# X! x8 {6 M# B2、私有的属性
    0 f! {- t+ g+ o0 p+ C6 Y* y
    ( V5 Y( f) l) \3、相应的get、set方法/ z$ T7 {0 _1 w3 r
    $ Z& d5 H0 ]( v: S) [7 R
    4、重写tostring、equals、hashcode三个方法9 ?7 J4 F/ M6 Z) n6 C# W
    8 L/ H! x' `( G5 M* }
    创建action
    . k7 h$ Z8 M9 y5 K7 }  o+ Y1 n8 C6 b* L, \% f/ T8 z( \- W
    1、写一个类继承Action. M0 l8 e- {) R5 U

    5 H1 S2 q) {) x0 T; J+ c2、实现一个公有的方法(回调方法)
    % {1 |( y' T$ Z+ o: Y. M6 p% Z2 _) r2 a# ?' _+ l
    public ActionForward execute(ActionMapping mapping,
    . j. I6 g. ^- t/ G3 z" e7 w; M7 _5 e; g  w* d
    ActionForm form,$ E1 x" X% u  F: w8 J4 T1 t

    6 S7 u) T5 b% t5 ]HttpServletRequest request,
    ; ?" f' `: ]- d, _! j- F3 x( A3 r8 }0 c# f5 s7 ]! ~( T
    HttpServletResponse response)
    ; y$ X) }, L* j3 _/ ~% R" S0 r, z* @! B0 Y6 c
    {
    & P8 T# k7 z7 `  p$ r& U
    8 w6 g, K( M- \1 M% ~. P//1.收集参数; d; ^% L9 `1 ?
    $ I& x$ y5 ?, r2 \( x7 I
    MyActionForm myForm = (MyActionForm)form;
    % \1 N/ j. u7 o% \' I9 a, q7 v. D7 d' ~1 }
    //2.组织参数9 p( H; e$ \* g! g+ N. w

    ) V4 M; X8 f, S, T  Q; P% u& }3 p 4 Z. \: A" ^! e% H, ?1 r9 T
    ! n( j& j( F4 F+ W3 N& H$ a
    //3.调用逻辑层  Y4 R3 _5 I& e  U0 }" m# `$ G
    $ |9 H* C6 l8 c
    boolean flag = true;
    . C5 x) z+ K1 p& {7 I, X9 X9 C" P
    //4.根据返回值来跳转到相应的页面$ G% R8 |/ f4 `, e& e& m
    ' o  J. V( }; i; ~4 o  ^
    ActionForward af = new ActionForward();, l! c; U+ s  M; S% \
    ' R3 Z9 H& q/ _3 ~
    if(flag){8 ~& ]) ?+ R* H+ @2 N- Q; F

    1 L7 a/ J8 Q! Qaf = mapping.findForward(“1″);$ e+ ^6 o& n; n! k1 P; o" J
    5 Q' f* ~+ H" Z2 c# @0 t/ d
    }else{- p: d8 A4 @- _. s

    % Q! a( N* W) G5 iaf = mapping.findForward(“2″);8 R1 `! Z8 A& l  x+ Y# `

    $ l$ f7 _* A; _4 s7 C7 ?+ v! Q}
    3 H" x- T, |8 Q7 O
    7 ^1 G$ E' q, f$ x( G2 ^% ]5 v6 wreturn af;
    / @& b8 s! }8 o! |0 u1 f' h7 s- E+ ]) o" F, D/ b) J
    }
    6 K' {5 E' E4 t% J# t' Z( C
    6 |8 ~7 V7 t. G! f9 p1 E- G  c配置struts-config.xml文件$ C5 d3 ]( w' l, `

    # z$ C. `5 q5 N/ h& J, }, X1.<form-beans>
    ; I, \# H1 k% {: }  u: _5 B# W! b2 C8 b7 g% x" s( O
    <form-bean name=”myActionForm” type=”全路径.MyActionForm”/>! e& {( Y. P# ?3 B; f

    7 J' v0 r9 g5 `, b  O<form-bean />
    3 s/ t6 [; i7 y; ]& u
    + O5 L( R: f0 ]</form-beans>
    ) Y6 i. c0 B3 H6 }5 L% @2 ?  |6 M4 r7 V, i; m
    2.<action-mappings>( a6 _& |" {7 ?3 G4 q2 s% C
    ! o/ H! X1 {2 i% }6 g; {5 Y3 |
    <action path=”/sll”
    ( L+ S( l$ c9 s! A
    ! g+ b3 |! ~$ p8 |1 @8 L8 E, u* Wname=”myActionForm”
    + {  v+ ~3 ]* S1 C1 I
    ! T6 S$ J9 v' E. A$ dtype=”全路径.MyAction”- V* s8 ^; R. S

    + e/ A1 q& p0 Z/ C2 kscope=”session”- G7 |0 |  D2 i' L; p6 ]5 z
    9 {, G0 E% {6 L; \% q" W( s$ ]
    input=”错误返回的页面”>3 e. Q9 o) F7 R2 H$ N6 `

    - \) j, w, g& t( N<forward name=”1″ path=”/1.jsp”>
    / K* |6 v' y3 @) s+ P: {# |6 n
    <forward name=”2″ path=”/2.jsp”>* B9 J; w. A3 B' R
    ; b& ^; M% X/ A- z# V/ Q
    </action>) Z" J, o7 {! \( Z0 q% `

    0 }; ]) ^0 N2 c6 x</action-mappings>
    5 S# o: N" c3 n: s$ M
    9 k) y( ^8 ^% a* u7 v: ~3 Y% C1 Y步骤:
    5 _3 x' a, Q* i" F$ d+ E2 C6 l: `' j
    7 t9 e3 y& {% h2 ^1 e. }1.创建一个空的web应用
    " l0 E7 U0 K7 \. h- @! c, U: ?$ c8 t( ~: Y1 e* Y8 A
    2.将struts的包放到lib文件夹下( u7 F6 {8 \% \. a# t& Z9 A
    4 {/ _5 U* l% t0 E% h& p
    3.将.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目录下& o9 p" C: L2 g9 N! d
    - b8 D; k0 x* w$ i" ~5 a! S2 A
    4.配置struts-config.xml文件和web.xml文件
    + q9 p3 L# e7 ~) Q0 [/ g" w0 U4 ?, ~* N1 p. i! [* v5 g2 a4 s
    5.在页面引入tag文件uri* A0 M  Q  k7 G# l/ ~+ T; w" Q- }
    ; j8 N- i  p. B+ a6 q) n
    STRUTS运行机制# y7 W9 q+ d, E1 @' j8 S5 N
    $ b, ~/ S* d6 J
    1、界面点击产生请求
    5 x2 z) v2 h% Y$ s6 t8 U- T6 p% w8 \& Q- B
    2、容器接到请求* D5 Y9 |, d6 m# U

    ' g2 o# B8 A/ `+ B/ _, E3、匹配web.xml文件中的*.do来调用ActionServlet
    7 S8 ?* V' i0 W( e9 n5 V5 H) x+ n0 a& R8 `' t; W( }1 l$ F5 l5 W+ y
    4、ActionServlet的处理& K  T! ]( Z! E' k4 p
    2 z9 ?4 ~% b- R! D! z+ [0 `: Q/ A
    4.1 读struts-congfig.xml文件形成ActionMapping
    ( p9 b7 @/ q. H: D' X2 A6 x. W/ e6 c1 z! `
    4.2 通过path 来匹配Action类,通过Action的name属性来匹配ActionForm类
    " X5 t* s& G: r% A
    , }  k: e( F. a' A" c* }; ~# y4.3 通过反射机制来给Form添数据
    , V; m' U: K7 X, B! p, x: L+ w' H, v. ^8 j: P6 j- n9 \
    4.4 由ActionServlet转调Action的execute方法
    ( i# `( p3 T0 {, x5 G$ |: Y$ L# e- G7 O% c7 }
    4.5 得到execute方法的返回值,跳转页面
    3 W! g& P) N6 l( e, Y1 q) q% R/ o8 a# d; k! ~
    4.5.1 RequestDispatcher
    : ~0 Y, h: _5 |- o6 p9 l8 D; V: u0 c; _  m& w
    4.5.2 response.sendRedirect(“list.jsp”);
    7 e* r8 j6 h- Z1 m
    ( }" H, k' K6 D% j4 T0 H0 u ) G: I2 }  l5 u3 X. p+ U. w8 L

    + V0 b$ L( z3 u' g4 p5 t  e3 [进入execute方法
    ' @7 Z3 `  k) U$ k- H* `; D. @# N' p7 [3 c3 H& i. s; e6 O+ x
    1 收集参数
    ; \$ }! c) ]4 @* {+ f6 V1 x, v& _- s5 d5 G3 \
    2 组织参数
    2 p% Z6 d, e2 b" t3 G% [2 p" c- `) E2 V4 w, D
    3 调用,逻辑层
    ) E7 o* G3 q$ F, u4 a& ~% D4 K5 H# _3 H
    4 返回值
    ( h9 O( }) j4 ]/ [
    9 v; \7 |1 n# T# d1 \( V4.1 选择下一个页面 (ActionForward)% p* |1 H: P# D% V! F
    : }' X; N3 A7 `
    4.2 把值传给下一个页面
    2 e" T) {- X4 Z5 @) j5 V. w3 m; [3 T
    + K! _4 {+ ?" {- X
    + n. e- n- t/ E3 g3 a# Y: G. a7 Y7 o7 w! I: ?# q; O4 s% E
    比较struts和struts2的不同
    0 X7 I2 x1 |: X' Q; d: y% F. U3 o1 n$ r2 w7 ]0 v/ d
    Struts
    3 K8 w, w4 n- B& \- U0 S8 a
    9 H+ H8 w5 l" D, YStruts2
    + Y/ ^# s% u7 K, B3 w2 c  v1 u* Y
    组成        五个部分:ActionServlet,ActionMapping,AtcionForward,ActionForm,Action        十个部分:AcionContext,FilterDispatcher,ActionMapper,ActionProxy,Configuration Manager,Action Invocation,Interceptot,Action,Result,Taglib5 \$ V  s1 ^0 @9 k& C. q' r: ?4 l
    url        .do        .action
    4 i8 v- K/ R. E2 |4 u分发控制        AtcionServlet        FilterDispatcher2 ~7 e3 ]: z6 b* i9 w
    收集参数        利用JavaBean技术,将数据封装到ActionForm的子类中;+ `  V4 c) O$ G" f* w5 E  I1 F
    一个Action对应一个ActionForm的子类
    ) R3 X1 k7 \, u% @, N9 a
    0 ]# n, G- K0 [$ d使用拦截器将数据封装到值栈中。& J4 D6 S* `4 C7 X8 U0 R+ S
    使用域模型,一个Action对应多个值栈中的Model4 d/ Q. ?! i+ p' E9 q2 O6 n, s
    3 u4 j5 c" I) N0 {
    读取配置文件        ActionMapping        Configuration Manager
    # X3 x2 J+ h! z/ @拦截器        无拦截器        执行Action前后有拦截器5 }5 s, y: g: O" W, {) z
    返回页面        将字符串封装到AtcionForward,进行跳转页面        Action中直接返回字符串,通过Result跳转页面: B3 ^% B' m) n9 `5 K* d+ d9 }) Z2 w
    页面跳转方式        两种:dispatch,redirect        三种:dispatch,redirect,chain
      {- r1 x8 |% `% D值栈        无值栈,Action通过在request范围内设置属性,向jsp页面传递数据        有值栈,Action和jsp页面通过值栈传递数据,jsp页面通过OGNL取得值栈中的数据: D+ s( d( o6 I- j6 ^3 [9 m. r! X  G
    配置文件        struts-config.xml        struts.xml
    $ Z# c  f/ R0 t! A' u% r中文问题        不能解决(需要使用filter)        可以解决中文问题:
      M: L8 U2 a+ }: b3 v1、在jsp页面添加Meta;5 w0 U8 _# u/ j  O
    & j' a- G: D6 f, P
    2、修改struts.properties中的设置。
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    18#
    发表于 2014-12-03 12:49:03 |只看该作者
    其他开发工具和技术& D; p( h( P! F1 ?1 f: p! a0 y& G
    Ant: ]9 |! q& }+ J! p0 w
    Ant是基于java的批处理工具
    1 T+ d5 j& R' a6 F
    # u6 [  h& B. F7 m  r一、配置ant的运行环境
    - ^, t9 U! k+ z7 W$ S+ v
    & F5 t; q/ d0 f! _3 T+ C" d1.将ant的bin目录添加到path中
    % V5 I+ e2 i( E* k
    ; n: L$ W* b% F2.配置JAVA_HOME- B  o0 w$ x  D  D, M, X( Y% L
    3 i6 z7 t0 K& i; E' u, n; y
    3.配置ANT_HOME
    # u. e( C/ ~& C. z4 R
    ( B9 a) E* D  H3 |- _. [二、配制build.xml文件,该文件放在应用程序的根目录下1 `( C0 y3 P2 h, h! {, c
    ( v( w# [: ?6 J1 U0 a# E# ]
    编译java文件! S, f: v6 p# R0 e* ^1 C
    0 G" |' x8 m3 x  g" K/ O
    执行java文件6 D- n! D' g4 c7 P8 Z
    0 R/ B( K! E7 w, [1 U
    copy
    ) i" N3 }& x7 h2 |
    4 w$ S3 z& U' j" H" g$ ~删除: S9 l* p% P  `( n7 @6 w

    / U5 l9 v& G6 e& R- \# L打jar包. T7 w; f/ ^) k4 s3 F( d" t3 ~

    2 A1 d' I  S+ v4 [$ P/ R根据注解生成配置文件
    ; k' @) c( s( L( a# ^4 q: V* ~; s, X/ |$ Q2 Y
    Xdoclet* l; b4 l& x, Z+ r! d* z$ }) S
    通过注释生成一系列文件的工具(txt、xml、java、html等)
    1 k' R0 o7 n* _4 ?  ]; O. I. {( `; R+ f& n* }" o
    xdoclet本质是摸板技术+字符串的替换
    / h  ~( a/ M- H& T& d; w) @7 Z4 \0 K
    1.在java文件中写符合要求的注释(将hbm.xml文件的内容搬到java文件中去写)
    . S. P2 R/ j4 v, a$ d2 F. ~& l, O+ ^
    1.1 在类的上面 写与表的对应
    ; |3 Z- Z5 t5 l; d& ]" a5 u* Q  I+ N5 _( ?. P$ W6 A, a" h4 r
    1.2 将每一个属性的注释都写到get方法的上面6 I% D9 G9 C) K( F+ B6 T" p1 l

    # l2 }+ c% x4 I; a( y1 ~2.在ant中引入相应的task来驱动xdoclet5 ^/ ?2 @% h5 E, ~
    ( g6 `4 b2 X$ z/ u: B0 j

    ; M; r9 i. r0 y; s; R% `3 ~7 j/ e) b2 a8 x# Y8 P
    log4j日志管理5 b: r. G$ k( k2 Y0 P9 u, Q
    1、是什么?
    , U/ _# `, V2 V1 i+ c* \9 r2 v, I  o8 v
    在开发期间用来测试、对整个日志信息进行管理的工具
    7 I2 j  x' _' I' u6 D% j& G  V5 O& a
    2、功能: \8 l/ J. {+ @7 \1 _
    8 W$ d4 t& V7 r- p6 X1 c* j- F' z
    1.控制输出的目的地# A. J" ]: M7 }) K

    ! X% C, J% t4 N) S2. 控制输出的格式
    $ W" D- t4 R" U- \# }( r5 p1 v
    - |+ y1 _' s' e/ x/ ~; y. F3. 控制输出的级别
    * H+ z2 m# j: c5 i& g0 |* R! w+ K# B2 ~- k, p
    3、日志的级别
    9 d" C) g6 X  N( E/ k9 [
    * O' [8 O0 w, _% E- q' I( }, S1. debug 调试
    ( R) ~( R$ O6 L$ B' W/ ?& i4 \" J+ }6 L3 x5 t1 N
    2. info 给用户的提示信息
    # C% x; l5 C" k/ p3 d+ o
    # A" m0 t0 d8 m. }2 N3. warn 给用户的警告信息
    % [, m  h& |/ S* `* H6 n- S8 u$ v6 l* k
    + p6 s' Z+ Z2 j; C! y4.error 给程序员用来调试  O3 J4 ]& X6 a# N" x- Q1 P
    4 x# y; K% @8 O- N
    Debug—-〉info—-〉warn——–〉error
    0 Q/ H+ D+ s2 t% r. M6 S( L8 ?# C- _  I% @9 x+ z
    4、配置  K$ p; a6 A  {
    , F; D5 Z& Q4 ?
    1.配置级别
    % O5 h+ X5 F) W. [) ?( {; |" c; p* F) o, ^9 i. ?5 n
    2.输入源 (控制台和文件)
    ( c7 H! A8 u6 b( I( A) a- O. J7 q
    8 v* l. D3 j9 \1 v% A5 O3.可以进行分包控制# m4 P* e, ^" R' b
    ' B5 {$ W* Z+ w6 b# Z
    Log4f.logger.包结构 = 级别8 s* W3 f4 I7 c8 k/ q
    ) Z6 m8 S) ]( s' T
    5、使用7 |- F9 f# V4 k4 T3 ?
    8 C6 f; }4 K4 J) h8 N0 q9 R! J
    Logger log=Logger.getLogger(Test.class);
    , q9 e% d, e+ O
    7 f7 X8 t$ p$ d    public
    % m+ |* c8 R' T% Yvoid t3(){
    " V( L- b- E9 m! o+ x
    - ~) E& y# B. Z, N5 y        log.debug(“this is debug”);- Y6 Z  {9 U& q9 C2 L4 K0 z

    4 H9 [' i% h! e) M$ I        log.info(“this is info”);
    4 _' v1 X  h- {: m% k4 P0 J
    5 B: d5 S6 Q: [2 @1 P( _        log.warn(“this is warn “);$ E6 M0 D/ U* f. s1 U/ m
    ' N( C; @2 i- ]8 m
            log.error(“this is error”);: m! Y4 ]& h) v- o

    6 P! _, y  y# i- d    }
    7 C. a. }' i9 R
    - F$ U5 o/ |- s9 W2 q6 ]) aJunit& X9 V/ x9 |, l) x0 J% V& Y
    1.是什么?
    5 p% V7 y- h8 t8 F4 X& |. P( y8 O. U# |# U. w/ I' W
    单元测试的框架& z' b$ P& t( F, S  a5 h3 m
    1 N# s; R4 Q; L* I
    2.怎么做?9 j" `- [  P1 W' F: Q- N+ F
    1 j" V& Z4 i2 q; U' i
    写一个类继承TestCase5 p  v$ A, ?, m; a; z+ F

    + }9 R1 q0 y- V1 J测试的方法一般都以test开头并且没有参数/ P$ }& Q0 {* t/ A: e: B$ I

    " G) y  F4 [+ l$ }4 r8 {& f在测试方法前执行的方法public void setUp( )2 D( Y! i5 V+ }( [: c4 w7 T

    2 G& B. b- t6 P, B7 |5 m8 t+ J在测试方法后执行的方法public void tearDown( )# M" a% f' \* I$ X% ^3 f  p7 l

    * z" L* T( }. `" K! gerror和故障的区别
    7 ]7 _5 m  T4 H& Y
    " p7 V2 C$ c) Xerror :代码有问题1 ?8 J, p1 w! ~
    + U! M  f' ^' K
    故障 :逻辑有问题与祈望的值不相符合# w6 r3 j* z! v

    ! L2 b0 M3 n6 P6 {生命周期0 f+ j0 g- r" b

    ! R* X4 S) q: h( ]- Z  O$ o5 C; Y测试—〉SetUp()—〉testXX()—〉tearDown()—〉结束;
    $ v" u- u7 t4 _. _" R3 Z& P! j# j6 I6 S! h- g
    TestCase套件
    1 H7 O0 r( |' s/ h$ b
    6 A; L: u! o$ T# Wpublic class MyTest{9 R3 E" N. C0 `. j, K* J, x

    4 v5 L: _4 K: u& {* K; O( z        Public static Test suite(){
    - N8 l5 ?0 F' r3 p4 ~2 ^% x
    ( {  m. |* ]4 o, t7 qTestSuite suite = new TestSuite();
    + r/ s% X. r8 t. j& R) @/ g, G; {
    ! F3 Z1 a& F- S+ J% y) l8 }/ g9 dsuite.addTestCase(Test1.class);# m/ S- h* G6 w7 v5 h" `3 [
    " F, V' _) G: I
    suite.addTestCase(Test2.class);* @  Q: v- ?( i! R% v9 |

    0 S' i. H7 [! l' U}5 b8 k" U  X+ H' H$ c1 C

    1 n4 R. U; T4 x0 C; O; M}; I$ k9 r$ O( q' ~0 j0 N% p, C

    ) h0 y# p, Q) X5 y; O4 r1 W, ^$ Y + {3 Y$ n- E" q. P* T9 p/ u

    ! N: i" W  P. T0 m" JAjax
    9 [. |3 Y1 |$ T是什么?
    . D3 a; w$ F6 a! vAJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。是一种创建交互式网页应用的网页开发技术。. ]6 c% K, P! g9 |6 g

    , o2 T) w3 L( J' q) y3 y无刷新页面。6 j7 Y5 C4 V; H' r

    9 C& G& U, ]' n3 r# G$ F; R- Q8 P. s& C$ Y有什么?" R9 I* l, ]" a
    AJAX是多种技术的综合,包括JavaScript、XHTML和CSS、DOM、XML 和 XSLT、XMLHttpRequest。
      T' Z+ {. v& D: K4 o7 O5 f2 y4 Y9 W$ b1 m/ v
    能干什么?* G& V$ \9 ~/ H+ r
    使用XHTML+CSS标准化呈现;0 U3 _. W' Y! b, N4 f- f5 Z
    使用DOM进行动态显示及交互;0 ?) V7 V- ?9 `5 k' @
    使用 XML 和 XSLT 进行数据交换及相关操作;+ P- G" a5 y: p7 o
    使用 XMLHttpRequest 进行异步数据查询、检索;
    5 W' N1 C. G2 F使用JavaScript绑定和处理有所得数据;8 c3 \! l. n' J

    ! V9 o( m5 V* u) U6 x& \传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。
    + O7 X/ i5 u4 ]
    $ L/ O8 k! [) o7 ~1 Y* ?3 S与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。2 t1 [; ~0 D$ Y: s$ o6 V) A( ]
    8 }" F: r5 u$ K! w" C) V. c2 X
    使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。5 D/ v5 K  p& Y6 T. J/ e( j" ]
    ( R, e" _& E* ]+ u' f
    对应用Ajax最主要的批评就是:
    1 e' j! L4 k1 q3 `! r1 它破坏了浏览器后退按钮的正常行为,就是用户点击后退按钮后不能看到之前的数据;2 s# ~. r! z* `  }0 x% k
    2 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;
    ) h: b$ P$ S2 i3 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;* c" T# A- [+ `9 N. \
    4 Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;
    ( F$ x, D  u3 ^- {9 d
    7 D( j1 o- r1 ~' ~8 a( r) k4 _怎么做?
    / G- T. v; p" T<script language=”javascript”>
    7 v$ {" S/ j9 z6 w) S3 Q# ~6 J* Q
    , Q" z) _8 |3 M5 s, Nvar req;% w+ {+ a7 B- N1 V5 v% R

    9 K2 S; \- r+ C/ ]7 l( x5 jfunction add(){
    7 J3 d$ A' G* E
    5 @+ b  I7 D3 u/ K//1:创建用于传输的对象- ]1 _% }% S1 C* w3 T7 V0 P# g2 H
    6 ^$ M" f7 b( E; m
    req=new ActiveXObject(“Microsoft.XMLHTTP”);( r; V* V& Q5 m3 h, y- w# d( d: _
    ) N  t% a  \$ Z! [- g
    // 声明返回后,处理数据的方法9 L: r5 |3 `2 n
    1 B5 w. Y2 |! o' Q  h% Q
    req.onreadystatechange=manage;
    , W9 a3 _' _9 @4 `0 O7 ^- s. m( W5 Z6 x* w5 V& m4 D9 o. c( o5 `! U
    //2:准备传输的内容
    3 R' n  J- C- t! q  `* d
    : X8 Y! Y; a, q- L9 ^var str=”test1111″;
    * Z" Y% ]* m' u2 S* e, B" x4 ^+ A  [$ {# N$ i) ^& W) _8 Z
    //3:发出请求
    3 K! e. B8 h" k3 f& h: Z9 D
    2 e% o& s$ m. T# k! s5 f" ?req.open(“GET” ,”/others/ajax/test/t2.jsp?str=”+str);
    * M$ k1 D& d5 V/ t& N
    6 d  m3 G: Y# D( H8 b7 p( {req.send(null);) k7 s6 d  y, G& L+ r" M

    ! D9 H. [+ B  w' c3 P. k}9 e  Q2 k2 n( ?! v
    & x/ c7 @6 g* j% n  |- T0 I
    //4:接受返回并处理
    ' e) c% ^5 `8 r' z4 }# B  w* E
    - k% y# r+ A( I; [1 u- ~function manage(){
    ( x6 u# ^! p' f1 }0 y  {+ B$ {' \1 F. |* J" y# [! I
    if(req.readyState==4){
    & K5 z/ f+ O3 n) |2 S2 J. [0 y
    alert(“r==”+req.responseText);, C/ |$ A9 x5 O  ^4 o7 \3 k
    9 _% l  M7 r% S. C& G& a1 N
    }
    , \) ?9 R$ J& `% e# ^$ w# L: o7 D3 J9 h
    }
    3 P* M* Q$ R* |! |! S- d
    - o; `, `5 f6 ^</script>1 Z0 w; D& k3 h% M! E( _

    5 j* t7 _. v* A! }7 _: OreadyState的取值如下:4 `/ F9 I  M) M0 o4 q; b9 O/ ]/ E
    " I5 Q( W+ L9 l9 F0 t( @
      0 (未初始化)# E0 p  K, m) c' R
    / u9 ]8 X8 V% n3 `* z
      1 (正在装载)
    : I- w+ t  B7 P/ n
    " b9 |0 n' d- v1 q- p  |  2 (装载完毕); S& _: ]8 ^) b0 E, i( L6 H* W

    ) l5 z7 V  ~2 m+ G7 Z' T% Q  3 (交互中)% ~: |1 ^" \, q  `$ ~

    2 A- D0 a3 j7 o1 u) I- R' ]  4 (完成): }  `( X7 o0 ^
    7 n9 Q; u8 ]# B8 K
    $ Q, o; t0 S' L3 m

    ! v( F% _( f6 J2 y原理& M+ S! |# y. z
    Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,可以是xml格式,也可以是一个字符串,然后用javascript来操作DOM而更新页面。
    ' O7 i% X" n+ N* X: [
    + Q! E3 A* R5 j5 _Dwr
    + I5 s- i0 s8 }; j) q" ^) n是什么?
    - a, D, n% Q4 l: c3 tDWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的页面。它可以允许在页面中使用运行在WEB服务器上的JAVA函数,被调用的JAVA函数就像是在页面中JavaScript方法一样。2 q2 _* }; Z% U; V# N9 r- J$ R( K

    0 x6 C: x: ^) o& a( w9 g, Q9 w有什么?
    / w  S" T! v$ C0 D& W它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据;另外一方面提供了一个JavaScript库可以帮助web开发人员轻松地利用获取的数据来动态改变网页的内容。: t; p8 H4 a0 p! A# t

      }" u% l# C' g, m1 G
    / n. v9 `4 e  _
    % N) V' n+ V( U能干什么?
    6 J6 s( T$ w2 y2 R动态地把java类生成为JavaScript,感觉调用就像发生在浏览器端,实际上代码调用发生在服务器端,Dwr负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制。
    - A$ g2 M: V7 U5 J+ `3 ^+ i8 h- F$ w; E

    $ X' h1 ?: y$ b: s% R
    6 e' ~; b/ V% S: x- a' z怎么做?
    7 j0 i$ B$ G5 y* y① 编写配置文件
    * }4 F# C7 U, h5 g+ C" @; s% k" e$ @! l' p; n$ d2 q& ~
    web.xml" m$ }$ }% _$ S1 \2 B& \3 I

    " n- x! m; U2 |7 g, d* T3 M6 E<servlet>+ Y6 V; F4 R) x; }

    7 x; C) a: L: V4 l. E/ b<servlet-name>dwr-invoker</servlet-name>  u' B* I- K% X! p5 N( N
    5 h) k0 `: a0 P& y& S
    <servlet-class>! S/ Y" D$ R5 _
    2 ?! [' t$ ^# N* {. n% Z2 y
    org.directwebremoting.servlet.DwrServlet- }  |& t1 ^. J  }

    . y! T/ @, _/ V# f) S% Y5 ~5 G' K</servlet-class>0 l& }  w5 R+ A" S
    ; l$ O; W1 a1 A2 X4 `, R
    <init-param>7 o$ S; e; k. X  F
    5 Q$ q6 X: V: V0 r! ]# z+ X
    <param-name>debug</param-name>4 H7 R) y+ m' |! H1 x9 Q9 z* [
    ) P; D' w* S( r7 w" Z5 S1 n$ ]
    <param-value>true</param-value># L# C: z/ u' L/ o, z& _, l$ k: Y

    9 P# i! h1 g0 ]4 \* S</init-param>
    ' }+ w' E* h) B  w3 A3 n. \! V  X8 a5 I: I7 ~' }
    </servlet>
    % l  s6 ?& g6 q4 x. l
    & b. z+ s; M  `3 o. l/ S<servlet-mapping>/ r+ u; `! I) `$ U

    % D  m- [! |+ P: K) a% |<servlet-name>dwr-invoker</servlet-name>
    7 \  ^. v- @/ _2 O( q% D$ v( J: m8 r- n3 h. g
    <url-pattern>/dwr/*</url-pattern>0 J: Z- x9 y7 R
    $ h& _, i1 ^9 G- F6 T# D
    </servlet-mapping>9 y! k3 G" p! o0 ]5 S

    9 ]0 d( M5 z$ Z2 ndwr.xml
    " f9 L' N0 s) e6 R/ s) h9 v
    ' b2 s# s  L, u<allow>5 F7 T& t% @, E' G! ^/ T& {7 Z

    & R. ~( V0 K3 `4 t; i) l/ o* X<create creator=”new” javascript=”kc2″>8 w* d& V$ A3 ], @0 _

    . M. w( i, [0 u# {$ H" `9 _<param name=”class” value=”dwr.Service” />
    & k$ A: D8 i" J# o0 \
    2 v3 G* ]8 n; h- x: B</create>
    5 u7 x* W9 v8 Z. e$ J7 j
    / H9 Q1 _# j1 x4 \+ _. D</allow>& a6 {6 @9 x' G. H5 f. i
    # h% V3 L( Z9 c+ L+ x+ D* [
    ②编写service
    & _* M: a7 W. `) |$ Y
    - C5 w5 O+ Q; k( r) u) ]- ipublic class Service {
    & n' A6 b. I" C" V! n2 k5 T5 G* ^9 }# g9 k6 J1 x* M; Z- O' j9 M
    public String sayHello(String yourName) {3 B3 @& d4 _  s8 _

    2 ^! @/ J6 w+ w% e//可以是访问数据库的复杂代码
    . x" \/ g: o6 L* u/ C% c" D8 d; l6 ^2 b8 v2 ~+ T/ X
    return “Hello World ” + yourName;
    3 |! `2 J1 r+ V6 q
    & L. z7 B5 v( e7 L% w( A: N) D}, \' u) s( d$ @  D+ B1 H9 V) e% U& q
    5 M: V. {  P; ]# Y( V
    }
    / D. P1 X0 Z  D- K4 R  T
    - c9 \2 X* f  e9 I  i( P* P/ }③测试DWR
    , M; C2 i9 _/ N. ]/ r
    6 b5 r5 a+ }4 e) y, z将代码放入应用服务器(比如Tomcat),启动。
    : K0 C+ a- \2 c7 h% y  `8 m  J6 H: I
    然后在地址栏输入http://localhost:8080/你的工程/dwr  b. `4 V: a2 @
    . H' w6 j0 H- \! a3 R$ t, k/ ^. W
    ④编写jsp页面+ f1 B' Q+ y8 P* N0 i! V6 l9 y4 w1 p

    - G. c) p3 j) R2 j1) 要引用3个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js
    $ A" M2 T5 F. D( G3 [: o7 N) M( L- A, A; q" |2 L! G
    2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样
    : i9 O0 j3 {9 F; B& T: X! U! i# w0 S, n# f& J: z
    3) js里的service.sayHello和java类的那个有一点区别,多了一个参数,用来得到返回的数据
    回复

    使用道具 举报

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

       

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