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

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

动态微博

12
楼主: admin

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

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    11#
    发表于 2014-12-03 12:43:50 |只看该作者
    JEE  c7 [# _7 |5 W. a, j
    简述JEE' p' _# X- N7 V' \5 L5 o* |$ u
    JEE : JAVA  PLATFORM  ENTERPRISE  EDITION
    ) t. r; R1 n' |5 E6 f7 E, n2 w3 o
    9 b! U  h: {0 r! V1 }  Y0 e0 ?4 _JEE是一个规范集;
    & l: y: A; R# x2 V3 r+ |' u9 c6 i* H# _6 k% S( O7 l
    JEE是一个框架集;) y4 V/ m" l: N
      v( E' Y7 o" G# I1 d; u
    JEE是一个技术集或API集;% E& R% f& p+ q# e: m: i3 Y

    ; m1 A/ ]' m6 G适用于创建服务器端的大型的软件服务系统4 m2 [1 K: K! S+ b* b" |
    / t2 E7 Q: r( Y' ?! F8 T. {

    + I4 V4 e4 N" v% W8 T8 c2 ^  B9 y9 c1 `! S/ p! G$ z* S
    C/S B/S 模式! o# A( V1 b- d) P
    C/S client/server即客户机/服务器模式,客户端也参与程序的运行与计算(富客户端、胖客户端)
    # y9 L; Q) h; H* J5 u+ ?# T
    * q. K4 r6 @8 w8 Z& QB/S border/server即浏览器/服务器模式,又称为瘦客户端,客户端不参与程序的运行与计算6 @$ M; g# f& ]' r' q' `
    ; n8 S+ E# s8 m  O+ L3 E

    # V8 I0 p+ r$ G; g8 P7 t: A, U* e4 }0 E+ }/ I: P: t
    企业级应用(大规模的应用)的特点
    3 k. T- }% i5 k6 |+ f2 d+ z1.生命周期长、稳定、可靠( t/ G6 m! w1 E2 Y

    . e2 a' q9 W7 w: W# _" g2.组件往往分布在异构的环境中,能够跨平台
    2 b( ?2 g, S9 Q7 m0 G+ @$ a& H% r0 H5 T5 y0 A9 u/ j8 P
    3.维护性、扩展性、重用性' _" z! e9 V. |* M
    3 x/ _/ M: P$ q( g$ Q- F
    4.有事务、安全、线程; E% f7 Z4 g7 ]2 k- {9 t7 f0 o+ R

    : T" q4 B0 y$ n( H6 e7 s1 Q* Y$ z& c 2 H& r8 J% Z/ ]1 i
    7 \- g1 q! s4 x' X  t  i; |
    什么是业务逻辑?
    0 J9 O3 Q6 I1 J+ s5 `依照业务逻辑划分模块,1 v1 U* B. ~4 J( j7 s+ w0 a
    + h3 W8 ^- v+ U' |* ]4 L
    所谓判定业务 就是具有以下特征:1 l6 B" x; i( h) E1 ]

    $ [+ t% T5 ?. t0 u! [) d" r. e1.业务流程" ?  |1 s# A+ k0 y6 K+ T( k
    ) P  \( w6 k+ S4 d: L$ O, L
    2.业务判断
    ; I% y# u- V; ^+ R; f% ~5 d8 X
    # \# v2 G# Y& p! ?, P  k  f1 M: C9 R3.功能组合9 y5 ?7 A6 w# Z7 t
    ! p0 E  N  j0 p, Y, u/ ]! ?

    2 P: f# v& }* |& d
    + h5 ?; q+ @& \' Q0 N! N平台(角色)的划分7 Z! Z, L' G- W. X* C# G
    1.平台供应商。提供满足API集实现的厂商(BEA weblogic IBM webshphere)
    ; s. {* c8 X: @- X& E9 o' x) e. s9 [! \, H4 `! a
    2.组件供应商* l+ J7 s- O0 f! b3 q# |
    . Z# P( G2 U/ F4 s
    3.组件装配人员2 l1 P% z8 E1 K8 p: [" n
    ! U1 j; ]6 }) y2 p. C. n0 v
    4.部署人员, a% k' c0 l+ ^2 D' [
    7 |6 ^, D9 p, d, A
    5.系统管理人员$ A0 P/ z( J' x( n! M$ K
    . U4 J: s% ~$ n- t: p* J$ h
    6.工具供应商 提供开发组件所使用的工具(Jbuilder、eclipse)
    & M7 L3 @- c. K" e6 Y8 L" C# ?  W3 `0 \

    * I  P& H- ?7 F! I  U, w$ w1 |& \; B( B; T
    java技术分布(设计架构 模块内部设计)
    1 u- j- L8 |9 W* @+ P. g9 C1.表现层 Servlet、 Jsp、 JavaBean、 Taglib
    4 @; ~& j8 b1 Q/ q1 z* Q
    3 A7 A# b: p* q* F$ d( k( \2.逻辑层 EJB(SessionBean)
    - q8 J5 q& ^. o; ]) X" \& u4 S; ^6 t* R8 {
    3.数据层 ( JDBC  EJB(EntityBean))
    & \4 ]/ o5 W+ J- w1 Q
    1 v* j9 A. E" G5 b4.服务 JTA(JAVA事务架构) JTS(JAVA事务服务) JAAS(JAVA授权与验证服务)
    ) F/ P6 G8 z( R- ]5 p- q: L+ B) T8 w
    5.分布式通讯 RMI(IIOP)+JNDI 、JAXP(JAVA 的 XML 架构)
    8 U  N  |0 v3 _& I  n
    ; U# K# o1 X* g* ]# yJAVAMAIL(邮件服务)、JMS(消息服务)、IDLC、JCA(JAVA连接器框架 (成))% ?/ r7 L0 I0 Y5 I( [9 x

    ( B( D) b7 h  \" L" l+ ]
    : T% k; B3 R8 M2 q5 ^% @: a( M7 G3 e- F- m: U) X6 U
    JEE的体系结构: 是一种组件的体系结构
    0 }( }( B' X, g4 d- |' f# p1.组件 : 能够完成一定功能的封状体(独立的功能的集合)7 d/ b; e$ J9 h+ F* @5 E* ~* @$ q  y
    ; o; i" m* y% J3 z; p7 M
    不能单独运行,必须运行在容器上
    3 X! i  b7 ~7 e! r: z+ }2 ]( [& q% B/ t
    分为两类:web组件、ejb组件
    7 \3 f; c. e  u" J7 z
    ( Z  M8 s" _, u7 ~5 _2.容器 : 提供组件的运行环境,并对组件进行管理(一段程序)
    : j, G! g; h0 G9 `& B2 E6 A, j9 V# Z) [4 \2 ]) @
    管理组件的生命周期/ ^0 s2 o' J8 N9 y/ C4 }* |, ^, C

    * c8 u* ]- [+ K3 Q' }$ k2 B9 h) Q& d不能单独运行,必须运行在服务器上/ ~: K3 M. }* O: H7 l) r! ?

    6 W1 u( I% q# X1 J+ r程序(组件)通过上下文来调用容器(context)+ |" I' g* c- D9 E, L
    * P- e( N9 s- ~; C' q
    组件通过web.xml向容器描述自己,使容器能够认识组件: o# a' Y% T7 s3 K1 h
    7 z9 A& c% Z( [
    容器通过回调方法来调用组件' a. F# e6 W4 i% D, Q- L- l

    * T! V4 k; w( }/ ]1 S# l分为两类:web容器、ejb容器" P+ d) m* R8 h7 I

    & P+ T/ O0 s0 S6 h" |- ?3.服务器 : 提供容器的运行环境,提供大量的JEE基础服务% T# q8 e# g9 I/ b

    , ?1 W( G" g% z9 f* ^web服务器(只提供web服务)( d3 o0 t- Y+ d7 K0 ]
    1 {. w: b4 L$ g. P" Y2 t  m
    jee服务器(提供web、jee服务)
    ! k/ {5 W( O  X0 U
    " c/ j: R' ^- a
    # f: B6 }6 s7 N. c7 C
    9 _. }: ?' d$ w. u: o& S什么是回调方法
    5 |% E% W8 o' S* n; }: H由容器自动调用的方法,就叫回调方法。% L: j4 H1 ^2 M2 r+ b
      `: c9 y, F- u% u

    . v) z/ N2 j8 a: C; a/ c
    ! W- f0 {4 z. V  tRMI远程方法的调用机制+ ?* A; _9 j( Q, V' n
    例如:A主机有B()方法,C主机有D()方法,A 想调用C主机的D方法9 I/ c+ c5 l# Q8 I; v* v& q

    , Q! v( i, s$ T7 f7 g% J5 `! P. _9 R  G: f; S1 c, q
    " Q9 e$ y: }4 o& G, t

    9 E1 c4 q! i* x4 _+ ?( q% F( ?9 d* z9 e! [
    学习方法1 @$ N* L. Z3 _1 g( @
    1.规范(熟记) 2.熟悉API 3.多练 4.多想
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    12#
    发表于 2014-12-03 12:45:29 |只看该作者
    Servlet/ s6 e2 u, E6 N  K7 k; S4 j$ _  {
    •     描述war包、jar包、ear包的结构3 ^* k8 f! L# c
      4 @: e+ M* }, {2 h7 G# t) K& g

      2 N4 R: L# H& l. G

    war-                            web文档压缩包

    —WEB-INF

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

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

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

    $ Y( I2 v/ u# S7 ?# q

    jar-                             java文件压缩包

    —META-INF

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


    7 H! P  s! ]/ j9 ^* z( D9 j4 p

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

    –META-INF

    —Application.xml 配置文件

    –*.war

    –*.jar

    9 c+ l) u4 b3 M4 A
    • 什么是servlet?servlet主要做什么?
      ( R. c9 z# B& b
      1 J) V5 E$ A3 ~, U5 i7 ~1 r
      1 ?& c# `2 t- T$ H; j1 p5 W

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

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


    6 i4 B( @7 y& B% E0 B# l$ r  q
    • servlet 与cgi相比的优点?servlet的缺点4 W% q2 f8 H# ~, o( Q8 K7 z7 `

      / o! j9 }( ~. U) T3 U8 @: x) j- c* b- T* [4 ]$ @

    优点:

    性能(线程比进程更快)

    可伸缩

    Java强健且面向对象

    Java平台独立

    缺点:

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


    * e2 j! H8 }9 g7 Y0 J, F0 v
    • 常用的servlet包的名称是?" K( i7 \5 H* j. V/ ~

      9 `% y7 Z  _9 `& U( s/ R$ D8 `  r- U3 |, @/ k, @7 J

    javax.servlet

    javax.servlet.http

    6 t# }: X2 N/ }# p
    • 描述servlet接口的层次结构?; i3 a: j. H6 @/ r3 j8 i- ?8 m. @2 F! |
      5 O  e6 m# g% `* N) F& }' [
      ! Q  J( K6 ^# t; E

    Servlet

    –GenericServlet

    –HttpServlet

    –自己的servlet

    ServletRequest

    –HttpServletRequest

    ServletResponse

    –HttpServletResponse

    # @5 P2 P1 j+ @. n3 I5 v$ k
    • 对比get方法和post方法?0 e; \4 D7 u, x% z' f- x. s
      ; s! s% m2 p* U
      : N9 L0 y, J: e! A( S/ w/ T

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

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

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

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

    1 u4 T4 S7 U9 G/ S8 X7 Y* [6 |
    • 归类描述HttpServletRequest接口都完成那些功能& z' ~% @: ]) r4 [! G

      - }9 g8 c, O$ e- o8 Z: P& i" l# i1 [) G; v6 e  {7 I  e6 E  `/ J% B
      • 读取HTTP头标
        ' f+ ~& _/ I6 N, b3 z9 E( P1 M' b
      • 读取cookie  G: V( t% e+ ?
      • 读取路径信息
        . ^" B' @: r! D$ A! t
      • 标识HTTP会话。
        7 f5 M3 z' u/ i! @3 y  T" D2 m1 y$ N0 r2 M9 ?+ v

    " ~/ I7 ~1 }( N
    • 归类描述HttpServletResponse接口都完成那些功能0 Q! ^* D: z$ t  d

      & |" T% c/ o' E6 R) C, F
      * D. }1 Y- Y, q6 ^+ b
      • 设置HTTP头标
        6 U" s* {( S- H, F" @0 V2 V
      • 设置cookie( t. x+ e6 `, e! f8 N3 ?* k5 D+ A% p
      • 设定响应的content类型& k" Y  t+ i9 L5 _
      • 输出返回数据
        ; F6 M3 e. T, E! I4 y( R$ @- _  Y, Q5 X

    % _" U2 x: I/ b  y
    • 描述service方法所完成的基本功能?默认是在那里实现的?1 |5 e4 `  ?% U) @

      ; g9 c* H6 q& I2 z- R( u3 t5 }
      ! l- j- u, [9 M, k

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

    实现:默认在HttpServlet类中实现

    # r+ s1 h5 M- t' n( H4 i
    • 如何开发自己的Servlet?描述应该做的步骤和每步需要完成的工作" k1 N6 m% [  P7 F0 }% ^6 N
        G% V! m" `( Y6 B2 ~. D
      * ]0 b, }/ F, F& G. d

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

    - H2 l* g2 p' m* x+ j; ^2 g; e
    • 为何servlet需要部署描述?
      & Z; M/ F# `$ |. b& y& P( Y2 Y) S0 E

      % }2 s! a8 R6 \$ y3 D, ^+ M9 m! B" f! j1 `/ f

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

    7 p* j0 v6 O6 }& r8 y2 S) k
    • Servlet基本的描述应该是?请写出来
      1 V2 w6 u: F! X

      / X! d/ Q5 \9 x1 u2 w  p
      # V+ Z; a1 w. ~  \+ }

      R- r. Z8 D- M& y; h+ i

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


    7 e. }- c1 ^: F" k
    • 如何在html中使用servlet; L2 N4 i+ m) u" O+ @6 Y8 Q
      , w* D4 W" C( U

      7 D$ m6 m" k- x* O6 e& R7 N

    FORM标记

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

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

    语法:

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

    {HTML form tags and other HTML content}

    </FORM>

    , u2 @2 Y3 J  l2 P* o; \2 G7 C
    • 如何接受request中的参数
      ; T2 N' ^6 F) S% R. [5 j  a

      ' P0 F# y) F! w5 A) x9 z9 {String userName = request.getParameter(“userName”)方法7 q$ i( R& c7 k3 c
      6 T6 ^$ E$ o  @0 Q
    ' K, ~! ?" M( Y$ ?) e
    • 如何接受request中header的值
      , T, X8 Z9 j/ ~4 O7 J

      # ^& Y' F. s" v) a) d/ u) b* o4 c  w8 ?" u, Q0 A

    request.getHeader(name);

    request.getIntHeader(name);

    request.getDateHeader(name);

    request.getHeaderNames();


      K+ r5 c/ C) t# t. V
    • 如何输出html( X4 f  s# K3 h% v' j9 u

      ( Y4 ]- f8 F1 u3 a; R# |. ~% k! S
      0 [: y5 [. T! X  S+ o8 ^1 T2 Q* Y2 M

    PrintWriter pw = response.getWriter();

    pw.write(“<html>”);

    pw.write(“Hello”);

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


    $ [: ?* y8 ~7 _  }$ r
    • 如何设置输出的contentType
      ! t. ^+ L# q2 r$ i. x

      : Q7 t# Q. x6 X! b/ w4 ^) t2 \( a' l  J% T$ j4 ^

    response.setContentType(“text/html”)


    5 B7 i' o$ g/ f( X6 z  F4 U
    • 描述servlet的生命周期?
      ( a  ~" N9 I. S; q, a) _

        T. ?' D& s$ J! T1 w$ S! \
      5 R3 L  G) X* F- l* X

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

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

    ( |1 b3 ?7 A( b: H% W9 m
    • 描述init,service,destroy方法的功能和特点
      : ?6 y3 A5 ?8 f. Z

      / G# N. N, ^: p& G' y* n* X7 h4 p$ x( `6 o" U4 [

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

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

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

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

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

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

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

    . _% K; B3 _4 a5 m1 [
    • 什么是回调方法?有什么特点?
      ! Y# Y% S9 i3 k) |5 Z; n+ X3 O0 o
      " m# ~5 @8 Q; l' [" S7 P0 e+ z

      ' _, @2 Z9 _) w$ Q2 s) b/ X/ Q) k9 M

    由容器来调用程序的方法

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


    . N' {4 U8 O. h
    • 如何设置初始化servlet的参数?/ D- G7 z6 Q" o* M/ d% O2 }; q# e

      7 i' f8 V1 U9 O- R在<servlet>中添加如下配置
      7 D0 h2 z' m) `
      / a2 w" v' j- L% x" ?& f  s

    <init-param>

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

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

    </init-param>

    4 d, Z; \; m5 R; D5 {' ^
    • 如何获取servlet初始化的参数
      ) A1 m2 r2 {4 p: N# @$ Z) l7 H
      6 M) t1 D" i. O7 }4 P6 K5 W/ C5 x- `: L
      3 x7 E% E1 X8 A

    public void init() {

    greetingText = getInitParameter(“greetingText”);

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

    }

    . Z1 g7 ]) h% ?* k9 g) t
    • ServletConfig接口默认实在那里实现的
      + V0 B( y4 p9 m+ x" Q+ _. s( H
      ) K# {/ |* `. X) Y6 R2 D# O
      . p& ]$ F9 I' Y; S

    GenericServlet类实现ServletConfig接口


    # ~0 J: e0 ?/ a; F+ C1 S( O
    • 什么是ServletContext?有什么作用?, {3 k9 r) Q! V1 B0 I) v* O* ~

      * p5 D! A. z% d; D7 A
      + {! A  p. ^3 \

    Servlet上下文

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


    5 b3 b  E! ]& Y7 P5 I, J0 X
    • 如何访问ServletContext接口?是在那里实现的?" M5 d. H5 @& A3 D
      5 ~: x& d5 v: v7 j- ?) i  I

      . w" C7 s6 |2 k  H. E3 w9 h! T! r

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

    GenericServlet类实现了ServletContext接口。

    " u, z% B& C3 k1 \+ a5 j! D$ N
    • ServletContext接口的功能包括?分别用代码示例
      : N, B& d1 [1 a% n8 q
      1 ]8 |# q3 k$ C8 L. ^8 ^; L

      ( H$ ^7 `5 M( o  A

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

    , c4 n2 Y0 m0 I
    • 如何设置ServletContext的参数?  N% {! `( q7 }
      / d7 b  Z) q& L
      $ s, s* z3 z0 \5 h  |7 O4 {

    <context-param>

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

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

    </context-param>


    / |! D+ S8 T# X  @4 R1 f( c: w
    • 如何获取ServletContext设置的参数值?
      . n$ f' _9 T/ M
      7 Y! s; s8 ?1 E$ {$ y6 h) o6 X! a2 a

      6 M8 z& E7 m/ ^6 G

    ServletContext context = this.getServletContext();

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


    ' K" t6 K+ b& p" l# s
    • 描述Web应用的生命周期?
      0 R) m$ `. H( A8 O4 I2 s/ x4 \
      5 j/ [+ d1 n% a/ O( |" T; `& G

      ; B9 v! O' T! B, B9 z- `/ i

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

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

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

    ; h% m" U2 E4 V; ^0 J. r
    • 如何用代码实现监控Web应用的生命周期?
      - K: v7 L! e* Q2 c1 f. ^* I; f

      - z! N7 G* B$ ?. {7 D/ q" M8 B% u* ]8 z% J- K( U5 f

      ' L9 \! T/ j' I0 q% s

    public class Test implements ServletContextListener{

    public void contextDestroyed(ServletContextEvent arg0) {

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

    }

    public void contextInitialized(ServletContextEvent arg0) {

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

    }

    }

    % p3 a5 ^* i' R9 M3 L9 k

    web.xml文件中的配置:

    <listener>

    <listener-class>

    com.csy.Test

    </listener-class>

    </listener>


    / T, N1 m/ n, g& N  o
    • web应用中如下错误码示什么意思:400,401,404,5006 @2 S& m  v9 h4 u7 v& w: ?
      . H2 t8 c( D9 c, `5 a
      400 Bad Request//错误请求
      401 Unauthorized//未被认可
      404 Not Found//没有创建
      500 Internal Server Error//服务器内部错误
      * P1 Z( j6 u  Z1 c! `! t
    ! o  `8 ^! f. t" W2 T5 ]
    • 描述Web应用中用声明方式来进行错误处理的两种方法
      $ n9 t; K3 T5 _. r0 l: ?" Q# |8 i
      * S/ b) ?1 K+ `+ ~' O3 S7 z
      9 l3 p  ]% b* v+ ^- o. @

    使用error-page元素声明一个给定HTTP状态码的处理器

    <error-page>

    <error-code>404</error-code>

    <location>/error/404.html</location>

    </error-page>

    可以声明任意数量的错误页面,但一个给定的状态码只能对应一个页面

    使用exception-type元素声明给定Java异常的处理器

    <error-page>

    <exception-type>

    java.lang.ArithmeticException

    </exception-type>

    <location>/error/ExceptionPage</location>

    </error-page>

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

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


    " A3 `4 X- @. [( Q# A
    • 描述记录异常日志的方法,都位于那些接口?% v& B1 H' \% b( T' D9 P: ^
      - O1 a+ b2 K& s" ?3 M
      * E, v1 g0 E( L2 u" R- X* ]

    GenericServlet:

    log(message:String)

    log(message:String, Throwable:excp)

    ServletContext:

    log(message:String)

            log(message:String, excp:Throwable)

    9 _# ~3 C/ L& }! |1 S
    • 什么是会话?/ `  ?# S, I) y4 t; q

      / k4 B2 d7 `3 n( }  k3 ?  d" X" Y* k6 `/ ]* W

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


    , y- \- K- ~6 g! u" |$ m- r* A
    • 如何获得会话?; g/ q- e! _: v3 z. \
      " A/ p  I& I2 Q9 F( ^  H
      HttpSession session = request.getSesseion( );

      # j! l2 g/ y# ^- [1 b9 h2 Q4 l
    9 X( t2 }$ b4 g1 h" L6 x( h/ g( a
    • 会话Api的基本功能?
      ( l$ N8 \9 L" R( ?% S5 t

      9 u8 F" v8 O7 o' K( [$ w* T$ f; d! Z" `/ j) u9 I9 p- J& {

    getID() :String7 i! f6 o5 {# I0 v

        isNew() :boolean+ q* n2 f1 U, J/ a0 U

        getAttribute(name):Object! j; s5 e* J5 ~, L' C2 w

        setAttribute(name,value)
    ( D# q' N' e3 T

        removeAttribute(name)


    4 v& B( X! a& T- i. V. f0 N  \5 _
    • 如何销毁会话?
      " r  [% ~& b3 {5 F. t

      3 z& w4 p1 x5 x& b1 T* d! e- ^+ W1 f1 @5 R

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

    <session-config>/ f9 a( \4 v# E$ g: m# X$ ]  w" @+ R% a

             <session-timeout>10</session-timeout>: M# s# j( y! B* v1 O5 t  j

         </session-config>
    ! D# Z& a, Q# c& x. o+ F

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

    invalidate()0 s8 K( v/ U( x

         getCreationTime() :long! a( R# u! ~+ R0 g. o* S

        getLastAccessedTime() :long
    1 n( A* U: _: B) n# A

        getMaxInactiveInterval() :int
    ( T7 C# e3 y" k/ w

         setMaxInactiveInterval(int)

    5 y7 g" B& N2 [# j8 T% M
    • 描述会话保持状态的基本原理2 R5 [- z8 s, B( x
      1 K) ~% i# m, `3 i9 ~

      2 b$ m+ X" m) ?3 n- p
      {) m9 |, v1 E9 f

        client server' l+ o8 n9 {3 G4 G6 Q1 H


    : I: ?* T, B0 j& X, Q- b

    request
    ( ~# k8 d% V$ Q/ M) L6 y

    response (sessionid)
    / G( a& A% F/ `, x! u9 E8 X4 L! Q1 d- H

    request (cookies)
    " X* {- l5 d9 o

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

    ) Z. l& Z! a  U# ~4 L; C
    • 请描述session和cookie的异同之处& a  |& c) z% T7 W! @

      ! f0 o' m/ W( h' A( l/ ^/ W, r. k- r5 c/ b0 V
    % b5 e- S0 `7 ?
      m& K  P0 |( u' F" u4 i
    • 如何读写cookie,代码示例
      8 K1 y/ n( |- x8 T) f' B

      ! d3 O" T' K* _$ y' t5 r+ p! L7 k' a$ d2 ~) s3 ]) b, y; M" O

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

    response.addCookie(c);

    读:Cookie[] cookies = request.getCookies();
    % G! Y9 {  d, R

            for ( int i=0; i < cookies.length; i++ ) {
    ! w# Y# d/ V: z3 T- J- m) J  y+ f

                String key =cookies.getName();
    ; J, F5 N$ T' U" \5 @  A7 {

    String value = cookies.getValue(); 1 G( {/ Y: D1 ?

    System.out.println(“cook”+i+“:key=”+key+“,value=”+value);
    1 e" I# u. c0 p% M- H0 h3 m9 j

         }

    2 K- `+ K) ?$ O; F9 S
    • 什么是URL重写,如何实现,代码示例
      7 L$ i2 N* E5 {' o7 _* H# f3 k
      / A1 i) I# r2 o0 _3 ~

        R* b7 @+ I8 V0 z$ t1 n

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

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

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

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


    1 R! T. U; ^5 o( J) ^1 j2 Y
    ! g0 V- {" n, G, x. o# G
    • 描述web应用的4种认证技术5 r$ \3 d! P+ c) e- B/ W! @' a# k
      , s, A/ l, B, B. n( k8 y. b

      2 n! o* |. l7 ~9 S

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

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

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

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

    ( n1 r9 M5 d& @7 A, C
    • 什么是授权,什么是验证?. w1 p/ X- C7 s3 |$ m. v

      % I, N3 @! J; E* p  S0 S4 ^8 r* {- g! D& K
      ) v$ F2 ^9 q! T. J0 v) y

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

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

    6 l/ B) J! p, L: o3 A) Z1 A
    • 什么是HTTPS
        E) V$ v* c# D7 ?

      ' e# E- k, K3 C$ k/ ]/ K
      , i& S6 Y0 Q7 K5 n% O- ^8 p" o2 l

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


    $ e. x. g: C: a
    • 什么是审计?1 K, o) D' n' Z8 ~* C% r6 ~) T! f% p
        M5 ?2 z2 i) h% k0 [( I# n! R
      1 v$ ~0 H3 O* I) p( N* ?# k

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


    ; Z2 ]% @2 s1 r* _8 f
    • 如何实现声明性授权
      ' f( x0 P8 w0 \3 w/ I

      3 F7 Z3 m* ?* n/ F! M4 H; q: c6 M2 R
      8 m( O, }( R* Q3 ]- e1 R9 |$ A( @! k

    1、标识web资源集

    2、标识角色

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

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

    在 web.xml里配


    $ B7 t# i) `  _) M% w
    • 描述servlet并发问题?
      8 ^. I' t0 M4 `% V

      8 Y8 ?  k/ ]# j! Z
      * T) I1 \6 W7 v: e8 y

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

    * `, f9 K( H% D+ n0 i6 Q( P7 U
    • 描述Web应用中的六种属性范围0 {) P0 ~8 m" ^  _' v. K

      . o: w4 |. p2 x2 R) s9 m# ]1 F: K( G) }! a- p2 _8 ]$ y% x2 A6 z

    局部变量(页面范围)

    实例变量

    类变量

    请求属性(请求范围)

    会话属性(会话范围)

    上下文属性(应用范围)


    . j$ S& r: l$ ~7 |# I
    • 指出上述六种哪些是线程安全的
      1 o9 e/ u* e+ H9 y, _
      2 ?! l* T  _9 c: e# c5 I) U

      # z! Z  U6 S4 V3 @2 `

    局部变量和请求属性


    * T/ g8 K$ F8 W8 W2 n7 x
    • 什么是STM?如何实现?
      ) X" K  o  u* d9 u3 w  [8 N

      4 F5 i! E; e$ G2 D) }: W9 M
      . W% \9 `/ M. S2 T) d( F1 ^

    SingleThreadModel接口

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


    ( q' [5 ]. I: V  k  z+ B/ l& N9 a' k
    • 如何实现并发管理?* r  L% K& E" N& q, @+ \
      8 `6 }1 H+ Z! f4 b' e# N9 z" W
      " |. ]7 c' }3 v3 V, w1 P0 e- k

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

    使用synchronized语法控制并发

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

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


    - x+ h: g) P9 H) u- P& u
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    13#
    发表于 2014-12-03 12:45:45 |只看该作者
    Jsp& e1 z) x- i% _" ?4 V; ^
    什么是Jsp?
    ! \3 R; C2 |$ |8 yJava Server Page    结合java和html在服务端动态生成web页面的技术9 Z0 ^2 T8 A; N7 O0 `+ _

    ( a$ T3 o9 D+ Q ( e( j( H; H1 j

    / t. [9 I7 R3 W) I描述Jsp页面的运行过程?( r* A! Z& F( R+ R, m, K
    第一步:3 k5 h4 K  G  Z( S, p( r
      `0 I& I$ \: r
    请求进入Web容器,将JSP页面翻译成Servlet代码5 t( N# m5 g) i6 e8 ^4 {
    9 O, L1 P" w4 d2 W0 }
    第二步:3 E5 A1 B! g+ z* n' ^( C

    ; n  z' q; X! ]7 o. K9 s编译Servlet代码,并将编译过的类文件装入Web容器(JVM)环境7 T/ ~3 a: e9 }# |6 g4 L

    , j% {6 [% P, s# ~第三步:  E4 Z% w: o6 N- B, w: [
    : d2 `  K5 {. t( {0 s% z8 X& y
    Web容器为JSP页面创建一个Servlet类实例,并执行jspInit方法  a2 h* D! g& S

    4 t/ z* M: a" _4 a第四步:0 O0 h' j3 r) U0 T
    , C5 F2 l& j4 p
    Web容器为该JSP页面调用Servlet实例的_jspService方法;将结果发送给用户
    6 y4 R  T$ e) M" H; c9 U7 p4 f# @" [/ x, ]4 A6 Q

    - D" l( x& a/ v! v
    * D, n& e4 U8 L& y描述Jsp页面的五类脚本元素的功能、写法、并示例1 R4 Z' E* R# C& F" p' x* t0 ]
    注释 <%– –%>
    6 i' _* p* q8 {" b; ^8 N# n: }. U3 A' U  p. Y
    <HTML>
    " x2 l: {9 k( q, {. v
    " q/ V/ V. t8 c9 ~& T- }. j<%– scripting element –%>
    , F( k" I! |, ^& j! S+ J  o7 [$ ~6 Q9 d, r. u: f5 l, t
    </HTML>) m, r& ?9 @0 X. L5 n7 v' G' a  n( s

    / V. E- _. i0 T2 _8 c6 T0 N指令标记 <%@ %> 指令标记影响JSP页面的翻译阶段
    2 k' t3 n6 a" {# I
    ! s2 j1 u, T( x% [$ k# L<%@ page session=”false” %>" E8 O' N; P2 u; [- t6 [, I
    ' U% O1 Q2 m1 [$ t3 o
    声明标记 <%! %> 声明标记允许JSP页面开发人员包含类级声明
    ; P$ M& U' Y& x1 M$ W0 r. O' p; v. _2 O9 m, s+ D
    <%! public static final String DEFAULT_NAME = “World”; %>4 W' V" J5 u1 V( ~. u3 `
    ; j/ b$ m  K) C+ N  |) k  G
        脚本标记 <% %> 脚本标记允许JSP页面开发人员在_jspService方法中包含任意的Java代码
    4 [3 F! H" C' L' K9 n: C' P& _2 s; y
        <% int i = 0; %>
    * \% `+ n" `, `6 _  P5 a1 D0 I. V: M: m% H4 U, L% P, I: Q
    表达式标记 <%= %> 表达式标记封装Java运行时的表达式,其值被送至HTTP响应流 <B>Ten is <%= (2 * 5) %></B>
    # S' X. K8 {( k8 N. p8 X9 {0 q" ?3 {8 [) s
    : ?( Y; I% {: q. w! B

    4 b# U+ I" m( R: p描述Jsp页面中的注释种类和写法1 Y! \: |" c$ a( d' a2 p' I
    HTML注释6 Y. S  y0 O! J2 R

    2 E6 N& H# t' G$ V; d<!– HTML注释显示在响应中 –>
    2 D, f4 K% e, H- l! d' E: V8 o9 y, k0 C) Y8 ?( M* v3 p7 x
    JSP页面注释# B" T6 E, o5 W- S( M
    ( F3 K: F+ w+ X2 ^* v1 j& z+ u
    <%– JSP注释只在JSP代码中可见,不显示在servlet代码或响应中。–%>
    9 l# U& M. f- v& A3 T8 Z
    " L9 h8 N% ^) l4 L1 GJava注释% E4 o! R0 ?+ o) j: i/ J5 Z
    " i2 m9 j+ |! v, _, W
    <%: [) R' g' @+ D) f2 M
    * O# d; a9 r& m
    /* Java注释显示在servlet代码中,不显示在响应中
    8 g( c( {# W. m# D$ }. N7 d" i$ X/ B. F
    */% {4 F/ D9 S( Q3 a; m. f- _
    ; c6 K! F2 z) i0 k1 {+ m3 U
    %>- f3 b$ ?6 s- |9 [, y' z' P

      \* Z7 |7 D) i ( o) n) \- A9 B9 |! H" k
    9 m/ P6 [0 o5 M3 B2 r/ F, E
    描述Jsp页面的指令标记的功能、写法、并示例
    % B4 ?, S! y7 H( Q" r指令标记影响JSP页面的翻译阶段7 c" V2 ?3 i. x% S4 A. O5 v# I5 g
    * _0 ~3 h- u3 y( m3 w( B: D
    <%@ page session=”false” %>
    3 U$ \' \$ q1 {* ^
    0 m* L( F9 c: ?: g6 l<%@ include file=”incl/copyright.html” %>- ~4 S9 I: n+ N" G7 M+ z

    & s3 ]& X7 R# b: [% j% d3 Q<%@ taglib %>; A. F7 O- _3 ~4 @

    ( ], e* y% x( B% ?* G ! P# ~$ L& O% s2 e
    3 j8 }9 H; n( u
    描述Jsp页面的声明标记的功能、写法、并示例
    ) ]3 r/ x# |1 M1 Q. s& G9 {声明标记允许JSP页面开发人员包含类级声明
    7 m! z* ]* U3 |0 I- R8 v, H: C. b/ R) K5 ]* n8 m4 y. X- Y" Z
    写法:1 P! Q9 C* ^, g
    ) W- I, ^: n% }  }$ T" J7 k
    <%! JavaClassDeclaration %>
    6 ]* D: Z, C. C) k1 C
    / I: {" z# r# q# _2 T( l  E例:
    + f! M/ S% Z! \" }) M& I! N$ K% e, b, ~* E8 D7 L. C
    <%! public static final String DEFAULT_NAME = “World”; %>
    8 `) l) D% b; _" ?/ Z7 a1 o2 i3 S  Y% j9 {; l5 L) [3 \# j
    <%! public String getName(HttpServletRequest request) {7 d( e* J+ B  x* V0 q" ~5 _; }7 {

    ! I) y! u7 g& t& Z# @return request.getParameter(“name”);
    1 x  ~6 k4 {$ q9 b- E  }1 @( |  {! A# k# e* p- x1 V8 \
    }
    3 B. [" H/ g" f( n+ B: U& R# ?9 c4 V: r; [# z
    %>
    8 n# H7 Z+ C8 q- V: ]' d6 U0 Z$ ~, `, }/ q) @' f& D; J
    <%! int counter = 0; %>5 S- t& d! k7 c' G7 ~

    * u+ C/ O- y9 }! q5 k + {0 W; o: t4 q9 I: s: n  x' C

    # g! ?0 c$ j' ]/ a# W描述Jsp页面翻译成Servlet的规则
      n; ]) G4 B$ ~4 G! a' k0 |jsp中的注释标记被翻译成Servlet类中的注释$ S  Z$ z) a( O6 C$ U. |( I9 {9 A
    % d! C  d6 e3 E+ J. s
    jsp中的指令标记被翻译成Servlet类中的import语句等) W, e: g* X; K7 t" f* m6 P
    * `- j4 w5 ^, W; c/ X
    jsp中的声明标记被翻译成Servlet类中的属性
    0 b. i! E6 g$ Z1 u3 h9 h; E/ T6 N1 \8 s/ f
    jsp中的脚本标记被转移到Servlet类中service方法中的代码2 J8 b- ~/ a- [

    , R! f7 b/ m; W, bjsp中的表达式标记被翻译成Serlvet类中的write()或者print()方法括号中的代码) k; y- q" @* S- ?7 K5 x) R; w( H+ b
    3 ?. Z$ X/ D4 @+ [
    , e: U( o0 l9 r* a6 G6 o6 u! Z7 R! h9 q

    0 f+ t5 b: Q6 M( f; n) w6 i: h& I描述Jsp页面的九个预定义变量的功能、用法、并示例
    7 y8 u$ T7 T  Y. wrequest 与请求相关的HttpServletRequest对象
    9 O* ^4 G9 b* U( a% y" a& n, i+ ^+ [1 p. O8 N
    response 与送回浏览器的响应相关的HttpServletResponse对象. y, E5 q9 w* i4 m6 v! I. h# y  T
    1 i6 `; H' N2 H/ E! w' P
    out 与响应的输出流相关的JspWriter对象
    " e* d0 Y9 \, _  Q0 @3 @( k( F5 k' E
        session 与给定用户请求会话相关的HttpSession对象,该变量只在JSP页面参
    ; H$ E1 U0 B) q# D# U: i" s3 N2 y- U- z
    与一个HTTP会话时有意义5 L& g. z/ g$ c: u! k

    2 I/ l/ _6 c& Z: E$ L    application 用于Web应用的ServletContext对象
    0 S6 B; q+ Q: U
    - o  S  S8 r! bconfig 与该JSP页面的servlet相关的ServletConfig对象
    * Z; q9 o' l1 ~0 N: N* u
    6 @  u1 `8 X4 x: b. F' U0 w& cpageContext 该对象封装了一个JSP页面请求的环境: p% G; _. r* B& L
    , n6 b' ^: \3 Y) O. S( ~
    page 该变量与Java编程语言中的this变量等价, b5 k; U, l8 n( ^/ ~- V9 p
    8 h9 @( m% Y: U9 g
        exception 由其它JSP页面抛出的Throwable对象,该变量只在”JSP错误页面”中可用/ c+ N* P- D. u2 T/ R1 [; F

    7 Z) ]/ ?8 S; c% u: ? 3 u' H/ m5 j, ^3 T% ^
    ( v- G# y6 i( p/ \2 {3 l
    page指令的功能,写法、并示例,并描述它的如下属性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding
    & l+ \8 }; T3 K6 Aimport import 定义了一组servlet类定义必须导入的类和包,值是一个由3 I8 i0 Z* P1 I1 H

    $ q) Z- n$ M/ u5 q逗号分隔的完全类名或包的列表。2 I4 [; q6 |4 m8 {! S

    # S" S$ U2 L; V7 B8 usession session 定义JSP页面是否参与HTTP会话,值可以为true(缺省)( l* q7 [5 z3 L! e. `

    ' I. j7 a  F) {0 ~或false。# X/ ]- r: R* L
    - p$ k, U  g, O; _* J
    buffer buffer 定义用于输出流(JspWriter对象)的缓冲区大小,值可以为
    + U3 |3 g* {  a% z, H- }$ T  P; j: T% ]  N  @
    none或Nkb,缺省为8KB或更大。6 U& P; W7 o4 {* I# e# ]9 a

    ! B, t" D# l& oerrorPage 用来指定由另一个jsp页面来处理所有该页面抛出的异常$ R4 h3 e( {: j: o" [
    3 S; v. u: ~' N9 I1 H8 M
    isErrorPage 定义JSP页面为其它JSP页面errorPage属性的目标,值为true或9 p+ ]( K) B9 Q. t% }) g

    0 ^7 C5 N6 l9 P1 W! H, K' s1 ofalse(缺省)。1 q0 M+ D3 c8 U. ]- w$ x

      f$ @" ?9 @5 l5 ^, W4 V" i8 H* L# oContentType 定义输出流的MIME类型,缺省为text/html。1 Y9 h- d) ?1 P# p; R% Q

    5 x+ K0 t4 i6 v4 l( _/ JpageEncoding 定义输出流的字符编码,缺省为ISO-8859-1
    ; w& t8 U7 a* y* U) I: Q5 Q4 e, t" {- K4 ]1 S
    ! @/ ]; x5 j' T0 E6 R* I% W' W( Q

    ! J( V3 t6 {0 U: W描述MVC各部分的功能?MVC的优点?MVC的缺点?/ K' W# s4 O0 |$ X+ U
    MVC各部分的功能:
    - b* K  _3 j$ n  X( \' ~5 Z9 T: v3 x2 p3 e$ E& d7 E
    Model(模型表示企业数据和业务逻辑)4 |) S5 o2 x; f8 M' o" I
    & R; J6 M% \( F9 w* M
    封装应用状态1 C, S  J4 M. S3 a! q: F1 f9 G
    1 A, l( O+ K1 ^5 @9 i
    响应状态查询
    " O- p9 V# T% ^
    1 `& e7 R5 {" K- k. b暴露应用的功能' E" _/ K" k, C( [6 g6 [7 H2 A. L
    - L) ?  z" w$ |& V5 a2 b
    Controller(控制器接受用户的输入并调用模型和视图去完成用户的需求)4 I& c! j9 J" ^5 x, A  k8 `
    ! w/ P; k# t$ W; t9 t5 O
    验证HTTP请求的数据1 G2 c6 D; |* g' Y

    2 I6 @& M7 [) J1 {* W: b, F6 s将用户数据与模型的更新相映射
    * _9 B; O4 f7 i0 {' m& T: @( C1 O8 W
    选择用于响应的视图  \" r/ i  R( _& r& f

    . g# Q& i: Z% iView(视图是用户看到并与之交互的界面)
    4 D' i5 M% m8 \3 F" X5 v1 p
    ' h5 a2 r: y  n$ U; D6 a; n5 V9 r5 P产生HTML响应6 \  D  A1 x1 r( q
    5 U; }! M9 q6 p4 W
    请求模型的更新
    2 g; e( E7 e/ V9 Z8 j
    * U6 R4 f9 R# I% s* f9 s2 {( f提供HTML form用于用户请求
    & b, s8 |( C" k! _9 q5 u0 P' W8 Z0 ?% |) o0 T. v+ `
    MVC的优点:7 K: Q/ B8 {# ?4 S: P* N. l6 w1 v

    * i- L; y5 A! s        低耦合性:视图层和业务层分离
    # Q1 P4 d/ u( k0 U! ~8 j
    ' f& g% U, ^* Q( L3 u8 G# @' T4 e/ x高重用性和可适用性+ N* C8 l4 P! y" o: F% ], T
    ! I, x7 D  c3 l0 m6 s) h% |& S# s
    较低的生命周期成本
    % e! @/ E# T( x  E7 j" j- H% m0 P8 i; `6 e. m* r5 [2 n( w/ F9 C, n0 M
    快速的部署2 T* H, a6 P% n7 S) c8 c

    & e! b* x2 n. a) o% ]可维护性  d9 s, Q( J8 C4 v: b0 t  R& z

    4 ]  X. D: N- F6 ?! F有利于软件工程化管理, {/ `/ n: P  e) O+ ]5 ?! u
    2 Y6 {8 R# ]5 D
    提高软件的健壮性8 q/ z9 \# O& K0 \: [  r8 u
    0 R1 R4 o' [' i' O0 L9 \
    MVC的缺点:2 w5 t) f5 G7 w/ a. Z
    8 T, L+ `  _& b# ^; G
            工作量大,增加工作的复杂性,MVC不适合小型甚至中等规模的应用程序9 L- l4 M8 n' B' R: }
    " D/ G+ z9 D% r( U  a
    ( p  s/ t' t! l
    1 r+ f9 }2 l6 Y9 C! q
    什么是Model 1结构,以及结构中各部分的功能6 {5 \: q6 h; |( E9 d
    结构:jsp+javabean- G2 M; P) c, f
    6 L; V* \# \) m2 c# A
    Model1中使用jsp来处理web应用中的视图控制部分& O6 i! b( ?9 L. P
    ; Z! ]/ I1 \+ Y! d  I
    Javabean收集参数
    7 P* ?' V6 K/ o" [/ m  B
    $ Z$ V  k; }5 Z& D1 y* b& I6 O ( i+ G/ k& A4 b- ]; d9 k1 E
    & Q; V  V  T1 X# L" k2 P/ P4 S: q
    什么是JavaBean?  L" s7 G* y0 M
    用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。5 Q% l; o6 Z' X, U6 Q: O4 z
    9 w, ~/ H: S: P5 }4 P3 o* V1 j
    $ I/ x9 `& O( e. e) P

    ) B+ v: o( [  U% k, y& gJavaBean的规则?8 ^. ]& ?/ }7 j; H( l9 V: a. ^
    使用get和set方法定义属性
    ; ?. E; y. U, ]4 q$ G6 |1 ^6 E0 M8 d$ N' C1 F
    一个无参构造方法
    9 i' A' h7 S$ u+ X/ Q& q+ B# r+ c: F8 n# Z
    无public实例变量( 所有属性私有化)
    ; N+ }/ X+ u4 c1 c
      N( y9 {4 x9 l7 ~1 f! E& N 9 U6 O- b4 M: o1 S. |/ V

      C3 s" a) o8 g# @) A+ f4 z什么是jsp标准动作?包含那些?分别都是什么功能?如何使用?
    0 F+ j) p. c& z; K+ }9 |$ Q% l9 TJSP页面中使用类似于XML的标记表示运行时的动作2 C# K8 h8 i4 A2 H6 }2 d- g. O5 S" s

    # c9 r" G) U2 D  j) j3 g, Wjsp:useBean
    ) D. B. D2 _! l. u: b# E6 G' K0 [+ M0 v: P# W0 p
    jsp:setProperty1 L) i# o  Q  q! J, F. H& a
    7 {0 H8 W  M5 A
    jsp:getProperty' {) W8 n+ L9 d+ g
      I8 o" N9 Q) i
    jsp:param& S3 A  n3 y' ~
    - J  a) T  D4 g7 I! T/ w8 f
    jsp:include( A- v; n! g( d/ N" I3 [
    $ z4 U7 l" V4 ~5 K* [  d$ u
    jsp:forward3 s3 \' K6 X9 z  L

    0 m' H5 S) Y* l1 d
    . r/ N# Z. f4 L7 P  z  n3 ?
      s  U! u; U) N用代码示例如下标准动作的使用:useBean、getProperty、setProperty( w9 w8 y) C- Y$ m& a  P* T
    <jsp:useBean& l* B/ o! l2 m

    2 o/ V, t7 F, j/ X" a* }7 k7 Jid=”myForms”& a# u6 Q8 e4 ^
    / l$ k+ b( \* U) g& `3 K0 f
    class=”com.base.mystruts.forms.MyActionForm” scope=”session” />
    ' U( t5 V4 _1 Y1 `# k3 F8 N& [9 n5 H# i8 A% d7 m" j
        <jsp:setProperty name=”myForms” property=”name” />. E* ^& s( r$ B0 O% \

    $ c2 s. J* y8 U4 j& o- G& H' m, x7 w<jsp:getProperty name=”myForms” property=”id” />+ |' i5 N$ L8 c
    ' b/ m( A! M/ c! S" q
    7 |% o) O" b9 e9 I- D, h! I. e# Y

    & h$ M. c; v9 K描述说明Bean的四种scope$ x: m* R- |# b1 V
    page
    2 C6 Z, C# U' K( L6 e& y; Y; k5 N$ r  C$ x. @
    request
    8 H6 B9 {) _- o7 F. {% x6 m: X4 r' _; ^) c2 ~7 c/ _
    session
    & Y5 S0 q3 b* Y
    + e" ]- _9 n# qapplication
    5 S5 c( Q& J6 w' k, [$ S/ i, L1 t' p) h/ P) e5 a- [. i" w; B
    9 X* M7 w! ^3 L" U: d4 g& |

    8 g+ @6 _# j) \0 ?描述说明页面上的字段和Bean中属性的对应规则
    / t) l4 G2 u/ ~5 L8 G  E  U; }id 指javabean的变量名2 ]1 x2 R( n0 H/ `

    6 K( U! O" U+ m$ Bclass指javabean类的全路径; [1 y& _$ E' o. i' A2 b& v, P

    ( b% i) r% |9 i1 C  dscope指javabean的应用范围8 c  r. m5 g5 G' ~" q+ l0 `8 n' T
    ( n, r' Y2 E& D6 \+ x. W
    name指所用到的javabean的变量名+ r% {, I4 B% A! f' {! Q
    & r9 x- m( D( z
        property指javabean中的属性5 |+ j' Y' M) Q* P7 S# G

    - D2 g# f8 V% O 7 T, u# A. ~$ r9 P! i3 z% d
    * V/ M9 O2 Q' p9 x+ e: p% E
    描述useBean动作的处理过程
    8 e$ s% G: A  \: O, H# _! y' X1 d7 W使用id声明变量
    & o( u/ z5 H3 p, Z' e- u, H
      T) I+ N! R1 z1 b2 F试图在指定的范围内查找对象% s) l3 `7 n1 U: V
    5 ~; q& v$ [/ I( Y, j& P: M
    如果没找到5 f: ?% B7 E6 h$ d! ?
    ; v. L1 b0 p( g. T
    创建一个类的实例
    # a3 k% D) ?! F9 {# L1 ~5 d, Z3 }/ D
    执行useBean标记体初始化对象  e( X! d+ Q6 o' ?

    ( N* X7 c  \9 B4 f如果找到
    8 e3 P$ D8 ^6 M) d# {. ^1 {9 {" Q
    3 \$ R% E( t7 }8 D' O6 o; T) k     将对象转换为类指定的类型' b8 T. s! P: x, U7 ~

    3 `  W0 T. Q! n3 ~; \! B & k$ ]7 M! G% K/ t

    9 z- c! z8 Z) _% a8 ~, I1 S/ N描述forward动作的功能' h/ r; F9 G  ^
    使用脚本代码处理请求时,可用jsp:forward 动作产生一个不同的视图,
    * i, ^9 D/ G1 l1 b, Q
    5 N, i1 P7 e  i  t使用同一个request:! C6 Y7 a& W7 v! i% M; u
    4 [4 ?2 U( |* r2 K3 l

    ; j: @; \$ u, E" T: U( [, s. V4 M. r" l% V; d( y
    什么是Model 2结构,以及结构中各部分的功能
    / K) p% t. }! l( t+ e' Pjsp+model+servlet) z$ a1 ^: r1 f5 P$ s. O1 k
    5 ^$ F% f' Q' z6 c
    Model 2架构使用MVC模式,JSP页面充当视图,Servlet充当控制器
    0 }1 @* E% ^: p& G4 O2 ^9 G7 p- b3 S0 e0 }7 k
    Servlet控制器:# l7 o! C% A  S$ _4 M5 x- P! T

    7 C$ Q# V4 L) V( t- b验证HTML form数据
    ; Q" v( i) r$ p  L( q# f
    , {- f3 x$ I+ J$ Q* I* O6 l调用模型中的业务服务
    ( A  E! X, }2 d3 K' F9 c) i; z- s! o) I6 \: ]9 K2 a* N+ k
    存储请求(或会话)范围内的域对象% Y/ b- s; _1 B1 w2 W
    ) m3 }$ ~' Q6 k1 U! J
    选择下一个用户的视图" I# H2 u+ m: j" H$ [1 |! @

      \1 l9 e5 Z/ p, u) l- XJSP页面视图:
    8 }/ i" S+ B& H, n: E) F3 U' d3 f9 R4 F
    使用用户界面(在HTML中); z# l  x6 x2 U& O5 E4 j0 o

    , [- _5 o0 M  g# N        访问域对象& E  P1 a" a; Z& j' C' L% v( O  o

    # y* K) l% {: A4 q/ z2 _! E$ m - r/ _4 S  r& T9 Z" D/ j8 a6 w  H

    5 t$ A) D. U% M如何获得分发器?分发器的功能?! h( l$ O! ~' h5 G" [3 t7 q
    上下文对象中的分发器:. g+ Z' V( V+ D' l; }

    ; V4 T# x6 I7 ]3 {ServletContext context = this.getServletContext();
    $ F1 J. k, D) N+ k# t1 S/ M, _5 f6 L* i1 k' |
    RequestDispatcher servlet = context.getNamedDispatcher(“MyServlet”);6 u1 v) t# S  @* }9 l' E2 v

    7 j  ?! n7 p! u8 j' L2 {, Qservlet.forward(request, response);, s- l( o$ x# |: k" N: @% L3 a7 M5 V1 ]
    8 N" d  d. `* Y6 B5 ~( N
    请求对象中的分发器:
    ) v0 s' N% Z# w7 ~' W
    8 I, S( {2 H: ]! y% A& mRequestDispatcher view = request.getRequestDispatcher(“tools/nails.jsp”);' F/ e$ E) Z9 [  u7 V$ n' k4 U9 N
    ; H2 L+ x; R$ U2 G5 c
    view.forward(request, response);
    7 F( E0 J; u5 H& v/ G, H1 m) o0 ^0 c
    可以将请求转发到另一个jsp页面,并保持请求的传递性  q/ `3 u0 G; R9 w5 h
    ' f) I- u" e4 f: A; @& t

    3 o- ?. e) F) d6 `' h# Z( Q& F8 e/ F, ^  z% f
    Jsp中页面跳转的两种方式?
    , g2 m2 K) ^# i8 s使用分发器跳转页面
    $ Z9 ]3 {, g! Y5 T9 VRequestDispatcher dispatcher = request.getRequestDispatcher(“url”);
    ' C5 [7 R5 S4 B5 q5 x( T8 \# F! l
    % z# a9 z% e& C) s. s, L9 ?dispatcher.forword(request);
    % A- X0 `4 G8 ~1 @6 t" U2 V9 ~# t* A" m3 ~
        特点:保持请求的传递(上一次请求中的数据,在下一个请求中仍然可以得到);
    # |  q5 m- Z( e, ]- {6 K" O& s* I7 M: ]/ ~0 e6 _  g( ?4 E$ i
            转发的页面只能是同一个Web应用程序的其他Web组件4 `* B  q$ D3 p; Z  L4 c. m

    ( D5 W+ j# U/ h9 b6 o9 n使用重定向跳转页面) @0 b/ f5 X; u' D" V9 j
    response.sendRedirect(“url”);
    / X: f0 R% O2 X5 B# o! j; I1 r4 W5 E. ^3 [6 H5 l( ^0 J: {
        特点:产生全新的请求,(上一次请求中的数据,在下一个请求中不能得到);
    ( C2 l! c: O9 ^0 @! L, u; j! V" v/ ^0 a& x
            重新定向的页面可以是任意的URL
    # y' _/ k* O9 m4 K0 I4 H" d) R) J! `, e5 u. W* j' E1 W

    : e$ d3 x4 w+ c7 o8 T9 \& Z! r
    # i4 d4 Z( \- j# Q5 e描述Jsp中引入另外页面的两种方法,并比较两种方法的特点?! q5 f$ b4 E' Z5 K: N" \: H6 I0 g
    <%@ include file=””%> 在编译期间把另一个页面完全嵌入这个页面,可以说是一个页面
    5 L% t& r: a0 h. \: d2 j/ c. t) h8 P: t2 C& A* h: f- P! t
    在这里可以共享变量
    % a' _' {6 F$ R8 [! D* k+ Z
    . a" m6 z; \8 q! }<jsp:include page=””> 动态的再运行期间把另一个页面加入这个页面,可以说是两个
    2 I5 F& \' q" O7 [* h
    * h- o$ M. R0 D9 x) U0 i$ T7 y页面,不可以共享变量5 R2 H- M7 C3 v

    5 l' L0 K8 B- Q* n  [
    9 \# f$ U3 e# ~( Z
    ; y+ D4 u2 P3 z" R3 W7 {; Q什么是自定义标记
    1 [0 M* z) T( I. n8 N自定义标记库是一个Web组件,
    0 P7 n) W* E. ?- d* R
    5 a4 C& O! G( l包括:
    & z0 ?2 Q' g( x& g9 x0 s5 S
    / C9 E$ q1 |3 u% N2 }% k; K一个标记库描述符文件(*.tld)
    1 p5 X( |- @  s1 w9 U) y* z) d* u: ^) x& a7 m- E" s
    所有相关的标记处理器类(*.jar)9 J% a* c0 V+ }1 z% k
    4 J/ c- _3 ?+ R7 g, t' `( z
    9 u3 d. p5 J+ \7 Z9 e5 t5 P" T7 I& H% @
    - E- o5 _- N5 f, w
    描述使用自定义标记的步骤,以及每步详细的工作
    " n4 k+ Z% ~, m/ B使用自定义标记前,要拿到.tld和.jar两类文件
    $ S5 j/ _2 x: m) w# A
    * d- h  h) @4 l7 c6 K' k把.jar文件放到WEB-INF的lib里面。
    ! q) ~4 k% D8 e* m把.tld文件放到WEB-INF根目录下。4 W# ]& a9 G8 m, O; m
    在web.xml中配置。
    # s+ ^8 m+ z' v- G' t& k: n<taglib>
    ) g/ y; k$ l4 s0 b; I- @+ O( d+ ?
    ' d$ @5 F# ^" `$ N" P( H- _- ?; \8 q- ^<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>, }$ l# H" Z" n: N

    8 ]1 |) o, {1 B8 l     <taglib-location>/WEB-INF/c.tld</taglib-location>
    1 c( h$ J# R# g% K$ I2 I- W7 H3 i( \/ f! }- b6 n
    </taglib>
    & w" V3 t4 p# ~, A; D4 r' f7 T# a- u. U1 @4 Q
    在页面中引用。
    $ D1 Y8 A* \. X9 y+ H: Y<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“s”%>% c3 X' H! K5 P7 t* {1 q& X

      e3 ~9 i; M! H, U; K3 ^* wuri必须与web.xml中的uri对应
    0 s: m: c5 m+ Y4 L6 j& g) a/ Q$ R( }; V7 a* j( d
    prefix是前缀,用来区分是哪一个taglib
    2 p+ u0 e. K/ q) g6 L# k$ H7 f: Z0 t3 c2 y7 u9 v* r
    使用标记
    5 G9 f8 N0 M4 H: N* h+ d# m& k格式:<prefix:tag名称 属性>8 R, P$ {) T: N( B) u* W2 k$ O# t
    % l0 N# X) [+ T$ x; Y
    <s:forEach >
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    14#
    发表于 2014-12-03 12:45:59 |只看该作者
    在tomcat下配置数据源
    : R- L% c1 [* l# k* w1、服务器与数据库的连接% ?1 }: N+ b! X# u7 s% Z
    * l  h/ N1 n, O+ I5 n6 h$ d
    配置server.xml文件+ d: Z' W  N. V% n* N; h

    " f. R, I& O& y0 ~4 o, a1.oracle
    + t8 }0 r4 Y( s" h6 x8 m8 _+ i% X1 G! J( a7 @, W8 ]
    <Resource name=”jdbc/company” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”% R" C! }8 A$ R3 n9 r" e

    ) G" f) ~) F% G                        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”- o, C) I4 K; t! V' P* I4 r
    : P9 J% e8 H! W
    url=”jdbcracle:thin127.0.0.1:1521rcl”  ~# N& }, W( g

    ) a5 Z  w, a& R$ m$ adriverClassName=”oracle.jdbc.driver.OracleDriver”5 R0 L9 k$ p4 K' V3 z7 F. q
    : A5 G- N) `5 _# c3 A+ _( G
    username=”aa”+ u+ q; i' U7 N1 Q0 E

    : y" @: w* S' ^: [password=”aa”
    0 ]" o) f) Q/ l0 x% g/ I" S, j+ a; S& }$ _
    maxActive=”50″/ q0 G" N* ?- T- }7 u% I( @' }+ l

    : w, ]  P: V* J* u2 W) }" vmaxIdle=”10″1 S. L  u; C' F8 Z$ ^8 A

    5 E- N& V" p% d6 U% R9 DmaxWait=”-1″
    & L7 L# a; E/ n; q$ H
    7 F! G/ z7 R) K/ _" |/>! X: A' O# T9 R, `' y

    , z7 I% n, @& S5 t; K1 C2.sqlserver
    + S4 S9 ^& q  B* |
    ) ]3 P( ~7 T# v7 j7 t! P! l<Resource name=”jdbc/webpage” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
    ! \5 O$ ?1 ]4 Z; k+ U  S6 ~7 `! y: l
    & @: ~# L! O! I7 p$ W! [        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”6 ?5 \7 Q, J7 e$ C4 p  j

    . X4 u  r4 q$ y2 vurl=”jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;  @, P0 y! S4 f+ O- k

    + R. ^, L# O3 f+ k4 PDatabaseName=webpagetest”
    ; A/ I4 r$ ]- _. ?  o
    - Z+ j" }2 k9 n( V& [( udriverClassName=”net.sourceforge.jtds.jdbc.Driver”
    5 `) L" W/ V& w0 \: K, Z- y" m1 }% |  ^! Z
    username=”aa”
    9 g6 T4 |( E) y) {  k" W
    ! f# c: y. ^+ H9 D; Mpassword=”aa”
    # R! c7 R$ x# _$ X
    ; J9 M! {  i& z4 y) W) \maxActive=”50″+ I+ ]+ L7 @7 C' w

    ! ]' K' G& m$ I, a, omaxIdle=”10″
    0 z9 |& w9 I; \* ]% w5 |4 p9 m& E/ \
    maxWait=”-1″
    & c+ z9 S; t; B  y' z( G5 S: X( D, e
    /># ^" d1 j% W/ Y+ s) ?

    # Z4 u) b; _4 B0 n7 N2、配置自己的web应用的xml文件
    7 ~/ G# q) ^" X$ Z3 u! g8 w) \4 @  l
    3 y6 N, s* M% t  O

    7 l1 d& V* W8 J  l9 d- l. {' Q<Context path=”/eb03web” docBase=”F:/workweb/eb03web”
    . t' P& G7 G4 h# T  Q  ?. h4 i( X$ D8 c4 _3 Z& h4 {7 \
    privileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>5 X4 q+ R, ~9 X; m( z! g& p" t

    4 g8 ^+ X2 p2 o<ResourceLink global=”jdbc/company” name=”jdbc/company” type=”javax.sql.DataSource”/>5 I% p. ~! |- f' u
    : l, N( L1 R- g
    </Context>
    ; Q$ O$ @9 e# N- J7 ~$ v$ e) Q
    & z' l1 K) E0 v' [" ~, C- T! C2 P : ?4 B* i! e6 Q: q
    ( O: E; Z( j1 J5 J
    3、配置web.xml文件
    " @' m9 z; y* i$ f$ h: U  f' r/ S. d( o
    与服务器建立连接
    3 V- L8 L5 W0 r3 j( \9 [1 A
    6 u" w7 |4 i% \. U% e7 o2 y' H<resource-ref>
    6 R% U. x, Z; J! A+ y1 i* t. L. J7 e$ c/ A- o! p' ]; l2 r
    <res-ref-name>jdbc/company</res-ref-name>9 H9 z4 q# I, \! f6 z* I

    6 O+ C! p6 r* v, k; r+ `0 a<res-type>javax.sql.DataSource</res-type>+ H1 |) {  D5 [# a3 E& {" W
    & k8 j0 o4 T; P5 I; O: e6 Y
    <res-auth>Container</res-auth>
    / ~6 u: m/ A( ?% Z* s# ~
    6 U* E6 V# |) {+ U) q5 {/ O# x</resource-ref>* q" T! {, ]( E

    / B0 D) P5 U; G7 b" E4、在应用程序中不直接与数据库连接,通过DataSource连接池建立连接, M9 T0 c  ~3 \" K
    1 C5 B- t" r5 v8 f( @# [% I
    //1.在程序单独用时设置系统的属性,在tomcat下可以不用配置,; ?% d  D/ {( B& e1 p2 B

    ) h+ D0 n+ G, Z' R. x. R$ JSystem.setProperty(Context.PROVIDER_URL,””);
    ) k" ~6 m, I  W* z6 ^) L9 g( e3 ?- ?# p0 e
    System.setProperty(Context.INITIAL_CONTEXT_FACTORY,””);
    0 G( Y# G' ?8 A; {
    # Q& C' J% q6 S  [0 \: u: Q//2.创建一个上下文对象
    2 R0 d+ L* L+ ?# f
    # d; k$ R# d* M  I0 h( \InitialContext context = new InitialContext();2 c5 w, d# [% a6 h+ ]2 h. l0 c
    3 a5 Q% O, Q$ v
    //3.通过上下文对象在连接池中查找DataSource
    - b4 B! `0 u- G- T! j+ w5 }
    0 [2 Z+ Y+ t6 RDataSource ds = (DataSource)context.lookUp(“java:comp/env/jdbc/company”);: U/ ~2 J$ J& J: d1 V2 u' V# q2 l

    # A9 G" l7 _* R//4.通过数据源建立连接0 _5 x8 z6 T, Y2 u. |, W

    1 [! q) f  e, H6 b- Gds.getConnection();
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    15#
    发表于 2014-12-03 12:46:30 |只看该作者
    ORM对象关系型数据库映射9 Z) q5 k+ D3 H7 h% p
    (Object Relation Mapping). Q; i  O4 V+ n
    6 Z% Z6 r: p2 N" e+ @9 k
    一、映射的特点
    * ?5 e) B  ]& K" k0 x, Y
    , E8 J7 C) K5 B! P- u1.一个对象可以对应多个表- v0 f/ c( _1 R, S& L; I

    ' X- H% k* K. Z" D* i2.一个表可以对应多个对象. O9 ^* l1 E# ~: Z% @: k

    6 y. X/ W" @# Y" Y3.对象和表的关系不用完全对应, r" V& ^! B: ]
    1 c& `" v( X- w$ w5 |
    4.对象的属性的名称和表字段的名称可以不同
    1 t( Z4 d& U# U/ F1 a  z9 |8 g& r, b, O2 b3 Q! z
    5.类型可以不同,但数据类型之间可以转换  w# I; I) g/ X0 L

    8 O- W' V2 S: E4 W& X6.对象中必须有主键,数据库的表对主键无所谓
    ' x7 u9 N5 G: l6 B3 ]$ P" t5 V- t" t* f* e% J  c
    7.数据库中有主外键关系时,对象中可以有,也可以没有
    : w4 O. u% V- b* ]( H4 [' B/ J- V4 o9 @) m) _5 A4 ~
    + Y! P. ^& G* o8 I: `" A
    ! k4 {1 p' M& L. D4 l
    二 、有一个映射的描述文件————>xml# B$ j% H8 x' I1 Q
    9 q+ \2 `+ i* ~# u
    三 、怎样实现描述文件————>一段程序
    - A( M# w( q" k6 t( k! `' N4 F% @2 k  K- G& D
    对象 映射(mapping) 数据库8 H7 f! Q+ w$ K" b5 {5 d

    ! Z/ {% S7 I# _user9 T5 h- s% w$ Y* Q, w$ M

    9 _0 W) @. Y. Aid=11
    * z) n! q" q9 v9 i( L' Y
    # E# }! v5 b: S) b. S; rname=”张三”———— > (1) —————> tbl_user(id,name,age,tel,address)
    & w0 y; }1 W) d3 V
    # S9 H  O' L3 i( O. s+ x- J  Mage=25 <————(2) <————% t- l# r' x/ Z9 Z

    - |& z2 d1 [' U+ D0 F- v& g2 ~0 B8 q7 ~ 9 S  Y; e1 T/ A
    " ]& B! L2 P; i3 s* W/ Z2 m. X" G
    (1)从对象映射到数据库" h% O$ L$ M4 @6 H- |. Q4 S4 q- `
    ; r" G& j8 U* r. O) w' V; c6 D
    1.JDBC
    0 Q6 w* n1 D, U1 u3 B0 G2 V
    # R. O1 p, B0 i2.根据描述文件来动态拼接sql
    ) p* O: T* {8 G8 j/ H% \0 Z, d4 _8 w
    3.执行,添加到数据库中
    . v5 E+ R, j: @6 U$ ^) ~0 g$ G: [% k  k( H4 d) F- r
    ! K, H) a# [5 S$ p" g& I

    * \6 K3 K* F6 `5 h/ o6 L3 t(2)从数据库中映射到对象
    ! u+ b: o( Z1 [7 \
    & P. i3 }4 [$ Q' m1 p; }5 F% G) C2 D1.JDBC- v' ?. k9 t/ N( Z: v

    4 C6 R# ^$ Z7 S  Z+ C2 ]2.拼接查询sql
    ; s) f  K0 R4 d
    0 [% d& ^0 _( @9 `3.ResultSet
    & _8 }. H: Y1 `0 \
    6 D; T9 I5 o. K9 j, A4.Model 1 F0 `7 t; t/ ]; Y7 V: U( I8 X
    : m8 D7 M' x  X, d9 V* t! a/ c
    ) c* _# c- g* A- J0 X# e  j
      e+ h/ C5 @6 _4 Y+ P
    hibernate
    0 |7 R1 C# i3 B$ H( i开发流程:0 `6 X$ n5 W" d- \. o* f$ V
    ( n2 `; y* G7 l+ X+ h  ?0 e, |! [
    是什么?
    . z4 _* R: q5 p  P8 c; z; N/ _hibernate是一种基于orm 的轻量级的框架% Q8 M) j! g6 r% ?2 C3 M
    0 a/ f, b& |4 ], @* K

    % E* B% m; A6 H4 N$ L7 ?- A7 d1 z( ?3 Q% N7 @* a+ F. j
    有什么?! F  p9 V' L' \% K* z( a
    1. session 保持连接状态(依赖事务和连接池)
    5 @/ N  z. t4 M/ ~4 L* O* b# h
    $ D' y; }9 L- f  j9 a2. Transaction事务
    2 e9 }- \/ H0 b% X
    % z) f& x' @9 `1 k7 W3 l+ w2 l! S3.% e% M8 ~& z- k+ R( Z% C+ w4 h
    Connection Provider 连接池
    - H1 u5 r( F5 a  r3 B: U: e# B, ^7 _+ H- J, T4 r
    ; ^7 J+ l, |9 m+ O
    * @4 u& f) A" s) n3 X$ F
    能干什么?
    * T7 M; g) Y* \- \  [  u1.orm
    % v. @$ g6 J5 p* p* t  P* }8 }4 h$ J- a/ e; g! C
    2.提供操作数据库的接口,简化数据持久化的编程任务
    4 S% {2 q, T3 M) l6 r5 r5 H3 N0 b4 C$ J/ _
    6 u: F( z( W6 o2 C
    / f0 J* ^. p! j4 o. d) |/ ^
    怎么做?) m# j* {' X: a
    1.搭建hibernate的运行环境,将hibernate的包和hibernate所需要的包拷贝到lib 文件夹下. d1 X" C9 l8 q! L5 A7 G, J
    2 T0 d3 A) U9 ]4 ]3 F# C" u
    2.O(vo)0 `  L/ Q( c$ f/ _

    2 w7 P% M) @  x, W4 r3.R (关系型数据库中的表)& h, c2 |. z5 @- w
    9 q/ |6 V; Q* f* f$ l3 E8 V1 x/ p+ d
    4.配置文件
    . ?6 e* F, k. P" w/ {( v, x# Q4 i3 O" [, B
    4.1 cfg.xml 放在classes根目录下,默认名字为hibernate.cfg.xml
    . v8 D5 X# k3 f' q9 P( u2 v
    6 L& W0 J1 b4 d: Wa.与数据库的连接+ @; p- S, V+ R; w) p4 \# ?

      ^- v) c3 {  s! q! a6 a7 V" t/ ob.可选配置
    # z) L5 a7 I; q, ~1 `$ C
    0 t* G, R! f: x8 F- `9 _c.映射资源的注册
    3 T  H# s5 J$ P4 L( d1 m0 `
    # z* g1 E& |; i$ }$ B. I- R4.2 hbm.xml文件 名字与类名相同 并且与类放在一起
    8 A, b* ^" s6 G& W- B- M
      X+ L+ c! \/ b' @/ ha. 对象与数据库表之间的映射
    7 I! `, @6 t' s- f1 ]& p; z) i7 V- P8 ], G" O7 B/ J
    b. 对象的属性与数据库表的字段之间的映射
    6 }& t" }5 F. O, K/ I2 L6 x* g
    1 c& W8 @: ^& xc.组件之间的映射
    9 f, ?9 h. ~5 F5 B/ T/ d5 ?
    6 p! X% z+ A5 v, Od.对象与对象之间的关系映射' F5 W/ {; t! m7 H
    1 W4 _* Z6 I. z6 ~
    5、客户端1 E+ V: o) p+ d/ n. v5 t' K9 {* U
    + k, g+ I2 a0 P8 M4 \1 J! n. i0 a3 s5 |
    1.得到SessionFactory
    0 p. a  `- {3 h8 I4 k' [2 @" J) h+ j8 ~1 ^9 p5 w1 |
    2.通过SessionFactory 工厂来创建Session实例# N% I0 C  }2 j
    ' [4 p& f# F# P6 R
    3.打开事务+ ^, x0 p$ T6 W* X1 a+ l) Q

    ! U. R% \3 e+ j7 S: z9 N. x. \4.操作数据库
      y3 O" F, C) Y* X0 d! s& E3 u+ b% I; c- Y& l: t
    5.事务提交4 s7 }' G$ L) V" f- g. }

    ; Z% r+ M% |. C+ ]) p& f6.关闭连接0 M+ y: F* F6 ]& ?

    ' X% a- p% r+ t) {% i1 [运行流程:+ X' H9 {% f/ Y

    & p* _8 ?0 ?: C, E$ _5 {9 ?整体流程
    9 }& R. A1 x7 l# n1 a! _. H3 [0 H& I1.通过configuration来读cfg.xml文件
    / N% ~: C& R0 z- {6 j9 T7 A$ A9 b& v3 a
    2.得到SessionFactory 工厂(根据数据库的连接来创建sessionfactory)
    / {& b, y- ?0 M0 l" D" u: v6 h! o/ \) A* z4 ~1 w7 ?) O' H- r5 x! g  R4 m
    3.通过SessionFactory 工厂来创建Session实例
    / N# m' H+ A" d/ Y
    4 w5 a9 F  E4 L& X# v; Y6 V" O4.打开事务; V. z) u8 L( ]/ a% Z' _/ F
    3 u6 j/ s6 A* G# J7 Z
    5.通过session的api操作数据库
    # Q+ G) C- E' F( q/ |, K
    : G; W( ?' O2 k  I3 F5 ]6.事务提交3 D$ i5 Q: y, l

    4 d; z! X# r; \7 V7.关闭连接$ T+ k4 p4 V$ M! F5 R$ p

    5 f2 s# ?( i7 W& L! I# C
    ' @: ?. ?1 K# h
    6 f+ M5 x( Q+ w8 J4 n9 }save
    5 U, ?  j9 J) m4 p1.to—>po- u/ ~+ i4 L4 G$ `, l
    % ?6 U9 f$ k' ?) g2 d1 L1 |
    2.根据model和cfg.xml中映射文件的注册来找到hbm.xml文件# E* [+ {, `8 M3 \
    * R  O. c! W  m* O, K, O+ d
    3.根据hbm.xml文件和model来动态的拼sql
    " d3 W$ g! b; c+ v6 _, x2 O$ F* C: I& H1 D) P- \7 p0 ^" \" ]
    4.客户端提交或者刷新内存
    7 R) b6 u+ @5 \1 P
    1 e; m  `4 m- y  C! E1 ?9 C' w) }5.执行sql,值放到数据库( E% ^7 a. k% B/ A% ^% H
    $ f9 Z( W7 j6 z' z
    , ~; Z. t- Q  |. ~, U
    * r5 c9 \$ I. r3 k0 s) A
    update、delete
      Q2 S% q& c; e! z4 f4 e1.根据model 的id在内存hibernate的缓存中查找该对象5 V  f1 C6 l. h: u- w

    ! C, a! t% L; o4 A# y如果内存中没有就到数据库中查找来保证对象的存在
    9 }" z/ w5 ?5 }
    # d* `8 j7 E. T1 ]0 L2.根据model和cfg.xml文件中映射文件的注册来找到hbm.xml文件
    : c' ^1 i& G7 p; W4 Z
    2 |- @  R/ N0 J6 e' B2 v3.根据model和hbm.xml 文件来动态拼sql
    4 c! w: w% U8 ?6 R! i, d( q$ K# h" f% _  q$ P, J1 u8 Y
    4.客户端提交或者刷新内存& e  m7 l( B' r4 Z
    * y1 o; V) n" {' ]% s  ~
    5.执行sql, ?9 I, f- h1 K# A. f
    8 a7 }5 g' n, f2 \8 i6 o

      r: ^/ p1 I3 ~/ V& v! p; R  A4 ~$ F- g9 @, I
    Query+ c5 `8 j( w( i% _; B7 R
    load
    ( F% F3 Z+ {% h: F3 n( K: h: N7 K# P( J$ k6 v
    1.根据model的类型来找到hbm.xml文件- E' N+ v1 e+ m: v; L

    6 t: w& j0 I+ {3 k; I( O2.判断id对应的对象在缓存中是否存在,如果存在,就直接使用,如果不存在就进行下一步。
      x! r! T, r* p- W% |" e# g* a# D. A  J- G
    3.用id做为查询条件来动态拼sql
    $ l6 h) {6 p3 ^& y+ F3 \  q
    . G2 X+ ~" y) R3 |+ m3 ~4.执行sql 查询(先在内存中查找,如果没有找到(会抛出例外),就去数据库中查找)9 g2 A6 h3 t/ G$ A! h: p7 N/ N+ ^
    . X3 @% \- J: K+ c  Q" }
    5.返回一个model类型的对象/ L3 T7 ]" g1 T# f. u
    # |; d2 Y  G" r
    get
    # p# p: T9 E3 I0 j9 v
    + w( f5 p2 {- t) }: [$ q4 w    1.根据model的类型来找到hbm.xml文件# y, |6 f! c. I) L$ d' k
    ( S# b2 n, `" M  A' |  Q* ^
    2.用id做为查询条件来动态拼sql
    6 o$ A6 `9 I  l  h; y2 y. @# Y: p5 G; d$ U
    3.执行sql 直接在数据库中查找,如果没有查到就会返回null
    7 E# s" Q% n; T' ?" B& m$ g" N, J6 }4 W
    query
    ! Z( e, q/ g3 M" L  o5 l/ e5 l6 U# h
    1.分析hql语句,得到model的类型& U1 N2 \6 q# Q1 U0 e1 m' r

    ' U, r. y+ X( @% ?2.根据moedel和cfg.xml文件中映射文件的注册找到hbm.xml文件
    + K4 l( U5 J" F. U! ^# a8 m5 ^+ E% n; l# c- {. w- s
    3.根据model和hbm.xml文件来动态拼sql+ Z3 K( A: C- |9 S

    * Y8 x3 N4 R- z9 l9 e' E3 d4.执行sql查询数据库
    5 G6 C0 N- g8 x0 S
    4 B" A$ Y3 N% k; ^5.返回一个resultset
    , s4 N% n$ Z& q1 S
    ! o9 e: d/ ~6 ]0 y) s; F, j6.循环resultset的值,放到model中在放到集合(List)中  g% U! \8 K* S, _- S

    / z9 a; ~' t7 G6 h2 ? 9 I' ~: i! H: z
    3 r/ U: S7 W* ~! m/ ]- L8 j* _
    谈谈hibernate缓存机制& T7 f5 k  p' Q- K+ X7 i
    : z3 O* R2 b0 T' q* d' v
    缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了。打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去数据库中取,也省了很多事。
    9 \2 {. s6 k& S  F
      e9 i, T3 p' S. R  I7 ?* T8 C. {
    - o; u$ m- N7 M& U9 _* x5 K9 M5 C% [% K7 X5 J
    hibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。9 p8 Q+ |* s& y+ t8 y8 c
    ( T* u% _& ^" P, k' H8 j; l

    1 k( l+ J" H: v* k$ c. g( f! S8 x+ j+ s- A* \5 l  f0 ~$ _% F/ U
    对一级缓存中的session事务进行数据的预存取,数据在各个session的上下文中存在(单例),当session关闭时,就是session.close( ),整个所有session范围内的数据全部清空;二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二级缓存只有一个区域 ,画个图比较容易理解。1 o- a* j, s% G+ J; a7 E7 o

    " p" }6 d* Z# |/ G) o" n , A- j  L$ o4 C7 K  `
    , V2 }* Q5 {, G" R& F
    | 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|
      q. h2 n% d# S
    / m! o1 m; y5 w5 z| | | |) x5 |4 `1 t- ^, `

    % y7 W. o6 W* P* z| | | |8 D5 Z' S# j4 Z8 \* {$ o" \
    + V8 Y1 n* r1 ~  M& e# T2 |
    —————————————————————————————————5 L, ~# D4 n. V5 e8 _! E, e

    . i0 }7 z( Y- |# hsessionFactroy级别的二级缓存
    2 q" D7 S* V" C. c* J( A. U1 K0 L! y2 a: W
    ——————————————————————————————————————-
    2 N/ J& F/ d$ d; O2 G0 ~* G6 E* k1 N; k
    |- p8 i! o, ^2 T1 G" n6 Y) [
    5 R/ @& ^+ J/ }) Q
    |
    5 }) a9 b# f# G+ Q# b$ Q3 Z5 O+ _  w1 \& S' k
    |% l9 b1 [+ c5 n+ C( i. ]* q9 E
    ; G9 k5 x. J9 V$ L6 X
    ——————————————————————————————————————
    ( F2 @4 `: @) q! M) a9 R" ]' K% {8 S( ]+ |. P* y$ d
    DB
    / o! B6 g5 j# ^  ^, c: O3 t6 @3 i' @) ~
    —————————————————————————————————————–) N% V" }0 B1 U, w: C# B" r

    7 O9 Y% Z, N3 h) D3 }
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    16#
    发表于 2014-12-03 12:48:12 |只看该作者
    Spring- O7 b9 ]4 Q5 a$ {
    • 是什么?( Y8 ?. h8 a" S( y1 ^
      ! \) U5 @$ c8 a

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

    ; ~' Z" W* K! @% b
    • 有什么?; W) V3 P! R/ x3 x' i& f. h
      ' `: \8 O& _8 l  ]

    ' y) n5 q5 P; e; \

    每个包的功能:

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

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

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

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

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

    AOP :面向切面编成

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

    ; o- W% M2 T. S5 b# ~& O0 c
    • 能干什么?
      ( d: B' Z8 o5 j% Q0 l4 o* v

      9 ~7 i/ v9 y& M! y( E! S9 U1 Z

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


    / c/ R4 S. }. Q! R
    • 怎么用?
      2 b% l6 `" _' m9 A( S

      ) x+ X" K- |: j
      • 搭建web工程,引入spring的jar包
        7 a% r9 x% T( \3 ~. K# F  g+ i4 E4 A5 Y
      • 在web.xml中添加如下配置
        9 V6 p, d. M& x4 y/ G2 T8 z

        0 h- C: j/ u1 e* I' m+ w

      & I+ H# y2 a- S# ]1 d' s& t
      6 Z  y" F& J4 Q1 i6 h# }$ e

                contextConfigLocation% N" G; U2 H+ O. A! l

                classpath*:applicationContext*.xml( h% z& m# m) f' r$ v/ q

       
    3 [5 ]3 a  I/ f; l; r# F( }. J

            7 c# r# K( s/ C( D

                struts2
      g) v' ~: Z; l( g+ O

                * h& a; e2 U  x" k1 W0 }7 K

                    org.apache.struts2.dispatcher.FilterDispatcher
    - t! d& w, I5 j  D0 b

                
    $ h$ O# g  |9 t, N/ l4 H; E

            + j) u5 Q0 C# p$ h. l% j% H7 F

            # U" T3 J# z. j8 z( L8 @2 O$ ^

                struts2
    : b: l! g* H3 p8 o

                /*4 {0 H0 f+ m( \0 M( h' G


    1 f$ J- f; x. \


    , U% v$ |, m" Y" E/ r

                
    6 b$ ^8 ~6 v; r

                    org.springframework.web.context.ContextLoaderListener
    2 W  G  i8 b4 @. C* L0 w

                
    ; \' d/ p+ ~0 i5 s

            

    • 部署, a0 l- u+ _, Q$ n

      ' S7 @/ X# v3 c' T: L+ H

    0 F# ]5 @! b/ L1 _4 \' Y7 k+ s" y. N. _3 ]

    , N) Z8 ~# A1 s: R! U
    • 容器和bean
      1 c5 r" d2 z8 B: c9 ?# q. G# B

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

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

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

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


    & E2 n, \1 r! W5 r! z1 L0 u; {1 r7 o
    • IOC控制反转
      ( {- d$ p% T2 W1 |; v
      . h4 d4 \- x' m0 v0 v

      % Y2 j( T' v. [' B2 n * g# H6 R* k* \6 ~+ b  H
      从前的应用程序想要得到A的实例他会直接主动的去拿,当用了sping后,应用程序由主动的去取变成被动的等待,由spring来控制应用程序所需要的对象
      ! M9 z* @3 `: G! j2 I# a
      • IOC的优点
        + x- {! J1 N9 M: O
      1.可以通过IOC来获得实例
      2.可以通过DI来获取注入的资源
      • 配置IOC的原则+ F0 L2 _) |1 d/ i
        • 一定是可变的资源才采用依赖注入
        • 一定是层间的接口或者是模块之间的相互调用才采用依赖注入
          1 h- b( J3 m4 v4 R% Z1 F/ _* D5 g
    & K3 Q5 T, q7 {+ ?1 H
    • DI依赖注入( U% p4 \, Z  m5 p* F2 O

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

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

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

    例如:

    在配置文件中

    + e* q6 K. q( t: O

    0 ^. j- d0 M: B4 ~1 D) h% m% P0 V4 u& q, Y7 R0 o$ a# \

    在应用程序中

    Public DBDAO dao ;

    Public void setDao(DBDAO dao){

    This.dao = dao;

    }

    3.构造器注入


    % w- _9 F/ e) a. v

    4.ref 表示参照其它的bean

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

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

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

    6.lookup注入

    7.singleton

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

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

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

    8.DI的优点:

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

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


    7 ]" S3 K7 d8 u% k8 R
    • Aop面向切面编程6 U3 H+ }5 n2 b+ p
      ) E! n* V3 P% U5 `0 F8 L. ]- h  u- \) n

    1.AOP面向切面编程 一些较好的模式或者是示例—-范式
    3 h$ S7 l' R2 a+ q- E( Y

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

    2.AOP的思想: 主动—->被动(追加功能)- Y5 z/ y* Y' N. y$ O

    3.AOP 的概念
    - l4 a3 V* E! g' p* r

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

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

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

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

    5.引入 :扩展的功能

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

    7.aop代理 :实现机制

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

    4.AOP的事件机制
    % f5 {$ a7 [+ W, \2 n$ O9 N

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

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

    3.找到切入点

    4.确定连接点

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

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

    ( g& d3 q1 y* ~& f8 A8 m3 ^

    7 x; Y0 R8 c5 p; d2 b, H/ ]( c9 `0 X1 D

    : P+ h( b( j/ d3 I$ u0 A6 S# m1 S6 l6 w& Q; @1 L- \
    , z2 k- K! x' v& W

    2 y% e+ @" q: k4 X: A8 J

    5. AspectJ
    7 J3 C& F2 s/ h# |7 L

    5.1.在xml中配置比较烦琐+ g5 E5 {: C- A7 F9 M6 o; Y8 k4 S% z! ~

    所有的入口必须从一个代理(ProxyFactoryBean)开始
    ) Z! S6 C2 R* z+ ]


    % F. Z" b  L; m8 K * p# L* b9 u+ U* ^. g( c

             
    - R  t# `3 s# \& x+ _$ @1 z& a: i5 X8 m* e1 k
    ' z, D' A) v1 T* ]8 w! \
             
    " o' l5 z# ~8 f

            * |5 H+ K! d+ P

            

    " e5 ^7 g/ D4 W7 u- Y2 O& |* C
    expression=“execution(* com.javakc.aop.MyTarget.t*())”/>' Z" E* B; S# X' o

            $ Q7 X4 E) Y1 Y( u# s! X4 F

            
    6 }9 M% y5 K9 i) O: u7 N4 R, x9 V

        0 }- U* q) n% [' k- K9 h; [

      D/ b/ Q" r, Q7 I
    " ?& |# u, K0 c( h5 n% I" s

    5.3.使用注解的方法相对简单
    & X) D5 @; g2 A+ L

    @AspectJ的基本语法& o9 b8 |0 y: S3 V$ [

    1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面
    ( Y4 |) L8 `3 Q7 W5 F5 x

    直接在类上定义@Aspect  r# Z9 L% d8 t7 m6 w

    2.@Pointcut声明切入点
    $ n" }6 V8 A: o9 a/ @

    2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字
    * W: g& |" G" \" f$ y2 ?

    2.2、可以使用匿名的pointcut
    % {1 W" d2 L$ u% f& [

    2.3、执行切点的几种方法
    ; ?5 v( V( D5 R/ P0 r

    2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法
    7 W& ]$ B7 ]4 {+ \

    2.3.2 within 指定到包,不能指定到类
    / W* l0 v. P" O; L, y9 _

    within(”com.javakc.spring..*”)
    6 W% F1 H* l+ [8 z/ ]

    2.3.3 this 指定到实现接口的所有的实现类
    8 L% s: H6 S/ [' S5 h4 b0 M

    2.3.4 target 指定具体的实现类/ W& T& s+ [9 U+ s; @

    5.4.advice的五种类型的示例* |* {. W5 Q9 m* S  u: J

        客户端必须从接口走才能得到监控,实现想要追加的功能2 {5 a; h- b8 n

    5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)
    / z7 `. |0 Z, ^/ X5 H

    追加的方法的参数名字一定要与retrning的名字相同
    & `, ~+ {* V" y) }5 T* e

    在注解@AfterReturning中必须加上pointcut和returning两个参数, l9 p. c, z+ H/ \/ I0 q4 \3 |

    pointcut指所要监控的目标对象的方法: ?: i" N! z( X* v* w4 S

    得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配# \0 i$ ]# e5 P- A) W" E  g

    完成追加的功能4 O: b, C) F# z% Z' ~) \

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用" k- a4 `: o, h$ R: j

    (1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)4 ?, q& J8 b8 u9 ]6 x2 y! Y- Z

    (2).; ]. z/ h% q8 H6 ?

         2.直接引用匿名的pointcut
    : f5 {2 |. w; ^  N/ J1 x5 X! ]- t& E

         (1).@AfterReturning(“execution(2 r7 f3 q7 Z. \3 Y4 [; |3 Y

    * com.javakc.spring.schemaaop.Api.test4())”)
    . v. G  V8 J, @

         (2).@AfterReturning(pointcut=, `2 ~5 B) `( Q8 h7 q6 n; U

    “com.javakc.spring.schemaaop.TestPointcut.t4() &&
    # ]4 C, }3 ~* ]. L3 o" d

    args(str)”, returning=”retVal”)1 y. o4 P3 c% U' N

    @AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)
    + ~9 J/ x3 z# s$ e( H0 ]& ]3 C! V

    public void testAfterReturning(String str,Object retVal){2 H* `7 G$ T* M  x

        System.out.println(“afterReturning1=>”+retVal+”=>”+str);
    1 B, b/ o* b9 J" D) \

        }7 X; u9 c  b0 v

    5.4.2.@Aronud
      p& ^7 f% ^) u

         注解@Around环绕追加功能;
    ) j3 |6 j9 K1 b

         在执行目标对象的方法的前、后追加功能;& f3 e0 c3 ]& ]+ ~9 v" i

         必须有参数;第一个参数的类型必须为ProceedingJoinPoint;* r' y" I9 T, ?1 C

         通过ProceedingJoinPoint的实例的proceed来调用所监控的1 [2 P2 q  s2 q: G/ R: K

    目标对象的方法
    9 q% ~/ [7 _( O% H! R$ `

         1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    ' T* K" A6 V8 ^8 ~" j

         (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”): ~- ~. T# i0 i* `

         (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()
    2 C+ f: c4 ^3 c5 b+ o8 \

    && args(str)”)
    1 S$ |$ C3 }8 X7 ]5 y% _

    2.直接引用匿名的pointcut
    9 a: W5 Y+ w- a2 I

         (1).@Around(“execution(
    # l3 Y7 \; ?0 R3 O7 _9 a: O) H

    * com.javakc.spring.schemaaop.Api.test1())”)  i$ ^8 [( j0 I* P' h

         (2).@Around(“execution(* L0 y$ I( G5 P7 l( F8 U& Y. e0 D6 _

    * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)3 X$ l/ d+ B# a7 z

    // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    % A, q) S6 Y1 [5 L6 C  L) p6 f: I

         @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    : }( b2 Z% }' Y4 C% L7 G; z

    public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{8 J. d( Q) \- `. c7 r2 W- ~1 y. c

        System.out.println(“around1==========before1pointcut==>”+str)' L5 ?3 P2 n( \2 ^9 b4 J5 D

            Object obj = prj.proceed();+ G. J3 z4 H  z, @- j9 ^

            System.out.println(“around1==========after1pointcut==>”+str);
    & C5 y0 O' l  X  ^0 E# N; m" Y

        }
    6 D- M: Q. e  ?; F0 t

    5.4.3.@Before) _. k. S3 u1 ~% X2 V

    注解@Before在执行目标对象的方法前追加相应的功能$ p/ J6 R  M. Y- {& z6 _! m' L+ `

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    + }. [) R5 Y4 C/ r7 ^, _

    (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    + {  S# ^6 H2 [+ f+ Q9 f* ^# \

    (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    6 r. ]& A, E# |, a) J

    注意args后的名称与参数名相同, V3 ?- F+ n/ v8 D  V

    2.直接引用匿名的pointcut
    6 T: V8 }1 Q( L9 v

    (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)3 p  Z8 r; O( c. c+ k* b5 n

    (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)( Z- O' e5 D* l0 j5 F0 h

    注意args后的名称与参数名相同( T4 a0 u! Q) W1 H) K3 J/ `

    // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    * V) S" |/ Z1 w

    @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    ! t1 b1 W7 `8 v+ R- z3 Z) L

    public void testBeforeParam(String str){
    7 t& D8 D4 E2 X6 ^" ~# b  X3 e

        System.out.println(“before1=param=>”+str);- H! r1 U9 P& g, g

    }; h; U7 A3 ?  H7 m* Q* |: X- T


    7 f! r3 u: o! G% r1 M

    5.4.4.@After2 V! ?1 D9 M+ r

    注解@After在执行目标对象的方法后追加相应的功能$ U, h8 `# @, U/ p8 q

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用+ K6 f. B! X9 v! U" V+ J

         (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)& h* y1 S7 c) ~6 \, `' o+ b

         2.直接引用匿名的pointcut
    $ r& m$ }: G0 ]3 d4 `

         (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)% u' ]- H5 E( }" K' E' c

    @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    : v* }3 f) S; t2 k/ Z" W

        public void testAfter(){
    8 b' K9 P  i" Y

        System.out.println(“after1== >pointcut”);
    ' \$ v7 v+ }7 E7 [% _  Y

        }
    & e4 `* X6 I+ C2 g6 e

    5.4.5.@AfterThorwing
    8 N+ [# G6 M) `1 o2 \


    % j; B& ]9 Z+ {2 W) @  N, z: a2 z4 `8 c' g/ e: W
    • 描述一下spring中BeanFactory和ApplicationContext的差别
      ( \! U+ A" H* R+ J. s. d3 s% {

      ( `" ]" n- b, T2 |+ f) b% |

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


    $ K/ j! x' V1 ?% X7 A
    • 谈谈spring对DAO的支持
      4 A0 F/ m# L/ c, t( f

      + k# a# E, H% ?4 [7 o# A: F

    Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。
    / G& t, Q/ v- W* F2 r+ b* g

    简化 DAO 组件的开发。- x' A; H- O) m- n% ~5 W6 z
    Spring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。* H" A) k5 o) q* m1 ^' }; W

    IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。. ~( m6 E) j# q: `$ _8 S% o, d

    面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。& c6 ], w6 j2 Y+ L9 n& s  g

    方便的事务管理: Spring的声明式事务管理力度是方法级。
    $ G2 _# C( i* T3 t; [

    异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。
    : n! _) w4 S: H3 M9 _


    ( j" _; t+ Q6 ^9 r) |' C
    ( C! h4 o9 o8 e$ i
    • 谈谈spring对hibernate的支持
      : X3 W. l, q4 f6 |* j5 M

      7 k: P3 j' S7 e* ^9 Q& V

    在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。9 k6 p' B$ x- k* @5 x

    一旦 Hibernate 处于 Spring 的管理下, Hibernate 所需要的基础资源,都由 Spring 提供注入。Hibernate 创建 SessionFactory 必需的 DataSource ,执行持久化必需的 Session 及持久层访问必需的事务控制等,这些原本必须通过代码控制的逻辑,都将由Spring 接管ataSource, SessionFactory, TransactionManager等,都将作为 Spring 容器中的 bean。将这些bean 放在配置文件中管理。
    7 m! s2 W" C5 u5 y9 `$ P% m

    1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:# Q- V6 h# j* L7 X  t: b" r

    / r$ d9 Y% u  c2 Y* F( ]9 ]

            class=“org.apache.commons.dbcp.BasicDataSource”>: p+ _) ?/ C- M( f! F

            ) U  z9 G$ i' g% S' c: Q

                oracle.jdbc.driver.OracleDriver6 K2 [& z3 Y4 j1 T& d

            ; {0 Q4 |0 r9 [( |) b( \

            
    ( T& J+ Z) G7 X

                jdbcracle:thinlocalhost:1521rcl- m& W# w" p* T+ Q. |  X* ^# L

            8 \; E0 L. {: f. ]

            
    / q* M: |, p5 H- a1 w+ u; z

                javakc2
    $ G3 P, n! d% N1 c3 P

            + g: ^# R, P# m% o7 |9 S

            2 ~9 ~( |6 h  U% j( f! c

                javakc2
    9 \# B9 i; K" \7 m6 f2 W% u

            7 t2 V* W+ P, p5 G

       
    2 b5 s0 d- n% K


    ! ~% Z1 u# J7 g  }) Y

       

            class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>" H, u5 o& z! z& V$ Q

            # [( e2 C) v" V' ~

            4 y% |6 J0 S4 |# L! F

                
    ' E8 X/ x3 c  I, T* g/ I

                    com/javakc/spring/h3/UserModel.hbm.xml# L- e4 m' I/ c! K0 _

                0 @, R( o9 `" I3 `

            # c0 ?% Q" G$ k+ k; f% A

            ! o% F- n# J+ Y- E  t

                - v- ?+ o& B5 y& w( `1 G0 V

                    hibernate.dialect=org.hibernate.dialect.OracleDialect1 h0 j3 i$ s( |! J

                
    . \: _, R& |  Z7 X

              f9 U8 V) ]: T/ \, H

       
    : K1 W8 L5 S' ?7 d* l8 {

        4 l2 C0 Q, S6 Q/ r4 J. u

            
    2 s# g3 G$ ~: x; l& e1 t* g8 z

       
    ! P( X) U! O# h4 c1 W# X

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

       

            class=“org.springframework.jndi.JndiObjectFactoryBean”>* M; a3 \1 P% j: ]' _2 o

            
    3 _2 F7 U  ~4 h2 M

                java:comp/env/jdbc/myds
    - c; V5 I# ~. I* b+ t0 p

            
    8 V" Y% {. L( Z/ O% W4 j# g* n

       

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

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

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

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

       
    9 D  d: ^( T' W; O4 U& U

            
    6 F5 ~9 G8 }+ H1 }* `

       
    $ b: a6 b$ U3 }) v- Q

    ; J: e/ A3 R, E! w8 E

        % r2 w. {% \# P' b  [

            
    3 c/ h: K0 h2 {9 b0 W! n

                  P  J' o1 b0 m+ |& w

            3 r7 f2 ]2 i( j% o  Z

       
    1 [. W4 L' r: F+ m6 T

    * a9 P- o# K7 i8 q1 H

       
    ! a) C, V5 m4 b- F7 L$ w" r7 u

            
    ( Y# F2 h/ f: y$ m% i5 x

            
    2 e  S/ U; k: g2 C& z

       
    8 b0 b; s8 ^' ^

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


    & V0 Q; e# Q* o5 @
    Spring2.0之前事务的写法0 C6 p0 W3 n/ b3 d. h# p

    ) i1 u, m$ l; t
    2 b7 _) S( W; Y9 G' @. G        class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”
    ) R4 @+ c9 w0 U1 t$ y$ z  F

    % A& H3 J; h7 y: `0 S        abstract=”true”>
    2 c  V# n, W# J8 C) j3 [

    / P: W" n& N5 c4 |: a
    9 ^5 [0 `4 I& ]7 }2 w
    & Q  u, N5 T- z( w+ F
      @8 W! s4 V! ^( r( ]. u' Y                PROPAGATION_REQUIRED,readOnly; d( }$ v% b8 Y% p( n( U7 q
    ( ?( c0 Q% z4 `. P
                    PROPAGATION_REQUIRED
    , W% f; @: r5 t* |. O' e- C

    ; H: `7 P, a% k+ k
    : }' ?2 {# o$ W% v, m4 ]* e- i& `+ u, O& H* l3 d
    ( x5 S3 f  G+ N4 W9 j8 J  c
    8 \% A) I, C: W3 ]
    + i8 S9 ?. r; @# v
    • 谈谈Spring对事务的支持
      + K8 x" h. k: B

      9 {8 {" B; B. z/ Y

    - l$ N3 K4 F% t) T1 @3 f) A  I! {
    1、声明式事务管理:

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

    2.做法:

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

    2.2

    2.3 注入数据源


    + w" g  w# {. U2 R0 ?5 K" H
    ' X0 B% y3 t3 e, z+ U6 V  n" f* c- o# }/ {0 X' f

    2 {" [* T& z, C4 ?4 B* S6 q# M, `7 [! Y3 J9 _

    0 C2 ^  e; m) |# O5 Q/ M$ M

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


    - G/ _+ o* Q2 L
    & h8 e. Z6 e5 Z9 s
    $ w, _, }+ z' }5 y3 |

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

      m, s! }" j9 P7 ]
    6 N% [# L6 I! G3 g6 Q9 k' |" ]
    0 A. e- ~" V) {- Y  }, d1 m

    # H/ v( ^  {* t8 o, |
    ; w" s+ q/ y3 o

    2.6 定义切入点


    ) W/ C! J0 ]) n7 x  Y' w$ @
    : `  u2 J4 C- [, ~
    1 y7 W, V) _; ^% t' j* D. u+ z# D3 ~. C0 V" \( D6 v& ~5 f

    . Q% S% q8 N3 R3 l  K/ y$ i$ r

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

    1.注解@Transcational

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

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

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


    5 U& G) }" P! M
    3 R* g+ K3 j% N( C: w4 B

    如何在Spring中使用Hibernate的事务:& _0 `- R" M+ C& ]

    $ Y: N7 K1 x( D( m


      a2 {4 t, y* v' C) a3 l) \

    ; W) i$ c* j  {" n- O& k+ Q

    如何在Spring中使用JTA的事务:
    - L9 I! y: m1 F7 C: K7 n. ?- Z


    " u! \- j% w3 a' R2 U; L
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    17#
    发表于 2014-12-03 12:48:32 |只看该作者
    事务. G. U: Z+ [0 F  G, m6 n
    ACID
    3 v7 u) A, m3 x8 C- _0 @(1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失败
    . `9 r) j2 H- [' A& i4 n
    # _( J4 y' J& S. e(2)一致性 :操作的前后满足同样的规则,保持平衡。' V5 D& t% a: X

    ) l, j/ F1 b. o  u- D(3)隔离性 :在事务运行的过程中。事务内的数据对外的可见性和可操作性(必需由数据库的支持)
    0 x) c( F, B$ Q1 a; u2 s& K4 W' R- m4 r6 O
    (4)稳定性 :保证数据在事务的操作的过程中不会遭到破坏,而且是永久性存储的0 O6 t4 j' \; T5 J; V" T' s0 c' f0 i
    $ |5 U9 V& z8 {0 @) i

    ' Y# `3 g3 h8 Z' h1 P. t: G4 l! B' w6 }+ t5 e/ m" O
    事务模型0 I! T! o# D3 M+ P3 |$ u
    (1)经典事务模型又叫平面事务模型(JDBC) 事务不允许嵌套+ S' m% y) J& x+ w& V) x( t5 l

    * _5 E, Q' o8 r; c6 b(2)嵌套事务模型' ?( h( b/ U& d" y/ g. v
    9 j1 Y1 D/ R: d% |

    $ W/ R5 d3 j& J0 x8 s2 ~( _) ]  H- g; j8 x' K+ X
    事务的两种方式
    : U1 u2 A# H2 }' w. Y$ N' _(1)声明式
    0 C3 ~. B3 }0 w# p3 y( `! U
    ( f5 P  V9 i& y" `, R/ i在配置文件中设置以下6项3 `6 f: Y, R  A' ?- R. R" ?
    & D3 h9 h% F6 Q9 Z3 _
    (1).required6 X8 I- z7 }! m- S( n* R
    " e4 `% ~& \' v6 n' ]
    如果客户端没有事务 在bean中新起一个事务. r0 [& X" g& O

    ( T) }  u3 H0 g6 D) N1 j) `+ `如果客户端有事务bean 中就加进去
    8 a5 J7 G: C9 v& z5 Z# }
    5 w/ W' M, s; S; w2 Q(2)、 requiresNew+ y7 i* R* {4 [' h  _

    9 g/ X. ^4 r) O8 M5 w; }不管客户端有没有事务服务器段都新起一个事务
    - _. I: Y$ d0 H; r! N3 ]0 t+ z- i3 f' M1 w( [, d$ D
    如果客户端有事务就将事务挂起2 X) j/ W* J0 [0 x; d: p
    4 f/ ~$ ^( }/ ]
    (3)、supports
    3 z3 j" O7 f+ S- T: j1 y4 M  t0 |8 B4 n+ \; j$ `# t
    如果客户端没有事务服务端也没有事务) l- N: }+ ?8 T- @1 E- |: G

    ; w' P2 ]: |4 r% V如果客户端有事务服务端就加一个事务
    ! ^! k8 n* O/ q) H/ d! `9 e" i$ f6 N% G7 A9 D
    (4)、mandatcry
    * G1 C3 K& E* O( y& \* r* a' Z* w5 Q0 q
    如果客户端没有事务服务端就会报错  n& h3 |7 d$ x% x4 i- w
    + y* l' k! a# d  a5 u
    如果客户端有事务服务端就加事务
    # {- w4 T7 @3 b- Y8 ]. b- }
    2 v& e8 W/ X' C" B4 H(5)、notSupported, d7 x, e; ]" `6 d: z

    8 v) E4 h: ~8 d" W( r! X% ^不管客户端有没有事务服务端都没有事务; P/ u- m- T" y  O1 q

    : i3 h, M! ~. N" c- `' E$ S如果客户端有事务服务端就挂起% w' s( u, q  Y" w# S
    : O. `+ `8 P, Y- @: a  @& a1 {* v
    (6)、never
    ! @; q2 w3 @0 A
    4 u6 g4 c* o3 O9 U" `- l6 B不管客户端有没有事务服务端都没有事务# S8 K6 b4 B7 x! _
    / d3 T) A9 }# t2 N
    如果客户端有事务就报错+ ?5 @2 N& `& T; I$ m. E! x

      K. V2 y6 u+ e/ S8 @- Y7 h(2)编程式事务6 b1 ?9 N* L  |, R
    & e* a  B' U# P% D( K0 S) |  g3 r
    Javax.transaction.UserTranscation3 N" u: N9 T! d- F2 P4 W" u
    : D: C; `+ z( F8 A
    JTA 事务可以精确到事务的开始和结束8 Z, Q  ?) ~0 [' d& G( u9 l+ w

    ! ~/ ~; ~  F( T3 t2 N% w
    ' J% y) e6 ]7 }0 ?# [5 E7 x; C
    5 J& F. q3 `* b8 t事务的隔离性
    0 h/ |3 ?4 v4 oRead-uncommited7 O& Y5 L( i, s& n# a
    + i# x3 g( u5 \/ U3 V
    读取未提交的数据(基本上没有锁)脏读,存在不当读取的问题。* O$ A4 t- K' @
    " S7 ^/ w! Q0 D4 f5 W1 T
    Read-commited# u$ m7 B) @$ G* W
    2 ]7 |+ O, @& O" n
    读取已提交的数据(行级锁)$ T3 ^7 C; ?+ I+ g$ X4 k

    1 D% D9 @. ]! N$ k9 }) }无法读取已经写入,但没有被提交的数据。
    8 O8 S" h1 ^$ m8 f- b! r( a: |7 o5 X0 Q( `0 \% J& H
    Repeatable_read2 F# q/ d* v: |) s0 X

    8 l7 |" V' p8 i; y3 n( T8 w读取的数据不允许修改或删除
    6 S/ e. I, |. H; ]
    * N6 Q: l' f3 Q+ D不可重复读(行级锁+不允许修改/删除)) `0 w4 o, @  F  {8 n8 C% f/ i

    . E+ t- T: w7 T  ZSerializable. ~& X  ]( P* X& l4 V

    ( S$ p" F* {+ d幻影读(表级锁)" \% ^# s1 i' r0 r3 t/ k1 [

    7 z4 t: ]. h/ u1 l! U% T ' f- t0 h7 Z* S) x; t1 E: O
    0 b5 v4 D& Q8 q1 j4 o% l
    struts1 O, c' {% ]2 ~% ^& h; C
    开发流程
    3 L- z' b  q4 k3 d0 z8 [, q# E0 ?7 Q6 z6 Y
    1、创建表单) F+ A; p) P6 g4 S* E
    + f; {+ a' a* L4 u  v  c8 t
    2、从表单中获得输入* R+ Y. m' G' b3 S$ b' g( z
    * S' \: i+ x1 I2 b
    3、处理输入(业务逻辑)2 R# Y7 ~7 d! m+ X* L
    2 R/ M5 E8 m! _
    4、根据动态输入改变输入流4 e$ q! Q- @. g3 G; b  k

    & @2 W; _% v  i' e4 q( t( G) X要完成上述四步,我们需要创建2 G+ R+ `7 R  ]; F( ^, ~' [

    ' z4 f- g+ i6 F% e- v7 Z! c0 K1、一个ActionForm
    6 C" k  D7 u1 W, ~" W. |* r1 j) d/ l. e9 }3 `
    2、一个action
    " S9 U! N" e4 K1 w" B* L3 H. t/ Q* X* Z6 Z) ^7 R
    3、一个配置文件struts-config.xml
    8 O) \/ J+ X. t4 H3 W' ]6 f) \- S# h0 [% F' k+ `3 e- |0 o4 n9 |
    4、创建页面5 Z' t- g+ [7 A; L
    # z, y. d& E1 y" @( l+ N
    创建ActionForm
    ( W; {  k0 B9 e& O2 P# n. @
    7 ^1 \3 N2 ^  N' U- W1、写一个类继承ActionForm8 X- G1 Q0 X) b7 O; d2 l+ R7 H8 S
    9 X' b" f* w7 L( q7 h# _! i+ \
    2、私有的属性
    ! z+ v# i+ f5 ~2 |9 ^. \: ]. Q  \1 \
    3、相应的get、set方法
    . W* l" n, f: c6 j+ y5 K4 ]6 ^+ V% Y( S. k6 c* \7 `, }; \
    4、重写tostring、equals、hashcode三个方法
    / |! r' H* Q/ N: z0 [
    ! {7 ^. D- v# y" I: n* s创建action
    ; v& J( `+ y1 s+ E& J/ H: K, A" N/ p
    1、写一个类继承Action
    % \, J+ |0 u2 ]5 S7 C& ^4 d1 X4 N5 d+ U, X  B" b+ i
    2、实现一个公有的方法(回调方法)0 Q5 j0 e3 L7 y4 g$ x0 t; V
    9 S) W4 k( Q* _' b* o, Q
    public ActionForward execute(ActionMapping mapping,0 f+ X+ p5 Y9 @$ t' d
    / S  }' r. k6 T; `
    ActionForm form,
      Q5 c; W0 |# v; _
    4 G5 i  r; P) sHttpServletRequest request,
    9 _3 W! Q6 W+ N6 P  g$ E" R: k9 W7 ~8 q0 Y
    HttpServletResponse response)
    ' c2 b/ Q) T6 g2 R. j2 J; m8 b" n( H. X. J
    {- ^. x0 ?5 @: u( Y
      P) X3 K& T' f
    //1.收集参数
    % [+ B1 G5 K4 b+ l, Q$ d
      j& z1 l  q; J1 s9 p. HMyActionForm myForm = (MyActionForm)form;
    # Q+ r- W+ G/ Q& v: W
      G0 q1 b. h9 Y6 G- ~, x//2.组织参数
    ' Y( y7 ]6 c( q* U' w3 h4 |: M
    2 S/ S. [! ]) w' g# f5 ?, N+ K/ I * K4 g/ X2 A) f' P
    - g) u( ]  D7 I" |# j6 S
    //3.调用逻辑层
    ) [! w. I' |; t7 t
    , w; U/ V' s8 o5 c; _1 @& T% z; hboolean flag = true;
    & Y; @0 S1 A; J) Z8 K! {
      H. y( i, @; O7 ?2 H! C//4.根据返回值来跳转到相应的页面
    + j; g. p2 _: `/ t1 [: {- n; \! ~4 a0 t
    # [: L+ M- X6 l3 G. l0 rActionForward af = new ActionForward();0 u% B/ z8 J8 ^, q6 E* m; X

    * Q8 p. X9 P4 G7 zif(flag){
    : [4 F  o2 f6 k0 }( N9 A, S) U- G$ k0 n8 t' x6 ~
    af = mapping.findForward(“1″);7 Q+ S# J  G+ V) U$ m  e
    ( P: ~* h: |: X1 s) Y! v9 w! F
    }else{6 U0 F$ Z: T& r" W

    , ]$ ~* F" w( K  ^$ oaf = mapping.findForward(“2″);
    ) v% X6 o0 |0 k; }4 U) {% _& z0 ]8 P/ o: B. Q
    }
    & t& |6 W0 y6 f# }, B
    ! [3 ]( t/ P/ y' r+ L! ^return af;
    ' e2 V' v+ M# z" X' i1 q$ }5 Z% V! O4 t. d! P# i$ n1 ?
    }
    ' H+ h: O5 r0 t, o; P: p
    0 J0 v. O: N) f3 T8 m" a. Y/ T6 j配置struts-config.xml文件+ @' }. E- l# ?! N

    + P! Z0 @3 f4 _6 }1 M. ?1.<form-beans>5 ]2 R+ X' J# Y5 H, e8 T& ?
    # F0 Y; D2 |3 n/ _+ k) X2 K1 O! I
    <form-bean name=”myActionForm” type=”全路径.MyActionForm”/>& U3 R% C' K3 Y" [4 l& f; E
    / N; \4 F6 x& n* L3 z
    <form-bean />) X& f. H4 Y2 }' O: ~" a: W& Y

    - e9 Q& E* j# b: x</form-beans>
    " P' h+ Y3 S3 [7 U$ ]
    " k+ l* T$ L/ z2.<action-mappings>+ n' A4 Q' \: u. N6 r
    3 ]: N" `* R" `8 w( j9 ]
    <action path=”/sll”
    & _; y8 x+ C3 G, e* T. X
    ( x6 N" E) D% c* `3 Q& Q1 Dname=”myActionForm”0 I* w$ z8 B; f, s
    6 J+ d, R; O4 r
    type=”全路径.MyAction”5 V" _7 g6 o& ]# c
    4 ^0 A7 B2 m0 A4 b+ w7 \
    scope=”session”) t' V/ `+ B5 K3 `9 P/ H

    0 h* W: p' V" Einput=”错误返回的页面”>
    ' C( O2 P8 P( J9 e* h# Q% U
    / \' S! `% l6 d4 r  d/ W' Z<forward name=”1″ path=”/1.jsp”>
    / Z4 H. r& a. o% B" H3 g6 O5 h3 A& `3 u
    <forward name=”2″ path=”/2.jsp”>  L: y$ W" m) {8 k3 t7 Y1 a
    2 V% A* ?2 K7 N( ?; Y  S: k
    </action>
    8 F3 S9 v" Y) V- t4 p4 ^* `, Q0 I) C  Y/ N0 d" e4 m( w5 D$ c
    </action-mappings>" K" Q, @* N0 q; ~

    * B8 i* |7 y: B% e0 R步骤:
    ; O5 @% v2 @# y3 S( ^  K) C
    " N9 z0 Y- I) v# \/ X7 n1.创建一个空的web应用/ C3 L# O+ j3 K8 k: n3 y

    5 g# q+ t0 Z. A4 }+ P! c2.将struts的包放到lib文件夹下
    ) v4 R9 r* h' p, f6 z2 U& y; e
    " I; P2 F- N0 ], r3.将.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目录下" Z1 |9 W" D. _& s

    : I" |6 v" r+ x# t/ G4.配置struts-config.xml文件和web.xml文件
    % v& e# D/ G3 }9 W8 T7 ?( Z7 _8 M& o8 P: x3 f; `$ B# z$ K
    5.在页面引入tag文件uri/ g! c' S' }% X. N- R. }. g
    3 S# d2 \6 `. r" K  z* x! }2 O+ G+ w
    STRUTS运行机制
    + j6 u& }! E" w% a( w+ v1 w0 Y% Q0 Y! U
    1、界面点击产生请求
    + k" w- {% ]6 m4 Z; ~) a
    # h4 T' R- B; u3 `4 x, ~* N3 L! ?4 W2、容器接到请求
    6 M) T% ^* ?: W* }+ z
    9 d' p# m! N- O) c3、匹配web.xml文件中的*.do来调用ActionServlet# _6 D$ m1 p3 R4 D. n

    5 \8 h! e+ M9 r. K. d: p" f1 s4、ActionServlet的处理6 ^8 w* A5 G4 {" g: R) L% ^

    6 t. l' {* O: s  I9 ]/ [- a4.1 读struts-congfig.xml文件形成ActionMapping$ a/ w  E. X. f# e' Y+ d
    - p, p! R& I7 G! O: O# {
    4.2 通过path 来匹配Action类,通过Action的name属性来匹配ActionForm类
    : X% o/ m5 i5 e0 N; T1 X7 \3 i! f9 X/ ]* [. K( `5 r% o
    4.3 通过反射机制来给Form添数据- t* Q8 o; q, {8 G4 v3 Q+ z7 H
    6 D/ M( J* D. y8 M, Z  g
    4.4 由ActionServlet转调Action的execute方法# v+ x1 i5 n: a. d2 y# f8 Z7 f1 `# N
    ( }; S( b1 z5 [; y0 [6 D) O) g3 P4 U. b
    4.5 得到execute方法的返回值,跳转页面
    * p. K8 z9 r+ ^" U0 `
    7 b) W  @; @' D. Z+ R. L4.5.1 RequestDispatcher7 W& i+ a( t4 ?' E

    3 U2 Z; `) H) P2 J  y7 [7 W' d7 o4.5.2 response.sendRedirect(“list.jsp”);
    % _' @! H( m) Q7 z5 S/ E3 d- D% X9 R
    + s# G: J* Y' K; A2 P! q; U+ n
    9 [7 S0 l* v! @" ]$ l) c0 b9 q, T/ i$ ^
    进入execute方法! h4 O. O( U: j# m- ^# W

    & ?9 R# z- ~+ _. x1 收集参数" Q# `3 O9 s3 v
    ( f0 W6 R5 x! B( b* w! j9 R
    2 组织参数( X1 C# x5 _3 }

    1 ?5 j. a- `: @( U9 G3 调用,逻辑层2 {% ^$ ^. w- N( U# w/ R3 n3 F
    : i2 g0 k" @  e/ M6 ^
    4 返回值
    3 G& ]' B* ^: x) q. M7 \/ n; F& g2 X' T, o! L" s3 e# `+ ]6 z
    4.1 选择下一个页面 (ActionForward)0 K5 Z0 z% n# H# h  ^' j
    ( l' r5 A. q' b8 T# {( \: ~( `
    4.2 把值传给下一个页面/ v# S) P  [0 W7 T* z

    % f- z5 z) U/ }0 ^- }: F$ s7 _ 7 u" }. q$ |+ Y

    ! ?: R, S2 i! \  Q  p比较struts和struts2的不同& p9 C4 u2 R3 _5 D+ z
    : n' p- [, R6 g' H+ r% U& j0 a8 y
    Struts- A: e7 e) d2 K/ p5 ^6 l

    1 x7 f! x4 c' X" YStruts2
    + @& y  w( Z6 q
    % E) W" r. X8 |. K# u. K, O- ^$ |组成        五个部分:ActionServlet,ActionMapping,AtcionForward,ActionForm,Action        十个部分:AcionContext,FilterDispatcher,ActionMapper,ActionProxy,Configuration Manager,Action Invocation,Interceptot,Action,Result,Taglib
    " ]# D$ ]2 O7 Q% K/ ~  q0 Lurl        .do        .action
    2 A6 U( u) O0 e2 H8 H# @7 @分发控制        AtcionServlet        FilterDispatcher
    6 q" S: I9 _+ t  j) F- ?- o9 N; ^. s收集参数        利用JavaBean技术,将数据封装到ActionForm的子类中;
    ; T9 k: Q( ]( D" j7 X一个Action对应一个ActionForm的子类- p2 h% V# ~3 P  q3 [
    ' s2 j9 _, [6 y
    使用拦截器将数据封装到值栈中。& u: @& e! u9 N
    使用域模型,一个Action对应多个值栈中的Model
    , t2 O8 E  q+ c7 S4 N4 L4 ?
    3 V' t$ ^: k. }. x( |# l读取配置文件        ActionMapping        Configuration Manager7 {3 d* i+ K0 x7 W$ N
    拦截器        无拦截器        执行Action前后有拦截器# s8 J* A8 m5 j4 p, z
    返回页面        将字符串封装到AtcionForward,进行跳转页面        Action中直接返回字符串,通过Result跳转页面' I3 K( K; ?2 p( U% f0 z$ h
    页面跳转方式        两种:dispatch,redirect        三种:dispatch,redirect,chain; V9 z1 D' V+ [. N
    值栈        无值栈,Action通过在request范围内设置属性,向jsp页面传递数据        有值栈,Action和jsp页面通过值栈传递数据,jsp页面通过OGNL取得值栈中的数据4 v0 _0 T# U3 v6 L/ ~+ P* f4 W( Y
    配置文件        struts-config.xml        struts.xml+ ^; S4 u0 g( ~( Y+ o. c# j- Y
    中文问题        不能解决(需要使用filter)        可以解决中文问题:
    # G: R5 d3 I: M1 ?7 ?$ Z  N1、在jsp页面添加Meta;
    5 Q. ?) e0 I9 ~/ K; s/ p
    ( z' J# E" z. `: H1 M2 Y2、修改struts.properties中的设置。
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    18#
    发表于 2014-12-03 12:49:03 |只看该作者
    其他开发工具和技术3 C0 U2 J; X' D% s( z1 t
    Ant
    7 u# W) C3 b% x; S! [Ant是基于java的批处理工具1 L  L/ Z, M5 J/ p2 j! _5 q

    % j+ M% g7 X5 C+ C0 P9 ]一、配置ant的运行环境0 }( B. I$ j; D6 L% f# @. l4 T5 }

      \, F; |5 j, F; E1.将ant的bin目录添加到path中
    # F4 f# L* ?/ W, d! R  j6 |6 e# c  U+ A! ]9 E7 H$ d# E
    2.配置JAVA_HOME
    ( U  M, x& Q8 m7 S% G# V5 y( ^* Q5 P8 Y
    3.配置ANT_HOME. n5 V: _- V, ?) T1 R% p% `4 s! e
    . q3 ~# W; H; w& _' b8 `
    二、配制build.xml文件,该文件放在应用程序的根目录下7 ^* i$ Z2 V* X* s8 W

    5 {1 \& t) O' g编译java文件
    1 I7 h9 A4 b( {( F; a+ |7 @. j; h) J& N
    & l. T7 |6 J8 k$ J* W2 K  S& D执行java文件
    6 X+ g+ Q+ _/ x. `: M; y- }) m9 I, b
    copy( i- W$ ~+ g& b0 c! d- o/ T
    * P" o4 z5 W" r9 Z
    删除1 N7 c; e& z4 r- z

    # b2 Q. z6 c5 Q) v* a8 v打jar包
    , [2 }7 `6 d) [7 }' A8 L: U6 s1 i  C7 z/ U2 g0 I$ e7 O! @9 F2 y8 N. j
    根据注解生成配置文件" z% t6 N6 Y9 u) |. s! M
    $ Y$ o" X/ L) r& e# @
    Xdoclet
    , m. L" |2 K1 ?# f! j; Z" Z通过注释生成一系列文件的工具(txt、xml、java、html等)( P/ {' ?4 r. X7 {3 _

    % ]9 u5 g& g% b  F0 hxdoclet本质是摸板技术+字符串的替换
    . [7 R0 H2 _  Z5 O# @' k
    5 C+ l+ v" f9 R+ O. r1.在java文件中写符合要求的注释(将hbm.xml文件的内容搬到java文件中去写)2 {1 B" N" G, Y; F2 @# u1 k3 D

    ; m) o1 C8 j4 X; N0 w4 A1.1 在类的上面 写与表的对应0 z7 x' t, H6 q
    $ z- N8 r8 }8 Z6 Y& h9 ~# n- C2 e( X# d
    1.2 将每一个属性的注释都写到get方法的上面  y5 m& S# E( a! q
    ! d. u  H7 ]7 L/ ]8 w3 B' {
    2.在ant中引入相应的task来驱动xdoclet
    1 ?" ^/ G2 B. @$ x6 r5 K0 s3 a; d& S7 Q

    , N# K  _  y( s! T0 A- O5 ~0 \, c' P% f; [( D; u
    log4j日志管理& ?8 u. g: `4 C- X
    1、是什么?
    9 ~$ Q2 Z, o8 B# Z) V- [0 a) P* G: ^
    在开发期间用来测试、对整个日志信息进行管理的工具8 b) i! c" T5 `: S3 C+ @7 T

    % j& T0 ?+ d" Y  _# w2、功能
    : k- F% F# p- l, |* P) x, l
    / d! w! V' @; t, |1.控制输出的目的地
    9 \2 r! X5 B2 f% Q6 r+ N0 G9 @; d  \' {) x1 W1 e, z3 Y5 n+ {
    2. 控制输出的格式
    2 M0 ?9 B$ D( M1 `& M$ q: S0 L9 [8 u% |) U- C+ R9 s! J2 A3 j" ]
    3. 控制输出的级别) d3 o* |8 h) H; Z, ~2 m

    / Z1 O2 w' c1 y* G' o3、日志的级别
    , v3 Y- d, t" s: _) G( r" s3 {
    ) ~+ O! k' l- X1. debug 调试
    3 m8 P& N( z4 T+ w3 |, ]0 ]
    # U+ l8 a, z6 }* a) z2. info 给用户的提示信息2 B: p, M5 f( k# X% E$ M( F

    ) {1 [) B& P9 ^7 r3. warn 给用户的警告信息
    " _( k0 B( \5 o& L# G( t# ?) |+ e! x, k7 t3 `# Y: }
    4.error 给程序员用来调试
    ( |) d2 H% H( x' V
    , V3 m  I& K! r3 o& XDebug—-〉info—-〉warn——–〉error
    ; u$ i; O  [+ ]5 g
    5 A2 F9 y% k0 E8 x4、配置
    4 C. x3 V# j; B/ r3 C6 P5 V+ l/ R& ?$ W% ?/ G$ p( L
    1.配置级别
    4 b7 x' s7 P3 X2 w- A  T  s
    . c+ Y. A0 }5 C2 c2.输入源 (控制台和文件)& E' B/ N7 r. u& Z: ^( I, U. K
    ; L5 F  k9 F5 c/ g- H
    3.可以进行分包控制
    0 N& L. ]8 `  _- n. A
    1 A7 P* D+ F* |  C9 @' uLog4f.logger.包结构 = 级别: P. V2 y. d) M# V- o# v5 J) o
    * l0 n. W: e3 S! K% P
    5、使用% [  Z- g8 ~" Q3 v/ p. [& I

      e: U% A3 x( tLogger log=Logger.getLogger(Test.class);
    * X  g- N6 J* @
    ! s! L  r  t; W    public
    : _3 Q3 f$ H& Y# h8 evoid t3(){9 _8 J1 R8 f/ A, u; P$ S; C  W

    : w. p2 ]9 W( d3 C, p        log.debug(“this is debug”);
    6 N* ?& k4 k- \4 G. \5 m( C# `3 x7 n& W5 e
            log.info(“this is info”);
    ( {1 ^$ s0 d( `
    * @' c% N, M4 a6 r$ R* z5 \        log.warn(“this is warn “);; p5 d0 q" g( V$ v+ z

    % P* l/ R0 ?; c2 _- M        log.error(“this is error”);. r6 o+ E& e' v# H% \* m+ r

    % [2 a% w; K% D1 _    }
    0 s, w. M) v+ o2 I( P1 P: E5 ^: B) J- L
    Junit
    ( W6 o; f# i% e8 n: Q' F5 s$ J1.是什么?/ \1 c( I+ z) O, a/ d1 x2 @0 U

    - N, v' J5 a. c, k- u4 z2 u单元测试的框架, d0 J# @9 W# M! ]5 a  Z$ K
    ; }  a- X* }8 R9 }
    2.怎么做?' E& u4 G: U2 E
    : O4 W. S* x- X: j1 r( e
    写一个类继承TestCase1 m, w: J  d1 K4 e4 W
    $ S1 d1 P4 s  b9 k2 t
    测试的方法一般都以test开头并且没有参数' i. P; t8 r1 P- V$ k

    / h6 x9 b# r7 m; x# x. N在测试方法前执行的方法public void setUp( )
    : p3 T6 z6 Z/ K0 x. Z$ m
    2 k) \; Y: X! p- K6 h; [( u在测试方法后执行的方法public void tearDown( )3 i4 P4 ?- ?$ ^5 o+ ]+ k

    3 Y2 }, {1 g6 A0 z! rerror和故障的区别
    1 {* @* m+ r& P/ U) k5 H/ e$ M& |& `" j2 R6 u2 e3 k8 V
    error :代码有问题! O7 w; e; ?4 |- S( ^

    & o3 `! k) z" ?- g0 n故障 :逻辑有问题与祈望的值不相符合9 L0 p- L+ z9 B, I; _6 f' q5 {" A

    ' a& v5 s, |; q! v: @" j4 z3 B6 `生命周期& `/ A8 V$ q0 ~

    % [, v8 Z8 Z. o/ p2 x% h- m测试—〉SetUp()—〉testXX()—〉tearDown()—〉结束;2 d, I) S  y0 `8 `0 L
    * b$ t3 O. q8 _, D, I
    TestCase套件
    9 x7 W6 J" Q4 C7 p1 c
    1 W9 c% s2 F; t. k4 V3 ~public class MyTest{
      V# @% Q1 F$ k: _5 n8 F2 N$ R
    + w3 v2 i, w; F; o        Public static Test suite(){1 w  t# F* o& ^3 d* A
    " F5 F2 ^- |5 E' q/ Q1 z
    TestSuite suite = new TestSuite();
    / S8 d0 N1 @, l4 u" a; `7 W4 u% M3 K/ u
    suite.addTestCase(Test1.class);
    # D- G# M# [3 j5 s; f+ D" W2 x7 G& m0 t  l! d4 Z& t
    suite.addTestCase(Test2.class);
    # T8 |3 a1 i2 p6 H2 f0 m1 d8 p# e' O0 `
    }4 w0 J5 z2 z' v& A; Q) N  V
    - \6 i0 P0 T# d# _
    }+ r( v- |, o& i2 _5 f" H7 U" |

    ) j7 ^# b, k0 A ( m8 G, e6 |( z# b% O4 q# \
    + q7 V4 V" |/ r* h7 P
    Ajax
    - @' o) W# F5 ]& b& f- @: w* `是什么?3 k% s; z7 U7 N1 ?9 n) h6 w3 u
    AJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。是一种创建交互式网页应用的网页开发技术。4 W0 y( U/ N0 h. B1 D
    : U" o; Z, W1 A/ u1 ?- @
    无刷新页面。6 `$ L, o  Y4 ^" z3 O, Y/ f& T

    9 @) a- q" W' _# `7 L有什么?
    ) ^. F0 J- n, b" h* AAJAX是多种技术的综合,包括JavaScript、XHTML和CSS、DOM、XML 和 XSLT、XMLHttpRequest。: W6 a1 o; ?5 m" F
    ) o! n. [1 w& |0 _: a
    能干什么?" O+ s' M$ G2 y7 L, ]
    使用XHTML+CSS标准化呈现;+ f) D# ~2 [' I8 E% a# H4 q/ [
    使用DOM进行动态显示及交互;. E# U. a/ [/ Q
    使用 XML 和 XSLT 进行数据交换及相关操作;
    ! ]7 u1 z" R1 z- W8 u8 D使用 XMLHttpRequest 进行异步数据查询、检索;
    ! [/ ^, O4 o" H. Y使用JavaScript绑定和处理有所得数据;' b7 V$ ~) z( H' J) Y+ W9 h
    ' h5 n( F# f" B8 n% y* H5 r
    传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。
    & c3 ^' W( N9 X  l9 K7 L& l' T/ H
    ) e8 v) T, K0 b* w4 n. ^与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。% r2 z0 b1 u1 Q" m
      j$ r/ C9 U4 x1 f  L
    使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。4 h8 B* I% {$ ?' t$ E

    & ]5 V! M  ~; D* \/ v对应用Ajax最主要的批评就是:
    " d- q0 C" s# m- k9 ?: N0 N& q0 c1 它破坏了浏览器后退按钮的正常行为,就是用户点击后退按钮后不能看到之前的数据;
    ; ]! E6 n+ E8 h0 w& M7 ?2 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;
    & e! c/ h$ E) ], A, m3 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;
    ' r# j  {8 C# {; @! }7 K) r4 Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;8 ^# C& V8 ^3 M' w" H( v
    6 A! w- M5 p( W
    怎么做?
    ; h  v$ G' }/ Q' @' i: L# B<script language=”javascript”>
    7 H# R9 U. {: E. s5 }! w# i! O' n& n3 M- w  C1 I
    var req;6 U6 G1 F% G! L4 L4 O

    # ~1 r6 R, u" Q8 e4 Kfunction add(){
    5 H+ h, L* q5 d0 C3 I8 h# z
    ' \$ o1 `3 Y9 x! |. [2 G//1:创建用于传输的对象( \! ^8 d% W! \
    ' P1 t4 {1 ~( Z+ B3 v1 U
    req=new ActiveXObject(“Microsoft.XMLHTTP”);4 U" P5 E/ Q. d; x' h6 E
    6 {! K+ K3 A# B2 i
    // 声明返回后,处理数据的方法
    ! [1 p& @- B0 T' o& ^4 J3 C0 {8 r8 }0 a" m& b/ K! O# _
    req.onreadystatechange=manage;! \& y8 v9 |6 j8 x7 p

    * h2 U! }) _$ W9 G//2:准备传输的内容
    ) d# ~, a* }# y7 f2 P- h+ j8 q2 g6 ^9 a. r4 Q6 n( v+ v
    var str=”test1111″;6 C% a  e* u- g! a

    & A9 ]7 n; p" v& P! k5 p3 w( T//3:发出请求
    8 Y0 z- e9 l0 u, z9 J! y$ l0 u! o% C. ^6 u
    req.open(“GET” ,”/others/ajax/test/t2.jsp?str=”+str);
    ; H7 _; i2 b$ Z& Q  B. L, T3 ]8 y0 x- u- s/ R
    req.send(null);0 V; D7 C) ~+ f% P! ~' D

    ' W) i& I2 _' U8 k}
    3 n% i+ q/ W  g1 B# s7 h0 a! c& s# x) h+ w1 }% k: ^
    //4:接受返回并处理: y+ H6 S$ J2 S7 a2 c) e! n
    / w2 o- ^8 v* }7 R& b
    function manage(){
    , q" s2 o$ u7 _7 B3 x9 x$ I: H& `; A
    if(req.readyState==4){/ Y8 H1 J8 E' @: l- ?6 x
    # a9 f7 H3 K9 g2 y+ Z/ a  y
    alert(“r==”+req.responseText);
    ( m" F  R/ L/ X- W4 \
    $ l' z* p/ H( h/ W% d# @}' q( T2 O, r- k" X! h3 F/ N

    ) Z: q0 _4 F- V6 f- Q& V}
    ) L+ ^7 v' E/ w. U6 t! V( Y/ s1 X5 p( }% Q8 p
    </script>5 l, m/ ~6 r9 D8 g( t* G$ R9 V

    7 D' e/ V5 Z6 k( `( @5 f* k- {readyState的取值如下:
    % [; b- B% S) v' `8 {
    # A+ @& s& g# C. n  0 (未初始化)
    $ ]' ^0 Y# Q8 u8 Y8 f2 _+ d2 Q
    ; i* f. h1 q& @* M# @: E  1 (正在装载)' H9 s& C: a7 Y( h' b, C/ t% e  p& F
    7 e/ t2 [4 X( }. r* P
      2 (装载完毕)( S2 I, t$ S% j9 k; g/ w
    , h( ^* j* {/ H2 k) f* Z8 y+ i
      3 (交互中)/ I  X9 z+ G1 v

    ( X) I0 N( w$ g  4 (完成)( E7 p& ?  u) v7 [" Q& v3 j
    ( S8 G3 B2 S4 o
    , m& k* |6 N" l, g, l
    0 H  {( G$ a4 l6 e* o
    原理
    2 t/ V1 G! n/ g3 D/ @Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,可以是xml格式,也可以是一个字符串,然后用javascript来操作DOM而更新页面。
    " b0 v3 S6 [! I# @( P
    - Y4 [- I4 w- |+ ^' A5 n8 ZDwr
    : S- N7 ?4 G1 h  A是什么?9 U0 f5 g/ `+ A% T" P( u' q
    DWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的页面。它可以允许在页面中使用运行在WEB服务器上的JAVA函数,被调用的JAVA函数就像是在页面中JavaScript方法一样。
      `7 j* t9 j. {! C0 _5 ?2 A
    7 `9 N% a( ]1 i/ h3 M有什么?* K( M/ d( t3 ~6 X' Q% t# b5 r  b
    它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据;另外一方面提供了一个JavaScript库可以帮助web开发人员轻松地利用获取的数据来动态改变网页的内容。
    # \9 S' h$ {4 I3 C; u0 F7 D! t: A4 D0 E

    5 l3 e) }$ T7 c. w% m
    + y7 W# n: n" D2 C能干什么?
    " l" [0 g0 r9 x* A( B4 V, t% G  c动态地把java类生成为JavaScript,感觉调用就像发生在浏览器端,实际上代码调用发生在服务器端,Dwr负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制。* Z0 j+ [* B: E6 z$ b6 u+ |
    1 I( Q8 w. e$ M3 S4 a3 n  t

    0 i( h( n; n9 t+ G* R5 B( D5 M1 D4 ?  a7 \5 R( ?
    怎么做?
    $ G  ?  x7 }- K/ {) }① 编写配置文件  Q9 d  c1 d$ S+ \8 I

    9 r8 |  R, T% I3 U* A" oweb.xml7 d8 R  g7 Q4 m! `
    7 W4 f8 R; ]( J
    <servlet>
    1 F) P! x4 a( |1 `% b) Y3 H" H9 Y7 K* u. S. C8 @& ?
    <servlet-name>dwr-invoker</servlet-name>' Y+ V2 N( Y, ?" w( i% D. K
    ! R# y8 |, e7 ?0 q% N' v3 v
    <servlet-class>+ `; ^/ M+ z+ o( \- \2 C0 H2 m

    ! T4 r& p7 U* B0 P2 C- n/ b4 ^& Porg.directwebremoting.servlet.DwrServlet6 `2 ]! S+ o& f

    5 d9 o# b$ |! u# g. x</servlet-class>
    & ^# T- ?1 J2 d1 D  F' ?) ?' F4 d
    * Z6 d8 B) T7 v7 c4 c' g<init-param>, v2 ^4 {. B7 `1 |; l) r
    2 I5 F' n" r# t) Z- E8 P0 V$ t
    <param-name>debug</param-name>
    , X+ f/ e' [% z, o# K, L5 G! }2 _- j2 G7 J5 T
    <param-value>true</param-value>
    5 w/ c* D5 a' B" O. ]8 w) X- Q, M$ J" i8 j- M' n
    </init-param>$ z% P% [& a7 g/ T- K2 S! S: N2 j
    0 P; G% ~8 G. H- W2 k( x
    </servlet>
    ; ^- h1 X2 o7 r( L: c/ P3 e6 c) d) V4 B5 G; J( f" c/ Q
    <servlet-mapping>) S/ r. o1 H; e  s! C7 e
      H9 U  L5 a  p6 [% a+ C6 ]
    <servlet-name>dwr-invoker</servlet-name>
    * |; w- n0 v1 R% @. u
    % E" k1 v4 M% J7 N# ]- q  D<url-pattern>/dwr/*</url-pattern>
    6 B8 _. r  _* C# U% J
    ) {% s( E( U4 A$ ^+ u</servlet-mapping>
    " [$ C: X, o) ]: i9 ^
    5 |- a/ }5 d2 o! }; u% x2 Gdwr.xml- @7 ~' ?6 h1 V+ {7 z0 @

    5 q* w. L* Q" @: n' D( a<allow>& U4 `* u4 n6 Q! ]9 l  b, c
    # `1 S$ i# \( D+ H1 U
    <create creator=”new” javascript=”kc2″>
    * d) ^! X( w% W- x
    5 k$ y3 R6 }+ z<param name=”class” value=”dwr.Service” />
    + F! F. r4 r" X1 d$ N' V, Y0 ^
    ' X6 ~$ r6 z5 q8 M7 x7 L2 o" _</create>
    $ g! L4 L- |7 z) k% H, h, }4 C/ j# m+ N9 p1 `
    </allow>
    ' P3 f- p) q" D
    8 I( X: e. m, |$ a% R: T②编写service7 I! Z0 A8 D0 V4 E" r0 J
    ( P9 _. L/ B. E7 t
    public class Service {2 O. l# ~0 `# \+ ]
    $ h: b: R: q8 s: N, {4 V
    public String sayHello(String yourName) {% g& X6 Z' y; O; |. m# J5 j3 i

    0 j0 Y$ I$ r% H2 ]# W//可以是访问数据库的复杂代码0 F; p4 H. V3 ?0 O- c& y5 ~4 l: I. M
    ( g3 u: h5 Q7 o
    return “Hello World ” + yourName;
    8 u" q5 C/ j, w9 e1 J8 f" u* @: ~* R5 M" [3 R
    }) R" T. p! I% V$ O; P
    2 ~! ?. c9 y$ u' }0 a, D( y
    }! x6 Q, O& @% C, d' _. S# I+ A

    ! T4 W4 p9 c" |; U% t) Y# G③测试DWR
    ' m, b! Q( r8 V5 Y$ }% O9 _% D; N+ B1 G" Z) s, C* U* v
    将代码放入应用服务器(比如Tomcat),启动。! d" q7 ~! B3 J" v8 Y& q$ l0 G
    # P" A) ]8 c8 f5 J- T7 T' P, o" Z2 T$ c, E
    然后在地址栏输入http://localhost:8080/你的工程/dwr
    $ S1 D) A9 j# M4 t) b$ q2 }; P9 g! Y7 g" D7 G
    ④编写jsp页面
    % J6 [4 G9 g- }( M/ U( s' L% [( c& ]5 B
    1) 要引用3个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js
    * d+ Q( }3 _4 N* t* K/ [6 F& V4 Q2 |# z# S4 B8 C: X
    2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样
    % g/ C2 g2 Q* m9 t5 r5 [3 H' d; Y+ u: p/ y- K/ Q
    3) js里的service.sayHello和java类的那个有一点区别,多了一个参数,用来得到返回的数据
    回复

    使用道具 举报

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

       

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