我的日常

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

动态微博

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
    : C6 I4 {' s) p5 }简述JEE
    # h% b+ S$ x  m% VJEE : JAVA  PLATFORM  ENTERPRISE  EDITION" y8 E- P- |2 T; v; c: y+ i9 i- P

    7 s8 k# T' l$ y' X8 OJEE是一个规范集;
    ; b) L; v7 N! A6 \
    3 f1 U9 b  T) L! J: ]: qJEE是一个框架集;2 _. R& R3 y6 v

    9 J' w! j! o9 k# p; d5 x1 E' ~  s8 UJEE是一个技术集或API集;  {0 B$ B9 |9 o: l1 `2 q
    ' ~  f; i% }6 l7 z) C% V7 X
    适用于创建服务器端的大型的软件服务系统
    7 T; f* k/ ], d# H/ B
    0 z0 R+ [) o: @0 d ) p2 Q1 ]# l. ^% f4 Z/ y

    3 n2 k7 R$ A9 k' {/ oC/S B/S 模式
    $ S* r5 u% x0 h/ |' RC/S client/server即客户机/服务器模式,客户端也参与程序的运行与计算(富客户端、胖客户端)
    9 [/ B$ l- |( O% |$ p( B1 H7 R5 q9 X6 {) u
    B/S border/server即浏览器/服务器模式,又称为瘦客户端,客户端不参与程序的运行与计算
    : P8 j1 o$ M0 f" L+ n' b+ Z! _3 }
    : ]) ?0 @2 t/ j4 R! ~3 P 2 i/ q/ q1 ~: P# W# s! x; z( _  y4 \
    # F2 `9 e* {8 Y; s2 V
    企业级应用(大规模的应用)的特点
    4 o( C  L/ G( q0 a8 c: M1.生命周期长、稳定、可靠
    ! M& c, O7 l; A4 a% j: J5 F& Z9 u/ Y( j% O5 y5 E! h6 {# X& a
    2.组件往往分布在异构的环境中,能够跨平台% o; u+ a) H/ N4 N( u: k

      ~  l& H7 U6 ]9 G0 N3.维护性、扩展性、重用性
    & e  G, |" H$ W. ~& c: M- h6 R0 K" f: P
    4.有事务、安全、线程% Y1 u& \5 b3 r$ O

    ) Y) }! ~5 a& B% }, e / ^# v& F+ v& K7 g6 H

    4 X3 F$ `" F- I1 k; K  j什么是业务逻辑?. m7 F0 G' Z9 }3 q  d/ v' h
    依照业务逻辑划分模块,
    4 \5 A# n- {8 x- D  _( |& f& J2 Z9 s3 E
    所谓判定业务 就是具有以下特征:
    7 H. @, n( C4 b, W% o: Q" ~. ^4 U7 i1 }: Q+ i8 |5 ^
    1.业务流程
    + |$ P$ L# K; ^8 _; h6 I2 k9 j7 s) e. t7 E" t: U/ L0 L8 G
    2.业务判断" p1 l4 I" c+ z$ z
    % ]0 z6 i5 ~( u$ {3 C9 d3 L
    3.功能组合& J& }. W4 j7 a- B6 E

    9 g; j/ e/ I- l# B* [& I! Y $ P' {6 v8 Q; [8 H/ u

    7 v9 ]$ ~, W( q& D7 u4 r平台(角色)的划分5 G: `9 i' J1 m# i0 L, E  W4 S
    1.平台供应商。提供满足API集实现的厂商(BEA weblogic IBM webshphere)
    ( L! q; L5 Y+ ^, D: ?, J& F" I& \
    2.组件供应商
    9 R/ l# s$ z& `/ f7 W
    - k/ Y" k- e9 \3 _4 |3.组件装配人员
    . R# S) D4 ]: i% @) l
    ; b% S0 u9 F2 @1 \" `4.部署人员8 |$ @4 j# k. N2 t
    + l+ g) K/ u0 e! M
    5.系统管理人员
    5 }5 B% f# C' v" D  F8 n% V7 e# m
    6.工具供应商 提供开发组件所使用的工具(Jbuilder、eclipse), o) z1 W& Z; X
    & H2 E3 Q2 |1 \! a

    , H! M3 n$ B5 {# k1 M) u0 o, I1 |" D) \
    java技术分布(设计架构 模块内部设计)% k) e( c. d$ o+ C) w; f
    1.表现层 Servlet、 Jsp、 JavaBean、 Taglib$ t9 I! E7 i1 o- }0 W/ d

    7 i/ H& Y1 f' g2.逻辑层 EJB(SessionBean)
    / s. M& S" d/ M. ?8 F/ d9 ~! U" @5 d9 T' T' B- G% F
    3.数据层 ( JDBC  EJB(EntityBean))
    / E+ X+ K4 U- g* `, [% R! o  x6 F# e5 u. L! v
    4.服务 JTA(JAVA事务架构) JTS(JAVA事务服务) JAAS(JAVA授权与验证服务)0 @. @4 u. [0 L$ A

    7 u) b" ~8 N+ q& u& }5.分布式通讯 RMI(IIOP)+JNDI 、JAXP(JAVA 的 XML 架构)0 O0 c9 c" f. n4 B

    8 W6 J2 N* d* d2 q- p! T# o( SJAVAMAIL(邮件服务)、JMS(消息服务)、IDLC、JCA(JAVA连接器框架 (成))$ H8 X. K+ b3 M. j/ z1 B8 Z$ r

    ( e( `5 p4 Z2 @/ ]  x; ^ & h% c# D+ z, v/ U: T, d
    ! E, U) ]# [% k" }  Y5 t+ V( ?
    JEE的体系结构: 是一种组件的体系结构2 `- |1 c! p! p
    1.组件 : 能够完成一定功能的封状体(独立的功能的集合)- \  w0 V1 z3 W! w& b" Y9 `
    # R/ {' I: V+ c# f4 s
    不能单独运行,必须运行在容器上' E6 X1 Y9 X4 \. N
    ) C, Q; q6 O) K
    分为两类:web组件、ejb组件
    9 F7 k0 [* t4 _, b$ `# S' \, w$ h9 L" g8 u& f
    2.容器 : 提供组件的运行环境,并对组件进行管理(一段程序)
    9 s6 N3 o" J9 Y( D5 |7 d7 {+ m4 D* d3 R  V  [0 d* _
    管理组件的生命周期
    1 G$ v9 y, [* B
    2 ]9 \) {1 s) z4 c不能单独运行,必须运行在服务器上
    * _- O% A* T* }, @8 A5 E( a$ k/ X( A, Q5 p* `0 b% V. {# D: `
    程序(组件)通过上下文来调用容器(context), F' n! d0 |( [% l: Z6 a: K
    ) Z. w, B9 F& z" b6 w5 z2 O4 ]
    组件通过web.xml向容器描述自己,使容器能够认识组件" A  b1 G: V( H: l7 a9 I
    4 }% d2 K. m4 D. f9 w$ ^
    容器通过回调方法来调用组件% J: C7 A6 }- C# f! _
    5 T% h$ A$ v+ t0 Z1 ]4 [2 H% N
    分为两类:web容器、ejb容器. T- R& F8 I' X5 l% O2 n  @5 r
    , L- N2 Y. a) r1 \1 p( i& k8 E4 N
    3.服务器 : 提供容器的运行环境,提供大量的JEE基础服务
    4 D4 h# _5 `  @: P7 `8 x7 h  C: A3 g- n& p
    web服务器(只提供web服务)( Z$ a4 |  l, s% Y3 z

    9 U2 ~( }+ i$ P: gjee服务器(提供web、jee服务)1 B8 J. O7 ~: g8 s+ }9 y

    : b6 U% r$ U; g ! r0 U5 ~$ {3 Z) Y$ P) {
    / t  r4 y) a; b% \, }
    什么是回调方法
    ! M2 b- H2 f( r0 X. l  M/ T0 R+ b$ v由容器自动调用的方法,就叫回调方法。! }/ c5 Q) A% y4 c8 H  L
    / j* R% x, F. V* O. ~' i" a

    8 i$ K: N$ b+ K. m
    ; k9 W9 }- H8 Q7 y+ {  DRMI远程方法的调用机制
    " [, a) V  K- s; I例如:A主机有B()方法,C主机有D()方法,A 想调用C主机的D方法3 N" S1 o+ G' c/ Y% W1 `
    / k3 X( M2 L$ ~: \5 e: l' T" r

    7 U( i2 m% a5 h2 ^6 L& t% ]
    ( c; d' u( o$ c$ d) t$ ~
    ' W3 \) |, D3 D4 c8 c' V$ Z' I3 @  }7 M" ~4 p5 `& N2 ^; O* f
    学习方法
    5 F- _5 q! ?, g5 K( W! R$ z! ]1.规范(熟记) 2.熟悉API 3.多练 4.多想
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    12#
    发表于 2014-12-03 12:45:29 |只看该作者
    Servlet6 c  O7 s* P. `) H
    •     描述war包、jar包、ear包的结构  A  e$ V' m, V9 j; k
      8 Z7 c' O& g' Z2 z8 L9 e( D2 h
      + m1 {- J; {! E+ u

    war-                            web文档压缩包

    —WEB-INF

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

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

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


    , ~3 z2 y/ U2 `  S5 g

    jar-                             java文件压缩包

    —META-INF

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

    9 I$ ?% v& A- e

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

    –META-INF

    —Application.xml 配置文件

    –*.war

    –*.jar

    ; v, a" _+ r) Q* W' L
    • 什么是servlet?servlet主要做什么?" D; R; x. @6 C/ v* c( K
      & g" J! D4 ]1 m  ]3 r
      $ d' j( K  q+ _8 _. h

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

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

    3 I; Q/ n8 ]4 v
    • servlet 与cgi相比的优点?servlet的缺点1 G5 X1 b. \/ f6 C0 r! V- m& @

      " h6 [) ?- z* c" T; S) D% o# D5 ?
      5 J) D6 G, g, p) P

    优点:

    性能(线程比进程更快)

    可伸缩

    Java强健且面向对象

    Java平台独立

    缺点:

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


    : y% p9 l- Z- B2 i
    • 常用的servlet包的名称是?
      + v2 }* q) k# V7 Z4 C$ |! ?

      % T  Q$ ~6 E" A! E1 z
      0 U: r; v9 F* H! x

    javax.servlet

    javax.servlet.http


    , H, _( I) r& @6 w+ U9 z
    • 描述servlet接口的层次结构?
      " {- ?( F8 l( O- U- D% T7 f

      % T" I. k) g  S1 Z$ c
      " x# H% Y. F, p4 q  {

    Servlet

    –GenericServlet

    –HttpServlet

    –自己的servlet

    ServletRequest

    –HttpServletRequest

    ServletResponse

    –HttpServletResponse


    , Q# Q  a5 ]+ [1 B% I+ s8 S1 R
    • 对比get方法和post方法?7 }' [& b$ y1 v3 \3 M0 a- `

      + ^8 x1 G1 c! F! Z- k
      . _8 r6 x: h/ S( |3 r- W2 E

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

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

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

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

    & @; `  U. c7 q# |0 u6 W
    • 归类描述HttpServletRequest接口都完成那些功能
      % k+ P- x, C0 l; }' v& G) Y: `

      ) u) ~3 i$ r" z9 B
      ; g  d% r. I. ~2 Y+ A$ \2 S) `
      • 读取HTTP头标
        # Z7 Z3 y- k" A4 a
      • 读取cookie2 J1 O/ _1 m7 L6 X
      • 读取路径信息- v3 s8 r0 @  `" K' c
      • 标识HTTP会话。
        - B8 W8 S' D) K4 r5 i" x$ V* y$ f* J* g+ o

    0 |  y) b* \7 O9 {1 O* [  x
    • 归类描述HttpServletResponse接口都完成那些功能
      $ _/ S( |; W8 z6 c0 \# A5 n, E6 l  P

      , e! q+ {8 j3 H& @) t. Q/ g
      + c, x3 G; y8 W6 X
      • 设置HTTP头标3 R* q/ g0 ^/ b" d( u+ R/ h, D
      • 设置cookie
        " f! d6 g" ~3 I4 [
      • 设定响应的content类型
        . I" X! M: ~) ^
      • 输出返回数据
        * n/ m2 _, E- n+ _2 G) h6 Z; s! A+ [+ J- s$ s$ G' C$ V0 x3 \

    6 Q7 d* L( t# y% u. f+ R
    • 描述service方法所完成的基本功能?默认是在那里实现的?
      * k5 N% A! w7 C. v7 \5 N) k+ C
      9 o$ N" `, S, N+ P* \1 {
      / B6 r9 z2 I/ I. |6 o4 L. y

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

    实现:默认在HttpServlet类中实现

    + ~, O! L9 h* J  o' J4 M
    • 如何开发自己的Servlet?描述应该做的步骤和每步需要完成的工作% o! `; ?1 m, |' ]! [/ C8 ?, P, D
      % p+ `  Q: ~6 e) j( i
      7 n% Y( l+ c( K

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

    $ l7 u( t' T, {& R5 o) e
    • 为何servlet需要部署描述?2 ^- `( K, [9 d% O8 M

      7 V+ i$ A& O0 N& i$ M5 a( Q$ ]' [# @0 ]0 T

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

    - x  q# }1 O( O6 r  C6 y
    • Servlet基本的描述应该是?请写出来
      & `0 u/ q2 ?3 Q* q$ i

      & y1 A8 O4 I, p7 F
      7 {, L3 U: w# x5 N
    " g, \& W3 ]8 c9 Y4 A7 X- U

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

    + d* ~5 h; I  G3 \* y
    • 如何在html中使用servlet
      5 J7 i, J! O) t$ f7 y6 W
      ; Z; V' v9 h1 r: D. f

      & g! Y9 L, m0 S# n5 N! W. Q" @

    FORM标记

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

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

    语法:

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

    {HTML form tags and other HTML content}

    </FORM>


    : K# Y1 k2 T" M6 d6 o( t& W
    • 如何接受request中的参数
      ( _2 k, u' j/ N

      + U. h+ |5 X, G. e* HString userName = request.getParameter(“userName”)方法
      9 A* u: v! @( L5 ~7 }
      8 \- F: V7 G* W0 a: K
    ; Q* ^8 O1 v9 ^" y$ G
    • 如何接受request中header的值
      % T0 C- o& q0 P& J/ c' B
      0 z, v& q% U! u$ k
      : e% z+ \4 A: Y4 P: c

    request.getHeader(name);

    request.getIntHeader(name);

    request.getDateHeader(name);

    request.getHeaderNames();

    , A. j/ x2 O8 u' k  z
    • 如何输出html
      4 Q- a9 u7 X- C5 g

      1 p) _1 k' F0 V: ]9 t
      1 A# B! b! ]  k$ @, E6 s- j9 s

    PrintWriter pw = response.getWriter();

    pw.write(“<html>”);

    pw.write(“Hello”);

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


    : N1 k5 D: A3 q, n; T4 m
    • 如何设置输出的contentType
      ; M) \4 W7 |( X7 ]2 p( D

      4 x# A( D1 M- O) s, {: A# H1 x5 ]& B0 f$ p% S7 Q: H

    response.setContentType(“text/html”)


    4 A, t4 C7 ^% b) T
    • 描述servlet的生命周期?) C9 u3 I$ `. m$ D# F
      - Z3 Y- ]' Z5 c, O3 u; N
      $ c: }" J1 R* [+ D' J& O4 G

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

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


    6 ^# h" q( _5 o) H$ q9 s9 ?+ a
    • 描述init,service,destroy方法的功能和特点: O3 [$ a1 ?& e$ o0 d$ L1 k+ e
      % J( h, ~# J9 Q' M$ f

      ) a5 O; u8 G1 ~' S& ~1 r0 @

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

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

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

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

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

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

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

    + S) l  G3 n7 d
    • 什么是回调方法?有什么特点?
      ) G" `5 I' j8 \+ M! a! Q

      . X5 f" I4 {5 B) x: x
      " Y6 `* |2 l2 c: k

    由容器来调用程序的方法

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

    , K; {2 D# s0 [8 u! C
    • 如何设置初始化servlet的参数?
      0 Z4 O# r  S1 {7 a  u

      0 Z; g; Y! \- D' e0 y在<servlet>中添加如下配置
      9 R# i3 p  U: [" }. B5 Z/ W9 N
      # Y+ ?+ Q* v: A7 ~

    <init-param>

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

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

    </init-param>

    ; d. I1 D2 D$ F$ ?: M! w" Z
    • 如何获取servlet初始化的参数
      1 q" p  U5 ?7 z8 d' n
      5 P+ J% e, H1 r
      " |( e2 z/ n! ]" @3 J( z% i# H9 J& ]; B

    public void init() {

    greetingText = getInitParameter(“greetingText”);

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

    }

    % U4 z/ L( T  \7 v6 _$ h/ ?
    • ServletConfig接口默认实在那里实现的/ N0 }# b* N& s8 z  A- I

      ! |: F. M7 z- n$ A# [( O8 T) @: I* u, S0 c

    GenericServlet类实现ServletConfig接口


    ( [/ g5 S7 J* N# p6 g$ L: G9 q0 F
    • 什么是ServletContext?有什么作用?
      ! V  M! z; b" q5 f% \$ N" M9 W1 E
      " a: g! G' ^9 ]) W2 v: j

      8 z$ X: m, E; Q* R& {' P6 Y# k( S

    Servlet上下文

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

    , ?# l5 J& E; L: K  T/ D+ w
    • 如何访问ServletContext接口?是在那里实现的?6 X  i) ~9 P- a% v& [
      . d% @3 \1 X6 \( `% `5 S5 v! ?

      8 N" f4 R# ?7 a- T/ s1 j* r$ K

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

    GenericServlet类实现了ServletContext接口。


    5 O  A; x, g; S
    • ServletContext接口的功能包括?分别用代码示例
      - S! i) |: [, P6 c
      : }$ g8 G( W7 I8 x9 U
      & @+ D( L0 n2 @5 M' z! L

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


    + B% h, Z+ V$ l1 c( Z( \
    • 如何设置ServletContext的参数?" s, J  w- X& a' {6 i2 q4 H

      6 L6 ~' o1 _9 g) {& D4 T) n
      % B! l, W: W, t  O

    <context-param>

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

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

    </context-param>


    * u9 ]9 \& V& q" d
    • 如何获取ServletContext设置的参数值?: L) c3 m- o# O, b0 m+ `

      ! z2 M, `6 n( @- N; m
      $ V6 Q. D7 Y: \" X; l

    ServletContext context = this.getServletContext();

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


    5 Q) S5 b$ I/ W( J4 H; J: T
    • 描述Web应用的生命周期?
      6 _1 f' |' b5 ~/ @1 [: h
      0 F2 S" c$ ^4 n4 k
      7 V( F, Z, x1 |0 u- W4 O  Y2 A4 L

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

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

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

    ! G& _6 b6 O# ]) }
    • 如何用代码实现监控Web应用的生命周期?
      7 i! F( G8 F6 L3 I3 d* D, `

      0 g7 m9 I, J8 b& y5 [% A# o3 R  T/ C3 ^
      ) M$ i8 q( \2 j' Q8 K1 u* H

    public class Test implements ServletContextListener{

    public void contextDestroyed(ServletContextEvent arg0) {

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

    }

    public void contextInitialized(ServletContextEvent arg0) {

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

    }

    }

    5 h7 n2 n5 _( q3 t- ]7 T

    web.xml文件中的配置:

    <listener>

    <listener-class>

    com.csy.Test

    </listener-class>

    </listener>


    ; r% C1 c2 p& w+ {
    • web应用中如下错误码示什么意思:400,401,404,500
        t; ~8 p6 ^7 Z+ W5 U
      7 O% s2 q9 ]* L  ^1 H! n: q
      400 Bad Request//错误请求
      401 Unauthorized//未被认可
      404 Not Found//没有创建
      500 Internal Server Error//服务器内部错误
      , p1 j. y9 t: Y. p( Q

      m5 f+ ]) q8 R5 B7 a5 Y( K) W
    • 描述Web应用中用声明方式来进行错误处理的两种方法4 F- _8 F1 i& s) R  M7 e
      ' u2 `8 T' [+ W/ t
      % j7 o7 t* M4 p7 k7 [9 X

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

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

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


    5 L6 p0 s6 y! E4 ~3 ^! p1 B9 A  R
    • 描述记录异常日志的方法,都位于那些接口?
      8 T7 R$ s0 S0 w+ W3 h
      8 n) m2 ]9 m$ u: S  w- |4 V
      % h* z. Q4 f: t5 `& ~9 I8 e" E

    GenericServlet:

    log(message:String)

    log(message:String, Throwable:excp)

    ServletContext:

    log(message:String)

            log(message:String, excp:Throwable)


    % E$ I& }0 R9 N7 O# y8 k
    • 什么是会话?
      ! l) w6 C3 E& m% C8 m; l

      ' O  M! c) [: `# y# n  h1 X: g# |9 k- K. H1 U

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


    ( l2 I' M0 k& K) \
    • 如何获得会话?
      ' |- C4 a* k4 t6 }

        Z6 W/ z" g; B- b- C1 _  j& |5 L
      HttpSession session = request.getSesseion( );
      4 ~8 J5 r: ?6 h* P5 P

    " a) S9 s4 O2 l% i" I# u
    • 会话Api的基本功能?
      9 h/ [7 l: [6 y4 @/ z% N( m

      0 B  @7 u5 n$ k0 J
      . U; K7 R8 }5 T; I7 l  F

    getID() :String. E, _# Q4 [. H: V: F! e; _9 I' x( }  @

        isNew() :boolean( A( c4 C: p- P. e  }  {. w3 a( ~  ?

        getAttribute(name):Object; S6 q! @* P" }) \8 n

        setAttribute(name,value)$ X5 W: e; ^# f3 ^- Q

        removeAttribute(name)

    * X/ H& ^: Z! q8 M. |
    • 如何销毁会话?1 u; r; X0 _6 R- C/ d: K; J

      2 ^5 M$ s* r* W2 @) ~( x. Q. o+ ]9 G; y- x* C

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

    <session-config>
    # y8 }9 k& ~# e+ W

             <session-timeout>10</session-timeout>
    " q& t* q8 e" Y& E% S) s& Q& J0 ^

         </session-config>
    # ]' B; F& ^4 f" U

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

    invalidate()
    ) H3 f) v( J4 ?  U; C8 W

         getCreationTime() :long: H5 n* _8 A- N2 `7 X

        getLastAccessedTime() :long
    ) ~% s; |: b1 F4 M$ E% Q3 T

        getMaxInactiveInterval() :int1 \, F; ?0 t( t: a

         setMaxInactiveInterval(int)


    9 v. W. a8 V) B. x" z  R  {' V
    • 描述会话保持状态的基本原理
      * o: w+ j' w5 e: s; |( d
      0 q$ I) ?& A$ x9 {$ b+ ^, c0 X- e
      0 k9 x0 o0 h8 S
    ) ^2 C8 L( L+ a

        client server
    % n4 V$ _5 d' U# P4 q( z, B


    # d- p  F9 Q9 E2 A

    request, P( P8 a. |- X1 c2 a2 T

    response (sessionid). m2 E; C- I$ r: X2 h  c) s% C+ K

    request (cookies)
    0 v) T( i' E& A9 N) [+ y

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


    + A' n  @- ?! ]% o
    • 请描述session和cookie的异同之处* B+ q" X: R4 M2 {% d: r
      4 S8 u; s  h% z7 N
      7 K" M; a% U; W" ^6 Q% \  l

    / H# N$ R$ q8 }) C+ E( W5 `/ x) K" h5 {9 y8 E
    • 如何读写cookie,代码示例! a: T- Z+ R* ^4 L4 H5 o

      : X8 ?/ ?1 V$ J* ^7 d, b) \/ S2 E- L* e! T6 @+ {3 b: }

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

    response.addCookie(c);

    读:Cookie[] cookies = request.getCookies();: n( w, ]! e% V3 r! [

            for ( int i=0; i < cookies.length; i++ ) {
    7 F+ ]% o0 S4 O9 y

                String key =cookies.getName();
    " g3 f5 @5 S5 ?0 z# f' E/ ^

    String value = cookies.getValue(); $ O& G* p6 F" u3 B: T5 @

    System.out.println(“cook”+i+“:key=”+key+“,value=”+value);
    & r# i+ W, J" w- u4 [" f8 @  T

         }

    % a3 [3 J9 H1 a9 T
    • 什么是URL重写,如何实现,代码示例
      * D( ~. V1 D7 w/ {+ y+ h8 C/ m
      & y9 d& z  |* g, `4 q# L6 e
      % y2 E! i; a5 r7 g9 A. z) G" X

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

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

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

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

    : |. T/ |, Y; p

    / G# S$ g7 i0 v/ ]2 w8 a
    • 描述web应用的4种认证技术
      9 N. }( a' U8 ~: y4 S7 j6 w

      7 [: O5 |# I' H+ ~7 Y
      $ D5 @1 ?" l0 Z  q

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

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

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

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


    & Q, c, A. q# }, Q- V7 q8 `- v
    • 什么是授权,什么是验证?, }! R* S  x" ]7 K; w- Z% W! {4 o, {

      & }8 J* S( x2 I; y+ W- \3 c! s* T' D5 i7 X4 n; Y

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

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


    ; _- f: P/ V# Y. M! L/ j
    • 什么是HTTPS/ ~* `9 a$ ]1 U' H6 v' s* W$ y! b

      6 R8 w. i7 B, {
      8 A% ]  A) @. {5 p8 E  N

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

    + A- S$ Q3 S/ [' w" d1 B
    • 什么是审计?0 T9 Z2 s8 F- q; O

      , X) G( |) M1 W: u  F, P. C! X/ z* e; H3 {3 O0 w

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


    ' N  i! b1 J2 d5 a' K+ \6 L
    • 如何实现声明性授权
      5 Z& ^' x6 n# o# _* H
      1 f: ~0 R: e3 Q! I4 w

      / U5 h) }8 _0 N; v7 C

    1、标识web资源集

    2、标识角色

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

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

    在 web.xml里配

    2 D/ D  [& _3 {# Z
    • 描述servlet并发问题?
      & Z  v: O  |. j5 ?) b
      ( y0 c+ d4 f  D3 m9 c, y
      # {$ o5 I' `6 T3 c* h

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

    $ o1 j8 B+ ~% ~( I9 z7 H) ~7 Q1 i# J
    • 描述Web应用中的六种属性范围
      ' N) m1 o$ f" Q* f: x4 N
      6 D7 o4 d4 d, ^/ G, [; U
      " _' _; C" s7 w/ Q' F9 H" U) \  a$ V

    局部变量(页面范围)

    实例变量

    类变量

    请求属性(请求范围)

    会话属性(会话范围)

    上下文属性(应用范围)


    8 r& @" ]; K: v4 W; `9 v( B
    • 指出上述六种哪些是线程安全的  ^/ L' u! b7 X4 k: j3 U

      - M' s. O6 Y4 e! p- v
      ! V3 t/ \4 W6 M! h3 E

    局部变量和请求属性


    ' V* M3 [! u* K; U
    • 什么是STM?如何实现?
      - G+ u5 ^* C' a
      2 \* w+ @4 F8 c

      ' a% }; @0 K3 V

    SingleThreadModel接口

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

    4 @: M9 m% _) U) ~5 i) f7 r
    • 如何实现并发管理?; Q8 r5 J1 g. {. @

      3 F, G) l% J7 K% a/ x1 `5 [4 I. @; P9 E, a& c

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

    使用synchronized语法控制并发

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

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

    ! N9 u: n& m+ o
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    13#
    发表于 2014-12-03 12:45:45 |只看该作者
    Jsp
    * Z# ]  Y# [/ }; H$ t6 _: c; O什么是Jsp?: b% J8 Y2 z) U3 y2 o$ n8 P' i! V
    Java Server Page    结合java和html在服务端动态生成web页面的技术
    ' V: X* X$ L1 j, f8 X
    / x8 z' l* t) S; Z6 l/ U ' |6 \  I; o. S0 W. E
    : j, y2 o# f: l4 T* N
    描述Jsp页面的运行过程?
    # p* E* s3 a3 O1 f& Y第一步:) N" F: r" N% d* g7 ~* c1 m) Y
    1 k7 S5 j' f" ~
    请求进入Web容器,将JSP页面翻译成Servlet代码
    & L% ~8 f$ S3 Q4 L/ t
    3 Z+ f4 I( _" a/ b: f& E. |3 z第二步:
    3 E  {' y2 u7 @, v# G
    * x& w7 d. o1 {" ~. }编译Servlet代码,并将编译过的类文件装入Web容器(JVM)环境/ S9 w. {' F2 V

    9 v* j! ?* [3 V$ k) q第三步:
    ( I% a( h/ [" E, q9 m" E% @# C( [* T+ b. f8 G$ m  z2 X1 x
    Web容器为JSP页面创建一个Servlet类实例,并执行jspInit方法  ]3 y1 w/ Y4 R% ]7 M

    / t3 o3 w3 f1 n4 S: q7 V第四步:8 I9 \8 O7 e) w( C* w* E
    6 o* Y" K' O. d# n6 L0 s8 i2 g
    Web容器为该JSP页面调用Servlet实例的_jspService方法;将结果发送给用户. I+ m" \+ v7 `0 a' Q& C
    2 Q$ e) p6 m1 D4 k) v: m: j. F

    . v0 _  J% X" p) J9 i# x2 u! D' t
    + f' e$ i. ?- Y- O描述Jsp页面的五类脚本元素的功能、写法、并示例  }1 i6 p- X3 B% r* ^$ ~# l
    注释 <%– –%>
    % O6 T, ^. D9 E
    2 H; K2 x8 A2 C, l<HTML>
    $ T/ q9 i8 e5 Q" c8 h0 _) }( z% g- U- Y
    <%– scripting element –%>
      I! `3 f- `6 L) Z+ ?
    ) |1 O; ]7 i; P- ?</HTML>
    # m( p4 X" W/ {- E* }0 _# }7 J8 X2 d9 |- v5 t! Z  k
    指令标记 <%@ %> 指令标记影响JSP页面的翻译阶段4 M7 o# g' n; Z4 u; i: M% d

    % g. [' d6 K. u- c<%@ page session=”false” %>
    0 U7 O3 g0 m. L4 G4 |
    7 s9 S9 G/ z7 m& |- @* d- T1 C3 _. l声明标记 <%! %> 声明标记允许JSP页面开发人员包含类级声明$ Y) R2 l5 i* t

    5 j! t8 ~) ~0 H7 |' G# ~<%! public static final String DEFAULT_NAME = “World”; %>/ A9 o" C% @" _' [$ I; V+ Q. w
    : v4 `! c7 L5 |0 e
        脚本标记 <% %> 脚本标记允许JSP页面开发人员在_jspService方法中包含任意的Java代码
    : E% p1 a( o6 F. S6 B1 {3 d8 _$ e3 P5 C# G
        <% int i = 0; %>
    ' Z( I2 Y1 P8 T9 ?2 i; `- k
    $ |2 C8 C3 Z! R- ]  V2 U! s表达式标记 <%= %> 表达式标记封装Java运行时的表达式,其值被送至HTTP响应流 <B>Ten is <%= (2 * 5) %></B>
    ( S& k+ D; d: S/ k) C1 T3 Y- K1 c+ T/ ~

    0 [7 w& c5 u; o" k! ^0 I/ T1 a( u8 V5 J$ V) G) q
    描述Jsp页面中的注释种类和写法1 L; o# x$ G, R8 O+ |
    HTML注释0 \  R9 _' p: H4 v
    4 o& U! L0 i8 G# x9 K
    <!– HTML注释显示在响应中 –>
    7 Y6 ?, l& Y* v5 ?
    1 L: ?1 z7 t" r8 l' nJSP页面注释* k7 M5 G, n; g- p( j( k
    8 G8 u( f) ]7 }+ Y- I; F/ l; X; Q
    <%– JSP注释只在JSP代码中可见,不显示在servlet代码或响应中。–%>; f) J8 R8 s- K2 l$ h0 K
      ]4 k4 y' J& \* @/ D, L
    Java注释
    / Y& B+ h$ v- o1 B6 n6 f% K) _7 c6 Z/ u5 `9 ]2 `8 y
    <%
    , ^0 I# W1 a8 s; T4 J, f' p! L( I; J8 f3 J
    /* Java注释显示在servlet代码中,不显示在响应中
    * |' e& N& R+ k5 n. }0 N+ x) d8 W$ ~
    2 m2 }' a; b3 I3 `*/
    8 I9 K9 v# D, v* K
    5 x. D2 F0 z0 C/ }: F8 `%>
    8 a2 \3 j$ t) Q; V8 g
    6 {* a, a0 R* u. Z; e; N 9 a3 t7 z4 i' v! [6 v6 U
    2 U  m- T) p4 |2 B4 w# ~% X5 K
    描述Jsp页面的指令标记的功能、写法、并示例
    ( {1 r/ Z0 F. N' s指令标记影响JSP页面的翻译阶段
      `: W% A! t  O, ?( p
    9 b) Y( v3 h$ Z<%@ page session=”false” %>
    - [& T1 b& m0 F. c! M4 y' ?' T) N: V* r
    <%@ include file=”incl/copyright.html” %>) |) m7 O* F* U& B& j
    2 j5 U& {5 u; p4 Z8 R, I
    <%@ taglib %>
    $ m! h0 S* a7 ?3 u  ]
    6 c1 }" t) z. h$ \; a
    3 \0 J* ?/ T4 h9 k/ u6 x3 h& V7 S" |% m# Q6 O& ~
    描述Jsp页面的声明标记的功能、写法、并示例- c8 d1 |6 E1 M1 k& `9 y/ Z
    声明标记允许JSP页面开发人员包含类级声明
    6 \; q( ^* N" H8 m4 ~1 _1 ?
    7 w6 C  T/ D  i& J, w- O1 O写法:
    & i4 M6 ~0 Z5 Z2 }) Y0 I0 [# F5 X! o5 Z+ o, K+ X
    <%! JavaClassDeclaration %>
    ( h, V- [  S7 g6 L: c1 n
    6 V; s* v; D: ~3 Y例:. [% {5 r: b+ T2 t/ p
    1 \3 C  X! w' t2 F- Y7 C
    <%! public static final String DEFAULT_NAME = “World”; %>7 H* i( W7 A# E0 O; ?
    9 x2 r6 Q: P! _6 b
    <%! public String getName(HttpServletRequest request) {
    1 F. K7 |( v# ~; F" q0 }/ ^4 P
    6 ]/ N: w% Q3 m; u/ N# oreturn request.getParameter(“name”);
    / @! ~, k4 R' A2 f$ Y8 R3 c0 D( @( ^9 e9 b8 X) s; |1 `$ `" j
    }
    + E- F1 Q7 |9 O4 j5 Z" |# u. b; H2 L" D9 w% l+ U. \) E2 I, M
    %>
    6 a* U: K3 \2 R# i, H& W& h/ t& c5 e5 g5 ?
    <%! int counter = 0; %>
    * H. b/ H6 S" c
    ) |1 T. ?+ i9 O. L
    ! ~6 _/ m) E* k2 j& b6 H% _6 M1 g$ K8 L- \! v
    描述Jsp页面翻译成Servlet的规则
    - q; Q# Z/ F" M  H2 e: v) z. f6 [jsp中的注释标记被翻译成Servlet类中的注释
    " G) j7 H! X1 I7 p
    # R  `6 r3 q9 q4 {) E) x5 ]jsp中的指令标记被翻译成Servlet类中的import语句等
    # u  p2 A$ |6 X9 u/ E4 u
      b" d. g. Y* j. _0 \jsp中的声明标记被翻译成Servlet类中的属性
    $ _5 s& L$ L6 @' t, u5 C6 H: B5 h/ l& m! ^  u
    jsp中的脚本标记被转移到Servlet类中service方法中的代码
      v! H9 q# s) J1 |  A/ L
    ' \8 b  y- K9 B6 F- r8 R8 K+ ojsp中的表达式标记被翻译成Serlvet类中的write()或者print()方法括号中的代码
      ]5 ]; ^4 L4 I1 g, A, y/ ^. R* x" P& Z8 p% Q$ n6 |% _

    6 W/ C( Q2 i1 r4 ~" i. f$ o7 k  e8 D  r- F* n
    描述Jsp页面的九个预定义变量的功能、用法、并示例/ J" e  `% p' Y) U
    request 与请求相关的HttpServletRequest对象
    5 J' J2 n& Q4 Y0 c% E7 N1 ~0 N4 e  |2 H3 P' F' v
    response 与送回浏览器的响应相关的HttpServletResponse对象
    & L, y: v- m6 L% k9 D
    6 O. J) M) n+ U0 lout 与响应的输出流相关的JspWriter对象9 ]0 v- A" D* e8 T4 J. K! h
    1 A$ p5 _& t1 A9 V- r7 ]5 q) _
        session 与给定用户请求会话相关的HttpSession对象,该变量只在JSP页面参
    4 a' X$ ]5 p( i" |, {
    0 o6 R; G) T  }  k与一个HTTP会话时有意义
    6 w8 z6 H3 E, ^6 o! A
    0 H. x+ j( \" G! M+ D4 E( R! g. z0 e    application 用于Web应用的ServletContext对象: Y1 m  V5 l& ?" D* S

    ( z/ g3 s! k  ?- J% k6 \config 与该JSP页面的servlet相关的ServletConfig对象$ V* k, p/ ~) w+ |$ z/ o; o

    ) Z& ?- @% M6 c/ D3 dpageContext 该对象封装了一个JSP页面请求的环境
    * Z% Z8 {- S5 n/ l' }* C% _" V7 d  B) O: w; d& c( S. D4 j
    page 该变量与Java编程语言中的this变量等价* e) x4 x% v" y& D
    2 u- P1 i  l, s8 m# ^) N! a/ ?  r- S
        exception 由其它JSP页面抛出的Throwable对象,该变量只在”JSP错误页面”中可用
    6 q) q- U) e0 T. k0 S* O, |$ t9 r3 t* Y% W
    : |3 s( _, U. X# M0 K
    " n* Q" U/ S3 C* _& X+ l
    page指令的功能,写法、并示例,并描述它的如下属性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding
    3 m1 o5 V2 {" h% P/ B# Vimport import 定义了一组servlet类定义必须导入的类和包,值是一个由) W4 x6 p# [' s

    1 X& E3 ]' B9 C: R2 _' P逗号分隔的完全类名或包的列表。
    + T; I% J. [2 {* g4 Q: B% w+ n: a) C* ^$ `3 \0 H6 M
    session session 定义JSP页面是否参与HTTP会话,值可以为true(缺省)7 D5 s9 _$ M! L- b! O5 q" X3 l

    ) J$ A$ ?& T  ^* U6 x. D或false。; P2 C& V& x& P# n' \# ?/ K
    8 _3 E  [% V4 |& n
    buffer buffer 定义用于输出流(JspWriter对象)的缓冲区大小,值可以为
    ; x! c( q6 ?! ~) a* Y% C7 X6 Q0 d% V. r2 P$ U. S
    none或Nkb,缺省为8KB或更大。
    * ~' @+ J: l+ t9 o! L
    3 ]$ {* l. U9 ~, q7 IerrorPage 用来指定由另一个jsp页面来处理所有该页面抛出的异常3 u4 a% U9 ^  j( K2 j. K+ |6 a0 ~
    3 |& S# P" ]1 G- `
    isErrorPage 定义JSP页面为其它JSP页面errorPage属性的目标,值为true或
    % r! z) s- Z3 l# C; T* V
    . F5 z" y1 x: x. I, u! k' Kfalse(缺省)。
    2 Z9 K6 b5 _# X3 _) K) Z' j& [8 N8 A' P4 I: r
    ContentType 定义输出流的MIME类型,缺省为text/html。! u- x% D; u+ }# g* Y* T2 E$ b2 L

    ! T$ i1 E/ I5 E* d. tpageEncoding 定义输出流的字符编码,缺省为ISO-8859-1
    * L4 q/ T/ K$ x6 x, ~% L' O7 G3 A3 N. w. G; P- `

    ) _. o( V' S3 s+ W( W; `3 ]# P) A+ d% G9 y2 M
    描述MVC各部分的功能?MVC的优点?MVC的缺点?
    ! I2 k5 {$ Y7 W2 P( u" P" y& oMVC各部分的功能:7 y/ {0 S/ N! C/ `. `2 x+ F" L
    - E7 U' _! f  I! A8 g1 [$ j4 w/ A
    Model(模型表示企业数据和业务逻辑)
    7 r7 B- {; Z, v2 ]
    7 t5 o( Y: K: y: d! k2 n封装应用状态
    8 Y( E1 A' Y# W% K# `9 ~# x+ b3 `2 D) X. L
    响应状态查询
    ' ?) v$ r1 U6 O! T! I4 y9 S/ R/ i% y5 V$ z- `; [+ J
    暴露应用的功能0 h5 A: k( ]) e; ~7 E9 ~7 p7 o
    4 g  H( C% J. f" z9 n  b
    Controller(控制器接受用户的输入并调用模型和视图去完成用户的需求)
    , l  l7 Q. Q* w0 q8 e% }, \1 r+ Q- Y$ A' K9 [  _+ i
    验证HTTP请求的数据+ V3 J) q# [/ d* a
    . x5 _6 w* V) _+ n
    将用户数据与模型的更新相映射% z$ x  R/ k) I7 z* K" ^
    . o; Q) G5 r7 m/ d2 w
    选择用于响应的视图$ |6 \; f9 ?1 v7 u9 ~$ _8 n
    3 X# k% Y: \* }
    View(视图是用户看到并与之交互的界面)
    - k, G, g$ h' Y* S# T% K6 ]$ ?* U- h/ f) y& A
    产生HTML响应; T! E% N/ b+ E% K( _

    ! U  _' L: F) [请求模型的更新/ R6 D* Y$ V, J# b( Z" V# G
    5 T1 Q4 W  m) E: l0 G6 s3 X8 ]5 r
    提供HTML form用于用户请求+ |( X- m: [: d. I# D

    + ~9 x  Y- Y/ rMVC的优点:8 e7 ~# R& T0 M4 P8 N+ E* T
    0 K  Z) W+ h$ Q$ a
            低耦合性:视图层和业务层分离
    $ }! g8 J. \3 e! z
      L, P% G* b. C' a% Z高重用性和可适用性0 G. S: l/ y0 o9 K, |* I7 p+ H
    4 `/ l$ O+ V3 h) t+ T7 z. z
    较低的生命周期成本
    * g6 N  O  l/ c( E7 u. m9 S* G- @1 U3 J* ~
    快速的部署" F, _& o1 n5 m0 [8 j
    ' f) U/ M5 T: H4 y
    可维护性0 ~) b$ {0 B+ i9 ^3 p' z- E

    / p) C: X) m! H) [5 [3 R有利于软件工程化管理
    $ w- g0 c6 o; D2 P& P8 x- i
    , F! D  y4 ]$ I1 v: U, e6 q/ R提高软件的健壮性# |. k0 W; R/ P

    & ]: Y7 Q& D# j: Y7 @& EMVC的缺点:4 n- p- I0 w% G

    1 }1 I9 v( B& s( f        工作量大,增加工作的复杂性,MVC不适合小型甚至中等规模的应用程序
    3 ^/ R% _1 l+ y- a, l+ J
    # n# b7 |, w% }  M8 J  L, G1 L 8 u+ @# X) s  l3 k& v

    - R0 b; \& K) s什么是Model 1结构,以及结构中各部分的功能
    ( @$ p$ _% v4 ]5 g; Z结构:jsp+javabean1 d# M' D& k: C6 I0 z5 K' D+ B2 ]
    . R2 g6 \) q; g0 G3 V/ O
    Model1中使用jsp来处理web应用中的视图控制部分* c6 u+ u2 l8 q
    " o; [8 c  e9 r3 H! N
    Javabean收集参数
    % {1 u9 `. G4 X1 `6 ^% l4 E: M5 n4 _' a% a2 B- r5 q" w
    ) z, n3 k. ^! B  K1 a6 a* i3 j
    7 u0 X9 P9 S, a$ _! P$ }
    什么是JavaBean?: ^5 f- G! ^( T) b* F: y
    用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。
    / G8 Q( z, @5 x# P- @6 S9 c4 l' g- Z$ d( D7 b' {

    8 M5 u+ Z% r- Y) ]* j4 f- M  U, t4 q6 M
    JavaBean的规则?
    1 r' p  e, Z2 `$ {1 J- _使用get和set方法定义属性
    % O* _9 ?1 s4 T3 v5 D, k+ x# f( E* T2 S- P. K% i- g0 ~
    一个无参构造方法
    / X8 F8 ^0 i( ^0 N9 n" d0 [& A. H1 @+ i4 ^$ e
    无public实例变量( 所有属性私有化)  t& y; ]/ b: {4 y
    9 S- u# N8 n) c4 ]' G7 L$ w( ?$ i

    5 n+ N9 c3 ], f0 T* x$ I8 h1 `! ?' ]6 R
    什么是jsp标准动作?包含那些?分别都是什么功能?如何使用?
    & o4 z  u4 R8 z: dJSP页面中使用类似于XML的标记表示运行时的动作
    4 n, H+ `2 L* E$ y& b. `! k' s( {+ Y- ]) `! P7 j- h$ y
    jsp:useBean. P2 J( Z- i: B1 c

    - J' Y; s. R0 c5 N. f: a; fjsp:setProperty6 Y, H5 M. w2 j% Q' Q

    7 b# u7 T) v& z( Hjsp:getProperty
    & Z0 V) O" O4 h6 w- N7 g. }
    1 |" v) j) i" H' ~jsp:param
    - D. b) B, b1 {. E# g, C" V& t8 Q$ K7 m& \
    jsp:include( W+ J% f) V- P- L9 F3 y4 Z, M

    . E9 `% ~( ^" P& ^0 c: bjsp:forward) t3 W9 w8 ?2 f1 o, g9 n: y7 h

    / U* A3 l& G! @: v$ p
    3 }2 N' N$ E& x" g5 e+ \4 I8 F3 l
    1 s* K  g% A5 g/ V, n用代码示例如下标准动作的使用:useBean、getProperty、setProperty
    2 E" R, ~$ h1 A  ]<jsp:useBean; ]; h1 f7 Z, x3 @8 T+ T
    % o4 o% U% z# Q4 M! f% l# D& L
    id=”myForms”5 Y) Q5 o& D2 y
    1 N, T3 h  H! g. j
    class=”com.base.mystruts.forms.MyActionForm” scope=”session” />4 _2 m8 c8 X% r
    . h+ }' ^' \. f% k0 d
        <jsp:setProperty name=”myForms” property=”name” />
    2 }$ Z4 B0 F% S; A5 p; }2 ]8 h0 `4 K
    <jsp:getProperty name=”myForms” property=”id” />! u& e  ?+ ]1 l; P# s1 `
    + G  ?4 ^, v5 a$ c
    : R. A. V) m8 u+ R' o; p# o' ^
    2 @5 p) k5 j6 Z: ^" U& _
    描述说明Bean的四种scope
    ! ?) B% }1 ?# J' k" A* rpage5 I" D9 H- Z/ k* q8 n2 r8 x. a
    $ Z5 A: I* ?5 e9 L: H* I
    request
    % ^+ T6 j: d0 K2 `: ?4 v. D
    : ]1 j1 h" d; `. c3 H6 Zsession
    * F* ]# Z, l; `) C/ @  u" [1 W5 Q/ J# s5 m4 c2 F, Q9 s
    application
    " b# z* W" R8 c3 u
    1 e6 J8 B$ T  n( b/ H, i
    % `7 z7 S9 o4 m$ q7 f  P% w* B6 L7 ~& j8 Q$ O
    描述说明页面上的字段和Bean中属性的对应规则
    5 k- y3 ^8 A- _# `! T0 R0 [9 Q; fid 指javabean的变量名$ v! r( E% K& P( J0 e+ t" o! g
    ) `* P/ |# s5 f$ }4 {7 n/ ]! Z$ q
    class指javabean类的全路径
    , Z* W0 `: N1 B* _. A2 ]- [! U6 q
      J( ~6 U0 M. Z0 u. Cscope指javabean的应用范围
    & D' C2 \! n4 U+ {: p$ @% ?/ A1 V+ p" z6 n
    name指所用到的javabean的变量名
    ' F& r7 I) z0 y' m0 }, j
    + l% A- b! o, N) @2 r; \0 x# K. l    property指javabean中的属性+ a& u# @, v9 E

    : m. B% P) i$ F2 P- c& V & U5 n, v- L/ i6 A# A" W

    # K3 [* O3 e% }8 f1 [描述useBean动作的处理过程
    9 r+ ^! o: U9 }使用id声明变量
    5 q+ K0 ]$ v! ?- ]3 Q9 n$ V4 v* M
    试图在指定的范围内查找对象& _- N; ]3 S- g  ^' `% h" {, ^

      m5 E) z/ ~) a/ v: Z$ ]4 ~如果没找到
    # ?! h. Q, G9 O+ Y6 y. a$ T" x+ @0 ?, t. z
    创建一个类的实例
    . @) ^( z& ]' T2 o
    " X, \' j" z# B: d执行useBean标记体初始化对象
    0 m$ k1 n; R2 [5 X- [# L1 s8 X, U2 s6 r' f8 q) n9 ?3 a
    如果找到
    " M  [9 n/ m. \* F, Q
    / |6 d1 }( g5 J# H, q8 i& ^     将对象转换为类指定的类型
    4 w7 T1 ~8 W9 ]7 ^+ J
    ' V& X! l) [3 B. z  B
    0 j# N' B$ G8 }& J# T
    , X3 n: _  W/ P# i: m描述forward动作的功能1 M* l9 Y0 R8 h: L, l' B
    使用脚本代码处理请求时,可用jsp:forward 动作产生一个不同的视图,
    7 f4 R$ i; i1 y& G2 u" F9 V  p
    8 Z+ z6 K0 g; b! R2 x使用同一个request:7 R, T& S& \  u3 ?4 h9 n
    6 Z6 h. d, }! I2 ~% S3 x  H6 j
    6 c7 `2 |6 o/ `: h; |3 P" |5 o/ H; c
    ) ~& h' r6 K' w8 s8 G# S! y
    什么是Model 2结构,以及结构中各部分的功能  t. X: c" [3 S0 r3 Z  [
    jsp+model+servlet
    # }8 G  k* z+ o- L+ s5 y1 x: n! k* O) v% V3 ~2 ~
    Model 2架构使用MVC模式,JSP页面充当视图,Servlet充当控制器
    1 M  c( Z/ g4 U) i* C0 t0 K7 ^: _7 V% q1 t* }2 n$ c2 u$ S: v
    Servlet控制器:5 r; B  f: E' |
    9 F" |# L9 o& z) U: l  H& L
    验证HTML form数据
    9 H9 h! I, q$ |6 @* z. E/ [- I# T* H3 K1 p, ]( p' P9 }2 a
    调用模型中的业务服务
    2 [3 L# X$ e$ u7 Z# t. t  s  F' j8 p* _* Y% ~! p( P1 s
    存储请求(或会话)范围内的域对象9 L( v7 Q( F  q' X+ c6 K% l2 Z

    6 m  W, m. o! Q2 A选择下一个用户的视图1 i. M! V# W( @
    ; \; ?( {8 E) G* u# b" g
    JSP页面视图:% q8 Q4 T8 x6 ^' l6 i8 P
    & x3 Q  T, ~- {% e7 B* J! D6 O
    使用用户界面(在HTML中)% H5 \9 X# T! u5 r  _/ h9 Y& U- R3 d# C

    4 F1 f6 t. Z# Z3 e        访问域对象: T  H) @. q9 \: O

    6 b2 F, P0 r  z% V! z! n0 | ; ^7 B5 f3 e$ @7 e, ~  G+ G
    ( A; E/ ^* E5 G: u7 m
    如何获得分发器?分发器的功能?1 s( P" H1 \. T/ m8 F! m
    上下文对象中的分发器:
    6 p9 z  @8 z2 f7 Z+ {3 F0 z) r0 m2 d# h* ]4 p! j% {: i
    ServletContext context = this.getServletContext();
    . l% ^* }; e. C% U( f7 o) q* ^0 Y/ H5 G
    RequestDispatcher servlet = context.getNamedDispatcher(“MyServlet”);6 G1 m/ V# `" h& ~+ g$ ]
    1 }/ J9 m& A* T
    servlet.forward(request, response);
    ; k# w, I8 x( d4 _/ v
    & }2 R$ v' W1 F9 c; k请求对象中的分发器:
    9 x+ B& P7 P! M3 y0 B
      n! H  J( e8 \3 K8 u7 Q( D& LRequestDispatcher view = request.getRequestDispatcher(“tools/nails.jsp”);. O! w2 w& U0 M. x2 y

      B1 \( {1 v: Y% T6 n. G1 ]view.forward(request, response);2 E& e$ ?* _6 z3 H" R
    6 f. _, Z1 ~$ }, x* m! f
    可以将请求转发到另一个jsp页面,并保持请求的传递性
    " v% |0 G# }9 B. [" X
    : ]" F3 N  v+ u; R* ~
    8 B8 k6 L6 s. M2 d6 ~8 f; d- R
    2 ~2 L7 S$ ^! U# z, RJsp中页面跳转的两种方式?% F) s3 Z  y8 S  H1 }$ @
    使用分发器跳转页面
    1 \5 R8 N3 l. h. O2 tRequestDispatcher dispatcher = request.getRequestDispatcher(“url”);: E( K/ d0 l: ^: E8 d: S) E
    . X1 R* w- z$ F' N, D% u
    dispatcher.forword(request);
    : v) W0 p/ A4 M  v4 N& F9 F) Y# Y( r/ D5 M4 t
        特点:保持请求的传递(上一次请求中的数据,在下一个请求中仍然可以得到);
    ' Z7 N+ h) @5 d) |! b* u7 r. F- ?
    ; w' k- X- H5 N9 |        转发的页面只能是同一个Web应用程序的其他Web组件8 y+ V2 i' Z+ o& j) \8 D  n* ^
    * d$ z1 d" y3 t  |2 Z  z
    使用重定向跳转页面! [/ `8 D  d5 g6 \! q/ C
    response.sendRedirect(“url”);' s4 j: O; `' ~- ?( x# s) Z/ t/ I1 Q. W
    : G9 s4 U& o4 O; u
        特点:产生全新的请求,(上一次请求中的数据,在下一个请求中不能得到);
    7 b) {! Z, u* E0 v) M/ @: w3 Z0 J6 x/ g& R- \& b- c5 h
            重新定向的页面可以是任意的URL' l$ Q) l: Q( u0 V

    8 v1 i( A/ a" W7 b/ U8 |$ u3 Q
    / u! K) L$ r5 m! I( m, G
    + K& @" |: r6 h描述Jsp中引入另外页面的两种方法,并比较两种方法的特点?
    ! _, C4 J' H5 s$ `+ W. K0 t2 i<%@ include file=””%> 在编译期间把另一个页面完全嵌入这个页面,可以说是一个页面4 ?6 ^4 J2 g. y2 ?4 L+ U: U! h
    1 z0 D+ ]$ J! l: D$ [4 O+ E1 u
    在这里可以共享变量
    ! C. W4 U4 [: y, I0 V& P& Z$ A- h7 p- |* i( ], J) B/ w" M# A
    <jsp:include page=””> 动态的再运行期间把另一个页面加入这个页面,可以说是两个+ g: B% ^* [4 E& f! ?
    & ~) S6 I: @6 j0 B! ]
    页面,不可以共享变量
    $ N% A; \* x5 m; d2 M$ f
    ( G8 c. ]- ]; p
    ) \6 Z/ R) s/ s; n& [$ B% \8 C. M
    什么是自定义标记
    / c% Y: z* i0 [2 G' @自定义标记库是一个Web组件,3 N/ b) V3 d: _5 G4 j' Y  N
    6 A7 E2 q- D: G9 }8 O- E/ M
    包括:9 ?- o- _$ O$ {# X6 {6 t

    8 B& w) g+ n9 H/ j# ~5 Q: p1 J" m6 _一个标记库描述符文件(*.tld)4 X0 K( T8 l1 m* }

    6 I$ R5 m5 \6 Z6 x所有相关的标记处理器类(*.jar)
    5 w3 Z( _/ f" R+ Z
    9 u9 b3 p) w* V * V/ ^# a2 p2 D6 t7 `+ s  t

    # Z; ^/ M; x* s) J, k0 [1 Z描述使用自定义标记的步骤,以及每步详细的工作
    1 O7 J1 q7 V) I使用自定义标记前,要拿到.tld和.jar两类文件* }6 S$ s, T, X* ~& \8 k6 y8 j
    % g# ^& }) s# x& \6 J: t: `
    把.jar文件放到WEB-INF的lib里面。2 \0 ?7 P: L+ b6 a4 X% e7 M
    把.tld文件放到WEB-INF根目录下。7 q( {7 N# G+ `7 f
    在web.xml中配置。. c$ i2 h1 O  E3 i- i5 ]
    <taglib>; h% t( ~9 X. N; X9 W( S

    4 y6 n5 P7 D9 B( [8 u<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
    2 i, J4 X) j( K
    $ Y( R; u9 w: q7 n& n     <taglib-location>/WEB-INF/c.tld</taglib-location>
    8 l* S2 \8 C5 ^: G$ K" p
      r0 R  G. Y& U# V7 G) D: i</taglib>7 _) G/ m( C2 T

    , I+ P6 [0 v3 [( ^( C在页面中引用。
    ( l1 D7 m- S) `3 v<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“s”%>+ K: \4 i' E  |2 n

    6 u$ k0 y, a& ^2 O& L9 n$ }uri必须与web.xml中的uri对应
    : i9 v2 p' Q% e/ L, k0 g" B1 v+ P
    prefix是前缀,用来区分是哪一个taglib
    ! `5 ]7 A9 S, O. z* o. k4 K% B3 Y3 A
    使用标记2 i: ?5 ~8 t) m" P* J: X1 T
    格式:<prefix:tag名称 属性>0 k, X+ n" D" ^# a" Z

    ' v# G: Y4 X7 ^<s:forEach >
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    14#
    发表于 2014-12-03 12:45:59 |只看该作者
    在tomcat下配置数据源" w8 [- M8 R6 x3 T/ {4 I4 j
    1、服务器与数据库的连接7 F/ c+ D- o% s( G; }( V
    3 V! ]% y, i- @- ^8 j
    配置server.xml文件) M* ]& p+ f9 u' T3 v. C
    ) ], N* N0 C" s' o% a) v# [
    1.oracle
    ( l( N2 Y0 F$ T8 ?
    ( B8 T8 d( I, T3 v0 v7 t( _/ F<Resource name=”jdbc/company” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
    3 q8 b' j+ b; p# N- J" H' }5 i! L( E2 G- P0 F4 G
                            factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”
    $ @* E9 d- {- q1 u; F2 n( j  u6 `$ q) p6 ^0 M9 z% e
    url=”jdbcracle:thin127.0.0.1:1521rcl”
    # R$ `# ~  A# x5 f/ d  P9 C# _" Y; ?" ~' J) v3 n
    driverClassName=”oracle.jdbc.driver.OracleDriver”, F+ X+ p: ^- n# z5 e- @$ l
    1 k6 f- j0 g+ ^# E: O
    username=”aa”
    , h: J; e. C* `; t1 S2 |9 M+ p9 A# e6 j% v- @* g, N- {! N
    password=”aa”
    6 r7 R5 y4 Z5 l; h% D4 q
    7 p' k4 b' k3 ~" _" Z; \maxActive=”50″- r; \" n9 t* P+ @. L
    / c. v  \( l) R. |! d1 _/ L5 v
    maxIdle=”10″6 Y1 D& a8 ^* b' y
    6 k* b3 B/ {1 _1 r
    maxWait=”-1″
    6 o, W2 ~: Q6 ^0 [9 u4 z
    7 K& H, d7 y, E  ?: J2 `/>0 `: u( _: B7 D$ P

    $ ], j2 R9 b* `; u4 G, a% Y2.sqlserver& J5 `+ F: D8 `, u- ?8 b

    7 P0 ]! r' L) _" m<Resource name=”jdbc/webpage” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
    9 y1 q6 h7 `$ b8 L" E. I. t/ d- y6 ]
            factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”4 a7 f+ q$ A2 f5 Q5 X: t

    ; ]+ O- k( i+ b" B: c8 yurl=”jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;1 I  n1 l4 C( N" [
    : A3 o# R) b. \& Q1 ]
    DatabaseName=webpagetest”( Z0 p  X( c2 U4 a0 m2 I
    ( B4 ]6 V! j4 N4 p) t$ C5 P9 z
    driverClassName=”net.sourceforge.jtds.jdbc.Driver”
    7 t- O2 z6 o  A! U, D
    # T! h# m# \# susername=”aa”; Q3 n3 j4 T. D! ^  F* T

    # ~' h% |" L- V6 @3 G3 O  e+ }password=”aa”, ^, u6 q' G  \& G% I
    ( z& b* t1 n0 C6 D6 S/ e8 G
    maxActive=”50″
    ' c$ V& F1 Z1 a% i1 x# _# g+ w/ [8 @; n# b5 i1 _  l% S+ v" C
    maxIdle=”10″5 y/ K0 C; r9 x
    $ V' h2 R% @9 p: S
    maxWait=”-1″
    + h8 s( H) T9 {5 t, R
    " z* t' J$ _' C/ R% x4 [/>) W8 |5 g# a  Q# G& m

    . B& A+ w9 F& b  G1 j! T1 Y2、配置自己的web应用的xml文件
    % l. Z0 S% W% B" P
    . M1 n8 r. G' X7 E
    - |+ l1 x5 a) }" }6 d% ^8 z) ?( f1 d8 ~1 a& V0 }8 h
    <Context path=”/eb03web” docBase=”F:/workweb/eb03web”
    # @1 E. A2 v- b1 x& n, ^! o2 }( C* I+ H" D
    privileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>- H* q! W5 u2 O6 ~# M" c
    / C* N" [9 ?- e$ o
    <ResourceLink global=”jdbc/company” name=”jdbc/company” type=”javax.sql.DataSource”/>
    % }* w5 Q* o7 q: y: H: @+ ~3 u& M2 }+ u) q- [) u' o
    </Context>
    ' `: }2 i$ \' k/ L$ ]2 d% K' `) {/ ^- ?3 m8 _$ R* i

    ) I2 m5 S; s0 e9 D* g4 |' Y5 [
    7 m, q1 W; H3 O3、配置web.xml文件
    1 _+ ~  K6 U# L% y; {; r4 T+ ]( G" L% F  i! s; R3 \1 p# f
    与服务器建立连接
    + s7 F$ i% H5 x9 f7 B8 h) I5 M5 M& H7 }- h4 X
    <resource-ref>
    ( V1 s" g/ O4 ?0 W! H1 G$ C, t  \; R7 d( `( Y9 m; c7 B0 @  r# Y
    <res-ref-name>jdbc/company</res-ref-name>& d& b+ _( y$ }8 I' b" `" v
    0 j8 I/ P& q" U) U
    <res-type>javax.sql.DataSource</res-type>
      Q( H; k9 ^2 V8 U: A( ^2 |" F% Q! L* X
    <res-auth>Container</res-auth>
    * Y! ~- t  ^, `- r7 J% y% h$ E1 ^
    * h' c. g% j$ G5 X</resource-ref>  N5 [* n4 w2 ^/ ]! v; o4 K
    ( L0 Z5 T' G, _- w0 C3 y
    4、在应用程序中不直接与数据库连接,通过DataSource连接池建立连接/ _3 h8 X0 o! I' J
    7 v  f% N+ f) c9 Q* v) t1 M( o
    //1.在程序单独用时设置系统的属性,在tomcat下可以不用配置,. {' E7 N- D/ [7 _% d

    # r: u3 |' b) `4 O1 r' K/ oSystem.setProperty(Context.PROVIDER_URL,””);  X8 H, t, g- w- b
    9 _, V& u" v( r% h0 O
    System.setProperty(Context.INITIAL_CONTEXT_FACTORY,””);
    . e/ p; r; n: |8 l8 {3 q; u7 L
    9 g6 x9 K0 m0 g; }; s8 A/ O//2.创建一个上下文对象
    , N  F* |% T/ d- ^
    8 \- G( J7 C1 H0 {7 }9 e" c9 f7 ^. UInitialContext context = new InitialContext();* ]+ x' L& P# g( x, e
    ' X1 N/ E, A/ K: H9 z; W8 j
    //3.通过上下文对象在连接池中查找DataSource6 c+ W, P* r: J/ L

    6 h. I  i; e( i, @- x7 VDataSource ds = (DataSource)context.lookUp(“java:comp/env/jdbc/company”);$ N" `8 h, J, Y. m
    7 _! C  ^6 q0 f7 D8 c4 b
    //4.通过数据源建立连接
    , h& w' i) J& J( X3 q$ M. c; ~. C( L/ o3 Q; M
    ds.getConnection();
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    15#
    发表于 2014-12-03 12:46:30 |只看该作者
    ORM对象关系型数据库映射
    % w+ {& X& u; M2 {( A- l(Object Relation Mapping)
    1 W1 w0 ]' A" V5 Y* m8 o9 x  e8 ?  y6 s% |& c3 ^* Z8 y
    一、映射的特点* u4 g0 C, f6 l0 d

    + m. C- n, B0 O! {4 [0 @# t1.一个对象可以对应多个表( T9 O; _" G* \5 ]1 r

    5 a+ `( Q7 \) w+ X' @2.一个表可以对应多个对象
    ; B- ~& T- a6 T$ [% M# {( ?% e
    " W" x! t8 K3 v* L2 R3.对象和表的关系不用完全对应, P3 F- U9 X& l4 ]5 U# y$ D4 g" B
    + f8 e9 T$ T) p; V
    4.对象的属性的名称和表字段的名称可以不同
    ; ~1 O$ y/ N9 t0 D. y) v$ w
    , m3 B6 J6 m2 \& F. ~) ^5.类型可以不同,但数据类型之间可以转换" s% T! N6 z. U1 b  {0 G

    7 J5 [6 g/ E& [6.对象中必须有主键,数据库的表对主键无所谓
    - X4 j+ l! H. H1 Z
    ; K5 J9 S" Y* m1 O" U; W7.数据库中有主外键关系时,对象中可以有,也可以没有
    # h) k4 t& G2 P5 l! i, m3 h! r
    9 }8 C! g6 k: p$ a
    / m- r7 s0 r4 o; |2 N( A; x" I8 |
    1 g6 X* K1 a( R二 、有一个映射的描述文件————>xml
    % T8 a( o" d/ v" K, {7 n% {7 |+ ^0 ?3 Y$ j( ^' A0 Q6 R
    三 、怎样实现描述文件————>一段程序# L, i6 m" Q; j- z

    % t- Y, r, y2 H; z3 L对象 映射(mapping) 数据库; {; M7 z  B8 q& |- X

    4 Q5 V/ u4 n: nuser
    0 B; U) T" \9 W8 n( b0 ^. i; m0 J" M3 ?
    id=11& h! j" k2 F( o

    9 k/ r: _( p: d1 p: u% w- c- ^( }name=”张三”———— > (1) —————> tbl_user(id,name,age,tel,address)
    0 D* Q- m! R! O/ E4 b
    / Z+ g; V. x$ u  Q& i" @- o; {age=25 <————(2) <————- \. z, f% ~# a, Z! A& v/ J

    ; l7 z* x$ o% g' O, v7 _0 ]0 o
    ; a) _/ l) `- s' I9 A4 D
    ( ~# w0 Z  \2 t! A; ^(1)从对象映射到数据库
    $ B; ^, C1 k4 ?/ u0 C- z' T  ?4 @' C' F
    1.JDBC. X9 d5 B' R+ M# z1 q! p7 m( C
    / H2 b! b, u/ Q  M2 i. ?( ]
    2.根据描述文件来动态拼接sql- j- I8 `' V* ~# f( a. ?- x

    # M  T7 w6 ]. A; M3 i3.执行,添加到数据库中* J! V" C+ v; p# I, n  m* b9 f8 L
    % W$ J8 G1 M: }

    - q8 J: w1 O- _& K( k9 b4 A( _- o9 X& y4 d' \: z' K2 {2 H
    (2)从数据库中映射到对象
    : ~4 |% E; b& P/ l* k
    ' @4 H+ ~8 e/ L, p1.JDBC; ?2 Z& T7 ?3 b9 b' y+ w- H/ k

    3 R0 d/ E1 k! C5 @8 k# v8 F" D1 i2.拼接查询sql
    : i4 s1 F, t( T6 S5 O, `9 b8 v3 }$ m* O  c
    3.ResultSet
    $ h5 o* I( \. S( h/ a4 r% ?# a0 f
    / ^! G4 \( a* K: y8 R4.Model
    ' r5 P" F+ t* i" N3 L1 A# B1 \9 ^1 I' O

    : ]/ |; X, |8 g7 F. ^. X. l9 Q$ c$ N# p/ s% z
    hibernate
    + L0 M/ [' v4 I2 c3 e* ?6 c开发流程:$ }& a, `2 [( F$ n
    1 H: R! c  r  o% B
    是什么?
    / o/ m! e+ Q, n0 d4 Fhibernate是一种基于orm 的轻量级的框架) A/ L: w7 W/ N7 s5 \

    / o' x3 p' @4 T" n# A
      _! u  O& G7 v; U/ X" M$ Z' r/ r! U2 J2 O, \
    有什么?
    ( K0 b! A, O* u3 S1 V% n* B1. session 保持连接状态(依赖事务和连接池)
    * t+ B5 m* q! M) J- d, P( k$ K; ~$ d2 o* {
    2. Transaction事务4 @" w) s/ X8 o

    6 U/ ~' `5 s+ D" l3.9 _% R- R" q/ u' P/ r
    Connection Provider 连接池" X6 \6 q! s, V( a) S4 n
    8 C5 O8 b0 ?3 k3 r% @  I  |8 q
    - E. |; o1 l) j+ p2 L. _& m5 @
    ! L0 H1 G3 w! Z9 D% x. M& u+ g
    能干什么?9 W3 z, O0 T+ W
    1.orm6 S+ j4 Y( p( k+ C. \

    . e. U$ F7 ?4 U2.提供操作数据库的接口,简化数据持久化的编程任务# i9 W; K: @7 n4 ~

    . d+ p' }5 l) j$ C2 N
    4 F# P% \# H3 G8 O- \: E0 h. w
    4 q, C! y4 w: [% }怎么做?
    ; _5 \5 u( v( r6 ~& E& H  `1.搭建hibernate的运行环境,将hibernate的包和hibernate所需要的包拷贝到lib 文件夹下# G0 A9 q4 s+ I# I
    . w4 G" B( n! D9 t8 w
    2.O(vo); P' ^8 ?% j7 X; Z. u4 ~

    # G; p# ]. E) a7 d, P/ s% A2 m( m4 ]+ a* h3.R (关系型数据库中的表)
    + D4 L$ s: E6 \  b, B* S8 ^: B
    2 |) t  R+ _  @2 y; X- X( s8 b4.配置文件' _3 q3 P& f+ p, \! b

      ~* o$ ~" t0 I, J' x9 @5 x- u( ~4 `4.1 cfg.xml 放在classes根目录下,默认名字为hibernate.cfg.xml/ p1 I, N% C0 H! U/ j

    ! t: y4 W) i! n& La.与数据库的连接
    7 @( U2 V$ m: Y, @  J9 e; \- p
    . A; h- J9 y6 h# o. D$ db.可选配置
    2 z. q9 x. R' N2 N1 ^- ?$ f) N$ `8 U' X* X- f8 G: P9 Z& p% r" d$ E
    c.映射资源的注册
    , V  T& Q2 {0 X- o' Z. ^! E2 d4 I  s1 q7 R
    4.2 hbm.xml文件 名字与类名相同 并且与类放在一起# n) X+ G& u6 k- U. O. F' @0 M0 \
    5 v  I# e  y& x; w$ E  p
    a. 对象与数据库表之间的映射
    " z2 R, J+ E* T" m
    % e9 V7 n" Y2 A5 A3 a. Wb. 对象的属性与数据库表的字段之间的映射
    0 Y- r4 S* j7 B' X
    5 x2 S. W% Q8 u# G6 kc.组件之间的映射: v. n7 G  [. ]- f* V

    : t0 j, q7 ]  Y! _( ~) m1 Qd.对象与对象之间的关系映射
    . R0 l/ J- Q$ d- J; v# ~# H
    0 B: @) K' x, p- {' H$ h+ U- f5、客户端
    0 W- Z3 Y# m; U# i0 C- a7 U: C
    & K4 y( a+ \  v1.得到SessionFactory% U, h  N+ |% A0 k

    % K9 ?" M- y$ V' R. N: p2.通过SessionFactory 工厂来创建Session实例" d( g7 V, Y% }- f  }8 {1 i! g0 E* }

    3 l. m; H, c: N% G$ d8 P3.打开事务" e/ ?( K' g/ m/ ^% E
    2 [" B  `; I- L6 U5 c! U% v
    4.操作数据库
    # T3 r+ b$ E' }* M. X7 K2 Q! m. j- |" ^( h4 ]# j0 ?: S$ O
    5.事务提交8 [2 [, h* K* n" K$ Q  i

    ( L5 D$ }% s0 p% ]+ ]* X1 d6.关闭连接$ |& X( M. J' G; C% r

    1 U3 Z; h) @: X运行流程:5 I# G3 [2 p5 M* E) T

    6 H) w6 M3 P6 j, V. Y; y# d整体流程
    + S) f2 R$ y% P3 g1.通过configuration来读cfg.xml文件, I" B9 b5 \) s0 ~1 [
    1 T' `/ ?: T  r: d  }, j' y
    2.得到SessionFactory 工厂(根据数据库的连接来创建sessionfactory)
    ! T$ Q) Y. Y7 I) Y3 i4 m) a1 ]$ [' k. g' {( v0 ]
    3.通过SessionFactory 工厂来创建Session实例
    6 C% `# W; _( A0 z0 E( M3 L/ F% `* p- P0 y
    4.打开事务
    - j  z" B, t9 L( F1 s8 N" G
    & O6 `" v2 }1 z( u5.通过session的api操作数据库
    ; V, K4 l6 y3 P/ m# z9 c' w2 t) _1 t8 Z0 G+ m
    6.事务提交# y/ N! ?, ~- x0 G2 G. b
    " M! Y1 G( G: Y9 q* h" a' f6 b
    7.关闭连接4 g& k  B* X, o
    ) z1 k! U* P% e) {, V  N8 ]. S

    $ O# N, Q0 J! }7 H" R9 O! ]- D0 o% i. P0 ^  c7 K  H
    save3 l( ~5 ?' x+ @% a  C8 c* @  l
    1.to—>po
      n& f3 }  f& E7 v' s% g+ Y+ P7 |6 C) L
    2.根据model和cfg.xml中映射文件的注册来找到hbm.xml文件
    + l5 K0 m# v  h/ F/ P. f7 T6 h" d+ w& X7 m  j* F7 B4 Y
    3.根据hbm.xml文件和model来动态的拼sql3 g+ E6 [2 l* V" p" K+ [
    # @$ [$ X$ G3 [5 i5 }
    4.客户端提交或者刷新内存
    + _2 j$ Y) X8 x  m* P1 r) `& O  J7 t9 W+ m
    5.执行sql,值放到数据库
    , a# L" v. c4 t; u8 X8 T) v- t
    # ~* |3 s8 t( G
    4 u! |8 H5 m9 E. a% g: Y+ `; e3 J9 e$ B3 C
    update、delete
    # }# q$ W2 j% g8 f, s; h* \1.根据model 的id在内存hibernate的缓存中查找该对象
    9 K( n2 ]8 R8 _- d, z- S; Z. ~
    1 e+ R/ O7 ?7 J6 Y如果内存中没有就到数据库中查找来保证对象的存在
    6 [' N3 L5 t- H+ Q. {5 U
    , \5 U* p# P" f2.根据model和cfg.xml文件中映射文件的注册来找到hbm.xml文件
    1 ~# d. k, ~5 W( C  Z( }
    ) ?6 y- d; o7 q0 y3.根据model和hbm.xml 文件来动态拼sql9 n* c/ H/ z- X0 j

    $ b. X+ ]4 z* K1 B: H4.客户端提交或者刷新内存
    8 G' g9 L4 U8 h2 S! T
    % K. P9 B. W( |5.执行sql
    9 p: B  L( p' L* W. E5 U' Y( T7 q5 l* D% r

    8 V6 F4 I  m( U$ b+ ^# r* s* r! {) L# I, g, B' A7 k2 E5 ^
    Query
    2 D6 A8 r- ]5 mload
    . n6 D$ b9 ]/ ^$ `' g* z0 j4 K4 N& u. P3 x& i& R7 O6 t: X
    1.根据model的类型来找到hbm.xml文件
    - F4 K) x0 T; U! Y
    : {5 ~, d2 @0 w2.判断id对应的对象在缓存中是否存在,如果存在,就直接使用,如果不存在就进行下一步。
    8 {( h$ [$ b5 c) `* P4 ?
    9 g7 Y! j/ e; ~8 `& A3.用id做为查询条件来动态拼sql1 h- p5 o/ m9 A' y9 [
    1 O7 X& Z3 q$ `6 }0 n5 N
    4.执行sql 查询(先在内存中查找,如果没有找到(会抛出例外),就去数据库中查找)# P3 C( i& w9 s8 B

    3 }( i8 e9 O: C: S: i) V5 h5.返回一个model类型的对象
    * Q: D, v$ o" o" g$ U4 s! s% u% m  W. J0 L, t2 i  W
    get6 Z0 U9 Q4 a2 N1 }0 |$ c) S
    8 j6 D. f( ~& Z  x
        1.根据model的类型来找到hbm.xml文件
    # w: Y+ k( s8 l0 B, Q2 M7 V! |0 }* R) E- d
    2.用id做为查询条件来动态拼sql
    9 Y+ Z& w/ H% O  s6 S8 {9 S. A2 [# s1 G3 ~; l7 D& @
    3.执行sql 直接在数据库中查找,如果没有查到就会返回null, g: h; k9 V1 @; t/ e
    ! B1 w4 f& A4 r2 H" p5 j" ^# v
    query
    % t+ B) A% j" Z% ^8 s% I) G* ]0 t( F. W* P  @: G( A
    1.分析hql语句,得到model的类型" k4 X. {+ y3 Y+ O7 b
    % H& d" a: M5 x' y9 D. e- p
    2.根据moedel和cfg.xml文件中映射文件的注册找到hbm.xml文件; d9 g$ _9 ~" p7 i+ P! y& N7 f

    ' _- o1 z6 X0 T1 I0 ~3.根据model和hbm.xml文件来动态拼sql
    5 w: w- K2 p8 _6 Y: r+ m3 _8 ?1 V( Q
    4.执行sql查询数据库9 J. X' t% q* r

    4 C8 J, n/ F) q& V4 `( ]& D, ]& o5.返回一个resultset# }, ]9 \4 y8 Q# P) a( ~

    & L/ ^% D" F1 O' R& J( u- z6.循环resultset的值,放到model中在放到集合(List)中
    9 M# w% R2 w, Y# C: f; Z& x/ ^: G, }9 j

    . s! Q: N4 V. }) S4 R8 l6 K9 i( d) H8 M% z
    谈谈hibernate缓存机制2 P$ O6 i$ j6 i' w

    . Z" s( E& Y0 y" M+ @8 R4 S缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了。打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去数据库中取,也省了很多事。
    ) b7 {; ^  Y  c, T2 T: \2 ]! l& K% O2 [3 F: r# _" E
    & y* g2 c; \" [* z, Y
    0 M, v! z$ `2 ?6 P. l+ G
    hibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。
    5 j) h7 z4 A0 b* e
    0 b# v* m( D3 ?
    & v- ]0 q# N3 ^# M% L* Z7 C# ?3 `; X$ L' W) w8 \% m
    对一级缓存中的session事务进行数据的预存取,数据在各个session的上下文中存在(单例),当session关闭时,就是session.close( ),整个所有session范围内的数据全部清空;二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二级缓存只有一个区域 ,画个图比较容易理解。
    ) S  w1 m( Y* g  h/ v  R" y6 o+ v4 ]( h& X
    " D6 l, \3 N: W2 p6 Y, s0 \
    . ^$ M2 L2 L* G2 _( z& N2 ~3 r
    | 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|
    " {0 |. ^% @7 o8 Y. i* h) v7 \3 E  x  \9 ?* w5 C. h# M2 f
    | | | |
    8 G  p2 y0 I& r
    ' N; i8 y, D) G$ E: \3 V: c| | | |) D+ ^2 @; G( n
    ( g7 `- i# o/ d" |# v5 `4 p/ v
    —————————————————————————————————
    - D2 ~$ i5 q* w8 [% V2 H- H! r% v( U' ^* Z% K/ R& ~. [3 L
    sessionFactroy级别的二级缓存) |# \/ U* u4 T6 G

    . t& Z- {6 `2 D——————————————————————————————————————-8 ]( w- o6 s0 }. l  P) B* j/ A
    3 k. W" r) Z( H5 Y' H2 k
    |
    & z+ Q8 J9 q6 p
    + V+ O1 D7 d3 T+ O|0 d% [9 V/ s% W+ U$ W9 ^

    . I1 i3 E% h) s( k|  q3 t1 C/ n8 }; e4 Q

    % y- y- g6 J6 H( J——————————————————————————————————————
    8 b) M6 b$ Y" f  r
    : M6 r- T! Z3 _; X* x$ P. l' e: {DB
    1 u8 f0 R7 T- a& M% c. e8 C
    % v! y2 n+ y- K! w+ W2 ?6 k; j—————————————————————————————————————–, v3 v) n/ W2 [/ W9 {
    1 v0 Z, ~* b1 p8 c
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    16#
    发表于 2014-12-03 12:48:12 |只看该作者
    Spring
    / n; {: b& A8 M; n
    • 是什么?% B% b/ j: p% G: b' i3 \7 {2 u

      8 V9 O, y( ^. Q7 Z$ N4 B1 h

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


    1 B0 R5 l! l1 I# `, `3 g( H! h
    • 有什么?" g* c6 O9 R9 v8 v

      % q6 L9 V3 r9 d7 |% ~
    8 c. k4 T: ]9 R- m' c

    每个包的功能:

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

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

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

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

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

    AOP :面向切面编成

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


    : h) Q+ r* n, B9 x3 J
    • 能干什么?
      ) i: O) \8 \" D
        l5 L* }/ f  `6 h* G9 k+ }( u' _

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

    3 b8 p! e- U9 h( Q
    • 怎么用?
      $ ?# R. E1 c) D$ [% h4 \

      , U8 x6 J0 y" z4 u9 Y0 F) t
      • 搭建web工程,引入spring的jar包, k2 v" k1 T0 N& m& {
      • 在web.xml中添加如下配置7 V: \" k9 v) o; d" }$ O8 T  e& _
        1 V% s- H7 P7 r4 T, \  e
      " l  `* b% m4 x

      3 F) r! I" D" u& ^+ k) a1 N# f

                contextConfigLocation
    2 C  n& r+ d5 p& }1 a2 g

                classpath*:applicationContext*.xml
    " H/ Q! U2 u9 e' g9 d

        3 K, U/ }9 |5 D$ L% I# Q; ?

            
    4 G5 F6 h1 ^0 J6 E

                struts2
      ~$ c) @' J: e

                
    ' G; U& W, ~3 l8 ?3 o1 D# I7 C

                    org.apache.struts2.dispatcher.FilterDispatcher3 Y, A9 \) V: X( j6 E$ D

                
    ! L' R8 X# d- [2 p* c7 `

            
    ; j* r8 a& \. t

            
    3 A* S. m3 p' s& e; {

                struts2
    / p, N2 x6 h# w# d

                /*
    5 J8 D  A$ r+ |; P9 u% g

    5 c# r4 K2 S( S: v

    1 ~/ K  j7 `. N( q

                
    6 W8 N; d% U6 Q  J* P# J" X  ~

                    org.springframework.web.context.ContextLoaderListener: k, ~" a( a6 f4 E7 e

                
    ; j9 R$ K8 a: K0 k! S

            

    • 部署, ?: H' k- \! c" u& f

      3 |/ S% ]9 G$ G( |9 ]
    4 T0 b6 m$ `( Y
    . m/ Z+ d6 ]$ @& W1 M, _& i2 u7 N
    6 p; I& [4 V0 b$ B# }5 u  q3 d& B
    • 容器和bean# L' v, u8 O, h

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

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

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

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


    " l$ a+ E  j8 _' }/ L1 H: B) g
    • IOC控制反转. e- z* b% l! Y4 T7 \4 ]  N' M% w
      1 P' @- s+ A' B9 a

      0 Y; }5 l* V# |5 f% p  ?/ V 7 r, j+ ?+ p% f! s; w8 F7 x
      从前的应用程序想要得到A的实例他会直接主动的去拿,当用了sping后,应用程序由主动的去取变成被动的等待,由spring来控制应用程序所需要的对象
      / Y! V, _4 C) W  A
      • IOC的优点( z5 x; x0 G2 k  u9 U' _
      1.可以通过IOC来获得实例
      2.可以通过DI来获取注入的资源
      • 配置IOC的原则
        4 x0 W0 j1 G/ C
        • 一定是可变的资源才采用依赖注入
        • 一定是层间的接口或者是模块之间的相互调用才采用依赖注入
          " v! v7 z7 J' u2 Q; X

    8 M' t: D8 h  S5 M4 \) Q; u7 v
    • DI依赖注入( R6 ?: u1 ^3 a0 `! W8 R& S

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

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

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

    例如:

    在配置文件中


    / s& T9 m8 r/ @$ p# a; E7 w) _6 G5 A8 U: y

    : S5 A8 F( T3 S0 q

    在应用程序中

    Public DBDAO dao ;

    Public void setDao(DBDAO dao){

    This.dao = dao;

    }

    3.构造器注入


    6 g* G2 Z# {  w9 @( u% Q: P& F

    4.ref 表示参照其它的bean

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

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

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

    6.lookup注入

    7.singleton

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

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

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

    8.DI的优点:

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

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

    : D' y: Y9 O0 Z" v0 ^& _
    • Aop面向切面编程
      1 N7 d8 t4 e, g6 t6 J. A. Z% l
      / i8 k2 [. d9 x+ F' \' U  Z& L3 W

    1.AOP面向切面编程 一些较好的模式或者是示例—-范式6 ^+ D% |- k  J& |- M7 M

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

    2.AOP的思想: 主动—->被动(追加功能)
    1 L1 I9 N& \3 D) ?$ A/ a, p

    3.AOP 的概念* \+ S( L# k5 @5 n: e8 V: n( T

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

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

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

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

    5.引入 :扩展的功能

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

    7.aop代理 :实现机制

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

    4.AOP的事件机制
    : _, M& Y+ `$ k

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

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

    3.找到切入点

    4.确定连接点

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

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


    + b, D! t1 v, V% N
    + y" J: a% ?- F4 P# C
    8 j: T' Y. H, p! f5 s* n5 i* z8 m: v2 F! B* y

    - W1 R, S7 J) }( g& d
    0 N) Q- w) c5 k" Z6 I7 R- s4 o6 C
    ; b# b- t" J! O9 m9 _

    5. AspectJ! }. [. C! e; `$ M% a" N% h6 @+ u

    5.1.在xml中配置比较烦琐
    ' V- l8 X$ e5 q2 ?1 I# }- g

    所有的入口必须从一个代理(ProxyFactoryBean)开始) Y3 h8 C) D: ^9 M+ U6 {. C- i4 i

    ( U$ @1 J  N4 V' Z! P: g; g+ e! {% W

    6 J! S8 x; b5 }) X- W

             ! ^, ]2 R. E3 Z6 P% V/ T
    , `( O/ }0 N2 B8 J

    * [4 h1 J4 w, ~3 t$ P" K         
    % K2 K% I' D0 D# J, Q; A$ k

            
    % n' P9 y! c9 ]# Y9 N# i

            

      p' K! }9 o- V* ^$ }
    expression=“execution(* com.javakc.aop.MyTarget.t*())”/>
    / p  C7 v6 l' f7 G+ K* D; P. r/ N

            
    6 h! X* R& Y0 `$ }( b! i

            
    ! V$ \9 Q8 _2 ]! D  ^7 \" I( A

        - I7 C2 G0 }) e

    0 d. r6 O; h* c( c+ a! y. W1 l$ f

    % {5 T; m) q0 Z- A" W/ X

    5.3.使用注解的方法相对简单
    " Q$ k6 k7 T( h# X9 }

    @AspectJ的基本语法- j! H6 I- k1 z3 j' ]- P

    1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面& {6 f. d* J: O- u, b6 I9 @

    直接在类上定义@Aspect
    : `  [6 l) T4 \3 q+ J

    2.@Pointcut声明切入点
    - k% Y2 L; \0 j5 _9 L& L, `

    2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字) z9 `" Z. ^' H8 N: u

    2.2、可以使用匿名的pointcut
    * z& ]' _% F% W+ U4 w- I7 m

    2.3、执行切点的几种方法
    0 F( D# @" g5 V+ U

    2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法
    $ c7 K5 u/ a7 P$ s5 K: ?; T

    2.3.2 within 指定到包,不能指定到类
    7 g% s3 ]1 S* d& f9 i6 @, I, n" d

    within(”com.javakc.spring..*”)
    7 D$ o2 K4 N4 M% o" U

    2.3.3 this 指定到实现接口的所有的实现类
    7 f8 o; {) E/ @0 a8 S

    2.3.4 target 指定具体的实现类
    5 l6 f* U8 Z. T  Y6 d

    5.4.advice的五种类型的示例) O5 ~9 S& K- e" E

        客户端必须从接口走才能得到监控,实现想要追加的功能; g) z' c! p! S6 N; ]3 g  x! P6 i

    5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)5 v6 |0 |8 u  T  d8 J

    追加的方法的参数名字一定要与retrning的名字相同
    + U! Z1 g8 a* k

    在注解@AfterReturning中必须加上pointcut和returning两个参数1 k! t9 I% Z/ X' `

    pointcut指所要监控的目标对象的方法; X7 R+ T8 o8 b( y

    得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配
    & f; ^6 T; ?  N3 {/ @- o- Q

    完成追加的功能8 C5 Q. \# Y. t& s, @

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用# B$ J2 {+ [/ G1 w; i1 T# i

    (1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)0 \+ }& h7 I5 `& ^

    (2).% M* w' r( W# c( b; z7 d0 j# x

         2.直接引用匿名的pointcut' Y3 {( Y3 v( w1 n  t. H

         (1).@AfterReturning(“execution(
    ; o7 Y! ?8 f! ^- X* k6 r/ b; P

    * com.javakc.spring.schemaaop.Api.test4())”); f1 U# Y8 }1 x: V5 O% c

         (2).@AfterReturning(pointcut=
    " F( Y6 h/ n* B4 D9 y6 S

    “com.javakc.spring.schemaaop.TestPointcut.t4() &&
    * f3 M* b* S5 u. i4 e, a9 u

    args(str)”, returning=”retVal”)
    9 t6 A! O4 K! Y9 {+ H2 Q0 M8 C

    @AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)
    5 D! {+ S" [+ b8 M" }( K

    public void testAfterReturning(String str,Object retVal){
    : }' y4 Q: ~& q7 \: O5 _# w7 l

        System.out.println(“afterReturning1=>”+retVal+”=>”+str);0 M1 L9 u& [8 _" Q' l3 A6 z$ l  i: p

        }
    & u4 k* K' R0 ^& R) ~7 H

    5.4.2.@Aronud6 N3 c0 p2 f1 V2 q9 A

         注解@Around环绕追加功能;; c( K0 O, Q7 o- G8 V. T

         在执行目标对象的方法的前、后追加功能;# ~9 A  ~+ _( m  U7 h

         必须有参数;第一个参数的类型必须为ProceedingJoinPoint;
    6 U5 p' g8 f- _$ @

         通过ProceedingJoinPoint的实例的proceed来调用所监控的7 g; |) L6 E5 q0 R9 f5 W3 a+ Q3 z; a

    目标对象的方法
    7 W2 Z* \8 u" L  p, _" a) X

         1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    3 K( Q5 F( d% J& l2 S/ _

         (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    $ c8 k4 j7 H3 p+ ^8 a/ }& c4 R

         (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()
    2 L8 |; {: y' m: P% M2 l

    && args(str)”)
    5 g+ e; p- `' g1 Z

    2.直接引用匿名的pointcut
    " a% `0 l. b! J8 Y- ]3 m

         (1).@Around(“execution(
    6 u6 @. E' i% g- P6 y  Z, k+ K1 z1 X

    * com.javakc.spring.schemaaop.Api.test1())”)
    4 X9 ], P1 x! X" ~, P  U

         (2).@Around(“execution(
    9 a1 `8 R" H9 J6 r

    * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)3 j$ n6 a" G, E/ h9 |

    // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    9 z/ a: G& d: s5 s" I! N

         @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    % h. j" F+ D* [+ j2 G8 W* f

    public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{
    ' M% ?9 d( ?& X% \: w/ q1 Z- b+ _

        System.out.println(“around1==========before1pointcut==>”+str)' T6 l9 B/ g. J* g8 J* l

            Object obj = prj.proceed();
    ; u8 p8 @3 B. F9 n8 w

            System.out.println(“around1==========after1pointcut==>”+str);
    ) [( h0 G; U; u  W- Q

        }
    , o* v9 d% R; Z

    5.4.3.@Before
    0 C' \: k1 p% a! z' |4 C: u& _7 [

    注解@Before在执行目标对象的方法前追加相应的功能
    ! m8 z' O9 D% K# E3 g* I# A! |. `

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    ) k; x7 A- e' B' h$ e

    (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)' @) y! M4 R) [: x

    (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)! v# ~  \% B% R0 g/ R7 `' d

    注意args后的名称与参数名相同
    " E- Q5 Z1 ~2 q/ v& g: B$ F" V9 l

    2.直接引用匿名的pointcut
    , F' ]8 i0 f! z

    (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)6 X, }6 W% J9 k0 i

    (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    : G0 Z7 N- _; s' S; z2 `6 ^" ]

    注意args后的名称与参数名相同; `% k3 V: R+ b2 E  T3 n, t

    // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    ) \( `0 H0 M3 e. `  b9 L2 Q

    @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)/ z" x$ }: e( X. S9 n  E( t

    public void testBeforeParam(String str){6 P, T1 H4 T4 E4 V# b# N/ J' w# Z

        System.out.println(“before1=param=>”+str);! y2 k, P# {1 o  n

    }
    / A# I2 I4 l2 ~  s3 p

    2 i' m% K5 ^, s

    5.4.4.@After/ _, D8 X) Z2 H/ [4 G5 Y& j

    注解@After在执行目标对象的方法后追加相应的功能/ M2 \8 |! C% `& s# @9 ~) |5 l3 a! l8 G& M

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用, u9 O" A8 F4 X% j3 K4 [

         (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    9 y4 A! M1 r/ Z

         2.直接引用匿名的pointcut
    ; r+ A- ^! Q' L# V, Y$ {' c

         (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
    ' i8 n' s/ r- X+ }' q4 @! G: ]

    @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)3 z0 ~) O( s% [  Q: p  ~% n% X2 ]0 x

        public void testAfter(){+ |  p* g0 c& M9 M' Z

        System.out.println(“after1== >pointcut”);8 b7 k+ v2 z- o5 X, e0 e2 X

        }
    / O: W5 S2 p5 {1 v5 M

    5.4.5.@AfterThorwing3 r: K% i1 Z+ T/ a" `  S& E


    0 m2 g5 Y, u, p$ o- m/ B9 x% R1 y# P7 n; Q
    • 描述一下spring中BeanFactory和ApplicationContext的差别
      7 N6 k2 f7 C. i' p) e

      ( A0 b6 b+ D; I5 y" @

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

    . r1 E, I. o* W
    • 谈谈spring对DAO的支持
      / O& m# N& J% P- O
      - O9 ^" P8 b1 H4 i$ ?

    Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。
    3 G) \) R$ n  X) {. J* o. d7 }# R

    简化 DAO 组件的开发。6 e3 [* S! o0 q8 W' |8 K$ ~1 S
    Spring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。
    # a2 d5 e# R2 A2 ]" I- X

    IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。
    1 t1 I$ r: ]& D/ R+ [; ^

    面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。, H5 w5 z+ c0 s" i

    方便的事务管理: Spring的声明式事务管理力度是方法级。7 h  ^5 p0 `) G' z) X- F

    异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。8 u7 g* `& B! V; P2 H+ q


      N! @' @5 t9 v9 n3 r5 v
    ) u: s8 y/ y0 V1 A# q3 p
    • 谈谈spring对hibernate的支持
      1 P. O% |' U7 c, `1 p5 f; G: Z2 Z

      9 _/ a1 U3 f, `  u; P

    在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。
    * L7 `+ g1 R, _' u( m) C7 d/ f

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

    1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:# m. x" R+ S* _2 M9 K


    4 }# k+ y/ R7 h" Q) U7 s- J' t8 O5 L

            class=“org.apache.commons.dbcp.BasicDataSource”>
    % Q; F/ I! ]3 e( D: o& g! f/ I

            5 k! V, b, }$ F$ k

                oracle.jdbc.driver.OracleDriver
    " R6 N+ N- ^5 W- Y% T- t

            
    ) G7 N+ Z' M$ t

            
    6 a6 i! L( b2 Z' Y1 X4 A  a# o" H

                jdbcracle:thinlocalhost:1521rcl
    ! `: M% {7 a" w9 u. m

            & X7 t7 D0 I9 l' @& \

            
    6 K. Z' a3 G0 D/ w

                javakc2/ e9 [5 U0 j1 _

            
    6 o8 Q7 ]" ?" p

            
    1 b) H/ {* Q! j8 b7 K; k8 V

                javakc2$ H* V: O: T8 t/ N) @" w

            
    ! C3 r  `/ F5 ?7 `, S4 R

       
    4 p0 I, I. j" J& M7 c* e( \


    4 T# s; s1 o8 V; Y* P4 b  n. \

       

            class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>4 n, D* _/ l; o# R6 s  D

            5 |$ i! k% c* M2 ^# b2 O8 r

            
    - l! M$ \  Q/ n; L* Y

                
    2 z( q3 d" Q5 P6 N  U

                    com/javakc/spring/h3/UserModel.hbm.xml
    ; \( M+ f1 v% |. ^

                % e8 _& a7 i5 G' M; ~

            7 }+ \6 C# w2 J/ U" o

            
    ) u- b1 _* a# `

                
    9 g7 I/ i) O" x5 y  u$ Y  N

                    hibernate.dialect=org.hibernate.dialect.OracleDialect
    % d( s$ V' S& t  F

                
      L! D# A6 a# n' g2 ~

            ( G+ a* F. t6 F6 M2 l3 I

        # l3 q' [, h" B5 ^+ w  Z

       
    * M' Y; C$ C" l. D

            2 b, g: y- t7 g4 t0 h

       
    & O4 t3 J# }& W$ S

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

       

            class=“org.springframework.jndi.JndiObjectFactoryBean”>( T  k' v% M7 `% W/ }# [2 K# a

            6 [& j" ?( {+ X7 {% U8 M) y3 `

                java:comp/env/jdbc/myds
    0 R4 F& D0 m( E. d9 H* v

            1 Z1 m- k4 [$ ]7 ~. l; U* b0 O( q

       

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

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

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

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

        8 @2 |. H0 {7 ?

            - I) w9 g4 ^5 e9 B

       
    + @# u! q$ V! s; `! U# u


    / v) f! w( \; Q- U

       
    & B# _8 p5 Z- w2 e5 I& ~

            
    / ]1 u8 v+ D- }) T

                0 K# h+ f" \, U2 @$ }6 }5 H3 s8 v

            
    4 y, X. P1 E: u

        , x+ U* Q9 @  v! U% k0 S

    * M0 p0 T& I0 n) @6 f

        ' g! w' v$ M- ?# `( {

            ; e5 `5 `. i4 o

            
    6 u* `; f( e8 W; U& @' q# ?4 P

       
    0 U1 \1 G2 c9 V: M' ]

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


    ( Y4 @/ E! @- N& J- {6 N2 z
    Spring2.0之前事务的写法  P  l! k7 ^6 K4 C
    & a- e) O# Q* U7 u) e% L! D

    ' s6 b- o1 S0 [6 F- }$ z2 ~" a        class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”+ O2 m4 K+ A( U5 e! h5 H( ]7 v
    - F5 i4 n- l# {. {  M
            abstract=”true”>( F5 ~3 u  U* x( R  f8 [

    3 k) l/ S$ I" d! o2 C1 @
    8 m/ J" `% e6 k, S0 W3 q6 o3 y$ E1 y2 f% `: @! q" H

    # w: M7 Z1 @! @- p+ _                PROPAGATION_REQUIRED,readOnly
    ' n: P8 d2 W( a0 @3 h7 w

    8 {( ^) @/ B0 W( Q  \$ d0 Y                PROPAGATION_REQUIRED
    7 X/ I' A: d! U3 k/ }; K

    3 r0 D; |6 H* i5 o( f: n: J1 C, n. W0 Z
    7 W8 {* I5 _/ ]& u$ W! Q
    * S% e$ j9 g0 o; {
    8 D" p5 a( p1 E* n& v; B! |
    + m* n+ [; ^) W) Y8 A" F7 a! e
    2 e6 A0 i. h' }
    • 谈谈Spring对事务的支持8 z4 o2 o* i4 R% a" r! L2 e& r

      7 N) \  {8 B( r

    & ^% Z( P6 X1 c) b
    1、声明式事务管理:

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

    2.做法:

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

    2.2

    2.3 注入数据源


    , u1 o3 i0 l/ W% f3 N; [, g# V3 g+ B! ^
    5 W. _: a- {- i2 j1 R
    2 t& K- b  @3 L

    1 r/ M8 o& i! r% H$ U8 s( z9 j: w5 Q# {* p* s8 N3 b! b$ X

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


    9 Y. c8 v! c! m! R4 ~6 z2 z6 ]$ m2 w, h3 U

    2 c+ g$ W1 F+ S: C

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


    ' \) r( o* g5 t- {9 V4 V2 o/ d2 {
    / N4 }  E5 N' M/ m1 u  E) C/ X) V7 b

    : [1 Z  X& j9 B, n, B# N( D$ }6 q1 M5 _9 s; T

    2.6 定义切入点


    , a+ c' E4 l1 q
      h0 I4 S2 o  S
    2 G  }1 j4 o" N% |& n7 ?" G5 b- q$ U$ R6 e+ f

    ' C, ]0 _  k$ l3 K' \  a, {3 G0 m1 x; {

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

    1.注解@Transcational

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

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

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

    9 I! T; e! n9 l5 H( G

    ) v* {. m, m9 y% B' Y

    如何在Spring中使用Hibernate的事务:
    * v; r% @) d( \% ]  b6 k

    7 r' L, K; ~2 i


    9 S2 [4 W' e& @6 T


    0 _0 E: V& l+ [4 d

    如何在Spring中使用JTA的事务:
    : O. J/ x( J5 |% e* X9 s


    $ n, k% G7 M! ]3 k. F: C2 d
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    17#
    发表于 2014-12-03 12:48:32 |只看该作者
    事务# z" d4 v# C& o5 H
    ACID
    4 [6 k: R" u+ f" I4 `(1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失败* E9 w& @1 X7 z2 z. g

    - l' q8 N; O5 d& r(2)一致性 :操作的前后满足同样的规则,保持平衡。2 L, r0 a6 N( E
    6 x3 n- f. C/ Y& E4 Q3 Q
    (3)隔离性 :在事务运行的过程中。事务内的数据对外的可见性和可操作性(必需由数据库的支持)' k+ c% v, G4 H1 N- I1 W

    ( [( h+ A8 O, b3 e1 E7 J  ](4)稳定性 :保证数据在事务的操作的过程中不会遭到破坏,而且是永久性存储的
      {8 m' e# m6 u
    7 L3 b5 H9 a8 | % X  C" c7 ^: v$ k4 @9 k

    , L. }% f; \# G, g# v事务模型0 f# S. {; ^: ]3 t0 e
    (1)经典事务模型又叫平面事务模型(JDBC) 事务不允许嵌套8 U: I& l+ e, X) R+ b% e
    * \7 S5 R& r5 L
    (2)嵌套事务模型
    6 x7 e: i2 j; U" o3 i) |
    . c+ x9 z* J5 F2 X 6 A2 G9 N3 [+ q" [$ K

    - X+ r# L. G7 u9 c# f: K/ P( f事务的两种方式
    8 |, t2 m2 e0 V. a) [(1)声明式* L* d" f3 V0 R7 C' |6 O

    8 W3 ~& G: j/ K# o) d# U( N7 ]在配置文件中设置以下6项
    0 T5 z$ Z& `0 U4 u5 {, a' L2 e/ Q
    - p# p5 B# \' k" C# F(1).required! ]6 e( q8 ~4 p6 b
    , p2 |6 k& }; \: ~
    如果客户端没有事务 在bean中新起一个事务' f5 F! s. `( v+ {# O! Z) z
    ' y) q# C* F. n, L+ v3 a- k2 Y
    如果客户端有事务bean 中就加进去! |+ a. o% e2 R

    1 U( H) e' ]- R(2)、 requiresNew' a) A$ r2 g1 S+ w  i$ A  w

    ( o& }7 i8 c2 V& A8 q) {1 G不管客户端有没有事务服务器段都新起一个事务
    2 b, C0 h' ~5 j7 Y- @; k3 C& i! i% d2 B
    如果客户端有事务就将事务挂起
    , v- T0 K$ d; k
    ' w( F& w5 G: A5 g(3)、supports
    " O9 D: H- `$ C' k* p' Z( k  z" G5 \' s! u+ q3 G7 b
    如果客户端没有事务服务端也没有事务$ j: f: p  y. o4 w0 t( N/ f
    0 c% D8 m, b5 m9 {6 [
    如果客户端有事务服务端就加一个事务- r  c6 J$ C, }
    0 d8 |# K7 F3 R2 A8 L! q
    (4)、mandatcry& v" A4 I  g/ I% g

    * L- L% z; z5 M1 h. V- v如果客户端没有事务服务端就会报错
    9 H8 q0 Y  u" k8 L  |7 i/ b$ O0 M4 B( z$ p
    如果客户端有事务服务端就加事务
    8 E/ {  A) j1 Z3 N) _' J6 S$ D( w7 \7 U/ r
    (5)、notSupported
    0 W3 [& o$ k7 W, t5 n
    % E1 i2 U( _; A/ @/ R不管客户端有没有事务服务端都没有事务5 z  f+ n* I( ?* q: K( O/ r

    6 U4 Y. c, V: q4 i/ q/ }如果客户端有事务服务端就挂起
    6 Z+ O6 q# w* Q7 u! r; V" y* d+ A
    % K. |  g. z/ X(6)、never
    : t* p" Y/ y: \6 Q% Q4 G& U& H1 F3 V' p8 Z8 l
    不管客户端有没有事务服务端都没有事务, u6 T4 E4 a1 @0 C7 {9 H
    & a7 g  [" U3 c8 y
    如果客户端有事务就报错8 d( ~  Z% U  J% |$ T
    : m& k& F; A& J& K2 h' F
    (2)编程式事务
    0 s3 @  \& H; P5 P! U
    ! ?6 a# \) [$ T3 c# Q. w7 {Javax.transaction.UserTranscation" v: _# r. ~5 J% Y7 Y& F/ {; e

    8 Q5 T6 q9 u* Y( [5 OJTA 事务可以精确到事务的开始和结束
    8 Y/ ]6 a! u/ ~0 i5 R4 Y9 B. E1 {% r& N$ e' K/ \: I

    4 F9 e1 [7 a0 z" S& y6 c% @+ c4 ^& k7 R# g) d
    事务的隔离性* n/ @+ G& h7 j' U5 w% A4 [2 v
    Read-uncommited
    7 `2 c7 _. D" L
    " ~. c: X0 g& E9 i2 x读取未提交的数据(基本上没有锁)脏读,存在不当读取的问题。
    5 f: H7 a* |+ s+ S( v  a. M
    9 w' d" S. i$ ^6 u# MRead-commited+ {; x# P4 Q+ E) @; ?; g1 s3 t
    * w) Z% ^  Z, Y2 Q9 k
    读取已提交的数据(行级锁); i9 I5 q% Z) C; z

    3 Z, l( x6 @1 V4 f9 ?无法读取已经写入,但没有被提交的数据。9 [. y3 Y$ t7 Q, D. D7 s' @1 n

    * C4 [: @% f* t  b  K0 p3 P* _Repeatable_read0 B" @  L! O" |: b+ c4 w8 {( L9 c; @: N9 X

    : G. s  H5 f- _/ ^% N( Z  m0 @读取的数据不允许修改或删除
    : C( w5 X4 E# L# {
    0 W+ n, N& L9 x不可重复读(行级锁+不允许修改/删除)
    0 o/ O. L& b: r+ H) e: N1 u! L1 ]9 Q0 r$ C0 J$ X* N- y5 ?7 o) J
    Serializable7 ~# x) O/ m3 z" _

    : w; ]8 H( \3 D" U幻影读(表级锁)
    ' J, x+ w2 D" r0 [* o& [1 b7 G- }- R5 l- Y! N. r0 g
    & a' }: \2 E' d8 ^4 r6 E- n( n

    6 N- m6 |! t0 _8 Q$ ~& Kstruts
    $ n4 L6 s* J6 C$ [( P' s开发流程
    $ L; Y6 [- v& I5 a& V' J
    4 {: {5 q3 w. j1、创建表单
    # u. e+ w# G5 S: a; T# o1 Z% P% D  G
    0 H- m% W/ b1 L5 J: s2、从表单中获得输入' L) ]4 b* ^, d6 R" m
    & G4 K: d3 w. u2 r- }- z( f4 O
    3、处理输入(业务逻辑)
    1 Y' Z( W  ]. v# s' {( g; i3 C9 ?* D3 r% ]# |
    4、根据动态输入改变输入流  O# A+ [% y2 E  a
    4 J. [1 s1 [7 L! d  Y& O- O; N
    要完成上述四步,我们需要创建
    1 i4 X0 V: k, Y* P- ^# Z$ P, f4 M; q
    1、一个ActionForm' W4 E4 f0 Z* a, M& N, f& C

    ! G" y  ]' Y4 d) d& U& [% ~2、一个action* X8 x( w3 ~0 O3 s9 V8 j) u8 I& G

    7 M+ q+ U( O0 B6 n0 C7 K/ E4 h3、一个配置文件struts-config.xml
    ! K% E( H/ j4 i4 ^! z1 s- `; h  A  B2 G( S6 B; b
    4、创建页面
    # e6 c4 E  A& r, E2 c0 r9 E& N$ a6 e7 H
    创建ActionForm, Y* D+ d& C3 y6 N! U
    8 C3 W: {' ]7 l% j+ u! P/ `- Y
    1、写一个类继承ActionForm; {4 A, _" |+ Z5 ]3 B
    2 o7 B3 w# H' s0 H2 I" k
    2、私有的属性  S% Z+ t1 L$ O" e
    2 D# a. Z5 ?7 L# N' l9 b9 [: e
    3、相应的get、set方法
    $ D1 B" c/ O" r- {6 _5 o3 a1 y( H3 D1 h2 G3 t
    4、重写tostring、equals、hashcode三个方法) [" c/ F9 J  c2 l2 T
    6 m6 I) I2 y. c4 F1 o9 t% k7 Y4 n# ?
    创建action
    " U& I0 `7 b0 |
    : ^4 P$ d7 ^4 Q7 Z9 t' \1、写一个类继承Action# M; {( B' `3 C" [- g8 h) W( b
      Z* [) V  p" m! N, e: ~
    2、实现一个公有的方法(回调方法)( G5 j+ d! A1 ?- E. t5 D

    8 q  [' x' s/ w# L0 D) G& Upublic ActionForward execute(ActionMapping mapping,. v8 H: ]9 F1 V/ ]1 n' U
    4 u# m3 H2 e1 w* q' m' c0 w9 d+ ^8 R6 j1 ]
    ActionForm form,
    ! I% w  j/ N4 S" b
    + a6 a# S+ Y. zHttpServletRequest request,& e" B8 ]  e; P

    1 `& Z& g. i. s  }; hHttpServletResponse response)
    , h7 F7 C/ @" w& P6 ^- F
    0 [) k, S3 `/ i( t+ F& _' X) p- L9 B{& K$ ^" o. {2 C& D1 A* F

    3 Z( o7 Y) b( u+ |3 }% G  e. `//1.收集参数
    8 P; z& u  _/ W+ U9 H6 B! t3 Q  |4 E5 Z  g7 e4 W
    MyActionForm myForm = (MyActionForm)form;. ^3 ], l% P/ W+ F" l/ {

    ) ]8 F3 I; K7 Y+ N  M: [/ s3 A//2.组织参数
    3 h; j/ Y% }; E; o9 Y. Q. j) v
    7 F4 m4 o: D3 k ' d8 P: K  M+ w; |8 t

    2 Y8 Q# x- L3 ?' f& \, p//3.调用逻辑层
    ! \6 b( {; S, ?6 U; y' Z- d& g& E7 [( r) x1 K% O1 w1 s: j1 Q# _
    boolean flag = true;, J/ O9 t: h- n6 H! a; o

    6 u$ g. J3 m) Q# V; v6 ?  K+ R& O//4.根据返回值来跳转到相应的页面
    ) g, _& U, D/ B7 E
    / w* G( ~/ a( `ActionForward af = new ActionForward();
    " L9 E7 f" Y& j1 I( }8 \1 D' M% {. _$ L! ^
    if(flag){
    1 u$ }+ c+ ?5 Y+ ?% p% [; F
    2 h! ?1 I' x; T6 g7 Vaf = mapping.findForward(“1″);
    2 t( s0 {% y, k* j" F- B* e& p  y' F
    }else{) b8 r5 V3 k" k" a
    # B6 Y  |9 V9 m
    af = mapping.findForward(“2″);* f" [+ h7 G2 w) }- G/ r
    / p3 T/ t+ a" X' U
    }+ x9 x$ c9 K* A; ?1 G* l$ j
    3 ~' ?& n, S3 A+ F+ k7 ~" P$ W
    return af;- @7 ?* Y1 q- l
    ( d$ d, C! E2 Z' z. m
    }- C8 A2 j8 X8 z7 q
    - \1 _# L% O7 }& [9 s6 h3 v
    配置struts-config.xml文件
    8 k4 j6 U) K: v2 l/ w) M2 }2 X/ e: `1 U4 \4 o8 @% s
    1.<form-beans>
    5 m$ [. c) M0 V2 V: \5 r7 j
      I- L8 n$ j0 T; O5 u6 w  X<form-bean name=”myActionForm” type=”全路径.MyActionForm”/>
    6 }3 L, c" ?  C/ |: D- E
    ! p" n  ^* t7 }3 |1 o. t1 Y<form-bean />& r. b0 b( v* j. |4 \3 Y
    - b* @4 p) |) @/ \- n
    </form-beans>
    - i2 |) x" c4 {0 u3 ?9 ?
    . X6 z+ a1 k4 h, m" W2.<action-mappings>
    : ^$ r- C1 [* _& ], g- t
    & O  W  K* a1 A' C% _<action path=”/sll”
    5 E0 s% P& @3 ?7 s: ]( F. u$ c- @9 m) p
    name=”myActionForm”- D9 ]5 k% d* P( R' D

    8 U7 O: |% U" V# x* Stype=”全路径.MyAction”
    : i% t: c) q/ }. q! l- W/ W
    ) q) {, @5 `" u+ O, @  Q2 y' z4 ]scope=”session”
    # c: b- R+ E- i1 c
    . Z0 }. S, L: P$ ^' i  |: Q; ^; xinput=”错误返回的页面”>
    3 R, n: @, M; h, S6 m2 [+ ~5 g& R( h
    <forward name=”1″ path=”/1.jsp”>
    - v; }+ ]+ a9 t1 x
    3 j8 M7 d; `% V2 @<forward name=”2″ path=”/2.jsp”>4 Z- }) G- O+ d9 v
    ; |8 D, a* l+ A
    </action>6 o  B9 K" E/ t8 P% f9 c% ~
    8 v5 ]( ]4 X1 B, F4 }
    </action-mappings>  H/ k/ z9 g6 k" G2 k" G

    ! ~6 I4 N5 `9 b  Q( p. w  y步骤:* w+ k$ e8 I' j% Q8 z; }2 |- x8 J

    / @/ n- z6 I! j1.创建一个空的web应用* s4 M8 l$ z) J4 a6 R; P; t" G
    4 [" @' [6 d- g3 ]( p% R
    2.将struts的包放到lib文件夹下
    7 ^8 K' n. Y2 s3 o7 h5 s% g, @- O6 k& I
    3.将.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目录下
    0 x( ]. b, `  S* y0 T* \. L5 l/ U  c, k# J, K4 K1 K
    4.配置struts-config.xml文件和web.xml文件
    ) X6 u. n7 f8 k9 {+ |
    - K; j! u6 q! ~' ]5.在页面引入tag文件uri
      F% L! d# e8 G9 V4 R' q, P6 E; W( w4 a. H. f1 J
    STRUTS运行机制
    6 p3 W& M/ P& @' F) Z5 j8 Z. ^  _8 n3 n
    1、界面点击产生请求
    7 |$ ^6 C% _3 [: a4 _' ^
    3 a4 ~& R. u& I- \2、容器接到请求
    4 k+ K7 y0 C# e/ p: e7 Y6 \! ~4 @6 d1 Q
    3、匹配web.xml文件中的*.do来调用ActionServlet
    ; ^2 I; i5 F: u  X  ~% c! {7 ^; G7 N
    4、ActionServlet的处理$ {$ Y" _, Y* T8 g/ C

    - h4 [9 f+ L7 C: T$ R$ k: ]4.1 读struts-congfig.xml文件形成ActionMapping
    5 e- N! n3 J: B; H  {& \+ V7 Y
    & ?' ?8 S# }3 C% C' T( s4.2 通过path 来匹配Action类,通过Action的name属性来匹配ActionForm类: v* K8 y6 f5 @8 M4 ^% h, h) y
    7 z) v/ W1 \, O9 U: L- H" c
    4.3 通过反射机制来给Form添数据8 M0 \  D/ i) D6 E( H: d
    ) j4 ^7 O, O# F" V
    4.4 由ActionServlet转调Action的execute方法8 a+ w3 \- Y' Q- P

    ' P8 y5 b7 G3 I" {9 K: F+ a3 W  g4.5 得到execute方法的返回值,跳转页面
    & q! T  l) H. w( ]# O4 H1 A( E' g# ]! y; ~
    4.5.1 RequestDispatcher
    6 H0 J3 j' }0 I% C% T4 @
    0 Y1 T9 h2 C) L8 z( [" p4.5.2 response.sendRedirect(“list.jsp”);
    7 q" Q- K  V8 e* ]1 \3 c( Z* ^! e! u  P& M9 f
    ; T5 d9 }6 [- u8 T

      s+ H* t9 P, T进入execute方法
    2 l' M8 v2 t8 V3 |% @& p( R/ U* w) T+ t( N8 W' X3 \3 B$ d6 B
    1 收集参数
    7 l. W, V: c& L9 K: _
    0 G1 l" Q4 ?/ r9 ]2 组织参数7 f7 A7 P- O1 @6 V4 ^7 G! ]/ j, h

    2 d2 H' [6 \0 E  G, ^) m; @3 调用,逻辑层# L  z5 S# \$ P( `$ I; }

    * y8 {% E# a- ^6 |4 G4 返回值2 U2 y% q* I- |1 R1 c3 b

    " @( q* P$ T6 W( s! K& g3 p4.1 选择下一个页面 (ActionForward)
    , C$ f' @$ R, _# I6 b, d9 y6 [  Y8 `. b, w7 D, ?! A
    4.2 把值传给下一个页面5 V% ?( D: h3 I3 C$ @) D

    ' R: F( G( W6 e' `" R. I% @
    % U  v! d) p3 r% R; @! o
    ; L/ D# B; q, q% k! U. S. x- Z$ C( n比较struts和struts2的不同
    1 J/ I; g8 r5 X- a; R* t8 n: ^; r( A) a
    Struts
    + }3 f' b" S2 s/ z& P0 b
    9 K6 |* H( k9 }. J4 d! d7 d/ _Struts2& ^9 n4 `: |' g1 c* I

    ; h5 `/ N3 ?; U8 M! D3 ~组成        五个部分:ActionServlet,ActionMapping,AtcionForward,ActionForm,Action        十个部分:AcionContext,FilterDispatcher,ActionMapper,ActionProxy,Configuration Manager,Action Invocation,Interceptot,Action,Result,Taglib4 s7 Y6 T: ]# y' a2 V
    url        .do        .action$ G: D3 {  @5 C
    分发控制        AtcionServlet        FilterDispatcher
    # M* z, A( a, Q& J3 P, l收集参数        利用JavaBean技术,将数据封装到ActionForm的子类中;9 Q: A( j: V3 M: e
    一个Action对应一个ActionForm的子类: U: E1 A+ [' _& E9 e. x
    / l6 e7 P) p( H/ W
    使用拦截器将数据封装到值栈中。3 V9 Y7 b& X) A8 Y' y
    使用域模型,一个Action对应多个值栈中的Model! Z' {. V6 C0 d% r% v
    2 ^3 e: F, {0 F( y% E6 B! T
    读取配置文件        ActionMapping        Configuration Manager
    1 r9 X7 W# {# ^0 }拦截器        无拦截器        执行Action前后有拦截器0 q5 v) [% ?9 d
    返回页面        将字符串封装到AtcionForward,进行跳转页面        Action中直接返回字符串,通过Result跳转页面- Z/ x. E! i- }
    页面跳转方式        两种:dispatch,redirect        三种:dispatch,redirect,chain
    + I+ C, ~. w, }9 j值栈        无值栈,Action通过在request范围内设置属性,向jsp页面传递数据        有值栈,Action和jsp页面通过值栈传递数据,jsp页面通过OGNL取得值栈中的数据+ B( T+ u9 ~) }) Y
    配置文件        struts-config.xml        struts.xml
    ! o+ X/ J& S3 s' g8 F5 h中文问题        不能解决(需要使用filter)        可以解决中文问题:1 I& c* t7 o' z
    1、在jsp页面添加Meta;
    " V2 f3 I" {; J& e. o" }, t2 h7 @! b. h6 n
    2、修改struts.properties中的设置。
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    18#
    发表于 2014-12-03 12:49:03 |只看该作者
    其他开发工具和技术
    - D. @& d) a. E: X6 c2 J$ }Ant, Q+ W# N& ]! [9 S! D- T
    Ant是基于java的批处理工具4 R( f) E1 H# N! L  L: F* M

    $ b/ g# [+ i" X' ]3 j2 }' f5 U一、配置ant的运行环境. ~! o  h) b6 X/ [' o9 J$ b" H
    / R$ x- _+ ~0 U, G4 x
    1.将ant的bin目录添加到path中, L$ U! O9 s9 Y

    7 c0 a) j7 q+ V" V5 a$ o2.配置JAVA_HOME: N5 }$ G# q4 Z" K+ |4 ]

    # z3 R, p! D6 y# I7 B$ b/ v3.配置ANT_HOME, W* {- T; X! a% g. T* Y- i
    ) I: g; b, K( t: {& c
    二、配制build.xml文件,该文件放在应用程序的根目录下1 o  M: ^) u9 Y9 |; O$ S! M

    : g( O! C, i% U5 G$ w编译java文件
    - G7 j8 p1 g+ ]
    ( G5 w* p' ^3 |1 b7 `6 ?执行java文件
    * \* T/ M* r4 n, ]2 [  Y3 r
    ; r* C- P. a* o# P: tcopy: E7 z! q8 n3 K+ `4 z

    6 U; y* c9 n) Y8 L) V0 }  ^7 T删除% f- A9 X1 x, D/ Z/ n1 G

    0 v8 m; g+ H6 B. k& B$ {5 }打jar包$ {2 c- F2 O' e7 p9 B! R! i

    : P# Y- s9 [" _4 f3 i/ ~根据注解生成配置文件( p5 Y- {$ T. h/ a/ j

    : A! L8 W8 q: t/ N, t" qXdoclet  o1 i+ X  x4 g  p' j! M
    通过注释生成一系列文件的工具(txt、xml、java、html等)! @, i' N$ e. I: J: W0 _
    # a; U4 d+ n/ t) W. q3 b
    xdoclet本质是摸板技术+字符串的替换3 ]2 G% l. _! j4 t
    6 ~* t' m( J- g$ ?9 f7 \
    1.在java文件中写符合要求的注释(将hbm.xml文件的内容搬到java文件中去写)
    8 y% ^( h% R: `1 `
    : O, c5 [+ ^5 q1 Q+ D# ^1.1 在类的上面 写与表的对应
    ' {/ R% J8 A  n1 O) y+ |
    5 l. \5 e5 o9 e8 F: K7 m2 E0 W1.2 将每一个属性的注释都写到get方法的上面' Y4 C8 E) F8 T9 o4 m
    . t1 _, h( O4 |3 E
    2.在ant中引入相应的task来驱动xdoclet! L" D% @9 y$ J, ?' P9 K( P, @, }7 V

    & k$ @4 i9 ^* p9 V: o$ w% J8 p 0 t- \0 p+ @3 {+ h1 p( g

    : Z& o- f& J) z2 o$ o: N- blog4j日志管理
    ( j* v: G% x, X: j1、是什么?
    $ v5 F' a; ]3 U
    : h$ g3 D( q: J- U' j# ^在开发期间用来测试、对整个日志信息进行管理的工具
    % W! _; ?4 K5 p" p8 c) M
    . K4 y6 K* b7 s1 a2 ?4 W  z# G2、功能
    2 ^' d# C  r; I2 v% q
    ; j. [& J) c. w1.控制输出的目的地
      T9 w! N) d$ J% D) m7 y8 P
    ( u, E# z4 n& Q) _2. 控制输出的格式3 h$ b0 O+ M1 p' J$ s

    : C( r# W- `/ m' l  J3. 控制输出的级别/ Q+ e$ R' G- |8 B
    ( s2 U5 r1 f; }3 O0 }9 O
    3、日志的级别* f" d. {* W8 `
    % X2 g+ o9 r) l0 O
    1. debug 调试
    ' _& K! [& W$ i2 ^. k% W3 g7 E3 R/ N3 l  D+ Y3 @
    2. info 给用户的提示信息
    7 o* F) N' ^2 a: i6 s9 X! e
    8 T% I! `% i) E4 w3 E3 |! o3. warn 给用户的警告信息9 H0 J0 N2 V. w5 Z, ^( p, m
    5 z) r. l5 O) x9 J) _" p1 s+ K+ V7 U2 d
    4.error 给程序员用来调试
    $ I# l& n) E; a0 G5 C4 w! h: n# i) e2 r; d* A8 ~7 t+ ]0 A0 u
    Debug—-〉info—-〉warn——–〉error
    ) k+ t4 Q# v, T% n' _4 w1 D" N2 X$ f
    4、配置9 v( h) l1 b# Z, {" y

    # U8 N# i' O' @" f% ?  }1.配置级别
    9 d( j+ z& n$ x( Z  P
    + {: L9 W& R, [" g2 D: A4 s/ O2.输入源 (控制台和文件)
    ! m$ y8 w$ v# r- F$ s& }2 i& }
    5 n, x% T! P0 @0 F* h! W3.可以进行分包控制. h& e0 Z- m, W

    + D: y& U6 Z' O& h( ~( r: Y, VLog4f.logger.包结构 = 级别0 a  c' S  r. v( W2 N- W2 B, W! V8 f. O5 {. _
    3 J% I3 r& M: G  u; b
    5、使用
    + R) w4 o* D- Z% P0 j: G0 ~( V0 r* f7 M" I3 h
    Logger log=Logger.getLogger(Test.class);' Z) r# C  L2 Y" f4 K

    " R$ n, A6 n, n    public" I; r5 \1 h- c* l* v
    void t3(){. v: U6 G# s: }$ ]2 M/ u
    - [. g- O$ U- `5 C, K- f3 B
            log.debug(“this is debug”);, {1 P) [: ^0 P2 T" g" ?

    3 d! u# J; ]% \# [/ p        log.info(“this is info”);9 m. n; ~7 _1 ^( V# u

    $ ~8 x+ f0 G; D. {5 E        log.warn(“this is warn “);# i4 G% P2 C: k" ~! c! M- {

    3 d' C' v& G2 H$ o& D# r# p, A        log.error(“this is error”);' q- u- i8 v5 q+ R
    1 c: Y. [0 S. K, R4 W
        }
    2 }- Z2 n7 G4 y3 z* e; L4 K/ S2 H' w5 W9 w7 o7 ]& I& C
    Junit- P" v6 s" g+ W/ G2 e$ w
    1.是什么?
    & h' J% _5 t9 p0 h$ z1 s2 B% c2 Y, d2 ]1 y
    4 P0 |  o' B: d$ _) H单元测试的框架
    3 u# {, l' s. o. k+ _9 [: R+ P0 a2 u2 {
    2.怎么做?' o: J: I8 C( P6 z
    5 b, r. T9 M1 {6 c2 G( p
    写一个类继承TestCase  M6 a! T1 C1 W# Z, ^, G, C
    ; Z4 G% n+ {0 o' l# f9 x
    测试的方法一般都以test开头并且没有参数
    - M. ^& `. \9 }2 ^; S# |2 s- Y
    $ P9 P% q8 [* B( _0 W在测试方法前执行的方法public void setUp( )
    5 T1 Z3 Z" l" N3 E* G7 ^1 Q5 u$ y5 @) H4 x& O0 i# m' g1 @
    在测试方法后执行的方法public void tearDown( )7 h. z& V# m/ e* x, Z
    ! W3 k: z' y+ P$ H
    error和故障的区别
    8 F, Q5 E5 O: S4 ^& t; K; u3 S0 F8 d0 W3 F$ e7 T
    error :代码有问题) e2 n$ `  H7 R

    2 l% B/ c$ n( m1 N故障 :逻辑有问题与祈望的值不相符合- X% c4 I7 x# n, D
    ) Y8 ?- @9 V! P3 i6 c
    生命周期
    7 `2 \+ s3 ]' o- |5 ~, f/ G
    , q, m& P7 s: t! M测试—〉SetUp()—〉testXX()—〉tearDown()—〉结束;. Y# u! O% l/ y8 N$ S

    4 @+ b( y8 S) V# O, TTestCase套件
    * N1 [* \- a2 k- Q# h+ t, U3 v) T3 a9 }8 a& w; l. Y5 h
    public class MyTest{) p4 _, ]3 m1 J! }

    , A9 Y! I" r- u, m9 ]        Public static Test suite(){0 j, O- `& O, m* K

    0 c  h/ w1 e: D5 F7 k( NTestSuite suite = new TestSuite();6 N# F6 Q4 w% u

    3 M5 P  U2 ^2 m) A: W* B8 S- isuite.addTestCase(Test1.class);+ C& o" M. }( c# d1 d2 N# ^
    ! i% ~4 q) v, m' O  g6 O6 n; b
    suite.addTestCase(Test2.class);/ l7 C) d9 ]/ S; `

    ; L( z- j2 k/ h1 O" m( y+ z}: u2 O' {" N5 t5 a7 A+ K8 i

    / Y2 n# m6 K- n: c; Y}/ _% c0 h( L6 O- p9 ~; U! k; ^
    % Z- A  P- u' O  |# K; p. B; d

    : I* h! }6 Z8 e) H3 |* u- x8 b  k) f* I" a1 O
    Ajax6 e- H% V7 X8 y7 x; f
    是什么?
    - D3 |8 ]. k; T/ a% V8 dAJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。是一种创建交互式网页应用的网页开发技术。
    4 Z; _. H3 h2 \+ a9 Z7 r0 V% Q% U5 O3 V9 p0 D
    无刷新页面。
    6 O3 d' g+ Z" M; m9 B: D9 O+ G" I! N, `+ V3 A
    有什么?
    * I. K/ O% a- i, kAJAX是多种技术的综合,包括JavaScript、XHTML和CSS、DOM、XML 和 XSLT、XMLHttpRequest。0 R1 k3 m3 B3 U# M/ i- n
    - u: z9 H1 X9 `! B& G
    能干什么?
    ( D. k& Q0 F/ l9 B! W& D# `  T使用XHTML+CSS标准化呈现;
    : C9 F; q3 ?4 ^; Z+ k. a  f使用DOM进行动态显示及交互;
    & C  i/ q+ V% K* h7 m使用 XML 和 XSLT 进行数据交换及相关操作;
    6 q& d% l5 ]$ g! Q$ L使用 XMLHttpRequest 进行异步数据查询、检索;
    % R% S, \! U5 ~/ J使用JavaScript绑定和处理有所得数据;# \2 w9 {, U" S7 E; V
    . D) s) T9 G: _  B6 n0 W* l9 w) i
    传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。
    6 h/ ]7 J- N! E, O3 L
      @; i5 M4 n* o5 y与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。* }( O8 L  C- K, x+ A

    & O; l6 A) E6 O+ G- ^. M使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。; d9 f$ U7 a, S0 j2 g, l6 y! @9 b. I

    + u( R0 P  A$ s# F- U9 H9 Z对应用Ajax最主要的批评就是:" Y- R% K9 S3 j! O' R* i
    1 它破坏了浏览器后退按钮的正常行为,就是用户点击后退按钮后不能看到之前的数据;2 A2 E$ h# b: ~. @, H1 n% z; @6 {
    2 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;
    6 r9 k: U1 k9 C9 O; B3 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;; w2 b8 a- g( m4 o% u! R4 ]8 o
    4 Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;; r* E' q! l* ~$ W2 C

    & `* x3 V7 Q8 C; i+ R0 O; q: t# n! z怎么做?" {% d8 h: `0 q. d" \! x
    <script language=”javascript”>
    " n: I8 |. L" \+ f) }8 x* e
    . a5 a8 g4 P- Gvar req;, y0 T" E0 X7 n/ F
    8 c& \, W4 D2 g  E1 D' G! J
    function add(){/ E" G! \/ K( @' v6 S

    ; z5 l5 S1 h+ ]% ]1 c3 }  x5 d//1:创建用于传输的对象
    4 X& ]: B5 e3 f& t
    ( F2 D- `8 {- m2 K# @3 treq=new ActiveXObject(“Microsoft.XMLHTTP”);
    + I' E* _4 O4 k  J" H3 T. K- O6 U
    3 B" F3 L: d- L9 w" l$ j// 声明返回后,处理数据的方法
    - l0 G" Z, m7 l5 d; v% S
    & J: ~# w3 h: _1 f# R+ ?req.onreadystatechange=manage;. |0 L% `/ o6 a! D+ R, e9 y2 l

    ) `# j; I7 P; c) ]% a//2:准备传输的内容
    / O4 C2 C5 Y! `( ^
    # |6 i, n; n; q5 S6 y8 Avar str=”test1111″;" r1 I( d& ~! r6 d0 q+ s

    - O6 P& D4 G. a//3:发出请求9 f& e$ {3 ?5 _' D
      f7 B% n5 r5 G/ `0 f5 _
    req.open(“GET” ,”/others/ajax/test/t2.jsp?str=”+str);
    ' n- G: t, \( o4 ~
    * P* C7 j* X7 yreq.send(null);4 I3 ~* x# L0 W4 P3 L# @% b
    " |1 S$ R* b, [1 O7 j
    }/ v( ~" k1 H# \$ J9 n' b

    . ~. O9 Z5 x7 V- D. C( }# P) X//4:接受返回并处理
    . i) P# z! a* h' y5 V! E
    ! ~' L' S, i' R+ v' P& J' e% ifunction manage(){- `* w' z' F2 _% }' }9 N6 k  Z
    - x1 p' t# t/ r& p* P
    if(req.readyState==4){7 ?. e* f2 b1 q8 u% z

    $ E% \# S8 l5 v- Oalert(“r==”+req.responseText);
    - e" T0 `9 }5 C
    ! g9 Q  p* S3 E5 ]}7 H2 F# y1 X# A) q/ z

    : k* d& f! a# [/ X# f$ H: k0 u}+ z( d: `/ e0 Y2 s
      T& K" c) \0 d2 u# |" b( W, Z6 w
    </script>2 L9 L0 j% ?) e/ U& \$ w8 J& s9 J% C
    ( Z# q- q8 C0 [% y) P# L! q- \
    readyState的取值如下:0 V( J) I$ p/ E7 ]* O

    7 }0 L# i& c# i( x3 Z# D+ D6 I  0 (未初始化)
    . y( }/ M$ f: a1 _3 |
    3 Z" ?% A& l3 N3 y  1 (正在装载)- }6 V. }! O' P% R5 x; x8 [
    ) T# D2 L% l* [4 ]$ v
      2 (装载完毕)
    & Y( `5 ^; O' W( O- V  t7 c8 b/ L% _& x* [2 I( J
      3 (交互中)
    4 B  V0 s; a7 \6 ?6 y' A6 N
    / y! p) \1 t6 O+ _  4 (完成)2 T2 Q7 v+ Z7 V' h) i$ Z

    $ C1 T  s6 a8 n" x" y8 o
    & m2 n$ J; I$ j& ^% `2 V
    " p/ _; Q1 V2 Q原理8 ~1 E: Z6 [  h5 |" C9 l
    Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,可以是xml格式,也可以是一个字符串,然后用javascript来操作DOM而更新页面。2 e. t) x' G" I+ ^: l; p

    0 r: u7 J5 j* I* Y" lDwr* O/ }9 {5 Y0 ]. y; ~
    是什么?
    & A' o& S4 Z( G  X( ^. iDWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的页面。它可以允许在页面中使用运行在WEB服务器上的JAVA函数,被调用的JAVA函数就像是在页面中JavaScript方法一样。. B" A- h# O! I6 Y- h% g% R
    , `, n% G5 ^7 a. i: Q
    有什么?
    2 D) I: j8 g  G! r7 @6 [7 e它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据;另外一方面提供了一个JavaScript库可以帮助web开发人员轻松地利用获取的数据来动态改变网页的内容。
    : }1 Z; t& N+ L) o' @( A6 v2 W' y1 A0 y8 d3 m9 z( k

    # @$ B7 Q7 {7 n" W4 d2 o+ T/ w5 s. ~  D( b# ^
    能干什么?5 b; I( y8 n# b1 P- |
    动态地把java类生成为JavaScript,感觉调用就像发生在浏览器端,实际上代码调用发生在服务器端,Dwr负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制。
    0 F$ I( @- x8 P" ~" c/ K7 Z4 s
    ( [: a* R0 [7 w2 @+ c
    1 w9 m  \1 _5 V) y2 Q4 O
    + k  o( o/ l. A* o* @怎么做?' B, V) ?) d( ^" ?6 M
    ① 编写配置文件
    ' I: z5 o3 \7 E9 [  S& H/ P, i" S  b; \+ s2 E( v* ]
    web.xml! W6 C' g% n* S3 |# C

    ; L! a1 Z, V2 G+ ^<servlet>
    0 R- c6 d: z4 ]: t8 G1 s) w
    3 q/ h! q3 p, T6 B' B6 \, Q' V<servlet-name>dwr-invoker</servlet-name>
    7 @% e+ {! P$ H: T1 E) Q. l: d
    <servlet-class>
    " j5 e) O8 P1 Z! o
    2 p/ n+ T& K* Z/ k  oorg.directwebremoting.servlet.DwrServlet, G3 U, r  a( y& t
    4 y6 ?' j4 ]! O' L$ G% W
    </servlet-class>/ |7 B* M% E: l" b. J! w, o

    7 r3 |" ]) i7 E<init-param>2 [3 b+ t) t9 U6 a6 m$ y) y2 F

    # M. e. s* r  y* ^. k5 }0 A<param-name>debug</param-name>
    : d% I9 C3 f# S( S+ y- C5 @4 c' P$ K  ]- ~6 p
    <param-value>true</param-value>5 p8 y& N, M$ R5 a( Y
    3 u; f( [9 S4 H, k: J% L6 Q
    </init-param>9 C+ `* e$ k5 o' I
    * y; {6 {1 i0 l- U9 G
    </servlet>+ s; Q: J5 y( @4 I8 s( t
    / X5 s* q0 P, p3 N9 I5 X
    <servlet-mapping>
    4 K0 Y' L5 V3 o/ i
    & C4 I& A) d# G  `+ r! i<servlet-name>dwr-invoker</servlet-name>
    6 Y+ _2 e5 B$ L- I9 V! i
    * j3 d! ^; V8 T( K7 J  f<url-pattern>/dwr/*</url-pattern>3 h- I$ i( X7 p  F6 F9 ?
    + }3 M8 U0 Y5 ~+ c* E  u9 w: r, Y% m
    </servlet-mapping>
    . I, E0 B( E3 G6 L7 Z3 I  k' A1 m' k/ S5 F7 U' Y; G  e
    dwr.xml, p7 Q  J5 v8 ?0 F8 p5 H

    6 p; N; T5 Y. i5 {0 M<allow>
    7 s9 T7 S# ?% ^; C, w. P! E- E8 R* `- @1 G- M
    <create creator=”new” javascript=”kc2″>
    - I0 K, i$ V; j, m; s. V9 O" }1 W: l1 R% c. @9 n! l4 V. @
    <param name=”class” value=”dwr.Service” />
    ; R  ]/ O0 P- h) n8 e1 c8 q. m# N. b
    6 p* D$ I5 O8 w( v; o</create>- j8 h* }$ V! @0 {

    ; ]2 H+ q! J, d0 U2 i</allow>% I3 T( S- R( y8 \, y% F
    ' Y) h- e* C5 X3 m
    ②编写service
    0 D- d8 z8 h+ H& H& D
    - M& k4 g# b# j( @( Cpublic class Service {
    8 T4 S" V  X8 z/ d# f3 R4 T) h+ O/ Q
    public String sayHello(String yourName) {
      m2 \$ ~0 {  I' L7 v  a+ X
    0 x! t; y% F4 g& U3 K' t//可以是访问数据库的复杂代码
    $ _, z& W; T4 h6 Q% b' K$ m% f9 ^* h; x' D# }1 P2 U8 A
    return “Hello World ” + yourName;
      ~; _( V( |/ j+ p5 z6 }0 a3 q2 H: y& _  c" u
    }
    * \0 T& q' E4 L1 ]: H& y
    2 ?! [8 d# E/ V  U}
    , g! E3 a" `7 v- G3 ~1 N9 Z  T. M, A5 e, R
    ③测试DWR8 S0 \" K3 o$ s  |/ x
    - V* H" H+ r) @8 ^1 E' v- z1 \: c
    将代码放入应用服务器(比如Tomcat),启动。
    % P1 i7 J, `! o$ X
    1 v- ~- h' U% _. E+ i9 G然后在地址栏输入http://localhost:8080/你的工程/dwr& z$ o, @+ n9 `. V- F9 o

    7 P9 N9 P6 k+ _2 q/ V④编写jsp页面3 y, s/ i/ d5 K5 V( c+ z9 y
    9 D* f+ A0 M5 Q  \
    1) 要引用3个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js
      ^4 R/ a! S1 I# P4 I) ^0 I; J! t
    0 y; m3 r9 B( G1 C' r2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样/ A* ~' y6 z) ~4 k% U& |* d! q
    2 o& a) B& h1 W* e" L# b; E# G  F
    3) js里的service.sayHello和java类的那个有一点区别,多了一个参数,用来得到返回的数据
    回复

    使用道具 举报

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

       

    关闭

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

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