我的日常

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

动态微博

12
楼主: admin

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

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    11#
    发表于 2014-12-03 12:43:50 |只看该作者
    JEE3 A% X# L2 k4 J* L: {5 C) ~  d6 N
    简述JEE
    8 c6 D) g# L' y; ?JEE : JAVA  PLATFORM  ENTERPRISE  EDITION5 G1 g! l9 n/ F

    9 ~8 V& o5 b0 ~# b- PJEE是一个规范集;
    1 Z$ M- F' |7 }# [+ C6 j4 ~2 C& M& M) v
    JEE是一个框架集;2 c0 e* P" H% U9 p/ C5 z

    $ C5 a  K5 j0 x9 U0 q8 \! x, hJEE是一个技术集或API集;
    7 O' R9 i5 }4 g9 c0 s# M/ `8 O/ W$ S# b! o  z, j# E& _, p
    适用于创建服务器端的大型的软件服务系统" f1 O" {+ G, p0 C
    / J+ T) q! Z" a8 ?* f. v# x+ S7 d
    3 x, h& L( q  E! f' p) o7 t# ?# v9 Y, [4 e
    5 p0 [; w% J+ ~& O0 `4 ~
    C/S B/S 模式0 [) t. |0 @: S9 {6 M3 h7 t
    C/S client/server即客户机/服务器模式,客户端也参与程序的运行与计算(富客户端、胖客户端)# E5 ]5 w+ k1 L, _0 n2 x$ C

    9 W) i1 `& b, v! s' o% bB/S border/server即浏览器/服务器模式,又称为瘦客户端,客户端不参与程序的运行与计算( p& Z" g1 {. M

    ! S3 w3 r* g5 e1 S: {! l$ d& R
    ! M8 h# N! ?7 B' J3 q% G7 |7 m* z4 g2 a8 S! |( C
    企业级应用(大规模的应用)的特点
    $ ]' a5 I% G* `) j- i" Z4 T7 m1.生命周期长、稳定、可靠
    4 V9 }- c5 R3 V1 z# b4 j3 W8 M3 L& P
    8 |/ a+ @" @2 T! j8 d1 ~- j# v2.组件往往分布在异构的环境中,能够跨平台
    , g$ d! Z& m) S1 M5 ?6 L/ A- M. w( s6 @" P
    3.维护性、扩展性、重用性0 P( v: u& @1 ~+ o- H: J2 x

    7 f( F+ |' L& D9 e; A4.有事务、安全、线程) n" ~' c, l  h6 m6 H% l

    0 V, {* G$ f# w1 ~3 L
    8 s8 a  ~: N+ v+ z2 z# X# E: [' p2 G" u: \- A$ O/ \5 t) g) `4 p
    什么是业务逻辑?
    7 P( }- m  F6 s( r1 x* o; J依照业务逻辑划分模块,. W2 x  V4 [) r: L2 {
    ' T  p- b: |2 i9 a' A
    所谓判定业务 就是具有以下特征:( }1 Z4 B8 n+ F" H# @  i: }/ Y

    3 z, T( L3 m. ^+ N" T" [+ V9 `, W* {+ t1.业务流程! q+ K, C) j8 L

    ( b- e3 O3 B% a! m. s( U. Q+ w2.业务判断
    % `; w9 {& X4 N7 t; k% N2 M, V
    ; w" H* W7 ^* B3.功能组合1 u0 D9 e1 D: ?9 J: o4 B9 l2 X

    9 [4 d3 h$ o' q! d+ I7 b/ R. H $ {& K8 F0 j( E* c0 ~: B

    , x: q4 L/ g$ I平台(角色)的划分7 P' o7 u) f9 p
    1.平台供应商。提供满足API集实现的厂商(BEA weblogic IBM webshphere)
    6 k2 d0 }8 r" M
    : ^* U6 r4 o+ j2.组件供应商
    - R, T+ q+ T/ [9 u' {' a
    . f  }" M" r) B' y" n1 ], O3.组件装配人员
    2 T' q( ^0 S0 i& R& w) ?7 w1 P7 h# P, L, V( _
    4.部署人员
    % J3 C+ O! J8 ?  C: F" |: U8 @5 e5 v
    5.系统管理人员- L0 K5 d  {' z0 G
    7 f+ I+ s' ^  n$ _3 o
    6.工具供应商 提供开发组件所使用的工具(Jbuilder、eclipse)4 N& M7 n- w0 |* G

    ; g/ _" Q9 x5 D2 y/ |: S/ f- H
    - r5 y- z' U( i5 Q8 g
    ! y' A% `- O! J1 F* P* Pjava技术分布(设计架构 模块内部设计)
    + [" }8 `! q% I. }  v$ C- H1.表现层 Servlet、 Jsp、 JavaBean、 Taglib0 O1 _; N! t; K" L! d4 Q) Q
    7 ?' f9 m6 M; }* [4 G% C5 H
    2.逻辑层 EJB(SessionBean)3 b0 ?- z, P( v( H( z7 y' T
    " c8 C) ~+ C  q9 \% b7 d5 W
    3.数据层 ( JDBC  EJB(EntityBean))" r2 M6 |5 I: M8 I9 B

    $ R5 l5 h7 z; Z3 r% R6 ^4.服务 JTA(JAVA事务架构) JTS(JAVA事务服务) JAAS(JAVA授权与验证服务)
    : D6 c2 A* v+ g  b' x: j
    0 }" ~/ _/ U1 M5.分布式通讯 RMI(IIOP)+JNDI 、JAXP(JAVA 的 XML 架构)
    8 r8 H# G4 U! ^* M" h3 A. @# L
    JAVAMAIL(邮件服务)、JMS(消息服务)、IDLC、JCA(JAVA连接器框架 (成))- _9 o* w, M# ^  l) D9 I
    . R- {0 Y# p+ _4 Y" u- v

    ; N8 t, e; H0 a6 |9 t9 X" }
    - c4 n! v4 `: G' S. z7 xJEE的体系结构: 是一种组件的体系结构
    * M; v$ c+ B8 J: `1.组件 : 能够完成一定功能的封状体(独立的功能的集合)
    2 J* A. f/ }3 ]1 M! h2 p& O* ^: l9 p1 ?  u
    不能单独运行,必须运行在容器上6 B' h" V7 a: e4 U7 f

    . B, I) B' }' j$ m; U+ T7 K分为两类:web组件、ejb组件
    ; R! ?9 F  n5 `! G: X. J# s* [* ?! x2 H
    2.容器 : 提供组件的运行环境,并对组件进行管理(一段程序)8 A! W% y! Q' X8 O' Q: \$ z% F& m0 O& o
    " i3 Y2 w0 m7 ~# W# N
    管理组件的生命周期
    $ b& ~/ |4 X2 G
    : f) O: s  u# {不能单独运行,必须运行在服务器上
    . Q1 Q; X# i8 {: r( @' T
    ( h# X! F3 c* m程序(组件)通过上下文来调用容器(context)+ M6 B; K' F) p5 X& N) M; v

    ' l, l, d: K1 y9 n& Y3 H组件通过web.xml向容器描述自己,使容器能够认识组件7 U4 G% A: }5 m; U

    3 g9 Y8 a7 e0 ]$ R, O5 \. @1 D容器通过回调方法来调用组件" j, u: o$ ~  N- ^
    ! A. l0 a( J1 W3 S" r% H  ~
    分为两类:web容器、ejb容器
    5 M7 Y1 z  F3 h8 o' l# ~2 R9 D  Y
    - A. X( R6 Y6 `7 ]5 s" b3 S3.服务器 : 提供容器的运行环境,提供大量的JEE基础服务3 H' \- `* p# O9 X/ {3 ?

    & e& R$ Y9 X* Q3 l; [4 P# M9 ^7 cweb服务器(只提供web服务)
    , q+ A( W3 w9 [/ P) ^( J/ o
    $ L' w8 m4 b5 O3 Q3 @0 {' Ajee服务器(提供web、jee服务)
    * e2 k! L' \* p2 R* l  F# i% V/ y

    + |7 x  T9 t" P+ v0 H: |2 s8 M) L' H) E5 o+ h7 u
    什么是回调方法( e& k5 N& |5 A) H( N- h7 t# p
    由容器自动调用的方法,就叫回调方法。- T; x6 p4 m, w( ~% p, I+ A

    % ~+ i  F1 v; ^7 E% F 7 s! Y3 N/ }8 o/ S. U
    5 }5 n3 Z7 V  q: \! C
    RMI远程方法的调用机制/ @7 b/ i1 s+ [# h
    例如:A主机有B()方法,C主机有D()方法,A 想调用C主机的D方法; h5 B# W0 L7 t& q& S: G
    * X3 ?. O$ M9 G" u8 I

    3 U) B0 x$ p4 F& R$ C6 x/ o. D) Q+ G% g. G8 [. Q# b
    ) \, `. M3 h7 H7 Z+ y: R# L

    % {9 b- Z+ w) s) C) ?学习方法
    9 C; A% g% Z7 K: ~1.规范(熟记) 2.熟悉API 3.多练 4.多想
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    12#
    发表于 2014-12-03 12:45:29 |只看该作者
    Servlet
    / P5 N6 s* Y( ?' m% w2 B
    •     描述war包、jar包、ear包的结构8 u) d4 V* C2 |) G, n
      5 M! h& d5 W7 K' z
      ! \8 Q6 ^+ p' z1 R% s

    war-                            web文档压缩包

    —WEB-INF

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

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

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

    2 R# X" ^3 G; d  L1 V

    jar-                             java文件压缩包

    —META-INF

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


    8 Y# s% Q) {; W9 O) v2 z5 B: n% R

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

    –META-INF

    —Application.xml 配置文件

    –*.war

    –*.jar

    * x( l" s! p$ x- S8 s
    • 什么是servlet?servlet主要做什么?
      . N: M- V4 P/ m) F4 d) C% l

      $ Z9 r$ r, K& Y$ ?: Q
      ; C2 y; ^- {. v" x% C

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

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

      L2 X8 M1 O1 ?1 v3 C* T/ ^
    • servlet 与cgi相比的优点?servlet的缺点
      * X+ |: o6 B, O6 }
      - W% a8 ]3 {$ ?  r- |$ C
      # |% k1 i" z+ t) M; s% g4 p

    优点:

    性能(线程比进程更快)

    可伸缩

    Java强健且面向对象

    Java平台独立

    缺点:

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

    9 N# _! H3 l2 n
    • 常用的servlet包的名称是?4 X/ X9 M, q( L4 s8 t9 Y9 ~
      $ Y4 o) m, o& G0 A

      ) k4 n$ R0 K% ^# c: |9 t* h: `

    javax.servlet

    javax.servlet.http

    " E) {8 p6 s  A; W  X. g
    • 描述servlet接口的层次结构?7 z1 S0 w* w2 _  W2 V
      # @  K" w# M2 ]5 |, ]
      ! I, I: f; [6 @

    Servlet

    –GenericServlet

    –HttpServlet

    –自己的servlet

    ServletRequest

    –HttpServletRequest

    ServletResponse

    –HttpServletResponse

      ]6 [+ R; b. r. e& _; a
    • 对比get方法和post方法?
      3 v: `9 D8 J6 L& }7 F- ?

        p4 o2 z$ k/ {7 `# z: F. L& C3 l9 C

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

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

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

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


    * {1 M8 _5 G, ]
    • 归类描述HttpServletRequest接口都完成那些功能
      , N3 C+ C  r3 ~2 O

      7 O$ x" h( i7 A: ?: D- G6 G( E) z" N
      & |' C& |0 z; B# j9 x
      • 读取HTTP头标
        4 K! v: c3 S. t1 K0 \- `7 v1 u+ F
      • 读取cookie2 x% i/ y+ K& E: v
      • 读取路径信息
          S2 z+ P0 B. B  M: c. V. u6 I
      • 标识HTTP会话。
        . g9 X8 `" t( @0 }* ~* l
        * u( f% A  A4 v; `5 i5 k6 v

    - J& N# {; F: g  q. E2 g  g
    • 归类描述HttpServletResponse接口都完成那些功能
      0 {4 q/ Y( w* p+ D# B6 [5 ]

      ( T0 M0 G, B  z; e6 T/ J+ U- t/ ~  p0 Y
      • 设置HTTP头标
        - j: T: b$ M3 k# @
      • 设置cookie
        ) L4 e6 P; m5 i9 D, ?$ C
      • 设定响应的content类型
        0 H  X& [" |  |5 e; p
      • 输出返回数据. G$ w1 W1 p! p# _/ P! ]$ R
        $ r1 z. |- h5 a
      X6 ?9 ?( |4 R7 {9 C
    • 描述service方法所完成的基本功能?默认是在那里实现的?7 I% ^- P: k1 ]! }# d$ Z) e! _2 O/ P  @

      9 ?6 [4 z$ B" S, h2 H, @! d. a% {8 }) p4 A; G7 _# ^

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

    实现:默认在HttpServlet类中实现


    . C$ B( M1 j! o: \. m
    • 如何开发自己的Servlet?描述应该做的步骤和每步需要完成的工作/ k# B# D* I5 j' \; x5 s

      ! ~1 u! t. }2 j0 n  t8 ~9 r2 K4 z/ v: c; s! T) t

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


    7 R- B# I# C; ^" ~
    • 为何servlet需要部署描述?
      & Y+ y7 M$ p6 |2 c
      : _+ H& B/ J% c7 M, C& H
      ; h; |6 K5 e3 {: V0 D/ ]

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

    5 i1 [2 A, G% x2 Q
    • Servlet基本的描述应该是?请写出来
      / p4 w' H- F( ~* L9 I

      + z+ t9 k" i" M; M1 E# ?$ j, f! _, `- E  d% @( g
    5 X  i) s8 C6 j% y

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

    5 c6 o, l; R$ S+ C
    • 如何在html中使用servlet- S+ W  r& s: |! X

      2 @1 N! e! [6 b# @, s# {1 Y8 y
        ]0 w- Y0 F! |9 v7 Y; I+ |

    FORM标记

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

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

    语法:

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

    {HTML form tags and other HTML content}

    </FORM>

    ( L; f; c1 V# T$ s" }
    • 如何接受request中的参数2 M2 R; z; L; D
      0 t6 Z) a6 Y$ c! i) I0 j
      String userName = request.getParameter(“userName”)方法" ^' o* k9 |% e0 S5 m
      $ `: r" {& m" N) ?5 ~2 Z

    ! F7 F) k- b, t
    • 如何接受request中header的值
      3 q% Q- U6 j8 R1 b2 `) J$ Y

      ! P. e( {6 B) r: L, K; x
      0 H3 T9 Y6 c( `/ C, {: `2 W

    request.getHeader(name);

    request.getIntHeader(name);

    request.getDateHeader(name);

    request.getHeaderNames();


    : o$ O4 `9 c% q" A, o6 U! [
    • 如何输出html
      * V* I0 {: ], _2 G* _0 t$ D3 N
      5 U6 W" O3 b7 E

        X2 Z/ d) V9 s

    PrintWriter pw = response.getWriter();

    pw.write(“<html>”);

    pw.write(“Hello”);

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

    ' t; B4 \+ a- x
    • 如何设置输出的contentType0 G6 ?$ s+ o1 ]
      ! F  X5 H% G/ n7 D* n$ t
      , E# m* B; D1 N7 G

    response.setContentType(“text/html”)


    & t( h5 q0 a' D1 q' u, u
    • 描述servlet的生命周期?
      4 N, L% Y* D" ~0 u# B
      $ @* x! \2 k/ f. r+ ~5 t- J
      : e  i6 z1 `' g% U) g" S

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

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

    8 a& P% u" J* j1 {$ w+ P
    • 描述init,service,destroy方法的功能和特点: V% t* B5 ]  S. Z

      ; J0 t7 \( y, K6 B! g9 j, b; r; W. y0 T. X- n+ \

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

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

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

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

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

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

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


      k. v! a  ]6 g- @
    • 什么是回调方法?有什么特点?
      - L  P" o; {' d! w) [- h* ?; m4 ?, x9 g1 y

      . U, P5 ?* u5 e9 [' X% Y5 W) Z" k: e+ o

    由容器来调用程序的方法

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

    . Z* u% D) U- [8 B" x8 ]3 ?4 X" T, g
    • 如何设置初始化servlet的参数?8 k2 \( @0 z8 P. z  x" h' h
      : d! @1 ~8 h8 Q' P* x5 W$ K) i3 C
      在<servlet>中添加如下配置
      9 z7 u3 V1 R& C7 i! u$ Y) t
      8 J9 R- D% V9 U; w

    <init-param>

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

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

    </init-param>

    4 B6 Y1 o3 T. M; I
    • 如何获取servlet初始化的参数
      ) I% t* q! F: f- v$ _3 f/ Z! _
      + A1 a7 v5 [* d
        R5 a8 B/ c: m! L1 d, M

    public void init() {

    greetingText = getInitParameter(“greetingText”);

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

    }

    % i% [7 _/ V2 f9 [8 Z! E* b0 ^
    • ServletConfig接口默认实在那里实现的
      & Q" v- T' w) g' Y" n/ B7 M* q
      8 N( n9 i8 N0 e

      % c9 M; S6 j5 D# C# \" ?3 L: P' Y/ C

    GenericServlet类实现ServletConfig接口

    # ?, J1 c8 X  c, T7 g
    • 什么是ServletContext?有什么作用?& Y- N$ b. O" |; `+ L

      3 z9 C9 q; X( O8 z- [* n: E6 `0 j# }( W/ A/ r

    Servlet上下文

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

    4 h) ~+ c) r$ g& X  c$ `% M
    • 如何访问ServletContext接口?是在那里实现的?
      . \+ e+ r' b# m( G) Y

      ' \) g" Q' M1 I- f! `" P" Q6 F- z0 z( Y# ~8 `

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

    GenericServlet类实现了ServletContext接口。

    * y2 d/ K+ E" d( I
    • ServletContext接口的功能包括?分别用代码示例% n  q7 s; T. t. [
      2 f5 w' W7 n  u* ~! T! S1 F+ V

      0 o) E. P- }. }7 r# v$ E

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

    4 W: L, F- h7 R
    • 如何设置ServletContext的参数?* M, z: _6 ^( a3 D" a( b$ _5 n
      # N; Y( e& g" ~1 _0 ~
      " Q9 U% S% ~5 L! @8 R

    <context-param>

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

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

    </context-param>


    * U7 n2 f* n, \* \; T. k% Y! v
    • 如何获取ServletContext设置的参数值?( L" T& A( r8 S8 j5 ]. Z8 Y

      " I+ O4 _9 g0 T. K% b
      1 z) K7 W( d+ O3 `/ H

    ServletContext context = this.getServletContext();

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


    8 e6 |/ l1 [2 A
    • 描述Web应用的生命周期?
      " {' E) c7 G% s

      / c& t; R2 }' G
      % T2 m* M$ e" c. C: B8 D

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

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

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


    " U+ |, z4 |1 C6 z' g
    • 如何用代码实现监控Web应用的生命周期?
      . p# \8 r( a9 s* \5 G3 l
      * g. v0 u2 n  P; g7 s" Z0 A* F

      - j1 ~! q; f8 e" D: {- ?
      0 E6 A+ Q# t, E) r' Z

    public class Test implements ServletContextListener{

    public void contextDestroyed(ServletContextEvent arg0) {

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

    }

    public void contextInitialized(ServletContextEvent arg0) {

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

    }

    }


    3 s% E& v+ D' S) U

    web.xml文件中的配置:

    <listener>

    <listener-class>

    com.csy.Test

    </listener-class>

    </listener>


    6 I6 }8 i( o) A# ~% W6 W
    • web应用中如下错误码示什么意思:400,401,404,500  s: O* l! n* Z" h0 M" ^, T

      $ `; S4 \& u2 B! w4 H: {" D
      400 Bad Request//错误请求
      401 Unauthorized//未被认可
      404 Not Found//没有创建
      500 Internal Server Error//服务器内部错误

      6 f. L6 a$ x! Y$ i9 w9 X

    ( ~# h# T" P* S! n' |! T
    • 描述Web应用中用声明方式来进行错误处理的两种方法/ {) N: a' ~+ v+ e/ h5 ]( @% x
      2 Z# g# y2 c  I, }- t
      " z5 |$ ], v9 P) p

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

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

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

    ; i4 c% R) _4 o$ h% F, |& l
    • 描述记录异常日志的方法,都位于那些接口?4 e8 z1 Y" q& L* A# `1 R) X3 A

      + g& N& l1 h. i  u9 X$ V
      , X2 j1 J5 ~# D* }- J. }

    GenericServlet:

    log(message:String)

    log(message:String, Throwable:excp)

    ServletContext:

    log(message:String)

            log(message:String, excp:Throwable)


    * ?( k  c( @9 s8 V1 E
    • 什么是会话?* `+ g4 }1 Q9 q/ u5 ~: ]# M
      ) F; _& x0 p/ n: a, C5 g( P& d; f

      ) Y, z( |2 y: y  Q+ i7 t6 ~

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

    9 g& Z& u+ ^/ w* ?, S3 b
    • 如何获得会话?
      . T' V1 k$ L* T; [
      6 a7 z( H  Z8 h0 N& i) s0 k: R
      HttpSession session = request.getSesseion( );

      : Z0 Z4 a& T" O; h+ G

    4 U; v! ?: z( [
    • 会话Api的基本功能?
      " F. W8 p2 ?  `8 c
      2 B" T( h7 r& I  V' E
      * t( J" e) I+ O1 D2 E7 E" n

    getID() :String0 }& _- q. r7 D' M

        isNew() :boolean; ?/ }) y2 Y8 @( G

        getAttribute(name):Object( Q; a( A/ B. k5 L/ y' @

        setAttribute(name,value)
    ! C" K+ L2 H, e" v- \5 ?8 Q+ E

        removeAttribute(name)


    8 Z$ D5 }% G6 ~; f' t) u+ i
    • 如何销毁会话?
      * A0 }& I) g! I* Z/ g8 N8 ^- i

      ! T- t, v/ ~, ?/ S. z, ?0 v! {) l6 X7 M5 }' x2 j

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

    <session-config>
    ) n. @, ?3 v. Y/ y, {$ f

             <session-timeout>10</session-timeout>
    9 J( W: V4 @2 t0 E6 |0 t( Y

         </session-config>
    6 |6 u9 e8 t! S9 U8 P

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

    invalidate()% p# Y6 i0 L% i

         getCreationTime() :long8 h! k: {( J+ B! ~1 O2 S8 D% P

        getLastAccessedTime() :long# i  _2 i8 I+ [/ `8 o# o2 G

        getMaxInactiveInterval() :int- P* K+ t$ s! @+ P

         setMaxInactiveInterval(int)

    1 q! [$ h' H0 e; X3 [  \: ~
    • 描述会话保持状态的基本原理
      . h4 ?7 ~2 J; v7 u& u' x- H

      6 b8 K0 v  A$ [/ y6 p$ v- }' P* u% ]
      . W/ p3 U6 {7 x2 k+ a
    & R( u5 _" x, U: i

        client server
    , r3 W+ s5 X( c. ~

    * v! c9 l2 K6 ?+ g" n4 ]/ X: w) R

    request
    " [- c' ~6 b  D; M; v

    response (sessionid)
    - S% N) R( }- i- _  j- J

    request (cookies)
    : q  T& I6 E5 F8 c, F1 w  J) g

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


    ) c3 p% t1 w9 \+ a$ r& I' d: M
    • 请描述session和cookie的异同之处
      " T  W2 D. Y4 T- m. T- Z* F, i# i

      ! n& x. B" n1 p; t
      6 ~" |/ y5 q8 }- F* l5 g1 F

    ! @7 H3 c4 i' K% {8 E
    ( \9 j' H& z7 R5 C
    • 如何读写cookie,代码示例+ W; o' w5 z! I1 z+ |1 u: W

      " [1 z6 o. J8 l2 Z
      # ?+ i4 ?) T- f( O

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

    response.addCookie(c);

    读:Cookie[] cookies = request.getCookies();
    2 h4 N, K7 T0 H

            for ( int i=0; i < cookies.length; i++ ) {0 V- Z, B3 g8 O$ u" G" ]' `

                String key =cookies.getName();. X4 U, f4 I* P& A8 T& R: \1 l

    String value = cookies.getValue();
    % ~* ~+ i) g* D1 f

    System.out.println(“cook”+i+“:key=”+key+“,value=”+value);  R) P* {1 W3 H1 U* t6 D

         }


    3 x. d: v6 F* P: L% L, ?
    • 什么是URL重写,如何实现,代码示例
      ' G/ g" u. i6 }

      6 X4 C- w1 O7 G/ ~8 c7 ?  ?0 r5 v( a, N! g8 c

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

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

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

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

    2 N7 s* C0 n. h3 r
    7 s/ U0 W/ F* W9 [: z  J
    • 描述web应用的4种认证技术
      , Z! S( j" C) \# v+ L  Y0 Q
      ; Z' T$ E4 K7 L# h. o& D5 o
      ; _/ Q1 O* r7 B- i5 P! a5 }

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

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

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

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

    2 O' }( Y) g$ L
    • 什么是授权,什么是验证?- p& j2 Q2 G4 Q1 Z2 z

      $ N# {  a% l. C+ k$ ~  L% u8 D7 P4 `

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

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


    $ z/ d/ R% q& i
    • 什么是HTTPS4 L1 [& z1 t0 h( c: R3 C) A: z8 |
        P) u# z1 t0 |9 Q
      4 ?7 f  a# j5 y

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


    4 ]8 ?9 T' O/ \1 e2 p/ j6 P
    • 什么是审计?
      / }/ \$ D0 U. {6 @7 x8 b& {. E
        N1 f( r/ t  N& w

      + ?) R& L% K/ w

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

    & j, Q. v3 Y9 R* T, K
    • 如何实现声明性授权! a& W9 e/ u* f' ~: y9 p( F

      * w* S# m: f" b' O, L( r9 A: y2 I  R% [( I8 P$ N6 J

    1、标识web资源集

    2、标识角色

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

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

    在 web.xml里配

      g$ S9 Z+ D# i9 Q5 P. y; f
    • 描述servlet并发问题?
      " g+ q. x  u6 G; ?2 C+ [" X

      . Q5 t4 \' q: }( A6 Z% V. r5 F0 `4 U1 @; @; m9 k+ k* [6 s

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

    - ]% `' N2 Q. n; J5 S# l
    • 描述Web应用中的六种属性范围* R* b7 c. c& D4 e% Q

      5 K4 F9 F' Y# K$ C2 u5 F0 u) q$ ?* s

    局部变量(页面范围)

    实例变量

    类变量

    请求属性(请求范围)

    会话属性(会话范围)

    上下文属性(应用范围)


    ' K2 h% \7 c) Z& z
    • 指出上述六种哪些是线程安全的$ d! \* i6 r" c# Z4 A- f/ N( ]6 v/ M9 R
      3 Y4 Q3 g% B+ _& }+ x

        k% \! ?, f9 C( ?

    局部变量和请求属性


    , m1 Z/ w0 g: M5 C+ }  o7 k
    • 什么是STM?如何实现?7 }0 t6 i8 A0 m& q2 E, g! W
      9 o7 b5 U  K# ]7 }+ M3 a2 s
      . r8 U; D9 F8 v/ y

    SingleThreadModel接口

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


    0 K7 ^. ~- C0 g7 d
    • 如何实现并发管理?
      5 ^1 C) [* Y6 k* O' }/ m

      6 {$ u; b7 a  A3 X% Q4 |9 I& f) ]
      2 F; J$ c7 R. W+ U8 L$ J+ }

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

    使用synchronized语法控制并发

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

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

    : x0 q% d5 {5 y" s
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    13#
    发表于 2014-12-03 12:45:45 |只看该作者
    Jsp
    3 R9 }4 ?+ L# g6 |什么是Jsp?
    & Y+ p% \8 t5 H( nJava Server Page    结合java和html在服务端动态生成web页面的技术
    ; J4 S8 }" g; f+ c2 n
    - \  S. T! B. O: P
    , X% s0 R# p( r2 j8 ]; O( y4 z0 c, v& R+ q9 o' D2 @
    描述Jsp页面的运行过程?& P% w, m$ D4 ]9 z" J; E5 b6 H
    第一步:
    " G, R( p$ Z' A* W1 Y& l/ ^( C
    ; N0 U, ~3 c" k9 N- d1 A% S1 O请求进入Web容器,将JSP页面翻译成Servlet代码+ e1 d- P9 M% k9 S; L/ y

    " a7 N* n2 [. F! k% m1 b1 Z2 r第二步:; I4 ^& a% T% l
    * s4 h% Q- l9 {2 q7 }2 k
    编译Servlet代码,并将编译过的类文件装入Web容器(JVM)环境
    ( o. Y5 A; O2 G7 Z. w+ e/ o$ D4 F, b, d0 U
    第三步:/ E; c" ?5 G& O( b, C
    $ `- i. s- t' `: i$ q* i
    Web容器为JSP页面创建一个Servlet类实例,并执行jspInit方法  N8 n! g" d: F8 c$ V
    8 A* C8 Q! W$ ?$ X( c, j' v
    第四步:
    6 o- ~1 `2 F% j( N, i- N1 V9 G- r$ V6 U
    ' v9 Q! ^0 A0 T/ u+ Q! _  b2 qWeb容器为该JSP页面调用Servlet实例的_jspService方法;将结果发送给用户: e5 z8 D: k& t% a  ]0 Q" u
    : Y  N4 X/ ^- d3 p! ~2 w3 b! j! |5 Q3 O

    . [3 _2 ~& m& L1 ~- o( O' v" ~- r
    1 W. n9 ?4 D8 K* n- `描述Jsp页面的五类脚本元素的功能、写法、并示例% L- ?! P$ E6 O$ |7 H4 E( J
    注释 <%– –%>- O3 f7 b+ I; D2 U# p

    # C" U2 h/ u2 \<HTML>
    , w9 C7 ~9 ]- Q  F7 H0 K% l/ ~3 V
    <%– scripting element –%>
      m9 A+ _0 n3 u. z
    - S0 X& }. W+ F! \2 J4 l9 Y</HTML>
    " C; R) Y9 ]+ ?* x) _- x3 [$ h; L
    2 ?+ i/ W% M& T5 X指令标记 <%@ %> 指令标记影响JSP页面的翻译阶段3 J* @2 h" G4 [! l( b. c
    ! p' G  Y, U" V
    <%@ page session=”false” %>
    ; e! p- t+ z' R9 e* o- g+ K/ y5 n, @5 l) T
    声明标记 <%! %> 声明标记允许JSP页面开发人员包含类级声明* V5 B9 Z2 p7 Q$ Z! O* p1 o

    " @# k! o( Z7 [/ t7 n" O' p<%! public static final String DEFAULT_NAME = “World”; %>( Q, d  H1 U! b# l6 O/ \

      f; h+ I% T! `    脚本标记 <% %> 脚本标记允许JSP页面开发人员在_jspService方法中包含任意的Java代码
    6 V% U5 r" F* t4 x: W+ ]( h% _
    + e) B- U4 O$ n. u# w; h    <% int i = 0; %>
    6 `! r; ^) O8 X+ w" m& f; l  H: c  ^7 t
    表达式标记 <%= %> 表达式标记封装Java运行时的表达式,其值被送至HTTP响应流 <B>Ten is <%= (2 * 5) %></B>
    1 E* Q. s, S1 L. s2 g- J
    " A# p+ Y0 W1 {; ]8 m ; i3 G5 ^) V5 s3 B- e4 \" F

    ) x' o$ Z3 e' O/ }9 t* ]描述Jsp页面中的注释种类和写法
    ' s) ~8 }! U% eHTML注释) i# V0 q/ L/ V  \

    ; B3 T/ T) T: w' \2 ~<!– HTML注释显示在响应中 –>
    5 a# T+ H$ o8 ~
      P; A, W* j. q! xJSP页面注释2 I5 N0 W5 r1 P5 l2 W
    # s& s) w" J1 C% |: s7 [( @  R" [
    <%– JSP注释只在JSP代码中可见,不显示在servlet代码或响应中。–%>
    1 c. w$ s+ v& ~; S+ r  _: b  b7 N. k% F2 R* G# N$ `) F) T  p% g
    Java注释0 D0 M# H: Q& V' z
    4 b4 @- A% D6 S+ `8 U: ]# }3 _
    <%
    5 t$ V, ~9 j6 j# g
    8 u5 m; G% u; h  r- B, N/* Java注释显示在servlet代码中,不显示在响应中* z6 t$ P; {- V2 \: m
    9 N, o7 x! z" l- x
    */
    / ^: c% ]4 o7 D5 I/ V% u# X6 a" o) ?; q! ]6 B
    %>6 n% u8 q9 ^2 f  a! Q! @2 r
    2 Z* R& \( [+ N) x
    $ N. g* {. k8 c% X

    ) b  ~, m# V. u7 l% ~描述Jsp页面的指令标记的功能、写法、并示例
    6 U$ H! z# f& ]指令标记影响JSP页面的翻译阶段, r+ B, u% G4 M
    ! d' y# U, j' S) C1 D# t, o9 w
    <%@ page session=”false” %>
    ; i+ C+ a+ q$ m" V0 s3 _( v9 K4 a
    9 g6 v# r# Y$ `3 x9 a<%@ include file=”incl/copyright.html” %>$ s, i, y. S. H" y( r

    . g% {# Z$ P+ ]. f, F1 W% U# S<%@ taglib %>
    % a+ c3 @& k' Q' v' r! y" U: F5 ?' \0 J# {4 Z' ?
    : [: s* y4 F( f- v4 \- U

    8 Y- l9 n. E; s$ D6 W描述Jsp页面的声明标记的功能、写法、并示例
    ! y( |& B7 K2 `5 }( r3 v5 M% @声明标记允许JSP页面开发人员包含类级声明
    7 |8 v/ O) c( {8 y6 j, F: P9 m' L
    6 u* ?% K" [, U& r+ f8 }写法:) c6 k, B1 J( j; |' K! `7 X# b
    ( a+ t. `4 |# \) M
    <%! JavaClassDeclaration %>, o7 }4 s0 N, S; \

    . A9 N. t! {, a& G1 c3 P9 u例:
    : {+ _/ p1 q  c" v/ J9 `! _
    " A# l. C4 F. E, r2 ~6 E* q<%! public static final String DEFAULT_NAME = “World”; %>
    . p+ _2 E# H+ U0 k4 Y  a" d; K( F
    & q/ ?5 w/ ~! H9 O<%! public String getName(HttpServletRequest request) {
    ! n; w5 b, T* ?; a- c% n: I  |
    ! X" I( f6 o0 Z/ E' Ureturn request.getParameter(“name”);
    3 \. T9 l8 V" C9 n3 J# o" u) Y( ^0 E' |8 D! b2 u
    }  p8 Q+ K1 S* p' \8 K0 \5 p

    ; e/ p$ s5 ]; l; W4 L%>6 o9 y, D$ T$ c( l: @8 z
    $ V: n6 y/ `. N/ R' Q0 t
    <%! int counter = 0; %>' {3 X4 ]: b: R/ P. z8 `

    0 m3 @, Z; X, o$ N
    % f- h( O6 H' E; j% h+ d; l- o
    & b) o' J4 s1 X5 `  [描述Jsp页面翻译成Servlet的规则8 o4 s3 T/ V; G# p& X
    jsp中的注释标记被翻译成Servlet类中的注释* R% g! X7 C# g
    $ X7 J2 {: o( Y
    jsp中的指令标记被翻译成Servlet类中的import语句等
    * ]. I6 Z9 B1 F0 Q8 H
    ! ]5 B2 }2 r9 W7 g/ l  \jsp中的声明标记被翻译成Servlet类中的属性. I: _. P" m9 Y: t7 i% ?2 r' B
    ; p# J6 G+ x2 b
    jsp中的脚本标记被转移到Servlet类中service方法中的代码  D8 g8 n0 I! R8 E
    ( M/ ^/ d7 H/ [! y' }4 _2 y
    jsp中的表达式标记被翻译成Serlvet类中的write()或者print()方法括号中的代码& R) u' x: e/ y( R
    & |# `2 o6 ]' _7 ^) Q5 e

    # n0 y! k, I' n5 J" o% P& r' a$ h: f
    ' H; _* R0 g1 P' b描述Jsp页面的九个预定义变量的功能、用法、并示例! ?" s5 U+ v; u5 \9 B  Q- |( k& f
    request 与请求相关的HttpServletRequest对象
    8 J) Q1 X$ J8 I  C4 [) ?
    6 I. }% Z! i4 t9 a' b9 o$ dresponse 与送回浏览器的响应相关的HttpServletResponse对象1 x/ h3 Q4 R& ]+ V/ z
    ! W/ \5 x) Z4 a* d0 I5 U: ^3 Y' B6 b
    out 与响应的输出流相关的JspWriter对象  a( G9 z8 D$ F8 H6 U; T

    % l$ c3 [; v# H: B9 F5 @    session 与给定用户请求会话相关的HttpSession对象,该变量只在JSP页面参
    3 R& Z6 o5 G5 p
    / U1 q# f9 h3 ^2 B3 A! @% R与一个HTTP会话时有意义
    0 E  j6 L) d' ^$ M  W% c% @" v2 v/ k4 w, h
        application 用于Web应用的ServletContext对象
    $ k# r1 b8 {" z9 V% N) }- q0 M1 o5 f8 f: X
    config 与该JSP页面的servlet相关的ServletConfig对象' x+ T4 l* k# v
    7 x4 K. f" o$ [4 C9 U: Q
    pageContext 该对象封装了一个JSP页面请求的环境' G7 y/ K* ?3 Q! }+ o' M
    $ e$ k  _4 d- p! f8 O
    page 该变量与Java编程语言中的this变量等价* c+ Z: j& r( P

    * I& l/ ^* m  _& |5 ~8 M0 {0 o0 e. v. U    exception 由其它JSP页面抛出的Throwable对象,该变量只在”JSP错误页面”中可用
    4 }' {+ _, j+ Q8 A. ~% z* ?
    , V, b5 r1 a6 F 6 v2 y/ I) l6 j5 j) f6 t' V

    " v0 ?  |" [7 P. Ipage指令的功能,写法、并示例,并描述它的如下属性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding! d6 b4 c& W( M' i
    import import 定义了一组servlet类定义必须导入的类和包,值是一个由3 q+ }" z4 `7 U* U1 a3 N' S

    ! e* u1 X" y1 e逗号分隔的完全类名或包的列表。* p" U$ M8 V# k
    / n7 ?' g: Q0 l8 [3 F
    session session 定义JSP页面是否参与HTTP会话,值可以为true(缺省)  j3 Q/ j+ X6 O& ~$ A) Q& U# K* f6 [
      N8 ^: Y% S  }8 l) c2 o2 f
    或false。
    6 ^* S) P3 n/ G9 Z
    : C! f4 b$ }0 B" V# Y" pbuffer buffer 定义用于输出流(JspWriter对象)的缓冲区大小,值可以为3 V4 Z' f$ w6 X, O
    7 A1 @6 f- n0 e+ f# S: N
    none或Nkb,缺省为8KB或更大。
    6 z) L' j6 o7 a6 l& P$ Z- c' ~" _$ L( c; ^* p) c% ?/ X! w4 n
    errorPage 用来指定由另一个jsp页面来处理所有该页面抛出的异常
    5 Z+ c! G# _/ b1 r5 g4 `3 l; h% W* K4 b' |) W
    isErrorPage 定义JSP页面为其它JSP页面errorPage属性的目标,值为true或3 R  q# j* r5 m: ]" U$ V3 k: R
    , \5 M1 O' d3 T) W* ^+ w' `
    false(缺省)。
    6 y$ c5 ?. Q. Y8 \7 j5 E& h0 j/ E
    ContentType 定义输出流的MIME类型,缺省为text/html。1 |  d1 p, e9 K1 U- d3 _
    ( [& G& A+ o$ A9 G+ J
    pageEncoding 定义输出流的字符编码,缺省为ISO-8859-1
    1 R% g6 ^$ }9 X' q$ z
    4 h  p( M6 \% p( X) j; J- H
    9 o& [' e* J, r2 `5 z, A  `  W( w8 m5 F( U0 i
    描述MVC各部分的功能?MVC的优点?MVC的缺点?" S( J. \; g* l1 L4 w
    MVC各部分的功能:
    ! ^! x. [3 G: z/ s, @
    + R& D' f# c- QModel(模型表示企业数据和业务逻辑)2 y$ r% [4 U' k' P

    . C+ d& B2 B5 |7 X  L# k3 Q封装应用状态
    ( ~; P; o9 U* j5 c/ \) E' h5 M! `& S- N( W9 D
    响应状态查询
    1 L( J/ o! P% R% u& N* o
    , }* U  O) h8 R& R8 B暴露应用的功能" S0 |+ q1 ^3 R2 I4 y3 E

      v4 a3 e5 e2 \. G3 DController(控制器接受用户的输入并调用模型和视图去完成用户的需求)8 c- r- R' a; a

    1 R. X, d( S6 }+ i! r1 @$ b) V验证HTTP请求的数据
    ( L: m+ M9 w* M/ W/ S4 l- A- @8 L0 `9 s- }
    将用户数据与模型的更新相映射
    ) }5 i& B# [) M& t' W) X7 ]4 Y* J" N$ p# ], j
    选择用于响应的视图
    # O% `9 C% _0 s* G; _& Y9 P: x4 L8 m" E% s  o+ ~0 P; y
    View(视图是用户看到并与之交互的界面); d/ O; o' ]3 {2 m% b# M  Q5 k
    3 p9 o7 |/ P- a5 E
    产生HTML响应
    , R4 b( B# K# A" x" k6 Y- o# z6 U1 y4 j3 F$ x# r9 c
    请求模型的更新7 b  u+ M0 h4 C
    5 Y$ i6 S; l* p0 a
    提供HTML form用于用户请求9 e$ U* v) K0 t/ `- b  X  a$ {  H
    3 x8 f, f7 C1 z' d( m9 R7 O
    MVC的优点:
    8 n1 Y' z$ H0 W7 i8 l3 d" y. ^; b$ L% A0 j% }# z% A
            低耦合性:视图层和业务层分离
    ; B! j# R* j" k( }8 C- l
    ; c5 z2 P" K9 w1 e" [: z# @+ i高重用性和可适用性' r9 S* j( ~8 J
    ; M+ Q- F. l: f* ?/ P6 g
    较低的生命周期成本
    4 }: L1 {8 v! M) Z% ^
    2 l7 ^: E7 Q8 {3 J2 ?快速的部署4 t! u* [* ^  N
    , U1 x' d' p9 F3 M, f% {
    可维护性
    7 T( k0 d' }$ N+ l0 s0 r1 [- o/ j' N
    有利于软件工程化管理
    $ r# w! ^% o( S! H) O
    ( f1 J- y" n4 O! c提高软件的健壮性5 P' `. k' s, R2 g- G) b
    - i5 P5 N6 s3 [5 S
    MVC的缺点:
    # `  R/ z9 V$ U$ _: _4 ]! V& M" ]! Y1 d* Y
            工作量大,增加工作的复杂性,MVC不适合小型甚至中等规模的应用程序
    - Z4 |9 K3 w- f( h
    8 {) L* }" U/ L( x; Q* ~ ) w5 l: Q/ [# w' e: C* A, v

    9 ]" U" v6 D+ i5 e* G2 P2 Q7 O, ~# W  T6 A什么是Model 1结构,以及结构中各部分的功能
    0 u0 L8 F+ V+ s: s; x3 M5 f结构:jsp+javabean
    $ h2 A: F- X, p# r3 S
    & d0 \$ }' G: r2 dModel1中使用jsp来处理web应用中的视图控制部分5 @# }" L" {4 Q  W4 j8 Z

    4 g4 }! A, e! E7 G% w' N( X, QJavabean收集参数: o: U* e3 {6 ~2 C
    " [5 g, S3 ?% S
    % S- h- R: v1 E  N
    4 T2 o7 z. _8 j4 G3 d* t4 r
    什么是JavaBean?
    ! r/ N( y6 ?6 |: g4 ^' f用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。, H* L- f. |' f! V) m9 }
    0 C/ s5 E8 T* O! ?9 W

    7 m9 R" d# u( v
    ; {2 S% A) D6 m7 MJavaBean的规则?
      k$ p. m% |5 A; m7 E( \使用get和set方法定义属性6 Y$ L* d  r8 R  l. r9 U8 P
    ' W- B& m( k/ u6 B
    一个无参构造方法
      P  N2 T, @% x$ g
    : ~1 F5 u, `2 C; U4 y" w2 [& E. D无public实例变量( 所有属性私有化)
    1 C+ P7 q4 B8 U% }4 p4 x( b- l: d
    + N  G: r  j* i& H# m 7 L: m- U0 u, L7 j7 ]

    1 b- P  ~; w' m7 L9 {: m什么是jsp标准动作?包含那些?分别都是什么功能?如何使用?2 L9 h0 ^4 Q" {! E
    JSP页面中使用类似于XML的标记表示运行时的动作
    7 j4 Y. ~8 E. _/ z
    0 X9 g" x) l1 T9 g, M% `/ ~jsp:useBean
    6 R4 L! k. v4 f% q: n: n3 t- v/ J7 [4 [$ \$ P6 Y
    jsp:setProperty" s: Q1 m* S1 Y4 _  ^- X) l9 r  j

    ' x: |" p( G3 v; D0 c! N4 R2 sjsp:getProperty
    7 p( {. H$ _' v: O! S" q
    7 t5 X; ]6 m+ z( j8 R0 j2 @. ~' Fjsp:param5 l: c- f2 [" v; U% `, E
    ( B4 o% e1 P1 E
    jsp:include
    8 J) \* {( D- a! \
    & k; ^4 {& e( m" Rjsp:forward* ~8 D) P  Y0 g0 p& {! j

    . _/ d  d0 v! i1 i" r3 q 0 l* G, G: v" J

    ' M9 S$ l9 P0 ^用代码示例如下标准动作的使用:useBean、getProperty、setProperty
    # e, s, r. B8 P8 h3 L6 B- h<jsp:useBean$ T' e8 K8 v7 Q: @3 N

    6 \. t; x3 W' e& V+ xid=”myForms”. Z/ V) o5 B' ~% i. T9 B
    . [, [# V" w% t* j+ W4 D; ?
    class=”com.base.mystruts.forms.MyActionForm” scope=”session” />
    1 L' o# ~: A9 w, r7 Y) j# I; H0 f1 F
    ) m$ E# v1 M: B: C% D    <jsp:setProperty name=”myForms” property=”name” />
    7 n/ i1 `* ]3 I1 v
    % _* X; R5 m% [7 r/ U( a<jsp:getProperty name=”myForms” property=”id” />
    & P. `7 {0 B$ b- s$ Y1 v& N& @+ Y( C. X! v6 y+ h  t
    % V$ s4 ~2 Q! J, }$ n% u/ q2 ^
    ! t$ p% G2 z! r% H
    描述说明Bean的四种scope) K' I$ O9 V* P4 g$ G- E: p& J
    page
    4 h0 i8 N" W" b0 F1 |  f/ q) g6 h* T: H
    request
    6 T$ _7 Q# {0 O6 P4 W  N/ l
    * b  A5 N) J" }5 G' W$ w; ^4 Dsession) ?9 y: ^& L0 h) d

    - f! P7 k* w% A: l( Q; p; happlication
    , V+ R/ |$ |* X" |: X$ k' Q/ }; D7 v0 s" V
    * b1 {/ R6 h" _' Z* e+ S

    / ^" j; ]" e' _- V描述说明页面上的字段和Bean中属性的对应规则
    # h: ^1 p" u$ Sid 指javabean的变量名
      n4 I4 ?$ }4 \( r7 [8 k$ p
    6 w- e: U: ?+ Aclass指javabean类的全路径
    + ?+ H+ E4 d+ f1 M- `; i$ `
    " U7 t7 @0 }: lscope指javabean的应用范围$ N$ A  Q& E5 D2 g5 U* v9 c0 ]6 ]

    1 k: `+ j- x9 g; {( N! x, lname指所用到的javabean的变量名
    * s  p, h$ j4 }+ q& C$ G
    $ m+ E$ p' ?; \: y! T* c9 C0 j    property指javabean中的属性  ^' `, w7 `9 l

    , |! M: m. ~$ U/ D / d/ c: {! J, c" n  u& N3 k
    . N8 {& m" t# Z
    描述useBean动作的处理过程
    6 }2 t- b3 m) o( X. r1 m使用id声明变量
    " k  q2 _: I* g: |$ c( Z. ~6 H4 z
    ; E/ h+ h* d) K2 o试图在指定的范围内查找对象2 s7 Z5 q. [; U: h* ~2 |
    6 s' q6 P6 ]% f( ]* c7 K
    如果没找到, ]0 z8 f. w8 [4 _  R

      T/ J" L5 y, a7 b0 W; u0 h2 B创建一个类的实例
    4 z% B9 d. \0 E0 [/ a4 o" A5 ~1 w* W( B+ i' b
    执行useBean标记体初始化对象( j" o( C* i9 A! p
    9 G1 z, `. F' l9 @8 {
    如果找到; s3 Q' c7 \( h" V/ b/ q
      H3 z5 `& j6 u9 V. b. x
         将对象转换为类指定的类型
    8 H+ G% C4 a0 t0 w, S9 e7 E; S  S/ D2 |8 P8 W
    $ U% P% ]% i' t  @8 r

    & V" t. R2 y, p6 u& ?6 G% [% m描述forward动作的功能
    ( i5 m5 I* z9 D+ D* ~$ a* i6 e使用脚本代码处理请求时,可用jsp:forward 动作产生一个不同的视图,
    9 ^( O0 o" j% c0 v0 N/ C
    ) q( j5 w2 ~; K: [, ?! M/ `使用同一个request:2 }! C' ]6 J( y  u
    ; g, `5 b, b2 k5 G0 S6 b7 j

    ( d+ ], {* o4 ], |$ _0 o" j1 D2 t9 ]; V; Y. p2 n
    什么是Model 2结构,以及结构中各部分的功能
    " @4 Z3 o2 m# W( k3 O: v  U2 kjsp+model+servlet
    / |4 e5 O- L/ H$ Z- x) N- M9 n7 }8 W
    Model 2架构使用MVC模式,JSP页面充当视图,Servlet充当控制器6 z) C, u4 U; u: D, P$ p3 R8 c
    3 A/ q! Q" U7 X' l9 D+ ?6 ], H
    Servlet控制器:# T7 w  {" d6 h- d0 N0 y

    # G# I  `  x: ]3 I. c3 U验证HTML form数据6 d" f3 B* W% U7 }7 @

    ) i- e. S* A, K调用模型中的业务服务& @) ~5 g# s: w8 \# N' n
    6 S! R9 ~6 I+ l- I3 D
    存储请求(或会话)范围内的域对象7 C0 x- ~5 R. S* \& @$ k

    ! ]- L6 D1 F1 ~1 d5 `" }. z选择下一个用户的视图
    $ M  }6 U2 Q% c' Z
    / ^5 D  i. _6 a2 c+ d  a6 S" h+ zJSP页面视图:- v5 o$ v' s7 e- q6 ?! ]. l6 ^
    " Q2 O5 i$ q6 w+ m6 A0 ^. ], p
    使用用户界面(在HTML中)5 I- r2 P  O, n9 C) w3 k

    * {; |' g0 i+ l% h) \- J        访问域对象
    4 D  Y' _# W1 `' z! J% N; M4 q& l6 j! [! r4 q1 b9 F( C# \* f

    + O! `  ]3 V7 {+ Z3 `! Y
    3 g7 x: p/ `$ g" K9 u, h* y% }如何获得分发器?分发器的功能?( d+ I" q& S: T
    上下文对象中的分发器:
    / y' f# @0 O: D  x8 p' @  c+ J9 m+ I0 L
    ServletContext context = this.getServletContext();
    3 A& T: M! }; O+ q8 S/ X4 X( c$ `. t: [- o
    RequestDispatcher servlet = context.getNamedDispatcher(“MyServlet”);/ m2 O* o8 I9 f% E& i

    $ o/ @% T$ ^' |9 E9 F! Nservlet.forward(request, response);
    9 Y. K- |. C5 Z
    1 O4 G  A1 e% \4 z. p/ B请求对象中的分发器:
    + V- P# k8 C  \1 c( i$ ?' f% r# C* x/ m+ ^
    RequestDispatcher view = request.getRequestDispatcher(“tools/nails.jsp”);
    1 E2 y- O) y; B1 H" x2 b* t1 r: O. N$ G
    view.forward(request, response);* ]! l$ U7 x* r0 Z
    ( B1 h1 d5 P3 H  t4 k
    可以将请求转发到另一个jsp页面,并保持请求的传递性6 _5 F3 Q4 C+ G  h( ~' d" p  r- S" {
    - }: Z5 {0 D% x+ s

    * U9 U% V9 |; x0 a/ f0 C: t, C; Z; p9 t5 S1 X: M& p. J
    Jsp中页面跳转的两种方式?
    2 N/ P! n$ C$ E+ Z) s. Q8 Y使用分发器跳转页面
    ) G& F+ @; t) I1 S6 g% o: KRequestDispatcher dispatcher = request.getRequestDispatcher(“url”);
      f% v# z& U9 x* L
    + W6 I, k' z' R$ H! G( kdispatcher.forword(request);2 a1 w7 ^% r9 R6 |& |7 ~

    4 d0 T1 |1 A2 `1 l6 j- g* m    特点:保持请求的传递(上一次请求中的数据,在下一个请求中仍然可以得到);) f: z8 I8 |" U1 z3 h" V4 M

    2 [4 j" R* z0 g" I% v- \3 B# w        转发的页面只能是同一个Web应用程序的其他Web组件
    0 {+ V$ S/ T+ w! W1 h6 B7 E
      |# t3 O! d) _. V5 {使用重定向跳转页面9 H% B2 ~+ r8 C" C) p3 s
    response.sendRedirect(“url”);
    2 f% Q7 e3 S6 l3 h: d9 ~  `6 \1 F: r0 T; S% t' {  a/ r& {
        特点:产生全新的请求,(上一次请求中的数据,在下一个请求中不能得到);9 W  |; ~1 v4 @
    , N! F) s6 o& k
            重新定向的页面可以是任意的URL
      ?6 T8 t6 t6 E( C$ }) r, `9 A8 M! K% p! c8 c
    % F. @  P) a( B2 f1 a
    . G6 o7 z4 W1 P# o- I  {2 j
    描述Jsp中引入另外页面的两种方法,并比较两种方法的特点?
    - u; R: m" S8 L' I% W7 }2 \<%@ include file=””%> 在编译期间把另一个页面完全嵌入这个页面,可以说是一个页面8 F7 B% Q$ O# e) O% F& p# c

    + P8 ?5 C. I5 }: L- S8 F& m! p$ e( ?& }在这里可以共享变量
    " w3 o8 t: `5 n! ?- s, Z  E; V# X$ N* I9 P3 L* ^
    <jsp:include page=””> 动态的再运行期间把另一个页面加入这个页面,可以说是两个+ V) ]4 X6 j# p4 |5 d: R9 ?

    6 z0 R" Z; B6 {2 ?9 C" K9 g3 [+ W& @页面,不可以共享变量
    ' q$ H5 {! {; W1 ^4 v6 ~! Y) w0 C. l, @
    + M+ z' h$ H" @8 t/ ]( |, X

    8 {: U9 a! ~0 h什么是自定义标记& m6 t5 N6 W; z% o0 z
    自定义标记库是一个Web组件,# y) L# |& L- M% e9 _

      b# E8 d' R/ f7 c3 u8 f  K, ^包括:, W  G2 h6 S* }1 h- y8 B: u7 X

    ' i+ F5 I1 }# U, q& S# W  W; O一个标记库描述符文件(*.tld)1 C1 A6 C" x% H8 J! M  o; [
    ) u2 x  }4 V4 Z* n8 b' _
    所有相关的标记处理器类(*.jar)
      L& j5 ~( ]0 d# y$ A2 Z0 I
      e. r; E9 O) }" ^& D
    4 f, _  H4 L7 C( l+ S! C
    # U1 p  P: Q& I) d' z描述使用自定义标记的步骤,以及每步详细的工作
    / M9 q0 q" I8 P使用自定义标记前,要拿到.tld和.jar两类文件
    % e  I' E: {1 x& N6 }" _0 n8 B9 B
    ) X* i8 h* c2 y. {6 k/ G& C把.jar文件放到WEB-INF的lib里面。3 T6 G# J. I" L
    把.tld文件放到WEB-INF根目录下。
    % |1 Q9 j7 r: N6 W7 U在web.xml中配置。/ c7 [; Z7 b1 i# c
    <taglib>
    $ H; c" I3 w! `5 v+ A4 c3 \: Y7 k6 i6 T' Y* Y4 J
    <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>8 `7 {. W) n3 I6 w$ A8 {8 b
    % V- U9 |8 i5 Z- I+ u6 T
         <taglib-location>/WEB-INF/c.tld</taglib-location>2 R0 _* G: |6 ~
    # E; ~* ?( _$ ?# ~4 ^( t( [- I2 n1 ]
    </taglib>
    * l$ g" R1 ^& P# }/ J9 X7 ^4 \4 J8 r/ N9 f
    在页面中引用。. I- W3 X9 a) i( E9 @# u# v
    <%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“s”%>$ O( P. N. c7 c3 d) ?: Y

    . T2 P7 L* l& I7 g4 J; suri必须与web.xml中的uri对应
    2 t6 O: c' ^  k5 u
    ' J0 g: q$ E, z: N; z" l0 q4 s0 ~prefix是前缀,用来区分是哪一个taglib
    0 K8 g6 Q3 H3 c8 p# X
    + Z. l- _/ e7 s8 @+ @# O使用标记
    - n* }8 M, m0 s$ k) G  X格式:<prefix:tag名称 属性>
    * t- \7 }% _( O; N0 B
    2 M3 O* y+ I+ 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下配置数据源) L" a* n  K/ r1 [" D
    1、服务器与数据库的连接
    - P- d9 g, E% E1 {: d0 |( Y
    ; C% \% o" h1 R) B9 }6 a配置server.xml文件
    + _: \8 }' `7 I2 j5 g: \! `  R9 \7 ], t' Q( [7 D
    1.oracle
    . ~9 P# _, O3 P8 _
    1 g  A# I* ^4 w<Resource name=”jdbc/company” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
    6 Q% J- s) i1 X
    % c/ k! Y1 Q2 _! N8 E* @6 r1 V4 t* B5 F                        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”! G6 e, ^5 K3 i, r: m# I
    6 y2 u/ `) j& w
    url=”jdbcracle:thin127.0.0.1:1521rcl”
    ( F' D8 E" r. g+ h: w3 f' x* x2 _. t; M2 P/ T$ `- ^& a- V3 E9 L! h
    driverClassName=”oracle.jdbc.driver.OracleDriver”
    ) r. {3 K6 Q. y1 [& y& s9 ]3 ]# g, s3 F( H& z+ r
    username=”aa”" q: T! \9 y0 v6 j! P

    ) X% g8 B6 E& {( g$ M0 |3 i+ [4 ~password=”aa”$ {% k3 ^$ P& d1 Y

    . X( C( [6 U+ V) g& R  m/ ^6 pmaxActive=”50″6 p1 L! t) s' J( \1 }: u

    , D$ Q( x# B8 }maxIdle=”10″
    - ?. Z' U/ F3 {: L, d7 M% b( r  Q2 e7 \  L4 I, n9 k
    maxWait=”-1″4 S% t7 J- P- N
    * m- u4 P5 o; V
    />, ~8 x  u$ \2 P! z

    2 o% ?5 ^+ Q( e! a; O2.sqlserver, C: M' E6 o2 s* @2 K' ]4 V. r

    2 p; d$ w! J; @  Y0 [8 I4 d<Resource name=”jdbc/webpage” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”* N) ]* O: J' u# z  W

    - Z8 k& e$ Q6 y0 y        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”, |1 G& p* t3 u

    ! k& d" o( J$ O6 b( A. Hurl=”jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;. A+ l8 }" T4 d' g, L+ O5 @
    6 S0 L$ u& a+ P
    DatabaseName=webpagetest”% r. h" w, j+ \: [) e

    , R& E( `# A% [9 Y+ EdriverClassName=”net.sourceforge.jtds.jdbc.Driver”
    ( Y2 L# V  \$ Q9 e
    9 X" d$ _; t7 h/ a6 Q- ausername=”aa”
    7 ~- \3 O) f; C3 |9 ^/ U5 j7 N. @& d# I6 T4 Q# g9 l
    password=”aa”9 ]; p' v: j/ X# h7 a
    1 ^/ j8 O; k% U5 o( k
    maxActive=”50″* T* _- {3 Z7 l& r" l2 Y! w0 f

    # D; v  Z# P8 b1 A. F& n. amaxIdle=”10″
    9 I% ~1 Y# z+ g! L
    9 b5 _( o* B1 G( h4 JmaxWait=”-1″
    $ P1 ]8 Z6 y; p0 S0 [+ S; O/ N5 v1 l1 }
    />% a2 ^" K5 \1 U/ `0 b2 m

    6 F/ Z8 w# B7 _, H7 H0 t2、配置自己的web应用的xml文件8 i; i: u! G  y9 ?8 I
    , }. u# ]0 I* x7 F

    6 k  a# k7 k1 h! x) f6 s$ N: U4 o/ d6 e$ K* h
    <Context path=”/eb03web” docBase=”F:/workweb/eb03web”# {7 o" Y5 Z" b) s$ J

    7 i0 u/ M5 U% G/ S: o7 Uprivileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>
    # g! d5 F- u5 u9 L
    ! R$ e( g% @) e% H' Y6 \. `<ResourceLink global=”jdbc/company” name=”jdbc/company” type=”javax.sql.DataSource”/>  v. ], c2 Y! k% e. K) m( b

    . C4 n5 w* l; X& @! v</Context>3 w" Y, C$ H+ M  s/ {

    % L$ V! @" B5 N1 v7 k+ W: f & c9 ]- [2 J* T+ J9 u3 D6 C2 O7 {
    ' u/ G7 P  o- C5 W
    3、配置web.xml文件
    7 _7 O7 O+ f6 ~$ {+ `" b
    3 c$ E) w7 R, H& H( ^! ^) _与服务器建立连接( m) [8 S9 P( l7 n& \
    ) ]0 M7 g, C6 {. W- ^  S
    <resource-ref>/ q7 _. T2 N* u: e6 \
    & n  J! f: e4 ?& E7 r
    <res-ref-name>jdbc/company</res-ref-name>
    ' W1 q1 S6 c0 R- i3 c! o( R! y" E' K5 x$ b$ W* H. {
    <res-type>javax.sql.DataSource</res-type>
    # s$ b* l! \# y/ P- t6 N8 f# E3 h4 B  b$ q1 U
    <res-auth>Container</res-auth>* ^1 A; {& v" i0 G$ l
    ) b$ d# r$ @1 D# X) Y
    </resource-ref>
    , V6 n' y/ o2 G: s$ `. v2 B$ U# V! X
    ( {0 Q8 K' R, k4、在应用程序中不直接与数据库连接,通过DataSource连接池建立连接
    . g- j0 t' d. w" J1 y3 y9 H1 `; E. j. \1 E1 A# P9 N- H
    //1.在程序单独用时设置系统的属性,在tomcat下可以不用配置,
    / m4 t- x% R6 T. P2 C
    ) L* l8 Q0 e& z8 r! t! N" dSystem.setProperty(Context.PROVIDER_URL,””);
    0 y0 N3 ~. }. x/ u2 h# K' _7 b- L$ s6 S1 B
    System.setProperty(Context.INITIAL_CONTEXT_FACTORY,””);- M! D) o' m* {+ _! D/ S

    ( g  g% [. }! Z$ z//2.创建一个上下文对象# b1 d" t( f" B% S6 Z$ v
    ( r, N5 B" K  L1 [4 J( L# Q5 f
    InitialContext context = new InitialContext();
    " p  @. ~% |; X: ~7 T; r, ^3 _
    ; U- T1 r, m0 G; r# j  a! u; L//3.通过上下文对象在连接池中查找DataSource
    + h0 T- X, p  p3 O' H3 C$ l9 w6 R) ?0 \5 j, @$ Q5 U2 |
    DataSource ds = (DataSource)context.lookUp(“java:comp/env/jdbc/company”);
    8 U' n1 E2 C8 o& _+ y. P% _% d5 y& Z
    3 y- G  s5 M1 Z  ^6 I. P! e# c) b//4.通过数据源建立连接$ v2 Q1 F  N- d2 ~7 D* ~- r
    1 k5 ?9 p. \1 n0 F+ m
    ds.getConnection();
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    15#
    发表于 2014-12-03 12:46:30 |只看该作者
    ORM对象关系型数据库映射
    ' G  p) f# a9 L3 ~1 \(Object Relation Mapping)
      q* w* c1 x! q0 o
    6 x6 k. @& A2 N( [, e一、映射的特点; g3 y" K* c; U- E6 t( b& k

    & d5 [- b# Z9 D" z2 x1.一个对象可以对应多个表
    . T  [$ f/ T4 L9 _* s
    . n3 W4 P! _# f" [& M2.一个表可以对应多个对象
    ' G& i' N' l4 U# x+ c' x/ D6 z6 K$ y/ o
    3.对象和表的关系不用完全对应
    + ^2 X, L$ g) _: {% Z
    ! ^. n' H7 L, F# q) g0 t: m# U4.对象的属性的名称和表字段的名称可以不同* [2 i# b  H. M9 R7 t3 O
    ) z( d+ d9 i5 h% |* v
    5.类型可以不同,但数据类型之间可以转换
    0 y3 [& H" L' Q8 @, L; E4 z+ S" n: x
    6.对象中必须有主键,数据库的表对主键无所谓
    % l' j* T3 _3 @  q" w' a' [! T  x- [% ?6 {
    7.数据库中有主外键关系时,对象中可以有,也可以没有
    ' O9 [- g* l5 e& j& e* c4 ~3 w
    ) |, {2 o0 I4 w6 ]6 B' j 3 U# v5 c& [  _' e5 Y, g
    : n0 ^' U, M- `, h
    二 、有一个映射的描述文件————>xml
    & D% ?* O! m- [) r; [% T( s+ M, e" O1 n" {% ~; P
    三 、怎样实现描述文件————>一段程序9 ~2 w" g2 Z- I# L1 D; ~

    # F& H% d6 Y# y, [3 [3 {( [, |# G对象 映射(mapping) 数据库9 f' R, ~* b" n3 x9 l7 U. F5 W0 V  o
    % K+ l3 t. t- D4 d' f1 x* R. f% E
    user. i% t/ o4 ~7 s( c; v) V0 H0 M5 ?

    # [3 D2 w+ j" G9 n. H# rid=11
    0 U; g7 u0 B3 @9 i5 `9 \: A4 Q7 K! n, F" @/ }. g: A& \
    name=”张三”———— > (1) —————> tbl_user(id,name,age,tel,address)
    8 l  f! R. l  Q. c  N7 g- h1 c3 K, h3 h* O
    age=25 <————(2) <————; G( v- w( {( c3 O" \

    % W0 f+ k: B% ?1 G/ ~ ) S2 S& t- @- K: q" A5 q
    - `% A: N. ?4 }! B6 E
    (1)从对象映射到数据库
    / w  R: i  h0 @, j: R# M, H7 F. i% W: Q
    1.JDBC
    - W, B% l. ?( P( s9 v; n
    9 ^2 A& v. F! O4 J. C1 S2.根据描述文件来动态拼接sql
    / h% @: U9 |7 B. S1 X  Y9 n8 N+ h1 o, H6 t& F% g
    3.执行,添加到数据库中( }, M; e8 _5 n; @; ?7 ~' }# I
    ) G' C2 L1 T0 K* G3 ^+ x; x) @! M

    2 |. a9 ~* C2 C% V
    3 K  ^9 @: r% D(2)从数据库中映射到对象; X; r% S6 z2 n0 J/ Z

    6 A" a+ S4 z! a1.JDBC, v0 h' ?2 W8 r9 W- n) G9 y8 e

    8 y' I" K5 N* O% V9 `2.拼接查询sql% V" Y6 l( n  ~! l# W: R$ x

      ~, p: j# K6 d- a* ]3.ResultSet
    ; w! ~6 U. c  T9 z: O6 S! p
    4 G6 h# m5 B+ m4.Model 6 h# s) L) ]9 M& @3 _  c/ b0 W* p
      Y" L. G' m1 J+ R. O
    . H0 H* Y& Z) i# k* M9 t! y
    ! h4 c3 I9 n; `1 I& @0 i$ A; J* Z/ @% a
    hibernate6 o/ O" X3 H  N4 E
    开发流程:
    $ w% j  [$ c; B$ x2 |' x. S0 z% Z6 k0 ?
    9 |( u1 G8 ?* c是什么?
    - e7 a1 ?0 X% q- t0 k+ rhibernate是一种基于orm 的轻量级的框架
    2 r' f% u1 w2 Q2 R) t
    ! R. n' e; k- C0 }" O ( ~' Y; h1 ~2 f; d5 A2 c

    * T- M7 c2 r9 b, Q* U) x6 N有什么?
    6 M* J% \! W* W" ^1. session 保持连接状态(依赖事务和连接池)* e! |  t" i8 {8 J) u3 C1 O0 @1 B
    $ {2 ^2 g7 Q- a% i9 y% n6 B, I- {
    2. Transaction事务6 \  z2 f& K- Q. Y, G

    * J% K* O% l* N5 N3.+ F% g" h, A% }+ O: A9 U
    Connection Provider 连接池& V2 S2 H, r* k7 m! ~4 P& M6 }8 `

    & [7 r. ]& ^3 S9 ~. q4 U" O5 i
    4 r0 x- v  c3 |% v. Z( T
    2 t, G8 z0 i) v能干什么?
    , E4 j+ `" z8 s( h5 S( T1.orm
    # `# x; y5 E( \, q
    : o" X# M) M9 B3 u2.提供操作数据库的接口,简化数据持久化的编程任务
    8 W1 j# o0 O" Q; S8 q! {: @) {, b4 H6 R) A4 c! i; J
    9 o3 s6 P! c5 [* m2 Q$ t) Y

    / M. e7 `: _2 z1 J怎么做?& }* x! x% ?1 r0 x+ J; T
    1.搭建hibernate的运行环境,将hibernate的包和hibernate所需要的包拷贝到lib 文件夹下4 o- ?) l1 P! T) Y) r
    ( v* }; W; H4 K6 V
    2.O(vo)  Y, H; K) `# a1 L8 k4 c1 N

    4 x4 Q6 ~. _9 B+ q+ Y3.R (关系型数据库中的表)6 }5 w1 p/ a4 s3 z

    . @" `& s! m6 T; j9 U% C# u4.配置文件
    5 X. k7 H; M; Z
    . C; U0 h( Y+ J  @4.1 cfg.xml 放在classes根目录下,默认名字为hibernate.cfg.xml
    9 }" _$ M; p- v/ v1 X+ F$ }: |: j- ^% ?; l+ w: |  p
    a.与数据库的连接1 ?( s( M  a& M" {
    4 V+ o; M) S- J2 A' L
    b.可选配置
    & [0 S$ C# \9 _# a! u2 L! k8 T( }. ^4 h4 v/ \  g8 Q) T
    c.映射资源的注册/ _7 }; ^) i# b0 |  Q% ~" S

    / y; {8 _& `, q2 u# D/ ~4.2 hbm.xml文件 名字与类名相同 并且与类放在一起6 x" @& Y0 N! {3 N0 t+ W
    1 x" W8 r( L" X5 d8 d4 H+ h5 e
    a. 对象与数据库表之间的映射0 H8 R( p8 j" M

    2 k) Z8 [' ~; j6 {6 xb. 对象的属性与数据库表的字段之间的映射
    8 L8 D2 D9 s* v
    - S( ~# c3 |/ V1 v. g% K+ ic.组件之间的映射
    9 j0 R% @$ X8 _- Y& k4 V
    4 I$ s, t- j; f& a8 z0 Yd.对象与对象之间的关系映射! h2 w* ^& Y, P/ e& n* Y' G. W

    # ?  s1 b( c( @2 F4 b5、客户端
    3 |  u) [. O5 B7 f
    # {* h, ?$ Y4 N- v' M0 v1.得到SessionFactory
    # z; z0 N9 ^, Y2 p
    7 c3 `* F  u) G% q0 n# r; u2.通过SessionFactory 工厂来创建Session实例
    6 `+ C$ N& M  b8 ~, w$ l7 c5 }
    ( o1 Z' h0 _3 c- ]3.打开事务. t! e5 g3 v9 {; I# u
    ' t( o) i# U: ~% U& W% S
    4.操作数据库' l% x4 ?; }: d4 h4 H7 F" r8 }
    * q* C3 N+ N( a# {9 M
    5.事务提交
    ; t+ C  }0 ]' a9 t( ]9 d
    + \% m) ~: o3 ^  Y+ s6.关闭连接
    - M1 ~( N: ?- U0 ?% b* a5 s; \8 {/ A! [. e- l' P
    运行流程:2 Q, n- F) y( b8 N8 v9 }

    % @# r6 Z* D/ ]" }9 g  L整体流程
    ( I3 B: J  L3 V% w& i3 d6 J1.通过configuration来读cfg.xml文件) X0 p* y# w5 m! y- Q: }* p

    . t5 [2 R) J/ H! s4 g& s) U2.得到SessionFactory 工厂(根据数据库的连接来创建sessionfactory)& `5 j4 b, Z* K/ ]: J1 }5 E

    3 `9 D5 F- Z6 q) @* Q3.通过SessionFactory 工厂来创建Session实例
    : ]& |( ]  J% \7 ?+ N0 W  Q  H) u6 j9 w( F- n5 k
    4.打开事务
    ; |7 A$ A' U# J* j1 ~# D, s8 {: c% {* f: I9 \# w
    5.通过session的api操作数据库
    " v8 ?% w: ^! z" ^4 w' C6 x8 I2 d4 \- s6 H
    6.事务提交
    3 f5 b" @, w) ^/ E* z5 S/ S5 S2 ~, C! _% L9 z* S( [
    7.关闭连接* d( g2 m* ^- H  s! ?0 v2 [
    ( t( ~2 w0 E* `, H) x

      P/ j2 N8 q) y0 n& v0 p
    ( [) b" ~' b6 f! X, Ssave
    * o  s1 X: w% a3 |( m1.to—>po7 O1 k1 J5 T7 g5 g( h, D" d. F, S

    - e8 b8 X) U/ P8 z  J5 ^2.根据model和cfg.xml中映射文件的注册来找到hbm.xml文件
    ( r0 u& }! m4 E& W( _$ W& [* g- w6 ~4 E0 ]
    3.根据hbm.xml文件和model来动态的拼sql
    3 x. X; Q7 W' `+ w1 s1 ?
    + `8 ~  L, k3 d( p' I2 f% g& z4.客户端提交或者刷新内存
    : ~; x  _9 ?  ?% e5 [$ \" p  d- E, N& W7 \- \, N
    5.执行sql,值放到数据库3 J$ t) G2 A  y/ K& @7 N$ c7 i( R1 w
    8 I5 d% s$ h6 L" p( c1 r, J
      q/ C- i3 N  P( T) ?

    - X' L2 ?# l4 A0 k% mupdate、delete' ~- x; P+ _( k7 T5 o- {+ X. L& O
    1.根据model 的id在内存hibernate的缓存中查找该对象
    ( [  i. q# C( j1 `- x) c0 R7 t; M) G7 M
    如果内存中没有就到数据库中查找来保证对象的存在/ }2 H" W! L: x+ l% t

    3 W% n! w7 f5 q5 ^2 X' M2.根据model和cfg.xml文件中映射文件的注册来找到hbm.xml文件
    ' _9 }7 `3 F% p3 u. ^3 B) U$ o, R7 O/ z& r, P
    3.根据model和hbm.xml 文件来动态拼sql
    3 g  h' f+ R; q. Z
    $ V* {0 {5 D2 o3 f! m+ z8 y% p4.客户端提交或者刷新内存4 N  J% q; ?: h

    $ N- D# B+ q3 q& `- r( Q& o5.执行sql6 e! Z) W& G9 }" O" J* E0 f) }
    % G1 e. _) d8 O2 c* J9 W8 o9 Q

    4 i" O7 J: b) w0 k1 s
    4 B- [1 t/ m# ]Query- j  |% }, t1 ^# l2 }9 @
    load
    7 Z& D6 z! T) L9 X( @  ?) V) ]( @6 ~7 j; l9 h0 \2 U' `
    1.根据model的类型来找到hbm.xml文件
    1 [; O9 p( n9 s5 r  W( T+ w/ p1 r; @$ K3 Q6 @& e
    2.判断id对应的对象在缓存中是否存在,如果存在,就直接使用,如果不存在就进行下一步。
    1 g6 C0 L9 O4 ~( _6 x: i1 h: \0 s. C/ d/ }0 Z& n
    3.用id做为查询条件来动态拼sql! E5 n" G/ L6 w3 m

    8 G6 G- [; Z3 Q4.执行sql 查询(先在内存中查找,如果没有找到(会抛出例外),就去数据库中查找)$ P+ O, W5 r0 g$ i- x' i3 C
    ' d- J- [3 X$ J
    5.返回一个model类型的对象$ A, Q4 M# _! N9 j5 b$ }) H% e8 r) K2 U

    ! v! i" J, U2 j4 \& xget
    7 y! T" F! o8 l6 l  z1 x( B' U7 H9 S; L$ ]( h( R& m
        1.根据model的类型来找到hbm.xml文件/ ?/ y  V# j4 z: A
    2 K7 L* N& r0 |" D
    2.用id做为查询条件来动态拼sql0 h- J0 B; m1 h# L

    - x& u3 j. f# [" l3.执行sql 直接在数据库中查找,如果没有查到就会返回null& @! u1 I9 Z, r: W: e5 b' v

    7 I& [# }2 n. l# C8 ?4 fquery6 M& |# Z" H6 {, L6 {6 u
    , M; X" n  Y& y4 R
    1.分析hql语句,得到model的类型; U- ]! j1 F# T9 E* F

    3 F. Y$ ]5 g% b1 G2.根据moedel和cfg.xml文件中映射文件的注册找到hbm.xml文件
    $ h) {8 ?) c7 B5 j$ e
    / V/ N7 a2 Z0 m6 K3.根据model和hbm.xml文件来动态拼sql+ Y% x/ V# M" m4 f

    0 R) P9 ^" [- j7 b( P( P4.执行sql查询数据库4 N2 \1 o: r8 E5 y' w$ r

    4 i. H" N6 A* d  j5.返回一个resultset
    2 Q  e9 T7 J7 @# s* w) V1 e6 x/ f4 ^" l* \( ]
    6.循环resultset的值,放到model中在放到集合(List)中0 L; B/ d- \6 o( f) m

    . ~/ @) Y7 x/ P9 }' n 2 i, j  }  |3 |9 m3 E  L" S) U
    0 s2 Y5 [  h0 a/ |! v
    谈谈hibernate缓存机制0 O8 `- d7 _. t1 ]7 H+ B) `+ O) E

    2 O7 t( }( P0 H9 u0 h缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了。打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去数据库中取,也省了很多事。5 o; \" X" i) [; L. U3 Q

    1 Z- l# G4 `: l2 a- C- W" d 8 M& s  v' ]5 E  A

    ) |1 w. ?( z! m0 q; H# Ehibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。* P9 I+ R+ z5 c. R! K/ k
    + S: n; E+ d  C

    / O9 _/ T7 w& U, |
    1 H( {9 }; R2 O/ Z5 _) n对一级缓存中的session事务进行数据的预存取,数据在各个session的上下文中存在(单例),当session关闭时,就是session.close( ),整个所有session范围内的数据全部清空;二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二级缓存只有一个区域 ,画个图比较容易理解。6 w: }4 X3 O4 {
    2 G, @- g: I: q) }" H6 ]0 e

    1 y+ L# C: y4 i8 r! Z9 O
    $ p$ ^# R5 c3 ?1 B3 j4 V6 g1 L' D| 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|
    # e6 i; I2 y, ~: }4 O: `! v& U! ?- y- X: z8 I6 F: z% C
    | | | |8 c# N1 b+ p* Q' Q$ E* U8 I
    + y+ z; f9 R6 w" }/ {0 W+ G
    | | | |! ?) L  ~3 m* s2 b

    : N: S) K& |3 b1 C2 }' R—————————————————————————————————
    ( G4 \' g5 \! H" z5 P: J: l3 n; Q, \+ q
    sessionFactroy级别的二级缓存3 y2 h( M0 T9 w* E% t8 r8 L
    & Q  s+ a- i- W  \* _" q
    ——————————————————————————————————————-
    4 Z7 [1 T0 o6 ~1 i, |- r. }$ Q  k. t8 B
    |
    9 K) {" k$ f+ q  @7 d3 D* `- Z- f% C" {
    |0 Q, u2 x  j, U! l* }& ^( g

    & L$ X4 d2 e9 V  i|% U+ X& |+ M* r! t, ?! @7 T& P" S

      l, @. o* B+ N3 f0 G* t' Z——————————————————————————————————————
    " I9 l* H  u; [2 d1 x# `
    * o, U# Y2 B1 X5 L( c* t: d' l1 \DB
    / p, [0 U  G) B, o. \
    , @+ P" j. [7 x( k1 ~' a8 p0 A1 s—————————————————————————————————————–
    ; t/ G" ^, `' F6 C1 e% b" B5 x3 S3 ]$ B1 c- y5 N5 ~3 @
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    16#
    发表于 2014-12-03 12:48:12 |只看该作者
    Spring
    , y2 H4 D# v) b. V6 s
    • 是什么?5 \- v8 n# ]. V4 x3 C5 a% i
      4 h$ K0 {2 S' b6 P3 V2 t2 k. N

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


    4 o: q$ B, o# w, p5 |% @
    • 有什么?
      2 C6 e' N5 g( y7 t. H3 z# x

      5 n: ]% p) u: G/ o( n9 v: G
      b3 i$ S( ?# v$ @) F

    每个包的功能:

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

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

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

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

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

    AOP :面向切面编成

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

    ' x5 a1 S7 ?1 X3 u3 f, W
    • 能干什么?
      1 t! I0 I) a5 u! a
      , D2 {3 w: x; l9 A7 F- Y* v4 Z

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


    , N+ J3 h6 @/ _0 U8 Z6 X
    • 怎么用?7 c# C, v$ K+ O. Z( Q" v" P" k- d  U

      8 U! @6 Y" H3 [; Z& _
      • 搭建web工程,引入spring的jar包
        . f5 f& D' \* e" k
      • 在web.xml中添加如下配置
        ; I6 O4 P% a" l% V! w: e6 G# H1 h2 }

        0 N4 M# s2 k. C7 V
        x; r: ], ^( Y" d% ^

      % q4 o' {% L* i% Q/ Y

                contextConfigLocation0 d; V# Y+ z, Z5 h

                classpath*:applicationContext*.xml
    , k# m, C6 i  J1 [( n6 Y! U

        ) x* D2 v. Q  Q0 f: Z- L

            
    6 _; D2 e4 r# l) _7 I1 B  [& K

                struts2
    1 s( Z7 y) l6 c) J8 `' g3 P

                6 o5 I+ W0 y$ C, J& \6 D( ]

                    org.apache.struts2.dispatcher.FilterDispatcher
    6 c5 ?3 i+ p' a% c0 Y

                : M8 Z: ?, n8 ^/ q9 S: F

            
      F* \* X6 S8 V  }  B" U

            
    4 y3 u0 A& H1 ^; k2 y6 _

                struts2" w0 ]& k/ C+ D; Z3 ?, j8 F

                /*4 J# }' `: `2 i8 t


    5 n9 ]7 k, q, F' v$ G1 o5 R

    2 c$ C0 y/ A& A+ K1 g

                " v& Z4 v1 v. p' T+ j

                    org.springframework.web.context.ContextLoaderListener
    4 L* j1 r9 p1 W& d. q

                8 L* X# F" T/ d( n" z. F

            

    • 部署
      0 B+ y% u( T6 L; \/ ^9 u
      - s4 U* |# y0 p6 o; [: E

    0 j" ^' P. o4 o
    $ G; d, j9 f: R# k* F& A% u% `
    7 D8 M1 z! J' l! Y# a$ Y
    • 容器和bean
        L: E# b+ g7 ]5 x- L

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

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

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

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


    1 i1 K2 F" ^, r7 M( y, t9 r/ \. H* R
    • IOC控制反转
      8 _8 r+ M9 L9 r+ {" N8 o- l$ g3 y# M6 j* o9 |  O# k$ K$ B

      2 c$ e7 m) N+ u! ~9 j7 V1 C
      # d1 ~; q5 t4 \
      从前的应用程序想要得到A的实例他会直接主动的去拿,当用了sping后,应用程序由主动的去取变成被动的等待,由spring来控制应用程序所需要的对象

      3 d3 s" v( {2 W
      • IOC的优点- T; h8 s* x3 q2 _% a3 ^! ?
      1.可以通过IOC来获得实例
      2.可以通过DI来获取注入的资源
      • 配置IOC的原则
        + [, ]% a$ r5 F; _# h. _1 }9 x' Y  u9 F
        • 一定是可变的资源才采用依赖注入
        • 一定是层间的接口或者是模块之间的相互调用才采用依赖注入
          8 H  J$ Z) ^( K" G- S, R. |9 x) M
    , m; \# m% g, d1 K( w  @
    • DI依赖注入2 e+ X! y/ b/ v& c

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

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

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

    例如:

    在配置文件中


    / d/ b" @& w3 R6 ^% g9 H
    0 M& Q& l- q0 v3 L& m+ g" E. ~: ]
    3 |, O1 q0 j* I: [

    在应用程序中

    Public DBDAO dao ;

    Public void setDao(DBDAO dao){

    This.dao = dao;

    }

    3.构造器注入


    ; N( s2 Q7 s) _1 C

    4.ref 表示参照其它的bean

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

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

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

    6.lookup注入

    7.singleton

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

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

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

    8.DI的优点:

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

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

    ( |, ~( Y: {7 j6 ~
    • Aop面向切面编程7 g- t7 _, U$ W" v/ w9 p
      * E1 Q# F1 U' w% Z1 M1 `# j

    1.AOP面向切面编程 一些较好的模式或者是示例—-范式; d. A% k! s+ s5 }: p/ _) a

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

    2.AOP的思想: 主动—->被动(追加功能)
    % c* X; d5 H; E7 n6 L

    3.AOP 的概念
    ( g$ {' T3 ]6 N8 ?# z

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

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

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

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

    5.引入 :扩展的功能

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

    7.aop代理 :实现机制

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

    4.AOP的事件机制
    ) R+ ^. P+ `, ~/ l

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

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

    3.找到切入点

    4.确定连接点

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

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


    $ P3 i+ v& y- `, d
    " s0 E& p% S$ s5 A  M
    ( P, x" e# V2 y9 V$ b: |0 `
    + f$ g* N$ G. J) E% m. x* S; i
    - ]2 A$ _# _5 t+ y0 @" K% s- ^% V. J1 t6 |# Q) M3 v
    - z; l/ l3 Z, k4 w' f

    5. AspectJ
    + @4 B+ H/ a  @

    5.1.在xml中配置比较烦琐$ ^+ T7 Q( ], }

    所有的入口必须从一个代理(ProxyFactoryBean)开始0 j$ o0 a2 A3 \


    # j  O1 W0 q5 Q4 _5 ]5 O% n# t+ u / w6 O! j6 w8 a9 D  ^+ f1 q& @7 e

             
    % |( E7 g* H( c+ }1 C# z4 X" @
    * \9 n! u  ~5 L' V8 G; `5 J: b$ [
             
    ( K+ a) E' B  o( g3 V

            
    - V8 F9 }/ Y9 V$ L! N+ @

            

    . m8 y" X( Y! W, n2 ?) ^9 c% V
    expression=“execution(* com.javakc.aop.MyTarget.t*())”/>
    + t) O& v' _# W+ D) [2 g, b2 M; J

            
    5 n; m1 s5 n1 i3 w! G' _) y

            
    ' u) }  U! O0 Z9 A0 ]

        + Z; y) n8 \- Y9 E5 u. W

    0 t, [7 I' h& G( H0 I# u& P

    ) J  s. Q$ h# |

    5.3.使用注解的方法相对简单
    ) [8 ?3 T* m2 o! d! j* j

    @AspectJ的基本语法
    ' y$ H, |8 n' n' c, z- o

    1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面
      M& @2 ~5 d& S- k

    直接在类上定义@Aspect
    / P+ z0 B/ O* |/ f/ F4 ~$ P& C

    2.@Pointcut声明切入点
      Q, a7 [5 S  l4 A+ T

    2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字
    & D+ x% L( U4 h

    2.2、可以使用匿名的pointcut# ~# K& {( e# t, H6 S

    2.3、执行切点的几种方法
    % F0 E6 K: f# ^' n5 a( s

    2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法3 r9 R* E3 c+ y! Y- ]1 t6 K

    2.3.2 within 指定到包,不能指定到类
    . s2 r+ t- a% R5 q/ y& T

    within(”com.javakc.spring..*”)/ r3 I0 c' R8 m* P' f

    2.3.3 this 指定到实现接口的所有的实现类
    9 G5 A% {. C, D! m6 D

    2.3.4 target 指定具体的实现类
    , ^& @5 }5 X6 N+ i; A6 ]3 z  o

    5.4.advice的五种类型的示例, Q; v: w0 S5 v' ^2 R5 D6 L

        客户端必须从接口走才能得到监控,实现想要追加的功能
    5 d5 [9 u+ J0 d, ?) F9 h

    5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)
    9 l% d$ J2 A" |$ |8 G( Y. \

    追加的方法的参数名字一定要与retrning的名字相同
    / j  j; Q  ~. ?- N

    在注解@AfterReturning中必须加上pointcut和returning两个参数
    & _3 B6 {  g/ T+ m/ N9 Y; }

    pointcut指所要监控的目标对象的方法  Y9 [" T& S. F* F

    得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配0 e1 W( [4 j% u  I9 R

    完成追加的功能0 W7 ^9 j0 J: v& {* |

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    : |. S' s) N5 X: s! w' e+ O1 E  }/ x

    (1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”): b. b- z: q6 h. i. }! e

    (2).1 C# ?8 P# r/ [! }( j( p* A9 v7 T

         2.直接引用匿名的pointcut
    ' v8 `  s2 B* @

         (1).@AfterReturning(“execution(
    * D* T" J) p8 ?! \. C0 ~

    * com.javakc.spring.schemaaop.Api.test4())”)
    % C, S) [9 R5 q- a0 y

         (2).@AfterReturning(pointcut=; \' b6 B0 H6 u  i: N, m

    “com.javakc.spring.schemaaop.TestPointcut.t4() &&  l' Z. v, T' J0 d% I2 l

    args(str)”, returning=”retVal”)
    6 {- A* n: y# t. _0 U

    @AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)
    6 ^& y: _5 _/ H  T

    public void testAfterReturning(String str,Object retVal){
    ( p' v- U! z3 {; C, X' {: Q# k* ?

        System.out.println(“afterReturning1=>”+retVal+”=>”+str);
    4 E/ G& c3 \& w2 Z/ W7 A

        }
    ) K2 e% p, @6 H! P/ G' R

    5.4.2.@Aronud3 v4 T6 N4 A8 ]$ k% `. l' x

         注解@Around环绕追加功能;6 R( Q! I1 f5 T9 B% P

         在执行目标对象的方法的前、后追加功能;3 \$ D2 e7 _; t# C; {+ A5 j

         必须有参数;第一个参数的类型必须为ProceedingJoinPoint;& z4 ?% @; N- p* m' Z3 \) {

         通过ProceedingJoinPoint的实例的proceed来调用所监控的
    ' w( g8 q# h# I4 j+ V) }

    目标对象的方法9 a, g) M5 v! R# y( l: l

         1 定义一个pointcut,通过方法名来作为pointcut的名称来引用; J( [' R( r' e' T" F' k: D& h

         (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    # o. \" E0 q4 t$ x

         (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()) v! M5 V7 N! ^

    && args(str)”)
    ) |8 S! G* x4 E& T

    2.直接引用匿名的pointcut* K8 \( B( r8 V& R2 M

         (1).@Around(“execution(8 g1 c; E# D7 i. L2 W6 l. a* u

    * com.javakc.spring.schemaaop.Api.test1())”)
    ; c' Y/ t0 N; }- h4 C- q- J

         (2).@Around(“execution(
    5 n0 R7 G( x% f) u! J9 M

    * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)  ^; Y# V8 V# G* y+ o

    // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)$ [+ p( J2 a0 J+ y$ Y

         @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)+ B6 z* F- x9 W  a

    public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{
    # ?. Z, f6 e+ ?. X9 E

        System.out.println(“around1==========before1pointcut==>”+str)
    & `, j5 _) q4 ~

            Object obj = prj.proceed();9 G/ P' \1 d. m+ k; S. V3 b2 E' E

            System.out.println(“around1==========after1pointcut==>”+str);# U* n1 ~1 u% d: h) |' \( D

        }
    2 e% D9 T; x. s  v

    5.4.3.@Before
    6 q2 N, R; U  @: n1 X3 b

    注解@Before在执行目标对象的方法前追加相应的功能5 M! i- c; t! o

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    7 [' r5 p2 e( B/ q$ h8 I' }, J

    (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    7 s$ }1 {1 ]6 j

    (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    7 a7 c. p9 c2 o, o

    注意args后的名称与参数名相同
    7 x/ k3 A, k7 @5 S! |& C9 u

    2.直接引用匿名的pointcut" y! \. e& V$ ^* t

    (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
    ' _! D+ a( Z) ^4 H' K$ _* [5 l# B

    (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)4 R  M1 n* \5 C8 R+ }

    注意args后的名称与参数名相同
    # J3 p/ ]( N3 ?

    // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)* z9 T" [4 x8 t! i  z2 t# P6 z  ~

    @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)3 v6 X  ?. b; D) @; F

    public void testBeforeParam(String str){
    " e6 P' Q  V* a, H6 P2 c! E

        System.out.println(“before1=param=>”+str);
    * L& C8 o. \* P& c6 M

    }
    # U6 s- f/ `; p) L& h( t1 {; ]& V

    9 T" o1 b9 q+ g( ^! e

    5.4.4.@After; u( d8 {6 p. U2 R

    注解@After在执行目标对象的方法后追加相应的功能
    2 _) P% j2 J. K" \# L

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    9 \' l# S: d0 b. k% u1 P1 D

         (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)0 V9 `/ j$ S- q$ ]9 N: P) Q

         2.直接引用匿名的pointcut& b/ b# ?* K+ b) b4 h* ]6 C

         (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)* {+ u( s" A; {1 w

    @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    9 y, @  e+ Y: }2 g9 x- I5 U

        public void testAfter(){
    & S, k# q! p+ B/ E3 A! X5 j

        System.out.println(“after1== >pointcut”);& \1 `) H! M: _: m# {. v

        }- y- m  `; T0 v" q* |9 R

    5.4.5.@AfterThorwing
    6 B9 ^8 J9 K  b# E- o' w


    % ?1 ^* w# h% ~. j! O, L8 I3 y' U: b0 Y% H" M8 b
    • 描述一下spring中BeanFactory和ApplicationContext的差别0 J( \1 x2 P1 _( c* T: H/ ~

      * P2 b+ d9 S8 w, Z! N; O

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

    2 }5 d$ i4 [% a4 s2 o/ }, t
    • 谈谈spring对DAO的支持' F% L% n# c; g+ Z: t7 T! z; R# D
      ( U) A  W1 v, q( ]

    Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。3 G' m$ g+ J: W: q! j) p, n

    简化 DAO 组件的开发。
    + ]: @9 R: x7 P% uSpring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。
    & w: j. p% _( T$ F" V. Q

    IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。
    8 N3 |( V) U+ i

    面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。
    - g+ V; i( ?% o, H( Q8 `

    方便的事务管理: Spring的声明式事务管理力度是方法级。, H3 K9 \5 c- P# s/ `# g

    异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。
    6 C2 s. K% ^! d  e2 O: _


    / z5 y: {: n; g1 B! d3 N2 j. K) p) h% Y/ M) S
    • 谈谈spring对hibernate的支持
      0 x3 ~$ |$ e# i' `6 {, `

        d. H8 i8 [, u% I/ I  g' y1 l

    在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。2 E* i9 r" ^( H& U' F

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

    1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:
    $ t+ ~# z8 l! K8 n


    - a$ V7 g2 {$ _! Z# N6 ^

            class=“org.apache.commons.dbcp.BasicDataSource”>$ I4 w) l( B: U+ c. S

            
    " n  K( O# P9 ~

                oracle.jdbc.driver.OracleDriver
    + t; S; q3 x! q9 K/ R1 A5 m5 A

            6 Z" i7 l7 ~; J7 o

            
    - r/ ~0 U& X9 v, b/ W

                jdbcracle:thinlocalhost:1521rcl
      X5 p. N$ \- w$ P% s# \$ @' _. i

            
    : c) w( h: t0 R$ L$ k

            
    : {. ^, b: k8 A" u( ^9 R! ?& ]+ t

                javakc2$ e! z: j- o7 A+ z# B2 @' k  w$ a

            
    7 |  S; \( g" t. i' @7 {

            
    . N) }  Q6 i$ }+ |

                javakc2- L/ i2 B; {# n8 O8 t7 a

            2 m6 L# f, J4 w6 ]2 M

        2 t. v, l) Q- P0 @: d


      I2 N0 t/ H* r* F$ `

       

            class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>* N( G5 d/ ~5 l( W

            
    ( e) h; _" _; f  b/ |

            4 P4 \( F& g: N' L; t. H# M2 S

                
    * w; m3 }- \3 l) b

                    com/javakc/spring/h3/UserModel.hbm.xml
    6 k1 L. |( L7 K! `1 {' c. g

                
      }! t. w& v6 m

            
    ( s# Q$ X% g. l4 I/ Y0 g

            
    5 T& t6 X+ e) J  z

                6 n8 Z& C: q! Q7 u

                    hibernate.dialect=org.hibernate.dialect.OracleDialect
    4 ^# J7 o& r! s

                - `3 D6 H. `: `0 B7 X5 |8 k

            
    : m' D1 L$ D- t4 C1 O' \

        3 u7 s3 L' z4 G) `* G5 J+ H" E

        ! P' H8 {9 n4 L4 I9 o) i* L8 @/ |

            
    " c" V/ q; ~  K8 Z  C2 W# v

        ; |" h  v9 k: w9 L4 O

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

       

            class=“org.springframework.jndi.JndiObjectFactoryBean”>
    . U2 W4 b  x% S, M/ J

            
    : g; o! k( X$ |1 J# H! U

                java:comp/env/jdbc/myds0 A+ c" |& y# ]7 ^" R

            
    ! [9 o% a9 z: m

       

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

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

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

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

        1 ~) g% _# d2 |- r+ T) u7 g- V

            8 y9 \4 B$ H9 _/ T8 {' y

       
    0 z% n  o8 x) b# O  m/ [

    * X! P; v* R; Y

       
    9 ]; F- J7 r* x" H- q3 }

            8 x9 N+ ?; E# F  z

                
    ) k) t) Y  w) D; ]

            
    + }4 b$ I; m4 W2 Z1 t8 r0 R- E

       
    * @8 ^, M' l2 E3 D0 O: U

    ' W' b) T, ?, |; n, i6 @

        8 z# A, z5 v1 K; h# ]4 u

            ! K1 B9 f+ J' J  y' F) J

            . Y: @/ Z2 _, g' U/ k

       
    5 ?6 [$ g7 i: G& b  S9 C+ i6 w

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


      B; n  O" I. D1 Q0 s
    Spring2.0之前事务的写法
    7 i4 U& w! S" d5 w1 J$ y" y5 w: ?4 i

    5 z3 A/ o1 V0 q; N$ J% p
    : G, ^0 L! ~3 A1 A9 {- {3 W        class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”
    8 f2 [1 Q+ r; Q' q9 g  m5 f( t

    ) h7 w% r1 k0 ~6 i2 T2 ]+ Q+ S        abstract=”true”>" e8 U! ?$ n; N) U- I$ T1 P
    / p( f2 C5 A: p" M% R
    1 e! ^& X* w) U4 k7 P6 a

    $ x9 k. x' x& _. C' F: E
    ) D4 O2 N- ^' x& {9 W# F                PROPAGATION_REQUIRED,readOnly2 [4 g: {+ w5 [; U& a; C
    6 M3 w( e$ K1 T5 `2 d: O
                    PROPAGATION_REQUIRED- F$ h% o" m( s( C6 u

    0 [# q+ I  k5 a  q) U, `& f+ ?8 X/ f! ]" o
    % y2 ~' C& `% j& t" h7 c$ }
    ; K3 [0 ?  e  T% P: \

    ) h4 n- G1 Z6 o8 {; h0 T3 c# w& v) O0 a* _& l  f' E
    • 谈谈Spring对事务的支持# {, Z* a. M( i( Z" g

      + R9 d: p8 j9 Q9 l6 w


    " e# h. _2 T, Z- |1、声明式事务管理:

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

    2.做法:

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

    2.2

    2.3 注入数据源


    & C9 x. s- ~% g2 B' i( a2 y4 T, K! o: s; k

      P$ k/ n/ _0 ~$ u
    3 k0 b* Z/ x! F/ ?$ C+ Q% }3 @9 R- h9 S, u

    - t: P: M1 z; m5 ~" z4 h

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

    % _; G5 I3 l4 D" @( K

    * G" v+ j9 A; M1 H% F3 W$ J/ X( i4 a- d, A

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

    9 c3 g2 T$ L: v) P% i7 E8 ?

    6 {! x( a# n1 n$ [4 ]
    & V% q5 x! N# l3 w3 [) j$ g- Y, A" ?7 p/ E7 G+ h, v8 X) ?' i
    8 U1 {; W$ l( c9 W

    2.6 定义切入点


    # E, m7 E0 [% O4 V) R
    : m1 c2 {8 ]( J6 [8 g. p' U
    - N$ f5 ~- N' w; X* m
    * }. v% X; H5 A
    9 W: s$ u, Z$ G* F& [

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

    1.注解@Transcational

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

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

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


      A7 Z' F. `) u" w, z6 l
    3 M3 m& Y- U3 F

    如何在Spring中使用Hibernate的事务:# n7 ^6 s# J+ L


    ' q' Q$ S# q' G  r4 s


    2 a4 P( Q: _8 s  s6 J7 ^1 @4 E# E

    1 S. X  ]" b; }3 A: X

    如何在Spring中使用JTA的事务:. T' `+ U8 _4 ?0 g


    . w9 D$ S+ R* J) Z4 E
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    17#
    发表于 2014-12-03 12:48:32 |只看该作者
    事务0 S' M5 M3 X8 E) e8 g# g
    ACID
    5 H3 G. Y5 d% r% m* I  v& P(1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失败
    4 r6 h2 e& e& T
    5 l) K$ K7 ^7 Z& C' \) j(2)一致性 :操作的前后满足同样的规则,保持平衡。: _; `* U* k, Y6 D: h+ H

    . @  l2 K3 b4 f' U. E/ f- ^(3)隔离性 :在事务运行的过程中。事务内的数据对外的可见性和可操作性(必需由数据库的支持)
    " ?+ a6 W4 R& z- l& Q! V  K7 a8 f' N  n# j7 E
    (4)稳定性 :保证数据在事务的操作的过程中不会遭到破坏,而且是永久性存储的
    6 h: x; D+ L4 R7 f* S& w1 [# z- h8 ?( P. s0 q
    / ?) {' H+ r1 J" d/ {! W

    ( ]) p, j$ x) c7 c, x, K' ?1 E+ H事务模型6 y% L, P2 y3 t! j
    (1)经典事务模型又叫平面事务模型(JDBC) 事务不允许嵌套
    8 P, }  C/ J& \3 k: {# D+ V) B
    ( R6 p! ?3 X2 q3 l: ~( @- \(2)嵌套事务模型
    ; f9 o2 D" z+ b( J7 `, `- w! G9 W: s- x+ s5 V: g* C" [

    0 @0 L4 m  ^6 w  J( @5 D% T
    . C1 f# \+ D/ X7 N4 C事务的两种方式
    - V9 n# T  d0 f9 q% i(1)声明式
    ' w' m# F) L' [/ D# T- I7 E' c. O# u" K3 E6 I/ |
    在配置文件中设置以下6项- l. W# t0 `  m* S
    " c) L$ T/ b9 N$ A( D( S
    (1).required
    3 Y! l* v1 w$ O0 f, `/ {
    " L7 `% L$ T# |4 O0 J$ N! H2 i如果客户端没有事务 在bean中新起一个事务% k3 U8 B) _3 W
    % C# R/ X) ?, H
    如果客户端有事务bean 中就加进去8 B, Q  C9 N3 Y9 E1 Y- Q, N

    ' ]1 I/ z/ H6 t( d2 C(2)、 requiresNew% A) g# @7 P$ d0 q- w& S  V
    . ^" ]3 |7 ]3 q7 Z' A: l
    不管客户端有没有事务服务器段都新起一个事务
    0 `1 m3 x" q% W$ L2 S  G3 Z$ t8 q
    如果客户端有事务就将事务挂起+ g5 c5 ?1 H2 u. U0 V4 @1 W; R
    4 L) V& C, H! j) e0 Z* Z
    (3)、supports
    . r: X' ^* X" K) u
    7 L& h  T1 h; Y3 f, @" L6 M" [9 t+ n如果客户端没有事务服务端也没有事务9 R0 ]( J; A- D; K( L* \  ~/ o

    7 T1 o% f' J/ @& d/ B如果客户端有事务服务端就加一个事务
    9 n7 X; u& F! \: u! l: Q, x
    3 A4 m" s% E* i(4)、mandatcry9 a% ~% a; {% J

    2 G4 u! Q( i, @1 [如果客户端没有事务服务端就会报错
    & R) Z# m2 L( ?- K
    ( e, c" e+ h6 E2 n% a如果客户端有事务服务端就加事务
    ( u% q0 E2 q) r  ?4 q; y2 U6 P: a8 |7 ]) K/ ^" W3 A
    (5)、notSupported. \" @9 \: C$ K

    " }( m/ @% |$ \不管客户端有没有事务服务端都没有事务
    . f" |; s" m8 E& }6 e3 I/ y3 ^" y- o4 e! }' n+ _# E1 T
    如果客户端有事务服务端就挂起, Z3 v* ^0 x. u3 j, t. a% B

    ) V0 i7 R% J: W! N- ^5 c% a' z(6)、never4 E# e  c3 W) E" h, D- N0 a5 [

    / U) \8 ]( @3 ?- ?& [& p; R不管客户端有没有事务服务端都没有事务
    ) H$ k$ `3 N' K- `; u6 k# \1 d" C! a4 T6 l' N1 }, [
    如果客户端有事务就报错
      Q3 L0 o2 {# h1 V4 g  N. v: z; ?: \  l1 M
    (2)编程式事务
    ! I6 ], ]/ q3 W
    % U" H7 R& s4 ]/ m5 W: HJavax.transaction.UserTranscation/ X  E4 l  d3 i* b8 r
    4 m6 F0 R3 F; Y, \9 w
    JTA 事务可以精确到事务的开始和结束7 W" N/ x4 l0 Y5 ?* R& o
    $ h+ A) e' O% B% q

    2 [$ M& }+ n9 l4 U" x! ?- c
    6 d( K5 Q4 M1 q& }( e' J* S事务的隔离性
    ) u) Q: F) u0 cRead-uncommited
    : y8 I  C( k! ~) s
    + h8 v, s5 \- ]读取未提交的数据(基本上没有锁)脏读,存在不当读取的问题。) n- ~% m0 A1 v0 j) D1 q, @# g
    . U8 N2 C: _: j% W/ S) }
    Read-commited3 k% C* U2 P% [  o

    ' N! D- l. o0 I4 N; @# p7 P读取已提交的数据(行级锁)+ G% m/ A" Q5 y6 E( r

    2 S( ]" g. H, s# s) Y! _: q无法读取已经写入,但没有被提交的数据。0 e/ e3 P& k8 ]8 L8 x

    . i0 T& r4 J1 URepeatable_read
    # Q8 J# S7 T8 m' F
    9 S) T) g3 p  V; J! x读取的数据不允许修改或删除
    ' s. _0 U) s: F5 a0 w+ f5 \$ f
    $ }7 V$ N( M# ~2 |% N0 s: T不可重复读(行级锁+不允许修改/删除)' P( u) |5 l- U6 d& W2 q% ?8 H

    / I) }. H: O0 v/ \Serializable
    6 W: |6 o6 G: }! J! h' S# B& Y- ]: X3 U  A/ N8 y  z- C3 B+ ]
    幻影读(表级锁)5 B, [8 Z- d  w+ u+ [3 }6 ?. P% U

    & ]7 h4 r6 V# E! y# x; E! A9 s2 n" O : [1 R5 P+ _4 ?
    * n& ?4 o0 b0 b, |: T/ k& K' N9 `
    struts
    3 z5 t+ b. I% h- z开发流程, Z. r+ _* F# V# }8 R. `
    2 b. w+ l# I. _; t7 s
    1、创建表单1 T3 Z2 M, V8 h" R/ T; n" y7 L# f

    - n3 R1 c" N& \) s: y) j9 T( `2、从表单中获得输入
    , v: \* c+ @( {- ~5 K- `" N3 N
    + i5 q9 i! b+ v% z- ~3、处理输入(业务逻辑): r6 E' W- P) w
    & n- e0 t% d, Z+ s* J( \' M3 x
    4、根据动态输入改变输入流, _% w2 `7 c: t/ H- ]/ n0 r

    4 g$ Q7 j6 N! d. y7 W3 n要完成上述四步,我们需要创建
    $ j/ M4 ?; @$ ?, ^$ L: j, r1 Y% S0 Y  {7 @
    1、一个ActionForm# t2 s: m+ J* i" l' I

      P& H; }5 h. b2 D; k( L9 ]  W, k2、一个action: L' I: S) F4 o4 Z3 \& O

    9 j" }8 N' B/ E+ V3、一个配置文件struts-config.xml
      S/ w5 ^* E6 w7 t# L  W! p5 x5 i8 I3 T* X: h
    4、创建页面
    ; w' r' [1 q4 W) J+ g% }9 ]6 i( N  N$ b. C5 A2 J
    创建ActionForm
    2 d6 `  F% y( H$ S( U5 @1 ~9 h3 W3 O$ G4 f1 k2 I
    1、写一个类继承ActionForm
    ' z6 d  w5 \7 N/ d: M8 \4 O1 P& H
    ' [- D1 x1 i1 [) K- O2、私有的属性! e  k" b9 W1 g

    * G+ t. C# W* E# e& l9 o3、相应的get、set方法
    % F% E3 V7 M8 L0 d# ?1 X9 f9 P
    9 [7 m0 n& S$ u4 X: s4、重写tostring、equals、hashcode三个方法  v, h# _9 ]5 a7 W6 R8 I
    / a. i+ t' S$ n* ]" j9 _
    创建action5 b* l9 y: ]. U' ~

    ; j+ _6 Z- q+ N1、写一个类继承Action2 |5 h. o  B4 k& n
    , L$ j( u7 U8 L# @% k
    2、实现一个公有的方法(回调方法)
    ' G0 N8 U5 x4 f8 }& a' m" l% B# p6 Y/ v
    public ActionForward execute(ActionMapping mapping,
    ' t3 M0 V! L$ Z- [: W# i
    / D2 O  j! _3 EActionForm form,
    " v& H. _2 @- y) w9 s' r! g0 W
    + Y! R( E8 W) d  X8 E# X; |. ?7 T6 mHttpServletRequest request,# u, q2 _. J% a( r

    & e0 [# J5 p3 |$ n' W, P' LHttpServletResponse response)
    9 u' `/ D# u# a. d$ g2 K  |  K; g5 s" B7 b3 p! [' ]- I& L2 {- O
    {
    8 T# \4 K, k' n2 M4 m$ C1 M8 k7 \/ T
    //1.收集参数
    0 Y. ?2 }. M7 }2 E, V, }
    : s: ]; J0 L: e% R4 d+ F5 _MyActionForm myForm = (MyActionForm)form;5 s9 d* i5 M7 X5 W9 a$ w: I% @8 [

    1 ]- j* c* c! N" r- l# m//2.组织参数
    + F5 u, k9 O# w$ K+ }0 b) G1 q6 S! @7 r5 M% `! B
    ' O: x9 ~; e, D1 G

    , M( g/ G7 ~# Z/ }: c7 O//3.调用逻辑层
    8 |# t" X% p& B' ]. C
    ( F  X; V1 J( {/ a6 X5 k! Vboolean flag = true;) F6 h2 P4 H2 Y
    . r4 x3 [1 K, x& i- u7 m6 E
    //4.根据返回值来跳转到相应的页面
    6 j1 r6 F% P2 c
    : A3 Z% D, R2 P3 N# l# @* _) [ActionForward af = new ActionForward();
    + T0 x) ]5 e5 o/ o
    3 q1 U: `9 P& r, @* b0 lif(flag){8 J3 I* d; C+ K0 g$ O/ P
    9 O! L# b" x) D4 [& ?0 V# C; m
    af = mapping.findForward(“1″);; C, m- S  ?5 L8 [+ U/ k' V, L
    ; @! y( O& _9 x4 y
    }else{' m5 X# J6 X7 d9 z5 }% u

    : B1 m6 B; P& @3 T% p. qaf = mapping.findForward(“2″);3 N& J2 r/ Y6 {0 n. }& M$ m
    - R, a- x+ S' G3 ]; a& U  |% X/ F) ]
    }
    + s; E) y0 C/ w  x2 _( |* d
    & t* \5 y/ T8 ireturn af;
    1 i* `% Q, i- j" W( i8 q8 x/ L" ]* v  ^% ?( g4 ]+ D
    }
    & e1 F2 {+ O* W. F/ v2 ~5 T' r* _) ^" K
    配置struts-config.xml文件/ @% H  I8 |: t8 D* g- E6 d/ `7 l
    ! W% y- r/ A8 q) j& B( d! {* b! l
    1.<form-beans>- X2 [  G1 q8 ^' s% _
    7 }2 b8 ^: ~& @. y
    <form-bean name=”myActionForm” type=”全路径.MyActionForm”/>, ~0 R" [! j1 i& m

    * [2 ]" N! G5 A! A! [3 k<form-bean />
    3 g# W! U, I$ u" I- g4 ~1 Z" z6 d0 p
    </form-beans>
    % R" n) v& f6 c& x* h' r
    * T8 p$ m  C+ A% n6 }7 i7 K2.<action-mappings>
    ) m4 \6 L& \: b% ^/ m
    3 U: [$ I' j2 J) j<action path=”/sll”
    # }4 K# S. L3 y3 X& Y/ T9 M( ~# |) ~$ @% T
    name=”myActionForm”
    4 n) M3 n# V7 B1 i! P6 K  V  p# e4 [
    type=”全路径.MyAction”
    + f  J0 n/ t& x8 O6 F8 A/ l; C" a. E; e% ^- _7 L5 p; E
    scope=”session”
    / J7 M: A) l) X) M( V6 _+ S
    " V- Y4 M, Y5 g- Uinput=”错误返回的页面”>  a6 G4 h- l. y" H9 u( ^7 F9 U  M

    2 E* }7 B( @. }; z9 E<forward name=”1″ path=”/1.jsp”>/ t9 a! S3 s/ T* h
    # h2 Z: E, X" [6 ^+ |
    <forward name=”2″ path=”/2.jsp”>
    4 W2 v7 B" c! j: t
    4 E& u: n" y, y. ^1 |* n# c) o</action>
    6 V: T9 P+ I9 C1 F# D
    . E$ i. d3 B1 ]8 Q* j</action-mappings>
    3 `  K0 c. H( s5 V8 o
    . U8 B& H. |; H( u8 \' Q步骤:8 l5 |1 [! P2 S7 e5 W8 d

    / ?4 T' ~- O8 a1.创建一个空的web应用/ P6 B3 t1 D1 \( M( E7 T& ?
    : O3 J% a- X7 j
    2.将struts的包放到lib文件夹下
      q/ g5 G7 i& k, k) k8 n
    6 N& S5 f5 \* k4 N3.将.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目录下9 A: B: \' v+ C" S; m/ F

    ) w  \3 O# d: [# `2 `% i; o2 Y1 a8 F4.配置struts-config.xml文件和web.xml文件4 f' a" z6 I  z0 D0 G) c: O4 T7 p

    6 i" J4 {7 \# S$ n+ Q5.在页面引入tag文件uri( P0 y4 t+ _! `. i8 `; H
    & |4 a: j& Y% |; R$ U2 t+ }
    STRUTS运行机制
    3 R6 Z$ q0 y- w! ?0 A* p+ P& k6 x0 _, P
    1、界面点击产生请求3 N. Y- ]0 a/ Z8 g
    7 v. f5 K& m+ g/ g1 J5 w
    2、容器接到请求
    # X0 H7 \1 n+ i" Y/ {0 z. t" A9 P
    + y! s, C% l4 `3、匹配web.xml文件中的*.do来调用ActionServlet
    ! z' A" e$ n: n3 J" D2 o
    # B' _7 ]5 }) M4 I4、ActionServlet的处理
    2 z/ k( w; C7 S2 g) `+ q* u8 X+ M0 [- Z, _1 m. T
    4.1 读struts-congfig.xml文件形成ActionMapping) E9 C/ g4 t+ Z5 i6 {
    " {6 m0 j9 y2 s" `3 [
    4.2 通过path 来匹配Action类,通过Action的name属性来匹配ActionForm类1 x" B, n& e) H& }! z
    & [9 I& @* P/ C
    4.3 通过反射机制来给Form添数据
    4 r$ }% t9 G% B( a7 o4 z; Y
    + u. {9 l0 r( c" b/ \5 X* a4 h6 z4.4 由ActionServlet转调Action的execute方法
    , D4 [; y2 S) r( i3 ?, E0 d9 y) T# }4 N' A
    4.5 得到execute方法的返回值,跳转页面
    $ R3 @! X/ l& z/ }/ [$ d
    " W6 l# ^. |0 Q3 Y$ I* e3 D/ T4.5.1 RequestDispatcher/ A% R# R" w1 B2 X! F; P) e$ N! w
    ( i+ b$ c# b. [! e/ w* c$ u/ h
    4.5.2 response.sendRedirect(“list.jsp”);
    % P& k' ^- U. I! i7 O1 p7 q" I
    8 |$ R/ c$ N) S7 o' U
    " D0 I3 h( D6 G$ g* u- I0 p$ N$ F% t) Y  S) |5 \8 l+ `" N
    进入execute方法/ h3 W! @6 N! ?

    1 n0 K6 C+ a$ {1 T) M# Y1 收集参数
    . E, }1 e# Y. _- {
    8 Y  [* k3 D- I) z1 Y! z* U2 组织参数
    : L7 R' _4 L8 |' L- c" o6 E" \1 ^. @  A7 O- R9 i3 C
    3 调用,逻辑层  v; P9 \' T: V5 t0 P! A4 G
    * S+ O: j# z' a3 P% O3 q+ p: O  \- o
    4 返回值1 r% ~; {4 P8 Q+ W; \
    , U" \7 E1 Z* t6 G8 _
    4.1 选择下一个页面 (ActionForward)
    - d& f( ~, T; e, Y" J3 l0 z
    ! ~# R2 M& s( `1 i, G4.2 把值传给下一个页面
    + V  C3 Q7 ~$ X6 X4 T1 U/ ]
    " M! j( N. \. G) O! Q( w4 I
    , x$ b* G$ ]3 ]( |- B' C
    % B, [$ k- o9 M# k3 `比较struts和struts2的不同
    6 g4 R0 r  g' ]: X: m+ C  @$ V
    Struts! G- m: j( L! c4 Q( c# x4 ?

    8 J. K" E0 \# ~Struts2
    ! S/ m: m# V1 L3 c) Q% [
    6 O+ o) _  i$ b. @7 E: `# L9 X组成        五个部分:ActionServlet,ActionMapping,AtcionForward,ActionForm,Action        十个部分:AcionContext,FilterDispatcher,ActionMapper,ActionProxy,Configuration Manager,Action Invocation,Interceptot,Action,Result,Taglib7 s  Y  U1 T! h' i- @( {
    url        .do        .action, X3 D% E: Y/ r1 f1 j
    分发控制        AtcionServlet        FilterDispatcher2 V# G9 q$ B1 M
    收集参数        利用JavaBean技术,将数据封装到ActionForm的子类中;- F& F6 O# _; M/ ^" L7 C- ~  N
    一个Action对应一个ActionForm的子类8 e8 m+ _- m9 B6 r* e8 M" `

    , L6 [) P9 h( S" s使用拦截器将数据封装到值栈中。
    9 O) j  I4 G/ ^8 e使用域模型,一个Action对应多个值栈中的Model/ g+ I/ w# T9 s# X
    ( `+ ]9 J  x! b! f, f& |3 O, n, g
    读取配置文件        ActionMapping        Configuration Manager
    + G# ^) Y/ x/ [- F% e0 P7 X拦截器        无拦截器        执行Action前后有拦截器
    " d4 h- _# l6 c# u8 H$ C返回页面        将字符串封装到AtcionForward,进行跳转页面        Action中直接返回字符串,通过Result跳转页面
    + F6 B) V- E) D/ D3 M: A7 {页面跳转方式        两种:dispatch,redirect        三种:dispatch,redirect,chain
    4 D! f* Z* j6 N% g7 E; N/ ~值栈        无值栈,Action通过在request范围内设置属性,向jsp页面传递数据        有值栈,Action和jsp页面通过值栈传递数据,jsp页面通过OGNL取得值栈中的数据
    # O) {& M' w; N; R配置文件        struts-config.xml        struts.xml
    " ?+ ]4 c; {& K: U' l, V+ X中文问题        不能解决(需要使用filter)        可以解决中文问题:. x/ U. P3 P) u* k9 ^6 ~4 |
    1、在jsp页面添加Meta;; \8 a. r! y% h5 C8 Y
    . J& ?! y8 v; a
    2、修改struts.properties中的设置。
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    18#
    发表于 2014-12-03 12:49:03 |只看该作者
    其他开发工具和技术
    8 q( y/ ~! g$ R! a' C7 eAnt
    7 ~! k4 I) @- s" C% D& O+ sAnt是基于java的批处理工具
    4 u  {$ b% e3 a8 l3 G3 I/ |% Y; g6 R9 X, f4 m
    一、配置ant的运行环境
    ) R. ]1 m5 L, u- u% E% ^! G7 M! p& h( m6 ^  X  K& M; R
    1.将ant的bin目录添加到path中
    5 q% O  w+ w( W
    , G! p1 J0 ?+ Q( ~  |  J8 y" @2.配置JAVA_HOME
    * _9 f, p* @# X1 L4 R  t: L7 y' L* b8 V) V
    3.配置ANT_HOME
    0 U5 v* F) s6 M: ]6 ~0 p# x
    8 c) Z/ q' y" W二、配制build.xml文件,该文件放在应用程序的根目录下" Q% P( W3 U6 r7 d: O6 i# v, g. P

      y; c& e) R7 W0 a+ x2 R; F编译java文件
    ; k5 z: E/ G- C3 d+ X5 P
    + N( J( [: L/ a* Z+ r执行java文件
    2 b1 {. y* W7 X- r0 c+ }
    7 E6 b) ?5 w" b/ n# k( y6 }copy
    ! V9 o0 }! \, O  u6 E9 W0 V2 }5 P% I( o7 u" t! w4 D
    删除
    $ W1 |" f0 k6 m2 M. X$ w9 P: C
    3 l9 b! J$ z% r1 g% `& w/ h8 u打jar包
    ' A) A, E1 O) Z1 [7 H& u9 j. w6 g9 R+ U2 F$ N
    根据注解生成配置文件3 ?3 c, U7 a8 _" r
    ' O0 h: n( J, s
    Xdoclet
    4 X# U  r- Z8 H6 {$ r; z通过注释生成一系列文件的工具(txt、xml、java、html等)$ M' i! Z/ _6 j4 q  Z. [$ J

    & O$ E* u( C8 U3 j  txdoclet本质是摸板技术+字符串的替换0 L! L3 G' U/ w/ J* A8 A3 ?
    6 v" l2 n" [6 @* [0 }
    1.在java文件中写符合要求的注释(将hbm.xml文件的内容搬到java文件中去写)# q3 [& S9 `' m1 \$ y" l
    . l% I2 I3 _0 x; S
    1.1 在类的上面 写与表的对应0 e( @7 r" M' T
    : r- a7 @: s0 V; Y* U1 V& z8 ?
    1.2 将每一个属性的注释都写到get方法的上面$ `: b# P) L+ [: L% x
    2 `) U# [2 H1 R: ~4 U
    2.在ant中引入相应的task来驱动xdoclet
    6 V" N7 J. o  `# a1 z  F0 _" C2 @0 H
    1 J+ x! [0 m+ Z6 Y 0 ~0 T* a( D8 E" D
    9 [/ [' L6 H8 t. q( [( B- m) z; J
    log4j日志管理
    " L* g" u2 ^7 ]1、是什么?
    : \, ^. r3 q7 B6 }! @
    ; K- C/ M4 O  U  C$ e1 D在开发期间用来测试、对整个日志信息进行管理的工具
    + K) M2 ?( u+ X$ b0 ^4 Z1 Y& A
    ( i, O/ @  m- E9 R2、功能# n0 h4 |& Y) B2 a- e- p" }1 I% S2 L3 u

    6 E" e; D+ H8 H6 O+ A; b9 }/ ~1.控制输出的目的地* B& C1 ^! b, _1 o; P* T
    : d4 `  v$ J! B
    2. 控制输出的格式
    9 }% u, H: Z) K: G2 B, w& u
    8 |( G% m- M2 P8 A5 l  D2 ~3. 控制输出的级别  T0 T% Y! B% g/ _5 L
    & ~8 A, _1 ]5 U+ c
    3、日志的级别
    5 y% e) ^2 W- ^6 `% S5 ~5 g' y7 P" E% [1 i5 U- g9 l$ L9 q" N2 F2 i' A
    1. debug 调试- }; @) X) C: _% `
    + ]: ^3 n/ ?0 N& e. e( v
    2. info 给用户的提示信息: o$ ]$ x) R/ y% H% w% ]

    % v6 d! U( \0 ]. J4 R$ Q3. warn 给用户的警告信息1 ?  [1 x1 `5 V7 x

    / g+ q  n4 ?* Q8 n9 v" ~; Y0 x4.error 给程序员用来调试) q% S) c1 a9 k* Z) q9 w
    6 \7 A& `# K  Y
    Debug—-〉info—-〉warn——–〉error% K6 m7 {8 D/ c( A, }
    7 @9 U" v; K+ t% Q  U
    4、配置8 |- N8 H; i0 x6 s. n. Y

    % ^3 e( O. E" S& Y3 A1.配置级别' A) C) p, z) M4 n' z& q
    + W# n' U4 i# _
    2.输入源 (控制台和文件)
    9 R, c1 C3 m0 u; d
    ) `9 H' r1 U9 b; A3.可以进行分包控制6 S8 {1 @9 s) Z+ l  E
    7 b4 R6 t) I) Y) _3 D% X+ `
    Log4f.logger.包结构 = 级别1 o  c: [2 U/ m* ?

    " Y+ T$ U1 w5 U$ T0 O' a+ X7 f5、使用
    / E2 n/ k' k  F, ^' l+ A3 L% I4 B1 a9 m, p8 X  \8 N( i
    Logger log=Logger.getLogger(Test.class);
    % f3 R, j; _9 P; c, m3 }; h% I
    $ p0 y8 R) q4 o    public
    $ m. Z/ L1 |0 D8 W( `# M. yvoid t3(){+ j$ X$ b1 D+ E7 ]1 @9 v

    " B1 d$ P- ]* Z; l8 I7 J! J% j$ y: o" |        log.debug(“this is debug”);7 O% b5 f* {/ v5 f) Q
    5 ]& w# N5 I1 g/ n$ {
            log.info(“this is info”);$ S8 ^3 x) p& n% `2 E' C9 m4 }
    ! E: C+ [( ^' H" ], E
            log.warn(“this is warn “);
    $ ~. a1 P3 A( q2 b" b7 g3 m7 y+ q3 @% T
            log.error(“this is error”);
    3 A6 p# W2 R; p" a+ s7 ]1 Q/ N; a
    9 |2 F2 j2 A( \* w8 c    }
      P: `3 ?% j$ ^5 y; Y1 l+ U3 z; i) F% d5 \
    Junit
    9 h; _8 V  R1 a8 I1.是什么?* G4 M* R$ `! W' t' _
    % o* O! t1 p# @$ l1 _
    单元测试的框架
    $ F; h$ l8 \1 h# A8 M  n, v4 J  }! P8 ?: o) {
    2.怎么做?
    " n' N7 R6 B: e! z- a7 `+ Q: y; N# y; f
    写一个类继承TestCase
    " [2 B% F0 U- g6 M+ _3 L6 y8 f; n9 L  _8 N2 y, @8 @8 h
    测试的方法一般都以test开头并且没有参数3 @3 z) g, a6 j  P% n) ^& V
    & q+ J: |  B/ @  f5 I( d4 H/ D
    在测试方法前执行的方法public void setUp( )7 x; n, K$ R( U6 }( Y7 q  r
    ; T2 M+ o1 F. r9 O; A% K
    在测试方法后执行的方法public void tearDown( ): |( \' Q" Z+ w8 }% D6 n4 a5 R

    5 x' f. V4 t6 m' v) {error和故障的区别
    : D. W5 ~! p5 \5 R
    ; U- O4 _( H: D- \& Oerror :代码有问题3 ~: |: h3 U; V  j4 n  I
    6 i, r0 v1 M4 B( M% p% E
    故障 :逻辑有问题与祈望的值不相符合
      B1 ]& ~) m( V( ^( S2 c
    ( K7 |6 b, d7 u6 J生命周期: z  o0 \4 B/ h' n1 H/ E

    % `, d3 S) {, {$ ]2 u测试—〉SetUp()—〉testXX()—〉tearDown()—〉结束;
      e3 @8 a' g0 y" r* I' M5 S( G- g. x0 R6 h$ M
    TestCase套件& L6 J7 J1 h5 b- k4 }9 c) ~) i
      v/ ]" s! ?: o7 j. D) q6 g
    public class MyTest{' D! q3 R) l# m5 Y9 q- E& D
    ) @9 D2 n! C9 p
            Public static Test suite(){
    ' W0 u1 B( L$ K7 H/ O7 X6 r0 N  @
    3 J8 `8 _$ D6 ^& H1 `5 W1 }TestSuite suite = new TestSuite();
    4 G- e, w, p- \4 \1 z1 Y# K: g: g& B" G# ?* \3 r
    suite.addTestCase(Test1.class);2 n: P9 F1 I0 \
    4 ]1 v( \5 y, ^+ k
    suite.addTestCase(Test2.class);8 N+ X* J9 i5 R: u$ U

    9 K' C$ W: _9 K2 q! x}5 @2 l" ]1 [4 r
    0 ~/ {$ j; M$ k5 z4 H
    }
    3 G/ g& i, O- \4 A% b" k8 r1 A1 }9 o% ^9 F6 y- g

    7 w* [9 e3 }$ N  W5 O0 Q# v
    8 ?3 h- o! E8 y, ?% |& l, PAjax! m2 g* v( m% o3 A
    是什么?
    2 Y( v* k8 r6 I+ K: r' yAJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。是一种创建交互式网页应用的网页开发技术。
    2 I3 K" L5 W1 _& I0 v
    5 K: p6 N/ Q1 b9 z. s$ H1 ]& G无刷新页面。
    : n1 n8 t9 ]& g' z2 _2 v( z& z' B* `' `$ U6 o
    有什么?
    . \) l1 a, D6 x2 ^" K. OAJAX是多种技术的综合,包括JavaScript、XHTML和CSS、DOM、XML 和 XSLT、XMLHttpRequest。
    + H+ F: [( m3 B' K7 G$ R$ M9 o5 x* m% b
    能干什么?1 j  H9 Y5 Z1 E; @- h$ ^/ U
    使用XHTML+CSS标准化呈现;4 q% F: @. K1 U! Z6 b. V$ v
    使用DOM进行动态显示及交互;+ x% e/ Y+ X: o/ E
    使用 XML 和 XSLT 进行数据交换及相关操作;
    $ J: B/ B2 C( G' K, S0 W4 {使用 XMLHttpRequest 进行异步数据查询、检索;0 k) z, w0 s& |8 \8 n1 z( W$ }
    使用JavaScript绑定和处理有所得数据;
      h! M& K; u3 P- x- L6 e' a9 p% ^! z, Q
    传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。* B, u1 s& |* o4 }) @1 o
    5 }& L0 Z+ ]* d" V
    与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。( J3 b/ ]# b% o; v( H1 N1 |
    , @& |; u9 x+ Z7 ~3 a5 ^4 k
    使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。
    * @9 G" }) [. Q0 i4 \3 O
    % c( w9 T! k3 @) ^# N/ [对应用Ajax最主要的批评就是:
    8 B" A4 P" v* E0 |/ K/ f" ~& [) A1 它破坏了浏览器后退按钮的正常行为,就是用户点击后退按钮后不能看到之前的数据;) S+ |" v% I. S8 A
    2 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;
    8 V% H5 B, n" J9 G- ^! A3 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;8 K3 M& K. M0 F+ `9 n
    4 Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;" k7 M3 I0 p, F/ X& G: f" b

    & I* }: o+ |3 Z; ?& u: V怎么做?
    . v1 z6 {5 L! V; D, U% c' q<script language=”javascript”>
    $ `3 ~: E- N9 N4 {$ C1 [
    6 J- C0 L& T5 M6 Nvar req;4 \6 }( ]' S' \0 F! l

    3 R  a; @" D  U: M2 {0 ]3 p* Nfunction add(){% m2 H! ~8 s9 U

    7 @, @# m; ?% f+ c//1:创建用于传输的对象' D2 j1 h7 O; k  h9 z3 a
    ; Q, G6 {, |6 u2 D& d/ F9 x2 J
    req=new ActiveXObject(“Microsoft.XMLHTTP”);0 ~0 A2 {6 y/ O, }, s6 T7 p
    5 `, D- o. [" z; Z8 }0 W
    // 声明返回后,处理数据的方法6 L0 \  v/ F: D5 N+ ~; o

    5 @) X" H0 N. U5 \req.onreadystatechange=manage;% [- M$ g, @% o( p2 o' R# d- p
    7 N$ \+ k0 Y$ G1 h* }8 ?& \
    //2:准备传输的内容7 U  d: _6 D- V* v1 q
    1 ^! A' O" E9 M% ~6 n( u9 o
    var str=”test1111″;
    , D0 p& Q. |' b$ \$ B. R6 R6 u# j" Y; r
    //3:发出请求
    + _6 n+ E& N# t8 `4 v; @
    ; Y  K! s6 q9 e$ ureq.open(“GET” ,”/others/ajax/test/t2.jsp?str=”+str);  t7 A4 k8 _. O/ S
    ; A7 J5 D% B( i3 |9 o
    req.send(null);
    + O. h( U+ {6 D% u6 e
    0 j0 L0 u# p& K) X}& \( q! ^& F) m4 A! d
    : H; \5 _3 ?$ t+ z& A
    //4:接受返回并处理
    : f0 z+ M' O& J8 ]* L- e2 D! X4 x4 ]& T8 Q
    function manage(){
    . k5 L/ a1 q/ p$ i% m. s- l3 c! O# ?; i; Z; A, v3 a0 O
    if(req.readyState==4){. h2 W2 w- P/ [; d

    8 Y8 G. a. i% I( ^+ }2 z# Halert(“r==”+req.responseText);
    - A9 L9 x* w  x; m
    3 E- N. S4 Y4 x' v9 N) N}
    % l0 t8 Q' L6 F" B1 P4 L# {) A$ A
    }) @. \/ _- p. c4 r# O+ F  q

    ) v/ f* O5 G) C</script>0 [" T8 h2 x- p- b* \2 C

    ( }9 r; b  Y" c' @- E0 s& L" s/ }& A8 vreadyState的取值如下:& G! f4 n+ C' G$ \  O, ~+ ~, _

    ' D5 [( G  x- b. M  0 (未初始化)5 T3 U. |  G1 M6 h3 y/ \
    $ V/ D( L7 {6 E3 h1 D
      1 (正在装载)# ]; u- x0 K: L

    + c9 ~# Q, f& r- @& t0 N0 F3 j  2 (装载完毕)+ a- b4 G/ Y" v- c

    9 S) A4 w2 p7 z  n- F  3 (交互中)1 N+ Q" B  T6 P% q. b: `4 h
    & r% }/ n: u  _
      4 (完成)
    % x  X( A. a9 B5 ^  ~4 y  e; p0 _; K3 b6 e7 {, u8 A  G
    2 u* W' W& I$ f! U

      `0 `; e; ^) S6 M: D" j原理
    5 W( u; F7 Q8 m2 [' Y% uAjax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,可以是xml格式,也可以是一个字符串,然后用javascript来操作DOM而更新页面。6 l; k+ y1 O3 E2 p; O$ v
    & B* d3 d/ {% V9 S
    Dwr
    5 x% v& @1 l: D: W5 s8 p是什么?: s* D% Q8 K1 i1 N4 Y2 l, p
    DWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的页面。它可以允许在页面中使用运行在WEB服务器上的JAVA函数,被调用的JAVA函数就像是在页面中JavaScript方法一样。7 }+ g: e0 S8 q7 E$ T5 r
    / M) I" x( ]7 ~: @& M  z/ q2 `0 V
    有什么?
    + o* ?) j" d; p. C& v; f( H( N它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据;另外一方面提供了一个JavaScript库可以帮助web开发人员轻松地利用获取的数据来动态改变网页的内容。- H8 ^% q" h/ z3 {
      ~9 f: U# z. u, E9 U) v+ h1 r& y# k

    ' o& K0 c$ N4 R& \( u* X' c6 p* b* f4 j- E" V+ u# g
    能干什么?" }; P& o2 B* w3 d9 Q; i
    动态地把java类生成为JavaScript,感觉调用就像发生在浏览器端,实际上代码调用发生在服务器端,Dwr负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制。
    ' w, u; W6 ~7 f! F: e/ D
    - u+ s% G- e- K+ ?1 P& U
    * x& Y7 J6 h$ j, a; ]/ {4 K; C. ^, ^3 ?
    怎么做?
    ) G/ p" e2 x+ z* p0 K  N; l① 编写配置文件3 o7 p  Q$ T! b$ ], J
    + _/ N' E: u, h* M1 E8 S2 g. a7 j2 q! _
    web.xml1 m1 m% }7 ~! F- V- l
    ! v- g$ ~- y, I5 l8 U: k- R7 V
    <servlet>6 K5 W6 C& v* J2 v& u3 U
    . S: {) k* Z8 l0 V# U: r8 r
    <servlet-name>dwr-invoker</servlet-name>: ?0 H' R! G% k, d
    2 G* P9 s; X% ?" ^$ A% q6 z
    <servlet-class>$ T" }: {$ I, a/ {1 Z

    2 ~+ b" X$ N( y9 n; l' \org.directwebremoting.servlet.DwrServlet
    ) ?5 N  a. H8 G& ?- N
    # l9 T4 G- P) |* t& x+ u% A</servlet-class>
    : m3 I2 R' }4 |+ s) k4 V5 y7 ^6 E  O/ A$ J& f
    <init-param>
    : D" a: M, _. l" l$ y8 i! o/ v8 b9 l4 E0 l4 G
    <param-name>debug</param-name>
    % j. ]9 q5 r+ _7 b4 S
    : P  P: O) \- ]2 ~<param-value>true</param-value>) @! I: O4 _, P, X0 f

    - f; k" e2 ?. v</init-param>
    : ?' l+ Z# O, ~$ j% P, V5 ^" \5 e
    6 E) ]8 e+ Y% l; I0 P/ f</servlet>) F0 }; s  Q0 w; m

    5 [6 B) T5 u( r" S+ a4 q6 A* U& l. P5 ~<servlet-mapping>+ V2 b  t9 X7 e9 t4 _* t3 e9 E
    " \0 w8 w& L  e
    <servlet-name>dwr-invoker</servlet-name>8 h, Y) c# z6 U+ d1 s; {

    , P( _( G- m! x' G) M7 M<url-pattern>/dwr/*</url-pattern>9 m; b) e( d$ d

    ) B3 ^6 |# q# m. w+ O</servlet-mapping>/ G' x# D  V9 z$ ?7 Y

      ]7 r. h/ a. pdwr.xml
    # q6 J. a2 R7 {5 B
    ( Z: {4 T9 ?0 K0 n8 X8 [8 ]<allow>2 X: W! }% C; i/ Y0 B

    $ I2 f3 U. \" R. b<create creator=”new” javascript=”kc2″>- M! @( X. _; L6 Y& _
    9 |4 ^" N! w# Y3 i' B$ N
    <param name=”class” value=”dwr.Service” />
    ( [9 q7 r2 u% q: g  A
    & R2 [( s2 p/ r/ }# @6 Y</create>
    4 i4 P, D, O- [. [; A
    : F/ ]  H( h, n; u# m& n3 H</allow>
    3 d. u9 y2 |( s, ]' s8 E9 n; {" Y/ ~
    ②编写service
    8 [. q7 _) `6 V3 ?+ r; a
    ) ?9 G9 t* Q% w( r, A4 tpublic class Service {& h$ G# O( z, p5 K8 b- u2 C. e  s

    $ k! }* y/ x5 `4 ~8 p5 Y2 w+ Mpublic String sayHello(String yourName) {/ w& t9 m% S- j+ o0 Z( L
    0 Y0 v) o* A2 Z8 k8 G) `8 X
    //可以是访问数据库的复杂代码: K) ]- {+ M9 `' f

    ' y% O0 K; p* P! ^: Nreturn “Hello World ” + yourName;; Q: \9 V: h0 m
    9 p. l7 L% q, |$ G( J3 F+ p# v% Y
    }' m: o5 `, d+ m

    4 K* [$ q4 _  @# N3 z6 Z}9 Z- {! G3 A; O3 D0 O& v0 @
    ; W2 T2 w$ C* s" n
    ③测试DWR) {  i* J/ c4 ~: l, r5 R
    6 [" }# b. A7 |( h& f7 W
    将代码放入应用服务器(比如Tomcat),启动。% j1 g3 L9 U" a- Z. ]9 m+ B9 `4 j0 h

    0 c: [0 b/ M0 z: n# C" N然后在地址栏输入http://localhost:8080/你的工程/dwr, w& `) S6 m9 X+ O- ?
    % \; _6 G  F& r/ f, |$ r$ u
    ④编写jsp页面, v2 t8 r# c. T8 u! m

    * G5 ?& K" ]! o3 f1 r+ f) U1) 要引用3个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js' M1 g: S* n: R# q7 q

    + P1 ~+ N6 C/ a' x) Q2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样* v" |' U. {0 j( c3 m. q$ q
    9 L6 W. }+ F6 I( K2 z
    3) js里的service.sayHello和java类的那个有一点区别,多了一个参数,用来得到返回的数据
    回复

    使用道具 举报

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

       

    关闭

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

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