我的日常

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

动态微博

12
楼主: admin

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

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    11#
    发表于 2014-12-03 12:43:50 |只看该作者
    JEE5 b  }6 M$ t$ w1 y$ ]
    简述JEE$ L) d6 ?, C0 X( h8 S0 W
    JEE : JAVA  PLATFORM  ENTERPRISE  EDITION5 V( j9 `& H8 ]# u- O3 r8 B( P
    8 H3 t- K* J# P+ G' l
    JEE是一个规范集;
    % e' I! h$ W! x% m7 {- \: j9 o9 W4 v1 ~
    JEE是一个框架集;
    2 V( j8 A( G% t
    4 i4 s8 O2 T; q) {$ x, [2 xJEE是一个技术集或API集;; ^- e" u5 r# Q

    ' L9 L8 l5 V1 B5 t适用于创建服务器端的大型的软件服务系统8 F$ E* Y0 x/ ?9 [' r$ V

    ( W% e  N5 C3 n
    ) x; @* l7 Q. s9 B* W8 l& B  W" ]9 r+ U+ W3 a
    C/S B/S 模式
      L' j- r! h1 J) L$ |- ]$ OC/S client/server即客户机/服务器模式,客户端也参与程序的运行与计算(富客户端、胖客户端)
    ' P) s' R" y$ _  k" Z7 T( ?) [8 A5 f
    B/S border/server即浏览器/服务器模式,又称为瘦客户端,客户端不参与程序的运行与计算
    6 y9 O+ G/ {( C$ ]9 P$ t  e& K
      J1 d4 j. G1 Z$ A: N' T& N7 A
    - c& w) k' y0 [( `; \+ m4 A' s/ d4 U" [8 v0 C; J
    企业级应用(大规模的应用)的特点+ ~( v' a: d3 ^' l; ^- x& h
    1.生命周期长、稳定、可靠/ D6 K4 s+ ^; z1 m7 a

    ; [. `! S6 i8 |# S0 x4 E5 p: E' F2.组件往往分布在异构的环境中,能够跨平台
    ; A* p7 e" j. N/ m: O
    9 Q8 i+ A9 u& v3 T/ S0 A4 b# E1 r3.维护性、扩展性、重用性
    , ?. `9 w: n* F' _8 k
    - _6 e' ?  B% B4.有事务、安全、线程
    0 h+ ?8 g( A0 w& |( y- p
    1 q1 N8 o, w. i4 B1 z6 s / c) N" D& E* m4 a0 _( D

    8 n) o/ T- ^/ N; |9 Z% x' k什么是业务逻辑?& W0 _* c% b) e+ d' k
    依照业务逻辑划分模块,) ^3 E' M0 X- X7 Z' k$ i. l
    9 n, {, c  `2 S6 e
    所谓判定业务 就是具有以下特征:
    % Z. H) e6 f( P3 b  C* l
    4 S; @  k: V0 m/ V/ F! {1.业务流程7 B$ v" p3 _; ^' }! \
    - z0 x  Z( _  K1 ]
    2.业务判断
    2 w" n: i. S. C% m  m
    / x: |! z$ A' \3 ]+ y( F0 H- f3.功能组合1 [, u/ }2 P; {# @' t* w( p
    ) y* s) u8 b+ M+ ~( ^4 ?" A
    $ V2 R! j: R! R
    6 {9 m7 ^0 b/ A2 e- h
    平台(角色)的划分# Q3 j, W/ I( \, u8 e( p* N6 N
    1.平台供应商。提供满足API集实现的厂商(BEA weblogic IBM webshphere)
    0 b! G' W+ O( ]' ^% I
    7 |* S0 P" W9 J) K) I+ a2.组件供应商% T9 f* X" Z$ U

    0 D: j" A; Q& H, C: A/ _7 Y: n3.组件装配人员' ~+ X% o' v+ \8 p3 e' f% d/ K0 M
    " Y% k( Y+ t! ^% b- B' Z/ e
    4.部署人员
    9 Q4 W( s% n- R7 L7 m
    : Z7 \/ ~" Y1 [. F5.系统管理人员5 s; P' r' @& O6 z

    * o# Y. u8 n# y( t6.工具供应商 提供开发组件所使用的工具(Jbuilder、eclipse)1 G- U  I9 ]' p9 u1 ]
    ! C7 w% `" y% B, V! P4 w5 N

    # `* J) u7 n8 S  ?( ~$ D- i5 n
    - u* t6 d+ s9 }! C: Qjava技术分布(设计架构 模块内部设计)- k$ E: L9 O) p7 j
    1.表现层 Servlet、 Jsp、 JavaBean、 Taglib( w% K$ b: y% b( ~2 U
    0 n+ _' @3 j  g- A
    2.逻辑层 EJB(SessionBean)
    - c# e7 m. ~" n' d$ ]6 H+ q$ C8 W! C0 p, l( d
    3.数据层 ( JDBC  EJB(EntityBean))
    / b- [3 q: M" S: `
    * k  e  n9 n3 `' f4.服务 JTA(JAVA事务架构) JTS(JAVA事务服务) JAAS(JAVA授权与验证服务)0 {# `' Q* P  F* D0 x' `+ c
    * ?  y0 g1 d* e0 j# B
    5.分布式通讯 RMI(IIOP)+JNDI 、JAXP(JAVA 的 XML 架构)
    # {# ~+ f" `7 e' m) B" q; J5 u' Y) \% B
    # o; b/ {" W& {. j3 {5 l, `JAVAMAIL(邮件服务)、JMS(消息服务)、IDLC、JCA(JAVA连接器框架 (成))
    7 w- R/ H6 n6 p( S
    5 B: o" v4 V) ^
    8 q' U4 F+ G" S$ r0 v6 {( @4 l; O, K/ l2 F# j+ }! M- }
    JEE的体系结构: 是一种组件的体系结构( Z' F: m$ P7 U5 |' t
    1.组件 : 能够完成一定功能的封状体(独立的功能的集合)) E3 }$ r+ N2 H5 P8 Y4 W4 M  o

    7 X5 ]  o: P" s* {; s不能单独运行,必须运行在容器上
    ; [$ O9 C9 ^4 @6 ]3 e1 B9 Y; f
    ! Z7 X* t0 [" v) s. v" s$ ?分为两类:web组件、ejb组件! N$ Q6 l& e4 `( X6 b6 f
    - M2 f% t" v1 X
    2.容器 : 提供组件的运行环境,并对组件进行管理(一段程序)
    6 Z  q( V) D1 O5 f
    5 d6 w" Q  U9 Q# s: w1 M2 T! |" T管理组件的生命周期* x0 Z1 h& q$ X# [
    " p4 ~$ O% q; \1 Y5 s
    不能单独运行,必须运行在服务器上
    % b9 x6 d5 n. r5 g( O
    6 W  [/ J4 r  i程序(组件)通过上下文来调用容器(context)
    $ G0 Y8 A# B( J
      @  T% z# S5 Z$ U: W! i' {组件通过web.xml向容器描述自己,使容器能够认识组件
    5 }6 g6 c5 M/ s+ g2 _! g
    1 D7 `; G% v  j6 l& Z1 B容器通过回调方法来调用组件
    ) Y! n$ g$ r& Z$ N. K+ ^9 V: ~4 a8 X. O$ s0 u/ ~# k
    分为两类:web容器、ejb容器$ c1 Z# q" v" O* G; T

    7 `3 y% Z! ^4 R) C# D: {3.服务器 : 提供容器的运行环境,提供大量的JEE基础服务
    % X2 I) G; \; D/ ?$ Q/ {
    . ]4 U) G& X4 C+ l, _web服务器(只提供web服务)
    0 m& g. x( C' b3 R2 ^3 [% ]' L- `
    4 F  N' r# {8 kjee服务器(提供web、jee服务)" i( {: r/ W7 Q

    : _: K6 k) I& d
      w! v: T: d& @( O
    6 ?7 u( J0 w- ?" i什么是回调方法
    8 Z9 e# [) n- x. U$ K由容器自动调用的方法,就叫回调方法。: m5 m, }7 ]2 M) v
    * i8 d* ^0 r3 T. ]+ [1 o( w
    : K5 |& ?( m! @8 p6 E

    ; ^6 _. R4 g4 B! A5 w5 G5 U4 IRMI远程方法的调用机制
    2 N4 e2 g! ^+ C' [' t1 a1 ]例如:A主机有B()方法,C主机有D()方法,A 想调用C主机的D方法9 ^; H# ]) Y/ {8 T1 d; b

    & G, n, v; T9 h$ E8 q) h
    ( O* \8 V5 s8 j0 c0 P% N6 b3 A% l* T+ b9 `* W5 k! `5 I

    - y0 s% p, M& G8 ?  s/ @/ S2 k' V2 j0 b  e( U- z* u% W3 C
    学习方法
    % `; W* k, e3 |" k  b( I7 u2 D- x1.规范(熟记) 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 |只看该作者
    Servlet1 j3 ]. R+ p3 W  N0 }
    •     描述war包、jar包、ear包的结构  l1 ?2 m7 H  j  {2 i
      3 Y% [& s$ w8 e! g
      / E0 x8 @' d0 f

    war-                            web文档压缩包

    —WEB-INF

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

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

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


    3 M6 |9 b* Z5 b+ O/ v/ ]  q

    jar-                             java文件压缩包

    —META-INF

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


    7 {9 b4 X% m" U, d9 @

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

    –META-INF

    —Application.xml 配置文件

    –*.war

    –*.jar


    ' i; M) \$ j0 p6 ~) g5 @) p
    • 什么是servlet?servlet主要做什么?
      & }& {7 j5 O1 E+ M# s- [1 R+ w2 \3 q

      3 n. V, ~$ V- ]* F
      & _# c# A* r: s

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

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


    ; T! f3 f6 R: f0 o; g# P$ k' o  d
    • servlet 与cgi相比的优点?servlet的缺点6 I9 A) r8 U& v0 B. q
      : N" }% k7 x6 e5 @8 B  }

      8 {3 s2 N- {) Z" S3 ?9 o

    优点:

    性能(线程比进程更快)

    可伸缩

    Java强健且面向对象

    Java平台独立

    缺点:

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

    - u" w5 t# k5 d- ~! o- l
    • 常用的servlet包的名称是?' V- w) R8 a" P8 t6 [( S

      1 A0 S7 @7 s* O, M5 g
      ; Q8 K6 H% F; M0 ^$ Z! z$ i5 \# Q8 h+ R

    javax.servlet

    javax.servlet.http


    / s) ~$ b, c/ j" T# C# }
    • 描述servlet接口的层次结构?- @8 S% ~1 O6 T9 B" T

      - m' A% p9 J  J4 ~/ j! m1 E& k
      6 N  ~" B7 ^" c8 b% k8 o3 ]" c

    Servlet

    –GenericServlet

    –HttpServlet

    –自己的servlet

    ServletRequest

    –HttpServletRequest

    ServletResponse

    –HttpServletResponse


    3 b) _( b6 E& D( L& R4 n
    • 对比get方法和post方法?( {% ?/ E% M9 Y
      ' e* `' F: D0 V+ ^) I
      # _9 C( u% z4 L  L. l

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

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

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

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


    4 a  S  g* R# |* M2 W- v" L
    • 归类描述HttpServletRequest接口都完成那些功能
      ) L6 x5 M, o* b4 k

      : m& Z! S9 O2 |' m, o& I$ y0 s7 y
      • 读取HTTP头标
        ' _- h, u, c+ ^2 {% S
      • 读取cookie
        6 d! X, N; o5 f2 a/ {3 f
      • 读取路径信息
        ( F- q1 {0 R4 x1 }6 b
      • 标识HTTP会话。
        & ^! ^4 }6 b, h! ^' J! G' t  Q$ k3 v+ q% H' K/ U5 Y' Q
    & ~/ D; B; k& p+ N) d/ x: r* h, ?
    • 归类描述HttpServletResponse接口都完成那些功能* e& T$ S: B5 C! A7 A; w  S8 A

      0 R: _3 }2 E" f# ~4 t/ J2 x. Q
      + ?! B5 B( X$ X2 D0 j; v* l
      • 设置HTTP头标- {+ ?; d$ w4 X" Q5 v$ s! I( f2 W
      • 设置cookie! I$ k: y3 W# U% U. W% D8 ~
      • 设定响应的content类型7 Q- H6 D* [# I" x! w% `
      • 输出返回数据
        2 i' i4 M+ U& n3 N% `
        - E6 C% K) ^- e1 m
    9 o/ z3 O3 ^- w' H
    • 描述service方法所完成的基本功能?默认是在那里实现的?8 V3 ^- E& C) w9 O& X# l

      # l2 l/ i5 d9 j& s" I/ H, X7 K# E6 @9 V& b( f( h* |

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

    实现:默认在HttpServlet类中实现

    0 _) B5 m% h8 Y8 d$ |$ l
    • 如何开发自己的Servlet?描述应该做的步骤和每步需要完成的工作
      / [5 s% h) h2 W; j
      " P! d$ @0 x, n7 z" N7 B; v4 \- n: z

      $ U4 x. o9 o+ W3 e. G: E0 q

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


    " Z& W- s. v2 a: u6 d
    • 为何servlet需要部署描述?
      5 C( @( n0 t% S1 h  q

      - d+ o4 G& R' v# L3 b# u. v' u) o: E( G

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

    6 D$ L7 A: l# _3 K, k; |
    • Servlet基本的描述应该是?请写出来
      ; D, M; Z1 K$ K1 v
      , ~- j4 M2 e( i( G
      . w% C1 m: Z  f, i& o$ L5 y3 w

    # [1 @5 r& w" M$ Z+ p: ~

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

    8 g  f$ w! f: K& i
    • 如何在html中使用servlet
        {1 ^- a0 `: X. z- [' W; y4 R$ V

      - ]+ H: ]: M' b* s% u
      ) L1 s. A' j+ `5 `3 n

    FORM标记

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

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

    语法:

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

    {HTML form tags and other HTML content}

    </FORM>


    $ U+ }9 C3 X9 d4 o" W$ l
    • 如何接受request中的参数. a# |% d# `$ h9 S- E
      ! K% u0 A2 v5 M+ b1 X( G
      String userName = request.getParameter(“userName”)方法
      & [5 v0 r7 ?7 m7 h' t* P. f3 q3 p9 P3 j" q6 t- k
    2 U7 g4 G$ O4 q# Y* U+ R- X
    • 如何接受request中header的值- |4 D0 ^$ d  i) q7 k

      ( g, C- U& B# ?# |9 R7 `* I) z( P6 f3 B2 m

    request.getHeader(name);

    request.getIntHeader(name);

    request.getDateHeader(name);

    request.getHeaderNames();


    3 t% C8 [& k2 o$ M
    • 如何输出html
      / s3 ~+ a0 m; _' I

      ' Z) S7 s: P& L. l, B$ {
      * m* u; z. ~, |& }, N- `% L# b4 i; m

    PrintWriter pw = response.getWriter();

    pw.write(“<html>”);

    pw.write(“Hello”);

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


    % q9 L& G5 c1 |; u7 h5 k
    • 如何设置输出的contentType
      9 ^$ ~9 f+ ^: A0 d
      ) v, r, V; s9 [  \, R' P+ {0 g
      " J  _' `; c5 X; C% ^& }% i  F

    response.setContentType(“text/html”)


    4 _9 F  y. G  [
    • 描述servlet的生命周期?
      ( d3 t9 p5 u/ L( P+ h
      $ j+ E+ c8 V- s4 u0 \2 v9 ?

      7 V7 l+ \, _6 I

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

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


    8 o$ t+ q/ N' P3 u8 @/ E/ \# i
    • 描述init,service,destroy方法的功能和特点
      7 T, s9 c4 j$ G" e& i

        z5 g$ e& y& i
      : ?+ K% @% ]3 @/ G3 t

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

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

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

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

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

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

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

    ) Y% X$ ^' n+ Z4 @$ _: c
    • 什么是回调方法?有什么特点?; ]* G3 p) ^0 e* d/ S  R+ h% C2 v
      3 q" q- W% b. z7 N- x: T

      $ G& Z: k' Q2 R! a, ~

    由容器来调用程序的方法

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


    7 [5 ]& ?% ]9 E1 }+ q+ T$ B8 g- X) u
    • 如何设置初始化servlet的参数?
        H" A! Y% L, v2 C; \1 [" o; A3 F; E

      : z0 Y1 w' Y3 ~  U1 R7 v  U在<servlet>中添加如下配置
      7 q3 F1 f0 G% l# s. I9 T
      , `$ [/ j$ Y4 H

    <init-param>

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

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

    </init-param>


    4 V0 ?( @# ?3 A3 {
    • 如何获取servlet初始化的参数6 Q( P& ]! U+ V3 f- b( b* p

      7 v) D& @! @; T3 O* C% A$ _& Q
      : e" o) g+ e' }5 s8 f% W

    public void init() {

    greetingText = getInitParameter(“greetingText”);

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

    }

    / H0 i# p+ D4 n( F; e
    • ServletConfig接口默认实在那里实现的
      " g# ]7 T& H. [! d2 {0 v

      2 R& h& T4 G' T: j. U+ I2 R( v
      # C0 d1 l: Y& B* }0 |

    GenericServlet类实现ServletConfig接口


    1 H* U. T7 Z) g7 Z
    • 什么是ServletContext?有什么作用?
      8 ?  s* f3 C7 }* O2 E2 Y* \
      3 O& d1 ~- ^0 Q( V

      6 [0 ]  M3 M) L0 M5 H

    Servlet上下文

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


    ! \9 R5 [& ?( o
    • 如何访问ServletContext接口?是在那里实现的?) t% h* {, Q7 \

      : Y1 l. F- ^# y, y# c
      ( G- M) |) c& n( Z

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

    GenericServlet类实现了ServletContext接口。


    & M+ s! U: V8 o8 A9 F4 A+ W: k
    • ServletContext接口的功能包括?分别用代码示例
      & U+ {, Y: a& C
      1 |% l) [; a$ o; n+ A0 r

      ) i- l5 z1 _) P! v* U( j/ k, b

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

    + c& o* A5 Q& K- B$ Y- q+ X
    • 如何设置ServletContext的参数?
      7 }# k- M/ N4 X9 R( T
      4 b( M; S( F% ?- [' S0 Y7 V. M& Z0 \

      & T9 p! a! v5 g8 O0 P" J( i

    <context-param>

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

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

    </context-param>


    8 I7 k$ B$ \8 z/ m0 Z
    • 如何获取ServletContext设置的参数值?
      5 s) W" r9 o) n( m$ p1 x" ?& w

      ) o: ^3 {- r% d8 I1 z8 d2 S0 g; z7 l: \1 t1 f: g

    ServletContext context = this.getServletContext();

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

    7 e& B: @! U% r
    • 描述Web应用的生命周期?9 v; ~0 ^4 N  n: i; f( Q

      9 w6 Z( L8 ?/ m! E( x5 E* c
      ; B' w1 T" _$ q8 ]; O

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

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

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


    . L* K3 r% ~, }6 h" ?4 u+ }
    • 如何用代码实现监控Web应用的生命周期?
        L& _0 B% V6 E6 b, |$ e
      4 v% g* U9 ?) _: `

      ( S9 S- I8 x  i: e2 u. B6 H' S. U' T7 T

    public class Test implements ServletContextListener{

    public void contextDestroyed(ServletContextEvent arg0) {

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

    }

    public void contextInitialized(ServletContextEvent arg0) {

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

    }

    }


      s2 a4 o( i( }. _% |

    web.xml文件中的配置:

    <listener>

    <listener-class>

    com.csy.Test

    </listener-class>

    </listener>


    1 I3 p) t( N0 o  F. f0 H) G& S
    • web应用中如下错误码示什么意思:400,401,404,500- x1 `3 Z5 P8 u5 b

      9 @9 t* I& X) w
      400 Bad Request//错误请求
      401 Unauthorized//未被认可
      404 Not Found//没有创建
      500 Internal Server Error//服务器内部错误
      9 }/ `. G0 b2 [6 F; i# D
    , o0 g% r( k0 [7 z# l6 n) S
    • 描述Web应用中用声明方式来进行错误处理的两种方法
      : y4 c1 O2 Y/ F$ h0 G
      0 E3 d; g8 L# M% z

      6 p: F7 A( m; c7 g3 f

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

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

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


    + z$ E$ n$ A! g& ]
    • 描述记录异常日志的方法,都位于那些接口?
      1 r. q3 B3 O1 N& H7 l& F

      . }2 \9 p6 h( l0 O6 o: D# l( m9 M6 z- D+ A9 `% Z

    GenericServlet:

    log(message:String)

    log(message:String, Throwable:excp)

    ServletContext:

    log(message:String)

            log(message:String, excp:Throwable)


    & k+ v9 M1 c+ _2 B+ J* ]
    • 什么是会话?0 F: o- m9 c4 ?7 O  M
      ) o9 ?  |8 M) ]/ _! N+ j2 l5 O# C
      ( X6 x4 k. ?1 f; W

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


    " U0 s; u& |  d' z: G
    • 如何获得会话?
      1 }: i2 x0 _) [
      / u' q4 t4 h3 C" n( `5 {
      HttpSession session = request.getSesseion( );

      5 o( u% r$ v9 M, L

    $ U" ~, |3 @) Z; t1 Q# e$ n0 T/ ~
    • 会话Api的基本功能?! u/ Q& q9 \* d5 W

      ( o* u  L1 W: v6 a7 Z$ {/ \' v0 e, ^+ p

    getID() :String1 n$ t+ V0 j( Q1 v+ A

        isNew() :boolean* x% m& f/ c: d) ?5 J

        getAttribute(name):Object5 A3 W5 ~2 {5 Y! e6 n0 N

        setAttribute(name,value)
    " s! P! A* D# `( U: B9 k6 M# }

        removeAttribute(name)


    % S5 h9 w; X. }' ?
    • 如何销毁会话?+ \" {% |) H* @, C' s) l5 Q

      & C2 U6 S' n- R, _* ~4 V
      ; h* N+ D0 G5 k! v& }

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

    <session-config>3 w0 P3 O3 Q" l! y1 F5 Z& B

             <session-timeout>10</session-timeout>
    , q) [3 B% ^; z

         </session-config>
    " s! z5 e8 _# d7 \" j& [  b+ Q

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

    invalidate()
    " L+ V' U0 g1 y

         getCreationTime() :long! ~- G, W" }" n7 s) D

        getLastAccessedTime() :long% o  w( i: Y# m+ f! W1 h

        getMaxInactiveInterval() :int( z$ z' e8 u9 s5 m5 d4 K9 `

         setMaxInactiveInterval(int)


    % g; ?7 j, z2 f: R$ `, L: C# I
    • 描述会话保持状态的基本原理
      ( a( c3 ]" m! J) ~7 a+ [8 b
      5 ]9 Z4 d( v4 C6 [9 ^6 ]. |/ h
      1 n: B2 r! h  V: \6 X8 [0 ?5 }
    ( g) }1 h  X* q) E1 `! @/ A

        client server5 x+ P1 C. s: y7 a; v. r. B9 M, Z


    * @7 n4 T8 @  o" v" g: ~5 I& J

    request
    6 t* h% B9 c) v% p- i2 B3 Y

    response (sessionid)( ^9 P5 X6 q% K, N; u

    request (cookies), L5 t4 T9 z! u# V2 f" N# j

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


    : X( Y' N) L" c# ?. w; ^# b$ t+ U
    • 请描述session和cookie的异同之处& m1 t" C# l5 {9 J
      4 s" B8 C; s* F/ r

      3 q# o( F4 @0 ~* m

    $ N) G# t  n0 Y! B- u) B7 R
    * S( C1 C7 u- H' `
    • 如何读写cookie,代码示例6 r$ p; W! W, x) B  d

      2 b* x; d/ h8 P8 p6 Y
      4 `  j9 \3 I; _' E

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

    response.addCookie(c);

    读:Cookie[] cookies = request.getCookies();
    ! Q8 U5 C6 ]* M4 g9 f9 ?# z9 I

            for ( int i=0; i < cookies.length; i++ ) {
    ( L  g7 T7 b7 y/ B% Y

                String key =cookies.getName();. Y4 c+ w' A+ s! l

    String value = cookies.getValue(); ( O& H1 ~' U4 T# J* a

    System.out.println(“cook”+i+“:key=”+key+“,value=”+value);
    1 r1 S5 s6 H+ I" d

         }

    3 A4 @4 s" f2 V, n: e0 }
    • 什么是URL重写,如何实现,代码示例5 E+ R/ `+ i' ?# l

      , d0 r7 F# \+ S) R
      & g0 [' X' R  L0 }. z' |

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

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

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

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


    % i/ G9 p0 d: W7 ]/ w* X0 t% [
    4 c0 a, M+ c, ^) o; R# m
    • 描述web应用的4种认证技术
      " B6 o7 z0 x3 Y. v7 }

      1 [0 {) d( v8 ^$ U$ V* s9 ~0 y2 Y2 d3 D7 B. R

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

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

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

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


    $ d7 g6 B. u9 o' g9 S% l1 Z% }
    • 什么是授权,什么是验证?# D* H5 e. C9 C$ j

      : g5 ]" j) k. k1 c, i4 y
      # g: b, J4 Q( q7 T+ ^- c

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

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

    7 x& q& ?- F) X/ g9 t4 E
    • 什么是HTTPS% B0 m" B5 U- M1 {* B

      / e$ ]1 J' U0 E8 T8 O7 e" D: V7 @" g1 w) _2 S+ f( G

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


    " g9 s- [+ B+ c3 k1 P2 v
    • 什么是审计?
      , u# W1 p* E5 [5 g6 v/ B9 M. O# H

      6 K& R. E/ u6 N0 U5 t; D% a) s3 y% N+ k4 a; a+ W

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


    " d. W7 |. s& Y" \, c& ?# O
    • 如何实现声明性授权! C2 m6 I- ]5 C9 F! O+ \
      4 k6 j7 M; u6 F

      ) [2 J0 N; Y9 _$ ~) W

    1、标识web资源集

    2、标识角色

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

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

    在 web.xml里配


    9 r/ p$ k$ Y2 d3 `& N
    • 描述servlet并发问题?
      # P/ b( @% D0 z; j
      " Z, h1 l/ P- G* S' V& c1 G) z

      ( H  U) O: _+ `' T. C9 X! q; V

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


    ( A5 K0 I; x7 \$ B- r
    • 描述Web应用中的六种属性范围: i2 F  W6 j7 S, B* d0 }) c9 m

      ' C8 }+ I; P: D" m) R! [: D* n- @
      % \6 b. [7 S4 S2 p# x9 V8 S

    局部变量(页面范围)

    实例变量

    类变量

    请求属性(请求范围)

    会话属性(会话范围)

    上下文属性(应用范围)

    1 a" G7 b7 m; d% F3 U* G. U
    • 指出上述六种哪些是线程安全的
      * N5 d9 E- z7 O  Y
      + y! p5 W* m  D6 I- M' P

      ! Y# F7 z. R" ?0 V5 B

    局部变量和请求属性

    # X- h9 f: j1 M& `5 L3 B
    • 什么是STM?如何实现?
      + {5 T/ O7 J* z! w! Y% a

      ; y( c3 U- s, l
      ; w+ h+ r* F, V# Z

    SingleThreadModel接口

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

    7 i/ Z) i/ X8 u  t6 z
    • 如何实现并发管理?
      3 A0 X& m6 @6 M
      6 J7 L9 |6 q+ k( d
      1 V: u+ Y. {, b$ V0 y( j

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

    使用synchronized语法控制并发

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

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

    4 f, D% _+ V% Q1 R/ h
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    13#
    发表于 2014-12-03 12:45:45 |只看该作者
    Jsp
    & t4 m+ t2 u7 p; V( t什么是Jsp?
    7 @4 h; b' ?2 w/ ZJava Server Page    结合java和html在服务端动态生成web页面的技术4 G; m4 O: r: y% C. l
    3 c  R& t5 P+ v  c% c* H: g

    3 u. ]3 b! A0 V5 g
    ( i, c* {) _$ B* [# l8 _描述Jsp页面的运行过程?, k, \' k# P7 i  [9 P4 @& @
    第一步:9 N, N. u  n: Q# E) o- K
    " Z8 Q$ [: k, P( }" d7 n6 y
    请求进入Web容器,将JSP页面翻译成Servlet代码
    3 p% D1 H7 T. X$ H/ p" U1 ~7 ?
    ) v$ N2 h  i3 \+ N& `) d第二步:
    ! K# c0 z! A! i. U
    ' o" m( d  G, d* j0 O编译Servlet代码,并将编译过的类文件装入Web容器(JVM)环境
    0 |( q" ^: R0 q1 A5 |: L
    & V; |' y9 p/ M5 h第三步:
    / l. X7 r( i/ q6 p9 E
    * L$ S: c$ j; U$ C/ P' f; V# x/ sWeb容器为JSP页面创建一个Servlet类实例,并执行jspInit方法- x4 ]- P* h. F

    $ V4 x* r% j  Y+ J+ A第四步:
    9 l# A4 E7 V) \% a0 J# n3 B
    $ |' U; g6 a. t7 [2 L1 X. EWeb容器为该JSP页面调用Servlet实例的_jspService方法;将结果发送给用户
    * [6 {4 p3 u8 L4 H/ f( x3 @# _. N3 ^. J7 U

    + D( \9 t+ ?$ d* X. W7 u2 Y* w6 B" u. k! H
    描述Jsp页面的五类脚本元素的功能、写法、并示例* E! g) P9 }9 ?- S* u
    注释 <%– –%>; ?! X4 m1 U0 D9 h7 Q4 I; [! a

    : e) Q* L, {( u<HTML>
    3 C+ E  ^  l  F5 q% J1 D' q! A+ r0 x( W! {* A& [2 _0 s3 j: E
    <%– scripting element –%>( G5 Z' v* D8 Q* Z
    + E% U; S* s5 A  {/ i3 [
    </HTML>' f% I* y9 C) X8 O- A; V( R

    # \; B6 ^, Z. ~2 b8 l. u3 b指令标记 <%@ %> 指令标记影响JSP页面的翻译阶段
    & @7 q3 ]3 d) x, @9 e7 F9 x4 L) H8 D. A2 e
    <%@ page session=”false” %>% ^1 s, ^' c1 R, H" Z

    * d' O" Y& D, V6 e8 |- P声明标记 <%! %> 声明标记允许JSP页面开发人员包含类级声明9 k1 J  l; R7 q8 q9 z1 P" s7 @
    " {8 u4 W2 D9 J0 O9 S6 B7 u3 S
    <%! public static final String DEFAULT_NAME = “World”; %>" V" G4 }" p5 a" u" E$ C

    - n( H7 K( M2 Q- v0 D2 S2 O, W4 D    脚本标记 <% %> 脚本标记允许JSP页面开发人员在_jspService方法中包含任意的Java代码0 V* `' L0 |2 g# R8 _0 }0 ^
    6 V2 Z- K. v# g% V/ r
        <% int i = 0; %>9 n' g7 w5 s5 C2 R* c  E3 O6 l! ]
    / H: u+ v$ o5 @$ P3 n- @' H
    表达式标记 <%= %> 表达式标记封装Java运行时的表达式,其值被送至HTTP响应流 <B>Ten is <%= (2 * 5) %></B>
    3 j5 ?1 c; k$ {% F4 O- C" A( [2 m  B: f  g: J6 w5 n2 M. e, \$ P
    : N4 _# ~0 |0 l" a9 z

    7 @+ h% k* M) m! L7 O7 g" g描述Jsp页面中的注释种类和写法" {- {# H7 V* ^" h
    HTML注释/ J- p  \/ I1 ~5 k, l: F/ p. c

    : q) n1 s" @- F<!– HTML注释显示在响应中 –>" I# s5 D6 b2 ?* W0 {

    " ^( M! L$ b7 L$ i& i) w5 S; QJSP页面注释
    2 ~9 g" |% I* \( T$ Y# l; h+ J" X% P' d; T8 u
    <%– JSP注释只在JSP代码中可见,不显示在servlet代码或响应中。–%>
    : ?* G- p& `; P! Y/ m3 o- X0 t9 y+ Y/ l" ^
    Java注释
    & p: N8 p4 L* y% @5 {! R2 ~
    ; W6 O) x, ]8 E, P4 o/ r! Q<%
    7 W8 \' E- ^8 W- q0 C6 ~/ J4 H0 D/ o& W
    /* Java注释显示在servlet代码中,不显示在响应中7 R) b( j5 O5 H* L7 r) I4 n
    5 F  b$ f, Z4 m0 O9 c8 U" V
    */; A: @: I! o# u0 F4 r+ C! J
    5 r4 z/ K9 p, a: B1 x! ]
    %>$ p5 ~7 F9 S. o2 l, a8 B
    1 o5 ]" U7 k: b4 m, c
    3 n. m8 G% K' J
    - M; @5 h8 U& G: |5 s' ?
    描述Jsp页面的指令标记的功能、写法、并示例
    2 c' s9 }: Q  K1 H. W5 n& v指令标记影响JSP页面的翻译阶段
    $ I2 }# \3 I" I/ `  b3 y
    : [& E# R2 ~. ^( @2 _. X0 p<%@ page session=”false” %>2 j: h! q8 F5 k. D7 b7 t. v

    / R. ]6 ]( y3 F6 i9 I5 F( A<%@ include file=”incl/copyright.html” %>1 U7 E6 U' e# F% K2 m

    9 N" c2 Y4 k" M3 h7 @0 G, G<%@ taglib %>1 ]+ D0 R( o. M2 `: H* A

    2 O3 g* c5 q9 x5 r% J3 w $ q6 |/ {6 b0 w' q' @6 J+ u

    * a" A" _5 l! X# ^" [4 {: A描述Jsp页面的声明标记的功能、写法、并示例+ p) v; w$ [# ^' p0 Q9 e1 Q
    声明标记允许JSP页面开发人员包含类级声明3 l  G* T3 M9 B8 Z! v" h* q# j
    ( C$ A% ?2 \6 a. ~- i' {
    写法:3 @+ D+ N- e  ^: T/ k6 \) Q

    6 v  ~, h. _. I4 u1 z. ~! v; Z3 K; V<%! JavaClassDeclaration %>: ~# {" t. n; b0 H; R  ]% e1 x
    8 I& O1 l/ C$ I. A# v
    例:* Y3 u, r5 X( u' t6 e

    & c+ ?5 D* D7 y# M4 j3 K/ w% K<%! public static final String DEFAULT_NAME = “World”; %>
    ! z& c7 d2 H- _& K
    " ~  W  J, d. N( K: M8 s( g<%! public String getName(HttpServletRequest request) {
    ! _+ S  E2 R6 p6 q# {' c  l, l
    return request.getParameter(“name”);1 H& ?1 ]8 P2 {+ ^7 w
    , J2 M8 \+ i, ^2 P) x- f
    }
      T5 e9 @' ~: x( Q" k% q% j
    4 Q  w9 g/ k$ i2 D, y  A( {%>
    ! v/ V: L& R4 U; d
    + G: M, Q) T; \, }: c4 C# e# {$ k8 V<%! int counter = 0; %>
    3 l- d  B( Y' m  \% k2 A/ q
    . K+ x. X" `. l& Z& {0 D" Q$ N $ G6 T& P2 F! \" k

    / n- V1 d: P% ~描述Jsp页面翻译成Servlet的规则
    / x7 }- x5 g& kjsp中的注释标记被翻译成Servlet类中的注释/ L( Q0 X. }' l4 r, M! Y  a+ x

    ; J) o2 w4 V3 [: B; u  ?2 rjsp中的指令标记被翻译成Servlet类中的import语句等9 B5 M8 ]+ o) M0 j

    / O% v( Z( y+ d# z" Ljsp中的声明标记被翻译成Servlet类中的属性
    ; V8 b$ W$ z5 I+ m0 e7 g( _% v4 h1 D6 Z8 `
    jsp中的脚本标记被转移到Servlet类中service方法中的代码( q8 j1 _# H! \, w

    7 d/ R6 V. L( H) M8 Z5 ^# Gjsp中的表达式标记被翻译成Serlvet类中的write()或者print()方法括号中的代码
    0 {3 v1 R# Z; p
    ! I) h% n2 V/ G2 t: C* l
    # s1 J2 G4 `* |- M9 b8 b( Q! |: m7 w3 B# S
    描述Jsp页面的九个预定义变量的功能、用法、并示例3 m& @$ g0 p9 |
    request 与请求相关的HttpServletRequest对象
    5 N5 x: |4 h" n# R2 G% U- @( E% [1 p0 r; m1 r+ Y
    response 与送回浏览器的响应相关的HttpServletResponse对象: ?7 s+ u9 ?0 h: {* p( L/ r3 U3 C

    % F# j6 g" p( w' i% z5 F% Fout 与响应的输出流相关的JspWriter对象5 B, F' T! K) {  Y) }* N/ w
    7 Z7 p0 U+ B/ r0 N8 H
        session 与给定用户请求会话相关的HttpSession对象,该变量只在JSP页面参
    ! O  Y! R) P) n# i& Z  v7 J
    & |; o. `/ L) d' o9 {( O与一个HTTP会话时有意义- p& c0 ]) u+ @4 c

    % d2 i% @: i, q    application 用于Web应用的ServletContext对象
    ) K# M; M* B& m6 ]2 c0 E0 l$ n6 u( ~) n+ q2 W6 C
    config 与该JSP页面的servlet相关的ServletConfig对象
    * X( Y5 X- c/ c9 J& G- F7 m$ q) N! \) w& U: ^  _
    pageContext 该对象封装了一个JSP页面请求的环境
    ! j3 l. R  e7 e( g& y% x# T- H, R
    page 该变量与Java编程语言中的this变量等价
    ' R9 Y- D. O3 H- n
    , N! [: n! j( A9 t    exception 由其它JSP页面抛出的Throwable对象,该变量只在”JSP错误页面”中可用+ l" @0 j0 [8 U

    ' Q8 u; v+ x1 O! K; T( K& J/ \9 R ! H% E' b+ q4 q! J2 N  @$ y( B

    . q1 f+ B1 r" k9 Jpage指令的功能,写法、并示例,并描述它的如下属性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding; Q/ g+ k$ a: ]
    import import 定义了一组servlet类定义必须导入的类和包,值是一个由
    % x0 M6 C2 U: N4 \, f7 L5 {* j& e
    逗号分隔的完全类名或包的列表。  P( C& b/ l& n# n

    , I( e, V; }" _/ k7 z- |session session 定义JSP页面是否参与HTTP会话,值可以为true(缺省)$ e1 ^( n6 \9 W$ m

    * [6 y0 E" |0 [, h4 k, x+ k或false。3 W% g4 h5 ]. C- B4 c# f9 C6 Z! \

    4 v& f; j3 P- obuffer buffer 定义用于输出流(JspWriter对象)的缓冲区大小,值可以为( X% s2 A* X# @8 T. ]" z6 n

    + Y% {/ X  _1 a: b1 ]" Qnone或Nkb,缺省为8KB或更大。
    * W  J0 Q# U0 \! x" E& h, G6 @- S$ P* {
    errorPage 用来指定由另一个jsp页面来处理所有该页面抛出的异常
    ) p, p; n, R! Z( N0 h7 V3 H, c# n2 C5 M3 K% c  h
    isErrorPage 定义JSP页面为其它JSP页面errorPage属性的目标,值为true或, T5 X. x8 i; S. o+ U
    2 K$ r0 G# t# e# }0 O4 s
    false(缺省)。
    0 W* g! _" A- p% W
    $ Z7 c0 ]& [" n  m$ j; AContentType 定义输出流的MIME类型,缺省为text/html。1 S: r# A( E# `4 C4 @( V& W

    - J# B( h. n3 f% c. EpageEncoding 定义输出流的字符编码,缺省为ISO-8859-15 n2 g/ q1 w( J8 t) X
    $ W" w- J9 X9 c5 a! T# U! B9 w
    . u( g4 L: @& Q% J9 e

    * n8 N; o% M, r* V描述MVC各部分的功能?MVC的优点?MVC的缺点?  t6 e, b; d+ X
    MVC各部分的功能:; I4 g2 C( {1 r  _( U9 \- T
    " H) `' k1 g( S$ x
    Model(模型表示企业数据和业务逻辑)( W) R, l( ^: I1 ~
    # D8 d1 m4 P- q# Z1 B) t0 k6 S
    封装应用状态
    : E& ^! r$ U# E
    9 A( Z  Y$ H9 J# b0 G9 ?响应状态查询+ ~  {, w  z9 X& K# }

    ( A" W6 t. Y8 z, O暴露应用的功能
    , j5 F- A. N1 u& Q& S2 c: j. @! g; l
    Controller(控制器接受用户的输入并调用模型和视图去完成用户的需求)2 z( m9 Y; m( w2 [! |

    " z, ], @3 D4 O" @" H( M1 A验证HTTP请求的数据5 |& B9 E! K" L, f0 J6 q
      t, {  c7 Q" ?( z: S$ d8 L
    将用户数据与模型的更新相映射, K3 `" ~8 \3 q$ E( C

    ' i: T& r6 \( z; q! V7 ]选择用于响应的视图+ ^( h# t: |. {
    6 j2 n/ o0 ^0 u
    View(视图是用户看到并与之交互的界面)2 K2 ~+ Z  T) q2 K! Z. w2 ?0 D4 K
    2 a& Q# M; o9 w8 ~+ s
    产生HTML响应7 k$ B5 ]% w% m! q, u# R$ @

    + k0 s% N! x8 D请求模型的更新8 n! [5 f3 ]8 ]8 L) Q5 V
    5 v0 W0 R/ ^8 |6 |
    提供HTML form用于用户请求$ I* D" i, W: F3 \0 V6 J0 O

    * l9 P" g) ?; u' F2 BMVC的优点:, v, o3 Q8 b2 A2 r+ s

    : V4 h7 }6 J4 ^6 |6 e. K7 j        低耦合性:视图层和业务层分离' Z" w2 v2 ^1 ^4 j9 {9 d% N
    " {" b1 i; ]) l8 c  T- T( m
    高重用性和可适用性5 N) A9 F5 K7 F( G2 J

    / @/ R% m8 r, `3 j$ }* X* M) ~较低的生命周期成本
    5 L& b& r- D+ b% K4 \% Y$ _& ~  }, I2 T6 {
    快速的部署
    7 o% \6 v% a5 o8 e1 e5 b/ Y
    ) X4 C: j) B5 |2 K' N可维护性
    ) R! C$ }; T4 Z3 i. {7 Y  z
    # B: C  ]& Y( h% N! e有利于软件工程化管理
    $ j( ]: i5 ?6 A8 {/ T1 r7 H5 N2 N. W: k6 i5 a4 K
    提高软件的健壮性$ z6 y9 P4 B( x* M
    / P# P0 B5 b: ~  x3 g- t; o# B
    MVC的缺点:
    / L4 t2 X5 c$ o7 j) @3 v% o- A) S0 t! t
            工作量大,增加工作的复杂性,MVC不适合小型甚至中等规模的应用程序) c- a7 P- E) Q+ x  h

    3 x0 `/ _) N# \! _% {
    8 E) C  G. y& h/ T( |  K" I
    % ?! _; Y' ^! f, m什么是Model 1结构,以及结构中各部分的功能& G, j5 }$ _0 Z- S' ^
    结构:jsp+javabean
    ' t% G% a+ B* C& |$ P* U9 l) Q
    ; w1 n/ `3 v9 y' iModel1中使用jsp来处理web应用中的视图控制部分) h: K) Y9 g" S  c

    + [" Z1 Z" o4 W# g) p" ZJavabean收集参数
    ( I6 H2 ~$ C( l* v7 F0 w' ]
    5 U: l. R0 c7 W
    / c5 W' w5 T: E; J2 P9 a! O# u/ [5 [9 L
    什么是JavaBean?) c; Z( r* i# h0 t$ @9 I6 u) S9 q
    用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。0 Q4 L! W+ d5 a: G' ~
    ; G! S! l8 q  J4 y4 [6 k7 v( P
    : z8 H3 }, y! {$ z0 ?+ c& h

    9 V$ Y, ~9 y$ [3 K, rJavaBean的规则?
    ! A; b- d, l. L$ B$ c" l使用get和set方法定义属性% m. K6 S: E6 |
    : E8 W3 q( d/ v9 X
    一个无参构造方法
    " g1 i$ Z9 y3 m8 k1 z$ A; `9 L; D' H; j9 D" j
    无public实例变量( 所有属性私有化)
    9 i5 M3 K8 H0 ~3 [+ ]. }7 W! X2 W# d4 [9 y

    / E/ n' {+ A' H6 }
    5 W( ?5 F) N# Q4 a% i什么是jsp标准动作?包含那些?分别都是什么功能?如何使用?
    % j9 k8 E! w$ p1 c. |7 H& j+ SJSP页面中使用类似于XML的标记表示运行时的动作" |) U6 T9 M6 W$ N: i! u

    # Z; @8 a  Q9 G) P) Wjsp:useBean
    " n5 ?# I8 a( ^( D: v1 w4 u5 u3 Z, b4 U) y( u) R/ n
    jsp:setProperty) ^* g2 N) u6 ^$ _
    6 U7 d) ?$ |; x# i
    jsp:getProperty
    7 d3 k5 a2 z# t5 l3 m8 }
    6 N5 N* G9 u& n% Q! E' zjsp:param' D8 j5 `$ W8 \$ G
    / g! c' h# u+ [4 o1 A, Z
    jsp:include
    7 O. `* `! |0 |. M6 W
    + U# w, l5 @; K8 P& M$ Qjsp:forward0 Z8 f+ w7 o( {' l$ f# v7 U
    & q3 G* N2 Q, |2 N' d
    # I6 t6 t& N( C/ x! P# |; s

    ! A! r1 I  S9 {* C/ b6 j用代码示例如下标准动作的使用:useBean、getProperty、setProperty+ T$ K/ K; }4 p
    <jsp:useBean' h& Y2 U. R. q) f! `& H0 B; e. Q6 x! r
    ( [6 Z" M' T/ c( |7 ]
    id=”myForms”) B, v2 c" D7 e9 \

    ( y/ J% s: k) N5 T- F0 q% Gclass=”com.base.mystruts.forms.MyActionForm” scope=”session” />& k9 d# ~# T  _! r# {1 ^
    : q' Y! @7 b( l. Y% v7 @
        <jsp:setProperty name=”myForms” property=”name” />
    % \/ D6 L2 t- V; ^$ x" n  P) m6 \- j
    <jsp:getProperty name=”myForms” property=”id” />8 W% O: j* l; O" ?

      h: _4 P7 {' N6 {/ Z, J * I% }8 e/ a/ l. L$ t7 J7 b
    : ^  F6 \& i& U2 |. i  g- ^
    描述说明Bean的四种scope/ n0 @! K0 `5 d( @' l. K
    page5 u5 _6 T0 @$ ~  L: u) L4 R
    ; {+ k0 v& ]" C* K
    request! A4 c# _- P6 T( q7 v0 K7 a& p0 p
    4 d. b% M$ D+ e  k
    session7 t- a7 ^4 J5 D
    . U) F' @: U- \! e2 `9 a& `# F' X
    application4 g% c  p) O/ o. K# C# I6 o

    / U, @4 V* _. x) r- m* ^1 D 1 C" z: T& s5 @7 Y2 v4 _
    . V8 \8 K" @6 J8 g
    描述说明页面上的字段和Bean中属性的对应规则& \/ S6 D' K  }. ]% D" r, ]
    id 指javabean的变量名9 V$ T. Z: f) V+ l+ [3 y

    7 n1 {" W; X3 O0 k! }class指javabean类的全路径
    6 h! n# ~% }* ]( r4 U4 [
    " F) X- D3 s8 @- {! h+ R+ Oscope指javabean的应用范围
    6 A" E$ h. z; y/ @9 k( S$ v2 O: p! U) s
    name指所用到的javabean的变量名
    / [/ o0 a3 X1 v6 ?
    * e6 Z. f2 }9 T% u, [, T" w    property指javabean中的属性. ^7 A! B3 B- \) u" |6 t1 _

    9 w$ W2 R7 H) G- k( R
    & y! P9 s6 ?/ ?7 I7 O2 N. e/ m% @) f! Q5 Z$ b
    描述useBean动作的处理过程; v' j0 f( V$ j. d4 {' F. n
    使用id声明变量+ Y8 Y+ s$ P  l$ O  E; b

      f( A1 @& b/ s$ U' K, G- o* M试图在指定的范围内查找对象
    ( d3 ?4 ^9 g& d9 m8 j9 w6 j2 ]/ B; \  Z
    如果没找到  @3 F4 l: x+ n$ z

    & B: H5 E" j' Y+ ?7 u! m. _创建一个类的实例1 y: h% e' a" x! ~

    " ~1 W  Q- d8 E7 s5 W执行useBean标记体初始化对象/ Q# _8 e& L4 `+ g2 Z+ b# K

    6 y# ^2 a/ |* l3 X% g" v$ e如果找到
    ! P& P% L/ a' m7 \9 x1 C) ?- U! @  _8 w- e9 _8 _
         将对象转换为类指定的类型) [  D9 ]- F/ D$ e, P6 e& Q
    - N5 k6 P) k  \+ s2 ~7 @

    9 j8 p1 @7 e0 i" d7 E/ K1 a% A0 \& X4 j7 j# P; z! e8 J% V7 `
    描述forward动作的功能
    & j+ u- n7 H. e* P) ]6 ]) C使用脚本代码处理请求时,可用jsp:forward 动作产生一个不同的视图,
    . F: ^9 S/ Z: R' z8 H/ y( \- K0 U4 A9 M' v3 L' `  ~! x: ]. Q
    使用同一个request:
    0 R  i! ^: I7 {" B/ Y
    " D. [" F+ J4 F5 u+ `) `* ? ! l3 e  p3 p  S9 |( B) G3 t  [- Z
    1 Z! t) j6 S9 G2 s# P5 p
    什么是Model 2结构,以及结构中各部分的功能
    8 c, a0 R2 I( ], kjsp+model+servlet
    4 H9 H% L) b8 M. f, _+ L1 h, d" k' H7 S# U6 K% E* f
    Model 2架构使用MVC模式,JSP页面充当视图,Servlet充当控制器+ x/ k; ^: M7 g8 e. N- x

    ( {, C4 G& r1 m0 s1 [+ O9 p9 pServlet控制器:7 d" ^0 F& ^0 O3 v( [7 z0 G

    # }0 }9 E4 b1 t$ I: a3 i验证HTML form数据
    6 U1 v. c1 m1 a" t: D" C
    # M  I; M( ^5 V+ c7 e0 |) `调用模型中的业务服务& K5 m6 `9 U8 H! a: V

    # M4 M. W$ Q  l存储请求(或会话)范围内的域对象/ |3 E: r; y- g2 ^$ D

      j6 D, p& |5 `9 y* r, P选择下一个用户的视图
    4 B3 h/ C  t; w& ~- f" a! n
    + q1 A0 \  ~, R8 G) e3 s! h) MJSP页面视图:
    4 J" g8 L$ C, a) S% n5 m
    * B. F! U- d9 z! Y) p1 x* d5 x% C  ^使用用户界面(在HTML中)' E! J  j! J: @. I$ E

    ; f& L# z. ~! L# E- X2 U& z3 F        访问域对象
    . n" V  E4 k% a4 S
    : i( V% T: ~, b7 b
    & b  f4 F% ?* r% w3 t) R* M5 o: ^% l9 U' J; G/ x* O
    如何获得分发器?分发器的功能?
    & ]* d, ?+ ~, Q6 s6 ^上下文对象中的分发器:/ v  f3 x$ i7 N0 b8 W) I; }

    - F3 l3 h0 h; r+ d# FServletContext context = this.getServletContext();" e6 ~# ?+ ~" L4 V/ x; i3 X4 H% s

    : R8 f/ ~$ c" f# O9 GRequestDispatcher servlet = context.getNamedDispatcher(“MyServlet”);
    ( _5 Z: X! D1 O) Q
    - h, Z. }6 n# g  B( aservlet.forward(request, response);
    ) C) M( j  t5 y3 a% c8 y! p4 \: X
    ' r% R% P. S) d) C请求对象中的分发器:. N+ `0 k& j& E+ ^5 x

    : l9 y/ P: Q- P) M5 Y) jRequestDispatcher view = request.getRequestDispatcher(“tools/nails.jsp”);4 v7 b' }7 t8 G

    : P( {* |* `, D7 `' [4 |* V6 D% D4 |5 c& Fview.forward(request, response);2 ]+ U0 y  J+ Z4 z7 m( I, x

    ! I1 A# V5 e$ O' B3 Y3 }' t可以将请求转发到另一个jsp页面,并保持请求的传递性$ k3 v0 m+ D1 Y! d$ ^# F" e

    : Y6 w9 o4 d. A" w
      _$ L7 j8 o) o3 Y1 E( P8 o) u# N* v* `2 [7 a8 {+ K! L0 z$ q5 n
    Jsp中页面跳转的两种方式?. i8 Q: d; e8 b5 W3 ]
    使用分发器跳转页面
    , }/ Y' A1 `* V7 P4 d. J3 u( C2 kRequestDispatcher dispatcher = request.getRequestDispatcher(“url”);7 i8 C& J0 }+ M# k3 I! H
    ) G- n6 M2 ]  G) Z6 N4 R/ k8 |" m
    dispatcher.forword(request);5 T  o1 Y: T0 m" S* Y3 R

    ( m+ _1 T  c3 Z# E! ]  f2 `% j5 I    特点:保持请求的传递(上一次请求中的数据,在下一个请求中仍然可以得到);
    " w3 _! h% C5 g( ]- o' @1 z, ~- O+ \+ n4 a
            转发的页面只能是同一个Web应用程序的其他Web组件' o  H+ T. \4 V% O1 ^
    . y  m. [) R$ j: G& H& m8 |
    使用重定向跳转页面3 S. d3 K( C3 e1 q( A9 }
    response.sendRedirect(“url”);) o5 W4 O" O" r: m$ N, R; L

    ( @+ Z: E7 d: O6 J! f    特点:产生全新的请求,(上一次请求中的数据,在下一个请求中不能得到);
    $ A) }+ o/ U: E% W' ^$ S  W+ X+ n7 K; n/ @( T
            重新定向的页面可以是任意的URL4 W9 \2 N% |  v
    0 {. V. s# Q  ]" u+ I5 Y5 r
    ( v0 M' _: O7 F" x. N/ M

    ( T# w( N' s* q3 d' s' m; g) K描述Jsp中引入另外页面的两种方法,并比较两种方法的特点?5 b6 V- \) M5 K; C
    <%@ include file=””%> 在编译期间把另一个页面完全嵌入这个页面,可以说是一个页面
    9 @* H8 n, N( E6 P0 d+ U2 G# G
    # k$ y0 I/ q5 @& {" ^  F& E在这里可以共享变量4 e9 q0 @3 L( g4 _" s: a7 c

    ; _7 x5 }7 g% m- }& {! P; C, W<jsp:include page=””> 动态的再运行期间把另一个页面加入这个页面,可以说是两个+ u. A  p9 ~) z& W, u

    * j/ J: z3 A* C& o4 ]页面,不可以共享变量4 a% _3 F/ q/ |! t7 u* G
    0 V, R! @: W- _4 o/ }: Z+ J
    ! C; o- `* w: l, @# A: {
    % m& Q: Q  d- [3 g
    什么是自定义标记* S0 S; Y6 P3 C5 r) E$ n& Z* {6 r+ o7 X& A
    自定义标记库是一个Web组件," v' w" p3 Z# J
    ; Y$ V6 b: f% O# m  I$ D' J
    包括:
    9 {" r& X4 d  M9 }1 r
    $ x2 J2 ?  u/ X* ^' a一个标记库描述符文件(*.tld)
    / K5 }3 f7 I% N) ?2 I& I' m) V$ O' e: i9 O5 I- ]
    所有相关的标记处理器类(*.jar), k! v0 z5 {' k, i3 C

    0 \0 Y; \: j( R/ i7 Q& z 7 z& `, e; |1 `  G

    / x1 l; s! x: C% S% F% C% J9 F描述使用自定义标记的步骤,以及每步详细的工作# r) Y/ h5 L4 R1 k& N3 c3 @
    使用自定义标记前,要拿到.tld和.jar两类文件
    5 `# E4 O# ?, p1 t
    ( A) S, U* a3 B; w  Z( [把.jar文件放到WEB-INF的lib里面。
    ! w8 w7 q( I' G把.tld文件放到WEB-INF根目录下。, w% V/ [: }# `) k  O" E2 G
    在web.xml中配置。
    7 P- z$ G8 Q. f  i2 B. p! z<taglib>
    9 ?$ `# @4 `% w5 a, l$ e5 @
    9 ^( U, B1 l1 Y2 ?( A4 R<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>5 A# d% K2 E9 @0 h' X
    ) g0 M1 j: F: E
         <taglib-location>/WEB-INF/c.tld</taglib-location>
    2 q/ o7 v' b* B" F8 G$ R( o0 ?) H& U& t7 c# e  i$ g
    </taglib>  G7 i. H4 E. ?% P+ v
    % p; o# s1 {! {, ]
    在页面中引用。+ S' I1 f8 u" N1 N/ ~( }9 w
    <%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“s”%>
      U  d0 e4 S2 E4 e* b# b3 {( C) O: m7 s- V
    uri必须与web.xml中的uri对应, ~/ d5 r7 V/ n! X0 E3 ]
    : u; Q1 |3 i6 X! n& ^) [
    prefix是前缀,用来区分是哪一个taglib
    1 ^* o% p' g' x5 H. r
    $ y! K9 b* F5 h" k! \6 C% e2 @6 Q使用标记
    ' L- \* y6 y8 t  ]0 p; _7 A格式:<prefix:tag名称 属性>: L) ^- b) z% h& L* v
    & s$ ^) j: T9 Q  l
    <s:forEach >
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    14#
    发表于 2014-12-03 12:45:59 |只看该作者
    在tomcat下配置数据源
    ' H9 u& n6 p) W( ^* y$ t- l, f1、服务器与数据库的连接
    4 i8 f: g; s3 }
    " I! G) u+ O6 t4 j配置server.xml文件
    5 S* h' R7 F$ S1 y7 _* N+ F$ y/ r! G( Z1 h6 a' A' U
    1.oracle
    9 b5 Y* V* A# |' {8 v
    + S0 X* c* F( ^; E3 i; E<Resource name=”jdbc/company” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”. q* {1 _5 N9 ^6 t7 L: \

    ; e! R) P2 I2 J" |$ _! L                        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”% u0 x& `* a9 M4 Z: d/ u$ R
    2 z4 d( ^8 R7 m+ ]
    url=”jdbcracle:thin127.0.0.1:1521rcl”
    7 X5 i' [' R/ y7 {' f2 \( w
    * D  {9 P& Z, ]5 |) ]) `* ?+ f1 jdriverClassName=”oracle.jdbc.driver.OracleDriver”
    + z& Q4 K1 a: p8 }$ `
    ' }0 U( Y' N! Dusername=”aa”
    9 a5 K" Q  z5 J  h2 m" ~* ?$ q9 p4 z0 h0 i: q
    password=”aa”
    * `/ ?# ^6 U7 J& E1 H& C& e/ B0 b: m% d/ `$ Q
    maxActive=”50″
    8 b9 `* O& G% s% L  c; J7 `+ W( m" r
    maxIdle=”10″
    + ]" m- t/ v9 e+ M, E  e% J0 C% b" G8 C1 I0 `- k: O% R: o
    maxWait=”-1″+ p8 \4 P+ Y5 d# P$ \

    ! {* P" G% l( h! H/>. v& S7 G% i  V+ @" h

    4 |! ]  A3 N  F3 a0 B1 L+ W2.sqlserver6 Y- z; }; y" \& Y2 o# C1 ?/ K: I
    - a9 ^, E5 k7 n" Z
    <Resource name=”jdbc/webpage” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
    1 v; |. i  k' C# s- h' W# g  {+ V/ {- Z# B# A
            factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”2 `. \5 Q! b5 R: M3 v
    ' T" B& K  L5 D( u% y: b5 L
    url=”jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;
    3 v7 K) z# P% [/ z& f' P/ ~- M& Q/ M. ^4 S8 i3 R
    DatabaseName=webpagetest”
    2 C* y9 ^$ D( {0 K6 R- |  L. V
    , Q* V; i1 A8 e, Q5 SdriverClassName=”net.sourceforge.jtds.jdbc.Driver”# z  x" d+ A% b/ p% t
    / D' }5 W0 p! r8 w0 R
    username=”aa”
    + O- n' u2 t8 R; g0 t( v8 u
    & f. m0 g! z$ S2 M- G( x$ cpassword=”aa”
    ( o. X& k$ b. r& S4 _8 P5 J/ ~  h9 i* X4 Z" a
    maxActive=”50″
    1 Q9 f9 E3 I, H, f$ ]8 k6 a
    ; J9 Q) j- U7 i) X2 r: C$ Z0 fmaxIdle=”10″
    . L6 ~! T+ p- X0 c9 F
    8 _* J5 q/ H) I6 ~! ~7 GmaxWait=”-1″
    * q7 {! r4 r% y- _" L: P) J% t$ C. ~1 N" \% Q9 V* C6 Y9 N6 Q
    />  Q7 _/ }  h$ X0 L2 n

    . H$ k5 Q4 @( i: A) g2、配置自己的web应用的xml文件
    3 g" Y6 D" e$ U$ l8 k" c4 f) {
    $ x7 K& l2 Z1 J$ A
      v, L$ i3 E) a/ m9 F4 A" S7 F& M8 y9 z+ L; F: d. n
    <Context path=”/eb03web” docBase=”F:/workweb/eb03web”
    6 r0 `+ t+ A8 h- P+ \" ^( J; l: q( M& {, _
    privileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>
    : p5 o+ V) v& N6 h6 |+ v, ?7 k8 z. j/ }9 H( ^% r
    <ResourceLink global=”jdbc/company” name=”jdbc/company” type=”javax.sql.DataSource”/>
    / L: w% t  m+ Q: M- f6 A1 O% P1 @' `, I+ \* F
    </Context>
    1 i1 {# U5 M3 ?7 z# D3 }8 c( y$ E) R
      w9 k) q- `% G2 Z9 G2 f 4 n- _2 F+ x* [) S

    1 U5 I* {6 }, L( j1 Z5 w/ w, s, k+ x3、配置web.xml文件
    # N# i9 h  C! p8 [+ o. Y9 o
    " ?8 J1 U( `* b2 H4 n) P% A. T与服务器建立连接' s2 s# J' V- W. I

    / s0 F0 J8 A. L$ P0 I<resource-ref>; v' u% @8 O9 E% _
    + G- [& r0 [: Y) i! K3 ^; Q
    <res-ref-name>jdbc/company</res-ref-name>/ \* d- T$ J, q0 u1 g0 _6 @
    2 O" ^, c9 h# p7 T- a
    <res-type>javax.sql.DataSource</res-type>+ n7 d6 D3 A% U2 Y! K5 |0 t
    $ L: D* F; V# t
    <res-auth>Container</res-auth>9 V% P2 j, N5 I# ~8 u
    % ]. H' w: |1 x- V0 O0 ~
    </resource-ref>4 p) p; L" `% e* e7 |4 e
    " S/ J1 ~1 h$ B( W
    4、在应用程序中不直接与数据库连接,通过DataSource连接池建立连接
    , j! t1 b8 s( D2 ?* L1 I$ c: W' e8 V  H
    //1.在程序单独用时设置系统的属性,在tomcat下可以不用配置,
    8 B) o$ f: k9 i  H5 K, T7 c7 g' q! K$ @
    System.setProperty(Context.PROVIDER_URL,””);0 I( D% b% X" E5 B: M

    6 ~* g' p" y* p: o9 NSystem.setProperty(Context.INITIAL_CONTEXT_FACTORY,””);
    . L- K- E2 p; X1 s. A1 R
    8 n! X$ U0 D8 _3 R# e- M7 ~//2.创建一个上下文对象7 [, a# G4 R8 Q: v! a, M

    8 n& F. I3 w+ V& M% i; ZInitialContext context = new InitialContext();
    + g. J) z$ o: M& Q" u* V: g3 e
    2 k4 h; Q% W# h  C6 }' v8 F//3.通过上下文对象在连接池中查找DataSource
    " ^* D) o$ V" i* v$ m
    2 p& \: T6 b. A) ^2 wDataSource ds = (DataSource)context.lookUp(“java:comp/env/jdbc/company”);/ s' a. @9 x. J  M' b

    & x. S7 L9 X) d4 H1 S//4.通过数据源建立连接6 T, I+ h8 c( Z; _  |
    7 s  _' n6 ?! a2 G
    ds.getConnection();
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    15#
    发表于 2014-12-03 12:46:30 |只看该作者
    ORM对象关系型数据库映射1 {7 D) B( O+ H
    (Object Relation Mapping)5 I+ r8 [7 a6 ^0 \& v+ q. Z
    + k  \6 u2 P; r2 \4 q
    一、映射的特点
    ' _: z5 z* i+ k8 g  @4 [& X
    0 g# e5 l2 Q9 G. E: S2 w3 o1.一个对象可以对应多个表
    1 ^0 \$ k+ i9 c9 c  q1 h; T. P! M2 M  ?1 k) ^4 G. J; B
    2.一个表可以对应多个对象0 I/ |) r9 G* D5 H1 p. K
    0 u' _( u1 W9 w2 L
    3.对象和表的关系不用完全对应
    - c" z+ _* l9 u; A( y
    , M" y5 k( T# h" y4.对象的属性的名称和表字段的名称可以不同
    / E3 r( o4 ~2 Y! D) D" Q, D" \; m/ f7 x$ f- r
    5.类型可以不同,但数据类型之间可以转换
    ! D5 u; L8 p# ]$ C
    + }5 i' {1 M: ]6 E) Y% C6.对象中必须有主键,数据库的表对主键无所谓
    0 P' }- ?& h  L: e
    * J/ M$ P( Z  k' s; c( b& R7.数据库中有主外键关系时,对象中可以有,也可以没有  {  ?9 O0 o+ k3 ?

    $ u; `" x5 l/ F / s* i" M3 u$ Z+ {

    : B- G8 A8 d8 `8 `二 、有一个映射的描述文件————>xml% n, p  @! N& [7 u! ?/ I

    / k3 Y+ u% h& ~' I' O! \" w三 、怎样实现描述文件————>一段程序
    : b# r+ N  c" S0 ?9 l/ [" P/ n; }8 o5 r. w! H, k
    对象 映射(mapping) 数据库
    # q' F# i. h8 I3 u1 c! `& {$ P( Y6 q8 h& p/ Q" k# Y3 b
    user
    8 j9 _; n, e6 m, |( f- U3 H8 p( G' x( Y2 C5 w! A
    id=11
    + a7 T+ [; h; o  u, N- N# r
      c- Y2 I9 G4 U8 jname=”张三”———— > (1) —————> tbl_user(id,name,age,tel,address)
    & d1 v* i& R2 o( G
    : o0 e. _; O  ]1 Q0 Lage=25 <————(2) <————7 x6 n0 U# M, a( Z: a

    5 b: o: Q7 c# ^  T+ @) Y" Q7 n% _
    2 b6 q* f+ ?+ G5 v/ y+ ^) ]  Z3 {% u- S0 Z" n; j
    (1)从对象映射到数据库7 o% r' w$ ]+ U' S8 l

    $ H% }  `( a8 y; {% n' t1.JDBC
    9 x- f6 C! m8 j! B0 `# V. F5 j/ s5 O* S: e
    2.根据描述文件来动态拼接sql
    * B* E: W, ~' u; V( N- t8 N1 R% K! i2 L4 z/ s( m
    3.执行,添加到数据库中( j$ ^! E3 J+ `- G, q3 m  f
    ! S, A$ X# l1 \9 i) N
    + K6 B; i) t: H7 p
    # e9 C8 @) P3 ^7 K, E
    (2)从数据库中映射到对象+ M8 P$ \6 {0 m7 Q- q
    0 c' w# Y' Q* P4 b- D
    1.JDBC
    7 P  Q1 ?" w+ U0 _: A5 A7 u: y. t1 }- g
    2.拼接查询sql
    + p; X7 L# ?8 ]# S6 T; m- l5 K5 o- c. n4 h) f2 {0 D' `
    3.ResultSet
    7 ^9 z# A. A3 d& `  y9 Y% h% |5 a- U2 `$ P
    4.Model ! k" b  w6 [# u& c( x
    7 ^7 Z# p/ m: H9 O2 k  }

    4 u" F- p7 G0 w! |5 H6 B0 W% H; @5 Z3 {
    hibernate
    1 g4 Z! R0 g1 L开发流程:3 M  n( }. X2 c( T! L8 @8 v
    9 j7 O" T# C5 J) q; S* ^
    是什么?
    1 I3 L# n( `$ E; Nhibernate是一种基于orm 的轻量级的框架
    4 q4 F& p' @/ _7 H' G5 z- s
    , p- @% k  J' e: _- e5 {3 S4 I 4 s4 u( b! N: a! P4 C
    # B0 ^$ v" W; Z5 t! j$ [' B
    有什么?0 u, d& g7 y% l1 P- O
    1. session 保持连接状态(依赖事务和连接池)
    6 \+ w" }; E. |/ Q; n, w  u  t# C5 C! w! A
    2. Transaction事务
    1 o* [: |  c* b0 t
    0 I  B) \4 N; c+ |3 k8 _3.: h* ]9 j7 X; T2 O+ E1 f2 }
    Connection Provider 连接池
    2 M9 Y3 F9 H6 u7 z$ ~1 {% a0 W: s& V
    - i, S1 u. ?2 Y
    ! h6 {6 K! F5 n1 X2 m' R, W
    , i; }* H  Q* Q/ G能干什么?* b1 L5 \9 C/ \% b4 F
    1.orm9 P) R' Y% N  J' w4 j
    ' N( x" f1 X# k0 b$ E# K
    2.提供操作数据库的接口,简化数据持久化的编程任务+ a# I3 |$ f6 ^. m  F

    3 o9 M  z" H/ f/ s! R. g 7 ~/ s0 R$ R% \6 ]0 N2 K( M# I' z" h

    / ^; f: K6 U- {" ?3 b4 e怎么做?  ^1 A) u" x! _5 o, i' h" F
    1.搭建hibernate的运行环境,将hibernate的包和hibernate所需要的包拷贝到lib 文件夹下% c8 o9 k# M: k" \, ~+ G' Z
    ( n, j: H6 k$ u! o
    2.O(vo)
    , n5 o4 @  I4 k$ u: p2 d2 p  h1 E
    2 |- ^2 I1 U  f5 P8 {4 E! h5 n4 |3.R (关系型数据库中的表)& t$ _' G/ g/ L+ g2 J# Q, M
    8 p- H  B7 h$ n6 P" u- R
    4.配置文件0 k% z1 L$ k. c0 b- Q
    + t, @  B* Z5 k! }
    4.1 cfg.xml 放在classes根目录下,默认名字为hibernate.cfg.xml
    $ |8 ^  z( }2 d$ _
    8 q+ G- B* U; D' Y/ b% n$ Ga.与数据库的连接
    / U, x2 t; @# Z$ [: l+ ?& x
      ]0 ^4 a6 j& V4 db.可选配置9 ^& t0 C" C3 h# u% z% S
      E/ D; T1 T' o
    c.映射资源的注册
    , r# A5 E. K( H" O" V
    : d' f6 k* k2 u' e% W4.2 hbm.xml文件 名字与类名相同 并且与类放在一起2 J+ y' ~( y! c& e7 ?
    6 l& V( i, z  C$ j( C/ l# z' t$ t, S  y
    a. 对象与数据库表之间的映射3 N# K4 \; U0 M! c0 c/ ]& g. s+ e
    : e; i* c, o" L: ^/ m4 F' k/ p
    b. 对象的属性与数据库表的字段之间的映射/ T3 u0 c+ L1 i# r. I3 T8 o& L0 _
    9 U5 p/ h: `' m& h3 r2 \
    c.组件之间的映射
    $ O4 |$ \% s& [! G' a6 y) m% C' f# n- o0 `& ]8 b4 q/ P* v, t
    d.对象与对象之间的关系映射
    6 S0 B+ {% r: F* l, B0 C
    " M. H( `2 O+ L* u9 O$ T' I2 i5、客户端' b6 X( W" R' }, v9 W1 L' \; w
    3 Z. b3 f6 U9 R% \8 h( t$ q* }
    1.得到SessionFactory
    2 k- s) ^1 T5 \+ f1 G% U9 Q
    6 U$ _6 M# O, [4 S: {2.通过SessionFactory 工厂来创建Session实例
    . j. j; W7 p5 F, X) H
    ! I/ i4 ?, Y! i3.打开事务
    3 z* X# Y# [$ Y/ @8 M. x4 _/ _7 `1 e% t. e
    4.操作数据库/ X5 y/ M; O  ^, D9 E
    : O# ~, d2 D  M0 ^! T
    5.事务提交
    & h/ K0 s' v2 r. j, S! V6 f9 P( W  p
    6.关闭连接
    # z5 G. _3 y9 D
    2 [, V" V0 w7 z( P/ i2 M运行流程:* d/ y+ h) n7 L5 h

      t1 A# t1 r  f# R. s* |整体流程
    * N# ?* g9 r; l0 G1.通过configuration来读cfg.xml文件, }: r) Q/ V6 V

    7 u# w( B* E6 ~' V2 P9 J& f$ t. E2.得到SessionFactory 工厂(根据数据库的连接来创建sessionfactory)7 |% Q0 |0 z* T% X9 k

    # g  h; A# q+ }  H4 {1 p6 V3.通过SessionFactory 工厂来创建Session实例
    & o- T2 x8 x0 d* {( n; \( g" t0 K  h( f4 J
    4.打开事务
    6 x  C, p& V1 p, I" z4 N  M& F0 p
    5.通过session的api操作数据库( t( K! W6 A6 P/ Q* Z9 |' U
    + l% @1 Q2 S1 i# B" U
    6.事务提交
    ) z1 a5 l" R# g5 a" ~, V5 e; Z* {5 R0 X" b% m5 ~
    7.关闭连接6 N' x, X5 p- A' g- R

    2 L* U) k) H+ }
    6 @1 x5 N5 |9 ]9 M
    $ N. ~& b; y: s8 O- P. X' s1 ksave
    % m& D1 ]. n0 g2 f1.to—>po
    ' Q' @7 T1 {% h! T
    # J  y' t. C- v8 ~& |2.根据model和cfg.xml中映射文件的注册来找到hbm.xml文件
    : p6 }) b9 Q' L1 a, A2 \$ w3 z# v# Y* A
    3.根据hbm.xml文件和model来动态的拼sql
    1 k1 ~. V4 q0 s  u0 M# G# T0 Y- s$ {: o1 w9 _/ U( J. X
    4.客户端提交或者刷新内存
    + Y2 z. X7 b6 ]2 [2 Z, g( ^; n. |0 c
    5.执行sql,值放到数据库
    4 ^% \2 a5 e# F  D- t4 _; J" D/ }* \

    & H! S; B, C7 C) \
    6 s1 T, u( p9 C" Rupdate、delete
    3 g" A  k$ K( G3 ]( C1.根据model 的id在内存hibernate的缓存中查找该对象
    ( \# c- j% c. `3 Z6 x) B5 y; @4 m. G' E4 n# s- R
    如果内存中没有就到数据库中查找来保证对象的存在; h$ J1 c' c/ Y/ ^

    ( ?1 H" D  n* F, R' p2.根据model和cfg.xml文件中映射文件的注册来找到hbm.xml文件/ m2 F3 j9 u, D/ i! E& `

    3 n& u% w0 @, c8 a# Q$ A0 E3.根据model和hbm.xml 文件来动态拼sql4 b7 q  `/ x; f. [! v, E

    5 |9 @+ i& I2 [- J, Z4.客户端提交或者刷新内存
    2 R* O; S' X. j& V
    * c2 z, g% _, W' c) v9 e5.执行sql: Q( E( Z6 S- \9 R; C6 u
    0 E- `3 T  f+ k9 q. ?. H
    , ]- S& w6 F, i& F9 T) P& P: {0 ]% I
    - b' @# t4 l% ]+ D; Z+ c
    Query; y6 [8 X: ]( f- H( T4 i1 Y. S( K  a# l
    load
    * L" X+ m. a0 x2 r+ ~
      F6 d0 C: h& d  F' o* d1.根据model的类型来找到hbm.xml文件! [6 x4 V/ I4 U# G7 ]

    3 I/ A2 ]9 v" a* s5 N5 _6 x' L2.判断id对应的对象在缓存中是否存在,如果存在,就直接使用,如果不存在就进行下一步。
    ( ~; e: K$ c' G( R
    , E9 ^7 N/ S5 f& d- t( p3.用id做为查询条件来动态拼sql% e, a# {7 n# B
    % v+ O, _  H, ]* Y- j; m4 t6 M4 M
    4.执行sql 查询(先在内存中查找,如果没有找到(会抛出例外),就去数据库中查找)
    9 G3 w  g. Y& M
    , K$ {/ T( n) y8 r, i: S5.返回一个model类型的对象; U" m# G. C0 U" F9 i9 R; i

    - g; K& t# N- b. N: Pget! q/ t4 I! O% H$ K; i# Z" _5 Y: o
    , i3 d+ _% ^. |( g, t
        1.根据model的类型来找到hbm.xml文件
    4 u# P( g( C" X2 U
    % K0 V/ |8 y) M% Y7 {2.用id做为查询条件来动态拼sql
    % O9 p) @( S" r
    , C, E4 c& j; K. ^5 }4 k/ \! z3.执行sql 直接在数据库中查找,如果没有查到就会返回null; ~- y6 U4 t; {5 n8 j; O) V6 o( x0 M

    2 j8 B8 d. \0 c. `8 q: N: t/ @query
    4 u5 n' H5 H$ `" S1 [9 o( |- K
    + _/ q- f9 M( J+ V) Y; I4 i( e1.分析hql语句,得到model的类型
    - {' x' I3 s) t  G
    . i& M5 z( t5 l1 x1 i( B/ C: z2.根据moedel和cfg.xml文件中映射文件的注册找到hbm.xml文件
    9 D* y+ b% Y1 W3 u6 p# T5 ^$ T0 O& q7 Z0 v; L/ j& Y! J
    3.根据model和hbm.xml文件来动态拼sql( S0 {$ i3 K% b% O5 n& u

    $ [/ A7 L7 r( P4.执行sql查询数据库: G$ R* N7 z  D  Z" L

    " n) [' X' B( B0 K& a/ ~6 o5.返回一个resultset
    4 r0 E6 H$ \7 y% m
    + m/ n5 T: m. C: a6.循环resultset的值,放到model中在放到集合(List)中  i9 p+ d; g- H( T* P' L- V* W

    # Z1 M) P4 t; G! O$ v2 T- D
    ) F: j4 Q& G; z! z$ K( y( \
    ; B. _! o* v: p! |' |3 F/ r谈谈hibernate缓存机制& H  ]2 ~) x( C. C$ h. R
    - ]7 D4 S8 R1 q8 G' c
    缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了。打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去数据库中取,也省了很多事。/ [. [5 X, o, q3 X& r5 z# R5 e% }
    / B( o9 w5 A% w( v( \
    ' }: V& f% n7 a( {
    1 q' M) I9 c: H' g
    hibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。. L# m8 }: |/ W* u$ L4 @

    % V- L- D7 e+ E) Y
    0 g! F9 X% h- \& a& [2 X+ X1 Z/ Q5 c
    对一级缓存中的session事务进行数据的预存取,数据在各个session的上下文中存在(单例),当session关闭时,就是session.close( ),整个所有session范围内的数据全部清空;二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二级缓存只有一个区域 ,画个图比较容易理解。
    ( e9 z" D: A( c% t$ e2 w
    & E4 S* c) O% z+ ~0 C& z; B6 s) X
    . k4 n9 Y' j0 @: w/ h9 _& U/ E3 ^% L7 R' H2 o3 U4 A
    | 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|; c" n  {# n: ]7 i8 T' O* Y
    : A4 Z  A# y& N+ V" I  ~
    | | | |
    ) L, ^5 v1 E& L7 S1 {# E* J. ~; z9 n5 t
    | | | |
    $ O$ H+ N! x- B* n. |2 A
    . E% D2 ~$ {# c6 \—————————————————————————————————
    & v+ X! u. a9 c0 @& U2 l8 T
    6 t$ }* l, j3 K8 g1 ?sessionFactroy级别的二级缓存) I) d2 `- X0 d) S  }) e$ `: o

    # e- W2 \. C) r——————————————————————————————————————-
    : n/ J" t2 m% W/ M5 Y* C: b( K: j2 T* f
    |
    ; [  C) u: j/ R& t) F
    ' v$ V  A$ [" {, j7 [$ ^6 Y2 M|! Q4 R) ^2 D1 a( O6 r
    8 R2 k( i$ G8 s, ?6 }) q4 Z: h
    |* Q0 p6 k$ U! ~

    * W" L1 ]& S9 N, |5 J) U6 t2 f——————————————————————————————————————5 H9 ~2 C$ }; [! r7 w9 W

    # t1 v9 b8 N4 M5 CDB/ |+ V& Y( g7 T1 \9 O

    # R! g$ \7 X* R/ f5 P0 u9 P$ F—————————————————————————————————————–4 L! C' I. r. k( l6 U6 Q3 u

    8 ~' X% a4 ?; x1 ?  {& C$ C
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    16#
    发表于 2014-12-03 12:48:12 |只看该作者
    Spring
    * A3 @1 X! m/ |* g& l( Y
    • 是什么?0 Y5 r4 {5 r5 z3 x& {" y0 Z! \8 n

      6 \+ q! k" ~$ z: K6 y  ?' r( j( m

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

    . I) ~2 u/ c4 l: S
    • 有什么?
      " o. r7 N& `0 i, l- I  J
      8 y. v$ Z5 Y6 l1 W9 s% f8 X" |/ i- K

    2 z% m- z. k+ m& d3 r

    每个包的功能:

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

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

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

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

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

    AOP :面向切面编成

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


    7 L& {, `. ?  A( E5 H
    • 能干什么?
      ' E) M; y2 E' \9 _3 K$ [

      7 H$ K; i4 k( |& A+ ]% t3 M5 N" \

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


    # }7 T7 u/ N' I9 x; q& R, }
    • 怎么用?& i" \2 L# \: \" I5 h+ X
      4 z3 g6 e/ @' D* E% J! V0 B6 ^
      • 搭建web工程,引入spring的jar包' c+ C9 [6 D. y
      • 在web.xml中添加如下配置
        % ?% r. N! [0 K: Z/ s! w! G
        ) V; p8 C) E9 ]2 ?/ p

      6 B* e2 a: V& }4 k* j- Y
      7 @4 b, U) b# X, W4 O

                contextConfigLocation3 d8 ~6 l5 p. N$ t7 K

                classpath*:applicationContext*.xml- h( {/ i/ Q# _8 t

       
    * N. e2 s$ v2 `5 c

            0 n8 f/ y; @+ k" l+ W

                struts2
    " W& }9 T; N9 T% b2 ^% J

                
    2 y+ D7 G( U4 O/ [: h- C

                    org.apache.struts2.dispatcher.FilterDispatcher
    " e$ I! E2 c/ H% ]( m& R

                ! a1 `1 ~4 f8 F+ A( p

            , M# E5 o/ s+ r$ d

            3 r+ ^8 f! @% v) X! H. y

                struts24 E3 o. k; y7 J2 l% ?! i5 I% r$ @$ M

                /*
    9 B: c, Y- \( w- T9 T% \


    $ ]. B+ O  ^% V


    / M* e4 `  b# [& J& X3 Y* m. h

                ( D- b+ p( y) L  b: ^1 a

                    org.springframework.web.context.ContextLoaderListener( Z6 j% H* h  ]( O* W2 e

                
    " O. u" {6 r' o6 e1 F; \1 g

            

    • 部署
      1 X6 T5 O" s0 q9 o! X3 Q: W, R$ C
      & R( d) X2 G+ y" i2 F
    - [4 }4 Q: {- f5 C2 P+ {* w
    + o* u. g3 [) X8 z* N/ l( W
    : s. w( P9 o2 M4 L4 E6 e  ~
    • 容器和bean
      4 b$ Y( Y5 e; ^

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

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

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

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


    ; X2 L' \3 F3 S" f# |4 \
    • IOC控制反转4 d2 u# _' n0 J: Z! y% u

      ! M' Q/ c& o# h9 Q9 W6 v

      + o  l/ _& k) h- W/ X: U0 K1 J : P) j, ^9 r8 x/ k; I1 d1 R0 ^
      从前的应用程序想要得到A的实例他会直接主动的去拿,当用了sping后,应用程序由主动的去取变成被动的等待,由spring来控制应用程序所需要的对象

      8 \' X# ^  R2 U: P
      • IOC的优点
        . T* j1 O2 t$ R# R1 k# `
      1.可以通过IOC来获得实例
      2.可以通过DI来获取注入的资源
      • 配置IOC的原则. E4 Q$ t- \9 h5 c
        • 一定是可变的资源才采用依赖注入
        • 一定是层间的接口或者是模块之间的相互调用才采用依赖注入
          0 |7 S% M- D: V4 W
    $ b! p: T) [! V" I! a# A/ I: X
    • DI依赖注入
      % p+ k# p5 L9 c0 R4 E

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

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

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

    例如:

    在配置文件中


    " h$ t3 v: {9 o" H, @% ]5 C0 b5 j# I# ?( L* E9 a- A( V

    1 t+ A( Y" K5 [! Z* c9 ^! q' }4 N

    在应用程序中

    Public DBDAO dao ;

    Public void setDao(DBDAO dao){

    This.dao = dao;

    }

    3.构造器注入


    " U  t' i! @$ y+ p8 T# L* _. G/ z$ E

    4.ref 表示参照其它的bean

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

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

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

    6.lookup注入

    7.singleton

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

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

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

    8.DI的优点:

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

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

      m) m$ s3 _( P% \% i1 t
    • Aop面向切面编程; {( G7 z4 i$ r: s# f( R" N/ z
      4 U! G; M" r# U. P- F+ H

    1.AOP面向切面编程 一些较好的模式或者是示例—-范式$ v9 `  V' m3 p; c+ V4 V

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

    2.AOP的思想: 主动—->被动(追加功能): @7 `7 D! [9 o/ b& p' q2 F

    3.AOP 的概念9 [$ E% ?( o( m5 y4 p

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

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

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

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

    5.引入 :扩展的功能

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

    7.aop代理 :实现机制

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

    4.AOP的事件机制
      T6 X7 o) p& t. r  ]

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

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

    3.找到切入点

    4.确定连接点

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

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


    $ W+ \) w7 O. X4 U, K0 J8 q' y0 k8 U3 A9 {+ _
    / P7 v' ^- n3 i$ ]

    8 _* I7 U* y) A& x. m* ~" h, {& p7 r7 g( [0 K) ?  T; z2 q" x1 a

    2 j) ]2 A) x/ _
    0 P$ Q8 A4 v- E$ D+ q1 F. p! t$ w9 x

    5. AspectJ
    - J5 x! b+ y% p' X' d8 u: s/ `1 c/ [. E

    5.1.在xml中配置比较烦琐2 v2 D5 m2 g7 N6 Z9 p

    所有的入口必须从一个代理(ProxyFactoryBean)开始1 A2 I# Z: S- r7 o

    . P, d; Z5 ~' j( G/ P
    ; E! @9 x- R: D( {! i# s

             
    8 ^% I& P: q7 P' H% q( M! \
    2 q% w; @1 ~7 @, T  q0 T# j9 I
    ; t' J" q0 x5 G, }7 U" A         
      a: ]+ }) d$ t9 i7 d

            4 q! H3 B6 y5 a

            


    # g$ f* L( s$ w/ d1 s8 ]$ Yexpression=“execution(* com.javakc.aop.MyTarget.t*())”/>" N1 \7 d' l9 l) K0 D, c

            5 A# L, Z# U6 x' r7 `

            
    " y' x# @" h. w

        2 g9 b+ t4 m: X) `+ H0 m4 j

    # X1 d7 r$ J9 {) h
    3 P4 T- p3 {, u" F

    5.3.使用注解的方法相对简单
    " `2 f* e1 ~4 L9 F

    @AspectJ的基本语法
    . f4 ?5 q# w$ I

    1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面
    8 t; o3 e) J- p4 y/ {

    直接在类上定义@Aspect
    3 H/ J' a6 g( p8 h1 c2 ^

    2.@Pointcut声明切入点
    ' n, E8 {$ N/ k( s0 O) Y. @2 N( T

    2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字
    " @) o- b. K8 u; W; z& j% U

    2.2、可以使用匿名的pointcut- J' g; `& ^3 z8 S( J  T

    2.3、执行切点的几种方法
    3 [' g/ J, w. _2 d8 |* V+ L

    2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法8 m) k) W8 ?, b4 Q5 n

    2.3.2 within 指定到包,不能指定到类9 g% m; z7 o4 ?, W

    within(”com.javakc.spring..*”)! A0 o  m8 I" @

    2.3.3 this 指定到实现接口的所有的实现类
    : P' w& r: j9 Y- ?# j

    2.3.4 target 指定具体的实现类! e, `9 O& V" W  F" c* ~% p2 T

    5.4.advice的五种类型的示例
    , t6 E' B& H$ D& i7 ]# S

        客户端必须从接口走才能得到监控,实现想要追加的功能
    6 N( _, Q% F+ ~" E

    5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)
    9 K+ N7 r, E; W/ W4 j

    追加的方法的参数名字一定要与retrning的名字相同7 G# p2 `( q# ~/ K6 T# ]) X( C( O* y2 j

    在注解@AfterReturning中必须加上pointcut和returning两个参数& d1 E% p* d$ b9 ?; }

    pointcut指所要监控的目标对象的方法# Q6 Q$ i+ Z& |# F: H

    得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配7 I# b+ C! G; q  w2 n

    完成追加的功能% q5 k$ F0 e3 E2 G# Y6 i

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用. j9 X: t- R9 P* C/ _; H4 q

    (1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)5 v3 S( E7 V* z2 l. B

    (2).  q( z0 z7 j' ], L  ?/ w

         2.直接引用匿名的pointcut
    . N+ O" V! S) F$ F* U, p

         (1).@AfterReturning(“execution(
    ) D/ j1 U7 Q5 }- w" g7 L1 U

    * com.javakc.spring.schemaaop.Api.test4())”)
      C. h% }* H) S( H4 P" y

         (2).@AfterReturning(pointcut=. D! ^: N$ `, e6 ~4 x3 m

    “com.javakc.spring.schemaaop.TestPointcut.t4() &&' v% f4 G6 N5 v+ Q/ i( Y& ^

    args(str)”, returning=”retVal”)( k* L# ^. V3 Q! L$ h# b

    @AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)" g& k: ~9 p) V) Q4 g

    public void testAfterReturning(String str,Object retVal){
    & H- v# v# |% @7 F# q  o

        System.out.println(“afterReturning1=>”+retVal+”=>”+str);: q3 P' ~& F' Z& u: L+ D  N5 ~; s

        }
    9 K5 }$ v% n/ s1 U0 L; Q

    5.4.2.@Aronud+ s3 J/ W( }9 l1 ?0 n" |

         注解@Around环绕追加功能;% ]1 r- R( J. g0 l6 n

         在执行目标对象的方法的前、后追加功能;, ]& h8 }3 S' N8 G& o

         必须有参数;第一个参数的类型必须为ProceedingJoinPoint;
    6 \5 [4 z$ k' I  i

         通过ProceedingJoinPoint的实例的proceed来调用所监控的0 w  u- l: O; [: w# G; n

    目标对象的方法+ E/ m# n) a  _, S6 {

         1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    ; x; w: G/ J0 ]# ]

         (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    0 z1 l" B) g4 t. Z& u4 W

         (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()! r7 h" z+ l: d! v! H  X, i( [

    && args(str)”)3 ^# A; C5 r. E2 D7 n7 n" m: j

    2.直接引用匿名的pointcut- H0 W8 b- |1 \1 u7 Q+ h9 K1 K" g

         (1).@Around(“execution(
    5 u" K2 P6 Z3 O5 d6 ^  r

    * com.javakc.spring.schemaaop.Api.test1())”)5 F1 J; x: A- @: O

         (2).@Around(“execution(5 t: J9 N  n  l8 }; X

    * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)9 H! g: |( x# D- Q/ q# k% h

    // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    * {7 s( O- _8 j/ {1 s. e2 e# s  a5 a

         @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)6 L/ b4 @  n# n" U3 _$ l% _1 j9 q

    public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{
    6 F1 U; v8 z  K1 O$ o

        System.out.println(“around1==========before1pointcut==>”+str)
    $ m3 C6 }7 q: N5 |/ ~% N, S

            Object obj = prj.proceed();/ T6 P; {( Q9 f/ _+ }( V

            System.out.println(“around1==========after1pointcut==>”+str);
    / y( K$ x, s0 i: _9 K0 O& U! U

        }
    - |6 Y3 C4 D" X

    5.4.3.@Before% S% Z) a4 o$ U3 s6 S2 h" A- V1 ]

    注解@Before在执行目标对象的方法前追加相应的功能% ?$ M1 b4 \& B' U5 o1 g

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用( A! L: w5 q, N: K: u

    (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    . }: I! v. ~! X' ]

    (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)! M2 w7 y+ j) B9 `/ }, V, W

    注意args后的名称与参数名相同; E) K7 @" g5 a6 P& R" M2 _* c3 b7 G

    2.直接引用匿名的pointcut
      j5 F- N  B* |5 m  P

    (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”): @: W3 O' a) `5 r

    (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    / c6 f0 x4 {+ A3 U# J8 u+ b

    注意args后的名称与参数名相同# M! y# Z$ D0 a5 S0 u; \" T

    // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    $ P9 `0 C9 J) h

    @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)1 A& P; \0 x8 ]+ u) g

    public void testBeforeParam(String str){
    ' p3 J1 A) I. ?6 a/ K3 f

        System.out.println(“before1=param=>”+str);
    + ], F% v, L) m; U" M% u

    }' f$ L+ }% l: \, x: Q" {

    : ~7 l2 ]1 z4 A5 m; Y* w7 [

    5.4.4.@After0 e8 J) ?5 B  l& L

    注解@After在执行目标对象的方法后追加相应的功能
    * \9 n3 v# _) u+ }, G) m  l! ^

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    # B& b; Q! M  `3 @) K/ o1 R$ T

         (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”); |: c" Y% A* K' Z

         2.直接引用匿名的pointcut
    * _9 ?9 w8 b6 X0 |9 X$ Z

         (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
    1 I) ~& W6 |% W( u0 s+ Y

    @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)9 Z" U, _0 y/ n; C" c7 @

        public void testAfter(){+ z+ [$ V. `. B: u

        System.out.println(“after1== >pointcut”);1 Q* @7 h! K: t! K- g3 m5 e* w

        }  c% `& a. k$ r( c9 n" H% b

    5.4.5.@AfterThorwing
    # b9 i* W; X! R2 T/ S- H; C

    . i: w8 S# n1 a& m
    5 \: D/ _- s* A
    • 描述一下spring中BeanFactory和ApplicationContext的差别$ ~$ u; e8 d. }! Y, J5 \/ c

      6 R: ^1 a  \! s$ w9 p7 I

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


    0 U$ c4 v6 @" N) r7 Q
    • 谈谈spring对DAO的支持; \6 T* S! l: h! ]6 e  U7 x( f$ h
      0 ~  W% \& N/ n8 Y0 v* U, _

    Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。
    + i4 N! f! }6 r$ p" U4 {

    简化 DAO 组件的开发。
    ! b4 @8 O0 D* x4 T- |9 T" d5 iSpring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。
    4 t7 W  h. x3 X+ P

    IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。
    " e& v. d$ H: n1 \  {0 y$ k5 {

    面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。* W& i& _& o, L! F: I6 Z2 S

    方便的事务管理: Spring的声明式事务管理力度是方法级。
    8 ^( m$ X# w4 U2 m! W/ l

    异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。
    9 e8 K! I0 C  d1 E# }- z% m


    6 h- T0 b0 o8 `3 ~4 q' J' D1 D& t8 ~% p# Q: S
    • 谈谈spring对hibernate的支持. j9 x7 w% p0 n. s
      6 R1 i% A( s8 A5 i+ H9 ^

    在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。
    # D2 m+ T( `5 T  {; h3 V

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

    1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:
    ! \( \' C8 E, {' w5 q! d; t1 s

    8 K: X0 B/ Z, W3 B4 d3 ^4 x9 d" t

            class=“org.apache.commons.dbcp.BasicDataSource”>) j, D/ @2 ]7 ]  |

            * q/ z, q8 o+ ]

                oracle.jdbc.driver.OracleDriver0 e% \% G, ?) G$ f: s+ H

            
    6 {3 _6 P3 a  _; H/ m* \8 k" ]$ N

            1 X/ f' l6 i7 ^" ]' }

                jdbcracle:thinlocalhost:1521rcl
    . O$ k3 H+ G; m' v) }  J% O

            
    9 f0 U& u7 I+ q% l  a  W

            
    7 M6 V$ E* Y. D) h

                javakc20 C4 h4 ^& s) M" p5 E  p  b, ~! a

            
    + b+ e5 ?) ^0 Z& Q1 U

            
    - h" _, h. j0 j% u; T( Q2 l6 O! G

                javakc2
    7 `4 U8 ~0 H+ u  V7 H" ]

            4 w# o+ f( k  I; F$ G* Q

        + m. R- [9 k6 \

    : a: f' P" U( o4 T, L. O8 [

       

            class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>
    7 k) n; `4 z" {: R% N. k% h/ e

            4 j' j3 H& Y1 l' G

            2 L( U/ Q% R: O) d1 s

                9 N2 w7 z7 y( o8 }2 M

                    com/javakc/spring/h3/UserModel.hbm.xml# L0 \8 B6 n# [: [7 m* f$ A7 p

                
    1 U* h( ^2 V. V! H) M1 M8 Y

            9 X2 e6 u( R& G  Z" k9 b

            
    " r3 }  ]; d' ]( [

                
    $ }+ F) W% R) K0 z: e: e/ ~; K+ l

                    hibernate.dialect=org.hibernate.dialect.OracleDialect
    6 m. g" b( ?  Q! C; z

                
    2 C# J7 m2 ?, B5 o9 S5 ~

            ! Z0 p' P; @0 T) H6 |# `

       
    8 L% ^8 Z  R/ E( s7 t/ t

       
    0 W# ~7 u1 _9 a/ ^

            8 U2 D9 X( h" m; f6 k& F

        8 a$ g  Z$ G3 j4 M

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

       

            class=“org.springframework.jndi.JndiObjectFactoryBean”>6 h9 i7 e( M5 o  K- `" ?8 l4 W

            $ m; I7 I: R3 o. U/ r5 X

                java:comp/env/jdbc/myds
    ' r. p3 u0 f$ b9 |: I$ h8 x

            5 c, R2 P: }# \0 R$ t- _

       

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

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

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

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

       
    ( ~/ ^2 Y( B+ o7 F

            ' X/ r: d! f. T: q2 M

       
    , C' r* |/ d  E/ p

    9 U) X9 ]  c1 ]4 b3 S

       
    " p. F$ D  r  Y8 ^. r

            
    8 p1 y  F' [3 y1 c) d7 a9 F

                
    9 h" p; r9 G0 ~+ Y# l

            4 \& x9 M0 [! K7 W2 _: p

       
    1 E% F. W/ e# g/ ~# q4 I; v


    8 [2 H- r4 w9 N9 L) H

        6 u  ^! A2 A( _# O* D

            9 f0 x% D1 x# {; h# O1 f: t' a, }

            
    ) `/ l9 Y% l* B! O# G7 N; s5 I

        7 B5 U* N% o/ y4 C

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

    5 w6 ~' b* |% w# r# e+ [
    Spring2.0之前事务的写法0 ?: |( I! Q7 Z3 P( o

    ; ]9 q2 |' T- Q1 C- V* S" m* _- E) O  z( X- @/ o* O9 v2 w3 u
            class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”7 q- _% S1 z% ^+ r

      b( [) N% y$ w* n0 Q8 k8 Z        abstract=”true”>5 |* W8 a4 W* l5 p
    4 `6 b0 [' B% j% @. B; N2 D: O
    + X/ b( F- R$ c/ u9 Y9 n; a

    * l! G; U3 I: K4 u
    9 p; u. E1 Z4 @                PROPAGATION_REQUIRED,readOnly
    4 G" j/ s, N  x% }& i
    + B$ V5 Y  F% }! S1 A7 d* o* ^
                    PROPAGATION_REQUIRED! B/ @* `( z: r/ ]

    " A, L' Z4 e3 f) o+ k4 j4 B$ h
    1 }' @8 K9 v9 d
    " X+ F! w$ m* e0 h! B) O& L  J6 A/ W& C. l/ a$ q
    " d8 ^' E# C) B5 w7 K

    9 R7 K9 J9 E$ j3 c
    • 谈谈Spring对事务的支持
      ( b  ?0 I; @* y! H2 F; }+ }

      7 O9 Z# I1 J+ x, Q* i% M

    $ @9 }8 H* d( g) p" o* f
    1、声明式事务管理:

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

    2.做法:

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

    2.2

    2.3 注入数据源

    1 r+ Q$ ]# S2 j" f
    ; O0 e7 U" N" b6 H# s# i# I
    ; U; y9 `2 u1 v0 L( W

    4 o  l( T6 V' e$ O) Q
    " Z. H1 @. ^& u6 m8 _3 j, V9 R2 Z, ?- _% R  c' V+ r

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

    & D2 R: k9 i' C0 s. Q( \7 Z

    ( A! u- _# s) h- r% U/ `. Y  M% S5 W: m) b4 u

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


    : l- f5 ?& }  K1 m% D; `6 e2 R5 F( S, ^% ?

      U, u1 c- p) Q+ G; q* Q3 Y! S" _1 t' c+ a9 g

    ; o+ ~, n8 Y0 L" U4 C2 V

    2.6 定义切入点

    % U9 w$ C' J1 P

    6 L% v! h# i/ ]0 c: Q/ a! q4 [: V7 y' l5 @) b
    / X$ B) {3 u' Z0 s' F% `+ D! _- E

    & }3 @' O3 ~5 Y

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

    1.注解@Transcational

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

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

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

    5 \" L# L& }  i7 Z. t( P" R

    6 }& D* n9 M! E* r

    如何在Spring中使用Hibernate的事务:* t7 ]6 _! Y; G7 k' @* ^

    # d4 n6 W  g8 s) r) A

    7 [0 W9 }' l5 g: Z/ L" H; H  h4 ^


    ; A4 D: T' k. L

    如何在Spring中使用JTA的事务:
    ! u  B( Y1 Y  I$ J


    1 i0 ?( X" R; j  t8 k5 p. u" Q
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    17#
    发表于 2014-12-03 12:48:32 |只看该作者
    事务; ]8 B% u1 Y& i" {. G
    ACID# u! G5 b$ l. {6 |8 o
    (1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失败
    ' w' F) x0 K" k* U8 ]+ A$ e; ^0 t, G, j2 e1 n
    (2)一致性 :操作的前后满足同样的规则,保持平衡。
    . n. y/ ?4 B0 b3 ^5 n% O* x1 K" z& \$ f+ o4 F% M! T' a: e. a
    (3)隔离性 :在事务运行的过程中。事务内的数据对外的可见性和可操作性(必需由数据库的支持)+ c* s( i; z5 u8 K, f

    6 i0 S  r6 k% Q: C3 ?+ ~% h/ v; v8 h7 H(4)稳定性 :保证数据在事务的操作的过程中不会遭到破坏,而且是永久性存储的2 G% q0 X4 ]! r

    2 S! a# {0 \" ]3 j* e  G: Y5 ]
    * U0 T: V0 b5 j8 N3 k; U1 L6 q& `( r6 }' K" e: r$ x' _1 c7 p: j- N
    事务模型3 i& o  M9 Z7 A5 z! Y. @
    (1)经典事务模型又叫平面事务模型(JDBC) 事务不允许嵌套
    2 M, o# p* m2 u& U$ i5 z8 r
    * V6 }( S  t: v+ d8 M4 x! B(2)嵌套事务模型
    . o' S# |( m! h! L2 J$ O
    1 N0 T. H8 H: z * q# h1 p( `6 i+ D% I4 M( y
    ! P9 {, h2 A: R) c7 z+ `3 [
    事务的两种方式
    * S2 K# [+ M/ H6 t; n7 r- d(1)声明式! D, r, h/ ~; u" D6 m' V7 l
    / J  i) K1 D3 i) H! K
    在配置文件中设置以下6项& ?/ ?1 U6 `, T" q* q
    ) K: f# H4 H6 ]" q
    (1).required
    " l6 V* p+ ]: }! x0 r$ \
    3 s) g, I' C/ z* x- K" z# g$ ?+ V如果客户端没有事务 在bean中新起一个事务
    " M% |, S( O+ ~6 i" g1 j1 B, H4 ^/ F7 r
    如果客户端有事务bean 中就加进去
    " ?& q# o# ^0 d
    & v$ ?0 m- ~  i' n! E. F" s(2)、 requiresNew, a" h* E8 H( v, O, s5 N3 `

    / D8 y7 G0 p  a. F; G0 H不管客户端有没有事务服务器段都新起一个事务
    0 K! [! M. T9 T& l/ }; L; I2 h. x% u) f
    如果客户端有事务就将事务挂起" M2 O$ f% D: @* u1 F% D
    ( O8 h9 g( C1 t  [0 m$ z" P2 _
    (3)、supports8 y! z5 z. A4 p" K9 w
    $ ?# u( Z+ `( [: z3 u! U5 [7 N
    如果客户端没有事务服务端也没有事务
    1 P+ P& l( A1 B9 X4 P  b. [) r# k
    7 f  L. j5 `# ]! V4 D如果客户端有事务服务端就加一个事务5 x; b4 E' f. B& `& `
    7 }6 A. q- F/ B
    (4)、mandatcry
    + Q7 V+ O( D( t0 D4 |6 i, }0 I, n, F
    如果客户端没有事务服务端就会报错! Q0 i4 R: C# B: Q
    0 E5 g0 _0 H; M
    如果客户端有事务服务端就加事务
    # h$ \, o6 s' x1 M# @! T1 R, M% [1 P- R  M. Z! {# e- H
    (5)、notSupported
    $ b! I& m0 o0 O
    - U. H- g" a9 t# ]: l& V6 C不管客户端有没有事务服务端都没有事务$ n; _3 `  f) U/ Q

    # Z( R$ j& t, ?2 G' l2 d如果客户端有事务服务端就挂起
    # y2 ?( n7 O3 O  p, q& p
    - J- W# z$ X& ^5 i9 p9 E, t(6)、never
    7 I6 ]6 ]/ m: ]5 C
    , r- G) V7 _5 ~$ Z  A% O不管客户端有没有事务服务端都没有事务
    ( M, E8 Z  V* k8 ]& J& o% S1 j" K% O& `" \3 e2 b: x: L
    如果客户端有事务就报错* S1 |" u- y% \, B* b4 f" v
    # G6 a- S+ d* [6 y2 U2 L, Q1 b
    (2)编程式事务
    3 S  Q! n# @1 @9 a) U$ J! C- t3 J+ _7 a
    Javax.transaction.UserTranscation
    8 r. T) k0 t) D" B* T$ [, f# {3 x: p; K4 k( v" D3 h7 A, c
    JTA 事务可以精确到事务的开始和结束0 ^! N5 ~- x$ B$ }9 [/ ~1 Y/ N
    4 G( Y, X' N7 p3 B8 x2 c

    0 [7 L& T' U1 g5 I' y- a- a. R
    / ^9 Z1 Q4 q% o事务的隔离性5 M1 \! Y3 N7 U0 |& x5 R. b
    Read-uncommited
    : o; U! {% e/ U
    " G. G! r4 d, E+ W+ r+ x读取未提交的数据(基本上没有锁)脏读,存在不当读取的问题。
    ' a7 I; K, ?( T+ o6 V
    % W9 K  v  X' x& J% L: ]8 yRead-commited, u* `# g) o  o% g; r  {0 {) n( ^
    ' f* ^2 {# h8 i, V1 A. Q
    读取已提交的数据(行级锁)( Z2 ?$ H0 N, t; o; w& F

    8 D# d' y# R; b& ^无法读取已经写入,但没有被提交的数据。
    ! P/ G: p/ u: E5 c# Z$ _6 z8 V4 Z8 U  m% @; p7 |5 G% P
    Repeatable_read! e: R$ B5 ?. m, |+ i, ^, G, m( Y) T$ v
    % h0 m/ A, b' U: x) R# i$ v* v
    读取的数据不允许修改或删除" G; E1 L5 p$ U8 ?3 q9 _6 x

    9 i1 F1 v3 j( _3 H3 s# c3 c1 Q不可重复读(行级锁+不允许修改/删除)
    ) |1 W  i% T4 `) a3 P# y' C4 G% I6 G% p
    Serializable
    0 d& |' C- G- K' R' U
    0 r$ m. C  N7 y' E1 f幻影读(表级锁)
    ! w6 q# d8 N2 @0 W/ ?) {  r( C5 }; C& E8 v
    7 q' A9 |, a7 _6 Q+ F! I9 E

    " v! @- {; o  `struts
    2 K( r' V  h2 B/ h开发流程1 `3 @( x3 h0 u! M
    ) W+ f2 x3 w. o0 @- P
    1、创建表单( a& N! ^0 o& @5 g/ }( M

    5 j$ C5 y, T- W+ A2、从表单中获得输入
    + K+ B$ }% C2 ~* N4 n# k6 G6 H( h& x! V! O, i' G* q  }: r
    3、处理输入(业务逻辑)5 j7 N1 C; x2 f9 S5 R

    $ h. T6 J8 V5 j- m0 Q4 W( b4、根据动态输入改变输入流
    3 q3 z- r8 A; `, T' z5 J8 i- g
    7 d" o" S. |- Z8 |  V- W- r; p; S要完成上述四步,我们需要创建4 K8 n% H) S9 _0 t  w
    ! \! e1 i0 ^! t8 t/ H
    1、一个ActionForm- Z$ p5 s7 d5 d/ M  L

    " k! e  O0 |5 R1 s9 V3 L* l9 K2、一个action2 v$ M9 k  E' q4 y
    8 T! g) x) J& W* i
    3、一个配置文件struts-config.xml% P8 g( _& a& l1 i6 ]$ b, L2 M
    2 K/ g0 ~7 D, c! h
    4、创建页面
    # n& s' F2 q; g# t" c5 s: n
    ! m- ~  R% ^6 @2 C创建ActionForm; i7 n9 [) [: Q
    6 g9 U: b: r9 p6 s5 b5 M: d
    1、写一个类继承ActionForm) Y( Q' l: K1 v: U& y9 {
    6 U  g6 N1 p. O# g% H9 D/ v
    2、私有的属性0 T8 W1 v* c  J5 K. T8 E
    1 z, e6 v& v1 t+ ]6 N
    3、相应的get、set方法! ?' D3 [1 ?6 H! D0 r3 S

    & Y- p9 t/ `2 n0 r: @4、重写tostring、equals、hashcode三个方法# P' E0 w2 M# \( \# n$ t1 }3 C+ L

    3 ~( m+ t4 e- f, b8 O创建action' N% s( e. i. I  S

    ! d0 Z( F# h% N( j- u4 o& u1、写一个类继承Action
    9 G+ `% y0 M6 Y1 I+ o9 e3 J7 p8 \4 J( U% l6 h
    2、实现一个公有的方法(回调方法)
    2 @( K5 ^2 u" M- j( I- l5 u. \
    8 z$ a& o3 L6 opublic ActionForward execute(ActionMapping mapping,: o% h6 g+ l3 z$ ?

    9 r! t- J3 I4 \0 }! g) KActionForm form,+ y6 w/ l7 c* c" r* u1 K+ _1 D) q
    ' `- t" M! G. j* g
    HttpServletRequest request,
    0 Q2 }, F. ]4 m) x: E% r' r
    4 \+ J/ T" }( v0 m" ?3 ]HttpServletResponse response)
    7 R" k; c: P3 B, ?2 ^
    . F. [& ]( S, S2 X/ H* i6 v# E{/ c0 F' x9 l4 m, n; k# i6 z; l
    9 \! L( c. A4 _2 [
    //1.收集参数! u# O- m4 `9 M8 X& F7 u; M0 k
    6 A6 N1 t+ f# e2 `, }, {
    MyActionForm myForm = (MyActionForm)form;
    7 h- E4 P; j4 O4 E6 \" A/ \. a
    9 V* h$ F4 ]0 C" P+ j/ t! Z7 G% `//2.组织参数" ?5 F# L1 w1 F2 m( ^
    * V8 U# I* F6 b: D0 P' ]* @5 V
    * d7 X# S" S6 h$ V# O

    ! B% S& r1 I% b" r5 D, d! W; ]//3.调用逻辑层3 s( O* x7 p+ I9 h

    ) w/ c( I0 f- y, {2 s+ r1 Eboolean flag = true;# G% N9 @% N; A' ?9 X7 |3 Q
    . P+ H6 K: s6 k8 [% A
    //4.根据返回值来跳转到相应的页面
    . f8 V; W8 O' D  q/ v7 w% T4 B/ a' w# E/ c# S4 l
    ActionForward af = new ActionForward();) x* l/ G& d- F+ K; s9 A2 _' {7 v

    ; w# S- k/ x" G6 tif(flag){
    ! }- o( Z* a: `6 G, B. v: W0 f* [# U  a
    af = mapping.findForward(“1″);- Y. b0 {0 _  }: C+ q

    " @: f2 W7 P! @* |! L}else{8 |  l" k2 h$ ^  p  }
    / d7 N+ C$ _' d( v9 ^
    af = mapping.findForward(“2″);, ~  p5 V. w4 \- D
    8 v2 \. \9 c' p& \- C
    }
    $ |, u7 |8 J1 S  e) r# J* h* _
    , K  ~. H& K9 F/ \% C4 Vreturn af;5 e/ Q( `8 |" x3 g

    ( |* i" n/ \! C: a$ a}
    ' J& n6 S- r- k- b7 W
    8 \9 x" B0 {+ I8 _& h- i' o# d配置struts-config.xml文件
    . |- N! ^) n3 L2 r/ }7 A7 V3 u. k( k7 M! g; _9 D' w
    1.<form-beans>! ?$ \* M9 P. p) ?" j& Q3 x
    $ z1 ?- s; V$ ]$ z. Z
    <form-bean name=”myActionForm” type=”全路径.MyActionForm”/>
    0 D% s+ ~0 f' t
    ! c6 h' r; \; v3 q: h<form-bean />
    # t3 Y3 c- G3 b
    ! E$ Q; Z) h  t0 m1 @, l0 j& m</form-beans>7 W) {" v4 I; h. t1 |% z- U9 ?5 \
    * ~% m/ R+ C6 R& ?
    2.<action-mappings>0 }) o) _: w9 L, p- c. v! L
    8 j6 v; T$ X) D8 R
    <action path=”/sll”* _& d( U/ f% f1 L, T5 B

    3 k7 l1 \; M/ G; K: Qname=”myActionForm”3 W7 k1 Q; Q1 s
    $ G& L9 {0 ?; p* j/ J- s9 H
    type=”全路径.MyAction”4 i3 [% X/ v7 P: P" h7 d+ W

    + K0 P& |) O3 V" ]: T. N$ p) r  Wscope=”session”
    ( p; ]" ?, n$ K& ]4 v/ }' A+ v! m1 H- d& G
    input=”错误返回的页面”>8 Q" f& W) r0 T0 Y* N) j

    * F* M/ s- Q3 n8 s7 k( g<forward name=”1″ path=”/1.jsp”>
    ) P. p, u, x: [3 f, a9 v: M& R7 u7 {1 T, ]
    <forward name=”2″ path=”/2.jsp”>  Y! b( M: A8 [+ X* K
    ; X* _) P4 ^5 p) [. a
    </action>; g( q$ Z5 @- M: H* E4 y

    , X3 J9 g7 [& P  q! ]" h, u) c' _</action-mappings>  u; [3 ^7 r$ D; r

    , {# f  |4 ]. I+ `% m1 ?步骤:* {0 r9 i+ D3 V+ Q6 h% ^

    $ Z8 o8 m: P6 Y  ^8 l) A0 Y( e1.创建一个空的web应用# {. u' G  d7 a! R% S- g

    & D! b6 c( f' P; W: w3 m2.将struts的包放到lib文件夹下( i$ f# e& T( t. W; [
    ) p. N/ h' u4 w" b. y: E
    3.将.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目录下
    6 i! ?4 r8 G' V; I  M+ _- j4 N! Q" S! F6 q0 N4 ^7 i
    4.配置struts-config.xml文件和web.xml文件* Q+ J0 T: _& o( b
    : ]2 S0 ]3 N9 m' W7 B
    5.在页面引入tag文件uri8 ]* b" h- y: J6 V; w

    - H3 \8 P# K; O+ j8 C7 pSTRUTS运行机制$ G, X" m5 k9 R4 m1 }  t3 M& b
    2 d; a3 a! w0 H, X" {
    1、界面点击产生请求! Y2 M! P0 e2 l, H8 ^6 c/ G4 {

    4 C! k6 Q. \! d- I- G2、容器接到请求, E: M6 _' s. P+ b4 b% ?
    : n/ x  L- O% s: R3 K5 t9 h3 Y
    3、匹配web.xml文件中的*.do来调用ActionServlet* F* @( d' J. e; p5 B
    7 ^1 s& ^( S- p# F
    4、ActionServlet的处理
    9 M4 f; |2 G( B( b! n5 z" K+ L5 o- S5 U( G! v  U/ l, ]/ U# @; h3 B8 [
    4.1 读struts-congfig.xml文件形成ActionMapping' h  ~3 l2 `0 l, u2 C. g4 q: S
    0 A3 s6 I# `2 }8 Y3 y/ C
    4.2 通过path 来匹配Action类,通过Action的name属性来匹配ActionForm类
    8 O! A! w" q( e& B% j" H% @: ?% M; l5 X" h
    4.3 通过反射机制来给Form添数据$ X# [. Q5 k& v4 M5 T9 R0 }1 K6 S7 P

    # R8 P; U8 V/ M& D7 w4.4 由ActionServlet转调Action的execute方法1 v: I6 ]. r5 r! K# l' g+ {5 r
    & J! a) m$ x; q' j  Z
    4.5 得到execute方法的返回值,跳转页面6 x. W" b8 |* H3 I- F" B$ ~4 |+ e

    1 e" n3 z& \, o& Q! f1 D, z/ \# `% S3 R3 |4.5.1 RequestDispatcher; X/ j: x# R6 o9 z- l( p
    5 I, ?$ m# Q% S2 z3 r+ O
    4.5.2 response.sendRedirect(“list.jsp”);8 _1 @; j6 s7 B5 p

    - K. \3 u6 N) A! p% X " X# `1 w* A6 [$ n- M# b

    * c# R* f$ F; @6 l3 p1 X$ R( o进入execute方法8 s8 |% }7 K2 y3 @9 M' r6 q

    5 T8 }, `" z0 Z( B1 k, x+ D' b& a1 收集参数
    8 \* Z, r! s  ?6 F
    9 N8 @% l9 ?  e5 H8 n2 组织参数
    / X% p1 h" J$ H' G5 y' y* o. v6 l6 K7 j" i) o
    3 调用,逻辑层* C3 K2 E- Y/ B9 w7 ?& s- O

    * x) H5 k* y- }; s0 [& Q4 返回值9 R# g& L) s" \' {5 K  K0 U

    5 e5 P- D3 t5 ?! Z4.1 选择下一个页面 (ActionForward)& V* F: _% b& v* F

    ( v# v7 b. M* j  N# a4.2 把值传给下一个页面( C. t' B9 u5 }) z! j) N: D" K

    1 b  j( x0 T/ B+ ~7 l& ~ ; \, m/ M0 ?9 X" }" S, \
    . Y# y7 m1 n6 b# e' D# u& P
    比较struts和struts2的不同
    ; m2 N% N! r$ P! V& n" j+ y$ ]2 E7 a. P5 N9 S/ M  L0 K
    Struts
    $ q, D+ m# N' Q) y, q
    ) B/ Y9 E: r( r, V) w' vStruts22 v2 o* T( o7 `) T6 @4 Z

    4 A$ }. F2 m$ z组成        五个部分:ActionServlet,ActionMapping,AtcionForward,ActionForm,Action        十个部分:AcionContext,FilterDispatcher,ActionMapper,ActionProxy,Configuration Manager,Action Invocation,Interceptot,Action,Result,Taglib
    ( I3 p; W3 F3 p+ ^2 Ourl        .do        .action1 }; b1 U1 [7 U
    分发控制        AtcionServlet        FilterDispatcher# o1 S# J3 k6 g4 a( O- ]
    收集参数        利用JavaBean技术,将数据封装到ActionForm的子类中;- Y+ y! N3 v! j* E4 U" y
    一个Action对应一个ActionForm的子类, a3 \& v. U- l: m' |6 E( O$ F

    . }( W5 t$ M5 r6 P使用拦截器将数据封装到值栈中。7 n( H3 Z1 ~0 Y. Y# q
    使用域模型,一个Action对应多个值栈中的Model8 n: o) y' @/ O+ U) Z; s
    ) L8 M9 K4 n$ b1 {0 q
    读取配置文件        ActionMapping        Configuration Manager
    5 `9 I9 G* s3 `; o& x( w5 K拦截器        无拦截器        执行Action前后有拦截器# _* G: g9 s6 O6 _/ p( R# F
    返回页面        将字符串封装到AtcionForward,进行跳转页面        Action中直接返回字符串,通过Result跳转页面7 W( e; \. N) I. `
    页面跳转方式        两种:dispatch,redirect        三种:dispatch,redirect,chain& p$ E' Z! l7 g8 Q7 ]7 b9 w
    值栈        无值栈,Action通过在request范围内设置属性,向jsp页面传递数据        有值栈,Action和jsp页面通过值栈传递数据,jsp页面通过OGNL取得值栈中的数据, ^4 [9 h! [0 Y
    配置文件        struts-config.xml        struts.xml% M# \; u4 i2 V5 g# Z/ _" s
    中文问题        不能解决(需要使用filter)        可以解决中文问题:! M2 J  b; T: ^5 ]( k
    1、在jsp页面添加Meta;, t2 M2 z% x  \5 w
    ' C: r! |( S5 m+ B& o
    2、修改struts.properties中的设置。
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    18#
    发表于 2014-12-03 12:49:03 |只看该作者
    其他开发工具和技术5 R# O0 d4 f( x5 C
    Ant
    $ ?4 q: j' M& h2 ?5 R; g8 UAnt是基于java的批处理工具. v; @4 \% F- ]: N: W& @3 F0 x# q: @

    7 ]8 M( p+ Y; k一、配置ant的运行环境- ^4 b& E" t; i9 ?% u9 D0 W
    ( x5 {' ^5 P( F# i( O
    1.将ant的bin目录添加到path中
    # w1 v' v' _  V* {* k( `% Y" c8 V
    2.配置JAVA_HOME
    3 [; R) d( w2 P, R9 Q9 C' f1 M8 ^8 K/ x: S& G" _% ]* a" a1 ~
    3.配置ANT_HOME6 e; F5 w) A) H0 ^% i. h& f, G4 {) c

    6 n% a9 u0 |6 U) {6 n$ }二、配制build.xml文件,该文件放在应用程序的根目录下
    $ T: ?/ ^' W' s9 Z( L0 i' Y8 t& g6 g$ ]: A& l- Q
    编译java文件* v4 p) F7 k2 v: r$ J2 K+ x7 U

    ( d9 U; P# d8 q$ Z5 ]& `# P执行java文件1 y" Y! w% h- Z1 k2 i8 l
    / q0 l( k$ y# u. U
    copy
    & k& w5 \! I, V5 i! N- C& Z. w( \/ E
    - f* @$ _8 R, d( J5 _6 q删除2 T# l& I. r" p
    9 j9 @7 D* E0 W" k9 Y  }$ g6 n
    打jar包
    : Q! N7 E' f" u+ m# g( [, r, u* m
    , r" i7 w$ ^/ W4 a2 O根据注解生成配置文件  ?3 U/ Z' i8 b+ K2 U0 h( q* O
    : t7 E' `) S) Z# o0 J) j" B
    Xdoclet5 Y1 d1 V- v  l4 C: o2 ~
    通过注释生成一系列文件的工具(txt、xml、java、html等)
    ) d, |9 w1 M) v4 s; o3 z
    3 }  G4 v$ _: Z: Yxdoclet本质是摸板技术+字符串的替换5 @+ x9 {/ Q3 d* k8 L$ _
    , a, |! \# n& q% c* O1 U  W7 e
    1.在java文件中写符合要求的注释(将hbm.xml文件的内容搬到java文件中去写)6 ?  O* Q# G8 X6 r: ~* B+ J! {# ~

    5 D7 m+ B+ c- y' {9 D1.1 在类的上面 写与表的对应6 a* ~7 h& Z& ~$ v+ g) ?6 Y
    2 [1 F  k; s. x" A/ d' g
    1.2 将每一个属性的注释都写到get方法的上面5 y* d$ ?3 u& N$ c' E/ x

    2 J, E# @. A* J2.在ant中引入相应的task来驱动xdoclet+ O. E5 f( P: s! L
    , W/ P- h0 G8 J  v: M

    / p# `! ~, f4 I) c
    ' d5 d2 t* G5 G9 Plog4j日志管理
    & q( z* ^7 M' Y, {1 f5 C. O5 {1、是什么?2 }* T2 p- i8 m4 k2 O$ X- }8 I$ m

    ' }8 x7 n1 a1 }) o0 O1 }( G( z' j. _# L在开发期间用来测试、对整个日志信息进行管理的工具% Z9 c  Q- I8 d  J

    8 f8 Z" W$ u% M2、功能/ X; g1 k2 |; @# s: K& V
      Z9 W1 v' y2 g0 O' [: \9 C: y
    1.控制输出的目的地
    ) K5 m' `9 j( S& @! u1 L/ o; T, l) ?7 S
    2. 控制输出的格式
    $ P) A# H0 }0 F+ K/ j- V: V) M" R" V$ O; N6 ^/ B
    3. 控制输出的级别
    3 k; {  V. B7 O% E8 M2 D  ^& m0 y' ?5 M; d4 k
    3、日志的级别
    9 h; s1 I& B  X" `( J8 X3 t) l
    8 s- _1 X' d$ T# Q1. debug 调试
    $ Q* U% d5 a' }: }. L* x4 u( O' P& {0 m( V& G# d, s# _
    2. info 给用户的提示信息
      t+ X# z0 N9 U
    3 g: a  ~7 n  {. n4 Y* z, s6 H$ O3. warn 给用户的警告信息% c1 j2 S* Q) c  o+ f- e' H$ j
    # s* T" u2 }, X% @! g
    4.error 给程序员用来调试
    $ D& j- K) m, @7 I  ~* S- U/ p* a! ]0 J, e* Q: b: C2 J5 I
    Debug—-〉info—-〉warn——–〉error
    ; c& v; V0 \6 g: n( c* D0 @( D
    3 c5 }7 P6 |* U: z, r8 |, ]4、配置
    1 P: T+ l  r% }6 D! L6 a% D8 r( i( _" V* h
    1.配置级别
    1 }5 D. k: S& `/ I, W( F8 q5 J
    2.输入源 (控制台和文件)- U+ N0 e) A8 I5 ^! a1 E4 h, V
    9 R: M. v* k9 X+ {. ?" q
    3.可以进行分包控制
    2 P9 n+ V" Y9 ]7 ]! d* l' ]! ]2 |$ P, a  \
    Log4f.logger.包结构 = 级别
    ' m5 k$ A" f3 z: L! N/ B- @
    - ?% X/ M, {+ ]# [* }5、使用: s$ q9 @- p, ~3 b4 P( b; B( u" x

    5 G# K& W; l' oLogger log=Logger.getLogger(Test.class);
    # U- y6 r1 R/ }& C7 s( O* g0 ^/ T( g# x# i/ ]3 G
        public
    : n8 e' B! x2 x7 g( _void t3(){
    ( H" v/ Y2 a: f6 _
    ; ]# ^* \# [  ?3 E! w/ e; {        log.debug(“this is debug”);
    ' w! g2 W6 }+ K: U9 @* X; F& C5 @! ]9 g- v- ?! a
            log.info(“this is info”);1 T/ P/ N& N0 z0 g0 D
    : I; \* U4 A/ {, _0 B: G# }
            log.warn(“this is warn “);
    * ]5 i" O% z# D3 N
    9 B% C) ~8 D; q' i6 ]. I1 ]+ {        log.error(“this is error”);
    4 m/ D7 G; X$ U" V; D0 P) s& O: T, O: a# V; R  e
        }9 `6 X. K3 F, S, R

    8 f; D% C5 O' X5 @& y8 V/ VJunit$ t4 U+ o: G( e% F- p1 o0 F
    1.是什么?
    & S" q0 H# \# ?1 V2 _
    . i2 N( n% m2 J+ B$ w  V单元测试的框架
    4 S7 H/ `4 T9 i+ b, i$ H' W
    * R5 X! P: T/ L1 ^1 u9 Y7 B2.怎么做?" _4 u9 k2 y) D9 m/ r! ^# O. B

      y' h4 I6 ?) L3 \+ g7 y# r: q写一个类继承TestCase* f. y4 Y, {" i& X& f. t" a
    9 t% S! P& \$ p6 W8 d2 |
    测试的方法一般都以test开头并且没有参数* ^5 y( p2 U1 C9 Z! N: r

    2 M: U; V8 J. y% I2 e/ g- h在测试方法前执行的方法public void setUp( )
    6 x- J3 Y) d2 F$ b' _4 f- n! B; b% l4 k/ [( J+ |
    在测试方法后执行的方法public void tearDown( ); p: a# U) _2 y8 \8 v- U
    ) I0 N* n9 ^" x/ T* r6 W0 J9 t
    error和故障的区别
    ! A, f8 D" U0 p: C! {: p- {% ~
    error :代码有问题4 Q/ J7 M9 X5 D
    : [9 V6 R% U; P$ T+ t
    故障 :逻辑有问题与祈望的值不相符合
    : \. @! q) o3 A2 V1 t: B" j6 M  p2 s, P& n# e2 I* P' p
    生命周期# {* `8 E8 e. Y3 ?/ V2 ?) T* D4 z
    ( n, Y; _6 R: \2 G1 c  P
    测试—〉SetUp()—〉testXX()—〉tearDown()—〉结束;
    4 c9 l, S6 o9 c) Z- @/ _& ?1 X. @$ E8 N; v2 H3 _1 t2 Q/ K
    TestCase套件- n6 `8 G0 b* \

    : F: y& ^/ k: jpublic class MyTest{
    8 e% U. O0 C* K% k
    0 F& s. J2 N7 o& r        Public static Test suite(){( @4 n; D6 `9 V! I; p) C
    7 K, [% ]! j' ]* {7 n
    TestSuite suite = new TestSuite();* x( T& p0 j3 |8 u( L4 ^

    0 W) h5 m7 O3 K5 Q0 ]suite.addTestCase(Test1.class);. W( M  G2 ^/ U6 [: Q! p  m

    : |  M! |* x$ l+ G" ]  Bsuite.addTestCase(Test2.class);- `9 k& }. P2 `& Z0 f, w' x
    & v2 K8 A! Y- H# R% D2 I
    }
    ) C# x2 A' j. E9 A* _5 W' o6 l6 d1 Q" t. z* `2 j9 z; D
    }
    8 ?! l4 a$ [( K1 @4 C3 \$ p( `) ]
    . P3 r2 s& a$ y3 u

    + k3 u7 l; ~5 o- ZAjax: I6 P" `# P/ J8 f- `
    是什么?
    ! u5 Z; L! t9 T  f# x: V1 LAJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。是一种创建交互式网页应用的网页开发技术。7 P8 a/ d. [2 n4 l2 _

    0 k6 w8 p3 e( U: `5 Z5 h无刷新页面。1 c* b/ n, A- I- I, e6 t7 [
    - T9 K3 I8 y& J6 [1 U3 p
    有什么?& H/ [2 C. |" G
    AJAX是多种技术的综合,包括JavaScript、XHTML和CSS、DOM、XML 和 XSLT、XMLHttpRequest。1 u3 `2 a- z! v4 h; q  |7 t% `
    5 M- G4 h  N6 R
    能干什么?) `0 b. y! M' z
    使用XHTML+CSS标准化呈现;$ w" m2 f% `  w4 Z9 {, M
    使用DOM进行动态显示及交互;8 J1 [# j/ M& v. h& d  a5 p5 B
    使用 XML 和 XSLT 进行数据交换及相关操作;, H$ L# ?4 \0 w, }; l
    使用 XMLHttpRequest 进行异步数据查询、检索;4 H* m3 E2 D$ E$ U; |) n% V
    使用JavaScript绑定和处理有所得数据;
    * P* v/ u+ n% ]0 f
    1 V- N4 o) \2 w6 B( M8 J7 ?% v1 B传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。/ x6 y3 e- f" _. i

    # }' c. Z& f; g4 ]$ F( r! W1 V与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。  |4 Z$ t" m! l9 O4 ~) B

    , ^2 G7 X' e! z" i) q2 w使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。: \% O% H" V" P0 I" Y$ h2 \
    , W8 h* U/ Y# a- G
    对应用Ajax最主要的批评就是:* e' X+ |! P: L$ J* x- ]& F
    1 它破坏了浏览器后退按钮的正常行为,就是用户点击后退按钮后不能看到之前的数据;0 Z$ _8 _+ p+ T' n5 M
    2 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;
    2 O7 B+ q4 J5 v# B  E3 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;  Q) D; S" I# y! s  B
    4 Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;( @7 j$ K: I: {# a5 @. E
    . x5 D- P* Q" V8 U
    怎么做?# X4 X4 |1 h/ Z: J2 O
    <script language=”javascript”>, Y' L/ W, E( E  ^

    & ]/ h; v8 ^' u% K. \var req;
    . \) W8 ~. ^! }2 L
    ' x( _* Z" M( Yfunction add(){
    # e! Q4 T8 O, h% O7 b
    0 U2 ]6 \( x# s& K- f. [//1:创建用于传输的对象
    . P2 e, N9 M8 P( G; ~1 G8 V# Q: X% P& d. B
    req=new ActiveXObject(“Microsoft.XMLHTTP”);5 K( |8 l' j; \4 q' @
    + F( a( ^: {. ~+ a' P7 i/ n
    // 声明返回后,处理数据的方法  ?" S: V# V$ |3 h3 _# B# m. W& W

    ' c1 p- H  i0 F" Rreq.onreadystatechange=manage;
    " T- M; i2 R+ f& U# [" A
    4 ^+ ~3 k4 i$ l1 V0 V4 f/ H1 O//2:准备传输的内容
    9 p. k& h3 g% j$ G, L5 s/ I7 H, K
    var str=”test1111″;
      @# W& m' \& Y8 b' V4 k( O
    # Y3 H7 P5 i/ Z, F4 q' F2 u+ `9 A$ t$ L% q//3:发出请求! V7 ^' ]+ k+ _& z1 ]% L# {
    1 E8 M2 V# Q  F8 n' ^+ \
    req.open(“GET” ,”/others/ajax/test/t2.jsp?str=”+str);
    ; d1 f) }. \' h$ p, }, n
    0 r  h3 d" d1 Nreq.send(null);' m" E% L" j+ m9 a! c5 G0 U; V
    9 Q: R# m. A/ D$ }
    }
    ! m7 }7 |) ?1 H$ C. M: m8 f4 G9 e4 b5 W( y! p  W
    //4:接受返回并处理- j( O: W9 {9 A: Q8 g$ t

    & a& e& T1 {7 A  V1 Ofunction manage(){
    . U; V% o3 Y* |3 e- l4 `& K4 @2 x# X4 |' H' ?
    if(req.readyState==4){0 k7 O% O9 L1 _: H# N

    7 Z+ ~) W- q) j( J" Salert(“r==”+req.responseText);
    % i# [/ l8 P! j# u
    ! i5 X/ N( l2 H}2 x+ J5 |7 R, \4 H. {

    1 D9 C" e( j5 t4 L( Z}
    7 @6 A! \+ q' z9 f( [. V/ d! G! i* @0 K; ~; U* O; K
    </script>3 ?" C' v; }% q$ b7 V0 Z) q% ?5 z
    % P& K5 m1 k! a% g8 A+ D. w2 m
    readyState的取值如下:
    : C+ G1 N$ m, N) L/ [- q1 r. v! N6 g/ o  B/ X
      0 (未初始化)
    9 A; J/ U3 I1 U* a1 E7 h5 M( l1 |* L
      1 (正在装载)& N" W- i2 N# Y" S6 y0 _: h. W8 i
    2 T7 V* l5 e1 t
      2 (装载完毕)
    3 v: l- j& }/ R: t! d0 J, P( t/ r0 Q$ H9 C( V" Y/ N  L" L
      3 (交互中)
    & M% A$ W0 Z' s* s8 t4 g9 C
    0 Q  s# i( W) W* L. G+ O  4 (完成)
    ' e' B. s6 _0 X  _. X; ?9 k2 R& R0 P) [, c* X. A  S# Z
    8 w3 D; D4 S/ X0 \# D6 ?$ B
    - b$ }- u8 }* F( T
    原理
    5 C( r9 a0 [) D3 v5 aAjax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,可以是xml格式,也可以是一个字符串,然后用javascript来操作DOM而更新页面。
    . `; Y" b- g$ a/ x  I0 y: g7 W8 R7 L
    Dwr
    ( s2 v& e, Q- T0 C是什么?( V6 a" E1 w4 h. D5 Z/ G1 L. K8 n
    DWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的页面。它可以允许在页面中使用运行在WEB服务器上的JAVA函数,被调用的JAVA函数就像是在页面中JavaScript方法一样。
    % n; k6 k: S* K! u# ]7 d$ a
    2 q6 o7 q' C5 v( l  ?, g2 X有什么?  Q$ Q: `; R) T% O  V
    它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据;另外一方面提供了一个JavaScript库可以帮助web开发人员轻松地利用获取的数据来动态改变网页的内容。
    " I) ]3 w$ z0 P. v: @& v: |9 t7 c2 h9 Z. j, [' M

    ) `( {, \4 n% z! w$ f6 a) J: g& I1 X. ^* V  q7 x9 a; f* K1 `$ z
    能干什么?# F  x2 V  g' O3 f* F
    动态地把java类生成为JavaScript,感觉调用就像发生在浏览器端,实际上代码调用发生在服务器端,Dwr负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制。
    3 A: F3 i/ l+ L9 B9 Q5 p* n( o9 S7 S  ?, H3 E# v! F

    & K8 Z. |" X/ F! ?+ q" }' m' ]# \5 C$ M- N- g3 q
    怎么做?$ {& Q3 k# G6 X. v
    ① 编写配置文件8 F4 x0 c, P2 R0 s/ V7 s
    ( G4 Q0 O! c4 N! C$ i4 l5 z
    web.xml
    , s* Q: M2 w0 b" n2 L* D6 v4 \" o* S% k; Q
    <servlet>
    5 Q9 j. `! b6 a' q) O: o, h* g7 |5 n" h+ e( g
    <servlet-name>dwr-invoker</servlet-name>9 I% {" {3 g  ], [& [$ C4 f

    ! J: g( H: M3 q+ K% W, n7 U<servlet-class>
    ! ~% d0 ?+ B3 ^2 U  J0 d' F* b
    4 e/ w9 X% s; E& b- v! h0 |' ^; worg.directwebremoting.servlet.DwrServlet* W' S! m$ V( v' h/ w+ m% o3 C

    ' B3 g5 ?" d! |</servlet-class>, w, n+ T% s3 p- K
    0 F- _* ~7 @: I0 r" }
    <init-param>& V: z7 V' e4 G/ j2 P6 e
    ) q2 l! r. Q1 j4 D
    <param-name>debug</param-name>4 ?# f- m. d% C7 I  J
    : V/ w( n& X( v) O6 {& Y  f0 R( f
    <param-value>true</param-value>
    ! K* V. m7 [, Q" \9 L- ?- Q) }; X$ y. ~. s
    </init-param>& ^  {: n; d6 u( n( C4 M

    # S2 l" }9 U/ z3 n* B" R</servlet>5 ]# }2 i( P" y& F7 |# `

    / G" b' O  h1 N% Y- o<servlet-mapping>
    + V! @$ J! b2 g: N9 V5 f
    ; R5 o3 a9 P4 g, j# {<servlet-name>dwr-invoker</servlet-name>$ W3 \; z5 ^+ n/ b# ^9 [, e
    - }# w, P# I3 ~% N6 ]8 ?
    <url-pattern>/dwr/*</url-pattern>
    4 e1 E4 n* W- P& ^8 i! o9 w' W- \0 k6 ]; m0 Z" Q) y2 \1 S
    </servlet-mapping>
    % y2 p: J- N8 P4 F3 j/ C- ]4 l" m$ D! a/ {
    dwr.xml
    * C2 f+ d+ `$ ?- F$ T4 w3 E) H
    $ J- h0 F7 N3 o% Q<allow>
    ; t6 \/ K8 m1 o) w8 W5 l. a/ I
    ! D. Z5 s) n9 }- c3 k' j2 {<create creator=”new” javascript=”kc2″>, ^$ ^; z1 ]: C# `7 B9 w
    - ?! m2 ^1 ], |# V
    <param name=”class” value=”dwr.Service” />& F5 H9 d" y4 i- F' `7 X2 C
    ! o% b7 t2 [7 G1 [$ `, s
    </create>
    # Q% b, d- i' {/ g# R3 g# @+ D
    1 E- M  `3 |8 |2 Y( [/ o/ I</allow>
    & U! ?; H  m: K( @# ], `& C6 ^- t4 X
    7 N0 `' a) u4 ?) P1 P②编写service
    / }% Z  ~! K* l, V
    ; b4 r& @8 |8 j% W# s; o6 Lpublic class Service {
    * r% P9 L& i) a  _: H8 [, A6 |2 l. Q8 _8 e- z7 [; h; e
    public String sayHello(String yourName) {
    + ?% W) }* Y+ n" O+ M% h. b  z3 `( v$ g( _7 f, w* g$ w6 j
    //可以是访问数据库的复杂代码
    $ t, B9 n3 S; H0 j
    : @& y+ ]" z! @* sreturn “Hello World ” + yourName;" u8 w- F% p% s6 Q6 ~* A) c

    " e/ o9 J1 A9 O4 ~4 j}9 l% [+ s7 Q7 w2 c- i

    - q" `, `7 I2 R- O}
    4 J6 N- m- R9 m- w: G$ K4 ]" L% W: A. y5 L, v" x, `
    ③测试DWR2 m1 `) D% l; W( I  L

    + {" D' G3 B0 R# C2 ~9 Y! H  h8 q2 }0 ^将代码放入应用服务器(比如Tomcat),启动。- Y$ \( ?. _" r
    4 o% u) W  x8 D' u. K9 T/ x) w1 Y
    然后在地址栏输入http://localhost:8080/你的工程/dwr  Y2 H! _/ e4 ]: ?: A& N6 {( i& `
    6 t; j; Z$ T. K8 [2 V
    ④编写jsp页面) P9 r$ r" J- L5 q5 P0 y
      ~5 M- `$ F1 h4 l0 C
    1) 要引用3个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js) y7 ]) I( J' c
    3 Y. t# _, t8 z- m* i
    2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样
    - A" s  P5 ~/ _
    ( \( {3 t9 A0 ^( ]) T+ z) K3) js里的service.sayHello和java类的那个有一点区别,多了一个参数,用来得到返回的数据
    回复

    使用道具 举报

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

       

    关闭

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

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