科帮网

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

动态微博

12
楼主: admin

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

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    11#
    发表于 2014-12-03 12:43:50 |只看该作者
    JEE
      s. t6 I) V# X0 C, G1 B简述JEE, O: ^/ f* l) f3 y1 K  _; g3 {
    JEE : JAVA  PLATFORM  ENTERPRISE  EDITION9 T& w% A5 O1 y* Z6 W  ?+ x( ~% |  B
    & p# O4 E8 O% _3 `
    JEE是一个规范集;0 v" [0 [1 _$ O7 ?$ v, r
    3 O# Z. @* N/ c. L
    JEE是一个框架集;/ }1 R7 N( p: B: K% X

    4 w' T, E+ x- {6 zJEE是一个技术集或API集;
    ) k( |4 k. k/ W: o# S( q! w2 ~. p* B+ }( f- t5 ?, }
    适用于创建服务器端的大型的软件服务系统
    3 c. j4 k' \+ E: J: C: v4 O
    ( r! n5 N, @; s
    2 T$ z- I9 }5 @9 W
    5 E! d0 `4 r# s2 ^9 S* R, n# wC/S B/S 模式- v/ c! }( O( I, I: z
    C/S client/server即客户机/服务器模式,客户端也参与程序的运行与计算(富客户端、胖客户端)
    6 w& d# i9 N( q& g: g0 Q9 f! s2 q
    ' v  o0 w, R5 D: a3 |) O9 pB/S border/server即浏览器/服务器模式,又称为瘦客户端,客户端不参与程序的运行与计算
    6 Z7 B) O% [2 _$ }. R# U. ?6 N2 o. _; C) d# {; a) D$ h+ \% a6 o2 [

    ( j% Y& f. I: s! g) W: J6 C: p6 u! _  j
    企业级应用(大规模的应用)的特点
    5 K% _' e2 H3 L$ B5 M. j1.生命周期长、稳定、可靠
    ( {; l$ g1 U6 N# r) y/ R1 g# `! A8 j7 S  J: e+ Y% ]
    2.组件往往分布在异构的环境中,能够跨平台& j- R, V, j- y8 {' }- j

      t2 D7 S3 R) ^) G% u3.维护性、扩展性、重用性
    6 o! ~- e/ _$ V) t- ?7 s" K5 H* G; k1 D, K: I$ S" e
    4.有事务、安全、线程
    ' k( z: a8 m9 {5 q/ Z: ^" }
    $ i- H" n& q2 X, `# b7 W6 r
    4 Z( p) ~" ?" p! N" e' N* z3 W+ v# N5 m! k4 Z, u+ }
    什么是业务逻辑?. I. c# i* ~. Q
    依照业务逻辑划分模块,
    % q) \/ ~+ G0 C" s+ V9 N( p9 A: W6 W  y% s$ m- n& c# S
    所谓判定业务 就是具有以下特征:# L  G. @3 b# \, z

    " M& B/ E' g" u7 j) U1.业务流程
    5 T/ [$ }$ o- m1 g. U9 e  e" O/ m- _4 C: u0 f
    2.业务判断
    0 A$ V. T2 b. P! Q5 g6 a  Z4 v6 v3 ]9 e
    3.功能组合6 e+ C# |6 H  g9 D, Y5 `

    5 l' F. O( z" z7 g- Y
    # k* `! s& R1 y+ N& z% s2 _$ `- Q  u! ^- c  l
    平台(角色)的划分
    5 n. b3 c8 K: p' E1.平台供应商。提供满足API集实现的厂商(BEA weblogic IBM webshphere)
    2 |" `* M. i. t  A) ^5 Y% m
    4 g) r5 b# j5 k# }8 n8 a2.组件供应商
    8 e' i. p* v2 J6 \
    2 l3 N8 l7 D% q+ e& e  {3.组件装配人员
    0 j0 G/ }' J3 z- w6 u; x; ]3 e$ B1 \) q2 ?% K) Z+ K* c% Q, o
    4.部署人员" I5 f# o) S; L- P' v

    ' s& O* f5 n5 [& M; {9 h, X$ h5.系统管理人员$ a9 L- v, W9 E# C5 ^
    " ]) ~9 h, ~3 O5 {; [6 Z: O' a
    6.工具供应商 提供开发组件所使用的工具(Jbuilder、eclipse)3 f9 g/ G( N; ]4 q

    , e; y; Y& M8 C0 j; ?8 N6 O( n
    3 o" b1 z7 d+ S4 V% d0 z/ m( V- ?' @
    java技术分布(设计架构 模块内部设计)
    ! G% J  e# {/ S0 B, a7 h1.表现层 Servlet、 Jsp、 JavaBean、 Taglib
    0 S! o$ v7 l8 }- g
    2 L2 [! `8 Q$ B* E/ Z6 o- R1 A2.逻辑层 EJB(SessionBean)4 H+ O7 O  U( y, i" [! ]
    $ i( B; O' F2 O
    3.数据层 ( JDBC  EJB(EntityBean))
    9 b: T4 p! Q+ z, t
    ; u% r5 U/ R4 E# b4.服务 JTA(JAVA事务架构) JTS(JAVA事务服务) JAAS(JAVA授权与验证服务): X/ M! v, s4 S8 {3 G- I

    9 T5 }  M/ G/ S5.分布式通讯 RMI(IIOP)+JNDI 、JAXP(JAVA 的 XML 架构)9 O/ `$ E8 b7 I- z; \/ e: A& ^
    % F1 n9 V( {* o7 n( ^0 U2 V
    JAVAMAIL(邮件服务)、JMS(消息服务)、IDLC、JCA(JAVA连接器框架 (成))
    & f: p" d& q% L2 n3 d' O$ _; h$ z+ [! B7 V( k5 u. j, p8 \4 K% w. n# T
    / n7 J+ h3 c% L  n4 v8 u

    : l1 ?" D( i: `! M- @JEE的体系结构: 是一种组件的体系结构% q( w2 i; Q. _4 X8 a6 }
    1.组件 : 能够完成一定功能的封状体(独立的功能的集合)
    9 V4 q7 }! I- l( q8 b$ ~% F- X3 h4 }( K6 t2 K6 n
    不能单独运行,必须运行在容器上" f1 l3 [0 p" m" ~. g' ]

      h" U6 S5 g+ E) [0 F$ [分为两类:web组件、ejb组件
    2 A! L/ g5 Q. P7 U2 i5 e' Y7 C; }& M6 r2 h
    2.容器 : 提供组件的运行环境,并对组件进行管理(一段程序)
    4 u" a) ^' ~/ p; G
    , k3 l& _0 k3 J) H! _9 Q管理组件的生命周期
    * |0 m" J. y/ Y1 u. l, `2 n2 \% L: x& u1 J
    不能单独运行,必须运行在服务器上4 I! q& W- C/ D0 F) m
    5 }- I4 v' V# s
    程序(组件)通过上下文来调用容器(context): g9 Y$ X! b( }/ C+ [

    : ?# z& _  b; h组件通过web.xml向容器描述自己,使容器能够认识组件
    5 d# X- H7 S0 y" W) i6 e$ i" u+ P3 H/ X) ~
    容器通过回调方法来调用组件) v6 e# F6 |. `

    ; [7 m  l/ k2 V) z5 p. c分为两类:web容器、ejb容器. t  P( Z! h6 b7 z+ `4 d+ V3 F
    8 ^! x& ~2 ]: Y. p0 Y& K
    3.服务器 : 提供容器的运行环境,提供大量的JEE基础服务" e# |5 W1 M" _2 b" F& R5 ?

    ! G# D$ n/ _. \web服务器(只提供web服务)1 J) [& i9 E4 _, K# r6 U
    - Y( u# x- M( G+ r7 h
    jee服务器(提供web、jee服务)
    ) r2 a( r- k3 [/ j7 ^) ~. R. T* w0 r- }- G: q. c
    & `' m* H/ r/ q6 y8 A0 q
    : R8 O8 U' E- P, _: }( F1 ]
    什么是回调方法
    ; o4 C$ \/ P* J  S由容器自动调用的方法,就叫回调方法。
    2 c9 U# W, y4 R1 s6 l
    ( }7 ^' B2 i# H- k" r
    6 e, T/ ^' U/ H$ J( ?" c2 v. \& i
    RMI远程方法的调用机制
    ( Z0 P! g$ N$ i; @+ E例如:A主机有B()方法,C主机有D()方法,A 想调用C主机的D方法
    . \+ j/ i; W# F3 w5 z  w' `* Q. R" F  U1 z1 h+ x+ R9 y

    " y: P; a- ^+ [) o+ h
    " v6 Z+ r! s4 q 0 B9 Y5 I8 s. @$ l& z

    * i( B, [1 T+ [$ Q0 ^# P, D3 J学习方法
    % i% Z; q& O+ w1 n1 e9 o1.规范(熟记) 2.熟悉API 3.多练 4.多想
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    12#
    发表于 2014-12-03 12:45:29 |只看该作者
    Servlet: B6 l7 s  U! l$ O; ?$ O" g
    •     描述war包、jar包、ear包的结构& ^! d3 h0 m& U; v% E
      ! k3 Q# E  L: y2 I+ G, n3 N# w2 z) W4 y

      $ S1 ^1 k8 k+ v5 T. R* ^+ F

    war-                            web文档压缩包

    —WEB-INF

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

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

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


    ; ~5 Z, N; F/ Q& Q& i

    jar-                             java文件压缩包

    —META-INF

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

    " x: C* g) k" Q5 u0 R  t# M# E

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

    –META-INF

    —Application.xml 配置文件

    –*.war

    –*.jar


    & O# I$ W" U; @+ F2 y9 n
    • 什么是servlet?servlet主要做什么?4 z2 A, p% O' Z5 `  B
      2 `" Q* S7 h5 F) X8 c

      $ p* ]# f% t' N  o

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

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

    4 Y# P5 h) k" Q1 j- M
    • servlet 与cgi相比的优点?servlet的缺点
      ! a- w; c9 Z2 v2 U; u8 ?& L* P

      8 U. q1 m; r, B7 {5 ^) Q- V  v
      : y5 o9 O8 W$ D/ x

    优点:

    性能(线程比进程更快)

    可伸缩

    Java强健且面向对象

    Java平台独立

    缺点:

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


    9 B& H* ]/ Z! X5 N' M- F
    • 常用的servlet包的名称是?1 m, W( r; o5 |" E& I/ y
      ) B  m8 T) T* r5 c$ C$ h
      2 y/ c1 G  {! s& ^

    javax.servlet

    javax.servlet.http


    0 j$ R* `# o, d; {
    • 描述servlet接口的层次结构?9 R) L: p; A( e: Z+ y  U
      5 N+ m) H0 V/ C2 o8 T

      9 ?/ A& @7 y0 y. U* |/ G

    Servlet

    –GenericServlet

    –HttpServlet

    –自己的servlet

    ServletRequest

    –HttpServletRequest

    ServletResponse

    –HttpServletResponse


    , L, b! F5 k: q; F0 }) b- v$ G
    • 对比get方法和post方法?* B$ I$ S1 V! M& x# r8 s! w# Q7 u
      0 n$ Q& t. L) ~! H5 S: p0 C" p
      + u, `( M4 B; m, a4 h

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

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

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

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

    ( l; c7 O7 m/ n$ V2 d6 y4 f9 |
    • 归类描述HttpServletRequest接口都完成那些功能
      8 _; c( U. q- D  E+ L

      : A" u. ~* _: [6 b+ ~. b
      3 F- h" X2 M' C: T" w- J
      • 读取HTTP头标
        ' H( ?- }* D1 k. H, I. i2 F
      • 读取cookie
        1 {* r- P, F0 w( d" p
      • 读取路径信息, R2 L! Z# t4 M# ]2 i* q
      • 标识HTTP会话。
        ; }( R' d. E6 N- Q! s) R$ R9 ?; J5 F) ?2 Q: |8 j

    - @& h2 _  `# h0 @3 W5 V8 n! t
    • 归类描述HttpServletResponse接口都完成那些功能7 [- Y. H/ Y5 O7 t1 I) B8 D
      2 O$ s" A" K2 D* m

      $ u) K0 B# G- b
      • 设置HTTP头标  H: _$ Y+ x% k$ C+ E  h. M2 e' E
      • 设置cookie: N! _* U- b3 A) |. t! r6 S3 L: P
      • 设定响应的content类型( Q; @( T9 W/ n0 z: r% L
      • 输出返回数据
        % F. G& D* H7 n+ G6 `2 l$ I- U- b; U5 }5 {

    % G4 h6 {" x) i, o# t
    • 描述service方法所完成的基本功能?默认是在那里实现的?
      - s: J' s0 S- S' n
      8 ?  n# H9 C1 o% r% y" {+ l# H
      ! T% Q) E% i% h/ X, I8 a. ]0 R, x

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

    实现:默认在HttpServlet类中实现

    , _3 ?6 x- S: d3 D( U' @! L  g
    • 如何开发自己的Servlet?描述应该做的步骤和每步需要完成的工作/ W7 X! s3 {, d: C& y9 ~
      + S3 R( t) b- {2 q

      # r  r! \& ~. b2 V# T" \

    1.引jar包

    1)构建开发环境: 新建工程,把tomcat下lib文件夹下的servlet-api.jar引入到Eclipse的工程中

    2.开发servlet类

    1)首先继承HttpServlet

    2)重写 doGet( ) doPost( )

    3.部署

    安装web服务器,例如Tomcat

    在Tomcat的webapps目录下新建一个文件夹作为web应用的根

        在根下新建一个名为WEB-INF的文件夹,里面建立一个web.xml的文件、一个classes的文件夹、一个lib文件夹

        按照servlet的DTD配置web.xml文件

    把编译好的servlet的class文件复制到classes目录下

    lib文件存放程序所需要的jar包

    4.启动服务器


    1 E  i* m- t4 X( c& C# t& W
    • 为何servlet需要部署描述?
      / G% C: Q9 k! r, I& {1 L

        p: e' A6 n" J; P9 K' H) F
      ; J) T$ E. T! x4 Q# r" z

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

    3 _& v2 r  t" y+ [) D
    • Servlet基本的描述应该是?请写出来
      ! |8 i$ e! q0 \: s, d/ w7 D7 D; w4 R
      7 e* G5 l4 K( O( W( c) F7 B3 {

      3 H8 A( f2 X6 r' g/ c! M

    4 G- s/ Q( f$ M7 O8 t

    <servlet>

    <servlet-name>Hello</servlet-name>

    <servlet-class>com.javakc.web.action.MyServlet</servlet-class>

    </servlet>

    <servlet-mapping>

    <servlet-name>Hello</servlet-name>

    <url-pattern>/greeting</url-pattern>

    </servlet-mapping>


    1 w! e( B" H1 E
    • 如何在html中使用servlet
      7 L% k$ r! N3 `& Z5 P

      : Q7 z& S8 H4 l+ t4 l
      8 b" I% Y9 K$ k$ Q, J6 _, v

    FORM标记

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

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

    语法:

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

    {HTML form tags and other HTML content}

    </FORM>


    7 m: t, f* N9 J) W) r
    • 如何接受request中的参数- \4 x- O  b4 I. v) ]& ^; V

      8 |& E) I4 A3 P- ?$ u: N7 G: [String userName = request.getParameter(“userName”)方法
      3 v% F* \5 C& S/ ~6 m; ~
      ; D9 m; c9 i( k+ `8 Q* l
    3 m8 _+ q& H: r+ x2 F
    • 如何接受request中header的值7 g0 q& a! j5 d- |" y, J, Q9 N+ C" b
      " ~* M. J. ?- Y4 c
      3 S, m$ `+ t/ V7 n5 N9 U$ p. d

    request.getHeader(name);

    request.getIntHeader(name);

    request.getDateHeader(name);

    request.getHeaderNames();


    7 P# o. l- ~; I/ b9 G
    • 如何输出html
      & [2 D' H/ m' F) O) }5 u/ _' K! r
      : K. h6 i1 m- M! @& }6 F3 y6 P
      , O# G% }/ Y4 u/ \. g9 ?; f1 A4 H

    PrintWriter pw = response.getWriter();

    pw.write(“<html>”);

    pw.write(“Hello”);

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

    / K9 q$ ~2 H2 V# m& V) P+ o
    • 如何设置输出的contentType* O8 \8 e8 i+ j: ^
      4 \  H3 r' B& C% y9 M

      ; U! Y2 V4 L% I$ N7 l8 {

    response.setContentType(“text/html”)


    * p' D8 |+ S9 A5 b5 Z
    • 描述servlet的生命周期?
      0 q; \9 c+ [" [+ Y
      0 Q( j8 n0 p. Q1 |

      $ }* [# W1 b. l; z, k

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

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

    7 h( i+ i( i+ `4 l) E
    • 描述init,service,destroy方法的功能和特点( M# T9 r# Q* d

      . x% B( z( j! M5 p2 O( _/ B7 e' d' a& ]; H% Q

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

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

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

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

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

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

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


    : \" p5 ]; v+ X: r
    • 什么是回调方法?有什么特点?
      4 P& G$ G- s) \+ R% U2 b: j

      # m# k: c9 x- k" V+ Y
      $ z! ^$ j% J; Y4 U& i

    由容器来调用程序的方法

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

    5 C" C; }  O; z1 E2 t5 m/ }7 I. \
    • 如何设置初始化servlet的参数?, r: V" G: m+ I

      " j! y& g  ]. E$ V1 F在<servlet>中添加如下配置
      % ~4 s+ @% i# R  X/ B+ U0 r. \! V% p8 T# P

    <init-param>

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

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

    </init-param>


    ' f/ r+ @: ]% e1 z8 c3 Z3 f
    • 如何获取servlet初始化的参数
      8 ]' V2 r6 F+ r) z: Y# b8 A

      . ^4 U' o- f* r7 D
      ! S* W6 f9 d8 h: z( B: L3 q: x

    public void init() {

    greetingText = getInitParameter(“greetingText”);

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

    }

    0 d0 z! D: ]! ?! O# A6 P
    • ServletConfig接口默认实在那里实现的; H) l3 H4 x9 R* T, m0 f5 [: A; r: m
      * a/ K" P3 F, a5 e& U
      , P8 K) X/ ], p

    GenericServlet类实现ServletConfig接口

    / E1 l' F& r5 l1 {7 N
    • 什么是ServletContext?有什么作用?
      ) |2 F$ d0 t6 a, s, F* j
      / @' ~) o3 u- y3 O+ n

      : B9 p" V3 `7 h* [

    Servlet上下文

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


    ; G; \8 {4 s4 h$ f% s! V
    • 如何访问ServletContext接口?是在那里实现的?
      0 `, C( a/ z+ t; n* e

      0 H- Q# T4 Z+ K5 |# _- a; c  J# O7 N( I

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

    GenericServlet类实现了ServletContext接口。

    - ^) z' z9 Z: C8 P
    • ServletContext接口的功能包括?分别用代码示例  p* Q( h* ^* Y+ @! V, [& j+ @& d
      ' R0 F1 o  G# k; a

      % Q6 l4 p  i7 p6 g( P/ {8 ^

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

      }# k* V/ z1 O1 @; u
    • 如何设置ServletContext的参数?
      5 B/ l% ]4 b# Q$ j. F
      $ }. v7 K% N4 P
      2 i# T( d! x% K# R* f0 n

    <context-param>

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

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

    </context-param>


    8 |6 i" A! J5 P/ z/ T. ]( X' g
    • 如何获取ServletContext设置的参数值?
      * `, h8 O7 n2 j- x! }& h/ A9 q  X

      ; d% O* j. D: R) \) P
      - B$ G6 T- S/ b; O4 l8 O, G0 K$ W

    ServletContext context = this.getServletContext();

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


    ' W( ^  A: X7 |1 V: c) i
    • 描述Web应用的生命周期?
      4 D7 o! A, a' W: ^9 I8 T

      ! A* x$ K/ V4 ~) G' ?$ G$ t* K$ L9 J$ N

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

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

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

      T+ l6 @- f; o! t* X
    • 如何用代码实现监控Web应用的生命周期?* t7 c; q( a6 ]1 n. V5 \3 [) c
      , F( \7 H2 E# U2 w+ ^& ]% V: p

      5 x! g, X" S0 B! L6 m7 f7 q# u4 }/ z* I, t9 q: ]* H

    public class Test implements ServletContextListener{

    public void contextDestroyed(ServletContextEvent arg0) {

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

    }

    public void contextInitialized(ServletContextEvent arg0) {

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

    }

    }


    # A, L; w) b' j

    web.xml文件中的配置:

    <listener>

    <listener-class>

    com.csy.Test

    </listener-class>

    </listener>

    : P( k2 l; E* L0 [( X0 W
    • web应用中如下错误码示什么意思:400,401,404,500/ S+ u5 U3 n/ {/ K

      ) X' J: c# l7 i7 K  n. k5 w
      400 Bad Request//错误请求
      401 Unauthorized//未被认可
      404 Not Found//没有创建
      500 Internal Server Error//服务器内部错误

      # X+ p0 ^( q* l$ z8 x% P  h6 q9 _2 \
    - v5 S" n& R0 m0 V
    • 描述Web应用中用声明方式来进行错误处理的两种方法
      3 R4 U- M3 x  h) _1 L
      " c6 ]3 Y* ]: d& F2 J/ X/ [! i; y) N9 {
      % U+ O& Z6 d4 w

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

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

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

    1 {* Z, M. |/ }- ^3 d- Z4 v. P
    • 描述记录异常日志的方法,都位于那些接口?; K! j: m& L5 U, ]' _: g) C6 t( u
      2 g4 z9 u2 ~. C8 C* j

      & k) _' \6 f% N. F$ i8 X) O' M% n

    GenericServlet:

    log(message:String)

    log(message:String, Throwable:excp)

    ServletContext:

    log(message:String)

            log(message:String, excp:Throwable)

    - _" V0 u& M5 `: O0 d3 a/ O
    • 什么是会话?" R1 m: y: `. O2 Z/ z
      " @2 L7 t5 z+ ^& p( y
      . L: h; ?- Y( X5 e& @

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

    9 t' b& L6 ?8 R8 v
    • 如何获得会话?  C0 j* Y; z1 y; [" a/ O* D( c+ W
      4 d2 y* H! q* u0 y6 P6 @8 f0 Q- u! [
      HttpSession session = request.getSesseion( );

      . v% B) I8 f7 @% g
    / T: u2 V' \+ x' p% C& c
    • 会话Api的基本功能?
      * @1 ?4 t2 K4 r. C/ k0 ?

      5 ?+ U+ ]( n+ N9 J. G6 t1 E; Q/ ?
      0 P- B+ W$ ]( u, X! k

    getID() :String2 J6 V6 y" ~; n4 E9 L4 N) m7 h2 @* D

        isNew() :boolean
    . Q  c$ x/ `$ a# D5 ^2 e

        getAttribute(name):Object7 n6 H) |2 p4 {: x9 {8 i

        setAttribute(name,value)' y' W) Z# l6 u# @* u! h- c( Y

        removeAttribute(name)

    9 ]# T& ~6 N. e+ p6 r3 |
    • 如何销毁会话?
      ( D( n. E- N+ U2 N1 l$ j! }
      : U7 j0 w1 U/ j  R
      % I( o8 l! F! f* `

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

    <session-config>
    ' p0 _% f9 t2 u' l! f( n' G

             <session-timeout>10</session-timeout>
    " V' |, [; I8 M1 ~3 u4 H

         </session-config>
    " J! ]& `: p: ?( v4 v& G/ V* J

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

    invalidate()
    + S" D9 L2 x) T* R/ F' z( u% \

         getCreationTime() :long
    " ~1 n' J* L- U% ~1 G& r$ Z1 ?

        getLastAccessedTime() :long
    + a, i2 V2 x' [. N! V* Q

        getMaxInactiveInterval() :int
    ' y& @/ F7 d* T5 i1 ?

         setMaxInactiveInterval(int)

    : ^: `; S; H  ^! r
    • 描述会话保持状态的基本原理
      1 B/ [3 ^2 |7 W
      5 E$ s4 ?, \- _8 c) J
      3 B4 e" h! o8 S9 R3 }$ w/ `/ u' z
    , Z( k2 l8 v$ A  A& P8 c

        client server
    " ~1 k+ S2 R9 h9 {0 d+ Y; J


    - H# q8 m: E8 a  T  w0 {$ t

    request! R2 x& R; K8 F2 |% _  s

    response (sessionid)+ v5 Y5 {/ l2 p2 \

    request (cookies)  Y0 `! J8 b% v/ v- j( o$ P

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


    4 n! a% W2 q, Q/ J
    • 请描述session和cookie的异同之处
      ) z- Z& r: x. _' H3 r4 j0 z# {  I
      8 u( S% A' M, |% C
      7 d& i+ L% _7 J: g8 o0 L0 i

    + S; t  @  y1 ]6 m) |7 ?: Z. f2 V  _$ A7 ?0 a3 k# u
    • 如何读写cookie,代码示例" u7 N: j' ~) b  S* o$ Q
      , x+ b1 [: g! S

      * z& Y0 E+ q; L3 @5 j# U

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

    response.addCookie(c);

    读:Cookie[] cookies = request.getCookies();; V9 R4 U$ `, \

            for ( int i=0; i < cookies.length; i++ ) {
    * x) ^' y+ ]0 y* X8 {* V) W4 M

                String key =cookies.getName();
    % b8 |" Y3 g& i* l# S4 n& |! {

    String value = cookies.getValue(); ) O. L1 [2 C0 V

    System.out.println(“cook”+i+“:key=”+key+“,value=”+value);4 [" @2 L4 x5 r

         }


    0 U' c% R" }3 p% Q
    • 什么是URL重写,如何实现,代码示例1 V, o0 H4 X  h
      % d1 C6 G$ E5 h0 f! R

        ?! y5 W% M8 S

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

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

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

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

    ' h- E) [! d( p& |2 |) {! r+ N8 u

    8 R1 E% E; H  C% V0 m
    • 描述web应用的4种认证技术
      9 m' @" ~9 k& A9 k8 K

      9 `3 M0 G5 o7 V( D( w4 O6 W
      / r# U7 |8 `. u; V

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

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

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

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


    $ d0 z6 l5 F1 K8 g
    • 什么是授权,什么是验证?
      " h. W4 O2 }7 D2 z' v* {
      / u% j1 {  C/ ^+ c  Y4 t. ~  Z+ m
      # q7 I& t7 D* }4 K5 u! A. V. h

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

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


    ! J) d) l) C0 t2 ?
    • 什么是HTTPS
      * m7 Y* P. M6 G" P) g+ l" a* J

      1 K% a6 m, h( M& X6 ^: X* ]2 n& t5 {7 B# R: M) k! a, I- S+ E

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

    0 l+ A# g% E) W7 E# T
    • 什么是审计?
      $ u( l2 S( q! c2 K& E
      1 K, B+ q& [" R; Q0 t: a6 J  K
      ; c; p& e: r: e+ ]& z  d, r; p

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

    : a6 B! t4 j- n0 J4 w1 I4 t
    • 如何实现声明性授权
      , R: l5 @0 v! t1 A& ~; x! A3 i

        L1 H, w: o( h( |7 t- _
      3 ~! \0 P' H; n2 C$ @/ U

    1、标识web资源集

    2、标识角色

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

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

    在 web.xml里配

    9 i. z; O" f- C
    • 描述servlet并发问题?0 i7 {- }- f! q% Y
      3 V0 U$ v( ~% `: k8 R
      " S, \: F5 z+ t3 w7 n, U" S

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

    5 c- f* E5 ?0 x( N0 M1 _/ c7 S' ?/ f
    • 描述Web应用中的六种属性范围
      8 O" i- [3 U# Z; e4 M

      8 d2 X7 J  C! U& X/ y* G4 z3 O6 x" v% P$ _8 ^

    局部变量(页面范围)

    实例变量

    类变量

    请求属性(请求范围)

    会话属性(会话范围)

    上下文属性(应用范围)

    ' m/ c3 O4 ~1 P" I
    • 指出上述六种哪些是线程安全的* M2 ^1 W: y2 K3 B" i
      - {. ~3 d4 e+ O& B: @2 V  d: u
      " R6 [1 H$ ^: M% m2 B# s$ X+ _

    局部变量和请求属性

    9 y- y. _$ f9 F- ^0 a
    • 什么是STM?如何实现?
      4 L0 H* Q$ f3 k, J9 v: Z
      # T7 @* Y' {  x0 j" D
      ' N! C6 c7 V( s' l9 u7 S* c; \$ R

    SingleThreadModel接口

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

    " G2 _$ E# k$ J9 w' x) B
    • 如何实现并发管理?- B" Z6 q& H4 S- d

      / `8 _% O/ K* e# `% [: O3 b$ [
      . p5 [8 A3 n; F# w

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

    使用synchronized语法控制并发

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

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

    1 G# M4 \; q  G7 _. o7 D
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    13#
    发表于 2014-12-03 12:45:45 |只看该作者
    Jsp. l% X$ ?5 w3 Q1 H7 o+ ]6 d) G
    什么是Jsp?, t/ y+ \; n# d, u! M* B
    Java Server Page    结合java和html在服务端动态生成web页面的技术3 A$ B  V. h) J" n& U# ?! ^

    5 x2 y* W3 o; ^  R0 F$ p; B
    4 E1 h( h0 S; c# n: L4 P+ ?( q8 d1 K" Y( G& k
    描述Jsp页面的运行过程?( I0 O5 l: H4 x' X  j+ H
    第一步:
    & I" w$ m+ D: \9 n! }
    / j/ x; P; @+ I( M# h请求进入Web容器,将JSP页面翻译成Servlet代码2 }8 h5 q! ~" P  _- r; j' l2 S' k

    ; g4 y( f3 c3 }; H; R2 O6 o( c" a; G第二步:  S& `) X8 A' Z9 D- @: u

    ) k- c: |# N1 Z# o7 {; ~编译Servlet代码,并将编译过的类文件装入Web容器(JVM)环境" b2 o+ t0 [4 X( t+ l

    & F/ m% O' i: f% G/ f第三步:
    ( I0 v3 D, H7 C" i7 L5 t. ^* m$ T2 _6 Y# l3 E
    Web容器为JSP页面创建一个Servlet类实例,并执行jspInit方法( s) W. o9 m0 R1 z* `0 ~
    ( ^+ r3 r, n& _0 F; H% r9 T; c
    第四步:
    3 G6 R# V, z/ Y+ P: |* j- {  e3 m) e/ i0 ]$ P: d5 h+ N
    Web容器为该JSP页面调用Servlet实例的_jspService方法;将结果发送给用户6 _( U3 p  R4 ~
    # C& \# G; F' K( m7 ~# d7 o

    1 s8 F, ]1 z6 D& p
    ; _3 [/ }8 X: I7 ^5 M描述Jsp页面的五类脚本元素的功能、写法、并示例
    7 @1 d$ F: ~5 N( U, N注释 <%– –%>( U" V* a7 g  H/ o* B, y
    * @# L, q* B+ }  S/ q
    <HTML>
    7 c7 D9 f# c( e# n0 d
    ) y& Z. {6 _8 t<%– scripting element –%>
    7 q0 t, w/ @1 T% h! I) i5 k4 u: }
    ( ?6 }7 ^/ `9 x1 R5 K) M</HTML>
    " t8 U& O: k9 C  m$ `# h
    $ Q* L% ?2 _" G9 d( f2 D指令标记 <%@ %> 指令标记影响JSP页面的翻译阶段
    2 P  W- L* x7 X. _: }+ M: V
    . k* Y. p. @7 V1 h  B<%@ page session=”false” %>
    7 I+ i/ _& a  @+ c- u# o8 B; f" o. @$ x2 a
    声明标记 <%! %> 声明标记允许JSP页面开发人员包含类级声明* i) t) J, K  y' C6 c

    , \- [* v5 C( _4 P% l" P<%! public static final String DEFAULT_NAME = “World”; %>5 Q# w2 Q  H2 d  a

    ' u2 K. f5 c; k- q    脚本标记 <% %> 脚本标记允许JSP页面开发人员在_jspService方法中包含任意的Java代码
    3 I& K$ r7 z+ z! y" `$ r0 F6 i, G  O6 [/ j: }
        <% int i = 0; %>( M9 {( s3 z9 c! D

    7 H, V* _/ R/ y+ |( j8 _# ]! ]表达式标记 <%= %> 表达式标记封装Java运行时的表达式,其值被送至HTTP响应流 <B>Ten is <%= (2 * 5) %></B>
    , @$ O- F9 Z5 n! w$ Z+ f7 D1 |6 d( q5 t+ v
    5 X5 M3 O4 {( Y+ G
    - l/ B" e& x: L% T* y
    描述Jsp页面中的注释种类和写法1 ~) w% |9 D' s3 f
    HTML注释
    ; R3 m/ l* x4 N7 G
    ( B+ G( [/ y5 n) P7 G<!– HTML注释显示在响应中 –>
      v9 v( w/ x: A- N; n  v' k0 E( F1 D: l0 }& W  J
    JSP页面注释
    7 S) `% W4 B7 R/ ~7 f2 K+ {% E( F) r$ t4 M, B
    <%– JSP注释只在JSP代码中可见,不显示在servlet代码或响应中。–%>
    ; s# M% z: O9 |$ p+ J
    ' P. V* G5 Q) ]% x7 n' _1 Z3 XJava注释
      h2 B! h& y  T, P$ X$ T# T
    $ P5 x% {( D! Z* H4 ?" D0 E5 A<%
    4 i+ K# h+ X/ Y
    9 y) C, H4 X& B1 r8 J/* Java注释显示在servlet代码中,不显示在响应中
    4 s# H  A) a% R: H) C$ [& u2 H
    1 |* M( G( ~7 l' ^9 g( E! G$ p# Y*/
    7 m% p$ Y$ H! C0 j) K3 N
    & C% i( H6 |3 f* [- L+ a; ]6 |/ G%>
    ) y: t( v( O" u% c* v2 C
    0 d$ x6 G+ D7 D9 `2 b/ W# @
    7 |! B: a9 ]( `1 P& B' x
    1 ]4 C# }1 F) c, n' y描述Jsp页面的指令标记的功能、写法、并示例* L4 g- Y# J0 I! }! R1 f% R
    指令标记影响JSP页面的翻译阶段% o# Y0 X$ S0 x  Q2 d0 ]
    , I3 @8 R  C# {8 F7 f
    <%@ page session=”false” %>6 s, p2 |7 e- f) J
    ' k) I8 b5 [* p: t% c; E1 R/ V
    <%@ include file=”incl/copyright.html” %>
    2 k* p4 P' N7 \" G  H4 f( X
    ' g) S  Z! o0 K$ y" e<%@ taglib %>8 X9 K4 f$ ]0 B9 g% o

    0 {. ]. X; o" o+ ?: v : `! _6 V" u  r& i# o$ E0 j
    ( A# E* H! T7 O3 }* r
    描述Jsp页面的声明标记的功能、写法、并示例4 M# ?" o/ ~0 a, ~# \  A
    声明标记允许JSP页面开发人员包含类级声明$ |& U, `7 C+ z5 W5 I% B
    8 @" ]) g3 P* I" M( J' i
    写法:( M$ \2 u/ B% i
    * h8 f8 y5 ]; c9 `8 m  P3 i/ D0 Q
    <%! JavaClassDeclaration %>8 G6 \/ M) o2 @: f/ m( a" l

    $ i& L# E. u, L  }: Z8 e) p例:
    6 e- A1 p, [/ i" Y8 E1 K" l8 x; _: p! v7 p0 B1 P
    <%! public static final String DEFAULT_NAME = “World”; %>; }$ F% P- `% h/ J1 D7 w

    * P; Q) V# ?3 `8 ^' `: j<%! public String getName(HttpServletRequest request) {5 V& J- m0 z, L3 I
    8 {/ I9 r: w1 [; Q
    return request.getParameter(“name”);
    * K7 ^9 {3 k4 W& `5 x0 j6 x7 w$ P- e( R
    }5 v) d0 l) ~, Y) [0 K; ^, a
    ! ^0 c$ i# r2 g& \
    %>
    * H# `$ Q8 V( w! L  \# P) L$ n2 D; b  ?  H( Q2 c$ L
    <%! int counter = 0; %>- ~! m6 }3 Y7 [! z5 h5 V2 k1 X

      l: L; e5 Y# P4 j " \/ _% N! ~. {7 [

    # ^* u& O5 b7 O# |6 a描述Jsp页面翻译成Servlet的规则
    ) D5 J- m: X& S+ v& V4 P2 `# D% Ijsp中的注释标记被翻译成Servlet类中的注释
    # Y  y% K- s7 ?6 E1 Z0 Q+ y) h( S3 |+ [& |, e' H6 b6 D1 Z0 j
    jsp中的指令标记被翻译成Servlet类中的import语句等4 B- p' y8 H' c- ~+ }" N1 c# |

    1 k( W& `7 k& X. h7 xjsp中的声明标记被翻译成Servlet类中的属性8 F1 V1 d9 {( z8 `8 d! {

    - H# ^1 ~- i) S4 ojsp中的脚本标记被转移到Servlet类中service方法中的代码* E5 `+ _- ?( C' y5 j/ C

    + X. Y1 b  n+ Rjsp中的表达式标记被翻译成Serlvet类中的write()或者print()方法括号中的代码
    0 c( Y# j5 w3 V7 w. w* o0 ^( \
    8 Q$ U6 z2 [  U$ d! x& p* y1 [
    2 e& ~$ [" C" e5 c- R
    # D; {0 d2 p! j描述Jsp页面的九个预定义变量的功能、用法、并示例
    % |9 ]# B: _8 P& Hrequest 与请求相关的HttpServletRequest对象
    3 \9 @) A' d. A
    ! m8 ^4 j& d3 k5 @, e! s  dresponse 与送回浏览器的响应相关的HttpServletResponse对象
    * u% P! k% C( q. [
    # e3 I- a( |' P* s7 ]. N  Eout 与响应的输出流相关的JspWriter对象
    9 H' L, |+ A+ E6 ~6 ^% g! I6 W. F& X% x2 u+ |2 f. m3 a
        session 与给定用户请求会话相关的HttpSession对象,该变量只在JSP页面参0 d( `: |) {7 M! B& ~( C+ z; o/ U

    9 d: N2 s% S+ f8 R8 Y9 r9 P6 Y. j与一个HTTP会话时有意义
    : u! S- k$ B' N. ^0 m6 Z. A% K0 }- S) r* w) V$ S# ^' p1 e
        application 用于Web应用的ServletContext对象" D1 q; p9 n; a9 Q6 O& Y( f

    ) n: z& b) r% a6 \: E+ Z4 nconfig 与该JSP页面的servlet相关的ServletConfig对象: W6 Y7 j4 n6 c) u

    ; p, }; D- l1 h0 f! e; K" KpageContext 该对象封装了一个JSP页面请求的环境
    " N" \  [  p$ P, L
    # x, l# ~7 M( o7 ^1 Spage 该变量与Java编程语言中的this变量等价0 p4 @: n0 w1 K
    0 U/ d. f7 a$ B) H! m& Y
        exception 由其它JSP页面抛出的Throwable对象,该变量只在”JSP错误页面”中可用
    : _% h0 g; }+ M3 Q; S! o
    ! Q2 Q* Z% i, P* ?# n+ E* G. {/ s $ d+ X, ]# c8 e

    4 g! |/ W8 o. Ipage指令的功能,写法、并示例,并描述它的如下属性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding# B0 f5 w  S# R2 M3 e
    import import 定义了一组servlet类定义必须导入的类和包,值是一个由5 V* }8 e! A  [( P1 X

    6 i- f7 u1 b/ `4 n% S* g逗号分隔的完全类名或包的列表。7 m0 D' l% C! I7 B/ S
    # `: V; v- b1 d, q! E" y! {
    session session 定义JSP页面是否参与HTTP会话,值可以为true(缺省)
    0 ?& e: q% T& Y/ R
      g# v! {: C1 V0 H4 r或false。) G" L% N+ P, j* m, h' m) _( a9 e
    8 J/ K6 @5 }9 J. \
    buffer buffer 定义用于输出流(JspWriter对象)的缓冲区大小,值可以为9 v! \& A& R4 x$ [, Q1 l1 {1 P( L

    : C- X5 t. _3 s+ S7 q9 _! Y5 C8 ?none或Nkb,缺省为8KB或更大。
    1 @6 I- B9 D& E2 u0 C
    * g! J7 }, |' C' ]- o: ^errorPage 用来指定由另一个jsp页面来处理所有该页面抛出的异常
    $ u- R6 e, l8 s- R0 R7 n/ j! A9 |1 p8 x, S; s
    isErrorPage 定义JSP页面为其它JSP页面errorPage属性的目标,值为true或
    8 e! U& j7 }# P0 W$ X: S" O" L: u* y+ m
    false(缺省)。
    4 R7 l5 x$ S  Y. A# a: b) d" O8 Z" K! `
    ContentType 定义输出流的MIME类型,缺省为text/html。
    : k7 i% D6 D0 Y" ~) ?0 C% Z
    ; u9 Z3 b3 f! E8 C# k' kpageEncoding 定义输出流的字符编码,缺省为ISO-8859-1
    , \6 H) i/ E. w9 f. l: M1 F1 B' g7 Z: ?' t6 ]5 l% k# c' E

    % t2 \( {+ W+ o6 R( B: R' p& ?8 d' D5 D; d$ r+ X: r
    描述MVC各部分的功能?MVC的优点?MVC的缺点?
    4 M- p; t! q5 `3 A  PMVC各部分的功能:9 y& A$ L* w: a

    ) r1 |, z( Z/ H, t1 s! J% }) wModel(模型表示企业数据和业务逻辑). ]' C' @7 p' h" ^5 `

    2 m5 _( Z) R/ V3 Z封装应用状态2 L# P) d5 j- e( P# I6 J# [: r/ i
    # k9 @1 V5 ~* M
    响应状态查询
    ! t3 H$ E! _- m1 h0 {$ y' ~6 y
    & U$ b* o+ F5 P/ q3 E6 l# ~) `暴露应用的功能
    6 ]5 G; H0 S5 D- S5 v# v; k& T( A0 U; c/ Q+ p% I
    Controller(控制器接受用户的输入并调用模型和视图去完成用户的需求)$ D$ J8 m+ j/ `7 y& X7 q

    % v; H: p% c8 o7 E验证HTTP请求的数据: m9 W/ J: _. V0 y

    1 N! D3 C" b. ?+ z# J* y' W3 ^将用户数据与模型的更新相映射
    6 L( x5 ]! T- \4 P4 S0 D: c: P# t! H4 o/ q9 i% H# x
    选择用于响应的视图
    + p: s8 ~2 x: b$ `; ]3 Z+ {4 i
    View(视图是用户看到并与之交互的界面)$ G' W0 q1 ~, L

    9 ?; p3 |- [+ y6 N! ]: `/ \产生HTML响应4 p) y1 G. x' G8 b6 s: M

    ! x$ n& n% C& r3 D) ?/ z请求模型的更新. N* `& T+ }* j8 ~

    7 u/ c; d/ Q& M) t; R% M提供HTML form用于用户请求# ~; w; {5 s+ G  ^; U& Q, R

    / M* j2 |  a2 l* _0 F6 p0 k* OMVC的优点:0 V* y9 F2 t! e
    4 C1 R% @/ u  U& e! X
            低耦合性:视图层和业务层分离- _* h% q" S9 ^. e0 h
    9 p, w. c& _7 \
    高重用性和可适用性3 k' H) R+ t! p6 G; L/ I4 K
    9 F1 o2 q( N. D  j% n5 b$ `6 x* L
    较低的生命周期成本+ Q/ J% j) k7 B% L/ C0 K) c9 N
    / S; X& u7 N. W" G$ b
    快速的部署
    : b. ~- m6 \7 y1 j0 F1 ^+ [. j* K& J  x
    可维护性
    * T1 V9 m: B/ s; A/ }8 m  e
    # ~2 }: \  {% M7 g. i有利于软件工程化管理
    2 F7 A% v2 H) L: D, E- A+ p0 i+ D/ {% Y# U
    提高软件的健壮性& D: D8 \% f, s& X3 q; f2 N
    3 H# y: A0 Y3 E3 a. J
    MVC的缺点:
    . r9 c* U! w  J% E7 s; ?/ q& U2 O# }; \, z
            工作量大,增加工作的复杂性,MVC不适合小型甚至中等规模的应用程序9 @; L" J( c9 a6 i9 O

    . _" y2 n! C) x
    9 E" S; e& |8 m, H  ^7 F: x/ {  p7 M" J# Y' W2 r$ G: K% I1 K
    什么是Model 1结构,以及结构中各部分的功能) \8 Z" x8 C# k  \9 l# S4 n' Y
    结构:jsp+javabean$ ^1 O' X7 A. I9 @
    * t& W6 Q; h. U5 [9 E: F
    Model1中使用jsp来处理web应用中的视图控制部分
    ( r2 r" u  X) {- I* p# ?& d1 q" ?  {& D( H
    Javabean收集参数* v3 N6 I) U* D: c- R$ j

    / H# K) k/ L" R7 [
    4 E4 M: R  w9 T8 E9 P3 l5 e' `! `1 O2 K  ]* b
    什么是JavaBean?
    ! t& T# P* s0 T' @用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。0 j' w6 s$ x! N8 b8 p

    ' u5 N$ I; u, y, N5 f7 u/ M* D, p& P: _ : |2 a: [* _& y' ]9 e" \

    : B% E6 y+ p+ J' V5 [! [4 }JavaBean的规则?- R! {, i8 p% t
    使用get和set方法定义属性$ s0 L8 x2 {  E

    & s) g" P2 ?1 s+ \  Z一个无参构造方法
    ! e2 a7 ~, @- t' y  a1 y! z) [
    ( _3 F. D) |, J无public实例变量( 所有属性私有化)- T' y+ z- A& k' t$ U; g* r* p
    . t% _/ Y6 k7 z/ s7 ~; ], g
    4 I3 `* r3 o; V; j6 b( {# e
    4 M/ n) K. I5 H6 ?
    什么是jsp标准动作?包含那些?分别都是什么功能?如何使用?
    ) y; M  p* D# a/ ~# }- AJSP页面中使用类似于XML的标记表示运行时的动作
    $ f2 I5 h$ _. A" j0 m& h7 g; Q2 t, d- k4 z6 e  s9 M/ d0 L9 a
    jsp:useBean& b* z/ {, t: l8 c

    ; i9 K" G/ S+ n) R) z: }1 D7 Xjsp:setProperty
    $ n( ?- p9 v. V# K. R4 W5 ^. l. N. q4 l
    * z5 I- ^  n. qjsp:getProperty
    5 C/ E% A1 E9 ^- c/ H1 H
    9 S# D0 q& _4 \* \( c6 h2 ^jsp:param; I! P0 u% M% R' v' k. m
    7 }6 p, O4 z. F+ f
    jsp:include
    % q, F: n; L. P" |/ R- S6 F0 ]* W, |) v" R5 T2 d/ z% y  I8 @
    jsp:forward
    & a* ?) F6 Q' m( _  {8 ?: }- h; W
    0 [2 I/ z( W* B6 ?4 [6 v

    8 [$ b# d0 ^+ G" W& e& y# D用代码示例如下标准动作的使用:useBean、getProperty、setProperty( ?$ U4 g) [) N" h" U: N" P
    <jsp:useBean9 E( F. H8 d! W* L0 w, |" j

    * e$ A* ^1 ]# X4 Iid=”myForms”
    ( I$ P* \/ G+ j, g8 P
    - f8 I! w5 ~9 }" fclass=”com.base.mystruts.forms.MyActionForm” scope=”session” />
    : }' G$ P# V1 ?( G; i% f( d
    ) H7 B2 o% K7 u6 J# V9 w- B2 K    <jsp:setProperty name=”myForms” property=”name” />0 k( a. _( o7 j0 Y8 g
    9 @2 s  d& U% b) D9 E
    <jsp:getProperty name=”myForms” property=”id” />4 L8 m/ h2 d) ?* h/ P# C$ ^
    % e7 C' ^" I2 I; \* ^  w
    + J+ B9 d" ^- b
    ( ~* T& K# m. s
    描述说明Bean的四种scope. ^& R" S& {: `9 D2 M
    page
    4 I+ m/ d" F: x) b8 K! n2 }0 x2 ?6 r6 D& R: d- `1 E
    request
    2 g, V% R9 h0 C6 G% J. X4 N9 A; F
    session
    " }9 B: F$ k! l- w6 u0 C9 V3 j* W  C9 T
    application
      l& l; S5 ~5 h) H" x( u% i9 X* n$ u# E  \

    0 y" D, c5 }6 s% `" m3 d$ v8 |$ R$ u' @" h. S- ~
    描述说明页面上的字段和Bean中属性的对应规则
    8 d7 u7 |8 e" ?. U3 }id 指javabean的变量名
    9 B& {( n2 G+ ^$ v- y$ g% p9 R1 r2 V# ^2 u9 t/ Y
    class指javabean类的全路径
    & p2 ^% W: \+ m2 b2 {. u6 t9 F8 t: F/ S: O) s* h3 E" V
    scope指javabean的应用范围$ q  A9 s/ p  C  A5 O' i1 b

    7 ~- s0 [( n: u; d4 l- Yname指所用到的javabean的变量名
    7 T( l3 M3 s( L, o% c
    6 ]& N2 B8 j1 ~    property指javabean中的属性
    # ]  ^7 V1 u" @+ u
    ' @+ m2 X$ i' S4 o8 j3 C - W- }/ k3 n& D1 u. V' N4 z; A
    / P$ e; p: u( Z
    描述useBean动作的处理过程
      L7 ~$ K- m- A- F  e使用id声明变量* N4 Q) ]% R3 d7 `

    : |5 W% r% l: Y6 b9 M试图在指定的范围内查找对象
    ( y0 X) ^# E6 f9 W' H. q
    ) t: f' l! M7 }, X3 e$ ]如果没找到* R$ O5 I  K+ F7 a

    5 x, W& F( s- T2 g. H创建一个类的实例2 j5 m. y! }. K9 q7 B! m- i

    6 x& G: b, Q2 z执行useBean标记体初始化对象( {1 X" h+ d3 t7 v% f* `

    , p- q% b6 H% w# l9 c+ e如果找到, W: C0 i0 v% q& v2 A! |

    + s- _( P, w+ `4 K; ~     将对象转换为类指定的类型$ v% N$ P7 G  A* F/ |4 t

    ! T2 o3 n+ Y# U& R7 l
    8 |% \/ q' D% k, r
    4 E2 S0 ^* l% D5 l1 {描述forward动作的功能& A, ^# ?. Q+ y& R& `
    使用脚本代码处理请求时,可用jsp:forward 动作产生一个不同的视图,
    # w1 }7 C: K- G1 {  X, H' m' r: D0 E5 Z0 v. k% X  ?
    使用同一个request:! n+ _/ W  u, J) i& B. |

    - O; y9 m& S$ H8 F( m$ d
    ' r+ R8 l6 l- D5 \  P8 j
    * ?# F( C. [$ s# T, E1 ?什么是Model 2结构,以及结构中各部分的功能, y0 l" I( s! J9 A0 j
    jsp+model+servlet
    ) L# t; f2 S3 H1 e
    1 J: a: L" m4 W7 `: @3 ]' ZModel 2架构使用MVC模式,JSP页面充当视图,Servlet充当控制器
    2 `- e3 C- M7 r  R
    & d7 g! n' ^3 e, L- B  FServlet控制器:
    : B, P4 U7 H. |; T4 ~
    8 n! j3 @5 s7 v! J% u验证HTML form数据
    . S6 @# T( R9 |6 |; g
    - v- C! t$ i5 Y7 n& i: a调用模型中的业务服务3 N* B4 M4 R$ Q- b$ H% n- [5 P# b
    ; r2 Q* E4 V' B  k* {- \# [2 e
    存储请求(或会话)范围内的域对象' h; n3 ^* e7 @2 h7 i" f" e
    4 ^( y( d7 y3 R, A& M% z; h
    选择下一个用户的视图
    % x. \& x+ A( {7 u3 Y; q! P- S, h2 ?; W
    JSP页面视图:
    . ]/ r! }' {! I! P: P/ v: k8 D0 ]* U% z: E( c7 F
    使用用户界面(在HTML中)4 ~  e$ }* V; q, `8 Y- \
    ( @: P! S, A+ G0 O% G. `* O
            访问域对象
    1 Y6 u/ h" I& ?. Q! P# o5 r2 w3 o3 _5 L  u! S

    4 ]$ @0 Y: Z7 W7 @! Y1 q' z
    # p8 v& c- }5 \& Z# T- G如何获得分发器?分发器的功能?
    6 D# M! b( F' H上下文对象中的分发器:
    " {5 Z2 ?" E/ f# _2 d9 u1 a, ~; T1 H$ v4 N9 S
    ServletContext context = this.getServletContext();% }7 l0 B3 \; ?. o' W

    9 a& {5 ^& j- w0 t% d9 LRequestDispatcher servlet = context.getNamedDispatcher(“MyServlet”);
    & R" Y6 N# B8 y; b6 {5 S) A) x$ C$ P0 T
    servlet.forward(request, response);
    0 H! H1 o! G6 z6 g* R: I" `
    0 n7 E& f  X7 ~" P; |5 E请求对象中的分发器:
    3 r  S$ i6 D9 ]" c
    / l1 F; l( k; i$ ?: H8 u) K9 kRequestDispatcher view = request.getRequestDispatcher(“tools/nails.jsp”);: e, B0 R! P+ F$ e0 Z% v

    7 B0 @% V6 v5 l+ q- B  Z  f9 F" Zview.forward(request, response);
      O  F: z7 a+ [; e+ L# v; V5 T' ^- x6 F* ?
    可以将请求转发到另一个jsp页面,并保持请求的传递性% o8 [  ]5 {( P
    ) @  k: `2 V- ], y

    5 L. p; H+ a% p$ \* h5 a7 X( x: b% X+ w. X" r' u4 N
    Jsp中页面跳转的两种方式?% ~& [# F8 G/ J# [; W9 o
    使用分发器跳转页面
    * \# ^" V! _5 ~2 ORequestDispatcher dispatcher = request.getRequestDispatcher(“url”);
    7 s& k* O$ G$ e4 T# z/ T/ J- [% K+ I; g
    8 w: \8 `: r$ G# ]( g  ^dispatcher.forword(request);2 f5 N3 M8 x  f  F$ ~8 c
    9 a# S4 {) U% d, |' c! g4 W6 p
        特点:保持请求的传递(上一次请求中的数据,在下一个请求中仍然可以得到);
    0 y1 P$ l# d" w, w( k' V( v0 F" F( M9 C; J' b
            转发的页面只能是同一个Web应用程序的其他Web组件
    * x2 A! C* w1 i1 z. K; |9 a2 ]  m7 M) R" n5 f! Z. T. N# ^% R
    使用重定向跳转页面
    " W1 k2 q; m/ Iresponse.sendRedirect(“url”);1 t5 }9 O) u. w
    . F4 R! {) k7 T
        特点:产生全新的请求,(上一次请求中的数据,在下一个请求中不能得到);5 O( l% z" D, y+ W! F

    ! K2 y  J( p5 j3 |6 K        重新定向的页面可以是任意的URL' q2 r6 g7 e& [7 d- ?

    7 q8 I& c% h: r) N ( P# Y9 g; I0 \

    % {( i- V6 K6 F描述Jsp中引入另外页面的两种方法,并比较两种方法的特点?4 q; {+ w, J# B/ U. |' m
    <%@ include file=””%> 在编译期间把另一个页面完全嵌入这个页面,可以说是一个页面
    $ M1 ^7 l/ e. P& @2 r, R( h% J* E' ^8 ?& r5 F
    在这里可以共享变量
    , d; w* r7 ^2 r/ s' Z. }0 W- Q+ z+ N0 Z% X  G
    <jsp:include page=””> 动态的再运行期间把另一个页面加入这个页面,可以说是两个6 z! I1 G' i- d5 r6 X+ \

    9 q* ?+ @7 S( P# {. \* j3 U页面,不可以共享变量9 k& P7 J& K* m! V+ @7 b

    # p" R3 _2 _% }1 @1 o
    ( D9 a3 V. |/ n6 L6 Y- Q4 h: J; O1 i  Q, i4 v# v$ E$ m
    什么是自定义标记
    3 ~2 X2 n" k9 B4 F8 x9 c8 M- t自定义标记库是一个Web组件,
    3 f; r. j5 S+ h+ E2 b7 j- k, y) t9 p9 J# }
    包括:5 j6 l" o& g; e% U4 l( H
    8 Y5 O5 b* f. r% J, L  K
    一个标记库描述符文件(*.tld)5 I, A2 C2 u! c  m  g
    # }- _3 X" Y  i/ x" m0 g+ M
    所有相关的标记处理器类(*.jar)
    : `2 C+ A; _: H/ W. Y' w; @0 V2 e7 A; u

    1 M$ k7 b  E- Z; A+ t
    ) O, {6 p$ Q5 [( [描述使用自定义标记的步骤,以及每步详细的工作4 Q. o; B; p! F
    使用自定义标记前,要拿到.tld和.jar两类文件
    - h; @4 s! X5 l: y4 B
    ' z# j4 _5 x& q( R把.jar文件放到WEB-INF的lib里面。
    0 L6 W9 ^' r! S% d* G: w. B把.tld文件放到WEB-INF根目录下。+ a) U6 R6 d% N! [
    在web.xml中配置。; D" P/ D5 o9 L( S4 l
    <taglib>
    6 V/ l0 |0 S3 Z2 v* ]; {2 l
    % U; B8 b: r: O! d; Y<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
    6 U( ^8 A( h3 g( x0 Q8 o  _3 A5 \; ~9 K
         <taglib-location>/WEB-INF/c.tld</taglib-location># `: R% Z$ U$ z8 w) @$ g
    , c/ n' ]' d$ {% ?% b1 `$ N1 m  t
    </taglib>
    , x! }1 q$ h1 _& t5 h' y9 i
    8 g  A& ?% ?0 x; s( _在页面中引用。: p1 r+ E1 r* N
    <%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“s”%>% f* N/ Y1 L7 G+ f- E
    9 z0 b( L7 X& P2 }- I/ u3 ~
    uri必须与web.xml中的uri对应4 s7 q$ G% k+ V6 B- U* M
    9 q  T% j6 t4 `% [
    prefix是前缀,用来区分是哪一个taglib
    ( z% r) X  i& x
    9 B, V% J5 a: e$ V. T& v使用标记
    * i, |0 t  P( l* q0 T5 q' u4 a( u格式:<prefix:tag名称 属性>. y: i3 M% T5 ^- x' d7 h7 p/ w

    / ]  V; {8 x3 q3 L+ m<s:forEach >
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    14#
    发表于 2014-12-03 12:45:59 |只看该作者
    在tomcat下配置数据源; P: @8 H; M1 z7 a7 E
    1、服务器与数据库的连接
    * G4 I. @) ?4 y. x
    # g+ W0 |9 E. l4 m9 L4 e# D; o  [配置server.xml文件# @( q8 i( c% t' M# ~! L) A
    ! u, Z- f/ Q. q2 m8 X; B. ?, m' T$ e
    1.oracle* x' l' q: }/ {1 E! T# ~# Y6 N

    % d, G  I* V0 B0 @7 K! z<Resource name=”jdbc/company” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”2 _0 f8 a( Z) S
    . k: U0 s# z6 t% {- U' X- C- {
                            factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”- D  Q6 w8 K- Z7 i/ o$ R  @

    3 d8 E7 e; u+ D, {* W) x7 Q: Yurl=”jdbcracle:thin127.0.0.1:1521rcl”' r8 E3 p$ i4 y- _# T) j* N3 p$ B$ `

    9 G' f( u: {1 @4 C! n9 N3 _driverClassName=”oracle.jdbc.driver.OracleDriver”
    % w$ h2 r+ L3 ^- n% l- {/ @+ d# B( L( s
    username=”aa”
    ! R- O: J) T  i- z0 x& v5 h
    # ]: K8 _( C5 H; m4 T# T$ Jpassword=”aa”
      {* o2 ^, G2 s4 J% h
    6 Z7 D: u, R8 m- |; jmaxActive=”50″
    ' ]3 u! m( j+ N" K" t( O
    ; a' z! P$ Y0 n! |  \maxIdle=”10″; G  Z. |! l* J" H9 c
    , ]) ^) W, R8 N; w
    maxWait=”-1″1 v9 T- v6 ?2 [( W0 ~6 N2 c

    # Y/ |$ [4 d' b  Z( g! x/>
    4 y# |0 D2 ]( a7 Y( _
      T/ Z& ?" b+ h+ Y& E2.sqlserver9 T  T8 h6 B4 o" n7 V' I; L2 f

    ) Y" ?: N# [- Q<Resource name=”jdbc/webpage” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”; Y2 k' h6 O$ F. [' D7 d7 p

    " o0 G0 U) K0 ^! J5 o        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”  }; x$ y0 g! w! A' j- K" s

    " ^4 `) H$ R, I; b8 d7 uurl=”jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;
    5 J+ }9 R# g0 }6 U4 X3 g; `& y" L% N7 S+ ~( H. Z( c+ b2 q3 B
    DatabaseName=webpagetest”+ b0 s) T6 e( ?% |6 S# W1 A
    * J' w0 \3 F7 _, a. I, w4 V
    driverClassName=”net.sourceforge.jtds.jdbc.Driver”
    4 o- X/ Y1 K% }* i3 Q3 @6 L/ W# |. k- j
    8 D2 h9 L5 N" |. e* L$ `' P& Susername=”aa”6 o: S! l% H; f, m. P
    7 K# f) w/ u  H1 e# k" }/ i# V
    password=”aa”. P& @& V% }0 h, y6 r, T
    % t# h7 v- a) s
    maxActive=”50″
    ; A" s* n, I, }0 B8 R# Y) l* n# y3 R( x2 r9 Q& }+ J$ ]5 N( o4 q
    maxIdle=”10″
    , a7 E0 ^2 `' ?) _% C  e7 |2 v$ f. x. i, z; S6 H5 U4 {) Q
    maxWait=”-1″
      g0 {+ ]# V* q; R. Y, F1 Q8 S
    % c( E$ z2 I0 }$ o/>) b9 R0 r+ j% F( A' l6 b
    ( x+ X9 M5 p- d; e. c0 K: b# l
    2、配置自己的web应用的xml文件
    $ D$ q7 k6 O. t; I7 ]; l: f
    ( }/ v8 S! O- x3 o  l2 V
    6 P: [/ D1 Q% D% m" B- F9 W  D% \: p! ]$ d' f) Q1 M8 L8 H
    <Context path=”/eb03web” docBase=”F:/workweb/eb03web”# E% A4 T% f( a- O+ Y2 Y& p
    - J7 H6 m% [4 X/ I9 z  ]
    privileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>
    ; @- U2 g" j1 v2 s  [9 Y& \1 w) U% z& M9 d! N2 e3 s% H
    <ResourceLink global=”jdbc/company” name=”jdbc/company” type=”javax.sql.DataSource”/>$ V' Q2 c2 ^- H& {* i& J2 w  Q# e
    + a. [* I; _) W# s1 Y  M
    </Context># d) G' t4 Q  T4 X! S
    . s0 ?/ S3 T+ C9 F

    ( g+ c6 M/ f% N. f# w- h4 X% ?
    # F# j% d3 G1 o3、配置web.xml文件
    * ]' M, O; `5 t1 J
    8 ]: i+ z/ p3 u: W# {, e与服务器建立连接
    ! J% B, h% q* C' J$ [/ g7 f9 i8 ]+ q' I, e& `4 h2 M. ]3 e
    <resource-ref>6 n% `; |4 x( |

    ' [  V, U7 g1 G, d: W7 F4 f! a4 t1 m<res-ref-name>jdbc/company</res-ref-name>- J; A! ]% T: H4 s0 D
    $ Z' L: r6 m0 F+ B, V
    <res-type>javax.sql.DataSource</res-type>, C# S3 e) X& t1 Y) c0 k1 Z+ L

    3 M0 X  i& a6 }3 f* n<res-auth>Container</res-auth>
    7 X( i5 v- N, U. E  S- |  |1 x
    ; B% g1 b! y% S# q! l! B</resource-ref>. ^# k' J3 }9 o% r7 C$ @0 s5 X
    0 Q) [: P. c& p$ g8 n
    4、在应用程序中不直接与数据库连接,通过DataSource连接池建立连接
    9 W2 M: d1 u  ^( ]0 L2 }$ E$ Y3 R' I9 _4 m
    //1.在程序单独用时设置系统的属性,在tomcat下可以不用配置,
    , o* _2 u7 V; a- N$ t# u( S+ r/ q: b9 H  N6 N' G
    System.setProperty(Context.PROVIDER_URL,””);
    3 k/ c' O: ]$ j
    4 Y; t; @  r6 y$ ~System.setProperty(Context.INITIAL_CONTEXT_FACTORY,””);
    + ]# ~/ k; [: O3 d% j/ W7 H; G* b1 [8 J
    . @* U, S, M' ~( ?* e//2.创建一个上下文对象9 \4 g* G3 O' `2 O2 O
    9 v& S; L. L, P# n
    InitialContext context = new InitialContext();
    ; h- P3 r) F' [3 I1 f
    ( J5 d8 }) s( w; o( w% S//3.通过上下文对象在连接池中查找DataSource6 H" J0 i% M0 T0 R# \- R: E
    $ d# }! S. P& \# c* L3 v5 Y6 C
    DataSource ds = (DataSource)context.lookUp(“java:comp/env/jdbc/company”);
    " H: t0 g+ Y8 ?
    + r- ^' K6 J9 o& r//4.通过数据源建立连接
    4 e7 O2 B. K/ |" K+ ~& k) K6 O; D$ _9 j
    ds.getConnection();
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    15#
    发表于 2014-12-03 12:46:30 |只看该作者
    ORM对象关系型数据库映射# [; s7 {0 P+ e# q; p) T
    (Object Relation Mapping)
    4 K& M/ O- F3 o' e: b) K
    * l8 h# E0 V% [: h4 p% G一、映射的特点
    , N' n% D8 P) K) K( e+ R9 n9 O' r7 R# P! j% f+ [, n
    1.一个对象可以对应多个表% J+ k7 B5 `6 V3 N  Z; W2 ?* m
    5 ~6 u: x3 a! s* S) b7 Q
    2.一个表可以对应多个对象9 f) T8 `) e0 e0 f1 A) k) E. i
    1 ^9 r3 d0 n$ \$ r, u0 t
    3.对象和表的关系不用完全对应
    # U8 }% T' y. ^; t2 u
    % M- d8 l- R% a3 k# C4 V4.对象的属性的名称和表字段的名称可以不同' M3 m3 y; N- z. v! j' I0 }4 w
    ' d* r* F7 A2 \: \
    5.类型可以不同,但数据类型之间可以转换! S2 V3 K' _/ R2 \

    ; }: @0 x# g% D) A: q# y6.对象中必须有主键,数据库的表对主键无所谓; G5 U$ q+ f) E7 T2 {

    ' b# N1 W0 I) c" T) N7.数据库中有主外键关系时,对象中可以有,也可以没有# I' \# F# }, X5 t+ @5 t

    ( P! ]& w6 V  N! W  L( m 0 l% z- z- L6 @

    3 D# S% f0 Y& ?7 p! H, C二 、有一个映射的描述文件————>xml
    ( r1 K) l+ Q) i5 |: ?+ H5 G$ P* m  j: W4 s1 w7 p9 X; R9 s) s6 n
    三 、怎样实现描述文件————>一段程序' y/ @! E2 U2 l+ b8 a4 r# b
    ( f+ l; t3 V. y, ]0 w' q' {( N7 U
    对象 映射(mapping) 数据库9 b' E! l9 G7 U3 |& a- ^
    3 z7 k4 p$ i; o4 f8 g. o8 k
    user1 \7 g4 @/ ?6 i) q6 |4 a# C. K
    1 o: _! o" t1 e/ Z) A# J3 x% a7 B! o
    id=11
    1 F5 Z& E( Z2 @2 B. U$ }
    ) g! D; [" N5 O  i; Z8 G5 L6 iname=”张三”———— > (1) —————> tbl_user(id,name,age,tel,address)" |$ L3 c% w, R7 l* @
      x% ?7 n) ~9 H  p
    age=25 <————(2) <————
    8 o4 o5 S1 L4 Q- J+ f2 Y+ z- I, p. T. W: j' A: Q! k+ a3 }8 z, k
    + U1 ^- }7 f7 K* ^8 O

    5 T. m8 n6 D& s8 ](1)从对象映射到数据库
    ' U/ T& U2 s9 [& @: F; J2 y- F) Q2 p& k
    1.JDBC  w6 C+ h3 \( q5 V
    ' m; w, D6 i' n- {7 ]5 e% U$ f1 h
    2.根据描述文件来动态拼接sql1 S1 I& P+ O9 R( c7 [3 t6 F3 H

    + x  r2 [! A% x7 y: h3.执行,添加到数据库中* ?1 M, v( b; ~8 ~' u! Z
      u; b2 E6 \4 X" t% z- \9 V, t

    / I2 e+ ?2 g; p% N/ u1 x  |% G6 c0 z4 T$ ?
    (2)从数据库中映射到对象5 G) V: t' p: i8 G% i9 O
    0 P$ u8 I+ n0 S  y
    1.JDBC
    2 a; `5 {) j, K0 u/ I* k
    8 m$ X  a: W' A- q0 J1 \- V6 x2 m8 H2.拼接查询sql
    3 u. p  x9 L  ]/ t: w) F1 O1 W: N  S  V' Y
    3.ResultSet
    0 T$ U: L% b) r& ]
    # _$ ~$ }# z  C$ ?. @: P. c  x* j4.Model
    2 R5 U& }2 x3 c# c  }0 c
    - D' Q# ]7 E& n$ l5 P( J " _" h& J8 K+ ~7 z& V; t: R6 K

    : E7 u2 ^; J/ n# ^hibernate+ u5 G& c5 e! G. q9 v2 i) O
    开发流程:8 ?8 S. h4 x8 a: [/ l

    # s1 y2 ], D$ i/ H) T是什么?
    4 S  x' M5 n2 I/ p: U" H% Khibernate是一种基于orm 的轻量级的框架5 R4 P" L1 k0 o2 ~

    + ?2 L, ?& O) B) B . l- }- G  t: M. b

    2 E& a( h9 d, `0 ?7 y0 i5 G! m, O有什么?) w3 u1 l: J4 E, n0 u7 J: L  g
    1. session 保持连接状态(依赖事务和连接池)
    . o$ i$ B# o' q8 V0 D
    " k$ \3 j/ J: o5 B3 N& {2. Transaction事务
    ' n5 j$ w3 c1 [. t& I' v
    ; ^! R  i1 h- q3.
      |# I6 |8 Y1 a7 q5 m! t5 qConnection Provider 连接池
    % t. }6 x( A1 X" c$ y) V6 [2 F6 [0 S0 {; P
    9 N& l% X! }/ t6 v2 J% P: E
    . j4 |$ \, O0 K+ |/ c
    能干什么?* L7 k4 m: ?3 w' f) A4 S0 H, }$ s
    1.orm
    ) R3 w; O- M' M/ d7 }
      q2 o; }" ]/ c0 c+ k0 Q2.提供操作数据库的接口,简化数据持久化的编程任务) P- E0 L; A2 V. |

    " @+ t7 i# ~& [: w   H; |1 t- @. l; K9 k8 }
    + w$ e" r$ d3 v! @7 R
    怎么做?
    8 G& p7 ?; C0 _. Y* ~1.搭建hibernate的运行环境,将hibernate的包和hibernate所需要的包拷贝到lib 文件夹下0 t/ J# R/ b% U8 F- K
    8 F9 k+ ]! F/ [6 C  N$ }
    2.O(vo)9 \' l9 `; a1 _  w: ]" o# m$ D( i

    , x1 ~6 B2 H( R# j0 W5 v  M2 X$ n3.R (关系型数据库中的表)
    6 i4 Z, F2 }! D, q8 S: Y1 t) V6 [" D7 w! a
    4.配置文件3 q, G9 ~1 P( A7 f1 e
    * x( Z& v1 F* e/ ?5 F% p
    4.1 cfg.xml 放在classes根目录下,默认名字为hibernate.cfg.xml
    1 @" |. c1 V- \9 }* {* ?! I, X+ K- C
    a.与数据库的连接
    # O8 J5 ?& F) w* ~' I$ w' G: e# k2 x  v. L9 x* ^
    b.可选配置. k+ j, ?) l6 p
    * W7 q3 r  @$ ]. U$ O. {* U8 G* H
    c.映射资源的注册
    % v: c2 Z' x2 `/ O( P  T# V  [6 l( A: P3 ]* ]6 Q, i7 c. o* h
    4.2 hbm.xml文件 名字与类名相同 并且与类放在一起3 b, x# m) d: E9 I; }# \5 |

    + J% R  Q6 Q) J+ wa. 对象与数据库表之间的映射
    $ p0 _: p( y* v/ y
    / m% L) r- t) J. q9 b9 Fb. 对象的属性与数据库表的字段之间的映射8 @+ i: o2 q* L8 G

    . t& w( g& M/ \0 uc.组件之间的映射% ~% z- y1 r, m$ i

    ' x8 B7 z! `9 L" J8 u6 M, n1 Kd.对象与对象之间的关系映射. n" \+ z$ H0 l( p9 q( k1 |
    2 T& Y, G, d2 O( J" q; W/ o4 N) m
    5、客户端
    - q8 G0 M/ |2 |, w' r2 S7 h% f7 A" F" R( h' d% T1 x% }9 c
    1.得到SessionFactory& M$ l% C) n, z0 k+ V) p" ~( |
      x" F' S$ i. r6 ?- k# q, a! c2 T
    2.通过SessionFactory 工厂来创建Session实例) S( X: |; p  o- v& A

    . X; Z2 r9 |; g' P3 v1 M3.打开事务
    ( f5 M/ J- \6 \1 N: ]9 v
    * I5 Q8 ~6 R+ B1 A& Q  W5 G4.操作数据库; E) K* O( J2 b2 {

    # F  o# Q3 s2 h6 f# s( D5.事务提交
    * T3 o! i: L! j7 v. ]* m; F+ ^
    2 ~# K0 \3 H2 J& |# m6.关闭连接  N  H* }1 Z, j

    2 W) [2 ^9 L( \7 ~3 l$ l# R1 s4 m运行流程:
    1 Q8 A  C5 D5 G" _/ q$ O3 T4 y+ X+ V2 }- _
    整体流程( D" l+ n6 k& p& T# _# G
    1.通过configuration来读cfg.xml文件2 |* _) d$ m- s& r

    9 n  f- C! u5 u2 x2.得到SessionFactory 工厂(根据数据库的连接来创建sessionfactory)6 x- q) D5 H5 ~5 z
    , N6 X6 y9 N: E8 \
    3.通过SessionFactory 工厂来创建Session实例
    # X  N- w3 \: z8 s4 }& ~4 a2 A8 N% F
    4.打开事务, D0 a4 I9 d8 \% G7 B

    , S0 \# z$ O) l( S3 w5.通过session的api操作数据库
    5 x, i9 X; b& {  ~: l5 G5 u$ G
    ! y' Y& j# E5 N5 O$ r& V1 ^6.事务提交  J+ N2 `9 E7 V) x
    : @" q+ V1 W8 L7 |/ l0 P3 [& E& v) j
    7.关闭连接
    2 l: Y/ b2 p6 {0 m
    # q1 P& A$ t- o, s% v 2 z7 }) }3 @) S" V
    : d6 ^2 T: P% n* }( G* C
    save  s4 w# [% }! ~  z& s: i" Q$ A
    1.to—>po
    , E7 V- V+ j  p" @' q
    . K. \5 A* E8 O) M0 ]1 p2.根据model和cfg.xml中映射文件的注册来找到hbm.xml文件
    * e" }. I0 _. V; z: w, C3 _: G" _% N5 Z( K$ n! r! e
    3.根据hbm.xml文件和model来动态的拼sql
    / P8 U% n' T3 _  J5 ?$ A" A8 e+ J
    7 A- I& o  y8 X! I& x4.客户端提交或者刷新内存
    7 X9 N+ [  T) s6 M1 {" u( R6 c
    ( G+ ^  W; }5 X1 z6 U5.执行sql,值放到数据库
    $ Z9 j- e3 S& C
    & A5 F. q" V0 O( n( D( I" d
    4 i, z9 v4 a$ Q# r/ K
    6 x9 o5 S! ], r: Q- t9 ]update、delete7 Z$ Y9 n# Q" C0 n) u3 ]7 a- ]- u
    1.根据model 的id在内存hibernate的缓存中查找该对象3 X$ X! T4 N8 T" |8 v2 h, k

    / T9 D$ Q& C3 {如果内存中没有就到数据库中查找来保证对象的存在
    : M. g0 R& X# g, v2 H* z) B' L* V3 X* x2 s! S
    2.根据model和cfg.xml文件中映射文件的注册来找到hbm.xml文件
    $ g  |$ G  @* h1 a0 A6 o3 e' r6 s5 y, `: V8 C4 y
    3.根据model和hbm.xml 文件来动态拼sql0 B1 A* m) g- r: G/ W+ t

    ( ]% _% i/ }. t; r& W' B$ L2 f7 W4.客户端提交或者刷新内存
    ! R8 Y7 q7 e1 ?  y% W
    + ~6 d6 f- L5 J9 j3 p5.执行sql9 E& Z# Q2 g. G; {

    6 D4 t0 }) [; W% L( F 2 a3 I% Y9 h! J( w* d

    # `! L' W8 }+ v" f+ |Query* V: K5 f; o2 d. E1 \& k% q
    load
    % t; }3 e% B0 U& C% L& u, L
    9 M0 M3 v. {: ?" i' G( o1.根据model的类型来找到hbm.xml文件
    - {% ?$ l7 }- N( n. }9 b$ a8 g3 E9 J  g# \
    2.判断id对应的对象在缓存中是否存在,如果存在,就直接使用,如果不存在就进行下一步。
    4 Y+ j. y# C1 `6 D, }4 b% j) v: N* _3 _7 [
    3.用id做为查询条件来动态拼sql
    $ t: L$ h* E9 g( @& F. L" {5 X- @/ h
    4.执行sql 查询(先在内存中查找,如果没有找到(会抛出例外),就去数据库中查找)
    0 D% z8 o1 z3 Z/ m7 x: \
    5 P# I! Y% o. }* D3 F5.返回一个model类型的对象
      e( i6 _! r6 V0 V4 H
    ' C5 E* U. Z# I% V( Iget
    - a8 R) r) l" O" Z  K2 J" y2 @
    6 Q5 B' [- d# x    1.根据model的类型来找到hbm.xml文件
    + ?  G3 l8 W- V1 S% |! A
    # i; S) K2 ~- t2.用id做为查询条件来动态拼sql
    # u3 |6 G8 D8 H: A( O1 L3 c' d% A" X# O$ b) e8 P& r
    3.执行sql 直接在数据库中查找,如果没有查到就会返回null
    ! {; q) T6 |0 ?0 G* h$ o
    ( Z' [$ s! L, J- u2 G5 squery
    4 n* r7 o  p; j7 Z
    ( U5 n/ O9 F# H8 b# i' {8 u& T* t1.分析hql语句,得到model的类型: q5 B$ a. B* e5 J! I+ k

    / P5 X/ }  c7 A6 d& Z, M2.根据moedel和cfg.xml文件中映射文件的注册找到hbm.xml文件
    % c! g8 s7 s+ b5 v1 o+ o
    " k* \5 s, @1 o2 J9 \5 ~$ K3.根据model和hbm.xml文件来动态拼sql- K; E- C' r& q6 D5 U9 w
    1 F1 Z! U( h( A6 V* m
    4.执行sql查询数据库" y9 Z; D0 v9 |- {6 {- B

    " D7 R: A6 H" o- U5.返回一个resultset
    + T4 ]1 }6 e; Y. @, M1 h2 _, p- H! c
    6.循环resultset的值,放到model中在放到集合(List)中3 x) h1 [) c# u, N

    5 c8 |+ E  f3 k, K# K  U
    $ w& y" [. N9 e& m# p8 x6 O7 ?0 B6 u! p* N
    谈谈hibernate缓存机制
    7 }5 {9 S8 U7 Q6 ?6 H6 I% N9 T2 v: m* h% D) s
    缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了。打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去数据库中取,也省了很多事。
    ' X/ @% }6 E3 h/ g9 b0 k1 a7 O2 A" _: _: S; U5 V9 v3 i  _* i2 O

    ) `! Z3 `* i. j
    1 H0 t/ t8 X' khibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。8 Y: {4 E+ R. q2 r

    2 J' G% j% c; A
    8 `& @: w1 `" m. j
    : M: ?& V- T% {% \2 ~. Y对一级缓存中的session事务进行数据的预存取,数据在各个session的上下文中存在(单例),当session关闭时,就是session.close( ),整个所有session范围内的数据全部清空;二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二级缓存只有一个区域 ,画个图比较容易理解。" r. z1 [6 n& n5 k$ P
    8 b: E/ n$ ~, G, t9 q6 B) x

    / g4 |7 ]! D# n! H9 b$ I- b& n) M" L$ ~! }
    | 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|
    3 r2 F9 e! i) q1 R: H6 D& R. C
    2 r0 y( c( y& c- z$ H, a! W| | | |
    * @' |( c0 m( b% Y; d; b3 r! q3 ^$ ~# m" I( T0 O9 y# }0 P  G
    | | | |
    % e5 F( g% J7 H3 i+ r5 V8 v* Y5 Y. {, f
    —————————————————————————————————( c: Y8 i' D; Z8 l  }1 N

    1 S" {9 K- H9 ?3 W: z' w! p# _$ ?sessionFactroy级别的二级缓存
    ' r% ^0 Z9 w+ `' E2 k8 x! |# p* M/ k- b- T5 ~$ F
    ——————————————————————————————————————-
    1 Z2 \$ e" Q# p1 o! j- X% a! g/ J0 E0 K4 I6 V, k
    |. W! v, W- O, I. ~" H- I- ~
    " {+ N$ p( H/ j4 E
    |
    + Y9 |" F+ H; i1 \. x6 b
    4 ~0 e& ?4 T  z( K7 v% l) P* x" O|4 X; a9 T8 s5 i! T& B3 A: u

    2 c  t* o/ z# C——————————————————————————————————————. Q" U+ q" Q/ N3 c  t

    # e  d7 U. V( }- P, oDB  [2 ^1 I7 N. B& J% A! Q

    ! X) F' b: S1 O' ^. N—————————————————————————————————————–
    3 c; e$ ~, b2 g+ R5 ^1 |1 p0 b0 ]) F+ x) j* E3 g  o
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    16#
    发表于 2014-12-03 12:48:12 |只看该作者
    Spring7 g$ J) j$ D2 d$ H4 p
    • 是什么?
      ( `0 E  q; l# k; G1 M0 q1 ^- ]

      $ f* \( I- q. D  o* U, Z7 h

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


    7 a2 f8 }) @) b; d7 I8 x
    • 有什么?
      1 c& Y# E! N, v! b9 |$ I. J% U; l( [
      / ~9 ~6 R) r6 u3 ^& c
    1 [8 {9 j' J$ e& ]6 j5 ]

    每个包的功能:

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

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

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

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

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

    AOP :面向切面编成

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

    ! ~: C5 B! Z$ G  ^) Y  @0 L: k8 d
    • 能干什么?" L5 z, }. l7 }5 o# u8 U  t
      9 L( m! I) W2 W" _8 @$ W" i4 u

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


    5 p+ n% p  y+ R* l; p
    • 怎么用?) O7 [! v: |2 ~  A9 ^* m: j" i0 ?

      ) J4 Q' E& P* C2 @
      • 搭建web工程,引入spring的jar包: o; C; ^) s0 a; z
      • 在web.xml中添加如下配置8 a: |! D0 D( b3 I
        8 D. D: `" ~  D  P1 b  N+ R; V

      - D. ?' y! Q: ~5 {8 `' q5 U; U+ d/ p

                contextConfigLocation
    ; r" M1 N$ ~/ q) z$ a( v

                classpath*:applicationContext*.xml# P+ O( l/ F% S0 q" d

       
    . L: \) j1 n+ _7 c* E' B% U" X5 i

            $ Z( _7 k8 F- r; E+ D+ }9 Y

                struts2
    8 p, b, i) B* k' e7 A+ Q4 l6 S+ _, k

                
    3 M- E3 C( n4 u& G

                    org.apache.struts2.dispatcher.FilterDispatcher
    , H6 Y' O5 d1 e% N, g- ]

                
    . G7 b" b' S# M# ]$ [

            
    # v- K6 R& [' W7 @" o7 L

            
    7 }  n8 [: l  {1 S+ S

                struts2
    9 O7 U6 L7 s# a4 j3 R

                /*: B" Y4 A+ T. E2 X2 ]

    9 a1 p% k" A7 a: f$ L% b

    ( {5 C) y7 R( G

                6 z- P4 E* S2 v

                    org.springframework.web.context.ContextLoaderListener! e9 {8 }6 Y" A' `* c" }) s& H! Y

                ! w- {4 r2 q! i2 I

            

    • 部署* H" J. \0 i4 @7 b

      ' S! U% U3 T/ O. n: H1 w
    * W' }- y/ o0 b
    ) a' s2 t& n# U, e. @8 T
    3 Z( b8 g5 }5 B' ^' W0 \8 A
    • 容器和bean# v* f  F: ^6 p/ Y

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

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

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

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


    0 |7 b7 P: ^  U/ ~+ j5 |* F
    • IOC控制反转
      5 }" \% C: }' Z' [% I6 K1 i+ J- H4 h7 W9 w/ c  w+ _

      ; F9 h* D, u3 e
      - o# K$ x* E- t7 n2 X8 n
      从前的应用程序想要得到A的实例他会直接主动的去拿,当用了sping后,应用程序由主动的去取变成被动的等待,由spring来控制应用程序所需要的对象
      * Z! c- n: [  Q" I) E
      • IOC的优点% o" A* C  E7 H0 Z
      1.可以通过IOC来获得实例
      2.可以通过DI来获取注入的资源
      • 配置IOC的原则
        / \4 X% U2 S( g" |1 k
        • 一定是可变的资源才采用依赖注入
        • 一定是层间的接口或者是模块之间的相互调用才采用依赖注入/ Y0 q8 \/ O0 R+ z6 H8 M% o# n
    + B3 c: f6 L$ N2 O- c" m2 x
    • DI依赖注入+ [7 y, t7 O& k( F6 v

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

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

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

    例如:

    在配置文件中

      ~6 E4 c. R: R) B9 s4 y* K

    3 _+ F" `! r( [( H5 D
    / U; m; r7 `0 e

    在应用程序中

    Public DBDAO dao ;

    Public void setDao(DBDAO dao){

    This.dao = dao;

    }

    3.构造器注入


    - }2 B! L6 S( {: q6 w6 Y5 y% T

    4.ref 表示参照其它的bean

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

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

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

    6.lookup注入

    7.singleton

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

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

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

    8.DI的优点:

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

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


    , M' E0 V+ F, T
    • Aop面向切面编程
      ) s, c% l0 C) D3 n# f

      * D9 L2 f4 ^2 d. X

    1.AOP面向切面编程 一些较好的模式或者是示例—-范式8 C2 c7 W( f4 V; n$ H" I- b  e

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

    2.AOP的思想: 主动—->被动(追加功能)8 o- e5 x# x) Z9 x  H' g0 Q

    3.AOP 的概念
    + U8 J# V9 t; ~0 l3 N

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

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

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

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

    5.引入 :扩展的功能

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

    7.aop代理 :实现机制

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

    4.AOP的事件机制
    4 B0 l3 I3 J2 A) A% t. J5 l- I! z

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

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

    3.找到切入点

    4.确定连接点

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

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


    7 c: ^2 ]2 ]  J% T( ]5 e/ W2 P! K5 p! \+ ^" O! L5 _

    ' R/ @. z& p" x- e9 n" g+ M9 \  L* b  y! w- }
    ) Q4 Y$ X6 c/ f& U. H6 @3 U

    6 K3 D! S' L; K: \
    5 I$ ~+ {6 q: l! H: d8 Q2 ~

    5. AspectJ- g( ^+ q. ]+ P% o

    5.1.在xml中配置比较烦琐
    / V. A+ l4 m$ P: ?  l' J

    所有的入口必须从一个代理(ProxyFactoryBean)开始
    8 K) N' w, |: W6 i4 m1 A


    1 ?6 y( F6 s. E% o( _5 ^& a% m + d3 z& u. \* u

             # l2 K9 `, F! h& X$ i: R! P
    * D/ |& g# T  A. L5 P# u

    . F( V$ p3 O" T- m; r3 m         % |1 c" [  E5 A3 ~& s5 O

            & @8 K6 Q' B/ r

            


    / e- F  j; h! A% {/ z# Fexpression=“execution(* com.javakc.aop.MyTarget.t*())”/>
    * c" f! x* ~: t" k( P

            ) B0 b# X9 |# A, A0 u0 g

            # n, m1 h# b7 k- M

        ; [. M4 F; @4 Y9 ]2 j4 J4 e


    " O$ [# ^; O8 s& C! [( d2 J6 f3 C' W0 z8 O- a. S" E1 |4 w

    5.3.使用注解的方法相对简单
    . E  G# s9 S: G

    @AspectJ的基本语法
    & m) U: [& e2 V- O, F! {

    1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面: d( p, S# \! v) f: K

    直接在类上定义@Aspect8 t+ n4 ?& i# D% Y" j

    2.@Pointcut声明切入点
    2 }" }4 B/ C* \4 l' c3 b

    2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字8 F7 ]" S$ U4 p) M7 K( X1 x8 _6 R

    2.2、可以使用匿名的pointcut: c! q5 V0 i7 n7 j5 @9 p

    2.3、执行切点的几种方法1 w# w  v4 G1 f  v) r+ T- o/ C% P- |

    2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法
    + J: w! s4 }6 {' G

    2.3.2 within 指定到包,不能指定到类. k  F7 A" V- R/ U! l0 ]7 Y! H% q  C

    within(”com.javakc.spring..*”)
    1 P% V/ m5 V* ?) S

    2.3.3 this 指定到实现接口的所有的实现类
    ! B' L6 ^: |7 K. s% y) ]$ _

    2.3.4 target 指定具体的实现类
    7 s5 y; [; O) K6 H3 s% I1 C0 h. Y

    5.4.advice的五种类型的示例
    ' C& m# Z( h( b9 I+ N( i

        客户端必须从接口走才能得到监控,实现想要追加的功能& v: T0 H9 M. u. p6 A

    5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)
    5 z8 h; S0 ?6 `2 y' g# {. H9 w

    追加的方法的参数名字一定要与retrning的名字相同
    9 Y$ x. |1 e# g, y) K2 _

    在注解@AfterReturning中必须加上pointcut和returning两个参数" P' K3 Z8 L, S' u1 P0 c9 r

    pointcut指所要监控的目标对象的方法
    ) K* ?* e+ {" \6 Q. L' t  {7 T

    得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配* i  J" K' S+ \" `$ j9 h

    完成追加的功能  |) ~( z7 G- w3 R, Q

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    - {: L$ h) l+ l0 K% _8 F! S5 }

    (1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)' ^: G: j3 z, c5 ]- n3 S

    (2).: N/ d6 q) i. h! l9 N

         2.直接引用匿名的pointcut
    & p# n) z/ i0 Z  S- U0 T

         (1).@AfterReturning(“execution(
    4 m- u! y5 s. d" i- O

    * com.javakc.spring.schemaaop.Api.test4())”)
    " P" R9 ^1 ?# P5 O  Q1 a, L0 W

         (2).@AfterReturning(pointcut=: z2 N8 N& |" ^8 b! [' J

    “com.javakc.spring.schemaaop.TestPointcut.t4() &&
    9 d. t% Q( A  Q! j! f2 C: E: N

    args(str)”, returning=”retVal”)
    + _- ]) \0 ?# N4 [0 k$ e! l

    @AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)8 ~/ J$ s7 C& o$ g/ Q5 Y$ ?. D

    public void testAfterReturning(String str,Object retVal){2 \; t8 f3 N( V

        System.out.println(“afterReturning1=>”+retVal+”=>”+str);) f+ @7 p( h9 _2 Z6 V/ B' `7 t

        }, F) X, [$ l4 d& _

    5.4.2.@Aronud
    / n' f3 W) _3 v! q5 t

         注解@Around环绕追加功能;6 X" |* g* W* y$ z

         在执行目标对象的方法的前、后追加功能;
    + T- x" M4 i/ i% f4 f8 ]5 z6 d

         必须有参数;第一个参数的类型必须为ProceedingJoinPoint;
    : @* Q' i  U+ |. }

         通过ProceedingJoinPoint的实例的proceed来调用所监控的
    ; J; \) j0 ^; H6 b$ {

    目标对象的方法7 U' Q( G) {; F

         1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    # B' @5 c2 z# M4 h

         (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    ( j3 v2 {$ {+ t

         (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()
    ' F& P& M, s  G8 C

    && args(str)”)/ D; v4 P% \, y( ~9 n

    2.直接引用匿名的pointcut. w1 A# r) a/ n" T

         (1).@Around(“execution(
    4 a) W7 _3 r( {* x$ P2 U

    * com.javakc.spring.schemaaop.Api.test1())”)
    ( ^5 Z, S4 H+ _2 E0 l7 {3 M

         (2).@Around(“execution(. x2 a9 N. h0 S% g

    * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)- @( g0 d' u* a# D9 a

    // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)  w6 U+ F) P4 S, ]5 q; O6 a3 ]" Y

         @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”), U/ H" l4 `" o$ s! E

    public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{" }- T1 u, k, o2 W0 @

        System.out.println(“around1==========before1pointcut==>”+str)
    ) S. p2 Z$ B' P, r7 l

            Object obj = prj.proceed();  B/ a: Q; |2 F# H! }' X, L$ y, X6 q

            System.out.println(“around1==========after1pointcut==>”+str);) [  n5 H% m8 i- h8 g) z% Q

        }
    3 `& [! e# [+ R) Q9 \

    5.4.3.@Before5 q$ G. K$ A4 z1 ?5 I

    注解@Before在执行目标对象的方法前追加相应的功能
    $ f% A& N; K8 r" E9 C" G

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    2 K. z* {( ~3 \8 Y& s6 K" ?

    (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    + A# g+ h0 b6 s5 Q2 O

    (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    7 H/ R6 I# U" f3 R3 @8 K/ |

    注意args后的名称与参数名相同! S6 [4 h) X, n8 d5 g) J& M

    2.直接引用匿名的pointcut
    " ~- o& \4 P  C* Z% _

    (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)- _; ?0 O% u- y3 Z; x* P, W

    (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    / ]0 ?8 R0 u' e! [- a( e* \8 w

    注意args后的名称与参数名相同
    $ U' P$ _  P& A" l

    // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”): U+ B8 S4 L2 s# _. h% |$ b

    @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)5 I# K2 K) ]0 r3 h( h' a

    public void testBeforeParam(String str){' b$ e& f/ X, p7 m! {9 i

        System.out.println(“before1=param=>”+str);
    & h$ E1 w4 N2 o7 A1 j

    }
    % r' e6 u7 D! C$ h/ y# ^. d


      t8 u5 s  s2 \" Z+ e0 Z

    5.4.4.@After6 C  k9 ?2 A2 |" `

    注解@After在执行目标对象的方法后追加相应的功能( n- M& q0 j0 [& V4 \' Q1 N

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用( a  X/ {& ^" u  `

         (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    $ C9 t- J2 Q/ \5 K* _

         2.直接引用匿名的pointcut
    # B4 t7 Z/ ?# j9 r

         (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)/ m+ ?# U/ `3 V) b# ~

    @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)( v. R! g3 u$ {( j, \" B% \2 O) h

        public void testAfter(){+ _, B  A2 D/ A1 p! v6 y! s$ p

        System.out.println(“after1== >pointcut”);8 a& R5 C9 j* e. h6 Z8 M

        }1 l4 A* @& }& M' _1 [& ?

    5.4.5.@AfterThorwing" k" b+ A5 ?8 R2 M; n& L

    ( p) [3 }/ z1 n" {
    8 e$ A2 V4 K$ H& P" J4 C
    • 描述一下spring中BeanFactory和ApplicationContext的差别3 M3 G: ?% o) ]4 f& v

      ; M& _* x  M  G! y( d3 a

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


    , r8 h( Y! I+ X: }; [
    • 谈谈spring对DAO的支持, X. H6 u# P% T4 F# u. P) `: v

      & i: s& i0 J5 i, H) W

    Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。
    / f; {; s4 {; @. r

    简化 DAO 组件的开发。
    / ]+ W9 O- c0 _- G  z0 B, eSpring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。
    5 [/ S7 B% Y9 ?  ~3 f1 I  T

    IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。
    3 l9 H9 _. x1 z' P" m, ]" x

    面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。9 c+ S3 w, ]6 u- l: J2 O

    方便的事务管理: Spring的声明式事务管理力度是方法级。/ v, d4 e) A* I. n* n

    异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。: b6 C1 Z; n7 k3 l0 A

    2 |  ~; p- x2 ]8 f4 R$ t, w/ J' J* a

    3 [) E6 m0 [- `2 ?! d8 H
    • 谈谈spring对hibernate的支持
      " r& o$ W3 G( @8 R2 F: L
      1 G5 O) R$ l) G: T- @

    在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。
    $ b7 x2 n. c( {/ |" @5 c

    一旦 Hibernate 处于 Spring 的管理下, Hibernate 所需要的基础资源,都由 Spring 提供注入。Hibernate 创建 SessionFactory 必需的 DataSource ,执行持久化必需的 Session 及持久层访问必需的事务控制等,这些原本必须通过代码控制的逻辑,都将由Spring 接管ataSource, SessionFactory, TransactionManager等,都将作为 Spring 容器中的 bean。将这些bean 放在配置文件中管理。
    3 i' _: U& Y9 k$ i+ K4 j! W+ V

    1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:
    9 @9 n: i2 P! |' d! {( C! V" a


    ' ^9 _6 Z' O# [5 @

            class=“org.apache.commons.dbcp.BasicDataSource”>
    5 v) Z4 n# Z: m0 m' ^( B1 r

            
    # C4 A: X; B! p. v

                oracle.jdbc.driver.OracleDriver
    5 r: L4 i3 o, f

            
    6 j3 g& P) B5 _6 x$ h9 o" i

            
    4 Q8 j2 T1 M. L" {: h1 G4 z# E

                jdbcracle:thinlocalhost:1521rcl
    * ]1 b0 d) i4 |7 B" b+ b

            4 L/ [3 l1 E* U! ]; k, w

            
    ! X3 r& t9 Q2 J( k& g; e! m& i: x

                javakc2
    ; i. {( |; g$ K7 L! I- \6 c. e

            ( L& I+ s9 L1 v4 f2 p

            " L* w0 F/ ~8 |1 d% f- O: W' S

                javakc2# a5 X2 q- ?3 A) B& k

            # N8 B" J3 P0 `1 D/ x3 J; k+ p4 ]; Q

        7 Z' t/ M5 q* o/ M


    9 W! D. z% D  y7 X, W

       

            class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>/ {: o7 y. F0 B/ L  W7 i' \

            
    * C5 y- R3 n3 W" U$ `& t# Q" a% c

            
    ; w/ ~. W9 {: p6 A% ~4 ]8 C/ {

                
    ' b2 v6 I, O2 T" P/ D/ Q

                    com/javakc/spring/h3/UserModel.hbm.xml' k7 c# L9 d" p

                
    * E6 f: K# I8 {+ |9 G* y" N; f

            
    ! T, T) F3 D6 y: l2 D4 s

            3 N( R5 @1 Q2 n

                
    ( x2 t0 `4 Q+ j5 Z$ h) R: o

                    hibernate.dialect=org.hibernate.dialect.OracleDialect
    , y  ?: h5 e0 L7 Y) I4 _& e

                
    9 q- \8 c+ K. B6 S

            
    + q' S& a# t; w

       
    % R  d; s% H0 R9 c- t4 P- [$ T0 ]

       
    . B/ V7 }  ]1 @8 _

            3 Y# X3 s& |9 n6 O# `( u

       
    ; u' `; _* S. M4 D( k" d

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

       

            class=“org.springframework.jndi.JndiObjectFactoryBean”>
    $ v6 e; K% i1 K  p, A- R0 j

            & ]& G) `6 g2 I

                java:comp/env/jdbc/myds
    2 g" L, o- h4 {% e

            ' D  S% _7 _% T0 z: N9 K

       

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

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

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

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

          S& ~2 M! i5 b$ G

            
    1 p3 B$ J5 N! H* C; P7 S( Q7 S% v9 U

       
    . k4 M0 r/ D# a* z, f% G" j6 C8 ]) E: L

    - ^; @$ S6 ^% i

        4 Y/ o( q7 |# n$ |

            7 F) I7 r7 p, V0 R  o

                
    , p" ~6 I- P" Y* N

            
    2 B: _8 N+ Q* r8 d  d

        1 j& m7 q. q1 M


    & u, k$ Y: P5 l( c" U* g3 v6 ~

        ) E1 x' Q+ i: ]/ j7 ~# @$ M

            ' z$ C. P' `6 {

            2 P! ?' F3 a" |' N. Y

       
    " `4 g: o  i6 l8 z) Z2 C& ~

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


    0 E- Y7 Y9 J9 {" }, |% U1 L" v
    Spring2.0之前事务的写法
    ' A% L4 f+ X) V" N6 u  _: E
    . {2 ~  Z, M8 u1 r5 b$ C, I
    + y* L9 l0 ^5 y& d, U- T: m9 f
            class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”
    : k$ n2 ~& P) z
    ) l3 a$ p: e3 X
            abstract=”true”>
    $ a. e; k" v! n) @( N
    ! Y/ m! d6 I0 a: p
    & e' f. h3 ]/ O6 m: @5 ]/ `' g2 R
    7 R$ e  g2 S' V' f/ ]( ~

    / j: ?5 s9 \& ?6 M2 g. ?0 M                PROPAGATION_REQUIRED,readOnly/ s/ L4 \# p9 `9 Z3 K. t
    - v% [4 q& ^9 e  P, B
                    PROPAGATION_REQUIRED
    ; K7 f9 c4 h0 Z# C

    # \2 Y" p1 U  t. {* O" d  x; }! ]1 A% }2 R0 @

    9 _2 R7 y( u8 W) \
    ; V5 U4 E9 b8 J

    3 \! d3 @, y6 B: N! f$ _+ X7 _+ e, S5 ~9 v
    • 谈谈Spring对事务的支持1 B1 d' Y4 k" B2 z( F7 h- P

        u  t& G. R) H5 M4 @


    ! U% J1 }1 v& @* r9 J* K# c1、声明式事务管理:

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

    2.做法:

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

    2.2

    2.3 注入数据源


    ( i5 ~& x- F1 K( U1 U7 ^$ v6 j) J; G' `7 k# l
    / K. F' K; X5 P

    0 g8 R% g9 {  f: ^% C# c/ r7 S( e  t' W6 Z

    4 P( f: L( s4 N) Y7 y

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

    , D1 V- L. P9 ]9 l+ P
    + X, K3 b% s$ V; g$ |

    ! W& D9 K1 ]3 k4 ]# k

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

    * A* q4 N3 u: m6 V& o( N- k8 @& D( ?

    8 Q# |3 u( Z" T: B; T+ t3 J( _' _" p$ B+ O6 C5 |

    8 i+ j3 k1 j: D5 G6 ?3 p! u
    - s$ t5 ]( l/ C( u- I$ y2 G

    2.6 定义切入点

    " @! W$ L& |# T# U' w

    , `9 }; u7 D$ j+ p" L  f+ T$ q4 ?
    6 s' m4 j) u0 U6 V8 L+ y6 M. h& n: k. j+ h
    $ F" P! P$ @" T# S$ S

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

    1.注解@Transcational

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

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

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

    ' k2 n+ \3 S2 @% A
    . ^- \! _! b  u# ]

    如何在Spring中使用Hibernate的事务:- M+ ]3 V& k/ R0 c( n

    4 M3 B( X5 i" b+ n1 o7 m. G

    3 S2 l" Y1 L; j1 k5 A* R4 Z8 K3 Z, S

    ; x, G3 S' ?  G( c

    如何在Spring中使用JTA的事务:
    / b; h* b5 W" x, R


      C' v1 p2 k$ @3 H
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    17#
    发表于 2014-12-03 12:48:32 |只看该作者
    事务1 a6 |+ L, ]- a3 y1 A
    ACID7 B3 h7 e# v1 l% Y6 S, P* }/ i
    (1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失败
    6 T5 Z1 r: x9 U: k! Y9 T9 `
    : V" s# o( b8 o) F" C(2)一致性 :操作的前后满足同样的规则,保持平衡。
    + }: E$ f" n9 M4 q/ |
    $ x: b) q6 l- Q4 ?; n8 G& m% R(3)隔离性 :在事务运行的过程中。事务内的数据对外的可见性和可操作性(必需由数据库的支持)5 l$ h* ]% t6 A! V

    6 W) K/ W0 b% X; P1 Z0 t(4)稳定性 :保证数据在事务的操作的过程中不会遭到破坏,而且是永久性存储的
    6 q: k% a; }$ @$ G8 q! f2 @' i" A) Z/ c* }/ g# x# D/ m

    3 V  r* a6 L. y: m, t; O* C1 `! z, \% m1 R
    事务模型! e" i+ d7 `( n- ]% i: l6 E
    (1)经典事务模型又叫平面事务模型(JDBC) 事务不允许嵌套4 Q. m3 X+ ~& a
    ' f# J7 t' D3 w8 a
    (2)嵌套事务模型
    5 p/ w  ^: J+ x3 n* d
    4 q0 ]8 z# ]9 P) T2 v) V
    & e+ c1 k: F0 h) V$ G* h; I9 N) K% e" \
    事务的两种方式
    5 |' x* Q7 y. n(1)声明式
    6 B1 q( \* c* \% y5 |9 V  G% q! R
    5 E8 W+ w5 h" [& d6 t/ z2 I% Q在配置文件中设置以下6项5 u1 m4 n, I8 O" X
    # E( C9 x5 ?) O1 k
    (1).required# z- A& u* [/ g9 @" t% @+ A1 e9 Z/ Q

    6 q& {) s2 D2 m9 u如果客户端没有事务 在bean中新起一个事务
    2 n9 j* ^% `3 o6 D' D* ]9 T/ h( l/ K
    如果客户端有事务bean 中就加进去
    - w9 t. o8 o, T# H
    + K) u4 o/ V' d: Y* k0 W; ^2 a' F(2)、 requiresNew
    + a* C7 e) y, u1 a2 ]$ p6 B% h7 i/ f
    不管客户端有没有事务服务器段都新起一个事务
    2 s8 S6 n7 q- q0 ?5 v# s
    ( j5 o3 \# ]) W7 F6 K+ p$ G+ V4 [- K如果客户端有事务就将事务挂起
    8 ~! e/ a0 U& f5 t7 a1 a
    8 e' m( E. V1 Y3 _9 C; o(3)、supports6 Y3 y( a7 p% O9 F
    + D$ i2 V* z6 j
    如果客户端没有事务服务端也没有事务
    ; D" S" A+ R- ^6 s1 W
    % n$ P  y/ @* o& ^如果客户端有事务服务端就加一个事务
    1 \- w, N" g+ X9 @  y
    & S" J. c6 j  U: y& t7 M: n(4)、mandatcry5 [6 i! w. x; Z9 j
    / P9 W& j! v5 Q2 A
    如果客户端没有事务服务端就会报错/ E+ J% `2 a7 @5 H
    ; W+ Q* N" S: J% U+ d. ^
    如果客户端有事务服务端就加事务" Q" ]" z1 ^, o% t

    : G2 @  u# w1 L1 W4 e3 U(5)、notSupported2 B) w$ X& j% K4 |: R( R
    9 b' R/ }! U0 K
    不管客户端有没有事务服务端都没有事务- g! f5 y6 S2 b9 Z: w

    . N5 k% W- t6 }, S# p如果客户端有事务服务端就挂起
    + i! c$ v5 W0 v" r
    . Z3 O; x& P5 Q/ k! u4 i/ n( D(6)、never
    7 V- {) r: T2 ~
    ; \( w; v* p; {9 v$ g3 {0 Q0 ?不管客户端有没有事务服务端都没有事务
    * w- n2 ~- q9 H' T) O
    . O# `$ r) T. U# {如果客户端有事务就报错
    $ w! U- \  w$ Z2 _' i
    " w8 {: G* j$ v. T0 F5 F(2)编程式事务
    1 K- r' N8 `* Q$ O/ o6 D, G# q' R3 k5 S+ k! r+ L( c  u" F. v+ R
    Javax.transaction.UserTranscation9 @( G4 q) M) }

    - u7 i- Y- v! {, qJTA 事务可以精确到事务的开始和结束( c' M% [9 @* W& T, y- K

    2 c2 z( o7 p5 K1 n. Q" R- n 8 ?* U/ X7 r9 n5 t9 _8 |

    ' @: z$ e+ q9 Z! u$ Q/ t) ?5 E事务的隔离性
    4 s" B/ i7 ]1 Q, X. HRead-uncommited" B% ~* ]5 _; x
    ' S( i* F' z- G  k1 j6 y  i9 x
    读取未提交的数据(基本上没有锁)脏读,存在不当读取的问题。
    ! u3 e* B- s% J* K
    , Y/ f4 C1 t; ?, L& i4 A) s$ Q7 [. A* kRead-commited$ p; Y$ m0 w$ V1 N, \7 m( L

    3 O2 v- |( a6 r读取已提交的数据(行级锁)0 }% P! r8 @6 F2 @0 `3 `  R

    7 b0 D2 y5 e0 p* `4 B4 m无法读取已经写入,但没有被提交的数据。: h/ e7 P$ i9 I4 v2 [

    ( b! K5 o; q% R4 XRepeatable_read, ?5 ^2 u' g* f4 N
    . Y4 k2 T- W: C" g  b3 {1 ]# ?- l- L
    读取的数据不允许修改或删除/ T& k& E. L+ o
    ! I; D( z4 s' p( @6 L, x3 W
    不可重复读(行级锁+不允许修改/删除)" q# U  }8 [2 A# L2 s

    * Z4 D" E, `. ?9 |1 ESerializable/ `) M. d* y5 `- t. R

    ) P( c/ N' M* q5 f! O+ ?幻影读(表级锁)
    $ _; S1 f4 D3 X- W- t  I8 @3 r, ?) L6 I  G' h0 W

    6 o# W! P  p* Z; Y
    0 t" h) H& v, ]4 I/ Tstruts0 s# u6 d; s$ E# q
    开发流程
    % q! Q# @2 j7 `- F. x8 g; D# p
    ( o, \) o* s! o+ G$ N1、创建表单
    / r1 W! m; q, |6 }  V. o: k& l  x3 p  d! a
    2、从表单中获得输入
    & z; J  L: p7 j( m( l4 x! `
    ; l/ M+ b7 p; `: ~3、处理输入(业务逻辑)* v0 I3 s- N+ M. [% Y1 k! V
    - g6 U& K1 b( |( S8 z
    4、根据动态输入改变输入流
    * n. I! A* A& R( E% {( S7 |+ E& c3 G8 u
    要完成上述四步,我们需要创建. P% F2 I/ ?0 Q
    : K/ {  r$ J& H
    1、一个ActionForm
    * z0 m' n6 L4 J, ?0 B% R
    ; w/ ]) J4 ^& I2、一个action3 W5 P% F) _4 ?7 T, W

    - x' u1 d, \$ p& R% F3、一个配置文件struts-config.xml3 J6 K- f1 A  f$ t
    $ i, |9 G3 c9 Z: z! A1 k
    4、创建页面$ [( D6 e9 ^7 O& R8 P6 _

    0 V, a* z% L" Z- m; f" @创建ActionForm  }/ b' r$ n, ]# ?
    1 }, j3 x5 ]* P8 t& b) }+ l
    1、写一个类继承ActionForm
    - O+ Z; }$ d+ C% c
    ! A/ W2 v' v2 g; E8 q2、私有的属性0 e% g+ |& g( |+ _) R

    : J& j$ R: `* t4 c+ i" t  R' v3、相应的get、set方法+ D# B! V, ?  ~( N+ y
    % ?2 g/ o0 ?; E' h" X
    4、重写tostring、equals、hashcode三个方法0 R7 V, K  \' h" X; n

    # H$ a; _8 ~3 u: |  G创建action
    + z5 A! s+ h3 }$ x
    ' `  `# Z! k+ f! w3 A1、写一个类继承Action
    5 U( b, J0 E' n4 w, G7 k& h  x# d7 x3 a- O# i* S: k7 j. ?
    2、实现一个公有的方法(回调方法)- z  S' [0 G! y1 Y
    , K) k5 I5 K; u  `' `6 T3 c
    public ActionForward execute(ActionMapping mapping,* X. D) F" [# m. E' u
    1 S7 T0 r% o- O. Q3 _
    ActionForm form,
    ) ~: F4 d9 p$ m  r1 G* G$ m. }/ c/ ]; p  y
    HttpServletRequest request,
    + X1 R$ q, W; s% s! {7 t) h3 F
    ! N3 |3 Q0 ~; S5 N1 u- u2 |" zHttpServletResponse response)
    ( H8 M/ h* U) E# w3 w0 p6 M1 E' c2 O  l+ B5 c$ q) @
    {
    5 W! X6 ]; Z  v
    3 Y( I" y# t- L1 q0 a# y4 X//1.收集参数
      ?8 s8 E7 i1 r8 B9 P7 @& B* K0 \9 C- I5 b/ e% y8 C; s& y$ T
    MyActionForm myForm = (MyActionForm)form;
    4 n! I1 ?% S7 c( q# ]; {% `8 L7 d# i/ ~: y
    //2.组织参数
    # O: c9 k/ F$ }3 p* H6 }7 \- ]0 C: K+ e0 ]! H( t2 x

    ) R' G+ X. K; c8 @& g% J3 S( y. g+ r& }2 s
    //3.调用逻辑层
    1 }8 E4 o: u8 X/ S  j4 O: s3 q$ Q7 _
    boolean flag = true;! g: O' [, ]8 w" G# M# u
    $ v* E! T2 O5 z/ X, L
    //4.根据返回值来跳转到相应的页面* Z2 t8 p: A. l% e4 |
    " W+ J, C( q" |4 C
    ActionForward af = new ActionForward();
    4 J% \4 ^+ B* G! N& l0 i( q
    & ]6 P$ E" J+ r% I. }7 Wif(flag){- `4 t' L1 R3 `2 r' U" ^/ U7 y
    # y1 a6 _: W$ |& h
    af = mapping.findForward(“1″);3 ?7 N  h- {' d5 l  A6 f
    4 y2 h/ d7 ~' q% V  K9 u0 U6 H
    }else{$ e$ B- u& F1 q& f9 l3 {
    ! c4 X! v1 z& J+ Z; ^8 x: n  _! F
    af = mapping.findForward(“2″);6 G5 g) {! ]  w1 t* P( G& D

    # d9 j& W9 b7 I6 ?}
    0 p$ I& o3 }1 H2 K9 X) x
    ! z8 s+ U4 z+ D" X; |return af;
    / I4 a6 Y: v4 M# M2 [
    ) z4 {. a, J& n% r( w* b5 |}3 q3 F; b; A$ z' r2 D+ c' c2 x

    ! t( x9 ]8 C+ V9 t: O" B9 d配置struts-config.xml文件
    & O+ s% Q  {2 I, l: |  `8 u! X2 l( U% J
    + m5 [" k  i* f5 X. A  U) P0 ^1.<form-beans>
      ?: Y8 m4 X8 q  U) V
    ; H( h; K& E0 T# t/ H' g% R4 A<form-bean name=”myActionForm” type=”全路径.MyActionForm”/>' {+ W; r2 h  Q4 w
    8 D3 J$ g7 O( q) G: P3 J
    <form-bean />
      _6 A( i( @! t* }* C  y, L
    0 x! C) i( P8 d( \+ G! ^( v</form-beans>
    4 V5 f7 E) c* A, i% l) k* b" P$ n* {. b3 n
    2.<action-mappings>0 g6 Q3 E  E, N$ W$ u
    + d7 P0 d8 [1 c+ B% m3 T$ N  c
    <action path=”/sll”0 d( _% T0 l/ G2 Q& Q6 h

    " R8 X0 \  V/ `( ~9 gname=”myActionForm”
    ) y8 o& @( a% b  i. P( X' o5 L; G$ ?5 [
    type=”全路径.MyAction”
    ' D) V$ B& O7 j" k
    6 b, P/ X2 i2 Dscope=”session”, l+ V$ Z" s, V9 D
    : _0 E: P2 n3 P, Q/ M  [2 K0 f" J
    input=”错误返回的页面”>  n' q/ k$ W2 i4 `& {* u) w

    * e5 K; m3 l) q# ]/ P& T! z<forward name=”1″ path=”/1.jsp”>
    1 m- X3 L4 t9 h- q7 J! u# w; [" t* \8 p+ H2 t( S; i5 k+ D
    <forward name=”2″ path=”/2.jsp”>
    6 j5 B4 [. [3 F) M  Y" t! Z7 `( ~. b" v9 i
    </action>
    ' _5 D, ]6 b, f. ^+ e: f
    4 j- }9 N& E0 Z; j8 m( R( g& w</action-mappings>+ t5 q9 D$ ~+ r: Y, ?5 k6 G6 X7 D
    - J) z' m/ E5 p1 |9 m8 r9 l8 X; x
    步骤:1 V$ a4 x: y% C
    1 N3 ^# _2 }. M- I
    1.创建一个空的web应用$ h/ j9 r3 G/ v
    ( r" f* ?! |% c/ u4 f
    2.将struts的包放到lib文件夹下6 Z3 I' [$ q% o* j5 i2 m0 \
    3 v7 o$ ?4 N5 A3 f$ U  }
    3.将.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目录下; C) A. H2 b, Z8 U3 ~

    % l" S- H: o0 k2 s$ S4 A& B6 {4.配置struts-config.xml文件和web.xml文件1 W5 z9 w& c! J; G% g7 t# h, f0 M
    ( c6 P! q6 m: b2 o
    5.在页面引入tag文件uri9 q' u, e# I- {0 I
    ' ]8 t9 W& x+ g
    STRUTS运行机制
    ( V8 i# x- h. S* B+ K2 C' w( u3 u
    ' n$ _( Z/ ?7 I. G3 X* H! j4 j1、界面点击产生请求- r  u8 r; @/ P
    5 a1 N$ k5 ^' z. Z, ~2 m
    2、容器接到请求, f+ y  b9 `8 g  ~6 i' V
    + O0 U& \/ i' d0 s' q+ r# k
    3、匹配web.xml文件中的*.do来调用ActionServlet! V9 m6 Q) R( B$ Q% `1 I
    # D* A8 k7 b0 T$ d" J6 @
    4、ActionServlet的处理
    , C, h5 v; @* _% {+ Z& [; _' Q. w, v/ H& l1 o6 M
    4.1 读struts-congfig.xml文件形成ActionMapping
    ' s+ o! ?+ e4 [' j
    4 a2 G; w  k- y7 ]/ V, ]/ x5 M3 h4.2 通过path 来匹配Action类,通过Action的name属性来匹配ActionForm类
    & g- {+ z; c" |% E, G
    & V7 l+ k) y7 [2 Z4.3 通过反射机制来给Form添数据/ d# S* p) A' x$ u: @; `: u
    8 C6 W& D. E  y) \
    4.4 由ActionServlet转调Action的execute方法
    ) n7 j$ y, u7 a8 b& Q: p6 A. @
    + P( ^7 |+ \8 I5 l4.5 得到execute方法的返回值,跳转页面
    3 V0 @, q# v( V% i. `/ ^
    2 Z$ {6 U3 \: d& ^4.5.1 RequestDispatcher
    . U6 s/ T8 l; Y' K" j8 a' a9 t
    9 l6 U2 T# w# b$ l2 B8 e# R4.5.2 response.sendRedirect(“list.jsp”);9 w" K' O8 m8 K# v9 b3 I
    ( P  L3 Q8 h0 _$ T& P0 h+ J/ q, O: L
    " l$ n+ x+ E. m% Z4 y

    2 p6 L3 ?. {" e$ Z5 C进入execute方法! H' r$ F; O2 X) |- G

    , S; |: c. c7 A1 收集参数$ @+ f- U4 k6 U& e( L7 C8 T

    & q* x4 ^# I3 k" w# `0 Z, G5 Q2 组织参数
    ( N; D/ h4 ^9 `2 U, q3 x  |" v! C1 k$ p
    3 调用,逻辑层; p/ D& S5 ?& c$ ^4 F# y, W. _, G

    + H+ k5 ^) C" u" K, c; F4 返回值
    4 b. p3 ^/ O+ x
    2 Q0 a+ Q$ A  Q( L# z' x4.1 选择下一个页面 (ActionForward)2 [# b+ _3 Z8 J! u' `# y
    - G5 `; w1 z5 I; H1 I. E4 ~$ v
    4.2 把值传给下一个页面5 f) T4 o3 O( A1 L1 \  C% T

    4 L' s. z; @4 c' S0 m 1 f3 B/ S9 E' R) ^6 u0 F. {8 ]

    5 k; a- M8 ^$ G# S# M1 \  Y比较struts和struts2的不同
    7 }  m& \0 y4 o. G9 r1 K9 P6 p' K( r# s
    Struts( m  n2 T/ {: u' R3 ]
    2 t& f. T4 Z* w; Z2 W! x8 q
    Struts2
    6 B# Q/ `' @; G* v% x7 g( T' i8 v+ i/ R+ K2 Q
    组成        五个部分:ActionServlet,ActionMapping,AtcionForward,ActionForm,Action        十个部分:AcionContext,FilterDispatcher,ActionMapper,ActionProxy,Configuration Manager,Action Invocation,Interceptot,Action,Result,Taglib
    $ a! t0 I% J) `# q8 ~url        .do        .action
    , C# p) q# N4 E' s+ J! `. p分发控制        AtcionServlet        FilterDispatcher, h# W+ b. y$ t  K+ g
    收集参数        利用JavaBean技术,将数据封装到ActionForm的子类中;
    ) r! v1 |( N2 \$ n, {一个Action对应一个ActionForm的子类) F0 K' @6 a, h- b1 w0 k

    / y* h9 p0 o, r# \. z" E使用拦截器将数据封装到值栈中。2 e* T# m/ a+ P, u# |
    使用域模型,一个Action对应多个值栈中的Model
    " _! A! o0 ^! S3 b* a1 _4 A% x, J8 P  z( V
    读取配置文件        ActionMapping        Configuration Manager% h4 m% q3 ], U: O7 q3 s6 h
    拦截器        无拦截器        执行Action前后有拦截器+ `+ o& ~1 S$ W
    返回页面        将字符串封装到AtcionForward,进行跳转页面        Action中直接返回字符串,通过Result跳转页面
    : R0 L0 A$ Z% L3 ]( |页面跳转方式        两种:dispatch,redirect        三种:dispatch,redirect,chain
    * }3 O( ^) v0 _% {3 E& }2 ?值栈        无值栈,Action通过在request范围内设置属性,向jsp页面传递数据        有值栈,Action和jsp页面通过值栈传递数据,jsp页面通过OGNL取得值栈中的数据- q" O# j5 o6 D: K. A: d' w5 @/ F
    配置文件        struts-config.xml        struts.xml
    . D5 ]0 ~0 j* U+ ?- B4 x中文问题        不能解决(需要使用filter)        可以解决中文问题:
    1 _3 T2 Y2 [$ {" h+ T- H+ I4 A* H1、在jsp页面添加Meta;2 M: P* |" }' g4 B6 W0 Q$ x

    $ X! l% G( x7 [9 g; g$ G2、修改struts.properties中的设置。
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    18#
    发表于 2014-12-03 12:49:03 |只看该作者
    其他开发工具和技术) P& M6 n( L) |3 u& N2 a+ D' L6 t; Q4 M
    Ant" L5 J/ u- {4 C9 d
    Ant是基于java的批处理工具9 ]% G/ b* B" M+ b

    ; X. X" b2 S/ {- V3 Y; ]7 i一、配置ant的运行环境
    1 R% V% J7 Q0 S0 w8 \6 |4 E5 j( E. V( x+ x
    1.将ant的bin目录添加到path中4 h- V' ]0 ^6 o7 ^) z( z
    & u5 N* H& D& D) a$ l
    2.配置JAVA_HOME. Z' E: Z& s* [1 M. q. C8 t

    2 o& F' E" b% `7 q4 A' K3.配置ANT_HOME$ {! {" n6 e. _  H1 w+ a

    $ W9 q8 @$ I) a; l, P二、配制build.xml文件,该文件放在应用程序的根目录下. K# R" K9 k" Q" {! H- R
    + m* f2 l$ H" P. j9 R" p! U
    编译java文件0 _# M2 o' s1 L
    ( W  [% f' N* M$ T8 R4 U
    执行java文件
    $ e, `  v8 f. N* C$ y& l& e% O0 V
    ! }0 N; a% {% G( r1 i- G7 M# u+ mcopy
    $ A  v4 D+ h% g& z. g+ q8 [- I. R' H, \0 U6 b
    删除
    , q* p6 y8 B% O- T- S( a+ ^5 z3 m) g+ \
    打jar包
    4 X1 f, v7 |, m% d) B* S9 D  I# j* P$ Q! y% C/ |8 I9 o3 y
    根据注解生成配置文件
    % C4 p/ Y( Y) F) F" R. F
    : R* C, K: X4 MXdoclet
    ( T& X7 R4 n$ g: f通过注释生成一系列文件的工具(txt、xml、java、html等): t; t) w$ C) s; m, y+ K. W
    # S% r) n! i/ O: g  D
    xdoclet本质是摸板技术+字符串的替换* U' C* f2 p1 L! u$ B
    2 H# |: ~0 V' X" @6 D, i
    1.在java文件中写符合要求的注释(将hbm.xml文件的内容搬到java文件中去写)
    4 u* U1 w9 y1 M! R. I  L6 L" m. M8 k7 e/ z3 ]/ e
    1.1 在类的上面 写与表的对应' z8 `5 I/ K. \* p5 I  r

    7 x1 A2 E7 I! \1.2 将每一个属性的注释都写到get方法的上面. g1 E  l. ]# n5 `, N. _

    ' \$ d& B( }% j; h. q2.在ant中引入相应的task来驱动xdoclet
    : J! O6 B: N% x3 T! }7 c* y% ~, ^# N
    4 i0 t  Q2 j! Q0 r: b
    , {7 J/ X$ ^8 L3 D) p- j
    log4j日志管理
    ! }# a* e# C5 M) _- \+ R, b1、是什么?
    - b" x- f" ?) U
    . z; T& j! [3 S在开发期间用来测试、对整个日志信息进行管理的工具
    : U9 t, k$ x9 a' ^3 e
      Q+ L$ }' X1 C; ]( B& Y2、功能
    % ?: q' c6 u; r- u) V* {) L
    : M5 \2 j/ ]  O) G) c$ b1.控制输出的目的地- L) h8 _0 E7 r/ r
    7 r2 _' R' B7 J# C9 R! K
    2. 控制输出的格式
    6 A- ?( D" K. b/ D
    ! B' H* r8 n' s) z9 x9 @, I3. 控制输出的级别+ d2 F& Z+ P% i3 O' S' v
    0 }4 _1 \  n/ U% u
    3、日志的级别. G; W( }9 D( J

    * f/ P. Q3 S1 x0 x' k5 I( h. x1. debug 调试" `& U! m: Z  ~. W
    : O* ~9 I# m/ K+ }* o3 q1 u
    2. info 给用户的提示信息" A' j% y' n5 u6 d1 A

    ( p& R: D; I7 J0 Q$ w  Q9 Q3. warn 给用户的警告信息
    5 n) {3 ^8 b6 u2 x- w7 E  {8 s* ]
    4.error 给程序员用来调试9 v0 k+ n: t/ s8 K; {( }

    6 ?1 Z4 N  m) }% I( ~0 FDebug—-〉info—-〉warn——–〉error
    " [1 K# c* ?9 X! q. w) O+ [# q" H1 j4 Y: Q8 _
    4、配置$ z& K2 [. {% t5 i- y+ P

    : R$ d3 z* D! y0 t6 r2 \, Z) j, o1.配置级别
    ! U. h( x8 x- S: S- x# J, S: T6 ^6 V% T1 f  J
    2.输入源 (控制台和文件)/ P7 r! s& c$ O3 a

    0 h0 p0 L  @5 X; U! x$ F3.可以进行分包控制- J+ K5 h" a, w
    / ~9 R! I3 L1 g1 \* G$ D4 ?) v
    Log4f.logger.包结构 = 级别: c  f9 U$ p: p( a6 S4 t" x
    - x5 u. m5 ^6 Z/ g! \- |" E
    5、使用& L  l4 p* A3 h  U" T2 V1 f* c  |5 L7 ^; Y

    . [. K# Y) Q2 o- k- e0 n& z5 CLogger log=Logger.getLogger(Test.class);
    ( Y* c! R, R, w8 d) ~% O4 t$ e4 H, \
        public9 n5 s6 m  f* p& ^. |0 {. @2 `
    void t3(){8 R7 W1 p) }  Q) a& W
    1 h. x/ E, I. n: w( d7 O3 f$ w
            log.debug(“this is debug”);
    % \- d7 J$ p" o# X4 R, D
    4 x* z" ?/ F/ D6 t" i        log.info(“this is info”);
    ' X! R$ {$ y# j! B  s1 J1 z" n, H3 H5 E; j5 f% z; g
            log.warn(“this is warn “);) L3 g' z8 E0 U6 `
    * R$ R3 o/ }) T2 Q% m
            log.error(“this is error”);4 k0 G+ a/ t1 O5 h- ]
    # u8 [- O* ?% p
        }
    / V1 A: s) p7 ^+ J& j
    * l  }5 w0 @0 B+ e. m; \, JJunit
    # j$ o2 A" @+ ]4 s/ T, f+ S4 @1.是什么?
    3 s% t/ B4 l% p" E& f
      u3 ^, U0 d. A' X+ v单元测试的框架, ^, c( q, \7 J  [7 G0 X: a8 k
    & v) y1 r6 ]/ J; m/ \
    2.怎么做?  F( R- A( }& l5 w/ T, i
    1 U. L4 k' g" z7 [
    写一个类继承TestCase
    ; k6 x+ {, |! w0 R4 V- ~
    * h" n$ a1 R; ]* t! C" j: y测试的方法一般都以test开头并且没有参数
    6 e" m$ w5 g( v( X" D
    5 ~$ j0 t$ f0 w在测试方法前执行的方法public void setUp( )
    6 q% u; k. h; K) k, t* p5 \) A  t1 s& L; ?0 h
    在测试方法后执行的方法public void tearDown( )
    + ?; |+ l  ~/ ~! }' }0 N% g' n1 I, X! L2 \: u1 J) @
    error和故障的区别1 u8 T5 q4 }" P- L
    . H. n% r; A0 Z. v9 r  I4 B/ H, f( _
    error :代码有问题9 b3 c) R2 M2 p3 R0 Q

    4 m4 D3 W* l$ |# W故障 :逻辑有问题与祈望的值不相符合; g2 v, C% @( \5 T; H

    1 W* j' T: T* I, R生命周期
    % _' T+ e, i7 |
    % s0 g. f, m# h, I5 s* q测试—〉SetUp()—〉testXX()—〉tearDown()—〉结束;9 V9 `% i6 M1 F4 J
    1 n1 i; y# k- u
    TestCase套件
    6 e/ B3 K4 z+ M" R
    ( x4 H# `( `" ?public class MyTest{
    $ t9 n% Y9 \* s/ [) X: X
    * K8 z7 j- r3 M        Public static Test suite(){% T/ ^$ y5 R, J8 {8 R* ^# n! J

    $ B, {, T! k) N) c4 b$ ?3 ~TestSuite suite = new TestSuite();; ]2 y9 I) v& B* Q( u

    # s7 a1 S9 a, d5 J6 qsuite.addTestCase(Test1.class);0 T6 B7 j6 T" |9 h
    ' b8 B% D% _7 L  F% ]/ U
    suite.addTestCase(Test2.class);
    # N. P, ?+ v5 j, n* y
    0 K1 T& m# a, k}
    2 |6 {0 i8 S+ z- p$ z
    8 N) n1 s& p4 q2 Y- ^- W0 ^}
    ' Y7 m7 j' H: G$ D, q+ j. o7 k$ Y5 t% ^& n

      x* \- S- ]0 E& l0 A7 M
    $ ]6 [7 I- J& n2 jAjax. t+ Y# J) u; Z* S! E6 D/ U' S0 O
    是什么?
    3 H% r7 U' ]2 ]$ u! R9 jAJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。是一种创建交互式网页应用的网页开发技术。
      f$ D  a2 i. L+ W
    2 h5 w/ o/ F% s+ a; m无刷新页面。. T3 g$ J% I( E
    8 @6 }  u1 _" Y" v
    有什么?$ p7 \8 y2 z7 a# ?9 P) j( O; L/ I7 ]
    AJAX是多种技术的综合,包括JavaScript、XHTML和CSS、DOM、XML 和 XSLT、XMLHttpRequest。
    - N4 {3 S, t6 B! ^2 G) [2 G4 P' p$ s( u" c( h
    能干什么?% s9 Q; R) Y7 m) Y( k
    使用XHTML+CSS标准化呈现;% Q" H/ n: l9 |9 ]. b# x
    使用DOM进行动态显示及交互;
    $ Q$ g  ^8 \2 o2 W) R; B* Y( O( v使用 XML 和 XSLT 进行数据交换及相关操作;
    0 }1 c8 a( s" L+ @* V使用 XMLHttpRequest 进行异步数据查询、检索;) s; s- A. b  j9 \/ |
    使用JavaScript绑定和处理有所得数据;& n9 i: B  h' s0 H9 ~' b/ B$ l2 c& s
    3 s- Q; H+ }% m- d
    传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。
    " n, h& k; x. n0 r
    ; w: u4 q; K* B$ ?1 X# T8 L7 ?与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。
    % P0 p  B) Y+ E
    4 |% T! ^1 s" W; @' A# a5 T: f使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。
    ! ^6 W; F, I9 L5 i* C! I# f/ n' [
    对应用Ajax最主要的批评就是:
      ~) |8 I! J/ H% _( E, a. ^6 G2 H1 它破坏了浏览器后退按钮的正常行为,就是用户点击后退按钮后不能看到之前的数据;
    4 j; {0 @( }) m2 _& y1 R2 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;. P" |& M3 p5 p7 q# j' I
    3 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;! ?( _" A- y& p9 A3 E6 Y6 ^
    4 Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;& c  V2 q) q: e! u- k; k
    ! v/ ~# \% w$ m$ }. _: W. O  ?
    怎么做?6 x5 g+ z$ f2 z0 j1 e: O, S
    <script language=”javascript”>
    : I$ c4 }% z' P# k, c; v" o6 s
    . O" S) f8 ~) E$ M* ]' uvar req;
    / I8 d$ a, b  l1 ~7 l0 a# l' T5 }8 W. ?/ h: i; k1 c! x
    function add(){( Q, ^$ d3 U8 G* o7 [1 f

    & X$ ]2 ?- }4 W2 w//1:创建用于传输的对象
    & K4 u. p: P) O0 y: n4 L% K6 V9 z" L2 z3 Q% s1 r0 [2 l6 j& F
    req=new ActiveXObject(“Microsoft.XMLHTTP”);8 n$ _/ X# s6 w' k" A
    " J8 m& O8 I" K& `' ^, m/ L
    // 声明返回后,处理数据的方法
    $ s9 Y2 e7 v  ], x/ p$ ^
    . g9 E. t; c8 w0 rreq.onreadystatechange=manage;+ ^$ P' O5 Z' N) s

    4 `% @# g$ X; i& r% L//2:准备传输的内容6 k# a- k2 d* W

    , l; p, q) u( `! p# fvar str=”test1111″;
    , E8 h' Y& Q' _8 X) @$ t; l  \! a( I1 m+ I, @; S$ O4 i6 m
    //3:发出请求
    4 e0 b1 W% K9 s& k1 v& z( e, o
    , ~) c' Y& J1 {4 e; R% b, Preq.open(“GET” ,”/others/ajax/test/t2.jsp?str=”+str);2 z7 S  r7 X& Z( E/ f3 X4 k1 I& K
    3 {7 h6 t8 S) Q+ D( [. y
    req.send(null);
    0 Q* l; f# F: ^
    & c0 {- y/ h% i4 |2 G6 e4 y! q}
    ! |% T: Y4 K- J
    ; e  n8 F% L: m) f1 U3 q  Y8 Y  j//4:接受返回并处理1 e1 f9 z. A. o1 }& U' y) U

    6 |% X7 o4 [7 L6 |( I( l/ rfunction manage(){: q0 _. O' L; ^3 f) _1 K" P! A

    % p5 V4 Q" q" G9 h1 z' j$ t( Eif(req.readyState==4){9 ]" B& C& c+ }
    2 a6 D1 y8 J* f* Z# W1 i
    alert(“r==”+req.responseText);
    . v. L. [* X$ j( A; |
    ( I7 s+ H1 {3 d! W}
    ) x4 p2 \7 G* V3 a; p
    - z5 Z& J; x; x9 _# |0 ], W}
    * m7 {$ h1 _/ C( {
    + _7 `+ N8 T2 e! A</script>
    , ^8 G  o" _$ f/ w7 q( f5 R' n& x( d( a; Y# s: z; k* C1 ~2 k+ w" q. I- s% t
    readyState的取值如下:# A/ a' I4 _; y; `3 n
    ! Z. p' G. I& `- N  f3 [
      0 (未初始化)* r4 o' u  B) J& H4 ?* v) n8 N

    4 e' i4 Y& U/ E" Z  1 (正在装载)8 ^3 G+ i# p' g$ h9 ?

    0 q; T% B1 G& ?2 A% @% _. ?+ _  2 (装载完毕)
    ( W. Q" J* V: s3 w6 c8 B0 p% h* o3 U: @9 b
      3 (交互中)
    ' Q4 X8 z, `4 f9 n5 q9 U+ ^. G
      4 (完成)8 j8 ?& v0 _" N5 s6 s

    3 z+ e2 y$ Q- |8 ]3 B5 n: B. u+ B 4 E, m6 Q) G4 R5 j# d3 v
    ! ^$ n, o; n5 P7 i& U8 J" T
    原理4 D. X  B7 Z5 S% ~
    Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,可以是xml格式,也可以是一个字符串,然后用javascript来操作DOM而更新页面。
    + w# Q4 O* W5 d3 d" X+ f
    1 g: V& M: y7 r  ~& T0 r4 S. B3 BDwr. J: y5 l0 S# I4 A( l) l6 H
    是什么?
    ) o) k! V& Z* \: g( m" D! hDWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的页面。它可以允许在页面中使用运行在WEB服务器上的JAVA函数,被调用的JAVA函数就像是在页面中JavaScript方法一样。2 N6 t# X# L2 S; F2 I1 m2 f' h4 _
    4 d. s$ h! G. M8 O4 l* s' W
    有什么?$ r$ i. o& T# L
    它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据;另外一方面提供了一个JavaScript库可以帮助web开发人员轻松地利用获取的数据来动态改变网页的内容。
    3 z# Z& b2 w" Y" C8 U2 l: C0 v2 x) l- Q

    5 u+ @; E( p5 W6 h& q7 C* u4 ]) Y' M, x/ q, k6 b
    能干什么?
    . m" b$ f, A: ~" [9 X8 h. `) Z' Y7 E动态地把java类生成为JavaScript,感觉调用就像发生在浏览器端,实际上代码调用发生在服务器端,Dwr负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制。4 k7 [5 d! a, D8 v( G8 L  X+ a

    2 o9 P; E  I! }( U; t! I8 z - Y1 F( j: d) d; w- V# I" |' n

      X) I8 }* F5 m: B0 i怎么做?4 S: R' e: X, V6 H4 P
    ① 编写配置文件* z& X5 I0 ~8 m8 w! Z+ K
    4 S4 d. J  i5 z0 _/ C5 ?) R
    web.xml- m# K. y$ J, `
    / v5 v6 ?+ b$ ]
    <servlet>9 B# c. a. l' g! K+ L+ F. |- r
    " c- T2 d. o: g1 @$ R* h" ]
    <servlet-name>dwr-invoker</servlet-name>
    % [3 b4 Z/ ?; \4 q/ |# {" w! F  P# ~9 w8 }0 ]2 G
    <servlet-class># E# B) k5 Y; Y! ^

    ) c2 D. U: U% P" C: m  gorg.directwebremoting.servlet.DwrServlet3 y( W2 l3 z+ v& ^: M, u) Y  ^
    ' {1 J, X; S" O& L8 e) A" P
    </servlet-class>
    % t! r! p& ^+ F; ^  d+ Q& U/ L6 _8 h  s  ^+ f3 V; m
    <init-param>$ F+ g2 [" J- a0 a

      B) s$ z. g% z<param-name>debug</param-name>$ ?3 `8 M( G% g: {, e9 ~
    0 q$ l  `: c" W7 B! C- y% A+ a& y
    <param-value>true</param-value>5 f8 y1 T; z" t2 Y3 x
    1 M+ U$ M' m1 C6 Y+ {" r
    </init-param>
    & B, ]  d7 V# A* B5 M7 o9 c0 ~0 j. y4 Q. [2 G) ~
    </servlet>
    & j( r7 I  c/ e
    5 D: s2 a* b4 Q( T/ `9 `  Q* S5 ^<servlet-mapping>4 z" T0 t- S' Z" y9 K0 v/ ]

    , H. R( H" l4 R3 [3 g5 T<servlet-name>dwr-invoker</servlet-name>/ ~; `0 o) t. n! R! M

    1 S, z+ v% F7 D* E6 {, F<url-pattern>/dwr/*</url-pattern>8 g/ R; y7 Z- K* ^4 O6 V

    # K, o( v0 z' f3 D+ Q. ^</servlet-mapping>! G; C& [, u  R
    ( ^) C: M2 O& C" `. U! R: |
    dwr.xml
    + k8 c/ \# |8 b* O. K. U( v( `
    " H  u4 ]) I! c& x( \0 \4 T. T" p! K; m<allow>
    6 |7 N# t* d6 a& {5 N
    3 W& \% q: j1 i' _<create creator=”new” javascript=”kc2″>
    1 W& K9 Y( w0 y. i1 M1 r
    2 E. M  _7 o: o8 m<param name=”class” value=”dwr.Service” /># E; M  X" g  o7 `

    ) p' S7 j! G- R7 N0 Q3 _5 Y</create>4 K4 B1 d" @  |: n- @- F

    5 ?5 A) F2 J% G7 a# m  p* r; q; G</allow>
    - {4 C' c6 H; [, m$ [7 N9 F1 Q/ Y2 H3 Y. b9 j, H
    ②编写service4 o% f  T$ c$ {* J, @: c: k' K

    * w* K! E* I5 s: o/ bpublic class Service {: @/ ?3 r4 E  ^* ?2 a" y. a( }

    " w: C; D- {' B# ~public String sayHello(String yourName) {
    ) ]2 m# C( ^% H6 n! s4 A7 m
    , E$ \" ?3 L1 }6 X2 b! @//可以是访问数据库的复杂代码# H( h, ?- P% U' a6 e3 g- G

    5 P6 l* h% T/ g$ `( areturn “Hello World ” + yourName;1 Y+ I6 b1 j, [; w: z$ g
    , E) S' a. h8 F1 Q2 K2 `
    }
    % U; `4 M1 z' x! ^2 ^7 R6 {1 V2 m# X7 ?2 S$ U& _; Z2 `
    }0 b+ L: _9 d' w# E) x
    1 V; ~; m% o. L
    ③测试DWR( I5 S' [- l2 |' b
    0 o/ j! }% ?+ k7 }' D
    将代码放入应用服务器(比如Tomcat),启动。
    # u/ c6 P1 P) a) D( ^
    6 n2 K0 l  |6 b然后在地址栏输入http://localhost:8080/你的工程/dwr& C; q  b8 O; i
    . s, @* N, c% n, l% ?
    ④编写jsp页面, `! \; N! Z& y- N3 y
    # D5 e$ r0 U/ H. D
    1) 要引用3个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js0 n, o+ y! q; T6 ^5 l
    " E% |2 c' n  `* |5 G. l
    2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样7 G! l* M: s0 r, A# ]" ^

    ( h" X' i9 F0 u: m3) js里的service.sayHello和java类的那个有一点区别,多了一个参数,用来得到返回的数据
    回复

    使用道具 举报

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

       

    关闭

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

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