我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > 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: {7 I, a8 f& B7 Y2 t* _3 g
    简述JEE
    * l4 u7 I# N' Z9 d) BJEE : JAVA  PLATFORM  ENTERPRISE  EDITION0 i! k* F/ Z* A9 I! v) D
    : @' D7 V' ~% J4 [# C7 p( A+ F
    JEE是一个规范集;
    & h) E* r* W! s+ R3 q+ P. K7 P" O- {( `  I3 @0 ^7 Z
    JEE是一个框架集;
    . c: [; l# |6 Z! ^+ w) X  }4 m" Q$ e0 _8 U$ Z( @. e
    JEE是一个技术集或API集;! v. S) G# b+ g# \! j* v5 x. Y% O
    5 a2 |/ N5 v' }, }
    适用于创建服务器端的大型的软件服务系统
    3 u% `% G5 p& x4 c, p$ c
    + x6 J1 p1 s" G: a 4 |* [7 L" B4 n
    : a# L3 t( I* P
    C/S B/S 模式
    0 \# X" t: z" W* B' Y: F) @C/S client/server即客户机/服务器模式,客户端也参与程序的运行与计算(富客户端、胖客户端)
    . F+ O: I& F4 h( B4 J7 w; z& r+ k% b# j5 R' B$ L
    B/S border/server即浏览器/服务器模式,又称为瘦客户端,客户端不参与程序的运行与计算) W5 D5 M2 _) Z" J8 @) C4 f1 U
    4 O' ]6 L$ H, B& C' A# h0 W
    , @& F7 L- M# [6 p) n

    4 r. M8 \5 J3 p$ ^# M$ y企业级应用(大规模的应用)的特点% o5 _) I; N- x6 T. M6 {% i* {; z
    1.生命周期长、稳定、可靠' H) L4 ?1 J* ]4 {$ M6 Y1 _! w3 Q
    # W* y5 w# {0 ?2 g% V2 }
    2.组件往往分布在异构的环境中,能够跨平台7 s4 \8 Y( f* q2 `$ |

    8 \9 J& `* V: F8 h3.维护性、扩展性、重用性
    ' X9 z1 ?4 T& k3 [# V! ^+ K* h
    9 P* L7 u4 O- p7 q  O# H6 }4.有事务、安全、线程
    ) N2 C0 v: i1 ^6 N9 ?& G3 \% ~% H
    ; @, o* x& r, L# z$ Q # p0 [6 l3 t" U/ C' T2 [

    ! v5 ^8 D$ J, C/ }什么是业务逻辑?
    . H/ E" }1 |) M+ O" g9 y/ ]( o1 L依照业务逻辑划分模块,5 ?) J$ c# T4 I% F2 v9 o. V

      o! M& W' F, H  h, H所谓判定业务 就是具有以下特征:. ~( s& D+ K2 \) e- ]' E
    " Z" D3 p  l% D7 b
    1.业务流程! [4 U+ R7 E0 E# k; y; ~% d5 G

    4 _+ E& X2 o/ d7 e9 _2.业务判断
    4 A( {7 ^8 m& U+ M8 m, |
    $ X( h, R. f6 s2 e7 ^0 ^3.功能组合9 A1 a* u$ f- O! X- h3 C0 a" ?! y

    * R3 C. G9 L/ d. `/ ~0 e( r
    ( S9 |; U: b9 J) \/ W9 ?. D9 W; ~; I- _
    平台(角色)的划分
    0 w  Q) v5 b  T6 P) w3 d1.平台供应商。提供满足API集实现的厂商(BEA weblogic IBM webshphere)3 c# j5 N! H5 X3 U

    % A# E9 c. u; Z2.组件供应商6 e: e2 {; t* Y# c7 S$ b
    - I% g/ B% y8 }
    3.组件装配人员
    7 X# S' v$ b$ X& U" i
    2 w% I5 ^: I2 X% ~' |; H' i4.部署人员. M- \8 |* v1 F6 h& _

    7 S& m5 {9 o) I" f/ Z5 R) R- [! }5.系统管理人员
    - C, d' O: N! k) o
    & p: b+ x# R$ j# q) V5 X6.工具供应商 提供开发组件所使用的工具(Jbuilder、eclipse)
    . z: ^) E! q  T. @" [( y3 ^8 e
    5 K8 s8 O) Z( G! Y# ], n$ B
    ) x* Z0 m. V! F9 _1 h" J
    2 ?. K4 I! L+ W! V# s3 x5 Kjava技术分布(设计架构 模块内部设计): t$ D4 w* V+ L! e! e3 ]
    1.表现层 Servlet、 Jsp、 JavaBean、 Taglib2 k1 {" N) m, |" M2 B. K6 t

    * \$ F7 n2 R$ r+ z4 V8 s2.逻辑层 EJB(SessionBean)
    / y# s' Z$ p$ @1 ^% k' D2 |2 g- j/ }; T5 X
    3.数据层 ( JDBC  EJB(EntityBean))# T' \. U: s8 v+ S$ c* |) J

    $ r, `! s: v6 v3 g4.服务 JTA(JAVA事务架构) JTS(JAVA事务服务) JAAS(JAVA授权与验证服务)! F" I$ ]0 D+ |7 ~* q* t

    . _# a8 n- \9 j4 s( V, Y7 ]4 F( h5.分布式通讯 RMI(IIOP)+JNDI 、JAXP(JAVA 的 XML 架构)
    ( E8 r: Z, z2 d. m* @7 r4 l* t' N  C- V- {
    JAVAMAIL(邮件服务)、JMS(消息服务)、IDLC、JCA(JAVA连接器框架 (成)): }, D, S* r# g" z$ Y" }: x0 d
    0 q: A0 V! z  M9 E" H) A
    " V5 E& g% a; g( M' a; @1 @! m
    ) h4 {9 e& H2 p7 y7 Z
    JEE的体系结构: 是一种组件的体系结构" I7 ?) t$ V) x# Q5 v8 O
    1.组件 : 能够完成一定功能的封状体(独立的功能的集合)3 Y7 z6 q/ g" R# ^) }; w
    # t8 S- O9 E' U# S6 ^( U
    不能单独运行,必须运行在容器上
    $ p2 ~. Q- B" B$ i/ k. {& i; D" x2 G  |' B! g
    分为两类:web组件、ejb组件
    # M7 z$ b) I1 ~+ b8 `: s9 o+ r
      z. g% q9 g( g0 D  T2.容器 : 提供组件的运行环境,并对组件进行管理(一段程序)
    : q1 b- M$ e! P  F/ l0 S' F, j# s' e2 C! V; L6 D% q% x8 @( _
    管理组件的生命周期
    ! V1 }( n8 j1 |, [1 [5 n6 ~7 c3 ^5 L3 m
    不能单独运行,必须运行在服务器上
    : B. F1 r- L+ J: R9 n2 A, ?7 a' ~
    程序(组件)通过上下文来调用容器(context)6 r0 M4 A$ j  `, C+ B# q; E

    # n$ Z3 y0 X) K# S' P; }. G; j) K组件通过web.xml向容器描述自己,使容器能够认识组件
    6 ^+ X: x1 p! W; P
    2 o. ^/ z2 ~( ~; J" U容器通过回调方法来调用组件* Z* ^$ V3 {" G4 m/ {  Q2 q! `8 c

    ( d" i: ?6 t2 p2 I分为两类:web容器、ejb容器
    ( \1 H% ^  V: X9 p! G: R# f2 u+ i8 Z5 e9 u' t
    3.服务器 : 提供容器的运行环境,提供大量的JEE基础服务
    7 s* @& \; @6 |+ V
    ' K7 a: o' f* J' r$ V5 fweb服务器(只提供web服务)7 a- C2 I0 y" P, g
    # W8 V; n9 |& t( g
    jee服务器(提供web、jee服务)0 D$ q# X& \% i
    9 d1 G' |# G0 j* u8 z' J) H
    6 N4 I* W) I5 n/ S/ d

    9 s. Y, D+ V5 v3 D, x什么是回调方法( S+ g1 S; _" x6 H
    由容器自动调用的方法,就叫回调方法。
    ) f9 B; `8 e$ b; g0 Z# V# Z2 F( t3 b" }0 I. v' l# I, U

    8 y: _# H* v, Y( x: T1 w& @% e' y' Y" k: W/ p, W, s) U* q1 a
    RMI远程方法的调用机制
    1 _" G9 R9 Q, i" S例如:A主机有B()方法,C主机有D()方法,A 想调用C主机的D方法
    + o! Z3 C& d" j( |/ I$ e/ z2 X
    & t# I; i9 j# r: _! Z1 h$ c. A- s' Z$ O% C9 X' G
    ( H1 |7 ?, m# S9 t

      }8 i0 ?6 D; X
    6 P8 m5 o# o7 s- t" `学习方法
    5 b4 Y2 ~- X7 v- z1.规范(熟记) 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) ^; y9 |) L$ F( F; |4 i2 p2 h) \" ^
    •     描述war包、jar包、ear包的结构' ^+ C' p0 ]) y' p) |# G+ V

      # S  D' [, H% |3 l- q8 |/ d! L2 T4 H: V+ C3 I

    war-                            web文档压缩包

    —WEB-INF

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

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

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

    . K* V' [- c- p* B$ e% m) s8 ?

    jar-                             java文件压缩包

    —META-INF

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


    $ |; B! K" D' F! K( r3 o$ h9 ~

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

    –META-INF

    —Application.xml 配置文件

    –*.war

    –*.jar

    2 S9 ]0 J' D/ g3 l4 ^4 l! T+ p
    • 什么是servlet?servlet主要做什么?5 V9 \. ~* @8 ~
      9 H; P2 {. d" ?. \2 T2 H% b, E' W
      ' [2 G: D" f& c; u# @. n4 ~

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

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


    # x8 D" f. I+ q! M* e8 ^) n
    • servlet 与cgi相比的优点?servlet的缺点
      ) }8 D# b3 K. Q) M

      7 i( Y. h) y# A4 _
      & K4 y, [8 ]" m+ }

    优点:

    性能(线程比进程更快)

    可伸缩

    Java强健且面向对象

    Java平台独立

    缺点:

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


    8 ^7 n  `: W! H3 R  P. A' q" Y' c0 X
    • 常用的servlet包的名称是?* t3 a4 B" N) j

      2 u# O5 N: t6 O( w1 D9 G4 S1 r# z  r8 B8 O

    javax.servlet

    javax.servlet.http


    ) S: l, J" C# z
    • 描述servlet接口的层次结构?
      $ \3 k/ `) h& b" [7 ~# `
      8 y. O* Q/ t2 C2 S% o9 ]
      6 z5 e( d1 a% c! G4 M" e1 b  O

    Servlet

    –GenericServlet

    –HttpServlet

    –自己的servlet

    ServletRequest

    –HttpServletRequest

    ServletResponse

    –HttpServletResponse

    % Z- D3 b8 x  I5 `. j
    • 对比get方法和post方法?- J! V" ?& g; ]
      7 g" G" }$ J% h8 |

      $ E, V8 n6 }( I, }6 w

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

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

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

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


    4 E9 Q( }+ Q4 k8 T! ?
    • 归类描述HttpServletRequest接口都完成那些功能
      $ t: h9 d; u( p' R% e1 m) @7 I- a

      3 u: h9 _2 p: j0 o0 H5 Z- @0 {. f7 j; N" Z
      • 读取HTTP头标
        ) S5 k: Z5 u- K+ j& y6 P) n7 v: R8 ]6 G
      • 读取cookie. q. i# y4 l. k# D1 |
      • 读取路径信息
        ' C& i* j! I0 K5 a2 [0 n2 l
      • 标识HTTP会话。, w! |( h1 q  w' G
        # V) T; W1 Q# N. ^  j. M. u
    0 s  x  g+ D7 H6 H+ I
    • 归类描述HttpServletResponse接口都完成那些功能8 _! @8 Q) g5 l/ ~1 `2 i3 \7 Q7 t

      " w: A' n* }2 u7 r1 x* j6 M( l" p  N
      • 设置HTTP头标/ \, w4 t( j8 p# M
      • 设置cookie7 D# z& K! S4 H3 `
      • 设定响应的content类型
        6 R3 x; j1 ~% ^' g+ A$ G) @* m' D
      • 输出返回数据
        # N" l2 `% O, `- O2 p2 n5 q. p& ]: {+ C, y2 ?( Z
    . y, }3 a% `( A. U
    • 描述service方法所完成的基本功能?默认是在那里实现的?
      ; V/ P* H6 _6 y8 q) a

      ) K' X, v: [( N8 |6 n
      ' P/ w! }" n, ]9 p% M2 Q) V  q. L

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

    实现:默认在HttpServlet类中实现


    8 c& M) p: U, I5 @, T
    • 如何开发自己的Servlet?描述应该做的步骤和每步需要完成的工作
      * a/ h& i5 r# G: Z4 q# ^* h( t
        @3 D3 q8 K# o' P" c" J( y
      9 N" _# Y* l5 \% g. D: m$ L

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

    & @6 F1 d! [. q. |5 t
    • 为何servlet需要部署描述?
      . v) D+ K7 m  k* Q- x( _

      $ {/ C( F/ _- g+ Y& P) C* k# V/ q# G
      2 h  A: Q% J. ?) H

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


    2 X- h# }2 u, `7 a0 _
    • Servlet基本的描述应该是?请写出来
      ) ^8 v: V$ n9 V8 |9 N

      2 V8 A( S  p( Y' G- ^  p$ |1 D+ T# a
    & a8 }- r/ U) ^/ f

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

    1 b4 a+ f* |5 T- M: ~
    • 如何在html中使用servlet
      : l6 ]' ]2 i5 l0 Q0 I! r2 j
      7 H  u% M8 N8 \4 D0 ~
        k; o7 T2 k- {1 F0 a. j2 s4 [

    FORM标记

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

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

    语法:

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

    {HTML form tags and other HTML content}

    </FORM>


    : \+ Y6 a- ]% [( [% S, W: ~
    • 如何接受request中的参数2 M9 {7 b$ v  \

      9 W% m5 G1 B. d* t- ]1 q+ m+ yString userName = request.getParameter(“userName”)方法
      ; Q! m* @2 i+ ~, `+ C6 ^+ q. `  A2 i) y
    6 M5 c) ^& Q% Y- d0 O
    • 如何接受request中header的值
      2 [7 m& y+ Z2 m2 \

      ' Q* c- Z6 P; m+ Q* f7 \- t2 P  D7 J9 ^; s; N; \

    request.getHeader(name);

    request.getIntHeader(name);

    request.getDateHeader(name);

    request.getHeaderNames();

    " k) M$ V5 U9 W, }) f
    • 如何输出html' C3 ~) L2 H7 S$ E8 s

      # v7 h8 Z: k9 X5 o/ t1 G) x; R: C) h# A) l; i

    PrintWriter pw = response.getWriter();

    pw.write(“<html>”);

    pw.write(“Hello”);

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

    & M( A2 R& c# k% f/ H
    • 如何设置输出的contentType+ c9 [0 M5 ]5 ?$ C( J  `4 o+ o  y

      - h% T& H( D0 M: a) `
      " V; H) r$ i: z2 {

    response.setContentType(“text/html”)

      B4 t. W2 Z4 ^7 |& S3 A  h9 |
    • 描述servlet的生命周期?
      , x- L* ~  o2 ]* i

      - ]. m% R5 b2 P; [
        x9 v; K3 O" g3 r1 H

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

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

    7 L) ^4 g2 W+ j- ]3 L3 o& |/ m
    • 描述init,service,destroy方法的功能和特点
      8 x, }* A4 D9 e- Q( ]* b6 ~
      9 ?% y) [; A7 U; g
      ; I; i; D7 T. j. @& y0 q

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

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

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

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

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

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

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


    6 ^6 ]8 C! E* Z  {
    • 什么是回调方法?有什么特点?
      * t' Z) R  z/ a
      & G; g. D4 e( j
      6 \, w/ w9 X  h2 [9 z4 j7 L

    由容器来调用程序的方法

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


    4 F  c* s" m+ k9 ^0 t0 V) Q; U1 U
    • 如何设置初始化servlet的参数?6 t$ B& d, |3 j9 Y
      # p+ _4 a, P" j2 y! P. I( s; z
      在<servlet>中添加如下配置
      7 b* c6 o' b# ?" f5 s8 Q% u& k& O. x- W8 F- A

    <init-param>

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

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

    </init-param>


    * K+ N0 z/ `& x" p+ E
    • 如何获取servlet初始化的参数2 h  @* C! `1 P/ E2 Y! A
      & k* G3 q$ `( D6 ?: ?* M! a
      0 ]/ ]- {" o; u0 T& }% z; ]6 y- R

    public void init() {

    greetingText = getInitParameter(“greetingText”);

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

    }

    - Q6 D6 b* q, W
    • ServletConfig接口默认实在那里实现的
      & x0 Y  U4 G# p1 t' T
      & f3 y) R) k8 F8 d5 Z' N' L# }, l* h
      ) F1 O, u2 T* n- F1 k. G$ v

    GenericServlet类实现ServletConfig接口

    ; w8 q  r& E# m5 _
    • 什么是ServletContext?有什么作用?& Y: V# b9 v% t0 v8 S

      % ~3 s2 C& x( n
      5 N: m8 f" O# S/ \8 a7 V

    Servlet上下文

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


      L# e) ~' G4 F- v
    • 如何访问ServletContext接口?是在那里实现的?
      ; d: ~& S$ v/ p! V
      1 a  C9 h6 @; v8 v. l" ]( U
      - w+ b" C$ G6 {  g) `, g" ^( A

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

    GenericServlet类实现了ServletContext接口。

    # }3 i* @& P$ c! e
    • ServletContext接口的功能包括?分别用代码示例; }; h3 v7 p1 j+ W) C

      . x3 M& c2 y2 }  D% o0 u3 D
      ' }+ p& c8 r0 E2 ^& w, r

    只读初始化参数:     getInitParameter(name:String) : String

    getInitParameterNames() : Enumeration

    读写访问应用级属性:getAttribute(name:String) : Object

    setAttribute(name:String, value:Object)

    getAttributeNames() : Enumeration

    只读访问文件资源:    getResource(path) : URL

    getResourceAsStream(path) : InputStream

    写web应用日志文件:log(message:String)

    log(message:String, Throwable:excp)


    5 K& `2 ~5 M; z2 o. c9 W7 C0 @( g
    • 如何设置ServletContext的参数?
      ( O' `0 g. x. M

      : u& Q( i' z8 O: |
      / K, p# H. C8 q6 p5 n

    <context-param>

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

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

    </context-param>

    . x" @+ d& A: U
    • 如何获取ServletContext设置的参数值?" r& [4 K* w# O: @4 `. ^  V& H8 ^
        Z9 G) c7 G2 z; d! v4 w% G$ x, N

      # I3 M/ F: L- N% J

    ServletContext context = this.getServletContext();

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

    ( h; l( l9 k) w0 {. y8 p" `
    • 描述Web应用的生命周期?
        a5 ~7 C8 L& W) W) F
      ; i1 M/ H( [1 s! a/ x

      5 T! Y/ A  f  X

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

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

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

    0 @: m4 z* D3 K2 m$ S! ~
    • 如何用代码实现监控Web应用的生命周期?& z5 \- _* l2 Y& f
      / m2 W3 d$ Y, m- X
      ( y$ R3 \2 [* ~( ~/ X# Z

      $ T! c& c/ P. O

    public class Test implements ServletContextListener{

    public void contextDestroyed(ServletContextEvent arg0) {

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

    }

    public void contextInitialized(ServletContextEvent arg0) {

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

    }

    }

    3 x, V4 G# @" M4 x* F, @1 X, v

    web.xml文件中的配置:

    <listener>

    <listener-class>

    com.csy.Test

    </listener-class>

    </listener>

    $ m$ ]; Z" C- n- c1 c
    • web应用中如下错误码示什么意思:400,401,404,500
      8 u5 r$ e9 P* |/ i, O
      3 ~  \) L( f1 ~" U* D4 ^
      400 Bad Request//错误请求
      401 Unauthorized//未被认可
      404 Not Found//没有创建
      500 Internal Server Error//服务器内部错误
      & j' P( y5 k" m3 Z2 p: h1 M
    ; q! W4 i  _( A/ R$ }: v
    • 描述Web应用中用声明方式来进行错误处理的两种方法
      8 N5 j4 X; I! k

      5 a- n: q" S' z5 ]/ e( b* P4 G" b$ Q$ @8 v* L" U

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

    <error-page>

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

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

    </error-page>

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

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

    <error-page>

    <exception-type>

    java.lang.ArithmeticException

    </exception-type>

    <location>/error/ExceptionPage</location>

    </error-page>

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

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

    6 y5 }0 z2 j! R& ]7 S5 T
    • 描述记录异常日志的方法,都位于那些接口?0 f# S! N& E& f/ O' V
        Y$ i- F) S% F7 \" c) M+ u

      / `& {/ g5 M% |! c

    GenericServlet:

    log(message:String)

    log(message:String, Throwable:excp)

    ServletContext:

    log(message:String)

            log(message:String, excp:Throwable)


    & Z# ?1 t) m- x* C
    • 什么是会话?- v5 z9 l# N9 e, V0 ~8 h! \8 F
      # w. Q% O/ N, G: c2 p: k

      9 r; L% B, n9 G9 ~8 S- ?# O

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

    7 ]+ q, s5 S1 l! V( b
    • 如何获得会话?
      3 e) y  Z' R) j( {; d' S( b1 z* g
      0 o. M3 ]( \4 ^8 S' z
      HttpSession session = request.getSesseion( );

      ! x/ Q6 K4 X* {5 w

    5 U3 M; b: x( o( k/ }
    • 会话Api的基本功能?4 }& k  K+ Y  b

      * m7 w3 C$ o' c
      3 h: U% X3 O" w- p  G

    getID() :String) u  {1 L# p6 }( C. M$ r7 N( z

        isNew() :boolean
    , f# V( K. J2 G) \

        getAttribute(name):Object
    6 [  w' ?+ x3 `. z! y

        setAttribute(name,value)0 |# Q* j$ n1 O. @9 n; C7 z

        removeAttribute(name)

    # h) S) i( m. A
    • 如何销毁会话?
      % i7 \8 w5 A3 K0 C( ?4 ]( `
      8 T1 X4 ]& Y: A+ X6 [( q6 ~* E
      ' f3 B8 i) k4 q

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

    <session-config>
      y8 B$ s' {5 A$ ?: a% [+ F

             <session-timeout>10</session-timeout>9 ]# {' v9 N) j+ U6 K

         </session-config>
    ; W0 Z( C  p5 A/ [# H

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

    invalidate()
    * z' d4 u, m, O, [7 q7 l* Y

         getCreationTime() :long
    : a( E7 f) A" a5 j

        getLastAccessedTime() :long/ R3 Q- v# O/ W$ s: ~: [' t8 W! T

        getMaxInactiveInterval() :int7 K6 y  G( x: _0 D" R: x

         setMaxInactiveInterval(int)


    ; S. d8 W# Q' X7 r, z4 p
    • 描述会话保持状态的基本原理
      , @4 X) \# G; b9 l4 ~3 }3 t  b4 q6 S* J

      ! \4 Z4 X4 O: @- m3 N
      * y8 U# Q0 b/ E. d) Y; v

    : h/ u4 [( F3 p

        client server
    + K% I" \. r, ~6 @( O


    & t; ]9 E+ t: `- y  B2 ?: v1 i

    request8 D! E) ~: b  _6 v

    response (sessionid)
    $ F. {8 A4 s% D  D5 X0 r

    request (cookies)
    . A. j& N4 A6 ~& X* Q

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


    ( }  [) M  A( _/ W  v" e) q' E
    • 请描述session和cookie的异同之处( U  A; `2 A7 Q1 j5 k6 z% ^

      4 m+ i# C: `# f+ C+ M2 f9 g9 f! M( _0 N; c

    8 z& O. D. ?$ B) X+ z9 s8 h9 `( D
    0 s, ~4 E; y! ~# |8 E
    • 如何读写cookie,代码示例
      $ b7 \6 }! M5 K# U# x2 ]
      ( A* J. t2 U# W' v; w% H- n4 z. U

      $ p# B0 F" D. j# a7 V2 U

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

    response.addCookie(c);

    读:Cookie[] cookies = request.getCookies();
    . b1 R' [7 T) ?1 D2 \2 F

            for ( int i=0; i < cookies.length; i++ ) {
    + d0 L( i( v7 D3 I" Q% @# d! \

                String key =cookies.getName();# m0 [: W- A8 G, v' B

    String value = cookies.getValue(); / _5 ?  `" J- d6 O

    System.out.println(“cook”+i+“:key=”+key+“,value=”+value);
    0 _* z+ N; u: p+ h

         }


    $ M! i" M' C, y( e, B
    • 什么是URL重写,如何实现,代码示例* W% R( F! `/ Q0 t
      " c3 x# {1 h& i1 Y

      ( m+ Y/ {& S9 ]% H- y

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

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

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

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


    8 [4 q8 g" L) ~' A8 {. W
    ( o5 p% E6 w6 ]8 T. F' ^
    • 描述web应用的4种认证技术
      7 M# N8 g% r: O, S; X
      - E4 T0 B& k& n1 L! Z3 ~3 ]( v
      . c( o* _* O& f; m" m

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

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

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

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


    : Y# d& z* r  Z3 ?5 `* Z4 n! v
    • 什么是授权,什么是验证?
      # Q4 h+ A- r4 m3 S# q# m- I" P
      : n2 U9 E' t' g" }, M

      / S1 j' k7 [! A( [8 l) \- a

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

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


      X* v! _2 \9 l7 g# y+ N3 h
    • 什么是HTTPS
      ' o6 t" N# m) d% g2 \) P
      . s6 p7 R3 ]+ A& f& ^; R5 N* X: b
      1 K/ z  }! n9 Z4 ?& I8 I. k+ m

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

    + x  D( G2 b% O6 s& K/ c
    • 什么是审计?% p7 _1 @4 m8 [6 q
      9 y  t% \2 F# `- F4 J  D2 W

      6 z" a( e( i1 O2 ?" u  \+ Q

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

    1 I- @/ Y8 j' \- ~4 Q
    • 如何实现声明性授权
      $ E7 {8 Y* W5 g" M

      - H4 F( f# A; T# x0 A. m- a: B4 W. _+ ~, p3 c- U

    1、标识web资源集

    2、标识角色

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

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

    在 web.xml里配

    , r* Q2 i+ y. a7 Q" U
    • 描述servlet并发问题?
      % {' \( x' g4 D7 T
      5 S, |) z! ?( A  J3 `" M# w* u

      # w* l- M: W$ E' C$ [% p

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


    5 M( |1 V& a1 g
    • 描述Web应用中的六种属性范围4 s3 }- f) h4 o4 y8 N0 h) d

      ) @* b0 K" @) c% F7 ^
      7 Z* W1 i4 L5 z4 Q* ?3 v

    局部变量(页面范围)

    实例变量

    类变量

    请求属性(请求范围)

    会话属性(会话范围)

    上下文属性(应用范围)


    . w7 O4 p# W( m$ ?
    • 指出上述六种哪些是线程安全的- o$ O3 z& W6 G+ V

      / k, u% `4 _$ D$ ~2 l8 D6 X0 f7 h$ X4 |1 J8 J

    局部变量和请求属性


    : Y  a* a# m) h4 m9 |; I, s$ M7 ^% N) G
    • 什么是STM?如何实现?
      7 V  n  y! S0 g8 z

      8 {2 K7 J4 E1 V! F
      ! R1 z# o" K! e, T9 ~7 F$ C7 D

    SingleThreadModel接口

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

    2 }, Z& @( ?3 a. u
    • 如何实现并发管理?5 C& S! r# M8 t( Z
      - w8 _' U$ G8 z1 O

      : Z4 G5 b& ~- i

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

    使用synchronized语法控制并发

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

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


    . k8 g$ f: S2 G, S5 |2 A" k& C, O
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    13#
    发表于 2014-12-03 12:45:45 |只看该作者
    Jsp, i0 Z) F' T. F- u1 \5 R
    什么是Jsp?
    ( i  ?$ s/ k5 w! j5 F2 F3 A! v6 {Java Server Page    结合java和html在服务端动态生成web页面的技术: o$ O" `0 ~5 @: ?) y4 h

    4 i$ a. C& ~* |/ `: L
    % L5 Q; d4 G" D/ a: V. c  V* Z
    6 C# R) G+ p' s( _描述Jsp页面的运行过程?
    # E2 i3 [, O7 A/ e- D  |第一步:
    % [/ e4 x/ @- p: m( j3 C4 D; \" G/ X* Q% V" t/ C, t' H
    请求进入Web容器,将JSP页面翻译成Servlet代码8 x$ T1 z7 R1 d# X  C
    3 N4 O, d; {* a. s; ?
    第二步:
    / a: i/ K1 ~- e7 Y3 V( e. ]1 ]) [& b& R+ t3 `9 t. ~' p# L
    编译Servlet代码,并将编译过的类文件装入Web容器(JVM)环境. b0 ]* x& x0 }8 O* F8 g

    3 n! d& W- B. W# o5 `第三步:
    5 N7 L8 u$ |/ A; Q6 @2 P+ t' d2 @9 _, \3 ]# I
    Web容器为JSP页面创建一个Servlet类实例,并执行jspInit方法7 ~# A; w8 D2 F1 R
    " L5 P* U+ ~% Z( y1 A
    第四步:) O$ u8 Y3 U1 ]! a, D4 z

    $ l7 x6 @) k- K% w" WWeb容器为该JSP页面调用Servlet实例的_jspService方法;将结果发送给用户+ n5 N( p) a- @: \& Z/ P

    7 ~" e  r5 D% p& \3 i
    ) H+ R" V3 D3 S; h7 v% S% {# Y+ `, D5 U( S3 w! \0 F, [" n+ _
    描述Jsp页面的五类脚本元素的功能、写法、并示例
    ! _8 s( J9 v' z/ J, o0 K- g# [注释 <%– –%>
    , W! s/ D4 _# @8 O' W: s5 [$ i) p$ M, P. t! ~7 L
    <HTML>
    0 B& f" A  S4 |) V1 |, n* l, e1 C" _5 T# D
    <%– scripting element –%>- ]5 a# `1 X- H3 b6 C( @9 ~8 ?& o* r

    ' b! h% O1 X) c% j/ o3 F</HTML>
    0 n8 r( u7 d$ P- b& P; Y$ ?2 l
    ) D, U" N- V$ r% v  p5 ?, j指令标记 <%@ %> 指令标记影响JSP页面的翻译阶段
    + _, K. Y7 z7 \9 W6 |" \. U) I8 M8 e6 t+ l, ]3 i1 n  c
    <%@ page session=”false” %>
    # J* o% @" r& C/ K0 N& I3 U/ y4 z  k( V
    声明标记 <%! %> 声明标记允许JSP页面开发人员包含类级声明
    - T7 f- j3 p3 M+ ~, k; C, i" Y2 J2 w1 M! r! X! P/ q  _; V7 C- m
    <%! public static final String DEFAULT_NAME = “World”; %>  O/ l) D9 c) R4 X
    , \- M! G0 Q- ]( G) c; `. |9 O
        脚本标记 <% %> 脚本标记允许JSP页面开发人员在_jspService方法中包含任意的Java代码
    9 ?& f/ n' N% h" D
    & w: H  c% c4 g* [: [7 L    <% int i = 0; %>
    7 h! p6 V) P1 w8 x- _* V
    ! \8 I& C4 a0 \& S0 B! \. N1 u表达式标记 <%= %> 表达式标记封装Java运行时的表达式,其值被送至HTTP响应流 <B>Ten is <%= (2 * 5) %></B>; [6 I( F5 O1 V: f. x
    % ?, X( v! H# h  z- z
    4 p' @# Y- N) `; L5 Y+ B6 L
    ! w; e! @, U, y: ]
    描述Jsp页面中的注释种类和写法. A3 f( D( @8 E
    HTML注释
    ) a0 g. d( ~$ D6 \1 B7 F3 e# E- V8 M9 R0 T: ], C* {9 D) x) a1 z
    <!– HTML注释显示在响应中 –>
    % R* u; W1 U3 ^9 l1 `; |- {
    * O: z  K  V& S$ _( oJSP页面注释9 P1 G; n6 a$ E3 x" ]8 y8 l
    . ?* g' \) w) i  F& F
    <%– JSP注释只在JSP代码中可见,不显示在servlet代码或响应中。–%>/ m9 e& X3 Q  r8 u/ `+ Y! @2 y

    - F8 |  V* b, NJava注释0 ]& g2 K5 F7 ]2 q

    ' Z* k$ ?, Z0 t$ v8 o! @) o$ _<%. x8 X: o+ T' C( f; T. b( y

    # s/ ]3 K- {, s! T( O* Y; d/* Java注释显示在servlet代码中,不显示在响应中
    # O/ t" s7 Y8 a* Z- E5 f: G! X- T3 a  E6 S3 A
    */2 l5 o8 ]; \9 q5 Z; \9 @+ z# z

    4 \; V) R. N- e1 E9 d+ i%>& F" H% R( b, n& M$ c
    2 X+ h4 U! _( C$ u1 k* j. C, O

    2 ~+ A: U8 @: k4 p4 i3 k$ E6 J
    - [2 X! m$ B' z+ p! l" o描述Jsp页面的指令标记的功能、写法、并示例
    ! T4 J* Y; N" k3 z# @指令标记影响JSP页面的翻译阶段: z4 ^- s% x2 T+ b- B8 ]) h. N

      O: ~6 C0 L4 o  u. k' U$ B# P<%@ page session=”false” %>
    , u% @6 Q6 z4 j- B* X2 g7 K! L: f6 B5 a4 e' e! @/ i
    <%@ include file=”incl/copyright.html” %>  s5 r1 {' A7 N0 a5 x# i) g9 P- [

    + C  a& ~$ k  `<%@ taglib %>8 W. q* W- X) u' D+ Y% W& q

    : t  E( R0 g; Q% {
    / t& F- T6 ]+ h6 T& B7 t4 Z  a( o
    " w4 P' z6 D% I- S$ I描述Jsp页面的声明标记的功能、写法、并示例, g% K) y/ `; g
    声明标记允许JSP页面开发人员包含类级声明
    ' L1 [0 n; n" V$ i( F* h* B, _) x: Y/ x" G" Q  h( W5 ]: C
    写法:
    " B" }6 Q3 v3 ~( n" q$ d7 w
    # p. I" i$ F5 P& U1 y; e<%! JavaClassDeclaration %>
    % c5 l. h& u/ m6 I. d3 E( p8 k8 Q/ e- ~0 D* H0 F: S3 W
    例:
    $ g8 ?0 E. }: s) e- @; Q  ]! q
    ) a0 `$ A5 Y0 [<%! public static final String DEFAULT_NAME = “World”; %>: z& {4 `7 R% N6 F, ]! |% q

    * p0 ^3 v4 J) R$ h<%! public String getName(HttpServletRequest request) {& B# E3 T& e& Z1 G
    0 s& b: b. E( {$ _# r
    return request.getParameter(“name”);
    & O' ]' z: A3 F; ?5 C4 `) V& D, v3 [% G  `9 n1 Q0 Q+ O
    }/ z+ \$ T; A6 z7 k' F& a8 Q
    & @4 [$ n1 s7 j  E
    %>
    2 j# \8 e, Z+ ^( K4 {! i6 U% ~: O
    ' B/ S' G/ b7 G<%! int counter = 0; %>
    $ c6 \) k4 F" r! X! j
    1 c( j5 A$ x( v  L7 m' h- G- R ' E0 o5 t/ c  W/ u2 }6 H2 w) \4 d( S# G

    + H' n- @* s8 g- H/ p描述Jsp页面翻译成Servlet的规则- u: L' X, X8 G) V* w3 p/ O& f. ?
    jsp中的注释标记被翻译成Servlet类中的注释/ P$ J9 q' B2 {# m# A- S1 H8 {& j

    & c) R3 ?: b: m! |1 ^1 yjsp中的指令标记被翻译成Servlet类中的import语句等
    0 S  E8 C; u2 X( n
      m# N7 L& A% y4 }' ljsp中的声明标记被翻译成Servlet类中的属性( F; F- X" n( o+ F
    1 s  {, J, }: i! L
    jsp中的脚本标记被转移到Servlet类中service方法中的代码
    2 H% x! w0 E2 o* n- q# i) p8 ~7 u$ z2 H
    jsp中的表达式标记被翻译成Serlvet类中的write()或者print()方法括号中的代码1 l$ V; ]0 k' @9 f: |; V4 N1 K

    & f: ~# o8 J8 b6 d  {$ p
    % h: V$ i1 Q( p. u/ e! }. m- H
      Y* i( R& K$ I描述Jsp页面的九个预定义变量的功能、用法、并示例. T8 }" P% a+ |, o4 `" z
    request 与请求相关的HttpServletRequest对象& z" J/ o. y! g1 e& m$ x5 W

    & {8 S2 @( \4 Y# I$ S6 ~' e& zresponse 与送回浏览器的响应相关的HttpServletResponse对象" ]1 m$ r; v; k& J8 J
    . @3 _/ D, i3 ]1 i
    out 与响应的输出流相关的JspWriter对象
    1 Q: s8 r+ L2 x/ U% ~* m+ J0 s- }( C: B1 w& m; p
        session 与给定用户请求会话相关的HttpSession对象,该变量只在JSP页面参
    5 ?( M! v# g8 e$ p! j( R3 `
    7 O5 S! ]# z: t2 Y2 b% F. t与一个HTTP会话时有意义
    3 B: S8 ^3 ^: K" I6 M8 ]% p- o! R+ t( c# ?4 G7 h/ D4 M5 W' m
        application 用于Web应用的ServletContext对象4 p# F. J7 p% k9 U4 i) Z

    0 v" D; f- h. t# _. @7 fconfig 与该JSP页面的servlet相关的ServletConfig对象+ |8 f+ o' m0 f. r

    9 n6 D9 {6 w/ T3 c: D2 lpageContext 该对象封装了一个JSP页面请求的环境/ f, W8 u7 x9 A- i7 q3 A3 @
    5 B5 B( i  C2 S/ g
    page 该变量与Java编程语言中的this变量等价! q* y; I/ }( e: l" L

    ) b% u# o0 ~, X4 P9 l    exception 由其它JSP页面抛出的Throwable对象,该变量只在”JSP错误页面”中可用/ t0 n$ V5 A! f% T2 y( N  N

    3 ~1 _: L' ~$ f( l, S. s1 k
    6 n# \3 e  J, U. f& C, x6 `- K$ |, k; l- u- O
    page指令的功能,写法、并示例,并描述它的如下属性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding" [* w+ O6 t1 k6 P9 `2 b5 m
    import import 定义了一组servlet类定义必须导入的类和包,值是一个由
    5 _0 z9 C/ S' h( z; i( z' z
    ! r+ N8 T4 s5 J- J逗号分隔的完全类名或包的列表。
    0 Z. x' W: k- N  X" G: J7 e7 q1 g' i9 s. C8 t: e
    session session 定义JSP页面是否参与HTTP会话,值可以为true(缺省)/ [: I9 ^/ g7 y! ^

    ! e, a2 [- A( P3 Z+ Y或false。# H2 V; S. E7 _* g5 \6 j
    7 \' l8 X) @* ?5 c) T8 c" d+ W9 s" ^
    buffer buffer 定义用于输出流(JspWriter对象)的缓冲区大小,值可以为$ c9 w4 r& N& i; }6 z# R0 D6 Z

    8 z" B" W: z1 m# c0 cnone或Nkb,缺省为8KB或更大。& O; w3 X1 L; r  p. Q6 [

    / |1 B6 l9 t% a. }+ B1 B6 xerrorPage 用来指定由另一个jsp页面来处理所有该页面抛出的异常
    9 s5 y/ |6 K5 T. _' G( h8 S
    : z9 C3 q) n& H: k9 misErrorPage 定义JSP页面为其它JSP页面errorPage属性的目标,值为true或
    # L6 _7 O/ T1 |7 w6 t0 C
      B% ]8 `& @" B, u* t% T- j' Yfalse(缺省)。: u- r4 j/ P3 D1 E/ ~1 X& p' l+ J
    : u2 w2 M* p: M( Y
    ContentType 定义输出流的MIME类型,缺省为text/html。  S7 Q  `) [6 k2 _. o/ A: ^5 x

    % T! o. V, d; T; [pageEncoding 定义输出流的字符编码,缺省为ISO-8859-1& _% Q! m/ c& R' x  D
    : w: ]9 w% t( f( \9 s

    & K9 E* c" u$ R" n
    6 Y: k# E  C, {7 O8 e描述MVC各部分的功能?MVC的优点?MVC的缺点?# V0 e: P& \& K$ `8 q
    MVC各部分的功能:0 A8 ]8 n/ K) A, M" K

    & g! x# c+ F( m7 W: S! |  M  t# pModel(模型表示企业数据和业务逻辑)! L( W5 N7 d5 e7 k- m) t( d
    " I! r! H% a* e+ C% Y6 Z; k
    封装应用状态
    . @( \& \4 C4 \1 a8 H9 Y
    5 C  B6 x! b3 T" [$ D" y, \响应状态查询2 u. {3 ^* n/ n$ r
    ( V+ Q1 I9 M4 L% |8 ?' B' F
    暴露应用的功能
    7 _- w, v' F- h3 B# c2 v
    , L. {3 e* ^9 l6 u* Z0 ^% UController(控制器接受用户的输入并调用模型和视图去完成用户的需求)
    8 m8 x: Q3 F5 T9 f( O2 `- l2 ~/ X$ w5 ]% D, q! Q% E
    验证HTTP请求的数据
    % J# U* m& I3 Y
    9 c2 b* h, O0 N5 R" [: {- Q5 l  r将用户数据与模型的更新相映射
    $ V: j* G' F) [) C1 E8 D# t
    " r2 S- x  y( ~2 i$ L( d; T( v4 G选择用于响应的视图: F' N  I2 |' W: o6 n
    ; S) e0 o3 {! w' C8 _. ?$ r
    View(视图是用户看到并与之交互的界面)
    ! a6 e' @$ R* d' n4 |. k! @
    $ ^5 `' ~/ {$ V产生HTML响应
    % P# }2 A$ U0 @$ {! R$ K
    1 X* ?# h6 w, e3 i8 }请求模型的更新* D' E. d0 v/ W, P1 U9 g

    ; A! P# D$ v( z" T- y提供HTML form用于用户请求  E. R' K; G% S1 i9 `1 d6 {
      P& }$ X% Y1 t+ M# g; S
    MVC的优点:
    2 N( t! |! z- _# M
    / v4 p; m. l% Y        低耦合性:视图层和业务层分离6 M, s; T# _+ {
    : v- B: J1 g; R8 l2 D* a* C
    高重用性和可适用性
    $ U, E# z  J8 g: C- k% f  }, ?! ]" Y2 h8 L. c7 r
    较低的生命周期成本7 M5 g" m- W0 n$ V
    1 p0 W' u$ Q( n- m% P7 S2 l
    快速的部署
    9 v% h( P# y/ {/ m" T' y
    . `) T. L1 Q; B* T0 i: \1 ~可维护性/ i4 Q" {6 m' I/ g
    ; n6 J0 X- q4 H# h! P3 \
    有利于软件工程化管理
    # c; b9 E/ c& C, A7 d
    2 d) ^, g' ?* M4 T提高软件的健壮性
    7 W8 T8 Z& ]" F! ?: P1 C
    / b9 b( F1 b9 TMVC的缺点:; \+ S9 [: O( N
    9 M/ A3 S* `. B4 r0 y
            工作量大,增加工作的复杂性,MVC不适合小型甚至中等规模的应用程序
    . i; e9 L: b. G2 T0 G2 `" P4 G& f3 E6 s6 G" U* O

      }- m/ P& C7 l: Q1 @8 _0 I  X, J2 {1 [0 G
    什么是Model 1结构,以及结构中各部分的功能
    8 G& R& p& i1 \结构:jsp+javabean0 l- q5 K. s" q- J, E
    9 C: U$ F# s* Z: S% T
    Model1中使用jsp来处理web应用中的视图控制部分
    " ^5 C% z% P2 G4 H' m2 g! T3 K9 V7 f/ m) g! o
    Javabean收集参数
    . y& {4 R* A( h& M3 g$ W- u! r3 o8 S5 K  X* E  ?
    $ D) D% w* j2 N: ~7 B7 R

    0 C, b4 `- H5 }; P) @: e什么是JavaBean?8 Z: X" ]/ }/ x
    用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。
    9 v. c7 z7 V- W- }  z0 F5 u2 o
    2 t1 z1 j  z4 Y! K 0 \; \; H4 v' ^# S6 \" c

    2 S+ }: b; G' ]1 K- }JavaBean的规则?: u: Y! U" s/ M6 F- }, P& a! d
    使用get和set方法定义属性2 d. o; S! u4 d7 V

    2 o+ E6 ^6 G8 g: p- O一个无参构造方法
    ' I1 k# y+ w6 f+ B2 ^6 p( c# k1 y0 z, B
    无public实例变量( 所有属性私有化)
    $ E5 B7 q- k, y4 D  R
    7 i3 j4 Y6 F' b5 x/ u0 Y. s; N* z
    8 u4 g! i4 i& E% k0 G/ M3 h7 R( }1 b3 C- A2 \1 u- A
    什么是jsp标准动作?包含那些?分别都是什么功能?如何使用?
    ! P: s  Y8 P2 x( H: y+ uJSP页面中使用类似于XML的标记表示运行时的动作
    0 j, C- Z; }1 |: N( P
    0 M4 i& \2 p* b: Y% |( Mjsp:useBean
    ; a( U9 ~3 s2 ^+ v6 |) J' x: i5 Z) h, O4 f+ Q, k" Z
    jsp:setProperty
    : L) j9 X7 I  `' V; z/ t6 a
    & u0 W7 H* ]9 r& Kjsp:getProperty; A2 v: b4 P' J6 g* K+ u* \; K! F8 V
    % w! M! X6 }5 O% u
    jsp:param
    9 v' n5 G/ v" g3 e: [! N  f+ H5 u6 h* R
    jsp:include$ X! m  A, S9 U9 v& K

    2 x, V/ c) _0 z+ V6 t4 Z7 \jsp:forward
    # Q  |2 p5 i' t2 Q7 q  e( [6 N' {
    , U7 _- ~* }2 j" `: J+ f , S' P0 k/ l, E0 r6 K. P
    % g! c3 y1 m# D  S) Q- S# q
    用代码示例如下标准动作的使用:useBean、getProperty、setProperty
    9 E$ w7 Z* K1 I9 y' W4 N1 p<jsp:useBean
    4 I5 w  H6 e; d/ v. y- i. M7 q# V& L2 }( s
    id=”myForms”
    : t" X0 X9 \  G) x& F! A1 ]) C. u: @. O' N. N5 @+ R; N% z
    class=”com.base.mystruts.forms.MyActionForm” scope=”session” />; `7 c; z3 d, d" z7 d# ]: M5 x
    + E" v+ A( z+ P: @2 p! t: T5 c" `" W
        <jsp:setProperty name=”myForms” property=”name” />+ t- v9 W, Y/ I7 Y+ @: h. P: P$ l
    1 y2 S) C' a4 x
    <jsp:getProperty name=”myForms” property=”id” />
    : e% R6 x; m; j: v! c) K+ u
    " L" u2 F$ i9 Y" t) | 2 ~& p0 i  r- L5 E, P2 B7 q7 f. y
    $ {, `0 J. w6 }5 ^2 T# I
    描述说明Bean的四种scope& \% r! x& X' F! y. p/ b1 X* H0 _8 H
    page
    * h. M( f; {2 w, {5 v- C) s  N7 p1 o  C
    request
    , U$ j  `9 ^- W3 c/ i
    % O+ i* C% k* N  p- m6 h3 s" ]" usession
    # ]# G& \% V! b# \9 q( Y' U* r  d- p  t5 m
    application
    + q2 b- }: w7 [  ~9 R7 I6 U  h# i" D! w
    6 h$ t7 b. t% L% n

    4 W7 m: d! @  P, `- ?描述说明页面上的字段和Bean中属性的对应规则" {4 a( \3 f7 e) ^$ N, m4 z2 E
    id 指javabean的变量名
    # ], D* l! f) ~! ?: n, K& `' Q7 [% e  l3 l. E, C
    class指javabean类的全路径
    ' H5 T4 K* U- r$ J4 ]# t# [7 e; m" h' U7 L4 B% N" c
    scope指javabean的应用范围. N4 T$ T$ X0 L( I. K7 _9 ^

    % D) n; |4 Q% F* y# fname指所用到的javabean的变量名1 t6 y5 f5 B/ g7 {. o
    5 J! Y; s0 j, p& o$ n8 I6 A! `# W
        property指javabean中的属性
    ! @- z7 X* s# x8 J6 }" C7 q
    $ J0 ~0 C0 j5 w * j$ l' q2 _* H  l: q2 W7 d

    0 E# H5 T/ j4 ?' M描述useBean动作的处理过程
    ; c3 V" u# {6 ]; y: ?# Z1 t使用id声明变量
    - Q9 |/ U0 K4 N0 `4 e/ e9 Y! A3 K; V* Q  q0 A# A
    试图在指定的范围内查找对象4 O" g& v- {5 v7 v

    4 J+ l7 s2 l- h- t/ {8 B2 `6 \如果没找到1 R3 K( \8 J0 k
    % {* S8 M7 F" P3 T! I/ ]
    创建一个类的实例
    , ]5 m, H; |6 A5 E& B! B
    ( a: c* v3 O- e2 O8 k执行useBean标记体初始化对象2 d/ v( ?( O+ |( O4 n
    % t/ R) L+ W( S) O; T
    如果找到: P; n3 h1 z8 w6 e- M

    & l" m9 T! }$ ^# f7 F1 I     将对象转换为类指定的类型
    * _" K( h# j9 ~2 T. U2 t+ [! }$ t" ~4 t5 @$ k
    " Y: O( z* V2 X: \4 N* `

    $ k1 |4 F9 i3 N. D2 l# k" s( ~描述forward动作的功能. i) }3 R" C& l4 o
    使用脚本代码处理请求时,可用jsp:forward 动作产生一个不同的视图,
    # e; Z( L/ {6 L9 E4 Y0 f! w0 i+ p) n0 K; o  T, `" P& f
    使用同一个request:
    * z+ Z4 V- ^/ B! L3 g1 J6 q5 ~: [3 I4 c0 Z4 f& q

    8 x0 R/ f- p2 T; C, K9 g; [
    5 o# j: V- ]9 m什么是Model 2结构,以及结构中各部分的功能
    ( B7 p$ Q7 ]/ t8 P) h% y- Y/ @& Vjsp+model+servlet
      H0 P: G- `9 {4 c/ C$ Y. t  z# r9 W& j! [; b. {8 N% T
    Model 2架构使用MVC模式,JSP页面充当视图,Servlet充当控制器8 @) O  Q' [+ @! ^7 o

    9 X# A4 Z8 ^9 RServlet控制器:9 ]( T/ S: e- a6 |- m  v
    2 d% L; v6 l' b% W
    验证HTML form数据% V, |6 w/ s4 \9 Y; [

    / m  @6 R4 ~( X: N3 e/ N* _0 K调用模型中的业务服务
    " \$ B5 a. S2 Q3 r. ^$ l9 s8 s: X
    存储请求(或会话)范围内的域对象: ?5 c! `, w6 w0 q2 v8 g$ y

    + r: g- e$ [6 }# J  Z+ a' V8 j4 P选择下一个用户的视图
    6 G/ i+ r5 k4 H% g7 p8 e
    * N; O6 e4 f  X: {" D8 x! k3 gJSP页面视图:
    3 T8 p& W" T6 q; C' {" Q1 Q3 w- I- s: {$ s0 C
    使用用户界面(在HTML中)
    8 B+ F  x9 g' F. q0 n7 q9 N5 M# w! l# u
            访问域对象" P- h9 _" u7 Q; C
    , N! Z4 \& A/ ]) G+ q

    , Z8 x+ h2 d8 E# i5 J* Z4 {' f  V& h- C4 K4 k  g/ O: [% u
    如何获得分发器?分发器的功能?
    3 ^; e5 {' V5 t- O8 }" e0 p% t9 e" \上下文对象中的分发器:& W  y8 J8 C% P8 u6 }% l. y
    - {0 g& o, ?0 t( f9 O; f7 e2 N5 ?
    ServletContext context = this.getServletContext();- G( m7 J' J$ V! a( s- V# {3 t
    # \% B( s* e( v7 [# o! P4 S
    RequestDispatcher servlet = context.getNamedDispatcher(“MyServlet”);: k" a- t% l( t- r+ l+ E! N' c5 V
    ( ^! R7 x; M# I  s* C7 ]" A* x! a
    servlet.forward(request, response);
    . F- y, Z+ n6 V$ [' O- V' \
    4 i! F5 `" ]/ g+ _  B# @请求对象中的分发器:3 D  A4 t1 z' a0 Y, @6 K  }3 N9 L; I

    9 ]! p8 l6 |: J+ z- ?- `0 URequestDispatcher view = request.getRequestDispatcher(“tools/nails.jsp”);4 S* c  d9 b5 z, S

    ; R! M+ Z6 }8 U% V' x: y' Z- Vview.forward(request, response);
    $ {0 E- F4 ^8 i8 _$ G2 l6 d2 j5 N# G- V! h* A
    可以将请求转发到另一个jsp页面,并保持请求的传递性
    5 L, _* q1 s2 q# k- C4 n# H. Q8 M8 x) A
    + e% ]. a5 @8 W) b6 i; U; a* B

    * a  M" w, Q" B2 A9 A# |Jsp中页面跳转的两种方式?
    - ^0 \# h1 e, A) w. _. I使用分发器跳转页面7 i  w! x% o6 e# A
    RequestDispatcher dispatcher = request.getRequestDispatcher(“url”);  V2 H# r. h6 A4 s9 F

    / Y; @& C8 Z6 v4 J* ddispatcher.forword(request);
    0 s$ m: H( ]) o, Z2 y9 }5 O. i/ S1 D. i7 g2 d
        特点:保持请求的传递(上一次请求中的数据,在下一个请求中仍然可以得到);
      p5 }4 \2 b; k: T% @# Q; X; S6 Z/ @
            转发的页面只能是同一个Web应用程序的其他Web组件: i) e' ~% x! E! P  {& o0 T! ]' ^6 B

    5 r& a' h+ }( v; z4 ]使用重定向跳转页面, T; _* E7 J' H4 o3 V
    response.sendRedirect(“url”);
    + d& @6 \1 x& I% p0 e% v7 y0 ]$ L% O, ]/ C
        特点:产生全新的请求,(上一次请求中的数据,在下一个请求中不能得到);9 t- g3 E/ P+ }

    # g' p+ Z, i( X  l9 U# v        重新定向的页面可以是任意的URL; q. R; R7 k2 b5 N* u
    1 d1 `$ v$ t3 [, J* s6 @" W

    # q5 K  Z2 ?' t
    2 e$ T- \! L* Y8 g4 D) j- K; Z描述Jsp中引入另外页面的两种方法,并比较两种方法的特点?- [* |2 J0 D0 p+ g
    <%@ include file=””%> 在编译期间把另一个页面完全嵌入这个页面,可以说是一个页面
    * L- @( e% h( e: u4 q3 _
    1 e9 i% O0 g0 |在这里可以共享变量
    " S' `# Z* W2 V: Q0 h5 m- w! G/ b) ^5 y1 I# `
    <jsp:include page=””> 动态的再运行期间把另一个页面加入这个页面,可以说是两个
    8 D  v7 b6 U' M7 Q6 k8 F+ \6 y, s# w/ w* n/ }
    页面,不可以共享变量
    : p: P$ j: r7 v: \4 K6 N) H6 i9 b
    5 e; v! E5 d2 W5 @" e7 S* M

    8 W. \5 m* n' f" J* n2 }什么是自定义标记/ n* y" P% O, S3 C; }8 V7 R
    自定义标记库是一个Web组件,$ V/ p6 p2 W3 w7 y

    ! }  ~( j1 `4 D0 F  R! |, N包括:% o# e4 ]" |2 o
    9 Y, L1 G& @& {
    一个标记库描述符文件(*.tld)
    3 J; `. O: J8 R: u; J! \( ]0 g! T0 |5 @
    0 Y) M1 N* r5 k$ t$ a7 O8 o& O: I所有相关的标记处理器类(*.jar)
    * N8 E) s0 X! X9 X4 ^* Y( Q  {. r3 c% M* B9 r% h
    9 j/ a5 |5 V( D+ p( b
    * j) }2 b0 P! L$ F/ ?9 r2 J+ v. I
    描述使用自定义标记的步骤,以及每步详细的工作+ i2 N( Z$ R- k5 a# o! l
    使用自定义标记前,要拿到.tld和.jar两类文件  b: ~7 ?& h$ B7 F, i# V1 g( ?

    + V2 l+ q! \6 u" t( y% S把.jar文件放到WEB-INF的lib里面。& m# Z1 D  P- g! F2 A1 G
    把.tld文件放到WEB-INF根目录下。
    1 i! O8 [; n$ E( \. ?3 n在web.xml中配置。
    ! c. @- O8 ~6 Y' V/ v<taglib>$ b& s: G5 `' q$ v& Y2 i# E
    0 U  `3 Y, H# \. ^) s6 g+ [
    <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>& m3 _# Q# r! d' j4 {8 F

    5 O1 B+ s" }# X     <taglib-location>/WEB-INF/c.tld</taglib-location>" V6 }$ N, n$ s, ]" M* z0 Y: a

    , ^4 m$ t( m4 h. t/ U/ {! u2 j  T</taglib>
    ( |, N( T3 ?0 }) H( V$ E& a- A- R# ?$ L/ }- V
    在页面中引用。5 q; `  q1 W6 k6 d! a: J
    <%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“s”%>. f4 z  q% D. _( i# d  g# h

    + \/ l, ?3 Y% O6 J$ U7 |4 Iuri必须与web.xml中的uri对应
    , p6 i7 p7 O; q& {- M& t) y  @/ M* Y, O3 M6 y8 \
    prefix是前缀,用来区分是哪一个taglib
    ) N. p. [% r9 t" Q5 _. @- E
    9 h* G5 i/ s  }" _- ?$ M, W使用标记. i+ g. \3 }* I7 l8 u# f
    格式:<prefix:tag名称 属性>: f& g# K9 _* x1 E; a0 q/ b8 f

    9 ^  H- V4 X  Y- |7 W) v<s:forEach >
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    14#
    发表于 2014-12-03 12:45:59 |只看该作者
    在tomcat下配置数据源
    : w! L- ~6 O. @, t& _/ [1、服务器与数据库的连接
    " \1 k! R# J% L7 n- R8 ?7 i* N
    + @9 T2 |& t5 B7 i# Z+ J配置server.xml文件2 G- C5 b- D0 S# j3 P4 F' k/ {* I
    - W2 M/ a3 B/ t) v
    1.oracle& y, X* R1 |7 }1 p$ J  o
    " z& }  Z/ F( t( y7 ]( w% h, e
    <Resource name=”jdbc/company” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
    " O8 o, M" {0 H1 {/ s/ o" V6 I* \) \  G! C' k
                            factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”* A/ p' w2 q. o* |4 p  z" s( T# P

    ( ]" ?" [* ~! A1 f+ Y. v1 jurl=”jdbcracle:thin127.0.0.1:1521rcl”
    5 K( o1 {8 D! x# ?& u
    & g- |0 O" K9 F! pdriverClassName=”oracle.jdbc.driver.OracleDriver”
    7 j" C/ k2 S* c9 `& U4 s; [# d- H3 b; t& s( K7 l  y
    username=”aa”0 l2 f6 {; S) ~) d# ]& ]" [- N5 f

    8 O9 @( ]3 e6 G' u* T- R5 opassword=”aa”
    , B1 W' ?3 J; M1 y! n6 q- ^. h+ m: i+ I$ K6 i& |" t5 Z, }
    maxActive=”50″
    ) Q. D; X( @8 i  ^
    " c2 P* n- v) P" S- {, hmaxIdle=”10″! I9 L5 K' s% D) X6 \
    / ~3 O/ Q. b, P3 m* J4 B8 i
    maxWait=”-1″
    5 Y0 y7 t" b( ~9 ~1 [+ a5 s" [& x  b+ {2 \1 r5 a% d
    />! s  A* o- x1 m( `1 l

    $ p/ d. |. H2 Y: z- X# y6 z0 o; U2.sqlserver
    , t3 O/ E" a" I" O- U0 M. l( m. Q& M4 I8 p
    <Resource name=”jdbc/webpage” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
    # S' \( B0 e0 v5 ~+ H+ t' s0 t  ~& |! u) T) N% A- V' s3 `7 |; V9 R
            factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”' n) l9 p4 X5 F6 ^2 r. z

    7 K' D) O: o% w. P* I' \+ K& F6 vurl=”jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;
    + @* \5 u, E+ p0 x0 B! C6 ]
    / {4 ]" Y2 i# s0 L4 ?DatabaseName=webpagetest”" X( z9 u8 R, z
      t" V* a; T8 L6 V
    driverClassName=”net.sourceforge.jtds.jdbc.Driver”
    : }1 m' j% M$ D
    # w$ W, e/ V. ^+ Susername=”aa”
    6 c" N; Q! f# K; a; x1 Z# H, }: J# K4 S
    password=”aa”6 l6 e) N) M4 U+ g  N: M
    , c' C$ L$ I2 T. O  D! C, j9 y
    maxActive=”50″
    " H  ]/ K' k8 {( |( x3 D
      c) X* w- u. q; Z/ @# j9 _2 Q0 HmaxIdle=”10″
    $ j% {" b2 `, e9 y- _4 w/ _* ~1 s; f. n
    maxWait=”-1″
    . S9 b9 i- l2 a& ^! @& F8 _6 \9 |% f1 a7 b  c( o! U
    />; ~9 a1 G" l! w1 S' f  {

    . g" w% S/ H' k7 R$ ~+ Q2、配置自己的web应用的xml文件9 z4 p, m5 x9 j
      D4 L' A# l2 A3 K0 w- z
    $ d5 `# ?' _* J

    + x( l" J, y$ j2 ^<Context path=”/eb03web” docBase=”F:/workweb/eb03web”
    * f" m5 L# q2 ?0 B+ ?- u6 k8 q1 @. y( |" |; M7 ~3 k9 Z
    privileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>
    ) z' `, @) p/ e- b5 z# F( Y
    * Y' [  z8 s: X5 z! w/ Q9 ^<ResourceLink global=”jdbc/company” name=”jdbc/company” type=”javax.sql.DataSource”/># e$ ^# P& _  J% \  f! l; |
    3 l8 J' G/ p" g: }! G" m
    </Context>
    , H2 Y1 K/ S7 Q  j
    # l( O; @+ V8 k0 N - Y( V" {) _% D/ R

    / r: [' \# l6 h; Z3、配置web.xml文件; s: E1 u: b, Q0 {; \
    5 n, A, U( |6 C; l5 y$ c' }
    与服务器建立连接
    ( J0 |# {2 s! P
    ' }  p# w5 S& M9 I<resource-ref>& x/ P* E# o! ~- y

    / n  N/ Y5 T* c2 `# G<res-ref-name>jdbc/company</res-ref-name>
    ; H3 z8 ~+ C& Q0 O+ N% A) b7 X% O
    . B4 F0 D' u3 J: ]- S<res-type>javax.sql.DataSource</res-type>
      |& J+ B% s  t' r: F
    0 ~8 F- M+ z$ F3 E* i, Q6 x8 ~<res-auth>Container</res-auth>
    % n1 `2 j5 H/ M8 B
      i# W9 U' z7 z; B2 J6 L' U3 A2 R</resource-ref>
    1 {' o* W, `; T" o: `' A7 ]& p# F/ q3 A( D. u
    4、在应用程序中不直接与数据库连接,通过DataSource连接池建立连接
    * J" h6 [4 |" F9 U8 y
    $ Q; F# \5 L: @) g//1.在程序单独用时设置系统的属性,在tomcat下可以不用配置,, I# D$ G; {/ P( n7 Y- u, ]2 }9 Q; }! v" \
      f2 C4 Q  `+ C% Z8 D, @$ Q6 E0 |1 h
    System.setProperty(Context.PROVIDER_URL,””);
    9 X' G0 ^( r! i; s) z( |1 g9 g" }6 C' U( b- H4 v
    System.setProperty(Context.INITIAL_CONTEXT_FACTORY,””);* n4 m6 T4 W2 q6 e0 k
    2 Q, T5 C# o+ d1 I6 s" K
    //2.创建一个上下文对象: }  M. j+ U5 k0 e6 L& w

    $ G' E- F* s" D/ P1 pInitialContext context = new InitialContext();  ^% V1 n  ?7 t/ m

    ) }6 \  m$ \% y% S# e( t% w' X, S//3.通过上下文对象在连接池中查找DataSource
    ( u6 P  f- E+ j! w* s8 P4 O
    6 d$ c3 `! w% z# c/ {DataSource ds = (DataSource)context.lookUp(“java:comp/env/jdbc/company”);: b5 _: C1 O: w# P
    $ h8 \, C0 X) c
    //4.通过数据源建立连接. I; Q$ i3 p; P% V( P* U

    - I# l  V: H5 E1 I3 C$ wds.getConnection();
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    15#
    发表于 2014-12-03 12:46:30 |只看该作者
    ORM对象关系型数据库映射% I) v7 o' N! E4 ~; g1 I( V. V: U1 G! D
    (Object Relation Mapping)3 B& Y3 c0 W8 n) p5 }; @. f7 x+ i

    3 k. k4 M) o5 }/ t. _. @# f一、映射的特点6 k& I/ w% x$ D2 G3 o9 I. d
    2 E) }1 k1 X/ g
    1.一个对象可以对应多个表( a) N% O+ ~# }7 K
      y1 ^4 L5 D7 H
    2.一个表可以对应多个对象
    " ^) ~9 y. p+ u: t. E7 {0 [+ ?
    3 ?4 Y3 V. Z9 z- R. s; p! x/ m4 A3.对象和表的关系不用完全对应
    0 X* b- h1 o2 I" I# b+ R  \- a9 |/ W" v# K! _
    4.对象的属性的名称和表字段的名称可以不同: X! G) [9 C$ w, K6 a

    / m0 d  h2 Y, z4 y4 K5.类型可以不同,但数据类型之间可以转换: m& k$ y( p3 b
    5 k( }/ t- y6 j' ?
    6.对象中必须有主键,数据库的表对主键无所谓
    : g8 q, i, b1 T, b5 o: s% x2 y! p) z5 }6 a3 a3 b' A  @( n% ^
    7.数据库中有主外键关系时,对象中可以有,也可以没有
    5 D+ w- W* ]; x; X" r6 r
    * K5 }! \2 M$ Q& s 1 i1 R0 Z' G* k

    / F/ k! U; P3 u0 [* Z$ |( ~二 、有一个映射的描述文件————>xml6 s) b/ t& E. E8 z8 g

    4 D- I, P: C% f, I* O# ^5 y三 、怎样实现描述文件————>一段程序3 ]* I! v7 L6 b) M' \0 k9 p% T" q

    0 G  |! y+ w1 X8 d1 K对象 映射(mapping) 数据库
    7 m6 n' W' P9 }5 ?' t0 c, w' K1 M+ ?2 ]+ x, Y4 N0 U; Z) ?
    user* `. L" e! i5 }3 X' e- x, d

    . t9 G1 |0 m. k8 Kid=11
    ' P* o# D) Z. R; B4 W* Y4 C) c: j4 g( [* x: Z0 `+ A8 v% M$ o0 Z8 {
    name=”张三”———— > (1) —————> tbl_user(id,name,age,tel,address)/ l% X. ]* v+ x( z; d

      K4 ~" W3 A( X8 `age=25 <————(2) <————
    + w  b) H+ K6 @# S; ^0 W& `3 w7 d( B" v0 V4 J

    & `2 D3 a  @8 N" f' N; p1 @# ?2 d. N0 Y- H: I4 F* ~
    (1)从对象映射到数据库, n  H6 j$ Z" {  \( ]& }# f) @/ L

    7 D6 l7 u# v5 _8 b; m6 k% v1.JDBC! L# n+ m" x9 `& H+ V/ z) o$ r1 U
    2 @" k2 L0 R$ s! X9 g; |% c
    2.根据描述文件来动态拼接sql
    2 r$ z5 Q; p( l8 @/ Z1 b4 F3 U2 D$ t% ]) b# T
    3.执行,添加到数据库中
    $ b3 [. ~+ w9 k& q$ r7 x  [: r$ t
    7 E9 \2 u' W/ {% l ; c% O2 t0 P6 o

    6 B7 n: x4 R4 T4 [2 t(2)从数据库中映射到对象" m' P$ Z! ~0 f! s2 B

    ! }% Y7 q8 G1 m5 Z& G! O- w1.JDBC
    - P6 M( f: W  S" S, D
    " g" D; w( o9 q$ m7 L) c2.拼接查询sql
    5 W) _0 p( \: J  \4 f% G) [5 v6 ^* N( z4 w
    3.ResultSet3 [  `% g) [* Z- @: d/ e" b/ n! }

    0 y9 @+ b/ }9 A+ B4.Model
    : U0 }$ u& a- t% R) R
    ; v; q! B& e% L! [) X# c( m- p4 } & M( V  ]6 s9 p9 w) q9 k

    ; T1 A5 l$ l; ?6 b4 U. Y( L1 thibernate- S; D8 j3 B% r4 Q* H& Q
    开发流程:+ n1 O- D# w7 B2 g6 U. E& Y
    , I: |9 A5 G% t2 n' n' O8 a
    是什么?
    + w- v' n, w# ?$ Z3 |& thibernate是一种基于orm 的轻量级的框架4 c* f; w/ T+ b$ \7 G' U

      x, h* A2 v- b) z8 X, n
    , b  \9 r2 \2 U
    ) Y8 ]& l1 |0 @有什么?
    2 V+ t; T4 R4 |/ {$ D1. session 保持连接状态(依赖事务和连接池)
    * ?! A5 T- {  H( s6 X8 U( f0 A  _5 q( U4 k, X! ]
    2. Transaction事务( H/ j( C5 r3 x! u% u

    7 Y! [/ M! q# Y7 [3.
    3 c4 I, R& O" m% x% eConnection Provider 连接池
    + H$ L6 {7 z2 r! }3 m
    3 ?# K5 |5 \, L$ O ; \  m* J2 y" ]6 r( q: ]( ^
    / G) k3 \( n1 D( P
    能干什么?
    " y% O2 N6 }  k) P) D7 B1.orm) t6 O/ E9 _* w" u  W
    ; g/ m; T, u- W) G! D
    2.提供操作数据库的接口,简化数据持久化的编程任务3 K( v  k( K3 {* ]! l' j' }  f# a, _
    + \5 k0 o1 i1 h/ f- |5 j0 Y
    ; m! @; C9 X+ E& ?* {
    $ J7 w  T4 K; F; c" o" g
    怎么做?
    ' ^2 Z8 F8 x1 p+ Y1.搭建hibernate的运行环境,将hibernate的包和hibernate所需要的包拷贝到lib 文件夹下
      |, a" L' D& Q& Q/ x
    ( j) F7 q, g* O1 ^" H4 Z, r2.O(vo)
    3 P1 t! a4 Y& a& D2 g' Q6 T- z- b4 N( V+ ]- d; F0 |9 H- [
    3.R (关系型数据库中的表)
    # y4 B- R, d7 E
    ( t  u) O5 m  P, [, U+ R5 f' E* ]- w4.配置文件. @: j9 K  y) [; S

    + |7 F* j( N  z  x( s4.1 cfg.xml 放在classes根目录下,默认名字为hibernate.cfg.xml
    + O. a! U8 O( p0 r4 U5 w+ ~, n1 u3 L, C, o7 Y
    a.与数据库的连接
    0 P: p9 s0 _% k* S; Z# G; [0 Y* R- A# j( z0 |6 n7 N
    b.可选配置- o6 |3 u: U' U$ @8 e
      M3 b, P3 C) [
    c.映射资源的注册
    ( T1 c1 _8 ~5 `
    $ N+ p% x# f5 q7 ?4.2 hbm.xml文件 名字与类名相同 并且与类放在一起3 j& J* l# i! r8 g: P
    1 ~5 k3 _, |/ j* I- |5 |6 k3 J
    a. 对象与数据库表之间的映射. ~: s7 y, W% ?# S7 t

    % O7 n2 m: Z; R, ]' u; _- \b. 对象的属性与数据库表的字段之间的映射$ }) A2 \# V* c. H  V! i* ]
    : @- {1 ]9 P  S1 F- l. b
    c.组件之间的映射
    $ y. `7 r* B0 x* o- t, L& B
    , `. W$ l; \$ w/ o& Bd.对象与对象之间的关系映射( V) y5 X1 T7 X3 F7 k( {

    . i0 Y! s, e7 n5 r, b9 t% Y5、客户端7 H  d' ?2 {# u; S1 P3 L* B

    - X+ ~2 }# `) Y1 \+ J* {4 r' k6 A1.得到SessionFactory, R  e4 P' ~- a5 y9 @  Y
    2 y9 H1 f( W( q& B8 F
    2.通过SessionFactory 工厂来创建Session实例
    ; u1 @1 S0 U8 [9 ^8 H" w; p# U& Y8 E0 d0 a' }
    3.打开事务
    ' ~5 @2 f0 d+ q1 l( v+ Y6 Q5 J. h; W
    4.操作数据库
    . l/ N/ t4 R; `# X) i
    : K# T" G1 J" R7 P$ E1 T0 B0 z, u5 U5.事务提交% J4 Z- G: K& V/ }
    6 u+ s! R  @: a1 F' W* R8 ~6 Y7 o
    6.关闭连接
    , L: }$ }5 v+ @2 v( g) c; F3 v" ]+ m" `! d1 b4 [  c8 w. Q
    运行流程:6 Q4 R6 r; ]" x- h" w

    2 v4 n: h& W: X0 k, }6 O6 ^整体流程
    + F2 W. ?2 r% Q9 M1.通过configuration来读cfg.xml文件
    - m( j; x1 @& ^' n  q
    $ H- ^: y9 f7 X( c/ f- @2.得到SessionFactory 工厂(根据数据库的连接来创建sessionfactory)* i* B$ [* B0 a8 E- f( P
    0 @2 c0 V; c. |8 H- N
    3.通过SessionFactory 工厂来创建Session实例0 O- b9 ]# L1 h. h

    2 W7 }& ~. c/ A  p  y7 @* F4.打开事务  y; h9 s+ u7 a' g' }

    8 k  M' T2 o& F' L9 c5.通过session的api操作数据库8 T# }7 f2 R- j9 _# E! S) _9 {0 w* a

    3 K2 ?  _1 u/ X, _* }6.事务提交
    % \4 w0 _# J- b: H
    9 S) L# Y% H6 r$ d7.关闭连接1 B* l$ {$ Q/ {* l" A! R5 E8 Z
    / Z+ O+ T9 G# I0 j0 N  d& L; w
    0 g, c5 K1 ?. }! K( D9 A! X
    / Z* \! ?9 j3 o9 d" Y
    save% y1 g6 E2 O( T$ d/ ^
    1.to—>po+ I3 w! q6 Z' B* r
    : W3 D, I2 c4 q$ U1 c4 f* k1 ^
    2.根据model和cfg.xml中映射文件的注册来找到hbm.xml文件
    ! U4 E- h( r# y# H1 C3 o
    : v, E1 ]; V- ]$ m3.根据hbm.xml文件和model来动态的拼sql! E! G1 B/ x$ U% j  k
    * N3 `3 i! L( n3 g& |) V
    4.客户端提交或者刷新内存
    ( ^' H; ^/ D7 b. I8 A: B% D9 R% s, O+ ]
    5.执行sql,值放到数据库
    $ N1 Y* \" e1 F, I2 u1 h5 l( \4 G- F' z
    5 s3 o9 B1 n1 W4 v& f

    5 L1 h" Z: y3 V% a: `& |update、delete$ M9 `# {! A, B$ d+ p; \$ S" R% j
    1.根据model 的id在内存hibernate的缓存中查找该对象
    . F* B- E8 F6 n" }' V
    * G5 f0 }% b* |: K$ A7 ?如果内存中没有就到数据库中查找来保证对象的存在/ B$ j) m8 a' S2 t) A9 M6 I; I
    ) b; h/ v" x' N# d) A+ i" L
    2.根据model和cfg.xml文件中映射文件的注册来找到hbm.xml文件
    7 L# `$ g8 O) y4 k& j4 Y+ L4 b" l+ k5 K5 t% V7 e1 C
    3.根据model和hbm.xml 文件来动态拼sql; B. W! R6 {) ~) q! V$ |! u

    9 b- o0 X7 |/ V8 V/ E7 q+ o4.客户端提交或者刷新内存
    1 P) f; s3 A7 y1 E2 L3 K  K
    , V! m# j; w6 F5.执行sql! S" f4 `! X4 x+ Y
    ! i7 @$ W4 ]) V# d8 }& T

    ; I, r& M# h' m6 t* R: w+ J( A# N' W( A& h4 Z3 V
    Query2 h- h7 X9 C( r" l5 Y
    load* p& u! J4 F7 A% Y" ?
    - Y7 H6 b0 t; @, ?2 P/ n: g& M8 K
    1.根据model的类型来找到hbm.xml文件* C+ t! s* B- _2 S" C
    8 I  T$ f) Y& [; @
    2.判断id对应的对象在缓存中是否存在,如果存在,就直接使用,如果不存在就进行下一步。, P3 k2 b5 S8 K5 O
    7 r7 P7 N/ I! O* V. J
    3.用id做为查询条件来动态拼sql( w  d6 D* h' ]9 r( ?
    $ ~) y5 [& I8 [' A+ I8 k* j
    4.执行sql 查询(先在内存中查找,如果没有找到(会抛出例外),就去数据库中查找)0 Y. f) S& n- K, [2 \

    9 g3 f. L8 h; Y- B6 Q5.返回一个model类型的对象
    ( U% A" V8 K0 S5 @/ ^' P
    " o% T! A( B, Z5 i2 r# d* Kget# Q- e4 s' W0 c
    9 _: x: l0 x% R0 t
        1.根据model的类型来找到hbm.xml文件
    3 v, T4 C) ^# g: `
    # j4 B& x* R* B+ d0 J2.用id做为查询条件来动态拼sql
    - d& V: o& q/ k9 A) u- _1 w" k+ @; M2 y4 F
    3.执行sql 直接在数据库中查找,如果没有查到就会返回null* g$ Z, |; @9 h% m8 ?6 ~
    * |+ r% Q8 B) m
    query6 o' k0 d% P: N5 [$ c$ y3 P7 ?0 N4 \

    , W1 a. ?/ R0 M8 p" F. e  B, l1.分析hql语句,得到model的类型$ `5 R/ r8 {9 ?2 u7 T4 d
      A+ c, P+ ?9 w3 [. W2 ?' p5 x! ^
    2.根据moedel和cfg.xml文件中映射文件的注册找到hbm.xml文件$ l' ]- g- A9 U. ~/ q
    ' Y! Y- @3 ?/ b0 |, ~. @, Y$ t
    3.根据model和hbm.xml文件来动态拼sql) k* K5 P1 s, m3 w; T+ E' W

    $ h5 h+ U0 A3 t4.执行sql查询数据库
    6 u4 Y& k1 |9 q! s5 z* T3 y) X4 q8 D, y
    5.返回一个resultset
    6 b) l& B# n" M- j; {2 `/ f4 Q
    0 O* Q# b% W4 B6 ]4 u6.循环resultset的值,放到model中在放到集合(List)中8 R4 @/ H5 g# M2 K+ m! M$ m

    9 x9 i, V7 p3 @( a: s  g: O
    ( g4 o: b6 G7 c
    7 f8 \- B) a7 k谈谈hibernate缓存机制  Z' ], d; T) }$ A0 J7 D! m( b
    & \* ~( y5 H$ L. E
    缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了。打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去数据库中取,也省了很多事。5 ~: n9 f, s9 A" L5 p

    5 ]* w3 D: o$ P  r! n9 @0 V: t # y: A) h. I& j% ?, ~

    : L8 o" e9 n4 x4 I! jhibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。
    4 c6 J* w2 m( s$ I3 w
    3 k+ C! o$ T, a. c & n4 r8 j8 {' g- q" D- C; _
    0 y+ e8 Y8 _6 f1 J7 i
    对一级缓存中的session事务进行数据的预存取,数据在各个session的上下文中存在(单例),当session关闭时,就是session.close( ),整个所有session范围内的数据全部清空;二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二级缓存只有一个区域 ,画个图比较容易理解。+ o' Z- `( U  R" W6 j- q) Y

    ) ?% r' \5 M1 F
    ' y2 B( t. M2 U1 k4 r# k9 o" l, Y6 U2 y
    | 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|# H$ q" d8 ?8 k2 B9 T& |
    6 w  N) ^7 M# D
    | | | |1 I. ~7 `6 B  C- C7 L
    : C% J. U! x& R, v/ o/ j+ N& l
    | | | |
    1 h' e+ X2 F8 ~/ R7 H+ M+ i5 m6 s9 Q0 I9 I$ e1 h
    —————————————————————————————————2 x" c" f6 ^' Y& s$ y
    $ M; N* i" j+ P
    sessionFactroy级别的二级缓存8 ]' Q) i& z) d& j
    ; R/ M8 L- W* \, J% B0 \; ]
    ——————————————————————————————————————-' z. Z- d1 R2 V4 e2 y0 r

    5 N% f1 o; `4 g+ ^8 H! I|; e& i( Y0 E' L: U, c9 A
    - F/ r! Z0 N2 a: s
    |
    3 @# n8 m  f# I+ h( o( c0 o: U  T' t
    * u, d: {) g/ a8 m|; G. Q* x3 `4 G% z7 `3 R" d6 i$ J. X

    " ?4 L1 B/ A9 r% }3 d——————————————————————————————————————
    % ~$ Y  r5 f9 F* O, G% g4 f, n% l
    DB
    3 S1 B0 B, x) w4 M6 a# M, j$ X( N
    $ r) M# u2 [/ z! N+ O% V—————————————————————————————————————–
    , h+ E) F% E$ Y4 J3 S
    . A* ]  w1 z3 |2 z7 X! j. K, ?) t
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    16#
    发表于 2014-12-03 12:48:12 |只看该作者
    Spring4 t2 O/ u6 N+ b, J0 [# p& ^$ p
    • 是什么?
      6 O# _: c5 r$ C* {- g. m4 k$ {
      2 Q0 x6 {/ Q6 b# Y

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


    5 e6 g! y0 y$ D5 I/ o3 s: E8 x
    • 有什么?
      & z: t% K! r% o) h  _0 Q# ?( p
      8 V5 g) U! C3 O/ s

    ; D9 y7 T& s- m- v

    每个包的功能:

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

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

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

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

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

    AOP :面向切面编成

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

      i' @& E' T/ T$ ~& m$ r6 }6 O& r
    • 能干什么?. B$ y2 v8 k- L/ d  v/ r- J. Q7 ?" E
      / q$ m; i: X) |) G0 ~

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

    ( u& \  p6 }: o2 O
    • 怎么用?
      - n: s- C( N: ?  L5 j6 u! g

      / g8 C. e7 D% t0 ]
      • 搭建web工程,引入spring的jar包7 z3 Q# M4 n" @! u# y8 u
      • 在web.xml中添加如下配置
        5 [; V1 [( n# X1 v% z
        $ w2 |* B% X: S6 A" G- `
      2 e" m0 E* S- ^9 G: a, c0 L
      ( s8 q) B7 o7 }0 m7 t1 n

                contextConfigLocation
    0 j2 ?. G# H; O/ ^$ V

                classpath*:applicationContext*.xml' C( ]3 |3 H& k, i

       
    - C' ~' i2 G  b/ K" f1 w$ q

            
    + y8 \. Z: V. c5 t/ P5 |% v

                struts2
    ! z, A" {: _& M+ V% `

                2 W; j1 D6 Y! K9 y6 ]- [

                    org.apache.struts2.dispatcher.FilterDispatcher
    2 ], @' Y' I8 t1 c3 E# m

                
    7 u6 e) Q: m+ R- p# h  J

            
    $ M: B; {  K1 b* F- [

            
    ; T  _9 P4 k9 y. s4 `& D* O( O& E1 k, `

                struts2
    ; b' X" `; `  z

                /*
    : q' K7 o9 h& I1 b& C+ ?" l8 P

    ( `& C/ p3 b! K2 @4 }  x

    / A' Q3 I+ V; F1 q% `: T3 ]

                
    7 F# U3 k7 i% r, O; n- E. p

                    org.springframework.web.context.ContextLoaderListener1 o; }/ ^/ k! d0 M' o

                
    * ~; A8 K- |0 L

            

    • 部署9 J6 H  ?) @$ A7 ^7 S$ C( s
      4 m2 \  o5 h; Q8 q5 T( b, u
    + n, u( G- W8 q  t* e  |
    : }: Y0 O" M1 j+ `1 X

    ! D! E$ C* F1 Q" ]! E3 H
    • 容器和bean
      ! K& ~: r$ d* q5 Y8 l# f

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

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

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

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


    # A4 R0 J/ _" z& K+ U
    • IOC控制反转8 Z& N* G2 K( t; S+ p( }
      / q8 k/ J2 n! Z+ c% n/ `# M

      " t) e  `! e2 H# w1 u & B- W% K1 x3 x, z! }" j$ I4 Y5 O( Q
      从前的应用程序想要得到A的实例他会直接主动的去拿,当用了sping后,应用程序由主动的去取变成被动的等待,由spring来控制应用程序所需要的对象

      0 T  h" ?$ g! A# g5 N4 Z
      • IOC的优点
        % n# j4 {" Z. [9 t+ _3 a# ~
      1.可以通过IOC来获得实例
      2.可以通过DI来获取注入的资源
      • 配置IOC的原则
        # T9 g! ^( B2 M# C
        • 一定是可变的资源才采用依赖注入
        • 一定是层间的接口或者是模块之间的相互调用才采用依赖注入. }/ p1 w# o4 X% Z
    0 G% v+ o+ Z1 [2 f7 G8 ~
    • DI依赖注入% j" U9 f( J" e

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

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

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

    例如:

    在配置文件中


    ! A0 P# h& P% n" h% F9 ~4 J! ]1 o: k& [
    : E* N# P( `5 z. g

    在应用程序中

    Public DBDAO dao ;

    Public void setDao(DBDAO dao){

    This.dao = dao;

    }

    3.构造器注入


    ) \# b0 `: r+ J

    4.ref 表示参照其它的bean

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

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

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

    6.lookup注入

    7.singleton

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

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

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

    8.DI的优点:

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

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


    * [, z0 d. ]' _7 k  A
    • Aop面向切面编程7 q+ s+ }' Z# ?8 H6 U" t5 O

      / b/ w% }1 Q2 X3 u1 ?" t

    1.AOP面向切面编程 一些较好的模式或者是示例—-范式
    5 d2 I3 j9 d* \( [! x$ ?3 [

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

    2.AOP的思想: 主动—->被动(追加功能)
    4 }  L/ d$ F$ C

    3.AOP 的概念* u  ^6 p6 w0 l% P

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

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

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

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

    5.引入 :扩展的功能

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

    7.aop代理 :实现机制

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

    4.AOP的事件机制
    9 B( ~: c( i( G1 Q+ q

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

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

    3.找到切入点

    4.确定连接点

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

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

    % i: K) X& e( u6 U5 u0 A0 {

    9 u* D; S8 c; U1 E$ f3 ?- `) o/ Z* c- B" n6 ?4 |

    5 [" f9 n, M6 f" `0 [) O% d/ t5 M" M
    1 ?1 Q! z1 v- x9 l$ a
    : k3 K5 t+ b0 i' L$ _' m  f$ a! @) L& M4 d

    5. AspectJ* {7 k4 C& A0 f' n" r

    5.1.在xml中配置比较烦琐2 Y7 U6 t+ i1 ~2 [

    所有的入口必须从一个代理(ProxyFactoryBean)开始! ^( `3 I4 p" s$ H: I

    / X; V/ B0 R' S
    9 s  E# K* k" S% O% j0 i. i

             
    ) e( Q% K/ {: x1 M. K: p( Q2 I6 E6 T
    " j& |5 Q2 j7 g; J# M
             
    1 {8 H: w) y1 Y3 ?$ m

            
    9 D4 z( G6 @) s& p; z

            

    1 f9 w* i' q* y
    expression=“execution(* com.javakc.aop.MyTarget.t*())”/>
    & @: l3 g0 F+ w$ [; y

            - j- [1 b- b3 P" M8 o" a

            6 p% e4 O9 P& K! @

       
      q+ L( O! x! ~$ Z1 }5 I


    % {/ w+ p* k" c/ D* \; l' W- D$ }+ O( H% N) x! P9 R1 I& t

    5.3.使用注解的方法相对简单
    + k1 r; h. E% S

    @AspectJ的基本语法
    ' o9 |# V' f' @  ?

    1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面
    ' ]3 v9 m+ d; V% j: }5 {9 K

    直接在类上定义@Aspect
    2 e3 I) F# v! `7 N& U0 S: K9 I

    2.@Pointcut声明切入点* ]1 T6 B* N9 t* i* I2 ]

    2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字5 I* Y8 t  f7 W  _# i. h

    2.2、可以使用匿名的pointcut
    3 {9 q. L; a( V' z+ }: {1 {

    2.3、执行切点的几种方法6 k5 J% j3 [' I. \& x& U4 @3 _7 F

    2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法
    2 W9 x" V- ^7 M/ v

    2.3.2 within 指定到包,不能指定到类/ i  i7 D( T# K# {1 C8 k

    within(”com.javakc.spring..*”)
    * G" ^/ B  L' D% @

    2.3.3 this 指定到实现接口的所有的实现类( J8 F8 _  g$ `! m6 M/ B

    2.3.4 target 指定具体的实现类# [& v$ Q8 ?- ?8 b5 u! z+ [" G

    5.4.advice的五种类型的示例
    " S! p( [8 y& Y0 Z

        客户端必须从接口走才能得到监控,实现想要追加的功能
    3 y6 Y9 @# a2 \+ C$ w3 }

    5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)0 z! o" x) r4 z) c

    追加的方法的参数名字一定要与retrning的名字相同- y! z/ u$ _9 o0 e

    在注解@AfterReturning中必须加上pointcut和returning两个参数3 W, y# {8 n9 ]5 k! o- Y

    pointcut指所要监控的目标对象的方法
    / n8 K! h! q% _; e& |( i

    得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配
    $ C2 }( r" q1 C# i( F  V# v/ E

    完成追加的功能
    0 |2 ^4 U6 Z" V& |: D1 i

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    ! I0 k6 [' l6 w- I$ L

    (1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)3 R1 ~! ~2 q2 x" j  _2 Z

    (2).
    - F: V2 I9 e& ~0 b

         2.直接引用匿名的pointcut
    4 c9 I, q) Y: a. g) Y% R

         (1).@AfterReturning(“execution(* K4 K0 l4 T  F2 W0 E. E. F" [

    * com.javakc.spring.schemaaop.Api.test4())”)6 l' z* U. U; t* w' g. m$ b* O

         (2).@AfterReturning(pointcut=
    % b# X* k0 N2 S: R

    “com.javakc.spring.schemaaop.TestPointcut.t4() &&$ x  T; s' u/ k: w* b6 ]

    args(str)”, returning=”retVal”)6 a9 J! Q+ `# g+ H) m# \% H: d

    @AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)9 q1 X; ~; [! L+ C9 V+ n1 y" s

    public void testAfterReturning(String str,Object retVal){5 h- M' J4 W# t

        System.out.println(“afterReturning1=>”+retVal+”=>”+str);* {5 r5 n( M: P6 @( t$ @

        }
    3 z' T2 y+ t  N7 d+ Y6 e

    5.4.2.@Aronud
    0 |' [! G# Y! f# N& G$ A

         注解@Around环绕追加功能;; f" c, w- C( a5 P  Y/ I* D

         在执行目标对象的方法的前、后追加功能;
    : m6 G4 c0 j( [$ n4 o6 k

         必须有参数;第一个参数的类型必须为ProceedingJoinPoint;
    . t& P- T: O4 g0 Q' i3 P

         通过ProceedingJoinPoint的实例的proceed来调用所监控的: J: x8 W/ [7 L1 I

    目标对象的方法( e! g# k% V$ l1 o9 j" G6 `: k

         1 定义一个pointcut,通过方法名来作为pointcut的名称来引用( B0 n  l1 `9 B( w

         (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)' m8 l) L% b( \4 G

         (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()
    ; B8 U% P& p  t" o

    && args(str)”)
      f' I5 }7 ~" u! V2 T

    2.直接引用匿名的pointcut
    % L. w' o. H3 T! ?

         (1).@Around(“execution(  O; w2 I' H( f2 q" S1 s" n

    * com.javakc.spring.schemaaop.Api.test1())”)2 j3 u4 L3 @8 s$ A  ?0 l9 x  B+ J

         (2).@Around(“execution(4 a# H; M) C- o; b

    * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”): G9 ?7 T. p0 \0 p: Y

    // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)! Z7 N5 g% X, q& W# }

         @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    . P) ?! N! T8 R

    public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{6 o* @2 o, f3 _0 a3 e& ]6 I% J/ i

        System.out.println(“around1==========before1pointcut==>”+str)
    . }+ y6 ~" z8 U5 e

            Object obj = prj.proceed();. C* T% V, P0 L' e* a/ O

            System.out.println(“around1==========after1pointcut==>”+str);
    8 k! _6 {4 L2 j$ C- V

        }( L2 j8 b( [4 r! z4 B* c0 U! D

    5.4.3.@Before/ V8 {% N0 W3 x

    注解@Before在执行目标对象的方法前追加相应的功能
    1 Y7 ]3 F; i  H9 Y( v) X  U. z) {# k% z

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    + ~0 b7 Z: x9 q- e+ g4 _! J/ p

    (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    % {: a; g- T# s' F  |' n

    (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)# ?4 n; P, l% _) A3 p" y

    注意args后的名称与参数名相同( B* y% P+ \( ^2 ?

    2.直接引用匿名的pointcut
    " G0 x( i: v: G1 \. l# k, h2 j: M

    (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
    , n1 {) C5 |, N( L7 r  n* k( l

    (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    2 m6 U$ e6 j7 A) @+ L; T1 p/ b" s

    注意args后的名称与参数名相同! q. d- g: W# A! X. K+ ?% n- T

    // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)( e9 i1 }  d+ Z% F

    @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    . C, c+ M) k$ l

    public void testBeforeParam(String str){
    * z6 z2 _- @9 [( i0 N: Q

        System.out.println(“before1=param=>”+str);
    - O8 I1 R* X7 @' v

    }8 i2 d1 g+ v8 Z! v  Q7 h

    4 {0 M. f. q5 f

    5.4.4.@After
    ! p3 P# D4 ^2 l; G" K% O, [. s1 F

    注解@After在执行目标对象的方法后追加相应的功能5 ?$ A. i) l0 N* R& Z, X& E

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用' B0 ^4 V# {4 I7 O

         (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    . }: s# R( o0 |, I! k

         2.直接引用匿名的pointcut
    - j: @/ ^" |! B

         (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
    + j- v; L! k! P( j6 j

    @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    2 F! \* M5 a# V9 f" s

        public void testAfter(){
    1 r9 j  e: c7 {+ a- I2 l( }  J

        System.out.println(“after1== >pointcut”);! K( j" l: s* J; k9 o  b; z, D1 S

        }) e, j, T# s& K7 `" E: T" t

    5.4.5.@AfterThorwing
    ) p% i6 w8 |+ Z7 O- j4 v& r1 ^* q

    % t+ l2 x( B5 E+ J/ A+ [- d
    + u6 B" z7 r: _, q$ e6 {! [$ ~
    • 描述一下spring中BeanFactory和ApplicationContext的差别
      " P2 j" k; Y4 g3 z: P2 }

      * D9 g, M% Y3 i- s

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

    ' F+ \) v4 L' c% f
    • 谈谈spring对DAO的支持
      ( O4 l- ?. f$ s; p8 P9 P" Y

      " H  _% s4 l. z0 U3 X

    Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。0 J, k. @- m" T# M  m( i( m

    简化 DAO 组件的开发。
    " k, a* @  `+ _7 v' ]. ]* D* TSpring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。: B, t. g. T% ]0 b! z8 j1 l3 G

    IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。
    # j8 Z: O$ E7 ^* F2 C; S

    面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。
    9 C" S5 ^( `  H1 A* m  B

    方便的事务管理: Spring的声明式事务管理力度是方法级。' `. w) I" ]; s* }* n9 ?$ j3 ~

    异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。
    6 V- U9 W- U6 I0 k' O

    9 M( _; ?/ v( \5 C5 n/ \
    . ?, R* ^  C+ w
    • 谈谈spring对hibernate的支持+ C8 f* H" Z! F( Y, B0 q4 _0 g

        ?* j* A( |% ^& P8 I4 V$ d

    在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。, Z5 ?6 _* Q/ t& _# o9 |6 \

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

    1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:: f) r! c6 D* s5 M$ A6 r% E7 d

    6 A$ s9 x/ u9 _$ D0 w4 D% e

            class=“org.apache.commons.dbcp.BasicDataSource”>0 b$ W( U8 M) v/ _

            ; ~& n8 \" f; b4 Q6 Y. _9 b2 s

                oracle.jdbc.driver.OracleDriver
    3 _  _% i- j; o6 ^

            $ y! t- T7 b8 B7 @; M

            
    : j9 u& i; i4 y* d5 b

                jdbcracle:thinlocalhost:1521rcl
    # g4 D9 M8 g9 E

            ' W  \' J6 Q9 Q9 H

            2 P( |1 q! N% A. }

                javakc2. n5 V4 B- h5 K! T6 h

            9 h* S" M! L# [% w4 |

            - e! p0 v; q- z: g+ Q

                javakc20 ?, e- d8 }- I4 I6 M6 b

            
    2 E' h$ e  f) u9 e, Z; Z9 `

       
    % I. _! A4 m) i# k


      e7 `+ h0 q$ Y2 r6 M! P+ K7 [

       

            class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>4 |1 H+ h4 u$ w: N; S

            . u5 t/ }; F# h$ i  B* q

            
    . |" h% ^. q8 y4 ]0 b

                ( h; e4 I3 H$ f  N  Z3 b

                    com/javakc/spring/h3/UserModel.hbm.xml
      ]; m, d/ ]/ `2 O

                . [4 Z2 u4 B9 W% o0 Y) r. |

            ' l  T2 u1 |) P) X; ]

            
    / J/ v* U+ R0 R  X

                
    4 ~" U) }) Y9 ^9 z

                    hibernate.dialect=org.hibernate.dialect.OracleDialect
    3 ^7 w! ?  _8 p2 w1 F

                
    9 _& o/ C& Z. p6 A1 O8 {# M$ F

            
    7 V5 E  n% t. X

       
    : B+ f$ y8 v) G8 {% ^

       
    - A& b, G+ }; q

            7 w, f6 I5 }7 p" l( s0 R

       
    ; J% Z5 w: {, f. ^

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

       

            class=“org.springframework.jndi.JndiObjectFactoryBean”>
    : @9 A4 @% {2 S) q( F1 w

            7 h  W* N$ _  C# @5 ~( U

                java:comp/env/jdbc/myds
    " [' u! q' R* B" t6 R' f

            
    % q- y7 Q  P! I: [- U, N9 h

       

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

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

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

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

        " x/ A! v' Y  \- [4 E' o/ `

            5 s; Z; m' e; @6 C0 n5 [

        / J* P4 [  D! t( P3 T


    + c( _4 a1 \1 h4 F! P- z

       
    ' `& Z/ M, |: W( [6 W, n

            
    / y7 \: U' B! A3 b( ?3 a; ?

                , L$ a* \2 C1 D* q+ v$ I! _0 H

            
    ! Q" [! b; g  K5 T+ N- e3 f

        + M5 V6 r+ M# Q

    3 ]/ U' ]1 E# k% U

        # o6 b+ n$ ]$ b

            7 g$ ^" O! k& x

            $ V9 U1 U0 q; y2 W+ A; P, K. U

        ) A0 t$ O% E% a; J* F/ Z7 O8 ~+ H/ o# _4 T

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

    ' p) P4 b8 T0 F# B! u6 W
    Spring2.0之前事务的写法
    ! t$ Q, ~$ l! d! m# w5 r" a3 S4 U
    2 D% E( J7 `8 H9 P# q

    6 K, y: x/ u" J1 k1 E% |        class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”
    : l7 F5 d; ^+ n/ y

    9 V8 p- c9 B* R6 a2 h0 ]& X        abstract=”true”>9 p' s5 v$ g# J* k1 h( Y

    - J/ j. f0 A1 e2 Q2 v7 ]
    & Z, d! z  O5 t  [- v/ Q
    ' h: q3 W% i+ }6 p5 B) _" J7 g4 K; l/ a+ S) f0 \3 y% y( Q: _
                    PROPAGATION_REQUIRED,readOnly" M2 w" H/ y# u5 }( x8 Q
    2 v7 S- ~5 {( R) j2 i0 A4 [
                    PROPAGATION_REQUIRED
    ! y. W/ h7 ]( V
    % A. `# C; n# R" v

    4 E% R. K! Q$ ]6 u! Q& P
    5 M0 W: h5 D0 c- I2 C
    ) L  |( N6 ^0 f2 j$ t- {: I- R6 f
    8 l) R7 c" r' u( P/ ~

    ; c" b+ {" |* z  p" z: f$ L
    • 谈谈Spring对事务的支持
      9 [" Z8 m+ K5 w% n3 U
      7 h; p0 ]( C3 Z# h  ]$ O9 \! j


    ! H& `! T8 [+ S) Y6 |- Y  \% I0 x1、声明式事务管理:

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

    2.做法:

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

    2.2

    2.3 注入数据源

    0 z* U/ G  [' N6 G% C3 e

    # b6 l& a9 u6 U2 k( j4 ]" A; v. f- ]7 d, X

    4 F5 ]4 r; C& W' F, v9 ]7 H8 Y- e8 K( n4 u
    & N' ^- U0 Q" }# D& s: c! U3 r

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


    ! ^  l$ U! }" b7 x( @0 Z7 S% F8 Z4 ~( l4 s: a$ X1 V0 G( I& f2 ?- V

    6 j/ T, V0 I8 [( V# o$ K5 H8 Q

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


    6 i: ?, k+ v' R+ g
    * r+ }. y+ ]7 h/ J. r2 m; G& u7 V& e4 S% h+ y

      g- }7 t" T" X) R
    - M6 Z" x  i  p

    2.6 定义切入点


    # m  j9 V( U2 _
    1 _5 {- A* b' a) X1 d3 P3 _) v  F/ u0 w) C3 |9 R- X1 _& u
    6 }* H7 @1 I! `8 e8 ?( S6 d. y
    $ {- ]2 j/ m; }% K# r

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

    1.注解@Transcational

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

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

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

    , V2 U' F+ n  p" ?
    7 l! Z* B8 L9 g7 ]

    如何在Spring中使用Hibernate的事务:7 w) a& X4 k2 }& u! {+ ^


    . U: W9 V9 p( e2 V


    5 e. R4 B1 I' b


    . X" v/ S) x1 [% @$ x

    如何在Spring中使用JTA的事务:8 c6 Y/ ^) R- b' ?


    & W: \$ ?% C0 k/ }2 {& s% d
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    17#
    发表于 2014-12-03 12:48:32 |只看该作者
    事务4 C; ~# p. o9 J- E( ], l' |
    ACID
    9 U# c1 q% o0 O% c7 z(1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失败
    & l# r* ^1 s2 M) o) o0 g
    3 i5 d% U# T, y+ ?! p8 o(2)一致性 :操作的前后满足同样的规则,保持平衡。6 Q( p* ^. o% v" T
    8 p% p/ {3 M6 B( m/ o( j8 K0 D
    (3)隔离性 :在事务运行的过程中。事务内的数据对外的可见性和可操作性(必需由数据库的支持); R/ F9 ~( d5 m
    3 P- i4 b) V9 h9 V
    (4)稳定性 :保证数据在事务的操作的过程中不会遭到破坏,而且是永久性存储的
    1 ^2 S5 m- O- p! i% S+ q6 d# L; j- R3 Z

    8 u- J# U! j4 }* m. [$ w6 H- N6 o
    事务模型7 _% ^0 X8 I! y. S
    (1)经典事务模型又叫平面事务模型(JDBC) 事务不允许嵌套. `# t# E2 a/ |. W4 f6 |" Q/ f( V' M8 Z

    - N9 m6 U7 y* `% I: Z3 S! z7 w(2)嵌套事务模型
      v. V6 b7 v0 ~+ G3 \& @$ E0 K
    ) l9 q. r* d" s1 k4 O - M/ ?; {. x3 n3 N, V! n% n+ U; N/ c

    6 A' b  k6 U2 B& k) t事务的两种方式; T/ v& i3 m1 |& T
    (1)声明式. y2 P' Q# W8 z3 L+ @# x
    5 \" W( m4 v" \  S
    在配置文件中设置以下6项
    1 t8 ~& \+ B* g" u/ u( W4 [
    1 ]3 N0 P8 _3 T) D2 O$ |0 r5 t(1).required
    - E( X/ X1 r' L- p( B, T% d1 x7 D& F& V0 }4 e  R3 u
    如果客户端没有事务 在bean中新起一个事务
    4 ^" [" q4 Q; n- E- J5 Q& b! u1 s; _  d% Y2 H) j0 D$ V
    如果客户端有事务bean 中就加进去
    # z4 Y  G6 c# [+ O6 w& R0 R& k4 c' X- |
    (2)、 requiresNew% {0 D& }3 P) ~' T- ~" Z
    . `( {) t( u5 L$ t
    不管客户端有没有事务服务器段都新起一个事务. K; Z8 g; L  U" y

    / p, T" k3 l0 d/ a: L7 a; d8 ~如果客户端有事务就将事务挂起
    9 W+ M  G. _, Y8 W! x
    ' g7 U6 \2 Q; i: A; i3 U% s(3)、supports8 w, [: O. R( t
    ' L' X  W+ ~$ t4 u9 q, }
    如果客户端没有事务服务端也没有事务  s" i( b  e% B' T3 ^. [4 T% P
    ' ?# e0 u" d$ f9 R
    如果客户端有事务服务端就加一个事务" A6 {9 Y/ W  E' Y

    9 r0 k, M( ~3 [(4)、mandatcry
    % Z' f, a) s. U' _1 G* |5 o
    7 c/ X/ G4 j; I2 c7 Y# L. F如果客户端没有事务服务端就会报错1 ?9 ~* p, {3 h2 P
    ) |. d, A2 f8 C$ a, a; Q7 V
    如果客户端有事务服务端就加事务, i. I8 w5 c) M8 d, \

    9 ]9 e" ~/ Z* E(5)、notSupported
    ' M* |; E/ X7 F
    ) Z# s/ T5 v7 F: ^* V3 ~不管客户端有没有事务服务端都没有事务
    ! P5 m: w! M9 I. {* _+ ]3 F
    " R, [- R  W! q2 I如果客户端有事务服务端就挂起
    + R. F5 _1 c/ T7 o: t) b" H! J. s; B7 Y" E
    (6)、never
    % h# O. o9 x6 G% W/ Q
    8 ?7 @. \( L& m! p/ |. e/ T7 a; K( F8 B不管客户端有没有事务服务端都没有事务
    0 @; l8 {# I7 X1 a5 X! G( F  y1 R5 r* F+ L  j5 h& r
    如果客户端有事务就报错
    - v- l. _4 t# _) C, }0 T) R9 e* p8 ?2 h
    (2)编程式事务
    & k, i. N+ v4 a7 H) l9 I1 _( C
    , p% s# `6 t0 ]) r: `6 J! R' O3 hJavax.transaction.UserTranscation
    8 i, N9 |: n$ ?' r8 j2 Q- ]& ?0 u6 G- P
    JTA 事务可以精确到事务的开始和结束4 b% G5 r- B' m

    ! b6 Q$ R$ ~# t% C0 }3 Q
    # o' c$ u% ?. F' {
    ' t$ a+ W8 z3 h5 `% ~7 ~+ }: }事务的隔离性3 G6 _5 X% ]* d
    Read-uncommited
    / D8 ^: P- P% r7 S: ?
    3 n$ F: Q. b8 Q读取未提交的数据(基本上没有锁)脏读,存在不当读取的问题。" u8 U2 }+ b/ Y* u1 m8 e  c7 c

    $ z# Z; ~+ |& Q. b; _8 C9 E( e( tRead-commited
    $ Q8 I! n, A- j8 Y: r
    ; a- o& e3 ~8 F' C, j3 ^读取已提交的数据(行级锁)
    3 e- j3 Q! N% Z' U8 L( A; _* C5 p# I; o1 f( l( W% u3 X2 H% {
    无法读取已经写入,但没有被提交的数据。( `$ q) A  v; \$ g+ J  H5 n

    6 v4 y7 [2 `2 p. U1 V5 DRepeatable_read* E5 G6 ^3 r( T! j5 T8 K
    : p, M# g$ R! d: @+ x
    读取的数据不允许修改或删除
    2 k; J2 W1 g6 V9 l2 r+ K3 K8 m' |! @+ C! v" U5 x0 S
    不可重复读(行级锁+不允许修改/删除), @# [! J4 _, v
    : J$ Q0 S/ c0 M. C
    Serializable! j, L% ?. Q+ {) q  W$ i' `( F* ]
    - n4 R' M. J/ G' t4 H# I
    幻影读(表级锁)
    6 g* t  p$ \% o7 E. R0 Y9 {+ ~* N+ O) [& [5 Z5 k' @' v' o9 m5 C1 G

    1 s' s' ~8 [3 e4 U; I5 a5 D+ Q) J/ @) z
    struts2 l4 V0 A) v& G, n
    开发流程% F8 a8 [" B6 t+ V) ~/ J8 ~

    2 h% n( u! r4 R7 a1、创建表单
    5 Z7 \) i  a5 S: r' j, b- C6 l" G
    2、从表单中获得输入
    6 N5 e( t8 v0 S; M. D) G9 T+ i" n
    ; }5 ^; v5 F/ f7 a3 ]3、处理输入(业务逻辑); u0 I8 ~' @. Z! ?
    1 r2 c* y: B- B5 A) x- I
    4、根据动态输入改变输入流
    " E& f& v1 x* u0 \: a6 g8 }/ Y1 C1 M( w$ q3 G" z3 y
    要完成上述四步,我们需要创建
    # L( p: K5 ^2 y- t
    + K- s/ G% D9 g5 b1、一个ActionForm% z% H/ @4 x  ?& |  g) d& G) {
    ) J3 W/ J/ i' Q8 C8 g- q
    2、一个action. j8 X! F3 v$ q0 v
    6 f( o; I0 j+ s4 w
    3、一个配置文件struts-config.xml
    - v1 }$ Y$ P& _
    , o. N$ T/ P/ A3 o8 G& l4、创建页面; y2 N  b3 }& p; X2 T' ^

    ( @1 X7 O. ?+ P" ]3 F( P3 ~; d创建ActionForm
    + Y0 E/ s- E6 M; V# ]; j, M
    3 _( E& w8 {) o0 L1、写一个类继承ActionForm
    1 E6 M2 a: D1 j- P5 ^7 d  {
    2 H( b+ r" A' e8 M# @2、私有的属性/ N3 z- M1 [1 {- X' e% [9 _
    # f, x3 H/ f: d% x
    3、相应的get、set方法' l( y" C+ _+ L* J' d9 M

    , m4 |" ]) i" X0 m& C4、重写tostring、equals、hashcode三个方法
    ! c2 j$ h. `9 [4 |7 w/ I
    3 B4 j/ L( v% X创建action
    $ Q. I. _8 S$ L/ ?  [" R" y2 m, T) d- T' r& j1 M- h* [% F
    1、写一个类继承Action
    0 c9 [$ @1 s  [+ |% T1 @0 ~& w5 K+ i. g5 t% u
    2、实现一个公有的方法(回调方法). U* X' |, Y) G) J4 k* g

    / a2 z" y+ H# K: Rpublic ActionForward execute(ActionMapping mapping,5 z3 g3 X% Y" x" g1 i) T' m2 I3 f& C

      P& Y# u  t0 l$ D  UActionForm form,( Y$ i' p" p& Y9 O6 `0 w

    , Z6 U- x3 l4 `HttpServletRequest request,. x, x! e% W1 c" X

    ) U, A  c1 d& X$ g# t% Q1 Q" \/ I6 fHttpServletResponse response)
    . f: U- F- r9 f$ a( L
    6 t5 {  Z+ l0 Q  o( |" A) m{
    4 i2 @# p5 k* G9 y9 B; T' v4 c' M" M
    //1.收集参数& {3 V& E. K4 Y7 ?5 o. l

    7 A3 _% F7 b) ^/ gMyActionForm myForm = (MyActionForm)form;
    & k4 r8 U) U: a/ I$ j: ~  x7 E0 @0 H
    //2.组织参数
    & [  i$ |3 g# w- n) d+ J; \
    . U2 z& X& e" N- K$ `
    0 R' N) C/ S; S, J4 K/ l; B  ^+ _- P1 Z2 P
    //3.调用逻辑层. n6 l6 m+ `' T5 g& W
    2 G5 b- B0 r, O3 c+ q0 A
    boolean flag = true;
    5 k: g' q0 _- Y/ P: R$ H6 J& \; N9 N* q0 g+ H. Z
    //4.根据返回值来跳转到相应的页面5 B5 I9 k7 b$ \0 h1 Y5 o7 y

    % P# W- m  N2 WActionForward af = new ActionForward();
    $ p$ l! ]7 J; n/ n
    , {) d+ s) S$ @- v& Y! xif(flag){8 W" m8 o# n' ~

    7 _! j7 ?' `! P- Daf = mapping.findForward(“1″);
    4 ]; U& F/ h% O$ \" j, [: o6 j% ~- D/ ^6 B1 p1 `2 G9 F
    }else{
    , |% R5 S. Q; n$ y0 X, D2 D5 {
    8 Q, I: _# ^4 laf = mapping.findForward(“2″);+ k7 m4 p9 W" s( W6 M) Q. l% @

    ) K" k& x. m4 g; c3 P: i8 u}
    , s4 k; S1 s+ X) F& o0 R. P3 G0 `% z0 @: g/ w
    return af;
    & O( d" b/ x( v; P# d, M8 c& E' o1 n# {$ S/ R
    }* I0 ^* P8 _$ `& F8 X% n& `
    : E( G! h6 P" }+ F0 r7 l
    配置struts-config.xml文件
    ( W* `2 a8 v+ _) G  U2 l" \) p1 T- ?/ s1 G; R# t; h* Z
    1.<form-beans>
    $ O# P* o; D) d9 [; @  ~/ E+ w2 R% N$ R: |" K4 I
    <form-bean name=”myActionForm” type=”全路径.MyActionForm”/>+ n- s9 A+ T- U; v

    2 u* D6 @* I+ T' p<form-bean />
    * K9 N$ Q; B" k, `
    1 N' v* S. B$ c</form-beans>" y; k7 G) D5 _; M  l: w2 |9 q

    $ K+ T" Y; y" O; p! n- t2.<action-mappings>4 E1 A( }4 G/ E' b. H0 f; S
    : x. Q: H4 Q6 n' l8 G) `
    <action path=”/sll”, Y; B* W+ b" g; M8 i% y7 k3 Q" t

    $ K7 h$ I1 b( B* v: ~/ pname=”myActionForm”
    * n5 ~* n! X7 |' p8 |# J
    3 g9 I7 ?: {( ]9 ntype=”全路径.MyAction”
    ; k6 X4 l7 u8 x6 @7 @2 L
    # B: m# I7 }7 [. kscope=”session”3 Y; L* O5 R. i1 g0 _

    4 h8 ~; W( M: Qinput=”错误返回的页面”>
    % }, h4 F: K7 P, S; P/ v2 F
    $ ^9 L9 ?: G  }( ]$ [, ?0 r* [9 r<forward name=”1″ path=”/1.jsp”>
    3 e) X4 ]9 y0 S% {2 m& _' O/ |* y% ~# ?2 D
    <forward name=”2″ path=”/2.jsp”>- G: m) Y0 K8 O0 F) p

    # h8 X) u- Q' W3 x</action>
    " F' b  Q. D/ N" l' i' I. h/ b& I( e  x  ?  J) p9 A/ X
    </action-mappings>
    4 G3 k' W7 w& g% |. X* [! b) u3 P
    步骤:
    - c7 x) Y0 b/ ?9 k0 V4 y7 I
    + L% ?9 G$ E$ a5 s5 d" x  A: U1.创建一个空的web应用
    % d, |/ c5 T/ n9 ?' }+ t6 N. i" k% N0 c5 K
    2.将struts的包放到lib文件夹下2 ?, V. W0 ~3 _- a+ H
    ; ~+ M4 l* U+ d7 D8 U
    3.将.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目录下3 F. W& @5 F8 x: m, |

    $ |. H+ M& q9 w# ?. k/ z/ l( {# k4.配置struts-config.xml文件和web.xml文件8 E% W) @) h' m9 [

    8 W8 ~% A8 V7 Z3 y2 B7 n5.在页面引入tag文件uri, n( i; e8 M2 S2 B  a

    4 r1 c/ P& a5 O0 C( NSTRUTS运行机制% |$ o7 E4 r  c* b* e

    8 u; Q5 K+ B# V) B+ y& E  B1、界面点击产生请求! o) D3 u3 L& l. q1 q
      K9 U  b, o$ e0 Z2 Q
    2、容器接到请求4 p* G( r. d' e, R' G$ v0 q8 U
    & r; _1 \) K2 X' K$ g- j9 I9 R
    3、匹配web.xml文件中的*.do来调用ActionServlet6 v; |$ v& w9 P4 l" ~
    1 Q% _8 k) l, R3 N$ y
    4、ActionServlet的处理
    1 j. w1 N# ~( d- z7 a* v3 X( M2 O7 U; M6 f9 V, g+ L; |
    4.1 读struts-congfig.xml文件形成ActionMapping
    + N! q8 f/ {" Z" d! O) ?/ B5 ^. ~8 u7 ]- S, G* v
    4.2 通过path 来匹配Action类,通过Action的name属性来匹配ActionForm类
    ; E# e  s( O/ n' B% Z# d! {& w9 o. U0 s  F/ v* a5 _
    4.3 通过反射机制来给Form添数据# R* i" ~# ~! j8 _0 ]
    7 D! B% X) W  E! R
    4.4 由ActionServlet转调Action的execute方法
    1 Q5 j/ n- B; y9 [+ R- {/ S  Y/ a/ q. B+ ^, X. U
    4.5 得到execute方法的返回值,跳转页面
    5 r" }1 z3 [* m( g( X) z- y1 f. k. }# \: j
    4.5.1 RequestDispatcher
    - P2 @: c6 }5 a' `7 |7 p
    / m% }4 h" `7 [% k- n% h( m4.5.2 response.sendRedirect(“list.jsp”);  Q/ h4 |# b6 [+ \& C  m- J$ q2 m" z

    8 j! U" n" E) F, c& u6 p
    ( e( V; U! v0 e7 C6 R& a' H8 D7 M" _
    进入execute方法& |# U9 K. u# ^3 _

    $ g7 _6 Y4 w( H, I7 p1 收集参数2 ]6 S' b  ^) _: R, L, O. w

    ( Q% l3 G$ w5 C; [2 组织参数! P! s5 H# _% n
    . [4 ]. ~8 d6 z* a# y& W
    3 调用,逻辑层
    4 h9 u% m" G# q! [5 F' z1 a: u
    ! u, t( n1 d, X4 返回值. \9 |0 H" s0 i1 J1 G

    6 Q5 ^! S+ f" K" b, j: r4 H4.1 选择下一个页面 (ActionForward), d( b! g3 ^. E, u/ c, A

    8 `4 h& |3 V% {; P; P4.2 把值传给下一个页面
    1 i- ^' o8 c9 F4 w+ s- A% \( ~* y9 M- B
    2 z) ^6 R2 G8 Z: P' {$ L9 k7 g
    5 M0 u5 E1 [# Y7 b! w
    比较struts和struts2的不同( z. {  @/ u. z; N6 Y

    & P0 H# @% d4 mStruts
    , ]" X2 e# [$ j7 P; |+ L# P: f* W7 w4 b5 X, N5 w4 B6 G
    Struts2+ Q5 I9 s4 J/ f2 S; ^
    * M* ~, L4 u! p( q5 P
    组成        五个部分:ActionServlet,ActionMapping,AtcionForward,ActionForm,Action        十个部分:AcionContext,FilterDispatcher,ActionMapper,ActionProxy,Configuration Manager,Action Invocation,Interceptot,Action,Result,Taglib; J$ i' o( O. A4 N# W
    url        .do        .action
    * z# }4 d1 u" [3 T8 k9 F分发控制        AtcionServlet        FilterDispatcher
    " g5 t/ q9 W& I. @" K收集参数        利用JavaBean技术,将数据封装到ActionForm的子类中;$ v/ o7 g" j1 j; R5 a
    一个Action对应一个ActionForm的子类0 \7 y7 B1 t  O0 H8 ]' U) E# X2 e+ h5 M
    2 u( U5 m+ f7 y
    使用拦截器将数据封装到值栈中。
    / b( H4 b2 @1 n' {  v使用域模型,一个Action对应多个值栈中的Model4 g9 H1 A1 {9 x! W* K/ g
    9 i, F/ S. s$ C/ F2 J( M0 }$ g9 C/ Y# d
    读取配置文件        ActionMapping        Configuration Manager
    , Z0 E! B" p/ o' d! p6 m拦截器        无拦截器        执行Action前后有拦截器
    2 j2 Z2 V) {8 g8 C返回页面        将字符串封装到AtcionForward,进行跳转页面        Action中直接返回字符串,通过Result跳转页面
    ( Z, {1 z0 W+ v$ F; U; s页面跳转方式        两种:dispatch,redirect        三种:dispatch,redirect,chain
    1 C; k. O. W$ y3 U" o$ `值栈        无值栈,Action通过在request范围内设置属性,向jsp页面传递数据        有值栈,Action和jsp页面通过值栈传递数据,jsp页面通过OGNL取得值栈中的数据
    9 O1 ^6 X3 F# G# r  P1 K* S配置文件        struts-config.xml        struts.xml" \: A( t( l1 F9 G- A- W" r! K
    中文问题        不能解决(需要使用filter)        可以解决中文问题:
    * c. g- V3 `  d# n5 \: v1 t2 t- t$ d1、在jsp页面添加Meta;" g/ Q+ g0 Q' z3 T0 r

    * P# @- }/ r& P  O. D5 P2、修改struts.properties中的设置。
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    18#
    发表于 2014-12-03 12:49:03 |只看该作者
    其他开发工具和技术
    6 B$ M; h0 L9 g. y. j  M$ V1 BAnt
    5 p- h; x& f5 _  \2 F/ b: q; bAnt是基于java的批处理工具. E1 k. L7 Z- s( o/ o4 |% s6 A" L
    0 B! k8 V. W/ c4 n
    一、配置ant的运行环境
    / m! ^2 u; _$ o, n# Q2 f8 n* W3 v
    5 R5 |3 r. p; R7 A9 c; }# z1.将ant的bin目录添加到path中* I1 F! U4 C* H! b  T, |. x

      V* h+ V7 A! Q, V" r! \: @# A2.配置JAVA_HOME
    7 Z4 }- }+ ~; p$ d2 p# e9 N# m
    # i3 N. V" c9 e- a0 e$ P5 G3.配置ANT_HOME
    : ?. N; I; f0 C* ]+ X3 Q1 D! K0 x
    二、配制build.xml文件,该文件放在应用程序的根目录下' ^+ v; r0 [3 J( i) `  b

    ; G8 x3 r* c4 [6 P9 A5 F编译java文件9 H) V4 F7 g* i. Z# y
    7 c' M( m5 Q9 ?7 g$ J
    执行java文件
    ' Y" T4 F  J0 ]6 f6 T
    0 Y4 i8 }" r5 {1 V1 L3 Bcopy
    9 y% k) o4 a1 Q4 O
    , G3 F8 ~/ ^: x删除! w; b0 F) M# g7 b

    ( k4 }5 n; [$ x9 G8 t5 ~0 K打jar包4 G$ n) C: b: x& x

    & e+ w. `4 w4 J9 r) @1 C* L根据注解生成配置文件+ g( O2 f% w& j

    ) H, t- b- s; y- d" ]  @; jXdoclet
    $ X  ?& b( t8 H8 O4 m% w通过注释生成一系列文件的工具(txt、xml、java、html等)9 c; e* \% ]0 V- S
    3 l" {+ V) G2 T! @0 x  F: o5 N
    xdoclet本质是摸板技术+字符串的替换
      ^( r5 x3 w1 B  p2 {( b
    % t' F+ u) W* h5 ^: D8 K% {1.在java文件中写符合要求的注释(将hbm.xml文件的内容搬到java文件中去写). _3 y& a7 J6 H! f

    $ j+ i! U- C' R1.1 在类的上面 写与表的对应
    1 S6 D& i- J2 W! p4 D5 Y2 X2 H& Y
    7 D/ w% p6 m% B. H; f! H3 j1.2 将每一个属性的注释都写到get方法的上面6 a' m% f. ^8 d: D
    0 r% R; {" C) r( R( z/ t" q
    2.在ant中引入相应的task来驱动xdoclet
    5 j2 L1 k  F* R$ r" e% }- V/ g% y( a. v+ J- I; ~% d
    2 B! H* R. J( n1 q$ p
    ) i/ o$ }$ c/ K  B; j2 {$ S
    log4j日志管理
    0 s! {: {8 {4 H( N1、是什么?
    5 d- m/ k9 D( [4 B5 I; u  M$ B1 g/ j; G, V5 ^3 @
    在开发期间用来测试、对整个日志信息进行管理的工具
    # D* E4 v4 b* A$ h0 ~$ t) }+ i" Z$ c  @1 C
    2、功能
    # i# u. d9 c4 _7 _6 e4 M0 ^; e& P5 g; m9 t! [; C4 o
    1.控制输出的目的地
    $ o& n/ d# ~) Q4 G9 f3 ~* ~/ K2 X) o9 Q2 n  ~4 b! H) ~
    2. 控制输出的格式& K' H0 p) v4 ?+ T) [% F8 u( x
    & a0 V- i3 V! K7 A0 B0 B( d
    3. 控制输出的级别$ N" C5 Z: h  z7 E4 {, h; y
    / w+ P8 J1 V! C5 N6 P
    3、日志的级别* }! d; a  m- f, W1 j1 `

    ! \$ g% Z, b- T8 `! v1. debug 调试6 B' k+ |; H' w6 V  b! r
    ) h+ |8 N* z- L, d; ?
    2. info 给用户的提示信息
      @. X) d4 A# n; P, B/ T
    ) M. p6 t% j3 c3. warn 给用户的警告信息
    2 w: c7 N: r  c0 Q3 S! C
    % S  t6 E7 k) z% |8 T5 `4.error 给程序员用来调试! f: o5 m( N2 B% C. U# \

    . f( s$ g2 p, p- s' F) lDebug—-〉info—-〉warn——–〉error& l0 g4 A. Z1 P1 I/ o  U! i

    ) Q5 c! ~1 m0 W( W" Q5 M* n4、配置
    3 N( B/ C4 C, `
    6 T) {. m/ s2 k! F  O) }! v5 A. m1.配置级别
    / ~3 s' T) d, q4 R. s: h9 ?6 }; S2 Y" T4 F) b8 Q) A
    2.输入源 (控制台和文件)
    ) }$ h' w* C0 r) t5 a1 m5 h5 s* M. W- _/ z1 Q7 Q& P2 ^6 Y  p
    3.可以进行分包控制& @& T0 ^" ]' R8 I

    * m8 j8 G) u. oLog4f.logger.包结构 = 级别% P) j7 V" ^& |) O8 y7 t
    7 |3 ~9 G4 R( s, z( ~( K& g3 z) j
    5、使用
    3 a$ Q8 C& t- ~9 a  n* Y5 V% T. Y* K6 n" H
    Logger log=Logger.getLogger(Test.class);
    5 U# A$ Y& E' t/ {" @
    ! j5 d/ f2 s8 U! B    public& M5 ^* a$ ]0 \
    void t3(){7 |5 \0 Q0 g9 j  N% V' ?
      ^2 Y* ~: M! Y! E4 @
            log.debug(“this is debug”);
    - D+ E& K' q% f2 B0 J2 V# O# F3 q/ a) p* q1 N
            log.info(“this is info”);
    * Y: `6 ]" e! H2 y
    # P6 |. Q$ X# M- y/ g! H3 r0 O" ^        log.warn(“this is warn “);
    6 t# a4 m6 q0 e" G
    8 u9 S9 L9 u; X. y% Y! s+ P  f        log.error(“this is error”);: d+ x1 T8 ]; }

    4 D3 Y0 T% \% W% e* D    }; L; R0 L% B$ X' t! G, G5 O

    # j: v! X: ~( iJunit
    4 e% D& |  B* B$ y* c( V) {1.是什么?
    4 G# |' i! _& y! w7 W" E- D
    ( ?2 L; m0 [7 c1 K单元测试的框架
    % O1 c( _/ e6 D9 j
    7 z4 b2 L! W5 b" s2.怎么做?
    : ?- n3 [* e' N2 g* J; X* v' y: s; h3 l; v  v
    写一个类继承TestCase0 G" K, e; K; `" D2 Q% ^

    , |2 z% {  h" W. Q1 ~测试的方法一般都以test开头并且没有参数
    , F& ?/ P3 R; W# P) T" r1 o1 J+ j3 ^7 W" n. W+ F% }4 ~" C* c
    在测试方法前执行的方法public void setUp( )
    5 y" H" S+ \) Q7 ?6 y0 o, j3 K3 S1 T; J6 \" Q
    在测试方法后执行的方法public void tearDown( ), C9 t6 C& W) M& @% O7 z

    : D1 }: K, Z* g% Gerror和故障的区别8 O, @8 Z. O. c' u5 h* ?* @% w% U  E
    - R: s& C3 w" r. Q4 U' K
    error :代码有问题' G( O4 V8 R$ w+ H. ?' [3 ~

    ' m/ i  D5 @) E5 F8 W9 M故障 :逻辑有问题与祈望的值不相符合) i) B  v+ m- j, }: L/ V7 X# o

    ! v1 m, a7 n7 j. X生命周期2 D* Z+ e) w7 `/ ?
    # v( n3 R. l2 M+ ?$ g/ B  m: u
    测试—〉SetUp()—〉testXX()—〉tearDown()—〉结束;, m- w% R) K/ T. {' ~6 d# T

    ' [! h5 v+ Q! v. K+ @3 o& YTestCase套件) o9 k6 X( Y: C' h

    & r* W! w, ?/ A) {0 Y6 Z" N" Jpublic class MyTest{$ y! i* `3 ~8 ?  F/ M# `

    4 I! `+ B# P! L$ {% i1 Q4 L        Public static Test suite(){
    - N4 C/ r0 \4 f( N# @! F2 B
    $ |  V* w1 b& E2 _5 @% sTestSuite suite = new TestSuite();+ V4 M# ^6 M% o) J+ W2 R

    3 Z/ {9 U5 D; ?! ssuite.addTestCase(Test1.class);
    . U" J' H; ], c, k" m
    2 S7 r$ `" ]9 gsuite.addTestCase(Test2.class);
    5 a; \& ~+ d. Z+ V& c+ D8 K1 `) o4 C2 Z, A" R
    }9 N+ e& @- \; U1 I0 x

    1 k; I) u. U9 `5 i# j( @" u}
    , u& C; i* l4 o- E) N7 Q! @7 Z
    9 u, h9 A! j* r; s $ \6 r) u, N% }- N" {
    " _& f: y5 H7 p, V4 x
    Ajax8 n4 X6 f0 W) A
    是什么?; n# g0 e! C( [& D) u
    AJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。是一种创建交互式网页应用的网页开发技术。
    0 K( |$ P3 }1 o- a# ^, q2 h
    2 E& U( w* k$ Z+ @" U无刷新页面。
    . x+ H( Z$ x$ i* I, |% o  k% x+ B
    有什么?
    5 B: L! Q6 y/ ]( \  f- h9 NAJAX是多种技术的综合,包括JavaScript、XHTML和CSS、DOM、XML 和 XSLT、XMLHttpRequest。% g! i1 @$ a6 s$ T

    / F) }& N, N( `4 ^' O能干什么?
    0 o. O  a! C  y7 {5 n- l! {使用XHTML+CSS标准化呈现;: p5 P1 `: J9 J# B! ~  U
    使用DOM进行动态显示及交互;
    $ A6 w% \8 O1 Q+ l! y" F7 N: s0 Q使用 XML 和 XSLT 进行数据交换及相关操作;4 B( o. u5 K% O  w, \
    使用 XMLHttpRequest 进行异步数据查询、检索;
    % ]2 ^4 J: a! n% _" b2 |6 ?使用JavaScript绑定和处理有所得数据;3 P8 L6 O8 ^+ @. ^% S7 {" l2 Y4 m

    4 K$ Q6 f1 C" ]9 |0 D传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。8 m$ z. u+ X) z% }" J
    ( Z. ~0 e, ]  a6 W
    与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。; V6 u- O3 K1 B2 |; U

    & u8 J, j4 Q( A% d2 ^& j使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。  o$ I2 h  \) r

    2 f$ `) O; H* U% |& ]* J对应用Ajax最主要的批评就是:4 F# Y) Q0 n. M  T; ]
    1 它破坏了浏览器后退按钮的正常行为,就是用户点击后退按钮后不能看到之前的数据;  Z7 z4 F, k- \( I2 r9 A& k5 {
    2 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;
    , E" i' W7 C: R& W! c3 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;
    : l6 Z. [4 ], y4 Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;( l5 F& N0 D* a5 L

    ( a5 o3 W& z7 M% H+ S# @怎么做?0 ~3 C+ k! S4 l6 u$ c
    <script language=”javascript”>  Q. B5 J  J  j) G9 H# p& U/ [
    " q7 s7 u2 j9 y
    var req;( g* ^9 }- I7 c( }1 x7 T- h
    - s1 s8 F0 M+ n5 U  N0 z
    function add(){
    # H# j3 @& i- m+ m# T4 S5 w- v# W3 ]$ `, x7 ^( i4 ~  F9 |) t
    //1:创建用于传输的对象
    + n5 M4 B8 }! f2 d+ s* u4 Z! X( i2 r& B( E9 [# Q5 h$ x1 ~
    req=new ActiveXObject(“Microsoft.XMLHTTP”);6 {) w: V4 `% t3 W9 P7 _5 g0 H+ _$ d

    7 ~/ p4 M7 C( C% c6 K// 声明返回后,处理数据的方法
    2 Q/ n, S1 B; }! P. T
    6 y* g! k/ O0 W3 d9 Vreq.onreadystatechange=manage;
    $ H, _" U! [+ I* l1 w5 ?
    " ^' r* [+ \4 X, u0 y% {. h//2:准备传输的内容
    $ T0 S; L3 Q( A$ C$ U
    2 w6 b6 p) L8 W- ^$ Nvar str=”test1111″;- Q2 g" T$ L# t0 Z" v

    ( I9 H2 }$ F) A//3:发出请求; I4 s, W$ D' B
    + u5 W/ {% b+ V' g6 b! ~, a
    req.open(“GET” ,”/others/ajax/test/t2.jsp?str=”+str);
    $ w' e! ~: W% T4 C  |' l: S! o  k; j  P" A
    req.send(null);- I& F2 c6 ]4 U1 A3 C# m8 b- O) D# O
    2 c" S: K( f# _. ~3 T
    }% m( T5 ?( f* x( B% @$ U

    % t5 x0 m5 [8 F3 A% Q! c% |: `//4:接受返回并处理, \# b  B, F8 g( X9 t# O

    6 ^' |+ A+ S& Z& A6 E2 @% qfunction manage(){
    ; x# W1 t8 b4 S* \8 Q
    " c1 c; ^- I# N% \1 sif(req.readyState==4){
    / W$ Q0 n8 k9 c# r/ d" ]7 @+ F" h$ E. _6 b1 F
    alert(“r==”+req.responseText);, F# w/ q* x0 `

    7 o. I% J/ _. h& n5 P}6 K, |5 i+ b( V4 a
    : {4 I, q& v. b5 u
    }9 j7 E% i6 P7 {3 ^1 U* {) b! Z. i
    3 f6 |6 V$ [+ J
    </script>
    + w8 i( o5 B: I! c' {- n  U( _1 y, X. @3 l
    readyState的取值如下:
    + q4 A* W& ?! S' N$ V/ t" D' x$ ?2 O8 D$ P- Q& @
      0 (未初始化)
    ' ^; j# f5 K) N) Z, K6 W/ r  r. N; _' \4 V% e) E! _9 I
      1 (正在装载)
    : \; i8 B6 z" V0 U+ h; A1 E' a8 P6 L
      2 (装载完毕)
    ! E: g0 f' s4 h% Y0 u* F: u* T
      3 (交互中)% q- b+ N4 \: J) a1 Y& q1 T

    6 N0 x* P# A0 g% y0 s* L  4 (完成)
    6 t0 n6 {5 X- j" v5 u! j# a7 S+ ~
    3 \4 S% r' j- i! b& N5 \
      U9 m7 G$ W7 v( k1 l" r
    5 ]8 c6 ~1 a7 s1 V& R# s1 @原理4 R5 f6 q" n( n; N
    Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,可以是xml格式,也可以是一个字符串,然后用javascript来操作DOM而更新页面。
    7 t, M& i7 n6 _  |! }- g
    $ S. _7 n. t! p  KDwr- P" L% m$ X! m- ]
    是什么?7 M  L  d4 R! i" _, {8 k
    DWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的页面。它可以允许在页面中使用运行在WEB服务器上的JAVA函数,被调用的JAVA函数就像是在页面中JavaScript方法一样。
      W: k: x# r/ R* ]! m* E/ M( A6 ~! x: C7 h  @! ~
    有什么?
    9 ]: z& w+ Z: t' h9 m  I它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据;另外一方面提供了一个JavaScript库可以帮助web开发人员轻松地利用获取的数据来动态改变网页的内容。1 K8 h# @; p& y8 C

    2 j- O) S2 b9 Z) L+ `$ H3 W 9 W2 ]* G$ w- ^% R

    * c8 y) t* |, w6 t* b# q能干什么?0 ]/ t: g$ o. N
    动态地把java类生成为JavaScript,感觉调用就像发生在浏览器端,实际上代码调用发生在服务器端,Dwr负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制。
    0 b5 d2 o1 M2 X. t" y* S/ I! s4 _! a& @0 r5 g' s
    * G6 H, |4 i& {' k2 B
    $ k9 }6 S/ k8 h- i, \- H
    怎么做?
    + f$ U& L* u4 V2 l; T" R① 编写配置文件
    2 \% |% P* E& E# @# _  W. {; M7 V7 z
    web.xml1 B+ p0 W( S+ c" M& z
    . O- g* D& j3 A8 [2 \- Z8 [' y
    <servlet>( x8 k1 n( Z) M9 j' y
    0 N' q2 h; q. t
    <servlet-name>dwr-invoker</servlet-name>% }# ~! ?# K" N. l, S

    4 z% V: L: k- r/ i! c: R<servlet-class>
    ; X2 H* }8 T8 p, A3 e- X; D( I4 j9 q$ N3 h" i8 i% p5 r
    org.directwebremoting.servlet.DwrServlet3 J. T# D! ]& l& {/ R( X( C
    : R3 H' j: S4 c; c) p4 i1 l
    </servlet-class>
    " W3 S! X! c/ @7 g. d: v2 ]- a
    / G  a9 k( W' k2 ?8 r4 [3 t9 e<init-param>
    % V. E( C6 F6 e' {2 n( D6 U. ~1 r0 a. ]+ v
    <param-name>debug</param-name>
    7 {  r  L. T" [1 W
    1 L0 Z/ a* j% _5 ]5 w" \0 q<param-value>true</param-value>
    5 W( F% @" e# M) v5 Q, [+ B! b$ p- j
    </init-param>
    4 f( S" ~) E& C/ l( s' A$ r4 d
    ' F7 P! b2 y8 \) G</servlet>6 c- C8 u. A. ~4 `& N
    ( A+ }$ J9 I! d0 \$ O  h
    <servlet-mapping>( m  a. f2 w. W$ s  P! l
    . Q$ d7 s- Q. d* }+ P
    <servlet-name>dwr-invoker</servlet-name>
    9 H7 U3 x  ?+ k5 J4 ~) b
    : S" ~5 m- B; }  o  ]% ?" Q) g<url-pattern>/dwr/*</url-pattern>
    4 G( v( }9 B! H5 c: M6 h" }  Z$ U/ {5 `! E
    </servlet-mapping>
    & ?$ v) P- V; Q: o6 P1 {' P( w# _2 i
    dwr.xml  ]) S. ^  A- @5 A3 T# y1 n( e) B

    3 B* |# d% d& m; W<allow>
    7 B5 Y& x" P  z" A$ J: Y4 s* l3 i: T# o0 \. h" ~2 `. V
    <create creator=”new” javascript=”kc2″>
    % I1 d$ {- Y2 I
    ; b1 M6 w& I: N- v! \<param name=”class” value=”dwr.Service” />+ u% e- H& Q  X. M  J. ~
    ( u4 X1 a. _" O
    </create>  s7 G0 j8 b# \, g) y

    5 a; r" \3 k6 Z( {- a</allow>
    / h& [1 K( e+ k) N3 P: W+ G5 Y* s  V9 B4 u6 d" |6 z( J! H
    ②编写service
    7 [/ S  C& V7 G3 J
    2 w3 [4 ~/ b  B9 Wpublic class Service {
    ; n" o3 Q8 A! t# \; Y0 t# A3 m* P7 |# |7 Z
    public String sayHello(String yourName) {
    ) L. G; i9 ?4 Z0 ]7 s1 ^. ]2 ?+ D
    + \+ d5 p' n) _% l//可以是访问数据库的复杂代码3 l, p8 D3 b2 j$ T/ Y* c

    & s6 R8 _6 |! Areturn “Hello World ” + yourName;; O! H% G$ ^! i2 N: J  j
    5 l! L$ M7 x- A, q+ o, d
    }
    ; @/ l. Y2 F7 i4 x: W
    9 E. Y! u* j  m7 g}
    5 h+ f; r2 P4 ?. `' q, ~9 F+ T2 ^8 O8 s  v/ [4 c' W, Q
    ③测试DWR
    $ i1 n8 [2 _% t( s- r# k1 F
    ( t+ R" C; O5 k+ d- ~. l* w& u将代码放入应用服务器(比如Tomcat),启动。
      A1 e) I. K& N# @* c. h  ~
    1 N0 b8 o. K- ]5 ?, r' }* x- z% u然后在地址栏输入http://localhost:8080/你的工程/dwr
    + T+ C' B' _$ j  q' @8 @
    / P" w5 t& |  V# v④编写jsp页面" R" Z, e3 L: S. q" F% P  P
    1 W' p. z8 u/ s" r. A
    1) 要引用3个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js; E* @2 [' V4 \6 Q0 J

    + n! s6 c- p* H+ L* w8 Y  B: A9 K2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样5 }: _6 M& ?2 X

    3 K( @5 h" [6 C! o- x5 d/ Z( y3) js里的service.sayHello和java类的那个有一点区别,多了一个参数,用来得到返回的数据
    回复

    使用道具 举报

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

       

    关闭

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

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