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

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

动态微博

12
楼主: admin

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

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    11#
    发表于 2014-12-03 12:43:50 |只看该作者
    JEE3 z! n4 _9 C. [4 ?- d
    简述JEE
    9 d/ X1 k3 m2 OJEE : JAVA  PLATFORM  ENTERPRISE  EDITION
    ; K& I; e% D* E- Z$ o6 o
    + ]3 \. M# b5 w2 }7 yJEE是一个规范集;4 `- ]+ j* ]/ y, j9 |  Y

    : a: ?! |: s; ?4 x( ]' i! [; FJEE是一个框架集;
    : n( D6 L' D2 I2 x% }
    ! E1 g! }: @5 M- h! z3 M7 q# m5 QJEE是一个技术集或API集;# U' y: G+ R# \4 `

    & ~) m, H$ C* y" ]适用于创建服务器端的大型的软件服务系统( d/ E8 b  I4 V) p
    ; W* |2 O$ k4 q

    . y4 [% i, V4 D$ M1 x2 Q
    / t9 I) h: P' z( Q1 _0 DC/S B/S 模式- q: _* K  h  ]: L. u: {
    C/S client/server即客户机/服务器模式,客户端也参与程序的运行与计算(富客户端、胖客户端)
    7 \- U0 T# M/ y8 R8 Z' V( x" Z, M6 l1 Z( K# J$ }6 s
    B/S border/server即浏览器/服务器模式,又称为瘦客户端,客户端不参与程序的运行与计算1 g# W4 V0 A# ~! r! L$ p$ v  _5 k
    + t0 ]* Z# S' C+ I
    5 S- n3 W: N! d# y5 o

    " B. X, y& k4 y! c' \5 U企业级应用(大规模的应用)的特点
    . C: z; i" A1 R% a9 v: ]) |+ K1.生命周期长、稳定、可靠; u/ d: t3 _0 x1 m/ P

    % A( ?& T6 L; U5 I8 Y2.组件往往分布在异构的环境中,能够跨平台1 h& V% b0 O' B6 }( h" u
    9 f, r$ t4 Q2 V
    3.维护性、扩展性、重用性, X# K  S% X+ G/ @
    ! \% A( E- j4 w+ t8 n& e; b
    4.有事务、安全、线程
    8 ]7 U- W, {* g4 Q8 f( U6 }5 F+ q
    ! M6 K& O" O: \; y+ s' V ) s% D3 N- i$ u, X

    . j6 c: M5 g2 N8 a3 Y  Q什么是业务逻辑?7 [' \! r6 O/ n; }% ?
    依照业务逻辑划分模块,, G3 T9 O  ^" M5 K! _
    , g% ~  r' ?5 T( T
    所谓判定业务 就是具有以下特征:
    - [. q  a; c6 X0 Z2 Z2 `. q; O/ U9 [; q# F
    1.业务流程. ~* S1 K# E) u, Y

    $ M$ {6 h3 `+ q- c/ K, Y2.业务判断4 G) h) \8 {9 C( Y3 c4 Q
    * X. x/ e+ V$ r# B! w% `
    3.功能组合
    " v1 q* k. [/ r% k' q. b8 y  F; ?8 J4 Q

    5 M+ _# d8 f9 W3 _7 ]- v
    9 ^- B, G1 A, Q  d  M- A1 G平台(角色)的划分6 T" k7 L3 b) o8 M$ c8 i8 E; s
    1.平台供应商。提供满足API集实现的厂商(BEA weblogic IBM webshphere)
    3 }/ T0 x6 s9 T7 q
    3 j' b) N: Y( y, f% y' {2.组件供应商
    ) g: z1 f& P# r7 i
    5 m1 E( n, f1 K) }3.组件装配人员1 U" @5 i, M) e% {8 i% y

    + R. Z5 ~4 S5 E7 a6 D* v0 c4.部署人员1 d1 b6 w3 q# n1 M
    0 J* N" q# N4 I7 H2 {2 c
    5.系统管理人员2 f- [- w  m! @' U8 l. w8 N5 R, m

    / {  g% B' j6 }( b3 h6.工具供应商 提供开发组件所使用的工具(Jbuilder、eclipse)/ g3 _7 F2 l  u6 s

    " L5 x. }# S" A, ~3 E1 _
    ! i3 n2 c. |& d9 _4 C
    5 M" `/ W) b0 ^. |7 r2 ?java技术分布(设计架构 模块内部设计)
    1 [; }% H2 z. z( V$ c/ E; k, K1.表现层 Servlet、 Jsp、 JavaBean、 Taglib$ b2 P, ]: F7 Y' }
    / Q+ f7 h. _0 \
    2.逻辑层 EJB(SessionBean), \# M1 C$ H  ~* e

    ! O3 m# u  X4 }2 K3.数据层 ( JDBC  EJB(EntityBean))( k9 v; f, k" G7 @! }
    2 F; U% I1 F6 a- h  C- O
    4.服务 JTA(JAVA事务架构) JTS(JAVA事务服务) JAAS(JAVA授权与验证服务): e& d1 A( n7 w& _* n& G

    4 W, w( V9 C+ Q. N( W5.分布式通讯 RMI(IIOP)+JNDI 、JAXP(JAVA 的 XML 架构)
    % j7 q9 U) D* n+ C: b* S, T* F! l' f9 ?8 i9 Z) V* [! Q! j
    JAVAMAIL(邮件服务)、JMS(消息服务)、IDLC、JCA(JAVA连接器框架 (成))2 z7 r# u$ P$ T
    : s* V) a6 H# r' }7 P

    - A% u1 l, v! Q
    3 E" V) E3 X( _- P$ kJEE的体系结构: 是一种组件的体系结构/ h* ^4 p* ]8 Z* w2 I6 |
    1.组件 : 能够完成一定功能的封状体(独立的功能的集合)
    . d- U4 G% D1 A. b; p+ _) W8 J
    " h  S5 i9 |, Z9 _4 H不能单独运行,必须运行在容器上
    , a) k! r( g6 o: p' a% c$ b  q7 U# p$ _( t. d& a
    分为两类:web组件、ejb组件
    7 y0 v" e' c- Q6 j3 w
    & y/ Z& h. D2 n+ q3 D; c2.容器 : 提供组件的运行环境,并对组件进行管理(一段程序)
    + m5 Z! R* I; }9 {, o; F4 O! N) |/ M6 V8 C
    管理组件的生命周期
    6 F. t# s$ O: `/ k1 u" ^3 l1 ]
    # s- W, O2 \7 e5 O+ }8 h  _不能单独运行,必须运行在服务器上
    5 V! {1 Y% I, @2 Y( K! V0 e
    % g9 `# W9 c/ k$ c+ a程序(组件)通过上下文来调用容器(context)
    0 S( f3 ~- S+ E7 V; N4 N) v; L% P6 H) i: X) U6 X1 o- i
    组件通过web.xml向容器描述自己,使容器能够认识组件9 B1 G' |6 f4 Z, t7 L* ?

    ( H; m" H( L- G: D: D* X  H容器通过回调方法来调用组件
    2 n: R$ P  y$ m4 \2 v* i+ f
    9 Z3 k. d8 H$ I3 Z5 Z( G分为两类:web容器、ejb容器1 ]* m. U0 ~% G: z

    % E% i+ a& \; U7 {& v3.服务器 : 提供容器的运行环境,提供大量的JEE基础服务* [  E4 Y) O  J( m" A

    ! G3 V/ }% Q' ~1 Oweb服务器(只提供web服务)
    . A) Z5 H# b; i' ]# Y: i+ Z6 m1 Y% h. h. j
    jee服务器(提供web、jee服务)( ]7 B( N6 v  G6 k" Q% Q& u

    8 B2 T7 m% l1 S 7 s8 _# K$ F/ u; o; R: F
    ) T4 @8 {9 a; g2 m: }3 l2 s' V
    什么是回调方法& f% D$ W$ C% U% q; w8 _
    由容器自动调用的方法,就叫回调方法。0 ]6 ~! v- L: h2 o0 C1 U0 j, W

      v# o* z7 u  @+ A * d4 j9 Y2 q1 y0 r' [) V: G+ I
    , t  g$ E; s! Q* y
    RMI远程方法的调用机制
    4 z" G* A8 G# q- ]8 Y/ D2 @例如:A主机有B()方法,C主机有D()方法,A 想调用C主机的D方法% B) m; [, u8 a0 d" g

    & @1 a4 E( E! i5 p. ]: H* |! s7 K9 w; `3 l, @
    ( T$ M+ e, _$ r) r) q
    ) h4 _; l" {0 E1 v* ?  x$ ]! P/ Y

    6 g+ P( N- ~9 D; T/ m* ?* }# Q学习方法
    3 h3 |, u, U& \7 f1.规范(熟记) 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 |只看该作者
    Servlet7 m, N# A7 H$ Z2 A' r
    •     描述war包、jar包、ear包的结构" G9 m7 [3 x) n/ L: z

      1 r! i, ?$ Y3 x( z
      ' n  K- a/ o3 ]5 o, Y

    war-                            web文档压缩包

    —WEB-INF

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

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

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


    ) H5 D. s# q/ X2 v' }7 ?

    jar-                             java文件压缩包

    —META-INF

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


    0 `7 A, P( u% X) Q, r% q

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

    –META-INF

    —Application.xml 配置文件

    –*.war

    –*.jar


    ; k$ s" p" ?) l9 h8 a
    • 什么是servlet?servlet主要做什么?
      " Y8 J2 v" `" W4 S, Q
      2 R+ K% f5 Z2 U7 k' S& X

      3 R- k' u6 j( s/ f5 `- W& Q- \5 s

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

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

    4 U) E- P! g& t% ?$ F0 |
    • servlet 与cgi相比的优点?servlet的缺点7 f1 ?! }6 @6 ~* u1 t

      2 G  f$ V7 G2 T$ w7 @3 m+ N& Z! p) [& W) P, _. q# o

    优点:

    性能(线程比进程更快)

    可伸缩

    Java强健且面向对象

    Java平台独立

    缺点:

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


    ' R8 x  E* ?+ m0 x, y* p6 @
    • 常用的servlet包的名称是?
      8 L" N& u/ H  P5 z: L
      6 E- V' o0 ?. A4 {4 H; V
      9 J  O& f; B: V  d

    javax.servlet

    javax.servlet.http

    % |2 }% S$ ~- s$ `4 A  O& z
    • 描述servlet接口的层次结构?+ F4 V( n* {0 U
      ; u8 v+ b2 m, l! X2 N
      / @2 j& K: B* @* O! z7 P. @6 g% Y

    Servlet

    –GenericServlet

    –HttpServlet

    –自己的servlet

    ServletRequest

    –HttpServletRequest

    ServletResponse

    –HttpServletResponse


    % d0 x! s7 U* u) W  f% R; x
    • 对比get方法和post方法?
      , [( n; n9 `7 f7 x- z4 C

      : z% d- t6 n0 U7 i" \+ ]* J5 {( z: I. }5 O) b- U

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

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

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

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


    ' T7 l7 G, Z" [  _4 d
    • 归类描述HttpServletRequest接口都完成那些功能
      9 p- p) Q7 E  l2 F% u; Z
      ( T2 [' h; k9 l5 u0 M
      ! l4 f% ?- H/ |8 i
      • 读取HTTP头标) T" H4 T# m6 @
      • 读取cookie4 w9 U' x8 s: k* O6 K9 O
      • 读取路径信息
        & q( L" m- R) ?- C9 o- ^
      • 标识HTTP会话。4 W9 \% f0 ?2 M1 N- E
        4 ^6 A$ q$ ^! ~. [/ o0 |
    % y; k- H( S% w
    • 归类描述HttpServletResponse接口都完成那些功能+ G5 j  [# v* T8 H2 s4 |( q
      ) T! A% Z- s1 @# a

      2 D+ _# ^% M& [3 g& N2 o/ m
      • 设置HTTP头标8 _/ [5 j" i3 N+ A) a% f2 z
      • 设置cookie
        8 z( v+ |. C& s$ J
      • 设定响应的content类型0 }  l  ?+ U" X) L1 r
      • 输出返回数据
        7 j' u* L  p2 }5 r/ Z; a0 `. z0 k$ F
    ; I) s# M( v7 [6 ^+ v9 P! w& V
    • 描述service方法所完成的基本功能?默认是在那里实现的?
        L4 |( N# `( w! z9 u* s# X
      7 K: [4 G# ^# d6 ~" m0 c
      8 T* u8 i' J$ U  d9 L

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

    实现:默认在HttpServlet类中实现

    + j1 E2 u1 q: N2 S
    • 如何开发自己的Servlet?描述应该做的步骤和每步需要完成的工作8 i3 J- G& [( A) F' H
      1 j- M# S7 N! b- ~& q0 f; z- n
      : o6 S+ ~) x3 t. h  H$ _, a, p$ P

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


    1 V9 ^! R4 `" r2 X1 Z$ W: G4 n; N+ `( q
    • 为何servlet需要部署描述?$ P/ m. i! E3 v4 R& j
      6 n1 Q) Q/ N. A  \. {% O5 y- [$ l
      , \- N8 j. |- b5 Z  e) @

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

    % U$ p! e  j* u
    • Servlet基本的描述应该是?请写出来* Z1 N- B% G7 ~+ ^) v

      ) [' `8 Q  Q4 C  D5 r
      2 f- }' H  y4 H. r& |

    ) Y) [$ \9 r; y; q/ F# q4 v, j

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


    ( L8 n4 N( w# X5 W: q1 v9 T$ a) g
    • 如何在html中使用servlet
      0 W3 O  @, d6 Q* m2 p% d: T

      ' l% \: j; O% d2 S9 @1 _8 |! R  ]; p5 c7 \5 ~

    FORM标记

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

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

    语法:

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

    {HTML form tags and other HTML content}

    </FORM>


    3 D+ X+ t2 G2 i' @. r
    • 如何接受request中的参数4 L! w. R+ E; }# _9 D' F& E

      5 W' K, p  t1 G, bString userName = request.getParameter(“userName”)方法
      ) u) J! @/ y7 ~2 e. X9 e. [8 u/ [) o3 f8 g

    1 D* ?& i+ Y5 O7 g, J
    • 如何接受request中header的值" t9 B0 Y8 o* P; q8 S- L

      0 t3 q) Y' E3 Y2 |: E
      3 g' q# b# D- N, u- d: W) I- h

    request.getHeader(name);

    request.getIntHeader(name);

    request.getDateHeader(name);

    request.getHeaderNames();


    : H5 E9 h' j' Q" J7 O3 o
    • 如何输出html
      $ t5 c- O) ^6 l$ p4 C+ {
      - x! @' z9 F' z9 d

      - C+ q1 w) {8 b3 }" c9 ^

    PrintWriter pw = response.getWriter();

    pw.write(“<html>”);

    pw.write(“Hello”);

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


      A+ Z/ H' }4 W2 _$ @* O
    • 如何设置输出的contentType5 J: N$ `5 t2 s. X9 J/ _& [
      ' a3 r; {1 l# P9 w5 J8 G
      " D0 e! s3 ]4 I" W3 x! ^% K' E

    response.setContentType(“text/html”)

    + u, U- a& J$ l+ @
    • 描述servlet的生命周期?' M- K# Y* Q7 M# k% _9 `

      2 z# S5 v8 B% W4 q. n0 Y) ~# Z( b8 j% d; |+ x& W7 l

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

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

    3 U: b' ]1 S- v: {" y+ e# \
    • 描述init,service,destroy方法的功能和特点4 S0 S# W. d1 a" x7 z1 G, @) R' Y" M
      - P# D7 |0 d0 s: l( Y. u; L
      8 I* Z3 G/ E; }+ @( _

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

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

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

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

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

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

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

    9 ~) i; g) K+ A  v- c
    • 什么是回调方法?有什么特点?" G$ N$ W; @6 ~) l- `! F
      * d# j# a2 ]- A3 N0 |

      ' ^$ U# P/ c0 v! ]  _9 j: a

    由容器来调用程序的方法

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


    ! q4 T% b' j' L% j: ^- ?
    • 如何设置初始化servlet的参数?
      ! I; q! c2 H' ~" j) L( u

      + o9 e( ]( Q+ t  ~# u在<servlet>中添加如下配置$ p7 C0 P9 H  ~
      & |$ a* `! q/ i" ], G

    <init-param>

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

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

    </init-param>


    $ A. c5 r9 C  M+ D6 p7 ]  _
    • 如何获取servlet初始化的参数& x0 }6 f+ b6 K' T. ^% T1 S
      : I. Z4 ^  Q+ d9 K/ c2 O1 }1 W  m" L
      + d" h8 V0 V3 d

    public void init() {

    greetingText = getInitParameter(“greetingText”);

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

    }


    8 U% N! q" D/ L4 `7 Z
    • ServletConfig接口默认实在那里实现的# H* }$ U  n& ]

      ; r0 D! \( v( K: R- ?& Q
      6 d( Y# K! ]& ]; Y7 [

    GenericServlet类实现ServletConfig接口

    ; G+ O6 V8 n1 w) x: t& O" ^
    • 什么是ServletContext?有什么作用?
        {: L* b! {2 L( M; d

      8 }& ~% z( V+ X) f; j9 l$ c0 Q/ v1 |/ f5 |: i. R6 ^1 r

    Servlet上下文

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


    $ e+ q: o  R4 Z- p
    • 如何访问ServletContext接口?是在那里实现的?
      , `+ r& k6 x. b) l4 i
      - C; g! I' Y, k! w4 x$ O: ?
      2 n8 Q7 t: B7 H. w* C/ q

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

    GenericServlet类实现了ServletContext接口。


    + ^( X3 {; T, @; W, P' F
    • ServletContext接口的功能包括?分别用代码示例
      % n+ m+ m$ r/ A0 I/ |7 [

      % Z6 ?! |% ?4 v( D! `+ n' b/ v$ s( k% P

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


    ( b2 F' h( R9 O. H5 p9 A" B
    • 如何设置ServletContext的参数?
      7 ~$ p7 g9 v" Y) m% y

      ; ]1 _  `# N9 }- {% n3 d7 B
      8 ?2 i* o. V+ }6 o

    <context-param>

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

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

    </context-param>


    . \( m+ j: L; \9 B# j2 J4 @
    • 如何获取ServletContext设置的参数值?
      . t9 Z6 F9 \1 o

      3 W) A2 M8 e1 P' R4 z1 q6 X7 |0 }8 W% O1 ]! H4 M  e

    ServletContext context = this.getServletContext();

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

    2 H' T# w% P2 d/ T8 ~" t
    • 描述Web应用的生命周期?$ ?0 r# b. n  i4 J4 x' Y$ W' z

      ) x9 U7 R7 d! O, f6 t0 I9 H$ i- \

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

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

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

      C" D3 N7 ^0 C( f0 o' j
    • 如何用代码实现监控Web应用的生命周期?- H) g3 _( M" m' l/ L- ^. r
      8 `2 k9 \$ T% ]& h' @$ G6 g6 T

      # V. v. _( M, A) X0 j; m5 q  H2 j1 Q! t( u# s( o. P

    public class Test implements ServletContextListener{

    public void contextDestroyed(ServletContextEvent arg0) {

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

    }

    public void contextInitialized(ServletContextEvent arg0) {

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

    }

    }


    " o1 H7 G  u, Q% E- r

    web.xml文件中的配置:

    <listener>

    <listener-class>

    com.csy.Test

    </listener-class>

    </listener>


    ; K3 _3 ^0 _* I( j( B: b: Z4 f
    • web应用中如下错误码示什么意思:400,401,404,500
      1 M) H) N3 g  ^2 j4 J, a. T# D: F
      & t! a( _: _! y& k) u
      400 Bad Request//错误请求
      401 Unauthorized//未被认可
      404 Not Found//没有创建
      500 Internal Server Error//服务器内部错误

      7 {$ k* n' c5 H  Z" u) w

    " K8 B  q6 ]5 c% d, n
    • 描述Web应用中用声明方式来进行错误处理的两种方法  m) c! \1 D( o- E8 N/ O8 \
      , F3 p& k: H1 n

      / ~% y4 r. i2 L: g" C$ |% O

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

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

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


    ( M4 y5 b# G* `6 E% o. w1 R  E9 H
    • 描述记录异常日志的方法,都位于那些接口?
      & P. L$ ?1 e5 Y0 n* P8 s

      : o: n0 s9 i$ \$ V2 v! R0 _1 _; A& ]0 r1 [6 {% i6 J; T# u

    GenericServlet:

    log(message:String)

    log(message:String, Throwable:excp)

    ServletContext:

    log(message:String)

            log(message:String, excp:Throwable)


    0 `* S, O1 Z) }3 y+ f1 a6 p
    • 什么是会话?1 R; x0 ]  {5 W: K. R2 e3 Z
      9 O7 s' T) t* E7 J( y2 ]: M# e0 b
      . \" O& x( Y$ o

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


    $ P( k, s2 @* m* u  g( s) m" ~
    • 如何获得会话?
      ; o% q- |6 K2 {' l, U% `+ @
      4 V# r5 D( K9 L( {2 d% _& \  W! A9 G
      HttpSession session = request.getSesseion( );

      - R' O4 {: ?7 M3 P, V6 O2 E! ^! d
    6 o9 J0 {) w2 o) @7 s  V
    • 会话Api的基本功能?
      / z" {/ e7 E+ n& W$ N4 _$ n

      4 b. B& H) M& e4 r$ T: E8 H& W9 ?$ t1 l( M0 E

    getID() :String8 b0 ]6 _5 g6 A  _

        isNew() :boolean% O8 j5 h; R! Z8 h

        getAttribute(name):Object
    : P+ ?' `- V( q6 P( _

        setAttribute(name,value), _: \, W# a3 R0 O

        removeAttribute(name)

    2 _' W9 `! }: t/ V! B) t; M
    • 如何销毁会话?5 W4 W" h3 J1 v) E& [9 j

      & N/ j$ [0 r1 f4 P. a. [/ x/ X' e: B& A- L, r

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

    <session-config>* Q6 H1 z4 |/ U7 u2 L2 N  t4 p/ N

             <session-timeout>10</session-timeout>$ s' o5 z; _- s# ]+ y

         </session-config>2 [/ ?( q: H# t) V- G" }4 T

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

    invalidate()9 z/ @6 `' i, ?- k: C+ U

         getCreationTime() :long3 [: o3 Z' h: Z- n3 Q$ }

        getLastAccessedTime() :long
    4 U1 f' ?1 k* S3 r( O5 f

        getMaxInactiveInterval() :int8 g& i5 G! x: o6 k6 @0 {

         setMaxInactiveInterval(int)


    1 |# ?9 c- n4 z1 D: ?
    • 描述会话保持状态的基本原理5 O! ]) B9 T  K, \* v9 P

      # Z1 |; ^, f8 l- J& Z: o2 W1 q* o1 }$ }) |& l8 ~4 U. k- R' W

    % b; q4 }. ^1 s4 J, A

        client server9 J* K4 C; ?; A) A& v( n


    " l) e5 M- d) `7 f$ i3 |" t

    request
    5 P7 @, P! a. R7 Z# ~

    response (sessionid)0 t; N2 L& A4 Y, ]9 T# z! L0 e

    request (cookies)
    7 {7 \: z9 s4 K. }2 ^

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


    ) C+ e- k) }# M/ `3 L  N' d
    • 请描述session和cookie的异同之处
      . l8 F. b6 u( z" s) v

      : z9 a) Q5 S+ X7 [: F- m% U& F+ s3 V' k
      C  Y1 V9 H: D( T& M5 V. V- p
    % B& S1 I( b& G; I& J2 S
    • 如何读写cookie,代码示例
      . }- `  O, Y1 Q4 t5 h. r. X

      : q7 h6 U* j% {, ?6 U$ @& H* A

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

    response.addCookie(c);

    读:Cookie[] cookies = request.getCookies();
    3 R$ g& X6 K: d6 k& J1 u* J/ A4 T

            for ( int i=0; i < cookies.length; i++ ) {
    3 f& ~" h/ P. d  k6 M$ V5 Y5 C

                String key =cookies.getName();
    ( M% l0 c9 Q. {% c$ I4 S% k

    String value = cookies.getValue();
    $ [) f- f2 o" J' m+ a4 [' E- d5 L

    System.out.println(“cook”+i+“:key=”+key+“,value=”+value);* e# x6 @8 P3 W0 {& P

         }


    % I! y) c5 ?. C9 p
    • 什么是URL重写,如何实现,代码示例8 {& v2 X# k/ ?- G0 }, F8 u9 M) \
      $ ?1 O4 E: o9 E$ o, i1 u* Z! v

      4 K: U& f7 Y6 K8 r0 I

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

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

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

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


    + ^: g) ?" q& M! H1 l$ v. d5 H# r+ p( y
    • 描述web应用的4种认证技术
      4 ]) V; d. `5 r0 \) W  }/ ]8 o
      1 d. k' r* o! V2 u" ]) S4 |  q
      8 [- X. M5 e+ U* m# X1 x

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

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

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

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


    & r, Y7 ~+ S. {4 B
    • 什么是授权,什么是验证?
      ; c5 v8 v; J$ ]# J4 z1 f

      # T) i6 z# \( H. K( v. {3 f
      , ~6 W8 W6 {  _

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

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


    . ]$ P$ {0 d: H3 m
    • 什么是HTTPS7 C9 O: p  k8 q# h1 i4 T& f( s) ~

      : [! w' L. `. o6 z. {$ X: O) s* H; h) q7 c& x9 G! S

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

    4 H- f( v! J2 k) M7 a5 U3 y8 B
    • 什么是审计?* W1 r0 l% w0 p
      7 `2 Q( i; I# i5 \" B
      2 Z8 F3 E6 |6 V5 Y2 x8 `

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


    7 b' A, {/ R: K# _( W4 g$ K
    • 如何实现声明性授权
      $ O7 h9 A* n( b$ O; C1 A9 |
      8 \+ R9 i* B9 @$ H- K# w! W6 _
        S" q; R5 e1 L) g0 A

    1、标识web资源集

    2、标识角色

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

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

    在 web.xml里配

    - s# k; }8 ?( U4 \, A
    • 描述servlet并发问题?* p- ]0 ^% B3 o, F/ m0 _
      % I4 Z- ?6 S3 x0 z+ Z+ g

      - f% H$ T/ I& m3 ~

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


    ! g& J2 B: G- N! }: j
    • 描述Web应用中的六种属性范围9 f6 Y% [; r5 @4 T  j/ c

      + Q( Q/ a3 N8 j5 P/ y
      # ~: d4 D% x1 @- p, c/ n1 U2 F

    局部变量(页面范围)

    实例变量

    类变量

    请求属性(请求范围)

    会话属性(会话范围)

    上下文属性(应用范围)


    " M$ q" ?  N; _9 P( U
    • 指出上述六种哪些是线程安全的
      , _7 G8 ^& P& m0 g. @7 g1 s

      6 D/ X2 x: w1 H! s4 m5 q& n5 Q! [- M) E2 T' x  i

    局部变量和请求属性


    " O% I' ^; Q: E. |  r+ ~
    • 什么是STM?如何实现?' Q; [& s% f+ I* [" ]" G% C$ |* ~, e6 F
      ; W) D$ K: `* A, T. @% G9 \, R
      1 ^. D; C4 ?' D( _. l/ u, O

    SingleThreadModel接口

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


    % b# V2 U! X3 J9 T, S' r- H. K
    • 如何实现并发管理?
      6 }& @; _3 B8 W( m4 d) o' T

      ) I3 ?- a' @$ s; l2 r9 L3 k) i' ?6 \( f8 r

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

    使用synchronized语法控制并发

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

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


    # E9 Q( m& V: Z
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    13#
    发表于 2014-12-03 12:45:45 |只看该作者
    Jsp: c: o- n; o/ z/ \( T6 N- \
    什么是Jsp?
    6 |' M+ X/ E/ Z, Z: GJava Server Page    结合java和html在服务端动态生成web页面的技术
    # @! {9 U/ Y& E5 L+ P7 H9 P+ ^. Q8 S3 H0 V. z3 ^. O3 e" o
    ' G: F& Y; F6 M6 w8 E( a& s, ]

    % y& k! H4 D! B4 x  _描述Jsp页面的运行过程?
    - K2 Y2 G# s  l& z7 p0 `/ D  u第一步:
    " t3 g; D+ G3 A2 J! B$ R, d1 D
    ; @1 p2 j/ w  T7 B请求进入Web容器,将JSP页面翻译成Servlet代码
    $ `% y3 Q' Q' x$ D
    * V7 G8 G6 k& N) W第二步:1 k4 v9 K2 \- K$ a& E& b
    . r5 p, a; s) L( f* k5 G
    编译Servlet代码,并将编译过的类文件装入Web容器(JVM)环境5 V. j) |5 x9 _; n+ e7 l/ S

    + D' e3 K9 R% b4 R- K* W第三步:
    9 x1 ]% O6 C5 Z; E8 B, g7 g$ w& j, [1 X7 _& i0 {7 O9 F$ a9 j
    Web容器为JSP页面创建一个Servlet类实例,并执行jspInit方法. M1 k/ M/ `4 k" m- t1 C
    # A* n& c  f) s6 [
    第四步:
      t' I$ j7 x0 B
    ( x* v8 l& S, {6 y# mWeb容器为该JSP页面调用Servlet实例的_jspService方法;将结果发送给用户/ Q1 e, k& I, Z* ]+ p8 B5 |
    " C- q) D- Y! R% T% R

    7 M9 D, _) ]$ @) j
    2 b+ H6 C5 d2 |2 `$ |+ x# f) c描述Jsp页面的五类脚本元素的功能、写法、并示例
    4 V4 r0 R+ ^5 a5 M- x( s) F注释 <%– –%>
    5 g0 j' A8 x" w7 S* K
    % ^8 q3 w, @% X" @# k<HTML>1 l, y# X5 p: X9 r: g7 P5 i

    % v7 H' I  I' G8 i5 T! \" M<%– scripting element –%>) I6 j3 N) h" Y% [8 C) y

    2 s& h2 H9 J' M8 W' H; t6 _4 Q& _</HTML>  F! L5 h  r2 n/ x

    & g" @8 Y1 a+ W7 r指令标记 <%@ %> 指令标记影响JSP页面的翻译阶段0 ]: e6 s7 X# B& ^& R

    1 ]! C% c  Q* F' b! A3 J<%@ page session=”false” %>! @. ?4 f, ?% v6 B* d, n
    " O  H; b3 `9 t+ m( U$ k
    声明标记 <%! %> 声明标记允许JSP页面开发人员包含类级声明
    5 Z4 U& @: K4 M+ O+ J; K% z# C5 r: x  T3 m
    <%! public static final String DEFAULT_NAME = “World”; %>
    % L& Z" A0 n: ~- h# I9 x/ N, T
    ' K/ x. d. l' ~# [    脚本标记 <% %> 脚本标记允许JSP页面开发人员在_jspService方法中包含任意的Java代码
    7 q6 n" V# G# Z" r. }' F/ I1 K5 v9 ?0 J3 D
        <% int i = 0; %>
    7 Z7 y8 ]; ^6 r+ {1 _& ~; U& P! S: \: R) q1 p% D! L3 ~
    表达式标记 <%= %> 表达式标记封装Java运行时的表达式,其值被送至HTTP响应流 <B>Ten is <%= (2 * 5) %></B>7 j- l% k8 r6 ~+ a% R# }) C; b% ]! ]
    " O: f( e' Z1 C, U5 E6 k- A) N

    3 u1 o7 H( o& u: [" X
    7 D/ F! t& r$ l- N$ ]+ A" j  m描述Jsp页面中的注释种类和写法
    " ?, D$ ?0 S1 h% {1 j3 A" m2 DHTML注释
    # v8 K& ]" k, n# h) [) q- E1 T6 e. [/ l1 s* \4 t: o; F
    <!– HTML注释显示在响应中 –>" ?+ S% O: e3 ?' |2 A9 c- z

    0 _2 j2 z& G" K8 A; J' A- {: SJSP页面注释
    $ h* w9 M% q: E$ x2 }
    , d4 Z2 }1 i0 q8 S0 W7 w0 [/ H<%– JSP注释只在JSP代码中可见,不显示在servlet代码或响应中。–%>
    6 U! r9 N# D4 A! U  c/ h; R/ q0 [' _* \1 Q
    Java注释7 s. D& ~' }, a/ ^

    7 j( _! S8 \5 }4 f3 g) ^<%8 K' A. }: Z- E$ f

    / a9 G- o5 h5 D* L+ _/* Java注释显示在servlet代码中,不显示在响应中/ w6 f; d6 N9 l0 Z
    2 r9 w0 d" N+ D% t8 a. G
    */; ]; v- p9 u& B) S, q

      ?+ A, ^, I6 t4 c%>
    0 h- w3 G3 B0 ^6 \' n5 V7 w" h4 ~- F( |" P+ S6 Z: X/ t

    % i' p" D0 @5 V/ X" A7 }3 r) m" ?5 b
    描述Jsp页面的指令标记的功能、写法、并示例1 \1 P. Y9 k6 B1 R7 ]' F
    指令标记影响JSP页面的翻译阶段) y, A$ v" x0 v7 N* f

    ' \  L% _* k: W8 y<%@ page session=”false” %>
      v( }8 \2 y- V) l+ @$ j/ @6 u5 h1 c( n; ^/ `  V% l
    <%@ include file=”incl/copyright.html” %>
    . J6 y( |, Y! ^" }1 a: n+ _  F0 b+ n: Y
    <%@ taglib %>
    % a- y; m1 f1 l) O/ w- S9 H3 L2 @  i8 x" Q1 ]/ ?- a( R: g
    # R/ X3 b5 l( l6 P
    , p& @2 F2 }7 }0 Y$ i+ T
    描述Jsp页面的声明标记的功能、写法、并示例1 G: h" k9 n: @6 L5 Z9 ]& t$ \
    声明标记允许JSP页面开发人员包含类级声明
    ; |, q- C' \) V1 m8 r( d8 ]$ u/ M
    5 ~- P  Y/ B) f) B2 h& y+ ?写法:
    ( X3 s: X6 ]8 [8 r) _( a( b; p  j& \8 |  f- [* ~
    <%! JavaClassDeclaration %>
    % ^8 X$ d7 ~& `# G# \. s! J6 j( l- }
    例:
    9 w* c0 j- Y- P- ^9 e
    * g, H! Y& W7 n7 e<%! public static final String DEFAULT_NAME = “World”; %>0 a) s9 ^& q# }2 W

    $ O8 {3 [2 B6 L* z<%! public String getName(HttpServletRequest request) {# q; z4 w& [% b; O
    - k6 H1 P; }" I% s# y
    return request.getParameter(“name”);* R  E5 k0 e, m# A. A1 T/ Z' \
    9 J7 K. s: p. P0 Y
    }
    5 g7 u! A7 z: N4 j; A
    + d% H" U- E9 T* [! D/ w6 Q%>
    - r7 i" r! N' {& `! J, L" S3 c" R$ D3 `4 ~) D
    <%! int counter = 0; %>
      o- M/ @4 i: N& Z" L1 `3 y* H" t6 S$ h9 H  |3 |- l0 z7 L

    6 k2 z& C; B. ~3 i! E6 o5 P, i& r! X4 F% s0 c
    描述Jsp页面翻译成Servlet的规则
    - t" `  P8 i: |0 e0 l1 |4 Jjsp中的注释标记被翻译成Servlet类中的注释
    ( u- g- ?: _9 ?0 i2 n
    5 Y, F2 I# O: m! s$ |5 u+ Rjsp中的指令标记被翻译成Servlet类中的import语句等
    2 o( s- ]+ i) |( Z" _4 I' K" Y& Q0 x6 U
    jsp中的声明标记被翻译成Servlet类中的属性3 q$ q/ ^: m9 n2 n+ J

    : S! }* E+ {: ojsp中的脚本标记被转移到Servlet类中service方法中的代码4 Z1 w! j) v" y# a/ V
    5 `3 U+ M: f. b- o0 o
    jsp中的表达式标记被翻译成Serlvet类中的write()或者print()方法括号中的代码! D' N* w+ ~, s4 q1 `

    ) @" e/ p# |$ b# [7 V# {% E ( K% S: Z9 u! p0 Q& f" g' b
    2 P- K) R0 d! Z4 `4 C
    描述Jsp页面的九个预定义变量的功能、用法、并示例) Y& c* y$ B2 k( e' @6 \
    request 与请求相关的HttpServletRequest对象# B3 m; [/ p, p: U4 r; T

    6 v: A+ x4 t: `" D  mresponse 与送回浏览器的响应相关的HttpServletResponse对象
    . K& v1 _  K, N: r* R3 [% a" N# W" z$ N( I6 S/ [
    out 与响应的输出流相关的JspWriter对象
    7 s2 N2 R' S, H+ Z# V
    7 a% s- Y( `0 S/ f2 g4 n& g    session 与给定用户请求会话相关的HttpSession对象,该变量只在JSP页面参6 ]- a0 H1 S; I0 N4 R; ^

    5 g6 f1 K; p1 v5 p* X1 {0 n$ A$ I与一个HTTP会话时有意义
    " o: g( S7 Q& w: D+ H3 `' O0 k4 m! \+ E/ V/ t+ o% z2 m5 L
        application 用于Web应用的ServletContext对象
    : u, Y0 O$ |  g6 c: g! U* ]1 g3 ?: u% ]' c9 Z& z+ h% z/ X5 `) }- A
    config 与该JSP页面的servlet相关的ServletConfig对象
    5 u  j& L" k# J; W4 U$ j  S" c. A, ^  F+ U2 ]" `
    pageContext 该对象封装了一个JSP页面请求的环境1 N' Z' T$ E3 ~

    9 ^$ C# z% \" z9 u  M: dpage 该变量与Java编程语言中的this变量等价% W; Q6 t% u% |8 t
    + o& |8 U; l& A# o! H
        exception 由其它JSP页面抛出的Throwable对象,该变量只在”JSP错误页面”中可用8 Y1 ?) E' I/ }& b3 |9 J( {1 M

    - R+ o" I& f8 g! C3 \3 e. u
    : x4 }0 R" ?* g( X. |+ [3 O5 j
    % j9 ]6 R  ~* b% m! |+ _- K* Vpage指令的功能,写法、并示例,并描述它的如下属性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding
    ' v2 r% w1 D, zimport import 定义了一组servlet类定义必须导入的类和包,值是一个由
    0 e' j; V& ^9 w6 L6 D
    - g1 L, L; R3 ^2 s0 N# h& ?  Z逗号分隔的完全类名或包的列表。
    * u2 }4 A( {2 D1 ~
    ( J, R+ v# N2 X- J$ \, Z$ _/ msession session 定义JSP页面是否参与HTTP会话,值可以为true(缺省)+ m0 @% b3 @. C% E! j3 _( Q

    8 O$ c" ?- B# g5 [4 F, z或false。
    4 G1 H% L  g% _% D, o8 a; `( l' o% ^! R; w
    buffer buffer 定义用于输出流(JspWriter对象)的缓冲区大小,值可以为$ F4 @0 ^7 U5 Z/ b8 |( l

    / ?7 R2 y( d: o- {6 s: U. r& hnone或Nkb,缺省为8KB或更大。
    % K! M+ u1 H+ b- M/ ^$ K7 L+ Q# t9 {0 Y& _
    errorPage 用来指定由另一个jsp页面来处理所有该页面抛出的异常
    " L7 a2 W9 F% W% @% X& o0 _' f2 d5 S1 l: d
    isErrorPage 定义JSP页面为其它JSP页面errorPage属性的目标,值为true或2 r8 I7 R, ]+ x: Z5 H7 w
    & @. o0 d  W, b7 ?# ?6 p5 h. N: C& r! ?" a
    false(缺省)。
    $ `6 C( [  |' d6 \2 T
    : j# L; l( n! _! C; q# m( u' JContentType 定义输出流的MIME类型,缺省为text/html。' {: W( |& \: E! ~- w/ Y4 j
    4 l. B! G2 Q- K) I+ v7 P- @' U# s
    pageEncoding 定义输出流的字符编码,缺省为ISO-8859-1
    : h+ d  o8 m, T2 H. h$ @% K4 I  O2 K& n1 h% E( ~8 @
    - E/ B% r9 k- h; J
    9 z5 a- \: P2 s" M, y
    描述MVC各部分的功能?MVC的优点?MVC的缺点?
    6 f; v) C1 u  Z, I0 DMVC各部分的功能:8 c- \( Y* L; d' `1 ~' x
    % O: X1 g8 b. a" W
    Model(模型表示企业数据和业务逻辑)4 [, _( x) S. ~( k- _) i9 m

    9 i% ~5 \( W; E. ?6 k. `9 B封装应用状态" i4 F- D! [' h+ D
    9 l- y/ i1 ~2 V$ g3 m
    响应状态查询/ [5 S  c) J+ X# ~- F6 Q4 g- w

    1 [# P% T  E5 y7 Y: k暴露应用的功能# A1 y. j; u8 ~$ n2 I9 j

    2 g- z( D4 H% O3 |) n) OController(控制器接受用户的输入并调用模型和视图去完成用户的需求)1 }/ y" l" l) n1 ~3 q
    6 ?# f( o+ f/ ]9 w5 E. P0 s
    验证HTTP请求的数据
    2 R5 u8 f- n5 Q6 W9 J) H# I7 L" G4 _, m6 \+ w7 v; d# b7 S
    将用户数据与模型的更新相映射
    5 Z$ z3 Q: M. V# y  a+ Q3 m  O
    4 b2 ]1 h  A) |% ~选择用于响应的视图
    7 Y7 ]: w* F; f+ G/ {# R! |% T/ q
    3 R: I) M' x. _$ ]View(视图是用户看到并与之交互的界面)
    . P) d5 A, `- ~2 S6 \  d: ?7 F" `5 h: w0 t& w& B% U' }$ q
    产生HTML响应
    8 D: z0 _9 Z: a( O- q
    : v: y1 Y! Y" X& e: f5 p请求模型的更新; c( o% l( C6 t5 G) d

    7 T6 m* G  B/ E9 ?  @提供HTML form用于用户请求7 C% u1 o* B8 \
    4 v' _4 d" J5 |1 K7 I: A
    MVC的优点:
    4 o4 Y# `' L2 U0 f% B: L1 ^; ^" ?* F5 Y- X" ~0 |
            低耦合性:视图层和业务层分离
    ) U& m" c( A4 h, I; [
    - f, u: @0 }# w  W高重用性和可适用性
    3 u1 [$ C8 }- h5 h  t$ T2 z
    % X; ^. }2 y  Y, Z& s$ P较低的生命周期成本3 E: r0 G# ~* m: G9 L4 `7 u8 q

    . a; ?; k. o& _1 l$ u. O: U快速的部署9 G- ]; ^6 m8 a; M. _# l2 Y$ s
    + @- n, j* T* x. ]
    可维护性
    8 f1 ~6 I6 M( ^7 K7 Y. ^5 o/ X8 n
    有利于软件工程化管理
    - J$ \9 n1 u9 s/ B* Z% ~  u2 |  o9 i" F  N( L9 o! B! k
    提高软件的健壮性- U* D- l! y$ h. i

    ) _* ]. {* [" jMVC的缺点:
    6 C" r0 F3 p+ v3 x& P) x$ j- D; R7 C4 j9 ~# \
            工作量大,增加工作的复杂性,MVC不适合小型甚至中等规模的应用程序
      {" j1 Z( i0 U) O
    ) n/ Z  i  n  l( G 4 z5 A' u  B8 C! [9 q7 H1 Z

    . M+ \3 e  n0 U- N2 Q( m6 a什么是Model 1结构,以及结构中各部分的功能
    " m1 I+ f& }; q结构:jsp+javabean1 }$ P/ K( q8 g# {; i

    ) A6 U8 l# E5 M2 V7 c' V# Y  [# zModel1中使用jsp来处理web应用中的视图控制部分# r2 G. k3 K3 M1 k: E: [6 D
    8 Z  ?8 C' n/ M, b% s9 N
    Javabean收集参数
    2 I) N( _  r) m1 f1 j) b
    - V, V2 s& S# c1 ?/ i$ A) H
    - s$ W1 U" L$ I0 p2 h" C" i( q- L
    ! y! i( ^# Q: W- ~3 d: S什么是JavaBean?
    ) N  _: s1 ]' y4 [% d* R( d/ M用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。
    * s( O0 s7 O6 a) r, U% T4 }/ R8 o. K! P& B* S

    # _& ~& M2 ^% G& W) J! x* ^3 j1 d# T/ X
    JavaBean的规则?
    - y+ q+ X- x+ F, u使用get和set方法定义属性
    , ]) M5 w3 H: c/ C; Q7 K. K; Q0 Y- p1 b. u6 \  \0 e
    一个无参构造方法
    4 h( O5 i0 g. P
    4 U. C+ |9 Z, d5 v# \无public实例变量( 所有属性私有化)" n% T7 n, Y: h5 F" u6 i2 Q

    6 e/ u# w3 ^% e4 O. B + z- Z) v$ f+ u/ @+ c

    . l+ G4 q7 j$ k/ H- H$ j; [3 ]/ M什么是jsp标准动作?包含那些?分别都是什么功能?如何使用?
    3 H! Z* j! L: ~+ q7 T+ BJSP页面中使用类似于XML的标记表示运行时的动作
      }1 g- j0 o0 M% e% v/ Y# \" B; o% X; Q7 b# A  K$ j& H. C: _4 X
    jsp:useBean  c/ v2 ]" a7 G& H% J
    . Q8 j: k1 b& u% k# g" a
    jsp:setProperty
    / X- l" H, s% K4 Z6 G
    " x4 J# X& h( F* u3 p) G* Y0 Ojsp:getProperty
    - [1 k: |" K/ V3 @% f: Q8 c) q5 R* d
    jsp:param
    ; P4 R, L; a- G$ j$ l$ }) E' K% i4 M* ?7 W0 k3 V) ^) B
    jsp:include0 k  v1 N- F/ F; }3 s* N  s
    1 B7 ]0 w, m9 ~0 V. d
    jsp:forward* W) A) V, [2 [) g; B; u# ^

    ! w0 T0 _0 x  c. U/ p# M  h4 S : J# B/ z- c) r: o# E
      q3 j# f; D- c& F
    用代码示例如下标准动作的使用:useBean、getProperty、setProperty
    9 o* \2 w/ q: F<jsp:useBean0 ?: F( e6 Q( G( T6 `: u& h
    0 f2 O: K1 q" Y/ f+ e! D
    id=”myForms”/ Y  L& |% j& j# ^! v
    ; w; t. ^; l$ @' I
    class=”com.base.mystruts.forms.MyActionForm” scope=”session” />
    5 h( c$ i5 M/ C% i+ z/ t* S0 z! H5 |' D7 F) X# q8 c
        <jsp:setProperty name=”myForms” property=”name” />
    # s5 s* ^" M# N4 R. f6 O2 G* _/ g' f9 e! s3 `
    <jsp:getProperty name=”myForms” property=”id” />
    ) w4 }) R& d# }: q+ Y' m. j3 y( b$ K9 {; k- j. d; n
    , W, C! m2 T2 a( E
    3 |  T4 w4 i" e, T6 ?
    描述说明Bean的四种scope1 e+ Q/ b. w# k0 x
    page5 a" i* h* }; m' U: I

    + _  v: K8 o3 Y% M- s* H) f+ Drequest
    0 b* a  }  c- D& o6 v
    & [' e" Q0 \* X) k+ ?7 }* usession+ H& R+ B3 g1 H" m' d

    + S# T+ k7 E4 m5 h0 z5 oapplication4 S4 I7 _5 q5 ?) l8 ]9 K) i, s

    # j. V: v2 D1 _6 d4 }2 f2 ]  l
    % Q+ k% t- l" f9 b) i. ]5 K; X$ Y; V; T, N
    描述说明页面上的字段和Bean中属性的对应规则
    8 F3 K# s: M8 j! V  X- \8 Xid 指javabean的变量名: X4 h; W# \  |$ |: B  R, @9 ]/ B
    ) `/ `" h) H+ |0 `9 h( Y6 D* [
    class指javabean类的全路径' `% P% ~+ Q4 q- S! ]
    / ~9 x- Z5 P+ B0 s/ n2 d
    scope指javabean的应用范围
    ; m! [" l% O1 q
    & G2 N) z7 y3 }2 _$ i. Pname指所用到的javabean的变量名2 g$ @8 L4 \% i
    4 H- t' n( i4 {% ?
        property指javabean中的属性
    ' L6 m. @& F( R" ]3 ~# G: F; D& O% }; H4 V$ t9 }* N* I

    - n9 I! ?* b* d
    7 R3 n" k/ H: Y; A" n1 @8 \3 _/ a& X描述useBean动作的处理过程8 l& \9 Q, f: d8 |, e3 C
    使用id声明变量
    3 Q. A: w4 G, R3 u
      `; q: ~$ J' t" ]( s试图在指定的范围内查找对象+ n5 q' _& y0 n- c2 B& }4 ?
      g1 z$ ?* F$ H5 u/ J
    如果没找到
    # K8 R( H: M2 W( G6 Z: K
    8 A" m" _1 d4 p, f# S2 c7 ^  L创建一个类的实例5 \- M* D2 E+ h$ q
    8 f& V- n* x/ n
    执行useBean标记体初始化对象
    / I6 L+ F3 p6 i: {% `
    * z; _9 \. `% g, d0 M9 J# P如果找到; d1 O, b4 A' k: ~

    7 L/ {2 W. P. |# @5 e7 D     将对象转换为类指定的类型3 K+ a1 p  [5 @! p/ f
    $ u7 a! I+ v% c& T

    $ Q& z  b6 E( z5 f9 F  S2 Y# D
    1 E7 T+ i: i( S, i描述forward动作的功能
    8 M3 l/ N* O: a8 E  u# j$ |' N使用脚本代码处理请求时,可用jsp:forward 动作产生一个不同的视图,
    - Z! v7 G# @2 z8 @2 p
    7 n( p& e( L8 I使用同一个request:& Y! ]1 \: G# C( |

    1 I% o6 Y; N$ {, C+ v ( \5 G1 |$ l* K& \
    ) \" O' ?9 x1 H3 H* q( U4 N
    什么是Model 2结构,以及结构中各部分的功能: Q; |8 o' v4 z8 c$ c
    jsp+model+servlet
    , S0 v# ]. T# L3 m8 g0 R0 {$ f" a# k" j
    Model 2架构使用MVC模式,JSP页面充当视图,Servlet充当控制器
    " p# c' [  c+ |; [# P- u2 x2 Q0 J% K5 }( X4 P3 [8 v1 f
    Servlet控制器:
    & E- N; K% `) z4 J  o5 D
    " o0 w# o& b5 n) ?* q7 G& a验证HTML form数据8 [: H. J) `8 B& L# D

    ( Q0 r  M, s  z' s, @2 ?% p6 x$ M7 v调用模型中的业务服务: S, }( b2 z. Y6 C

    - Z- J+ Z1 s9 s/ T+ m4 F4 L0 l7 w存储请求(或会话)范围内的域对象# b( g% Z- R0 q2 e& _; m( m
    ) P$ J' K0 R3 C% y
    选择下一个用户的视图
    ; Q* A) f1 F5 F5 a4 L
    " f! S" c3 W$ R7 D; iJSP页面视图:
    0 {% F1 z# F$ K& g
    / @( s- d8 `* R+ |8 o使用用户界面(在HTML中)
    $ V; Q% o) h9 o4 C- `: c7 K$ r# D+ p  m+ ?. ~
            访问域对象
    $ P. E0 ~4 N. A4 M+ s" @8 N- t1 u
    . X  D; F" e" B( J( d

    - b; e) q5 @, I" r* Y( Y3 _" P如何获得分发器?分发器的功能?: W2 |4 I( l6 q6 p8 I
    上下文对象中的分发器:
    5 c/ j2 l7 n2 i& v6 O& U1 F
    4 _; `( w1 |0 e7 Z* X" D, K6 wServletContext context = this.getServletContext();
      r: O1 S5 ?# s- e& `5 r' q" X! d: {) t4 O" t# z* x
    RequestDispatcher servlet = context.getNamedDispatcher(“MyServlet”);  V9 Q$ ?% K  f/ S  E4 u

    7 j2 s  I5 ]# ~$ Y% Gservlet.forward(request, response);( V$ f" L% r' v4 [9 b

    1 d. r; Z; q6 d  K1 q9 y请求对象中的分发器:
    . C; X; J% ]# w/ ?/ o5 N* `. m$ R8 i2 D6 Q
    RequestDispatcher view = request.getRequestDispatcher(“tools/nails.jsp”);
    : P4 ^/ [) p) ?, b3 ~; X
    ( F% y" C4 x% \( nview.forward(request, response);5 t9 }; e7 `& S; \6 B: G: ]

    6 ?3 f# T. ~* S4 w/ X可以将请求转发到另一个jsp页面,并保持请求的传递性% Q- i3 T# D& T0 S& \; I3 ?- g

    1 |7 [. K6 A5 z 7 j6 [0 Q( \3 q( B% G
    # [: V/ L6 i) E4 z
    Jsp中页面跳转的两种方式?
    ! h/ i* x2 E+ Q1 h: A8 P3 y使用分发器跳转页面. ~) _) ^" n+ }" z9 ^) w
    RequestDispatcher dispatcher = request.getRequestDispatcher(“url”);& d2 l! Y* _6 J. w% Q$ X9 ~4 h

    6 p3 R; A6 R& P" E. a- gdispatcher.forword(request);
    4 ?  D0 S. `+ ?! H9 d
    $ t0 \8 b# s" W. N    特点:保持请求的传递(上一次请求中的数据,在下一个请求中仍然可以得到);
    & `. Z: `3 `; T" D6 p* L+ D) D3 A% D
    ) V$ i' l2 G" T' a4 d/ n        转发的页面只能是同一个Web应用程序的其他Web组件3 K" H3 L: G1 S0 Q

    & m8 B( V# b0 z% r2 j; t4 E0 v使用重定向跳转页面
    7 D( g) `. p2 [% p; q% A# q" ]response.sendRedirect(“url”);
    ) {/ o) a) G- ?5 b( s
    . I1 z# C; o' I# w0 b0 ]    特点:产生全新的请求,(上一次请求中的数据,在下一个请求中不能得到);) I' D& f) `1 }" n

    3 U( P4 G1 W5 H( j. Y7 _        重新定向的页面可以是任意的URL
    0 Y" d& r* A' |1 o6 |" h* H8 p/ n
    4 ^& A$ `) }* _9 v- w( c' k
    ! F8 W; h/ n! [# Y# V7 r! a5 w
    - R3 O! k, y; q  Y. ]& s描述Jsp中引入另外页面的两种方法,并比较两种方法的特点?% F  ?5 V( V, h
    <%@ include file=””%> 在编译期间把另一个页面完全嵌入这个页面,可以说是一个页面1 w3 Q3 O4 {: P1 A& f

    ! l# \# y& Q7 Q在这里可以共享变量
    % t2 z6 G* v1 l& B0 n0 b  w. d  w: g0 K4 I
    <jsp:include page=””> 动态的再运行期间把另一个页面加入这个页面,可以说是两个. z, y: A5 O5 O) `& y9 f$ U6 V

    4 `& `% H$ d. R: C页面,不可以共享变量
    , d8 k3 F$ }1 b( Q0 f; B0 B# b* \1 q
    4 h. u1 n; E' i/ }# g
      A0 w) Z" L7 _
    什么是自定义标记- [! @) _' g6 }$ j3 \
    自定义标记库是一个Web组件,
    5 N( B+ w& h, q7 j1 D) s& s, h0 z$ g, R
    & _* r, f, B$ _9 V) F4 s  q包括:/ H1 \2 u% |, M2 J( k& N
    * O) Z% S2 E' E+ V4 {
    一个标记库描述符文件(*.tld)
    6 ~' ~- M. O1 f" ]' b7 J1 w8 h) P7 X' a2 C
    所有相关的标记处理器类(*.jar)
    + A7 O3 q3 F% v- v
    2 y6 B' [1 v4 H% }6 `  }
    3 H, @3 |2 L! m! Z
    $ D4 n# C9 \+ |( `0 M: t" U8 L描述使用自定义标记的步骤,以及每步详细的工作; L9 Z8 H& i! T, t: a4 y2 }
    使用自定义标记前,要拿到.tld和.jar两类文件
    - B: G& k( o0 P- t( K* P' N; O! z* {5 S$ n2 n
    把.jar文件放到WEB-INF的lib里面。
    5 E. g/ ]. s' ^把.tld文件放到WEB-INF根目录下。
    * [3 c! f+ T5 r# i( j/ F在web.xml中配置。" {+ w6 a! Y5 S& z
    <taglib>0 O& z5 X, T  N/ e

    ' \# Y9 w. \2 Y) _<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>/ v2 z2 Q; D; a! m0 Z
    8 q; k. E* r8 m+ v7 q$ I
         <taglib-location>/WEB-INF/c.tld</taglib-location>
    , H% }, B+ u# S9 S
    9 t3 U7 p4 F: o1 ^</taglib>  \" i: C3 l) ?2 m' i2 }

    ( Z) R  v( ^; Q9 Z" L在页面中引用。
    + k. g1 a; L3 W3 C; S<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“s”%>
    & o" r0 f/ Z6 X) e+ B% o. b* t( w* R
    uri必须与web.xml中的uri对应; B* H; C* P! l3 w; H( r0 N

    ( A& u3 T2 Q9 Y$ \. gprefix是前缀,用来区分是哪一个taglib
    # ]8 J0 ]; _8 z! D
    ' F3 a6 T! q  G2 {; x使用标记
    ) P+ t  c" |% c. l& d格式:<prefix:tag名称 属性>
    / l2 G- G# U/ G: \& F- s! L3 O0 }. L! s" F, f! v% u; G; J+ \+ S
    <s:forEach >
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    14#
    发表于 2014-12-03 12:45:59 |只看该作者
    在tomcat下配置数据源# H: d6 c' P: R0 P$ J2 U
    1、服务器与数据库的连接
    8 a( X2 E. Y9 C3 w: I6 G/ h/ r& o/ E
    配置server.xml文件$ B$ x9 U, K9 Y6 I7 ]
    1 g/ r3 }. |+ F3 X" Q
    1.oracle
    ! p: Y, Q8 }! v. `; t
    $ }4 A0 e1 k8 U8 q% Q5 C# K% |<Resource name=”jdbc/company” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
    & l. f) y2 N4 m' F: n, a1 X/ _6 e; u; L& M4 e, M1 v
                            factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”
      D" s3 m! c* b4 w4 i& E8 ]" A: n: c+ _5 r9 `% O8 }- u9 G& \4 i7 Q
    url=”jdbcracle:thin127.0.0.1:1521rcl”
    % u. G/ Y2 h" I: `5 ]! q2 ~
    ! X, M( o' W# q7 ]) a  ?driverClassName=”oracle.jdbc.driver.OracleDriver”
    9 Z, G- j4 v# ?+ a
    " |3 k& B) Z! r/ E1 E3 _' v# H3 uusername=”aa”8 z5 }. T- f. a; N( {" `* e

    9 ^# L. L! A+ Q7 ~4 lpassword=”aa”9 h. C2 Y4 X3 ?
    ) B/ r" O, r' O/ w; ?7 r) \
    maxActive=”50″
    ' ]1 h& w) G  Y* _7 L1 y9 [1 ^% A) P4 V- w3 a
    maxIdle=”10″* e6 z' j. y1 ?6 W
    ; f/ {, X4 W2 e* D5 z- g
    maxWait=”-1″. D& Z5 g" c0 f7 [
    5 o, k8 @# e1 j; D% [
    />' U. Z) Q6 b+ M6 a

    ; p: i0 ?/ A" V4 `( c2.sqlserver0 i; n, w! e4 V8 h& \

    7 p5 d3 B- n0 m. A4 |- j<Resource name=”jdbc/webpage” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
    * J+ W, C( E! ?0 r1 m, {
    / b4 t" a: }. N! e        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”
    / h+ f6 ?( c- X" x  H) J5 g3 f  c4 N# B. i3 R/ x, W: g0 r
    url=”jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;  V, m4 `1 m- ^' h, e( M0 o
    4 ]0 M% y; h# J" A: h
    DatabaseName=webpagetest”1 @5 @3 ]+ P6 ]' P! b* w* E

    " L( D# }6 K; s( N% J  I$ m( RdriverClassName=”net.sourceforge.jtds.jdbc.Driver”$ \+ _" @6 h2 ~3 n- T
    ' l1 L" h9 |4 W5 d' e4 ~: N6 R
    username=”aa”
    & E$ U: X  H! u9 }4 ~7 ^4 w: \
      u. J7 \* S* a5 A& D; Z. Upassword=”aa”
    0 Q$ x3 F! _2 h+ B
    7 Y5 A6 A" N4 N' w$ imaxActive=”50″. C8 q! n! S0 i& B( [! O# G# i

    8 ^) o" x& D+ E$ umaxIdle=”10″9 z+ F! P8 D6 Y- E
    4 F$ H. S6 F# r
    maxWait=”-1″
    7 u  P5 m/ |0 n% w8 U9 r, ?$ p% R9 j0 J1 S/ v+ C( O( i: p8 n" Z; y
    />
    % j2 v9 J2 s5 l# L& k% B/ F, Y+ G8 t$ v  {3 V- h/ [% ^
    2、配置自己的web应用的xml文件! W" ^& l: w1 y$ ?

    # j- Q6 E- S. G% {' q( k" r% r
    - b# @! ?% g4 q
    6 F2 L* o  ]3 f  q9 C% h<Context path=”/eb03web” docBase=”F:/workweb/eb03web”& V" d+ N/ Q) m  u% h% D
    ' |' a  C# j: K% C
    privileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>( |6 P+ p! _/ @3 L
    9 @( r! ~4 {% y2 V3 P
    <ResourceLink global=”jdbc/company” name=”jdbc/company” type=”javax.sql.DataSource”/>
    % N) Z: \4 N! p4 y! c, K7 `5 d3 T0 X( G$ ~
    </Context>
    & d4 v/ B2 b( \& b2 f# |/ R
    9 d) o7 X+ `4 M & t: N8 T# V4 A' y0 _7 d& u- z

    8 ^9 N$ c6 P6 ?8 k, m/ K3、配置web.xml文件/ c! o5 O, ?6 h& P# L2 E/ V: q7 D/ i
    % O" P5 W7 [6 ]2 _" b
    与服务器建立连接
    / {. i1 }4 R9 j; v4 i" k4 M: Y9 P& W8 L3 @: }6 p# W* t
    <resource-ref>( u4 F6 Y7 }# [  P1 E6 x

    ! N( `. x9 n8 K7 _( n  Z<res-ref-name>jdbc/company</res-ref-name>4 X$ e* J5 w, Y& ^/ L6 D- V

    - v* r$ }/ B$ X8 _<res-type>javax.sql.DataSource</res-type>
    ) {8 l& G' E6 e/ {$ T5 L3 B4 e4 P; J# j" A
    <res-auth>Container</res-auth>$ b- ^  R2 H+ r% U% B
    / d) i; \, v  E1 j& }; {1 }2 V
    </resource-ref>
    , \# ?% U6 T  X4 N$ O
    " G1 D6 B4 W& M! v1 u4、在应用程序中不直接与数据库连接,通过DataSource连接池建立连接3 V0 Z4 Y5 [  I
    6 Z. j% w, K' c8 r, w6 @% X
    //1.在程序单独用时设置系统的属性,在tomcat下可以不用配置,+ g, Y/ I, k2 w0 ?8 @+ |9 ^" C
    2 q7 B5 D/ n1 G, B/ R4 O% B
    System.setProperty(Context.PROVIDER_URL,””);
    ( ~1 Q- x3 G. {# U/ {" y- F
    ; _* z# }+ k& {' d2 d, t& ^System.setProperty(Context.INITIAL_CONTEXT_FACTORY,””);5 c; t  n0 B( O1 F! X$ h' n* t& _
    , K3 Y- z2 k/ z* a3 f- ^) U
    //2.创建一个上下文对象
    0 `$ H. J  ?- c# ?2 r! D/ }+ b$ e$ ^2 j* X- Z6 U
    InitialContext context = new InitialContext();
    " [& U. o- ?- {& k6 `3 Q7 N: d4 G6 m2 j. G( r" \
    //3.通过上下文对象在连接池中查找DataSource1 D9 S# C$ l: r$ R- m
      H% [- s" k  g, I# Y9 I
    DataSource ds = (DataSource)context.lookUp(“java:comp/env/jdbc/company”);: H! C! w% v+ p) H, q

    ' ^1 c5 w- C; D//4.通过数据源建立连接
    7 g5 k; H. d" U9 v
    - L' ~- t( j. B, W2 t  [ds.getConnection();
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    15#
    发表于 2014-12-03 12:46:30 |只看该作者
    ORM对象关系型数据库映射
    & t# A8 `5 ^; {/ W(Object Relation Mapping)5 T6 N( K' ^8 t- c* ]4 z4 n, ?

    : \0 B4 f2 X: ^9 b- m  V* Y一、映射的特点
      F% X1 v- j# h/ Z8 Y: u/ }, b- r! k1 J
    1.一个对象可以对应多个表
    . w, H( ?( c4 u9 J$ H
    " K; A% l5 m, C& Y" z/ X/ S2.一个表可以对应多个对象$ `* Q( }3 c8 D$ n6 P+ T+ T' Q9 c

    ( q* w& Z/ i, z  h/ ?5 I6 K, a2 M3.对象和表的关系不用完全对应
    9 V& h* j+ T1 T  i/ T. l
    . t% X0 R9 Y, s" M% }9 `  u4.对象的属性的名称和表字段的名称可以不同# {+ V. R9 c3 H% n8 c9 V) Z/ r* O: l

    3 J/ P0 r$ B( R# x0 n3 V) G5.类型可以不同,但数据类型之间可以转换- [# r" `2 g% N8 O# K1 J
    , \1 }( c& }; U* w( L% v
    6.对象中必须有主键,数据库的表对主键无所谓4 L8 B8 v  y4 U/ G
    9 r4 W7 {3 x! e
    7.数据库中有主外键关系时,对象中可以有,也可以没有2 f; _# u0 F6 _" x4 b* C" B2 g/ ^

      c' E  s# K. J, h" G: [+ K
    2 B& ~2 ^  v" W8 {& z! W8 b: V0 X3 f9 k7 |) T" l4 ]( r
    二 、有一个映射的描述文件————>xml
    4 e- ~5 U+ ^8 T
    5 r5 r0 k6 Y+ w/ x& |三 、怎样实现描述文件————>一段程序
    $ l( H9 Y; d3 ~4 h; j8 x. I8 H7 B% b$ {8 m/ m3 i: O, ~- [* b
    对象 映射(mapping) 数据库. r% A. x  u5 B4 G1 [

    : F+ G4 f( v4 }# Q7 e  f8 Kuser
    4 l/ ~% _2 ]2 v* q5 B; `- j) o9 L. M) Q: l
    id=11
    2 A8 W% z" `; C8 g
    ! q+ L( x* ]* \& y7 T/ V( z$ Oname=”张三”———— > (1) —————> tbl_user(id,name,age,tel,address)) }6 g; |  N% ^7 s5 J, D5 k

    9 k! F: S$ ]) m7 L$ w9 b! I3 cage=25 <————(2) <————+ M# w* ]/ ]6 Z

    ; M( P9 r# h( i: G* o  B
    4 m4 R6 X! I) e# h2 d
    5 e, y; P  ]9 E# }& Y2 S' c$ {( |(1)从对象映射到数据库
    " X7 H) O0 I) L6 Z# {3 l2 b- x: x' K: ~
    1.JDBC
    # P, a; O- w7 J  [) |
    $ d  ~' q5 C& h! H0 V# ]( ]- r2.根据描述文件来动态拼接sql
    % G( }, L# [3 m4 l) z8 {
    * y* c$ K1 D, L: j& o, S" [3.执行,添加到数据库中
    , Y4 k) e* p$ j
    . g; n7 l- A7 j" [  g5 w4 Y 1 f; x6 K: P& q! D# V

    " c, D* L* `" J) O(2)从数据库中映射到对象
    3 ?7 `9 B! W7 `+ T$ p( k
    & t. S! j6 h5 ~' m$ z! F( K1.JDBC2 Z) p* x& s4 m; n) C: J8 l3 l7 c% F. ]

    5 U0 q" ^) n; `# S, V1 a& u2.拼接查询sql
    * e7 N) w8 G7 s1 X9 c* m
    1 ^; ?0 T. F+ v  ?  K, M* L3.ResultSet
    / D2 L2 i2 V$ c) s) {# d
    $ X" y  ^6 f9 \9 [- z4.Model
    - }7 @4 t" Y6 c
    " d4 U8 H* f5 U9 r, C& b: M & z; Z5 i: C# c: e8 v
    : Z1 Z, t7 m) U4 T1 [* I
    hibernate
    ) `  ^* `: @  ~0 s4 r9 A开发流程:3 \+ `/ a1 b9 A

    ) s/ X# ~# x5 n2 G* L, }是什么?% _* M1 H7 F0 e, V1 f; D2 m
    hibernate是一种基于orm 的轻量级的框架
    % X: A  W" M8 }% H6 ^6 N$ S: i
    1 o, ^7 N1 q+ k- Q8 _0 J( s
    , E% \5 ~$ U% f) E: X! C7 P# D5 ?" P! Y9 t  h. }' @8 B; I  |
    有什么?
    / ~9 ]( S& ?* a/ C3 e6 @: w1. session 保持连接状态(依赖事务和连接池)
    8 B- M8 K' M) l4 D1 C; d; W' u6 T( S/ ^
    2. Transaction事务- {4 [# B. e  E3 i4 W" k: X1 r% j

    3 A- Z0 ^) |8 N! P! v/ N8 x3.
    0 ?' }. ]5 \; fConnection Provider 连接池5 B1 m* x- p5 f# m. O5 W" `% B; f- G
    # _6 T% P' z& i" {, t. P8 P$ F

    ( W( q5 q- c# L' T8 {9 d, s: v% k; C- ]& K$ G: P/ E; P
    能干什么?
    , A$ @/ Z2 V/ p" u5 C3 z8 N+ ]7 A1.orm- Z, O9 [9 ]4 ]! M+ l* W
    ; |" [6 K4 U2 v/ X( N5 @( K8 N
    2.提供操作数据库的接口,简化数据持久化的编程任务  R0 B3 x6 Y. j

    6 I, _0 U3 F8 i6 H6 @
    5 ?; O1 y" V5 _' O* h  J: Q+ }' Q
    怎么做?
    8 u% p" s9 Z, K( f; h" B0 P% p, A1.搭建hibernate的运行环境,将hibernate的包和hibernate所需要的包拷贝到lib 文件夹下$ R8 d2 g, G) q' p( J7 m" [2 V' h- z9 e

    7 V/ o, x0 B0 Y* F6 ]8 D9 D8 u( i2.O(vo)
    8 @- l  M" W" D# ^
    7 U0 ]$ i# P& l* u: z8 k" k4 h3.R (关系型数据库中的表)
    ; q6 I# E4 z; c) V- ]- l* h2 k. p( r: r* `& ^) ]) S
    4.配置文件4 p# o* Y( O' Z. N) z: S% [
      k9 ^7 ]/ O/ J: d- g
    4.1 cfg.xml 放在classes根目录下,默认名字为hibernate.cfg.xml* f% @( `3 Y- ^. Q7 d: P8 f3 I
    6 J, H0 ^3 ]- R. B: t
    a.与数据库的连接1 f! y9 ^0 _. N
    ) p% w9 s" Z5 h. o
    b.可选配置
    - N/ E% K! [; f' D' q8 e0 n
    + x* J; `9 F, Ac.映射资源的注册
    " O- s  H; Z6 H  Z+ k. K. p2 i5 S- R
    , u$ u. f" b* C# ?4.2 hbm.xml文件 名字与类名相同 并且与类放在一起
    0 V3 _- O! D7 q/ a7 h/ r
    % x3 E  l; `# i  y( Ya. 对象与数据库表之间的映射
    3 e: z# N% c5 q( Z+ ^5 I) N6 h) u$ d: Y1 i
    b. 对象的属性与数据库表的字段之间的映射
    # Y! s: {9 _- r  G. f0 x) ~! o/ {* H
    c.组件之间的映射! T$ v: y: F) P- o  x/ H* E$ P2 S/ p

    + b2 H4 ?) M' ~' ^$ p& v1 q; Sd.对象与对象之间的关系映射3 h4 n2 B0 j! F. d$ ~

    ) t. b. _/ J$ n5、客户端
    - X* d* `: ]. B3 ?2 u
    " E4 S7 k# o% p' Q1.得到SessionFactory
    ! x+ H+ P, Y: Q  e, K# y9 @
    8 k2 h+ _) R8 J; Z0 {  j$ S2.通过SessionFactory 工厂来创建Session实例4 b4 {" R$ J: y4 {# Y9 M* z* k: q
    ! V+ O0 ^- r7 Q' e4 Y% a5 g
    3.打开事务+ m4 [2 N6 Z( V  O: r0 S
    9 _/ O+ F5 z- ^" C9 N
    4.操作数据库
    0 N( Z+ R! B, b7 H1 V$ K& |0 p% i) y2 n7 r
    5.事务提交
    1 e( y; d, L5 d7 ?# b% ^! H7 }2 Q" w! g* n6 E
    6.关闭连接8 \3 U- ^" K9 l: |) D5 _
    4 G2 Z7 B8 P6 ~4 C) O: M* w
    运行流程:
    7 V, S" l: c" _$ r6 A' k" B0 w0 J% W' {3 o1 `2 |& E" _
    整体流程
    ( l; Z, l3 M4 t) E! c# Z1.通过configuration来读cfg.xml文件& g2 z' W% y) E7 A$ [  h

    & C! l( t# _  @2 g- R: M! U- R2.得到SessionFactory 工厂(根据数据库的连接来创建sessionfactory)
    * Q) c: W9 @% y  b+ u
    1 R6 v( U8 f( ^: G* A3.通过SessionFactory 工厂来创建Session实例( t7 z, d9 L6 a4 [/ c3 F! S

    ( Y( x% W& ~! Y2 @4.打开事务
    5 H$ {" }1 S8 @$ G+ ~
    $ ]/ Y: b* ?* L; w; M5.通过session的api操作数据库3 ?5 c7 C0 Z/ i4 a" s

    + Q$ O- e0 V$ P6.事务提交
    7 q; a0 ^) x7 D1 {* r/ v" _, A* F3 T; {0 D! j6 J4 U0 d
    7.关闭连接  X: a, @9 }' E
    0 b* I3 U3 M! \( ]  \. Y5 ~% |+ G
    5 Q" o3 u- Z% L/ M7 t' B( S
    1 Q- Y( b5 r5 K  U! o$ ?
    save
    ( l% a  D5 @9 |3 h) n1.to—>po4 r. L, n- Z1 z5 D) l8 O! f- F

    7 A5 t* I+ _& n* ^  I& {  o2.根据model和cfg.xml中映射文件的注册来找到hbm.xml文件- a( z" G# p  l! B
    4 H% a3 Z8 m7 H0 D, Y
    3.根据hbm.xml文件和model来动态的拼sql; Y, P3 ?* ?( G4 ?- B" t6 X. {
    3 {! t( }$ X8 I1 D; y# v9 m3 W  ]) f
    4.客户端提交或者刷新内存/ Z& A, }0 M( V; H' f2 H5 f4 Z: S
    # U' J# `) |% U) Z; N
    5.执行sql,值放到数据库( X. @' W+ }) n& G
    2 L" \9 |6 C" N, v$ a# \

    ( \4 D; ^3 H1 {' n
    ) o; Y$ @1 r- X# f$ v- w8 ]) L$ o% supdate、delete
      C6 T0 F' L/ Y( k2 ?! x1.根据model 的id在内存hibernate的缓存中查找该对象
    : f6 i1 F0 F. a' k3 l
    / H+ |1 O$ N: M( L6 h如果内存中没有就到数据库中查找来保证对象的存在
    5 i& }9 |1 o( E! {4 V, L
    ) W) K# n) M( E3 {* O2.根据model和cfg.xml文件中映射文件的注册来找到hbm.xml文件6 ~: k. }, _0 W5 P% l

    . f) i* a; v. w+ @; }3.根据model和hbm.xml 文件来动态拼sql
    ; t3 u- c' g  r: E: n( d+ r4 s( l. p8 x4 l" K* U
    4.客户端提交或者刷新内存
    8 v+ K) A9 q. ^4 G7 r8 q7 x
    + D" G9 i! t/ l2 f5.执行sql
    $ n; Z% M0 O2 j* Z5 Z1 q1 O9 A& g1 r" r. d- n+ q

    7 v# I! W5 L8 v9 j* f5 e/ _" Y0 W) }8 a) u6 Q
    Query2 O3 ~' }5 s9 W& z3 d* R, d
    load
    4 H7 v; V* n7 i0 x
      O- }1 i; T6 H" k. q1.根据model的类型来找到hbm.xml文件
    " t- i9 M) E" c1 B1 A9 ~; n: @9 z
    2 g  j5 ?4 _1 s1 o2 f8 W1 D$ R2.判断id对应的对象在缓存中是否存在,如果存在,就直接使用,如果不存在就进行下一步。& @1 Z+ Z# H- x" z) ]2 F0 n7 V

    * @1 S8 h5 y! f/ n3.用id做为查询条件来动态拼sql$ p; Y0 g3 a, n: y4 L5 x( e; t; E* @
    + u5 ?( i0 y1 R+ }8 t3 r- ~9 n5 i
    4.执行sql 查询(先在内存中查找,如果没有找到(会抛出例外),就去数据库中查找)
    5 u8 j& B4 H( Y9 S2 n. v% n
    8 [3 M' a: k8 ~& T+ g) V+ {5.返回一个model类型的对象' {+ y+ Z6 c2 I$ h9 s4 M* [

    : e% ?( v# C; wget. Y& t7 }) {+ @& N* B! n3 Y5 X( K
    6 \. b" I3 {$ B6 Q6 R1 F3 Q8 c
        1.根据model的类型来找到hbm.xml文件
    2 g/ |- O+ A2 ]( d. q! f
    9 c# B2 @) K" Z# u1 c( h2.用id做为查询条件来动态拼sql
    6 y/ b4 x# J9 k1 C4 p9 G$ v, n+ L4 H
    # t5 w) Y4 l+ G' e/ ?0 F2 c6 v3.执行sql 直接在数据库中查找,如果没有查到就会返回null
    - t' ?3 f9 l3 X& m
    % I- S" s9 G& ~( U' oquery# Z, O4 _; u$ b4 w& u
    1 y+ K/ ?4 ?) R, d2 x- V" r7 ?
    1.分析hql语句,得到model的类型
    ' a# k. ^  ]5 {$ }
    ! ^$ }. V5 `& ^) ~, U2.根据moedel和cfg.xml文件中映射文件的注册找到hbm.xml文件- x; u" H; N) e7 s' R% R4 P

    % A  v: r3 o  t" U3.根据model和hbm.xml文件来动态拼sql
    , D. P! ^, {. Z2 y3 d, P
    0 d( N9 J6 @5 B" g1 C4.执行sql查询数据库; c$ t' y  H% {! z
    0 v# k& m" \% a0 S  i* A, D7 ^
    5.返回一个resultset
    * h# n1 Z8 {; ?" g& Y( p  k* \# P. V
    6.循环resultset的值,放到model中在放到集合(List)中; V! I/ ]/ K& y/ ?

    / q) I9 l/ y6 O# p# U# _% U( @ * I, o2 j% x# R7 E  a( e
    % C9 T  O0 _9 V' M2 o( {$ i8 b# v
    谈谈hibernate缓存机制1 d0 m0 R  G- Q- R

    + Q) E( ^+ C, R! W) B缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了。打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去数据库中取,也省了很多事。
    ( e. b* P% y" w# P2 ^0 T7 H2 e6 J; [6 Q
      C( s- j" h/ J5 G
    ( m5 `( Q3 g3 z* Y) S( B
    hibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。3 Y, Z: W3 n' w! w+ {3 W# R2 g1 |
    % F" S' P. ^# C# k, \7 ~' e

    + K& n+ t% }2 G' @4 e. W. j; l, H( x  s
    对一级缓存中的session事务进行数据的预存取,数据在各个session的上下文中存在(单例),当session关闭时,就是session.close( ),整个所有session范围内的数据全部清空;二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二级缓存只有一个区域 ,画个图比较容易理解。
    % h2 x% V( {* Y. p0 @1 v9 L4 I7 s+ b
      e, o* n( E. j; q% j
    % M: z1 ]% E9 |# ?
    | 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|1 N0 A5 w1 J8 U7 f+ e. S

    ; ]( ~+ d5 i  _3 T3 [| | | |
    5 q) L0 x5 q0 x7 `4 h; i) ?! @8 ^; }9 Q& H
    | | | |
    & Q$ N1 L' c0 ^4 @: @
    3 M0 _8 ?0 k0 \, U" F—————————————————————————————————
    0 I4 O1 @9 N4 s: R7 e0 k' n* ?8 y
      f/ Y1 d/ s! w- V5 gsessionFactroy级别的二级缓存
    ' ^" O1 i0 X& O8 D# w
    ( ~# ~7 M: X3 V' L, f——————————————————————————————————————-! Q7 s9 P+ l3 ~8 b/ P  L

    * |/ n' C9 w2 F* }' X|# s. Z) f2 x; p/ v7 F2 Z7 V

    4 _' Z- W0 E4 M, u9 G|' d1 p$ n- Y" p$ f2 V9 z9 j# c4 p
    * {; M" k7 U5 q0 S: n
    |$ V8 ?) i  h' T: b- m7 @, _6 C
    , x- _- O$ K  f7 b
    ——————————————————————————————————————! N# c2 `& e) |1 a8 Q8 R! W, O
    5 l% O  v/ }% q4 r
    DB# C$ Y( L( m8 J" `  R' E

    7 t) \8 [' z6 ?) @+ q—————————————————————————————————————–8 z' E" v( V1 `7 @. V2 P+ G

    ) f: s% u: Y1 ^( c3 e- w
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    16#
    发表于 2014-12-03 12:48:12 |只看该作者
    Spring4 x  Y8 Z. H  |: G
    • 是什么?
      4 i( i2 o! q1 m3 S
      " b5 `, c& u" {1 x

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

    . x$ C- K* J( }
    • 有什么?; g# G$ ^* d$ C

      * N8 A) a- l' m# j# v# a; ~

    3 r. k* u3 ^0 q5 O8 H1 G

    每个包的功能:

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

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

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

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

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

    AOP :面向切面编成

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

    # K! }9 L8 F) p/ M# j3 e
    • 能干什么?
      7 q$ K( I! c3 [4 ]5 b

      ) ^( ^; U& M* I, G

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


    / ?6 l* i. B' j/ p& B/ z% T
    • 怎么用?# X  `* C* T. D3 `# z) Q8 r% d

      ' L, ]0 X% H7 P" ]9 }4 g4 O
      • 搭建web工程,引入spring的jar包/ T2 E$ y- R" l' H; ?  w/ t
      • 在web.xml中添加如下配置+ v8 s! ~  G: ^) Z9 A: D
          c" ~: b5 L9 N9 d- t% ~0 j

        _: e* p; R6 {2 j* d6 `
      $ y6 ^2 o" W, _! W& c

                contextConfigLocation# Q. y$ \# L0 i1 ^

                classpath*:applicationContext*.xml
    5 h  k, K% o+ r4 Q, B9 Z

       
    ( ~1 a* y& |* ^$ w3 i7 @

            , b( O; Z5 Y& y; b. a) y- N

                struts22 w8 f+ u% Z8 Y* `

                
    * C6 d( ?& z, ]9 }& @

                    org.apache.struts2.dispatcher.FilterDispatcher
    3 c% ]: ?2 b# I9 d) @

                6 J* i  J" I$ F5 t9 }! A

            5 X( Z" Q3 p3 P. T% Z

            
      Q1 w% L* t2 y8 X$ }! X

                struts2& g# J) i6 v: D% N3 a2 Z5 z

                /*  ~1 n+ c* T$ z& S; D7 _

    " c' @$ A7 W. b5 S* P


    1 G5 c, h( M1 z

                
    3 ]' f) O& v% b4 m) a$ q% e5 t

                    org.springframework.web.context.ContextLoaderListener' i8 B1 t% T/ D9 i9 [3 T. n

                
    1 w) z6 z' O, W/ U0 B. b* O

            

    • 部署
      , E# Q/ i4 d. t/ }" d- `# y
      0 v6 B2 r2 P8 }; w# @

    4 C, [, S* `/ o6 [5 f+ V
    - S' r7 `# ?) K$ w: r4 _
    $ b" w) o, H0 e" W
    • 容器和bean; l$ k* s/ H- S8 J2 f# t0 Q8 f, e

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

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

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

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


    . o* g, g- g1 k7 J& `% S
    • IOC控制反转
      5 f! x2 V7 {1 G& z1 q' W& q, r' E
      * V( z4 c7 l$ g3 g: _
      9 j* B$ `/ p; c! T' G- ~- P
      3 b+ t1 K% J! v5 T# R
      从前的应用程序想要得到A的实例他会直接主动的去拿,当用了sping后,应用程序由主动的去取变成被动的等待,由spring来控制应用程序所需要的对象

      + a8 \" {- R' ^1 y6 v
      • IOC的优点" B  l) f4 ]& D. F
      1.可以通过IOC来获得实例
      2.可以通过DI来获取注入的资源
      • 配置IOC的原则3 K: B& j+ G' g2 H6 S% ?+ `9 y# ^
        • 一定是可变的资源才采用依赖注入
        • 一定是层间的接口或者是模块之间的相互调用才采用依赖注入9 ^5 v* T# {5 `# l; @

    * F4 i6 Z# i6 F/ s' v, {. a
    • DI依赖注入
      ' O+ i0 k* f( d

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

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

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

    例如:

    在配置文件中


    . o/ X3 p; X' m7 F+ v$ M% p7 Q. w) m( X, G" O
    : [* S3 m" i! b( K! o

    在应用程序中

    Public DBDAO dao ;

    Public void setDao(DBDAO dao){

    This.dao = dao;

    }

    3.构造器注入

    : u' K& T4 Q+ j" O# m" o0 d

    4.ref 表示参照其它的bean

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

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

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

    6.lookup注入

    7.singleton

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

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

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

    8.DI的优点:

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

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

    . h4 b: Q' T& s0 v, I
    • Aop面向切面编程
      ( l% E- F6 P' O# u3 Q: c3 I

      . ]* v; b0 o% D6 b  D* m9 W

    1.AOP面向切面编程 一些较好的模式或者是示例—-范式
    7 [; }6 t" s+ ~3 I2 \' v

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

    2.AOP的思想: 主动—->被动(追加功能)
    . @8 V- ?- a6 Y' K" m

    3.AOP 的概念
    - i3 q8 J: L  `3 l

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

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

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

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

    5.引入 :扩展的功能

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

    7.aop代理 :实现机制

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

    4.AOP的事件机制
    ! M9 T5 u/ \6 {& T3 l: A

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

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

    3.找到切入点

    4.确定连接点

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

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


    ( J' m' t% ]2 ^5 Y
    # B, d4 T2 B$ c  s1 ~- ?0 {/ w5 O' x8 G4 G7 M
    * M! [# P1 l$ q0 R; ?

    / S5 J9 q( j  Q- w/ n& l( Y  F; f4 S3 u. C+ y! i+ B; l4 S( P/ B
    # `; M: p; [* w8 i; W3 p

    5. AspectJ
    " a- a, `  R( w# a# Q3 P, J& B4 Y

    5.1.在xml中配置比较烦琐
    ; {- C' |5 Y% `, P

    所有的入口必须从一个代理(ProxyFactoryBean)开始
    # T2 d: |. ?" C) D, x4 d


    : Y8 C9 [* _, X7 E& J * Z/ r! M; f- K* m) m& `6 g

             9 k6 Y; e( S* ?: q9 ]) _
    " j# z& @( N/ a8 v7 Y
    4 g: R" a( D$ p1 S- A5 z" x
             " c3 }2 a4 Y& b5 l$ d5 W9 {

            
    2 X; ]5 k2 d& U0 j9 l2 v

            


    2 F0 S* U3 O. A( j+ ?6 Kexpression=“execution(* com.javakc.aop.MyTarget.t*())”/>
    1 ^+ j! A# y! r* ~6 D- O0 o

            
    % n: X5 E1 v! `. x

            
    # {5 I* k! x$ d) R8 U

        6 p6 z. S7 x6 Y+ Y* w

    ; G' b5 R) v3 k! U8 f$ N

    + H' O7 B$ l" Q5 T# s5 W

    5.3.使用注解的方法相对简单
    " \' B0 Q3 V# K" J

    @AspectJ的基本语法- N! g  j7 Y$ ], {* V3 g, O9 U3 ~

    1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面, _* Q1 L, I( O0 ^& P& a

    直接在类上定义@Aspect
    ' d! N7 `3 \  w6 n0 I* p+ w

    2.@Pointcut声明切入点. ?  D1 J: M' R9 p  y8 r

    2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字) Y. n+ |% ?. ?6 l

    2.2、可以使用匿名的pointcut
    7 m7 u9 ?# U  _1 Q

    2.3、执行切点的几种方法6 d; y- q. [$ O: q, d2 e9 d

    2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法# ~" E" J. x( C& U" f# ?) B! ]) w

    2.3.2 within 指定到包,不能指定到类' L& f- e! P6 B4 d9 M6 B1 D. f5 H

    within(”com.javakc.spring..*”)
    - Y7 {9 e/ t; f% V$ n1 f0 j

    2.3.3 this 指定到实现接口的所有的实现类5 I% e$ g4 W; ~9 [9 U6 \

    2.3.4 target 指定具体的实现类
    / Q' I/ S; n, Q3 Q! t- m

    5.4.advice的五种类型的示例
    0 F9 V& v/ b8 M9 j; ~& Y9 M

        客户端必须从接口走才能得到监控,实现想要追加的功能
    : ]' l  ^4 W6 ^, h% ~, r

    5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)5 g/ U3 V! X* I6 f

    追加的方法的参数名字一定要与retrning的名字相同' B% j$ ?# u. l& P2 Q( V

    在注解@AfterReturning中必须加上pointcut和returning两个参数
    " @- j9 V. X) T( \' X4 q

    pointcut指所要监控的目标对象的方法2 N% |9 U: k5 @" b  K7 \; F* |

    得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配
    1 p% V, K9 j0 U- g. s  F0 y# _, \

    完成追加的功能
    ) y' U$ a% g; T, B! o

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用# g( T: b) }, ]! B  ?0 T7 b

    (1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)
    : Z( d3 n8 O( X  Y0 ?

    (2).
    0 d: F3 r6 d- m9 Z- U2 S& ]

         2.直接引用匿名的pointcut
    5 {7 h2 I, q' G- R3 Q! j* v5 Q

         (1).@AfterReturning(“execution(1 t. k. ^4 u6 @% [

    * com.javakc.spring.schemaaop.Api.test4())”)
    : g4 e. y2 |3 y! o6 {

         (2).@AfterReturning(pointcut=
    ( K( {5 `6 N% z7 ~

    “com.javakc.spring.schemaaop.TestPointcut.t4() &&
    5 ^0 H; u' F1 W) ?$ L! L8 ]! @) b, d

    args(str)”, returning=”retVal”)
    . h! \! X7 d0 S

    @AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)
    0 d$ I  o: Y- S5 M# [

    public void testAfterReturning(String str,Object retVal){
    ' U" f+ F9 Y3 J0 n5 C) j

        System.out.println(“afterReturning1=>”+retVal+”=>”+str);& [( x: @5 ~  U, _9 e3 d2 q* o

        }: e8 j9 |/ I; F4 F8 w

    5.4.2.@Aronud1 y) M9 T# q/ K% B! l

         注解@Around环绕追加功能;+ g, T8 f" T' O1 w- }

         在执行目标对象的方法的前、后追加功能;- e0 k0 G. ^' T, |0 g

         必须有参数;第一个参数的类型必须为ProceedingJoinPoint;% Y- M2 h+ G+ `2 s

         通过ProceedingJoinPoint的实例的proceed来调用所监控的
    8 d8 ^+ F! ~7 w  Y  m

    目标对象的方法/ a& u$ B* A. g/ S" S% {% d: O+ y" S

         1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    * m% z% Y5 H. L% x0 O! [0 f0 n8 ]% g  Y! Y

         (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    ! V! K: }( |' z/ G1 W/ S4 ]

         (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()0 A3 B+ B0 D8 f3 j' I5 ]: F

    && args(str)”), A2 D' y7 V0 Y# w/ P) _2 C

    2.直接引用匿名的pointcut
    4 W$ q: G1 @, H8 z$ _

         (1).@Around(“execution(9 F. Y" g! N1 m# k1 g3 `2 p

    * com.javakc.spring.schemaaop.Api.test1())”)1 u" J; y/ F0 t

         (2).@Around(“execution(
    6 ]0 n1 `5 c2 d0 W" V' ^

    * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    8 v4 u3 t5 K, j- c0 g

    // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)8 b5 j9 C0 M8 u& |; u& i

         @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)) K. J% J; H6 i8 E$ I

    public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{1 c! B, |+ q/ ?3 T

        System.out.println(“around1==========before1pointcut==>”+str)1 L( }8 d/ y; l5 a

            Object obj = prj.proceed();
    0 h8 h5 {& j2 w; U$ B

            System.out.println(“around1==========after1pointcut==>”+str);1 K4 R8 O3 g% a' e6 t( d, l$ T- y( L

        }. s7 {8 j, k% V" J& |" A7 h

    5.4.3.@Before
    + R+ t1 r9 c7 X2 K+ S( J

    注解@Before在执行目标对象的方法前追加相应的功能4 C3 p2 p# L9 b2 N" w6 X( i- r

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    % @* e5 i, E% f  z4 G6 j

    (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    5 D/ w7 T- }$ f

    (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)1 t, P6 R* J$ E) i$ Y% ^

    注意args后的名称与参数名相同9 J3 k4 t3 f/ l  L/ ^

    2.直接引用匿名的pointcut6 T$ P2 N) x; z0 d. s9 S

    (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
    # r2 I) X9 x, j( ^: k6 ^

    (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”); D0 Y9 n8 K1 s6 u: O

    注意args后的名称与参数名相同% Q% T4 f8 g. Z$ i+ t6 D8 c' _( p

    // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    3 a+ l  J1 w: B8 W- |6 c; I5 n

    @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)& G5 ]7 ]5 p, z0 g

    public void testBeforeParam(String str){! g  c' f% L, ?

        System.out.println(“before1=param=>”+str);
    - {) [8 |* j- r8 U3 s4 H% b

    }0 m8 X' n5 }: k! n; i

    $ u  Q( X* }. n

    5.4.4.@After
    8 o8 u, {- ]% \3 H

    注解@After在执行目标对象的方法后追加相应的功能
    5 e8 M' O1 B; B0 j- j

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    4 v7 t7 p8 V  O# [

         (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”), K. j" W2 n! O) `, J5 @. m& s

         2.直接引用匿名的pointcut
    3 d$ u) ?$ s  p. ?" n( _

         (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)  c3 J7 d% ~3 S1 n2 h3 z! n( u

    @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)9 n- A; Z' ~! [

        public void testAfter(){1 \7 _) t4 W2 f- C6 P

        System.out.println(“after1== >pointcut”);
    ; v7 R7 A3 H4 W% |; v

        }) _6 e: ^  F/ y5 d; l8 M% ?; Q0 x

    5.4.5.@AfterThorwing
    % |* ^4 p" Y4 n1 w7 j


    5 Y1 a+ u% F* U+ l; P* Q& s4 ^1 T# O. D
    • 描述一下spring中BeanFactory和ApplicationContext的差别" l' n6 j5 ]. W/ d- U6 Y1 h6 D1 F8 L6 [

      ( P+ b& F6 x6 w' G; W! G

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

    6 @9 l$ {7 [+ o& _# z
    • 谈谈spring对DAO的支持! I1 s& ~' K/ L0 T5 `/ i. x

      . Z( h5 F2 v4 u. A9 B

    Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。
    : Z3 Q) i& n0 u$ ?

    简化 DAO 组件的开发。
    5 F/ O  S( [7 n5 c; h' NSpring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。5 k4 M# H6 p; L% {$ Q; \

    IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。
    ) N: y6 t# q9 F" m! z. c

    面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。
    6 [& u4 N. m- m

    方便的事务管理: Spring的声明式事务管理力度是方法级。: K: [' J: c" G7 b0 ?) Z3 q3 m

    异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。9 C9 i& p7 G) B/ {' F# ^) j- l, Q0 F


    1 P6 i# ?* h% n& f& H. ]
    5 a% ^9 {( j: H% G$ f
    • 谈谈spring对hibernate的支持
      + [7 J. u3 L, c5 c, B

      & k9 V5 l2 t; V, A! I

    在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。
    1 N4 ~+ f  w$ s7 Z* b* t

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

    1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:( b$ K8 X, x8 c" V% ^' w

    . L! c. b7 F- H$ z: o$ D: e: v

            class=“org.apache.commons.dbcp.BasicDataSource”>
    . Z/ v. x# Z! E' b/ i8 l* W+ h' ?0 R

            * c, p3 F8 h7 G$ O' M

                oracle.jdbc.driver.OracleDriver
    3 O) B4 G8 f9 q+ Y1 ]5 o& ]

            
    , [: O+ @& }6 H- [+ B1 `. D  C

            
    & L4 a: I# v( h1 \% ^% f( j1 C

                jdbcracle:thinlocalhost:1521rcl" [: ?- u* o/ L/ r& x

            
    + m% {1 y* C0 K% m" ?! s

            7 A8 S0 w$ {4 V$ j+ Z) m: u

                javakc2
    + o1 K" F! `3 y

            
    4 I- p5 P& W5 [

            $ y: a. U% C9 _$ U/ D

                javakc2
    % ?( L% w/ J" C! p& ?( B

            
    5 O7 t5 u- d+ t

        & y- b2 D2 T# K0 ^


    ! m' g" v9 y; ?/ v+ c

       

            class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>
    6 {9 ^" [4 R# }0 W% J

            
    7 P; q2 C* U5 @: w  ^1 z) E

            
    8 [$ P, u1 f# Y

                
    4 d) J0 p) ]  t% a& B) l, r

                    com/javakc/spring/h3/UserModel.hbm.xml! E9 F* ?: y" o6 y

                
    5 Y5 `( J* K5 H

            * j( S) O: Z; [  X7 R# t

            * l/ l$ @+ ?9 C

                
    1 H: Y+ V, C4 q% W

                    hibernate.dialect=org.hibernate.dialect.OracleDialect
    6 m" |* g! Y( N

                
    1 \9 B8 D9 K1 U5 A! {- d

            
    4 o5 k" `! v$ r. r& A

        2 [" @$ K/ [8 _) N4 E

       
    ; c& M8 [4 O4 Y3 l& {$ a

            
    , ?: x1 q$ T. q, e# f$ V7 S

        8 o: L( W  E/ O7 k

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

       

            class=“org.springframework.jndi.JndiObjectFactoryBean”>
    9 B. y2 I* f0 l- l: k

            
    9 R# x, ~+ R' j! F4 k, e

                java:comp/env/jdbc/myds# r( w+ s  o0 d+ Y, T

            : j+ ?& L: s8 ~0 S( @

       

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

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

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

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

       
    . y7 w* v6 Y4 V( Q- H/ ?4 P

            
      b% h* _& ~. `

       
    / n$ n9 S5 I1 O2 i/ r0 C


    / k) ~  B! \* {+ v1 Q' R$ L- B, [

       
    " M9 `& p0 H- x; \$ X% g

            7 |+ z. P. l+ U% H

                
    6 Y- y$ Z$ c0 X% I

            
    9 s# V, v% D1 l/ ^7 _- H3 B

          R  H- \+ f( p# |+ a( n5 ^


    6 L- K( f$ Y# H$ ?- l8 `: N3 H, x

       
    * ^( K( X% N/ P4 }$ q$ ~

            6 r  S; }3 H8 @+ y+ F

            
    , k. c' G6 [" G# ~

        * L8 p  I. |4 ]8 l

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


    , w6 Y* U5 k7 ~  K8 \* U9 n+ r
    Spring2.0之前事务的写法6 Y+ c# i& d% b& u. i
    - R- }. W0 L1 \# t

    : s# d. z' r  C- ?* ]6 p: E        class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”
    $ m5 _0 S( P1 G9 T) N* H
    3 a/ U0 ^; \9 Z7 y9 K; n, e7 s2 r  }
            abstract=”true”>- I0 `7 y, v" k
    0 h0 z0 E1 m3 N" b* c

    0 ]1 q4 B7 O6 G5 L; }
    " @6 }- H  i7 ~! j# }6 B: Q2 Q+ u* ]
                    PROPAGATION_REQUIRED,readOnly1 w4 f' o6 m1 a' ?1 L
    8 U/ }/ v# \8 n6 {$ @
                    PROPAGATION_REQUIRED
    7 d. ?$ I; i. A$ J% M; P
    / t. n1 u" X1 c; z- D

    6 H: n* A/ E) u% A; V
    ; H. W6 m7 G0 v
    9 R7 Z5 N  U1 J2 X8 K8 \3 j
    # K+ f* b3 t* x; p7 y" l
    1 B% i- Y6 ]) R9 M: p- `
    • 谈谈Spring对事务的支持
      2 N+ y5 W6 o1 A) A2 |3 F/ R& W
      6 c5 s  R% N) ?' y0 s& P) J


      L3 A+ k+ o# y0 Q* n1、声明式事务管理:

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

    2.做法:

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

    2.2

    2.3 注入数据源

    8 e, @. j. V& V2 _( V, V+ }
    3 T8 g: L4 x& K: n6 d; P5 s& F, K
    , U. e+ F& W, E; s; k( r* V0 [* e* Y

    + X, ?8 P: \. c! V2 h
    # e4 C& s/ c% j! N% _; X6 i& _. j0 a4 f7 t3 N& }

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


    0 x  L( ]6 R$ D2 Y" B1 D" U* }& I* m0 R" Z2 `4 W7 C

    , `! B" j4 x! \" W8 i2 j! G! U! O0 k

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


    % _1 U$ V1 A+ @3 {4 D$ w1 [$ a
    5 L" g. g) i: c: W" |! n' _6 K- B! G6 w- s

    ( t- A+ Z% ~/ U% r; t8 O
    9 ?4 M/ e7 ^  a" H: J8 d

    2.6 定义切入点

    , w# y& f0 ?. w
    4 s& n: `; q! `: `

    8 P2 p8 o: j. W4 z# G) ?6 [* [4 t* u, m% m& {2 J; p$ @
    & a" e# w7 W+ B% M

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

    1.注解@Transcational

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

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

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


    1 G6 Y; b& t6 \; P# H  ~- {& H* o- x" @
    4 p$ t0 J0 S! u* H

    如何在Spring中使用Hibernate的事务:: ?+ @1 Z* H1 j! a

    ' p. {2 \' e! p8 o; y, x$ {7 R* n& t


    4 n! e& D$ D: h; z* E

      N1 V% @; Z2 Q1 g

    如何在Spring中使用JTA的事务:* @- {# p- n' ~  j: z0 c

    7 |. \5 J; y& u/ E4 ~9 r
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    17#
    发表于 2014-12-03 12:48:32 |只看该作者
    事务
    ; A+ L6 s2 |# T  X1 b  X1 DACID/ s  q" u/ B# ~+ R" G
    (1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失败
    " t: ~4 i1 d! [. \/ z- @8 m9 y' s
    ; I7 s7 w: \/ u1 d& f, n  l(2)一致性 :操作的前后满足同样的规则,保持平衡。
    " y$ W2 B6 @! r7 X
    ! x8 Q8 @* A$ m5 I. C/ h(3)隔离性 :在事务运行的过程中。事务内的数据对外的可见性和可操作性(必需由数据库的支持)+ E1 _6 |4 \' f8 D% ~7 B( S
    ' o5 Y, J9 r, P. v: `0 g
    (4)稳定性 :保证数据在事务的操作的过程中不会遭到破坏,而且是永久性存储的
    ( W2 f0 }6 W: O! T9 O
    % ~# s# `! r; s3 c7 j 4 u0 \# {- d0 m" T  q

    0 m' R! Z5 d' }+ Y4 y& l事务模型  X+ }# c$ {  N* O
    (1)经典事务模型又叫平面事务模型(JDBC) 事务不允许嵌套
    ) i8 y- E  m0 B4 R& `
    ( H  j% h' Q! D2 s$ ^+ V(2)嵌套事务模型
    7 X! A) Y# x' @5 A2 D1 E, `8 c+ _6 k

    ) I+ m! H4 z9 d
    7 C* C1 L& K0 \' a1 j8 W事务的两种方式$ t) k$ _: x1 E, c
    (1)声明式* ]6 t2 @& s' Y( N  M& J  \4 v

    6 Z* U$ O+ A7 K: h+ i6 \9 p在配置文件中设置以下6项# ?1 t. Q: b7 k8 k+ W' H! e
    ) B9 _6 X% Z/ [/ w. _2 C- a, d
    (1).required2 z/ u/ I3 s) ]& \* U, V# E9 k3 M

    5 {' Q3 Q7 v$ j# J1 N% }如果客户端没有事务 在bean中新起一个事务
    ! d& f& _0 ?3 ]6 M8 M- i' n# V* M$ |4 T3 y/ B/ S' g$ Z) i
    如果客户端有事务bean 中就加进去8 Z4 H  S& @1 h6 d
    1 x9 i. D* G: \( C
    (2)、 requiresNew  q8 [1 }' l! @) x# l+ o4 G  J
    : N# M6 M4 f: k: F+ V: ~
    不管客户端有没有事务服务器段都新起一个事务' I/ p6 x# t6 X% Q5 Z% S
      p; y3 V; I$ @
    如果客户端有事务就将事务挂起- w" G# D; v9 v" f' {* E
    " ?2 v& d0 x" m1 {5 B, X0 ]: j
    (3)、supports
    , J* e  v- i6 u# i2 q* ~2 N: |: y0 L& D
    如果客户端没有事务服务端也没有事务) w; B  l, m4 N' y

    ' h" ]  L/ C1 c5 ]) U/ T如果客户端有事务服务端就加一个事务, x3 G$ K& d; M2 m& W! R

    7 L4 m) b% w# M+ O! j7 n# r+ c(4)、mandatcry
    - l" \  B! \  |$ A3 E0 n0 s
    2 U1 x  |) `2 o1 q如果客户端没有事务服务端就会报错
    : C  a# t9 l7 U0 D/ P9 H$ S. N  r" n& u" C- v6 `2 d
    如果客户端有事务服务端就加事务
    $ L: g3 d9 }+ N& Y3 `  l
    * f* |" @1 g. ^5 y: J9 _8 Z0 c(5)、notSupported
    0 n8 D8 f& N% w/ D, K
    " r0 ^) `' r  Z; N' ]) T% u  ?不管客户端有没有事务服务端都没有事务$ B1 M# V. l2 t" V
    $ h: }9 H5 O: E; _
    如果客户端有事务服务端就挂起
    . P7 l, X$ L4 a: h  m0 V" R& c2 R  _% `' W0 A2 h: l& R7 ?0 [
    (6)、never. q( L  ?, N1 b/ b  H7 g
    * ~$ U3 x- ]8 e/ L% ^, d% q  s( q
    不管客户端有没有事务服务端都没有事务
    # V& s; s) B, E8 W7 J: m( y+ L
    % ?" Y7 A1 G2 }0 Y3 A; v1 T; L; Y如果客户端有事务就报错
    & t* c/ E) W, I! t4 g3 t' \* a' Q5 W
    (2)编程式事务
    ; O) I' |3 i2 o" Y# Y9 i" W- N2 |/ L6 r
    Javax.transaction.UserTranscation. \% {" M6 ]& g- P% X, Q; K& u# F

    5 Y  Y3 U4 s( Z0 X! `/ lJTA 事务可以精确到事务的开始和结束1 `: e% C6 r8 [

    % u; r! S; D* ^, k1 ~" J / e! t0 c5 v. i' H
    4 `$ r+ w( L1 t( @: r! I
    事务的隔离性
    / L1 z8 z! v4 F: QRead-uncommited
    / ]4 [) T# T7 ]5 k% g" o7 x4 x( I2 \6 M$ h* F% y9 w; ?
    读取未提交的数据(基本上没有锁)脏读,存在不当读取的问题。
    6 v" z( f' i* A' V6 R7 }: H; e* j: g( y/ m! l
    Read-commited
    5 |- P) y! B1 u( M1 k* {' E, z0 \3 ~7 {
    读取已提交的数据(行级锁)
    ' Q' k  n5 `6 O( e* {% \! d1 |8 \! _$ r2 H+ h
    无法读取已经写入,但没有被提交的数据。
    ) O9 g; t9 B- {: C! n3 K# V" [* g! Y. {( V
    Repeatable_read( h' `) \) @/ B% K4 |7 a) W4 e! q
    $ o: L  P3 I4 s! T! V! U6 ~: e9 t- N( j- _
    读取的数据不允许修改或删除
    * [: u) b+ Z; h: i3 D. u  }) x% G" b1 `. \& l
    不可重复读(行级锁+不允许修改/删除)
    ( X6 N( i4 E1 f" J6 U! S4 N4 b" g% O  Y: g/ g
    Serializable
    & N& e9 S6 K6 s* A: @; `$ l
    3 ~* Y  p5 E0 W0 K- b2 t* K4 g幻影读(表级锁)
    # `, F/ R& d; F$ P  E8 V
    2 F1 T/ z9 W9 }1 @# [4 o$ R( d9 C5 O
      }6 H- C; V! ^0 h4 c' }/ M+ D" E9 S
    struts$ ]% S: @" U. p) t4 ^1 O
    开发流程
    . S: t. j; J. b& n  F  m& c7 e: c6 S, z& \& j: S; E3 a( ?  r$ l0 ?
    1、创建表单
    & O1 |" R  a  B1 w) ^$ P3 I* n, l5 C+ j7 c, ^6 e: @' \: k9 p4 |4 m, G
    2、从表单中获得输入  Z$ h/ r' [/ Y, W5 S

    " R+ H3 y' I& |* k4 Z5 h2 T( V3、处理输入(业务逻辑)
    3 ~2 O/ r! U3 A
    * L" |' E2 X+ B: z7 e4、根据动态输入改变输入流( z" x) F9 m: X' c9 L' \
    % L, @+ D0 n( {8 h% l% l! ~
    要完成上述四步,我们需要创建
    7 }1 ?* r' U" N+ d- {$ P# c$ _% [* z+ Z! }, \9 ]0 n
    1、一个ActionForm3 Q1 ?+ U1 ~! e2 `$ c4 _+ ^

    2 O; |: U& V; @+ j7 g9 p! V9 i) T2、一个action+ A4 x4 s% }8 F7 Q/ {* I) I
    % G2 P$ {7 x7 ^! B7 L
    3、一个配置文件struts-config.xml
    & T. Q7 K3 E7 R( l( L) V
    1 }4 f$ ^* m0 X& \4、创建页面
    : o/ L5 E0 I- N
    . \1 ?  l7 S& V创建ActionForm
    7 V, O. I; h( F6 G  _7 ]
    7 e! q* K8 x, ^3 O; N2 U0 u1、写一个类继承ActionForm
    % ~1 J) s1 ?6 {, @* C$ O) m) q
    3 T! ]% F, I) ~* D& {& l; r2、私有的属性$ Q9 g3 D) X1 Q/ M6 G; e
    3 n# p" ~& }' m: U
    3、相应的get、set方法
    0 V# A7 l3 }' \% O+ ^( X0 T" {+ v5 i
    4、重写tostring、equals、hashcode三个方法
    ! |7 o4 |$ i% r( [9 x! k/ Y# Z( j1 ~+ w# o- `. y, ?+ ~. p& J9 b
    创建action
    , r% P! \* E) |; D6 v; a) |5 m4 `  W5 `! L+ B# }6 |
    1、写一个类继承Action: l8 s* `0 A5 Z' q* b1 E: Q
    , n4 ^- f+ B. }% m; p; q
    2、实现一个公有的方法(回调方法)
    . e4 D- i' _, j$ T- m7 ?; ~. I; u4 W7 A6 Z' I- |8 T' ?
    public ActionForward execute(ActionMapping mapping,
    ) e  p  L, M5 r, Q
      p0 s* o! B/ X, f- X9 ZActionForm form,
    / }, B/ y5 ~; U$ j( K" Y% l) F
    3 \$ y$ l; Z! ?# J% l) w4 G4 pHttpServletRequest request,
    3 ]; ^4 v& W+ u8 p# y6 [( p' ^& ^8 M
    HttpServletResponse response)# X6 X) p; z' R
    8 J7 F, o6 t: f: {
    {
    0 l" T% Z0 k& s, j# U( R6 s+ S  |' P* a4 j! K
    //1.收集参数% m2 l. n) M- [. \. o! |
    ) E% @( h' H8 D/ x$ j1 v
    MyActionForm myForm = (MyActionForm)form;
    ' _* H- b0 Q) k6 e% n! o4 R
    4 t' O$ ]; M" W//2.组织参数3 S5 L  j2 K8 T0 h% f7 ^# J, x4 c3 \

    ; v- e% ?; y$ o5 `3 I% F2 d% c' B' ^- x
    * }. m; @+ w0 b5 s8 d! K0 ^0 o
    " U6 n/ ?! \: d+ |# ~! Q* G//3.调用逻辑层
    6 @/ K% k! W4 j# U  \
    . A& k2 q3 g6 P+ ~boolean flag = true;  y2 G* Y  \: e. l' [1 w; p  W

    ( _+ x8 J% j# r: _; D//4.根据返回值来跳转到相应的页面
      x0 n% V( v; p& O/ g5 b% m$ ^; h+ p
    ActionForward af = new ActionForward();# Q* L6 q  |$ h  z# Q3 H2 t1 R

    ( I# A( |" S8 y; w, s$ q/ Gif(flag){9 F$ S0 @2 g  K' x

    " s* ?  K0 g& C& Saf = mapping.findForward(“1″);6 W5 R4 q* [5 c/ \

    $ }* e1 }6 K8 c: x' G! _}else{8 T1 \6 {! d3 B, f
    + B3 i4 v& A3 _% ^
    af = mapping.findForward(“2″);
    6 m, A( {  }4 l! G2 l
    - f* p+ G/ W0 a5 Y; D. B) [}6 O5 w. E, _' O
    ) K2 W/ ]% S: O) O
    return af;
    ; D2 H0 h; m! w5 Y5 i- Y0 B( d+ [
    }' V: T; O& y9 U, U6 W

    9 o) \. ?& [2 y6 V' Z配置struts-config.xml文件
    0 r5 }9 n- g! a% M' M; J
    : Z6 q7 L2 q: I' W, y1.<form-beans>
    # h" p3 C5 n9 y7 ?% Y2 g: E; A# u+ H+ Q
    <form-bean name=”myActionForm” type=”全路径.MyActionForm”/>
    ! g: A) D1 ^. s  j" v0 p/ U& h4 T
    <form-bean />- D$ r. l' y1 q5 R; k; m# r
    ! o9 @# `! q& j% ^& X
    </form-beans>: L; q9 q% u# m

    + B  H2 a% v$ N$ D  T2.<action-mappings>
    2 O1 h# e% ?8 T1 \0 R: O7 a6 L4 [2 |4 f- r" M3 A4 u; W6 ^4 ]
    <action path=”/sll”
    8 T; B, B+ e. b. U+ t
    + Y) @. _' x# F0 }/ O. n* J" Dname=”myActionForm”
    + X$ ^* y' }2 G) J5 N
      I1 O: ~2 R, _7 F* `+ U  I* ]6 I  btype=”全路径.MyAction”
    # v& k$ K: W' i/ J9 U6 H
    8 B& l& `0 M5 X8 Oscope=”session”0 e" }8 E# `& L- Y1 {1 _
    % s, z/ l7 R' L9 F4 U# j9 Y
    input=”错误返回的页面”>5 B/ `: u* a' Y/ e# s
    % J; O4 P; V' U2 L9 J' [$ Z/ \
    <forward name=”1″ path=”/1.jsp”>
    4 \' n' f6 r- }" l$ v/ I& h1 z7 y3 w3 k& [1 s
    <forward name=”2″ path=”/2.jsp”>
    : y) K( e; W3 Z. W2 K0 e9 q$ l. N7 _2 M8 c  ~- }$ J& _
    </action>4 T6 r% ?& H2 N: Z! k
      ]( v" a6 m* _1 l4 i+ J1 F3 I; C; b
    </action-mappings>/ [6 H; v- a: t
    ( U7 F0 \9 u' s1 I& f
    步骤:0 E6 [8 l1 p) {- c  [
    . b) W: J, q1 W, b  [( S
    1.创建一个空的web应用: j/ t% o% g+ S. Z4 }! Y
    7 M, b6 R: A1 {. G! x+ C
    2.将struts的包放到lib文件夹下% r9 r0 _/ v, k3 J5 _# W7 C
    8 Y" ~4 ]1 X/ h
    3.将.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目录下6 c! A: D2 h6 J  Q, w" T1 k5 c
    8 V9 n. J9 c/ e6 t5 Q
    4.配置struts-config.xml文件和web.xml文件) x/ F/ O+ H; `" d$ p; ~
    / u# ?6 I2 @( z+ I+ Q. ]0 r
    5.在页面引入tag文件uri: Y2 J: K" W! C+ R
    : y8 @/ N! q- C% q
    STRUTS运行机制3 o: u. {4 M: o0 l* |( u

    . O, G/ l" B4 K$ T- u1、界面点击产生请求
    , V0 ~0 @8 a' D1 M0 h
    9 k. K  a( y/ L) ~2、容器接到请求
    # @8 S# a) N2 A" d3 S" t6 K
    ; s& Q; W, A: H3 j$ D0 t4 S2 y  H3、匹配web.xml文件中的*.do来调用ActionServlet
    ) y8 M& p: d% O0 ~& e2 ~  T
    6 _; M8 {; \5 ?( z- p. K% ~) m4、ActionServlet的处理% Q: w. n1 H# I: P, D  M* g6 o9 |4 r

    1 ?4 x* M  ^7 P% j' }+ r- _( @4.1 读struts-congfig.xml文件形成ActionMapping! z) [- w& D2 Y  y8 N: i
    ) P( u8 X& D- I5 h
    4.2 通过path 来匹配Action类,通过Action的name属性来匹配ActionForm类
    2 d, c+ e2 c3 F: Q; O* F$ o) K  K! ~6 Y$ J$ q- T* k. i
    4.3 通过反射机制来给Form添数据) i' l" w1 \2 z. }  v, B

    $ _8 ?6 Q  ^2 D/ ^0 W4.4 由ActionServlet转调Action的execute方法
    % e1 \7 l$ n$ Y8 F" l. s7 {& Z3 }9 j$ g4 j3 u' ?
    4.5 得到execute方法的返回值,跳转页面6 v" H) `9 s, y5 v& O' @/ r

    1 D  K- Z: D6 T! A  m4.5.1 RequestDispatcher- o0 Q7 q0 v' C. Y+ C% M

    + T5 W2 u3 B2 d' e; a1 @4.5.2 response.sendRedirect(“list.jsp”);: x+ X" c( r8 Q; z
    # f& b; o# M! ~* b% b! V& `7 l
    , P  w& ~; J. R5 C
    ' a& {8 T% t2 `/ L5 K4 M: t. m
    进入execute方法
    + z. _" k# P8 X0 E! L; b
    ! S* Y) F+ k" N1 收集参数6 s# T0 l3 O9 S/ C2 u  @' J
    . c! l( \1 t* _  U. D9 L
    2 组织参数  H- n3 `! F! \; `6 i
    $ J- U1 e1 A/ K! b9 O# ?
    3 调用,逻辑层; u" }+ ]' W& T4 ?) t

    3 N0 T6 [6 e1 i1 u, {4 返回值
    1 X- v3 t: o9 ]- b
    # _" N- O/ ~! i. \( m4.1 选择下一个页面 (ActionForward)
    7 M4 v; |: n- p8 i' g, h- W% |1 \* f2 a  Q  c$ u8 q$ Z
    4.2 把值传给下一个页面
    . p) z! a4 D1 s9 l/ b2 _7 E" i- a
    ! K1 Q& g& g! l4 C& M ' @6 n2 B+ @2 U! P' A1 y& ~$ k

    3 S' V7 r5 J, |- u$ Z8 l; F; b. i+ s比较struts和struts2的不同" U  X" l# l$ c
    ) P1 w; O- V9 Q' E, c( b
    Struts) u+ \0 d& h. b* v: j1 A

    ! |5 q+ B6 S- B2 DStruts25 ~7 W9 |7 L8 G( ]% Y& {' T
    1 p! U6 E- n5 @$ _$ l& R
    组成        五个部分:ActionServlet,ActionMapping,AtcionForward,ActionForm,Action        十个部分:AcionContext,FilterDispatcher,ActionMapper,ActionProxy,Configuration Manager,Action Invocation,Interceptot,Action,Result,Taglib
    7 B6 ~# H! R+ ~5 m% Eurl        .do        .action$ j) R5 h# M% i+ s/ v  m
    分发控制        AtcionServlet        FilterDispatcher( ]: o$ U- D/ Y" w- T! ], d
    收集参数        利用JavaBean技术,将数据封装到ActionForm的子类中;8 w; ~# I7 M7 w1 W8 m' \7 R+ Q
    一个Action对应一个ActionForm的子类# A; |6 c. h; f$ U

    $ g2 X) K; U  B2 S6 i/ `9 [& t  i, w使用拦截器将数据封装到值栈中。
    % }! _  @+ m3 ?( [3 b使用域模型,一个Action对应多个值栈中的Model
    ) i2 N( ]5 J4 C4 u7 F6 v- m, k/ u3 O. H. K  r0 _0 H
    读取配置文件        ActionMapping        Configuration Manager
    6 ~3 A* W( c- N. B% e拦截器        无拦截器        执行Action前后有拦截器
    4 n9 u$ b( u8 V+ R9 Y返回页面        将字符串封装到AtcionForward,进行跳转页面        Action中直接返回字符串,通过Result跳转页面! G+ J+ G% C3 p* }
    页面跳转方式        两种:dispatch,redirect        三种:dispatch,redirect,chain% s' }" m# @( n1 o7 A8 b2 l
    值栈        无值栈,Action通过在request范围内设置属性,向jsp页面传递数据        有值栈,Action和jsp页面通过值栈传递数据,jsp页面通过OGNL取得值栈中的数据
    ! k, V6 W' c: S  M2 N配置文件        struts-config.xml        struts.xml
    ; n- x6 m* J- \* ~- ]) E0 m中文问题        不能解决(需要使用filter)        可以解决中文问题:
    - i- u1 z! z! h4 X4 ^1、在jsp页面添加Meta;
    # b. x- g3 C, F% V3 w6 y- ?7 v4 \3 z& O7 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 |只看该作者
    其他开发工具和技术# x& [5 w- L1 v2 H1 U. ]8 B$ H9 v
    Ant: h" k9 ?7 N/ s: U: V
    Ant是基于java的批处理工具9 i; S0 P; }0 @

    8 b  z6 I; a( a7 R- I9 ]一、配置ant的运行环境
    $ }, @. D! [6 u  K. d: w! z/ S+ X$ W4 d# z. Q& \
    1.将ant的bin目录添加到path中4 O! |: ^; D7 `9 C$ ~  ?: h6 d

    , w* _  u* q8 }& c2.配置JAVA_HOME' F, t$ L  U6 D
      A: j2 d% ]1 p0 L6 M; Q
    3.配置ANT_HOME
    # \5 [4 P: Z) y3 X" p! i& c, t
    % E/ W2 d& z7 S& }# Y5 m二、配制build.xml文件,该文件放在应用程序的根目录下
    , L6 R/ C8 q- Z9 A$ B- T1 G& O( z
    / B. I3 o9 q1 O% Y3 f4 z" `9 \编译java文件
    # @& [4 ?! s; d% j+ V+ W% T- F& U  s+ R" A, q
    执行java文件
    3 P, c! ]. j5 X* j' p9 B$ n
    - x8 T) ]1 \! Pcopy* b- H+ @; O1 B

    $ A& C# Y3 }8 h0 ^+ j: _" |删除" v% P1 @0 g$ Y- f+ O
    - t3 J3 k% q$ n  |" I, V
    打jar包9 l6 n$ x* D5 h' w0 N

    / Q2 r- n% B* |; f  K4 f根据注解生成配置文件
    ( y5 e# `8 |) C, ?2 m! ^
    ( z3 y$ E! z, K- [) F1 _2 GXdoclet5 [% i6 A! D& f. q8 l# B, j
    通过注释生成一系列文件的工具(txt、xml、java、html等)/ Y+ M+ K/ i- b0 s& l/ \6 M' }

    7 Q  ~9 w! ]) b* O/ }& C0 }xdoclet本质是摸板技术+字符串的替换9 c; s( {: @2 o  D+ g% J
    9 |/ @  s% c/ s1 c
    1.在java文件中写符合要求的注释(将hbm.xml文件的内容搬到java文件中去写)5 P/ |; Y* s- {: R3 l: |

    5 ]! c0 j3 |( k2 I1.1 在类的上面 写与表的对应
    6 k( w8 \* z0 q( P2 y  H: i, o1 C$ S7 T
    1.2 将每一个属性的注释都写到get方法的上面( l( j7 ^0 a! F8 f6 l/ N2 w" M- [
    - ]+ S  e7 _( A6 D
    2.在ant中引入相应的task来驱动xdoclet. h5 n+ F6 _$ e

    ' k& a+ G8 _2 C2 T% c5 t8 f ) a3 q; @% ~/ v

    * a  Z8 c' s8 i  H9 q' H: mlog4j日志管理6 {3 |" _5 {6 j& ^, s5 F/ R; U
    1、是什么?' ]" Q3 x3 p4 {# {- E

    : E* \6 D$ L5 z: R  L在开发期间用来测试、对整个日志信息进行管理的工具
    ( _* H3 x7 d# c
    # \# _' @. [) Z2、功能
    " d: T7 S. o% {, Q9 Y: b* g+ J  _; P
    1.控制输出的目的地* T, y  p$ P9 f1 \2 D& }6 |
    6 H3 O: F$ @) Y) U5 y% R; ]
    2. 控制输出的格式
    ; C  B0 _  `' d8 s2 A0 F# ~. @/ k! `  E$ X( l4 g
    3. 控制输出的级别
    ) \" _* I- `0 y% f
      m9 O0 |7 r; r) y1 k3、日志的级别
    5 |: [- u# t- {9 t$ O
    # B: y4 L; p  Q& L: A& [1. debug 调试
    # m+ R# b  s! ?* D' L1 J! L' j+ X6 Q* r! H( T9 y0 R6 C$ d, h6 n
    2. info 给用户的提示信息
    8 T; I( R  ?3 r1 {0 {, H9 Z; c. N0 V( L. B
    3. warn 给用户的警告信息
    2 n3 l# d. ?& a: V+ P5 _8 y& C* V9 p# R: Y  r: x0 P" F: n+ m
    4.error 给程序员用来调试
    8 e* z/ E+ C4 y, {1 l4 w) h: T* U. l  m- V8 v, K
    Debug—-〉info—-〉warn——–〉error7 q/ m9 a) P  p: ]' o. g

    0 R" s- W" u4 G5 i! @" q  t3 _4、配置
    , B5 I* p1 {! Y# S* b% ?# Q( N# ?5 ~, \, Y0 s% L& x4 w; C5 v; U4 S
    1.配置级别
    ! q7 ?7 B8 J# t) k9 i- S) M9 c4 w+ C" |0 b. a  ^3 b, w
    2.输入源 (控制台和文件)
    : Z7 t2 h! ]' [& n) F) c# B2 d5 h% |  W1 L+ x
    3.可以进行分包控制0 c# E* ?+ u( `0 `7 U1 s9 Y

      Y6 H2 a& D0 _  T& ELog4f.logger.包结构 = 级别
    ) m' G) L$ V% g4 J* G8 r9 b
    : ?1 b& W7 ~. t4 n6 d5、使用$ ]0 f. U: _1 _* l

    / _: i+ A2 {. @* |+ jLogger log=Logger.getLogger(Test.class);6 \% C$ \" f6 |( j8 x# e9 V, ?

    0 o# f+ B) C& j) N+ @4 D' s    public
    ; b  r. c. J6 H5 |' Mvoid t3(){
    5 E9 a8 L1 W+ W; h
    - U* N' e! s- c8 O7 w* V' e        log.debug(“this is debug”);
    9 g5 f: ]$ i, _4 v" i7 I# H+ Y' C3 S; o) e$ g' Q) T; Z
            log.info(“this is info”);
    3 p4 E2 S5 a7 q& T% z4 a/ ^' n" J0 i; @4 E$ f! P+ T; y5 d
            log.warn(“this is warn “);: b, B7 q/ p- x% j
    & B: T& |5 k' H& ]/ j
            log.error(“this is error”);. q( n6 y! S" w/ r. @1 t0 N* K
    " p+ T( G  n& \2 a; b  q" r! _- E
        }
    2 l4 k  b2 A" G+ ^" ]3 l9 ?! ?
    Junit
    $ n3 s2 H) v9 K+ g1 W5 o7 }- E( X1.是什么?2 u( P, M1 J' I1 z4 h' w

    ! l# _- _5 ^( R单元测试的框架
    0 s( I3 c  J" p5 C
    0 h, q- v0 E& t* o2.怎么做?
    $ V* N: ]$ g, b0 \7 r7 ^
    - O: Y/ _% w# s9 ^& J0 M" ~写一个类继承TestCase
    5 M& x# p- z' O" `  l3 }; }/ j: n& v2 ~* D4 C5 D& F! Q
    测试的方法一般都以test开头并且没有参数
    6 M) B8 J8 ^4 V, ]5 G) z
    2 F. x: t0 P1 R在测试方法前执行的方法public void setUp( )
    ( }% U3 C) A5 d  U1 e+ m. S
    + M- `0 Y9 E* `' T; q在测试方法后执行的方法public void tearDown( )
    8 [5 F6 Y4 ^& h% E9 u: e& S
    7 ^2 ?- t' S: A; eerror和故障的区别
    ; G- e. `  v, L% R6 {/ `% c, f- c  w8 J& v/ |0 k  l
    error :代码有问题0 G$ t2 }+ b9 q8 j$ H
    . f: W: w2 \( H  Q4 x6 g: m$ G
    故障 :逻辑有问题与祈望的值不相符合3 |& t  G2 ]* \! [( L1 H% g3 F$ ?
    . m/ a5 M8 d- {- ~" O8 z
    生命周期7 a8 e" v& A/ H% d- c( k! g; T
    + N6 Z7 a/ w; l3 r, ~) `
    测试—〉SetUp()—〉testXX()—〉tearDown()—〉结束;
    ( I  q( V9 u3 {
    4 z; W# y/ `0 K! o% J: K. Z  iTestCase套件+ f( O* A2 v# o! r8 M; i
    & A7 ^" v( F& Z) N+ k2 q
    public class MyTest{, }2 a" F( ?2 F
    6 G2 }$ l6 ]; y: j+ M) |3 |4 Q* S
            Public static Test suite(){
    0 I$ S$ o3 v! k) s9 R# P; o  I' Q; J# a: U  T, w+ P% U( N
    TestSuite suite = new TestSuite();1 Q# c$ f* {# F! |

    & {. B/ F' U$ M4 g, w& Gsuite.addTestCase(Test1.class);
    9 Z3 z% F  p$ u( W3 q7 ~% K' r% T. K, b7 ^' s9 N
    suite.addTestCase(Test2.class);
    " B; b- a1 p: D9 z4 ^: H/ O! `3 G0 ^# x7 k1 v; G6 R2 \  `
    }! K+ T# S+ b+ i8 Q" E
    . ^/ g2 x. n4 y  c; i! {5 e
    }. L3 S  L0 ]$ b5 W

    6 t- {) h& K: S9 b
    / b6 O2 _. l2 R" L( {3 I# I; y& ^/ K% {
    Ajax( J4 k! s. R" G% K& q3 D6 W. O
    是什么?
    . S) |; v- w+ G3 w* G$ z5 T, pAJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。是一种创建交互式网页应用的网页开发技术。; l: l+ d" F) X8 u; P; k0 H6 K% Y
    " T. A2 @; ~$ @( ]) e6 J# a2 H3 F
    无刷新页面。. ~" E1 P/ h* n3 @3 d3 r9 r' {

    . F* J7 x. N9 P有什么?
    8 }; ?0 r: f4 R5 ~; c; Q' PAJAX是多种技术的综合,包括JavaScript、XHTML和CSS、DOM、XML 和 XSLT、XMLHttpRequest。
    % C/ I; g5 W5 D2 Y6 R, \& y  a" z
    能干什么?
    9 ^* Y1 }) ?+ G5 m使用XHTML+CSS标准化呈现;' C2 E. Z: m$ Q( M  v" L% F  j/ j
    使用DOM进行动态显示及交互;
    0 [3 f! y) D& c( }; L: x使用 XML 和 XSLT 进行数据交换及相关操作;# [5 A5 h) {% b! ^8 ?! p" Z
    使用 XMLHttpRequest 进行异步数据查询、检索;
    ) E+ w1 H  X' Q# ~使用JavaScript绑定和处理有所得数据;3 a' B4 ^) o9 o4 H- q2 q
    6 y' [+ v# F2 J" j. F
    传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。; t) N) B, W5 P" j5 m/ ^* H
    5 g! w. \6 X2 m$ L: z
    与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。
    . s8 l8 d* }5 u! M6 y  s1 Y4 Y  ?! ?3 u
    使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。' c$ R0 Y7 |% Y7 u
    4 f: b9 X! w, K& |# L( {, `
    对应用Ajax最主要的批评就是:
    ) @+ u/ W6 R- W# I. i5 B1 它破坏了浏览器后退按钮的正常行为,就是用户点击后退按钮后不能看到之前的数据;% A  n, L: I& t7 F* [9 ?9 k
    2 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;
    , R8 k' Q2 _( o6 r2 h1 l. n9 V3 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;8 {$ V1 X$ Q. \* y# L8 [8 }
    4 Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;
    * I" j9 G* E0 Q2 E5 D% q; u
    & ]! b' E0 H+ r( c+ P: K怎么做?8 y* @/ y- m7 g7 i& c' j$ r
    <script language=”javascript”>5 U3 i3 [  f5 X  B9 F
    ! S) I1 K" ~; H0 s0 T0 U
    var req;0 E/ r6 W! [' {

    - y' i+ v! d) Z$ o8 w$ qfunction add(){
    : ]) c7 h- V4 O% ]0 ]! {) n0 Z) F- I+ o
    //1:创建用于传输的对象
    4 W* \) B2 H- a* A/ }4 P+ v+ q2 [; f% {- g  u6 y
    req=new ActiveXObject(“Microsoft.XMLHTTP”);, o* e3 w/ p  k- _

    $ y  J+ v  R/ j) G0 W2 Q// 声明返回后,处理数据的方法
    4 _6 r$ n5 v2 w8 _1 f7 t3 D, ?
    * e% V+ h$ u: A) P5 A, P1 xreq.onreadystatechange=manage;, H6 \- I% L3 U, s" O0 @  q
    / F1 j9 b# O  a( P
    //2:准备传输的内容
    + e: e3 Z: Y7 p7 ~) A, k
    0 P8 s( Z1 G7 a: j; d* Q2 yvar str=”test1111″;
    3 c: {; ^0 R1 M/ G, d) P5 O
    $ h# U- s% m. l4 s//3:发出请求, u+ Q  @$ e4 s  _' y
    # j6 H" w' y7 d# \9 A. K' B
    req.open(“GET” ,”/others/ajax/test/t2.jsp?str=”+str);: C( h6 B" P2 N$ ?3 v- s# r9 b3 F
    ( Z/ p+ N0 n' D/ H0 I' _6 ?* ^8 G
    req.send(null);- j& @7 }8 a& k  s6 {, |8 y/ U

    0 N. U- z" ~* L; h$ e' M4 ^}" a& P/ k# Z. M6 U' ~

    4 z) R, i4 ?( @) t/ X) W//4:接受返回并处理
    ! @% o: ^& I, Q) q& a) d. {/ ~( U
    function manage(){
    8 z2 M, H. F& }3 q( b- N( q7 t9 L/ v3 U
    if(req.readyState==4){9 d) R) `" ~( z
    . C/ [2 Y7 X* q0 P9 Q; \( m/ d2 f
    alert(“r==”+req.responseText);
    , H3 u' z5 p5 E# m) D: [. Z: k2 N$ |! ]
    }& f# ~! N. d0 K
    / P& Q; j: n: Z2 e+ E: C- _
    }
    7 Y( n0 z/ i- s3 J  [3 b& \, }6 B/ }& |( S. y
    </script>
    . Y" i5 m; c! k* i  ~1 G
    * D! e0 R, h$ ~0 i+ Q( P9 VreadyState的取值如下:
    1 A9 b% {  Y$ P6 B+ u5 q* |
    4 i5 ^8 X3 t& _8 P. o& E7 T; r2 M( a  0 (未初始化)
    : W8 w% R1 A& B2 W+ G$ }
    + T$ M$ m% p& m) _  _8 H. |4 y1 l  1 (正在装载)
    6 b4 {; D0 Y4 r5 M( c* O: D3 c# C
    / I: N9 |" y  G9 Y, h$ Z3 }  2 (装载完毕)
    % F# D/ V) {2 A/ v  g$ v- V3 [4 `' q* s! |
      3 (交互中)
    3 ?" r- a$ a7 d, M3 ?7 }, D
    6 O3 ~1 I1 F7 ]/ @" d7 K  4 (完成)8 t6 E3 ^5 j, L7 b6 M

    + T8 |% [+ ]; j$ [" c" E& ~
    + Y; @+ a/ _+ b5 G) V0 x/ s5 H, D2 r& A- q
    原理
    8 k. E: R" J8 r% @Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,可以是xml格式,也可以是一个字符串,然后用javascript来操作DOM而更新页面。
    4 E* D6 N" Z# q  J2 L) T; ~' P* ~( |5 g2 H4 F& O; K+ J) C4 e
    Dwr3 I6 O3 G% O! r! g
    是什么?
    + R7 g, c- g# [8 J# E' T6 gDWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的页面。它可以允许在页面中使用运行在WEB服务器上的JAVA函数,被调用的JAVA函数就像是在页面中JavaScript方法一样。
    2 F0 h2 N5 u: d) y0 u+ w
    : r$ H* {0 ]4 |有什么?) O' ^. K2 E9 f$ o) k  u7 s  G
    它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据;另外一方面提供了一个JavaScript库可以帮助web开发人员轻松地利用获取的数据来动态改变网页的内容。8 o9 y) f: N: y+ ]3 m8 u* i9 a" q: |

    " ^7 M/ @/ O4 `& f7 I- C * z4 x; R- _* x5 w1 ?# ?
    & c# L+ y( H# O& i7 T0 [
    能干什么?
    - r: U# n% I' Y( j6 ^+ m! e+ R动态地把java类生成为JavaScript,感觉调用就像发生在浏览器端,实际上代码调用发生在服务器端,Dwr负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制。& K, ]  F. ?7 _! s% j4 t. g# l

    : E' A! z2 W; x. O ' @4 E! R! [: p2 e7 U( i3 K
    8 M/ n2 A8 i* k- h6 T' ?, f
    怎么做?
    1 }' j; F( u" E. L6 I6 J; q① 编写配置文件" R* @' f7 m; I$ T/ ^+ e
    1 C: O! Y7 k0 h
    web.xml) D4 i" p' U# {) k+ l" e
    9 [3 D; Q3 Q, P# j+ P
    <servlet>; |: H7 K! d' B4 ]3 f

    % |/ j3 {6 z! ?! @<servlet-name>dwr-invoker</servlet-name>. N. t7 e: p4 m4 E8 U' s

    : @3 b9 c0 n- n6 W8 |/ Q! Z: [<servlet-class>
    % H; c$ Q3 i. V1 a2 `! A
    7 d1 @5 @5 m+ ~5 C: morg.directwebremoting.servlet.DwrServlet2 h, T: d8 D: _# N2 I. H
    - A. L+ p7 a) k! }
    </servlet-class>
    2 q3 o: I( J; v4 u
    5 f9 a! B" W/ W. R<init-param>
    / ~. y6 W3 C- C
    . E: k! ?( D! ^+ _' x2 o: J* u% m<param-name>debug</param-name>" g3 Q* c! w6 j; x
    5 r- s& \2 S# V# r! \& g
    <param-value>true</param-value>
    . G$ [( h8 F+ f0 N" C. a& ?& q7 B! C
    </init-param>) `% r: u/ y9 o
    / c* L4 `  X' m- N6 \* W6 l
    </servlet>
    5 i. S% C! q! p' E$ Y* N& h% s5 ?# x+ v
    <servlet-mapping>
    ( R3 D# [% X, U) u3 r
      `! N% m) k. |# z<servlet-name>dwr-invoker</servlet-name>
    2 T8 j- U  m# B4 s
    2 e" h& f# b. d<url-pattern>/dwr/*</url-pattern>) u. \4 _/ @- m( {3 j& q

    ( F2 [3 }  e2 z. r" p* T) H6 s% s</servlet-mapping>  K% L2 y6 ~4 R) D+ P8 F

    ! Z5 u* H# x8 o  f7 Fdwr.xml5 h. o+ ]- L3 m* {0 M, ?
    % T% Q# w. g3 o9 N$ y- A# R, B
    <allow>
    # u$ @2 {! c, h* A2 N2 p- M3 U
    # Y6 V/ o' h5 b! {% f, n" p<create creator=”new” javascript=”kc2″>
    ( ~! Q, p! t  ^8 P$ k& a  h$ H% [2 g$ U' F) g6 U
    <param name=”class” value=”dwr.Service” />
    2 v, q$ S$ ]  n: b  \8 d# ~8 }% y0 a% M  @3 M9 i2 ?
    </create>
    ! u: m5 a8 V9 {8 J( g
    ( r3 z4 s& P, f8 J</allow>) A/ A- c! s9 R1 N# C* N3 x

    % `. X1 o2 e. V3 T1 E) F: W/ P- F3 F②编写service" J8 Q! R* c/ E" X
    + e  e" a' `/ A9 J
    public class Service {3 B" N9 O. c- R3 W) A

    4 C+ ]: K# n2 l2 Zpublic String sayHello(String yourName) {  v" Y0 C) k9 J/ V- z: ^- |1 L

    : N: w* \( L1 l: {  b" |, S# l//可以是访问数据库的复杂代码
    & A2 N5 G% Y; S; o  V% J5 ]. b
    ! Y: D% W) G1 q4 X; breturn “Hello World ” + yourName;
    9 G" C7 i4 u( G- u! ^: K  A' }% W# @: j& E0 B' e8 Q( ^3 q
    }* C: I2 }  ]5 M/ B7 x- E0 q

    * q  d; E" ]: D! s}" v  w/ R% D% z
    0 R' U' s& G  h' Z1 [" n! p
    ③测试DWR( c$ h% h6 n+ ~+ a; M* C& A
    6 q1 s8 E' W1 n) C0 E1 m' t( t
    将代码放入应用服务器(比如Tomcat),启动。
    9 O  D5 P5 k- Q
    , d- q6 q! k  T& ^0 H) w/ R然后在地址栏输入http://localhost:8080/你的工程/dwr
    ) T( j" j% E$ r" T( l; H/ R0 D+ K
    - R0 G) P3 F! c# e, ^④编写jsp页面
    & w2 G( |. I4 V" f# {2 n
    1 L) n( _. B8 x1) 要引用3个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js' U/ H* A% K- I' t0 ~

    9 D8 G4 m2 S- J+ h3 d2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样
    $ f& h& t$ W5 L; T6 H
    7 Z7 i/ @+ ^& ?* T' ]3) js里的service.sayHello和java类的那个有一点区别,多了一个参数,用来得到返回的数据
    回复

    使用道具 举报

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

       

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