我的日常

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

动态微博

12
楼主: admin

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

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    11#
    发表于 2014-12-03 12:43:50 |只看该作者
    JEE
    ' b% Q$ M9 _3 `: n) f3 W简述JEE
    % ^3 I/ ^1 Q5 E  T0 g  DJEE : JAVA  PLATFORM  ENTERPRISE  EDITION5 t9 c: `  P" ^  G# {  M  w& o4 m

    7 z- a9 U% E% M. z& ~. H# H+ UJEE是一个规范集;
    ' H% P) ?$ u, ]) f* G/ g# {+ a0 Y. G
    JEE是一个框架集;
    + [, E4 G( j. t9 w+ {! d8 A+ D9 f% B4 i/ g/ A$ r# N3 X
    JEE是一个技术集或API集;
    , B% e2 L" E0 o# _
    * }( F, J9 `( B) L  A适用于创建服务器端的大型的软件服务系统" D, `2 Z4 [0 P  S" n
    $ U9 i( ]2 P, l$ P9 }5 P

    * Q0 Q3 F0 j; ]: n  C* h/ W+ M6 y# z
    C/S B/S 模式
    2 B+ M1 S; \6 e4 x7 nC/S client/server即客户机/服务器模式,客户端也参与程序的运行与计算(富客户端、胖客户端)
    3 {) q" P8 Z' W2 |
    ' L6 U, O5 d  FB/S border/server即浏览器/服务器模式,又称为瘦客户端,客户端不参与程序的运行与计算
      f4 C) p3 n$ g- i  u' }- ]. K" U) N! j
    5 ^# Z3 X7 K$ A/ J; x5 H

    5 O$ v( ]3 W9 z" x企业级应用(大规模的应用)的特点
    # x$ I( Z+ n# r  U2 e, }1.生命周期长、稳定、可靠
    ' l' X! _/ R$ E- Q7 X+ `
    . U0 O/ \4 u9 P0 I* j% ]2.组件往往分布在异构的环境中,能够跨平台0 S3 ]& F6 N0 X: I2 r

    ! K+ y% _) s4 R3.维护性、扩展性、重用性
    1 J) [" p) q; c2 J# x- q4 f1 B
    ( {  C; U0 u9 L0 F$ {- e4.有事务、安全、线程
    ) P+ y5 ~3 j, S# n
      ]$ H, `; L7 d( l
    4 g9 r6 `$ S' x- i9 r) |+ \
    + E- A2 n+ }8 v  x: [什么是业务逻辑?
    8 ~! u% b! e- q: f依照业务逻辑划分模块,, |# c) V4 Z* e' l& w3 q. s

    3 j% w% [/ A$ j. i所谓判定业务 就是具有以下特征:
    " m3 b0 t* S# ^0 A' o0 h0 J6 z4 D7 k+ ]% n# Y$ F
    1.业务流程2 P3 a9 V+ J2 [- p+ O8 l3 M) z

    ; Z3 N3 [. h7 p2.业务判断1 F# t3 b, ?( p+ M/ f/ G0 Z4 P

    1 R$ X2 F$ k+ o( x3.功能组合
    1 u) |; b1 s; a) X9 K5 e; X1 N7 b; u- D/ N4 \3 P, y

    " U2 M( p2 j  [! F: c
    ) Q" H4 \% L8 s) b平台(角色)的划分  W0 u' O! ^- ]& \1 S
    1.平台供应商。提供满足API集实现的厂商(BEA weblogic IBM webshphere)/ u% z3 Q2 L3 k' u

    & l9 m$ C4 g/ ^; Z$ J: z2.组件供应商
    $ D! Y' d$ J8 A8 E0 H
    ; l5 p% T* t% M# B7 O3.组件装配人员
    ' c6 t3 w: ^6 ?' w% R* K* o9 t& j  V3 d6 l1 |* D
    4.部署人员
    . i$ a: E( e5 V% w/ Z" t
    2 N0 Z; Z6 F, Q8 j" m  C8 w: m, K  c5.系统管理人员
    . h, G! k" `" b* C* {% \' T' i9 q9 C
    6.工具供应商 提供开发组件所使用的工具(Jbuilder、eclipse)$ {8 d! f# v; j: {: L' h. m9 N& U

    : g: l/ p. f% X* e  E
    & Q% q8 k  c$ c* `; U# t4 y2 g7 y, R
    ! s. ?7 m1 J; G) c9 N  }1 `java技术分布(设计架构 模块内部设计)/ k$ j6 l3 ^6 C5 F" d1 t
    1.表现层 Servlet、 Jsp、 JavaBean、 Taglib
    ' |" ?- V3 c! A% U) ^5 m, q# j- N  A) {
    2.逻辑层 EJB(SessionBean)
    ! C+ d6 a; X4 y$ t' B8 V+ n! @0 a4 a; J' P
    3.数据层 ( JDBC  EJB(EntityBean))* M- `) N, [! D/ e4 c/ i8 K
    1 v( d4 b! O0 Z7 {/ ]7 ~+ L
    4.服务 JTA(JAVA事务架构) JTS(JAVA事务服务) JAAS(JAVA授权与验证服务)
    & l% E6 n# Q/ w9 f8 y, w6 Z2 O9 b: @
    % N/ U) X; |2 F7 x) [7 [& x0 ]3 e5.分布式通讯 RMI(IIOP)+JNDI 、JAXP(JAVA 的 XML 架构)
    1 q+ t, E$ \# F/ n) q  O: Y. ~
    $ K: f7 I; t+ `1 V' G) O7 Y, l' ZJAVAMAIL(邮件服务)、JMS(消息服务)、IDLC、JCA(JAVA连接器框架 (成))
    # }. Z" e; P. V& X* ?8 X/ b
    ! f3 Z4 s4 h! `  E6 X * Z7 x% j  r% s, W( m& c3 F2 v+ i& j

      i- g$ v8 F1 O: A- NJEE的体系结构: 是一种组件的体系结构3 R( n0 N8 j) |2 v* S, {& y
    1.组件 : 能够完成一定功能的封状体(独立的功能的集合)7 B. G+ p. }7 W  N1 }

    7 v: r0 j1 [  A" W4 R' b: j& J3 O不能单独运行,必须运行在容器上% H/ |5 h& E$ Z8 ~& |5 Q
    9 {7 N! |" x8 S/ B, Z% t
    分为两类:web组件、ejb组件
    ( a/ {7 R; t+ A& i& @6 {# n$ ?" E5 @% T6 l9 C  ~& X
    2.容器 : 提供组件的运行环境,并对组件进行管理(一段程序). p* B  J) |, O- \2 p) s: d
    ; N! p' w3 w$ ]0 ^5 L2 R' T
    管理组件的生命周期- o9 m/ n9 i1 U% N2 x: F

    $ B- N; o. k& e. s7 r7 V3 k8 k不能单独运行,必须运行在服务器上, H7 }; i0 k# B( b! O( @

    " z  T8 }- q, _1 i% i程序(组件)通过上下文来调用容器(context)
    # K; D' q- R# i8 |6 r
    7 a0 m/ W, e$ W组件通过web.xml向容器描述自己,使容器能够认识组件4 K% d$ Y! z0 o, V

    3 h8 h  Q- s3 \0 L4 }容器通过回调方法来调用组件
    5 }/ A7 Z! T3 i- r! h
    " C7 J7 A' F6 x, F) w6 b( L分为两类:web容器、ejb容器
    - p! [; Q$ q$ K$ u2 F
    ) k" }$ O5 x% M4 l6 s3.服务器 : 提供容器的运行环境,提供大量的JEE基础服务
    & P% ~* z9 }% y/ l+ m: y1 @/ u* K
      e0 N* x& m* F9 x% I0 ~4 wweb服务器(只提供web服务)! a3 c- h! v$ w$ i/ b4 S& G( d
    5 G# x1 B( m" w& ?
    jee服务器(提供web、jee服务)
    9 t5 e( w2 j7 G  B) Z
    % Q8 c: w* V  V1 o3 z7 `+ Q + C5 I6 t+ m9 k
    : ^; T/ q% C* K8 O$ T* V
    什么是回调方法9 K" N2 T% P; f' m% ?3 y, P
    由容器自动调用的方法,就叫回调方法。$ `6 k; w, d: ?

    7 o& w" Q! N  f) t8 m. w) B8 J/ e % j) O( w( O4 ]. i0 h7 m0 j
    . `/ M8 N" P' F  W' [% m8 k# e8 I9 F  k
    RMI远程方法的调用机制
    ' B$ \: B3 Q' U/ U- d' o例如:A主机有B()方法,C主机有D()方法,A 想调用C主机的D方法
    . t: s8 b, t6 i: p/ ^) Y( y( U4 M/ M! g; H3 {
    * m  A, R+ l. j" o2 c( j* k
      B6 _# \6 e5 w2 q2 h: m. @

    . Q( w4 c- m# h& \: `' c
    . d% P7 W' W' d# ]( s' i+ Y: m) o学习方法. C+ N( C  d: [& [$ b8 \' F7 k+ ^
    1.规范(熟记) 2.熟悉API 3.多练 4.多想
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    12#
    发表于 2014-12-03 12:45:29 |只看该作者
    Servlet
    ; z( j/ a* K( m: ^2 z4 d$ r
    •     描述war包、jar包、ear包的结构
      : J  {9 I3 I: f' y

      * W+ I' S+ Y$ t) w+ C7 K0 P0 z) L' f* }% a& ], E1 }7 y

    war-                            web文档压缩包

    —WEB-INF

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

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

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


    " ~$ D& C9 _5 _7 j1 |3 N7 H/ o9 ~. r

    jar-                             java文件压缩包

    —META-INF

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

    - k* c3 {4 z) h: _8 u0 q0 h' K; A) ^

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

    –META-INF

    —Application.xml 配置文件

    –*.war

    –*.jar

    ) U+ w# l& u5 E5 \! m, j7 X3 V
    • 什么是servlet?servlet主要做什么?3 k9 w/ z0 Z" R
      % o# R8 y4 W) {7 t) B

      $ v4 E/ n/ {0 U7 F, q6 s

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

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


    * V8 m! S% z) e: u$ a" `
    • servlet 与cgi相比的优点?servlet的缺点
      / V) y9 s: ^! G4 @6 X0 ]" F5 m) Y
      " N7 p7 a9 u0 u& l9 x& s

      , I; a0 v% _, `

    优点:

    性能(线程比进程更快)

    可伸缩

    Java强健且面向对象

    Java平台独立

    缺点:

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

    ) k# V8 B3 O& c* a4 h/ H& P  J- n$ Y
    • 常用的servlet包的名称是?6 C" @3 O+ G3 c/ D: C
      5 z4 T7 d% f8 U- g0 t
      & l: h2 ]& E6 ?* P; \  X; E% o$ f" Q

    javax.servlet

    javax.servlet.http

    ; u7 l4 R  R" b/ I/ }" m% ~9 A* y
    • 描述servlet接口的层次结构?! A0 h0 J( c& O7 R/ P5 a

      4 E) U- s) T7 D$ H- E( L' {8 J( I# n6 \6 V- G( H0 Q, C- h9 {

    Servlet

    –GenericServlet

    –HttpServlet

    –自己的servlet

    ServletRequest

    –HttpServletRequest

    ServletResponse

    –HttpServletResponse

    3 A# ?0 o/ S) m
    • 对比get方法和post方法?
      . A) v/ W' E$ P. ]* s

      & P+ y: R/ M5 V; D6 i8 `$ S0 Q  O9 o7 Y: i! I! s

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

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

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

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

    , C5 X- Q+ W) H
    • 归类描述HttpServletRequest接口都完成那些功能
        E8 F9 e9 ]1 s4 l5 J6 S$ B
      - M0 s+ V. ^4 K* o7 [) n
      3 q  R+ {: I6 J
      • 读取HTTP头标
        6 h0 y. n# s. o
      • 读取cookie
        $ o% k. v1 p% U; U% |- V
      • 读取路径信息
        2 |7 n% d, n& ~$ g# C
      • 标识HTTP会话。% q: N7 S# K; u* `

        9 H! j+ u* M/ s+ N0 F' W3 q0 T; z( F

    4 J! I4 G6 \4 m3 ^- ~
    • 归类描述HttpServletResponse接口都完成那些功能$ G0 h0 z- z# w8 p, K" k+ e
      : t: k2 ^! D7 L
      1 d& F- A6 Z# O9 s
      • 设置HTTP头标! k. @7 Y/ |$ F, n8 \% [
      • 设置cookie
        ) ~- v4 Q7 i9 m$ I5 H' l
      • 设定响应的content类型3 o% s3 o. C' R- B8 Q0 u
      • 输出返回数据
        & s) E6 Z1 o1 f2 B- b
        $ x: a2 G% f+ m6 L; }/ _

    ! [, c( d% {" B. V
    • 描述service方法所完成的基本功能?默认是在那里实现的?
      2 v9 ^8 [% X) V3 S, K
      ! j, t$ M4 `  q# x% S

      0 }% ]: O6 R% Y

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

    实现:默认在HttpServlet类中实现


    , B: g* s4 ?" }1 i- J
    • 如何开发自己的Servlet?描述应该做的步骤和每步需要完成的工作
      ! e3 _* ?; ^4 b5 u: J
      ! `1 x+ W) F) z$ l

      * A  s  k( x& J( y% h8 U" C1 [  ~: }

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

    * S3 W4 i0 s8 r6 ?/ ^% g3 e
    • 为何servlet需要部署描述?7 c) W/ E: P; I# P7 f

      2 z8 C+ a# f4 u- C9 }
      ) m9 ~9 I$ F' p# s7 w

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


    2 O1 v5 v4 ~: A0 ^0 z9 d
    • Servlet基本的描述应该是?请写出来% R7 x0 r1 |& Z% a1 L( l, x0 q" u: [6 N) y

      ; `: @4 r3 t( S3 j/ @0 E+ @7 T& U* T
      & Z- X/ Z" `" b5 }7 D0 a2 {
    . E5 X/ p; A0 Y* _7 ~

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

    0 y  f, H8 e8 |* h% b3 A3 A
    • 如何在html中使用servlet
      4 u' N) d4 C8 s0 B; z. ^

        c4 b3 o. l6 W0 V  R! F/ |$ p( ^1 J& k, D/ _; M

    FORM标记

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

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

    语法:

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

    {HTML form tags and other HTML content}

    </FORM>

    6 n$ P/ C$ d- L0 k2 I
    • 如何接受request中的参数
      2 r9 f. I- w9 S8 z% [. j- r

      4 X9 s' [0 g! q4 _2 {String userName = request.getParameter(“userName”)方法
      4 x- b5 p0 ?' T! o
        p# l9 M3 ]0 F/ B3 [$ B4 ?

    , P1 ?" M( c9 n6 u& E6 k
    • 如何接受request中header的值* r4 V9 o, v# H, k# l9 i
      4 M) i6 i( u5 e! ^. t

      * P5 }, c" c/ |) a- w

    request.getHeader(name);

    request.getIntHeader(name);

    request.getDateHeader(name);

    request.getHeaderNames();

    6 s  _0 X6 B/ R8 M. m1 v
    • 如何输出html( d- s6 W/ X$ U3 k

      6 K" {5 r3 [2 y( w4 X3 y: Z0 u: T0 y9 l  m6 Y2 |0 ~: W2 V

    PrintWriter pw = response.getWriter();

    pw.write(“<html>”);

    pw.write(“Hello”);

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

    ) ]  x, Y9 O- {. v# o% v
    • 如何设置输出的contentType- b: m) q1 s, M$ C, n
      7 q4 m; O5 Q& E% }" C
      " K; o' M4 p+ [

    response.setContentType(“text/html”)

      o' y9 \! A6 }( x; \* k
    • 描述servlet的生命周期?9 n: `/ T6 _" X! V: `" _  v2 a( U

      4 j$ ?, O1 Y, e, p, E7 C  Y' M9 c4 @5 e/ m' `; u7 X1 w0 T* x  [

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

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

    : H1 Y7 H& ?6 z
    • 描述init,service,destroy方法的功能和特点
      & y' ?! ^  Q9 h9 ]2 ]

      : L0 i- M! L* R( E6 z5 D( X6 `2 }1 x/ _9 h% }7 _; i

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

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

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

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

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

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

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

    - k" {* ~1 e& ]" L5 N# G
    • 什么是回调方法?有什么特点?
      ( f- ]' @) j2 y( U0 s  K% G" l

      - o, _+ h' k% ]+ I
      * ~- u! A- `- }

    由容器来调用程序的方法

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

      X$ b. f& {1 p( h1 S7 f! j4 `
    • 如何设置初始化servlet的参数?' U) S" X, H- h

      2 m9 H4 y2 k1 k, i0 k: t( |  d) m$ v( |在<servlet>中添加如下配置
      * \8 N3 H  @  t7 @) h9 e% y) `* s- _8 R3 I4 H

    <init-param>

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

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

    </init-param>


    * c( I2 u4 U; U* m4 j+ U% T! t
    • 如何获取servlet初始化的参数
      2 ~' j* q4 {# ~( s" z; x
      3 L" t" l3 U( C  Z2 T! u  f: L7 x
      + V3 K% S* h6 A/ y7 ]" u, I+ [+ Z5 [

    public void init() {

    greetingText = getInitParameter(“greetingText”);

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

    }

    & H7 W0 \. O  y. D* D; q
    • ServletConfig接口默认实在那里实现的
      ; M# g' W( T! V1 E5 `

      0 s* q, G, Z1 N0 B1 v5 [' @- m8 V: Q- Q; t# r

    GenericServlet类实现ServletConfig接口


      H% o, y. R- H6 ~1 \/ O: R
    • 什么是ServletContext?有什么作用?: G- F; `* Z# W( Y2 K2 ^; o

      5 ~% v: G) Q1 g* P' D. G- h
      ' P6 t6 {: |/ J

    Servlet上下文

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

    8 |$ c' d1 ]. K/ K$ n6 ~
    • 如何访问ServletContext接口?是在那里实现的?' D  a# F; P( f) e/ M& \: W8 {! S3 a/ p

      $ r8 R9 D1 h8 U6 w4 T$ \0 M6 H  b3 r9 z8 W- Q, C

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

    GenericServlet类实现了ServletContext接口。


    ' x. d1 c& ~5 |& ^; L
    • ServletContext接口的功能包括?分别用代码示例
      3 _3 s2 X: P, m% k

      , [: f( i$ U6 A8 `  V, x( F/ G' ~. i9 p
      . d& W" E$ x) z# ]8 u2 C

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

    ) N5 Z8 H  W7 e7 ^" ^6 H
    • 如何设置ServletContext的参数?
      6 T  \4 h) i% {9 M5 S$ ?. X
      & t0 v) q  Q/ p. J4 t% g  ~1 I
      * Q: I/ l7 N; }/ W0 I$ @: E

    <context-param>

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

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

    </context-param>

    * v6 L) I4 y' K! N1 y2 O9 j
    • 如何获取ServletContext设置的参数值?
      9 a7 X9 l9 n' a

      ; H. e  s7 e3 s1 z$ ?' x
      + ~( ~$ x) [* d- R8 [

    ServletContext context = this.getServletContext();

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


    , A/ \2 |! Z9 ?4 e1 x8 |+ j7 I3 ~
    • 描述Web应用的生命周期?
      ! C0 |- U4 V3 F( `) f% ]

      ' [/ {& N; d. {$ u: J# S) C
      & ^( z5 T- V) @" W3 ^/ h

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

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

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


    . I& {# }  ]( Z7 r
    • 如何用代码实现监控Web应用的生命周期?
      , A, |# `" V( `# j1 U$ V
        G+ g; _8 `* h$ z4 O0 o  S
      ; N+ \8 Y8 ^6 g

      / I2 l% x* w; j7 k

    public class Test implements ServletContextListener{

    public void contextDestroyed(ServletContextEvent arg0) {

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

    }

    public void contextInitialized(ServletContextEvent arg0) {

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

    }

    }


    + F3 ~/ Y; X9 s- `0 W9 p  e; |

    web.xml文件中的配置:

    <listener>

    <listener-class>

    com.csy.Test

    </listener-class>

    </listener>

    1 ]  m7 r; n  U! g! o
    • web应用中如下错误码示什么意思:400,401,404,500
      ' a/ l& |0 O2 D
      ) [- U8 ?! [- t3 B% \3 T! B" Y7 W
      400 Bad Request//错误请求
      401 Unauthorized//未被认可
      404 Not Found//没有创建
      500 Internal Server Error//服务器内部错误
      ' @2 j& _+ z5 M; S; s
    # l- g3 P; O1 g6 D; S
    • 描述Web应用中用声明方式来进行错误处理的两种方法
      1 u5 t! f: q: E" b" B5 x

      & u& [7 \' _0 k  T% ]) e9 \/ g6 Q0 _- e0 y8 g! ^

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

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

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

    7 H/ @, {2 p9 p+ H
    • 描述记录异常日志的方法,都位于那些接口?6 q( o& x) L4 I

      % }& H$ l* h! `% ], c4 A& V" J
      . M+ Q- i4 b- ^2 [) p, s

    GenericServlet:

    log(message:String)

    log(message:String, Throwable:excp)

    ServletContext:

    log(message:String)

            log(message:String, excp:Throwable)


    * B0 m5 z6 x* K# \* X4 S' [
    • 什么是会话?3 ?1 K, n- ]1 `0 s
      ( ]' [5 i( C" B- W" e0 Q3 d$ f2 f

      * b' k* Z7 H- s* c9 _2 _

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

    & b9 E  S- Q. Z+ ~2 t! O
    • 如何获得会话?
      ' O! o4 h; [, K. H8 q

      9 b/ S$ ~, h+ S* ?
      HttpSession session = request.getSesseion( );

      2 _, `+ Y9 j3 h- e# W8 C: H; y8 M
      t0 F7 ^* L& d$ b2 i
    • 会话Api的基本功能?
      ) N4 z5 l: I; i7 @. h9 k. R
      0 v; l/ T$ W* c

      ' a, o& Z' @' {

    getID() :String
    8 j! U3 F1 _' R0 g2 |: [4 m

        isNew() :boolean
    ( H& C6 {* n# d9 Y1 O% p* Y

        getAttribute(name):Object
    1 [- ~- F3 K1 F

        setAttribute(name,value)0 K0 m- a8 x1 N$ L

        removeAttribute(name)

    / @% T# w$ x+ {% h. F) C  d: ?
    • 如何销毁会话?% S1 @& P4 f9 R9 a5 M/ i5 v) R
      1 T4 Q% g# F8 n/ k( K; n; p$ x

      ( ~3 E; Q1 o  Y# o& y

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

    <session-config>
    8 P0 e" f4 l. _& t. [) g. M# M# {' J

             <session-timeout>10</session-timeout>
    $ x4 z/ [# H) b* ~7 r$ S$ r

         </session-config>
    + a# ?9 O9 V* P& ]

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

    invalidate(), q% Z! Y: g% b5 J+ Q: A

         getCreationTime() :long
    ! c! W3 O4 K0 }0 m" H/ |" S8 i' d

        getLastAccessedTime() :long! R7 m, U6 Z( P0 V. j- }

        getMaxInactiveInterval() :int) S( a/ G$ H4 f( g+ S% j( K

         setMaxInactiveInterval(int)

    2 t* y; r, [9 R2 |% L) T1 t3 Z4 d
    • 描述会话保持状态的基本原理
      ) Q' G) ~# I% F; u! E

      ( m* x: n( ~) {0 Z. X+ F% y4 @: T2 F8 Z/ ~* A# {
    . C. z. ?! Y6 Z

        client server! h* u' \* Q9 U, w% }


    # O, y# Z; ~2 R& w, {3 M$ V

    request0 V4 t" u4 Z0 g& |! g

    response (sessionid), M+ l2 [0 u9 [0 c8 j

    request (cookies)
    - k$ `) `7 x- x  Q. O, J  k5 R

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

    0 j& ~: T# g- M9 T
    • 请描述session和cookie的异同之处* s  ]( N. e1 W/ T4 l
      6 ?7 b0 ~  h( i- Y2 p- K. V" K

      ( g' g3 q; M5 ]9 p3 \8 K( H0 d
    / ?+ I& F3 z1 {, a
    ) m7 j9 K1 a7 Z* E! u0 _! P
    • 如何读写cookie,代码示例+ ^  q: Y+ S0 D4 r
      $ w. M2 c& t: s' M) V* L
      % k* q5 x" w+ j

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

    response.addCookie(c);

    读:Cookie[] cookies = request.getCookies();
    ' E1 p' L9 y9 p9 x* H

            for ( int i=0; i < cookies.length; i++ ) {5 Q. \* p; w" h$ i, |

                String key =cookies.getName();* m  F" m: T3 ]' ^) e

    String value = cookies.getValue();
    $ \* z' e8 p1 j, M

    System.out.println(“cook”+i+“:key=”+key+“,value=”+value);8 e# Z" \" Z* X* I/ @' L2 c

         }

    ' i" O3 H& Y5 n/ E0 Z3 Q, c  H
    • 什么是URL重写,如何实现,代码示例* A; ?3 D( B, d. \# f1 ^
      & w6 {1 R4 O$ U6 `( l1 }( K( U0 ?  y
      " H4 z' m" C, j' p0 S3 @

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

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

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

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

    + V8 r) q" y# h# r9 Y# d9 X

    ! \: L2 f) P! B0 `
    • 描述web应用的4种认证技术- l  i) v5 C) \: {) ]
      # @6 k0 w6 p0 p$ I1 j/ v; @, i
      ; E6 S; ^# o4 D/ _, J/ w

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

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

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

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

    / U! l. j% R2 r7 {& l
    • 什么是授权,什么是验证?0 \. ^4 }  J/ E7 k3 o, U
      4 [; N# i$ X* V
      7 A  B$ j% ~" f

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

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

    3 u6 x: _3 P6 Y( n! [- b5 u
    • 什么是HTTPS
      - s) d/ s! L4 b1 V# Z

      8 y+ S, }/ z/ M! [
      % U" ~9 D& A5 z1 w2 d+ t* T4 u

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

    9 |' y( a) E  T8 A0 J! A
    • 什么是审计?* m- \% o, c; Q- e- K8 S

      & d: P* B$ s1 v7 m! N4 e
      2 K1 G$ b" T; Z% C" b2 t  b

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

    * d( }; d) f; h8 H5 o0 S) N
    • 如何实现声明性授权
      - r" L8 d3 [5 G' ]
      . K3 D; t0 [9 C# G1 @. ?& ]9 M3 P

      ) l' s; m# }( {+ _

    1、标识web资源集

    2、标识角色

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

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

    在 web.xml里配

    ; S, [, S0 L% Z2 L' W6 G1 B
    • 描述servlet并发问题?/ Y8 i, E' Q7 ^# j- a! U& \' U

      7 J9 w4 j$ s% G5 C' y& H
      . w# P# ?0 H! I

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


    $ V( s: _9 O! ]" v( V4 U* e6 [- a. w
    • 描述Web应用中的六种属性范围) w# F5 G" d) H6 F/ m

      - A! A, X. a9 {( B0 I# _- @0 D
      $ d8 l' ~0 o/ }0 @) {  L2 a  o

    局部变量(页面范围)

    实例变量

    类变量

    请求属性(请求范围)

    会话属性(会话范围)

    上下文属性(应用范围)


    % p* M0 L0 N. _+ l
    • 指出上述六种哪些是线程安全的
      1 j7 F9 h; D% @7 _& c! O% k
      ! Y7 C; _# _+ d1 |) y( c8 H

      5 \" Z* B' C' v2 }

    局部变量和请求属性


    ! |% `( F: t5 A4 U( M) }- b# `
    • 什么是STM?如何实现?
      ( b: s: Z3 Y" \
      9 Q2 ?3 w/ q2 U# ^/ V7 G- u0 p4 y2 j6 s
      ' q6 j7 Y/ R% W+ h0 e2 U

    SingleThreadModel接口

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


    . O+ [+ p0 P1 j4 `% y0 O
    • 如何实现并发管理?) A, t% y: O' I+ G: B
      . w- E. L" M) J* n
      5 C" a& K6 t5 p; ~$ K, w, C4 v

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

    使用synchronized语法控制并发

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

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

    4 T  M0 s* ^& Y
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    13#
    发表于 2014-12-03 12:45:45 |只看该作者
    Jsp" a4 }% ~" W+ b; {) a
    什么是Jsp?3 O3 }% V9 s2 S; A% y# L0 F. j
    Java Server Page    结合java和html在服务端动态生成web页面的技术
    7 D: ]! S& b2 E- L' ]
      u4 R8 n" J( }) E4 l) }
    ' N2 ]7 x& X( N) \4 V" `$ W' Y% J' _) d
    描述Jsp页面的运行过程?
    5 _  j( M# c; H3 J2 ^/ o% h+ b第一步:
    & e* A4 P* x& e' ?' e; G! _8 q5 @! O- F2 ^, n/ |& a' O
    请求进入Web容器,将JSP页面翻译成Servlet代码# e( l, `9 H, C. c" R

    ' s' z9 l9 d" o$ _- y3 k第二步:" H  z* ~( g' G/ Y% f/ P- p! r
    , B, e& I0 d* P8 z* X
    编译Servlet代码,并将编译过的类文件装入Web容器(JVM)环境
    4 e: h9 j+ C, W2 D+ o- y9 Z& f' U1 y% B  S$ ?
    第三步:5 y, {  y: C9 a! j
    % Q4 m7 p- u( h5 n! j2 U
    Web容器为JSP页面创建一个Servlet类实例,并执行jspInit方法
    % z9 G, G5 h( Y' {  A
    6 r* ?0 S. v3 V0 L& b; `, I第四步:
    ; V: g0 Y5 i9 I2 B( k2 M$ V6 L
    4 p' h6 G& u/ F$ zWeb容器为该JSP页面调用Servlet实例的_jspService方法;将结果发送给用户
    9 ~+ E+ D+ E% H+ N, M2 }7 x, U/ X! T/ e' _

    ( ^+ ]; {5 t. L* F1 T) S, T
    & K, Y$ D) H5 R; A% `描述Jsp页面的五类脚本元素的功能、写法、并示例
    $ `4 v$ t* C! o  ]注释 <%– –%>7 f* k* A& U, k7 \- Q

    , C# U5 J. {9 `! V<HTML>% `3 k& j/ p9 T
    * i) G! ~% z7 s. z* u
    <%– scripting element –%>% a. C$ ~& P  z

      q5 b4 E& Z0 t8 G( c# l: c+ D: Z8 F</HTML>
    # L  c; W+ V  F. `4 r0 [
    4 K/ V, ?2 o8 s7 K, y4 B* H指令标记 <%@ %> 指令标记影响JSP页面的翻译阶段& ]% Y9 n' a. _+ K7 `  N
    + u) \8 J1 P, p; P
    <%@ page session=”false” %>: S/ r/ o& [, e4 ?' h! P# Q

    ) M( z1 k. f1 X# ^! @声明标记 <%! %> 声明标记允许JSP页面开发人员包含类级声明
    3 ~! J0 Z1 d! z  `9 ]
    / z7 ^; R" s1 \<%! public static final String DEFAULT_NAME = “World”; %>% ^( @) M% c* M' V  T7 B
    6 T+ e9 c1 P0 S# A" e
        脚本标记 <% %> 脚本标记允许JSP页面开发人员在_jspService方法中包含任意的Java代码# K  q# e' c0 [) c5 G+ U9 k

    6 a; Y. m/ k4 i) c7 ^& w+ W! I    <% int i = 0; %>
    7 @1 ]5 O9 U  b
    & s1 y6 r$ _5 }. Y7 _+ }% H4 `4 v表达式标记 <%= %> 表达式标记封装Java运行时的表达式,其值被送至HTTP响应流 <B>Ten is <%= (2 * 5) %></B>
    ! q+ E/ L0 M/ B2 V- K* G: }. l3 [
    8 p- b9 |7 F- @1 H( z0 J  u
    , G9 p  [: `2 q6 Q, l, M) c
    ( t/ A& ^/ U' s2 Q描述Jsp页面中的注释种类和写法9 X( ]6 T  B( `- L6 d1 S$ P+ x
    HTML注释+ H+ Q9 a" x. I/ t2 k
    6 x3 c  V4 d3 p, ^9 E4 y
    <!– HTML注释显示在响应中 –>
    7 z! P* ]- y# @9 |& C! Z8 m
    - v) A4 o) F5 mJSP页面注释, @; V7 c5 l9 n9 Q

    & t  m$ S$ N. K0 l<%– JSP注释只在JSP代码中可见,不显示在servlet代码或响应中。–%>, {- h" r  I: d: Q3 k
    . M+ q: a# W( M
    Java注释
    2 T8 W( k8 E& x' B
    ) d2 U! o, V4 Y4 l2 q8 U0 U% D<%
    : x- m( E6 m( {1 G- a. o1 s0 O/ d0 H5 ^0 o4 R8 ]! t( y* O
    /* Java注释显示在servlet代码中,不显示在响应中. l' ?$ }: {* y( _+ d
    & A- ]6 l" `% L  a
    */$ G: A" m  {& a, ~+ d
    & W: U( q# }3 N. J: \  a
    %>( ^' n2 @% |1 b% x6 g
    1 W! }9 @& }. M& w, H

    0 j! w" V* s1 A) N% Z1 c# T1 X& z7 Z$ o& ?8 G" o8 c5 R' L
    描述Jsp页面的指令标记的功能、写法、并示例
    ' S- [. q! z! B5 n* z1 e指令标记影响JSP页面的翻译阶段1 e$ p9 _" }# m) f' {1 g: r
    2 E: s% I( ]0 A. q$ R! N
    <%@ page session=”false” %>8 W5 ?" k3 k/ }  }

    % X# G) f1 ]" R/ r! h( v* W<%@ include file=”incl/copyright.html” %>
    & ^& F+ F6 S: V5 z6 v8 O% w; l8 T, y* @9 ^9 Y9 o
    <%@ taglib %>
    + h* `- m% S( g: ~; A
    % |' P7 e: }% s+ G3 k% q
      @$ L1 N0 n' I+ W% l- R- U- C3 x1 B! H* E: i1 B; _# P
    描述Jsp页面的声明标记的功能、写法、并示例
    0 b* k" h" m3 e) q9 R声明标记允许JSP页面开发人员包含类级声明
    7 b% G, x0 k" m
    0 j' ]4 [  G9 e; S* H写法:. b+ ~, }4 S$ r4 r
    3 h+ q% X1 t: n/ T/ W7 a
    <%! JavaClassDeclaration %>, L; F2 ]* v# u2 v  D  x

    / E* h1 U4 C; t; i& L例:2 {2 J9 u% W7 Y. N$ z
    7 q& c3 f! P/ H% ~4 D# _9 ~
    <%! public static final String DEFAULT_NAME = “World”; %>
    4 P/ M5 Z9 l1 R, \% X0 I$ e: H" k2 J2 v7 g4 s! f9 l: Z
    <%! public String getName(HttpServletRequest request) {
    " ]4 ]8 r% l2 b& k) a$ n; y8 ?: z6 ^, V& i% Q$ Z8 y3 A3 e
    return request.getParameter(“name”);' }6 C+ D9 Z$ \) J
    7 G$ b6 H0 I% g2 L  V7 [
    }2 ?9 S4 r4 |, |! x" X7 h
    5 J2 q9 c$ O1 T8 T9 M4 V
    %>
    " R: Y. D# z: Y- ]. [4 Z) F! x1 |4 J1 U0 G
    <%! int counter = 0; %>
    & G2 G1 z8 `! o$ B7 _( {% j8 S& {
    9 i+ o% V( F% s, d5 y9 c: G9 K# t
    0 T5 R- R3 M" w: g0 R% D
    : _" d7 Z, p5 ~2 b$ k* u2 c' N描述Jsp页面翻译成Servlet的规则
    1 w" g& ]: V, h+ Ijsp中的注释标记被翻译成Servlet类中的注释
    ( K* L# C3 i) e7 Q, y+ t! W! i
    * T" b4 X' t) C, ~1 @$ Y3 S0 {jsp中的指令标记被翻译成Servlet类中的import语句等3 G+ y. n: w; x7 X* }, l  [- b& j
    0 d  L, Q4 `1 R* q0 v
    jsp中的声明标记被翻译成Servlet类中的属性
    : j! U# P: C7 j! a+ D
    6 V6 p1 x3 m% W& m1 B* k' N% Djsp中的脚本标记被转移到Servlet类中service方法中的代码
    4 x7 b9 n( B0 _) h, p, f- r: Y
    / p5 y/ ?' u: N+ ^; ^2 ejsp中的表达式标记被翻译成Serlvet类中的write()或者print()方法括号中的代码* A0 B8 e/ H  H0 }( z8 w4 F

    . d/ N% ^# V5 W6 K2 a: j1 K+ H3 [- r) E' N 6 S& s4 v$ ~2 r! P2 k% `
    " v" @! K9 \+ t8 X. b/ @1 _
    描述Jsp页面的九个预定义变量的功能、用法、并示例! w8 h, e# h( ?  U! o2 v0 h
    request 与请求相关的HttpServletRequest对象; L# t; G( j- @0 b) |2 l, b

    " k0 U' B4 G( w+ o* Z, uresponse 与送回浏览器的响应相关的HttpServletResponse对象2 W& {3 ?! N4 ]6 u
    , f. m/ L( q1 s/ e8 l
    out 与响应的输出流相关的JspWriter对象
      w4 }( Y) m8 l8 F& X; ~
    ; j' @; S- }: J( r' t. `: z    session 与给定用户请求会话相关的HttpSession对象,该变量只在JSP页面参5 S' {. z( s1 q, c
    " A% k+ O1 G' I' g
    与一个HTTP会话时有意义
    # z6 c9 r3 T7 |, K
    ( O9 C- N0 c4 Q% C+ |9 U    application 用于Web应用的ServletContext对象
    - Y/ f& p0 x. q# S, d9 J( Q0 y6 U- m- l
    config 与该JSP页面的servlet相关的ServletConfig对象( D3 p: F" Q% z- t

    ; @# u8 t5 b9 d2 c( P; ]: tpageContext 该对象封装了一个JSP页面请求的环境
    ! T: `9 W2 x, z4 [2 V# J" c% a% N" X+ C, ]: v3 V
    page 该变量与Java编程语言中的this变量等价
    # R  i1 e! C# \& C7 c$ g# Q# X& [% h: R2 I# D/ L; Q
        exception 由其它JSP页面抛出的Throwable对象,该变量只在”JSP错误页面”中可用
    ) h% R4 h) G% c# {/ `" w! n* ~, A. l% Y* h2 w/ q& X3 O* }# l

    2 F+ |0 }4 J% G, o* g; s
    2 j: F3 Z/ V" ^  R. l$ lpage指令的功能,写法、并示例,并描述它的如下属性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding
      F2 v* i7 F; x+ q  B2 d2 n! Cimport import 定义了一组servlet类定义必须导入的类和包,值是一个由
    9 Q% w6 ]" w& N: J2 u8 `9 p1 P' |- k  U( j! ~
    逗号分隔的完全类名或包的列表。, T# F% l8 {) o0 O- k2 S6 S
    8 w; I+ G' F: t5 i2 u& }& F
    session session 定义JSP页面是否参与HTTP会话,值可以为true(缺省), P8 f* j  g; @$ q
    / |# P0 l' W1 j* R# g
    或false。
    0 q& G* E/ q! a  M) }& k. u2 ?- L& n3 X5 ?4 F" ~
    buffer buffer 定义用于输出流(JspWriter对象)的缓冲区大小,值可以为( ?% r/ [1 k( \( x; E
    * U+ n2 l8 Y, T# H
    none或Nkb,缺省为8KB或更大。9 E, l+ A, E1 C" r
    9 @" C$ N7 h4 }* ?
    errorPage 用来指定由另一个jsp页面来处理所有该页面抛出的异常
    0 k6 E6 I. a9 m& N" n* u: B% [( T) s6 `: A# z
    isErrorPage 定义JSP页面为其它JSP页面errorPage属性的目标,值为true或% y% A- e5 q  H' C: `) T$ J

    : k- X$ B, ^- [false(缺省)。( o/ _6 Q. l: i9 ~0 D
    , H: @7 ?$ J# ^( R$ w0 i
    ContentType 定义输出流的MIME类型,缺省为text/html。
    5 W/ w$ o& Y1 W
    ' e+ B; |" f+ S1 F( x( E& f( R* tpageEncoding 定义输出流的字符编码,缺省为ISO-8859-1
    8 e" f/ W0 r) n
    # P! Y4 n% D* L9 r; x- G
    : [3 R1 y* `0 N/ v  W( z8 u0 P2 Y
    描述MVC各部分的功能?MVC的优点?MVC的缺点?3 i' r( d* ~: m! Y9 g- i( Q& e
    MVC各部分的功能:0 A7 J  O7 C4 L* k. B$ N1 V: H5 e
    9 Q( F/ t3 _, ]" I% Y/ W4 w
    Model(模型表示企业数据和业务逻辑)
    ; S2 V9 E0 N" }7 P" }' M' L
    3 C! U( {- G' c8 F; j! V  x封装应用状态
    7 g0 Z" @5 [, ^( L. P: i: D  {& n, G2 P! r! [6 j3 \( q5 U
    响应状态查询  B& A' W* _7 e0 o, X0 y: u& [
    % h( ]3 ^1 R2 F- ?& w% T6 r. K
    暴露应用的功能- p  p+ U( o/ q* c

    + s8 r8 |/ A' L3 w, i; CController(控制器接受用户的输入并调用模型和视图去完成用户的需求)# a- p9 V5 [, X* l% z0 B) v% h

    * g2 O, l- @* k7 T* p) H验证HTTP请求的数据
    " a7 E5 e8 O9 [( s9 c) s( R2 m' Z8 h$ n4 ?' G8 x0 q7 e
    将用户数据与模型的更新相映射
    + M3 b$ W+ p# O; \
    / x( W3 l7 A" V选择用于响应的视图. j, F: D. Z. Q9 e8 u/ r

    3 s9 H6 r. h2 Q+ r$ _1 u0 k, d% bView(视图是用户看到并与之交互的界面)
    ! H# r- v1 F+ d& s, f( l3 Z0 f
    4 m6 L6 f  i/ `( v产生HTML响应* a: W  m3 }5 e/ V( h1 x

    : i/ b: O, ~. ?1 g请求模型的更新8 s: i$ J, {: v. P8 j$ L/ R! a
    ; S  h7 m( C! q9 ~/ y
    提供HTML form用于用户请求& k+ K$ _! O5 k/ `/ b& E% s/ @

    4 W3 w4 E% s. a7 k2 oMVC的优点:# t9 T/ @3 v1 u& u

    8 o0 i" Z& n  Z/ ~5 A        低耦合性:视图层和业务层分离" t' K; M& r( d' a: q/ r+ \1 d7 j
    + {+ F0 ~3 @4 L
    高重用性和可适用性
    7 z' s6 J% L( X% `( R1 S! b$ }4 y  l1 `
    ) `8 H6 @/ S& Y0 T' a  A6 Y较低的生命周期成本5 v+ Y3 Q) \: z5 m: C' o: p5 ]

    0 E6 a0 G4 t' E! A# u1 w0 F快速的部署
    7 [/ p+ L& Z' A# g, `
    / e& ?) O2 [+ Q6 e可维护性( O; l; A- L+ P6 C$ n

    * K8 Z1 I2 Z" U有利于软件工程化管理
    $ J- d8 r8 ]' m6 E
    6 @+ L- |8 S! ^4 a" W提高软件的健壮性8 S9 B8 z. i0 t7 q- j3 x

    ; E4 Y: ]3 f+ S- L. K8 Z4 nMVC的缺点:- R2 G' q0 `$ |6 \( b

    * T6 }& C4 k5 J, a  l, Z4 F4 R        工作量大,增加工作的复杂性,MVC不适合小型甚至中等规模的应用程序
    8 o1 Z5 Q$ p6 ]6 [% @2 y9 B- v6 H9 P. ?9 q4 \. U

    6 O  Y  |+ R! `- d$ Y! s
    . _: G- v6 Z7 q5 R9 I6 r% B* W1 X什么是Model 1结构,以及结构中各部分的功能$ p: A; |: ?: f/ w0 ?
    结构:jsp+javabean
    . S! h2 ]. [' v- d" p1 h
    1 P* `) Q" R8 n8 w$ U9 uModel1中使用jsp来处理web应用中的视图控制部分# P+ W7 @, m4 G! d& f
    / }) [1 q+ q6 N
    Javabean收集参数
    / J9 q4 V- @. y
    0 ?2 @: g$ B- [0 |! x' _* H" [8 D 5 a8 m1 G5 _  d. r. t6 s

    - p5 b: g. T3 W1 }5 ~* C( P1 X, M什么是JavaBean?
    9 R, m! y' d' |  c3 c; d3 C用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。
    1 y( G4 F* d# ~; e. O7 n* F( d- O- z2 {, g: [/ c5 R9 U

    % p# g+ O) W# D3 B, u- }# x# q
    7 [0 f5 ~4 O9 E+ X+ vJavaBean的规则?8 k+ p0 ?& z# b; M% e. \
    使用get和set方法定义属性. N" h/ @- U, j! ^1 E: A, ?% j

    7 l, P6 D6 K& E6 {, R3 A& u0 }一个无参构造方法
    9 R# ~" w! J! i' i# g# j6 f
    4 }+ h4 W1 O. t1 Y0 F/ E; @1 y无public实例变量( 所有属性私有化)
    * U0 O$ A! T) L1 w$ v% D4 H( I, O  Q4 z. o
    2 i5 m$ y7 B) i1 E8 z. S( I

    & B# |# w" w% K& g% G什么是jsp标准动作?包含那些?分别都是什么功能?如何使用?$ e+ k7 v1 J% h# L4 _0 _6 n
    JSP页面中使用类似于XML的标记表示运行时的动作8 f+ e; p3 ]0 G8 z6 j7 O

    ( i) W* @, l9 ujsp:useBean
    9 E1 {4 r% A# @8 h
    5 o$ i# y; M0 x/ A- Q4 c8 E0 |jsp:setProperty+ X5 \9 {( Z. [
    ! F! w$ \  A2 x5 A, T
    jsp:getProperty
    6 w5 f+ L4 k* s+ K- ~
    3 d* w3 c0 }, z) T$ R& {jsp:param( u% j) C  ?; ^4 g- g6 S- x8 {6 ]  f

    & r0 O0 V: H( l. N5 B2 G, g4 S+ |jsp:include
    2 A8 V( C9 Z. U$ d2 E" o. W- p' l7 [- B+ I
    jsp:forward4 }# b" C" N; i6 Q5 T- D) C$ S

    / h: F' D  R7 F) h 7 }9 |8 H0 e' [2 }  k

    : y4 I) j* e5 O; [5 W用代码示例如下标准动作的使用:useBean、getProperty、setProperty; Y% p( V2 c* t# Z  x: Y( A: Q# e
    <jsp:useBean
    , C6 s8 N& b0 K8 y* p
    $ `; J" Q3 ~% ^  oid=”myForms”; O$ k1 Q6 H; R
    1 c/ `- z+ ~2 U
    class=”com.base.mystruts.forms.MyActionForm” scope=”session” />
    ( \% Y: q- ~# B( R" ]8 {! x& m
    2 C3 D+ @9 e6 Z3 H    <jsp:setProperty name=”myForms” property=”name” />
    $ `2 G# n  u0 W- u; e- C* R4 s5 J+ t- y- F* R' r
    <jsp:getProperty name=”myForms” property=”id” />0 ]" d$ h7 R; y( o- K' h! X5 A

    3 ~! F+ h; T8 x9 |; M
    3 v/ x* Z- G+ i
    9 m/ d8 c( V3 P: _+ t. C+ r) p2 ~描述说明Bean的四种scope! m6 p' {; E" G2 C
    page5 J4 Z! [, _: }5 @/ ?; L
    2 c4 G3 t8 ]8 R. @9 K; [6 H8 b
    request
    4 s: c& Q* A4 k3 O' B4 _
    ) h* t% C- E& z2 v$ j( m1 Csession$ S, D( X% H7 q- S

    ) J5 E' }# e8 U2 [6 f* Fapplication
    7 R5 Y. ?( b- t% c) R) K% v
    5 D' @$ d" l5 E/ e) B5 t4 T  ], ] ' b6 B* [: J8 }3 s
    " I9 C/ [2 @; F( L/ X% R9 v. @! A
    描述说明页面上的字段和Bean中属性的对应规则
    3 Y. e# l' G5 x$ fid 指javabean的变量名6 v3 r& T+ t8 K5 W6 H& R1 y: D

    , A  Q! Q8 M' }: l- Mclass指javabean类的全路径  ]# G' j/ I) ~( ~( c# ?
    2 ~2 K! }) }6 D* d! N
    scope指javabean的应用范围
    # s& R" K' {" [* A6 n0 x7 m8 X. W* `. x+ N. W  O
    name指所用到的javabean的变量名# A, H9 ?4 |- x  w; T7 ]
    ! U7 T2 ^0 O4 e
        property指javabean中的属性# w; a. b+ }1 K0 C% Q1 w+ o9 R9 G

    $ J3 B; y  E, V
    % q5 L/ z9 B6 b- z# K
    4 v, T. b  K) N3 o: P4 @描述useBean动作的处理过程
    0 L5 t2 I; i, ]: `6 `+ G* p& O6 I使用id声明变量
    $ w7 T, V5 ?" _' g& _; ~( E
    ( i- Q5 \9 |6 {* c# `5 P4 p0 ]试图在指定的范围内查找对象
    1 x. J% D3 O9 w9 ~& h* ~
    : q4 l! K4 Q$ _" k如果没找到
    $ W$ M& a( ^$ t! |& `) P/ `
    1 d; r. x' O3 }; z! w8 g, g4 ^创建一个类的实例
      T& J( o- M" E# K; D/ Z1 F
    4 W) |) ~6 x: l; k2 v执行useBean标记体初始化对象
    - C' L! {( B9 E) y( }3 \3 ]! i9 l$ k2 m: u0 M' w
    如果找到
    2 S1 M7 e- z! T+ [2 c+ C
    & B  R0 I; i; j! z+ D& u     将对象转换为类指定的类型
    5 j3 L& ]2 d7 g3 h- H3 s5 r
    9 i6 @8 S7 L6 ^- C3 l0 i : e7 o' Z( N% J& |

    1 Y0 I6 b; _. |- f4 H描述forward动作的功能8 z0 t9 D, K% t  ^% X8 @' T
    使用脚本代码处理请求时,可用jsp:forward 动作产生一个不同的视图,. f$ `; d) q8 V2 E9 k
    $ s3 A0 ^" v% {0 M" z' J9 Q9 h
    使用同一个request:
    ' K9 ~. m) s" E' l* Z1 x& s. A8 z- Z5 G& b1 S* F, i
    , L, N; Z4 M- o  c& q
      q$ f) {9 c6 P& q; k
    什么是Model 2结构,以及结构中各部分的功能: p; s# z# K) ^# A- J
    jsp+model+servlet+ A, V$ i9 a7 C4 L

    & W1 `& D7 i/ b5 e( [0 E: wModel 2架构使用MVC模式,JSP页面充当视图,Servlet充当控制器0 b9 g* L. u3 P! ^7 k% R+ E7 H/ p

    & g+ S7 I- }9 c: y" QServlet控制器:
    # g' e8 Q+ P) m/ \7 ^" h( G% o: K! S6 _( J
    验证HTML form数据# C7 p3 M& K7 J/ ^0 x

    ; a! \. M. n: w" a- A/ T" L' c调用模型中的业务服务
    , K5 W3 G- m! z6 E' Y9 C" i" U6 ~  |# [5 A* ~' M
    存储请求(或会话)范围内的域对象% V! n+ V* D* D2 F0 `
    ; Z7 Q- B  R4 y" W4 r/ i
    选择下一个用户的视图* T. p0 B. u3 j. ^! T
    # M4 L8 |4 }5 q: f2 P5 d
    JSP页面视图:& h3 i1 w4 b& `* O6 i0 B

    8 \4 G0 z/ S& y& e  d* U. k- R使用用户界面(在HTML中)5 s! ?, e+ C4 T1 f# |9 f7 Z" s0 y, T
      E3 m3 n+ h5 Y7 o6 I) k
            访问域对象" C: C9 B1 @. Q# f6 i. r  Q* o! [( S/ r
    ( e- c% j7 Q) y
    5 ]; ]3 W& f+ p
    8 B% K( }/ g7 z4 f5 ]
    如何获得分发器?分发器的功能?
    8 }3 e6 h  C# f" I上下文对象中的分发器:) z' K. N; U& u' S6 B) V$ A% r4 N4 h

    7 M! L; b0 M4 @$ SServletContext context = this.getServletContext();
    # i' d2 s- ]8 h9 L+ I( ?2 P' j% E! Y! a  L( ~( d' [
    RequestDispatcher servlet = context.getNamedDispatcher(“MyServlet”);
    - w8 @% D+ _9 ~6 g/ }
    5 ?8 ?% i7 k3 Y( R4 S' n! @, sservlet.forward(request, response);0 p3 P1 i+ d9 }. @
    $ G& H6 C5 h. W0 Z, A
    请求对象中的分发器:! g; r: T1 n* N( U7 p! l& d
    / u) U5 J4 z$ X; H
    RequestDispatcher view = request.getRequestDispatcher(“tools/nails.jsp”);
    , j( {1 H6 }2 r4 H5 H: c
    % V( M3 X. O3 t& Bview.forward(request, response);
    3 |( B- |8 {3 i# k# N% z' k& @! u2 Z( Z) |
    可以将请求转发到另一个jsp页面,并保持请求的传递性
    , M" C# X& g4 Z; J+ X( I9 G7 b$ O) `/ W7 U
    3 X" s2 E9 k! l! c( m
    ) x1 O, N# n$ A1 X* Q, H/ d
    Jsp中页面跳转的两种方式?% U3 d; m8 s5 }: \, `1 {
    使用分发器跳转页面& s! I! d& P- G( F' e8 S
    RequestDispatcher dispatcher = request.getRequestDispatcher(“url”);
    1 }6 M( Y6 C5 F2 B, S& o8 _' H. y- A- g0 N! M+ ~+ a+ t2 k* K
    dispatcher.forword(request);
    # _) u( b' X, i2 ^* n1 Q; x
    # |* `0 W; f& `, j1 i. J7 N    特点:保持请求的传递(上一次请求中的数据,在下一个请求中仍然可以得到);
    4 s, P1 G/ [2 y7 `) P& r' w4 M6 m6 A
    0 |7 A- D! e' J& |1 v6 y) ?9 c        转发的页面只能是同一个Web应用程序的其他Web组件# N8 P/ Z  f$ m, q( ^
    - w, F% y% B2 b0 b  H- D
    使用重定向跳转页面+ N$ @% }* o  w9 d* {; S+ C; c9 P% R
    response.sendRedirect(“url”);% V" {& H9 M+ S% ^% ]3 U

    ' g$ K! Q8 u( E! f    特点:产生全新的请求,(上一次请求中的数据,在下一个请求中不能得到);; @3 J4 w& U- J! u5 `" _$ y# k' F: ?
    ) o+ q8 j% ?7 e* D" D
            重新定向的页面可以是任意的URL
    3 ]$ @6 P/ \3 j" g/ n
    9 L/ Y+ ^& H" l1 k- f+ m0 Q
    ( r6 c# a0 l- S# k/ |  {' ?, r. p4 W' Z4 g
    描述Jsp中引入另外页面的两种方法,并比较两种方法的特点?
    6 H& d' S& `( Y4 G& ~$ \1 M6 w% B5 J<%@ include file=””%> 在编译期间把另一个页面完全嵌入这个页面,可以说是一个页面- W0 i, a9 K# ^. {5 g- O" a3 r

    % l/ V$ T$ A( ]$ _4 C. l在这里可以共享变量$ u/ G0 t2 o; \0 j

    0 n. Z2 l, L3 m' D8 q" x<jsp:include page=””> 动态的再运行期间把另一个页面加入这个页面,可以说是两个
    : Y! B( ]1 I8 }) G- k: P9 q% l- K. f
    页面,不可以共享变量9 V- s5 Z, y" G6 ?5 _: G

    ) u6 W5 R' L- R7 ~; V4 _( Q4 @+ \! R
    ( G' i- @" L4 }. t' `( V+ c; z: A5 S" j  ^. z' J* d
    什么是自定义标记# z$ \5 F, W3 z0 X( K. W" U
    自定义标记库是一个Web组件,
    8 H% Y! f& g, q4 |6 k1 r; h7 G& {
    包括:
    ' p, Z& z  j4 D
    ' `1 ]" W  I4 J$ ]" r! j% N一个标记库描述符文件(*.tld)( u/ \, S3 g7 |( {9 R: I

    4 l3 ~$ d3 K3 ~, o; |/ ]1 {所有相关的标记处理器类(*.jar)3 \% g* l2 ~7 l0 D
    % ?3 V6 u1 f! d4 a/ m. j0 `& k8 L$ m0 E
    7 ~$ a6 a. C( H2 e. y4 e3 Q( K

    2 K: n2 G1 U5 o" A: q描述使用自定义标记的步骤,以及每步详细的工作: T) Z! }, s. R% x9 D' ~
    使用自定义标记前,要拿到.tld和.jar两类文件6 J1 L. D- `$ _" ~0 s: ^
    & r1 P  q5 ^) |9 M8 J
    把.jar文件放到WEB-INF的lib里面。6 d, p* C8 \0 u4 w6 v
    把.tld文件放到WEB-INF根目录下。4 J" x% D; F* T% j0 O, [
    在web.xml中配置。  t: [' N- u. @. d
    <taglib>' Y+ h( z" {, B7 o* W

    # D. Y' Z' \( B<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>! J% T  b! |" J3 _' b' c! j0 f
    , R# H' \0 j8 {  H- a
         <taglib-location>/WEB-INF/c.tld</taglib-location>) ^( D# [& W; Q" `

    " b  z+ I7 _/ [; v& @3 g</taglib>
    , Z2 S( y5 y6 b7 U3 v3 a" l' w0 E! e# e6 c$ Z
    在页面中引用。  P- `. ]0 A7 _, G1 T, ~: Q
    <%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“s”%>
    2 N4 O, {# S) Z- r
    2 Y- h" Z( t, k4 n/ Xuri必须与web.xml中的uri对应
    ! Z: G) F* M! P6 Y  V  F! \
    " D7 C+ I3 i" O7 kprefix是前缀,用来区分是哪一个taglib
    / u/ Z" J) `2 s4 L* @: K$ ]* f8 h3 O, Z0 O
    使用标记
      }7 w' N  O3 ]8 v格式:<prefix:tag名称 属性>* O: L$ y( @  ~( E* f

    : b+ n5 t' S" V2 p$ m/ O<s:forEach >
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    14#
    发表于 2014-12-03 12:45:59 |只看该作者
    在tomcat下配置数据源
    5 p2 l3 w9 T- r1 s8 d. h1、服务器与数据库的连接' x! n8 M: h) }8 H6 w2 l, b
    % e, }" n  S- |4 L
    配置server.xml文件) Z8 M/ Y. ~" \6 s( D" z& q5 v

    / O6 z" B; c2 T+ v" P1.oracle8 |; ^. F) C3 q. Q

    # O- ?# P8 C! e0 T1 r: L' Y<Resource name=”jdbc/company” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”: D, a1 N0 o* F0 [

    3 e; P" u2 R% L) Q# D# K                        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”
    : i; n( d) g, T- Y+ Z3 i2 H& E; P
    url=”jdbcracle:thin127.0.0.1:1521rcl”
    & z. A$ k6 @# ^7 G6 `, W8 Z# Y. }2 u
    driverClassName=”oracle.jdbc.driver.OracleDriver”0 t9 N1 A2 m! z- T& ?# k7 R
    ' N/ h, O' R- |6 z  j1 O
    username=”aa”( F6 i3 Y! k, e% p3 _

    / H: h, F9 Q2 |, ppassword=”aa”3 h% q% x  X4 s$ H- ?- [4 \- a! E) {
    , ^/ k& _8 d, y) {
    maxActive=”50″1 X2 t2 d3 l) p9 v% c9 X" t
    2 @3 e+ }: a1 |+ d9 B
    maxIdle=”10″+ Z- M8 ]; v7 l
    2 U/ b, o  y( b1 H2 g
    maxWait=”-1″$ `" w1 k5 y& V6 n* X) o

    4 y2 \: J" V' ^5 L4 h7 r/>
    ! [2 B  J$ M/ i! Y; W$ ]( \* L6 J
    9 V% z6 L" @; [. x- d: W2.sqlserver# n4 u0 S) n: g

    $ Q0 i. c8 I9 _3 K% U<Resource name=”jdbc/webpage” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”, [6 ~( C0 [' s- }

    0 P$ i5 n# I: N/ N  c* q        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”+ \+ T9 e" P, i$ @# a( B

    . D" {+ o1 p) {$ l& X" z% {9 uurl=”jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;
    & J. c+ T% B- D
    0 b" y( n: M; b  o  n) q1 nDatabaseName=webpagetest”) L! s: t. I5 }5 e4 |
    ; j: O0 H$ N5 x8 p0 L
    driverClassName=”net.sourceforge.jtds.jdbc.Driver”9 s7 A3 P+ e, o: ]

    ; V  y) O( h- a/ G9 F1 n% q  w% B4 Jusername=”aa”
    ' S0 h6 h* j( |# d) P; Q$ G/ D( {* Y8 ]5 q% o5 ~1 }+ A$ J
    password=”aa”4 O0 k) t8 d3 c; z+ l
    : N( c& i+ m" N
    maxActive=”50″
    # Y( O; f+ @, Y- Q) Y  [# g: C9 m) y0 k: ]4 q: T; \
    maxIdle=”10″% A; U$ j: e' Y/ D1 V: g) v2 F6 u) o

    8 m8 Z' ^) r6 e! I" QmaxWait=”-1″3 H6 F, L- U+ s2 e' g6 g

    2 g5 Q' s( V" T/>- f! N3 e1 e8 a& I: i
    : m1 r/ g3 F4 r
    2、配置自己的web应用的xml文件% x5 P, j( g$ U' q1 J1 i
    5 V( A) M. v* u' h
    " ?( m# v8 J3 D& ~9 p

    # V7 d* g0 e6 O; t<Context path=”/eb03web” docBase=”F:/workweb/eb03web”
    7 ]4 e  H( i1 b8 N, C/ C- W' d- B3 q
    ! K9 K! s+ a1 q) z2 r6 h( _( Zprivileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>( ~  G5 T+ F8 W
    ' t- H8 Q9 e8 v8 T6 S
    <ResourceLink global=”jdbc/company” name=”jdbc/company” type=”javax.sql.DataSource”/>
    4 K4 z7 O0 [% k+ _. J7 g4 J3 o9 a# A( i9 ^
    </Context>5 g: O& i2 K1 ]- ?6 b

    , O  _+ Y5 C% m! g3 N
    : W/ o& X9 z3 }* c- z: @# Z: \- a( E9 d, U  ]1 t
    3、配置web.xml文件+ L% Q6 N! d! k/ q$ t  _

    / x5 b( G# M" G$ l与服务器建立连接5 d4 s. ~( F4 A$ \  n) V
    % c8 {* p& q$ ^' \( }
    <resource-ref>
      @8 B2 B: S5 y8 I  C# h* X3 _- w0 V+ G3 a4 [& h# O
    <res-ref-name>jdbc/company</res-ref-name>
    . Z$ P$ ?3 ~. e6 j) U0 u( G2 e' X" D# ?7 H3 E7 [& K0 N/ [
    <res-type>javax.sql.DataSource</res-type>! ~( y" r6 a& B- w, [' f  F/ J
    5 g/ }7 E) `  {/ ?8 d
    <res-auth>Container</res-auth>
    3 h- ?5 y- {) ~2 @6 b# k3 E5 [$ U% i9 J; @1 d5 V# ]0 q: ^
    </resource-ref>( D, H1 j* e0 z: i4 ?5 R
    0 B7 l2 B& [0 Q5 |5 [( |# R* B; B
    4、在应用程序中不直接与数据库连接,通过DataSource连接池建立连接. `% g+ b0 D7 q6 r

    0 y# U* B0 m1 I//1.在程序单独用时设置系统的属性,在tomcat下可以不用配置,9 l$ ?5 c# v7 ^4 O0 e( V3 f
    4 o& f2 w8 w( w& M
    System.setProperty(Context.PROVIDER_URL,””);8 j7 X9 v+ M+ n: y/ v, C

    * H* i% n' E5 v7 MSystem.setProperty(Context.INITIAL_CONTEXT_FACTORY,””);
    - y8 q+ `7 f( l
    . j' k) |$ m7 u0 N//2.创建一个上下文对象
    & U' s) R2 l# C0 K" E7 Y) W' o+ s# U, [- x& ~$ Z
    InitialContext context = new InitialContext();
    - T  z. Z5 h0 x+ F+ h1 Z5 T' {8 l) k  ^' R
    //3.通过上下文对象在连接池中查找DataSource3 k9 n5 W5 t( x/ T% j$ ]7 P4 P
    + G/ c! J  w; a: |( P
    DataSource ds = (DataSource)context.lookUp(“java:comp/env/jdbc/company”);
    : e1 _/ S  H, Y) _7 g+ j
    ( e3 `! U% V9 J$ M4 A//4.通过数据源建立连接" H7 F9 d; |( a! d2 H! t
    + x: r; _5 a. E2 |
    ds.getConnection();
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    15#
    发表于 2014-12-03 12:46:30 |只看该作者
    ORM对象关系型数据库映射
    ; ?4 c* T0 S, \1 r& q(Object Relation Mapping)
    ; w5 J9 y5 M; a& ~4 b6 G: J2 w/ H4 ]; Y
    一、映射的特点
    / p1 t1 W% S9 T" Y
    5 _, B) c: ?) X/ \8 j" v1.一个对象可以对应多个表
    3 M: Q+ ?( U7 Z( W! p' \. {
    & \( G% J& Q: i, O: w5 z2.一个表可以对应多个对象/ W9 Z+ k& m" L& v8 d$ S9 s

    - g8 x( T2 H/ T- z; ^- T6 d3.对象和表的关系不用完全对应
    5 I' e! q' h/ m0 U! U8 k1 m/ x' l5 K" d
    4.对象的属性的名称和表字段的名称可以不同
    7 |8 c9 ?1 C! ~& S
    ( m' H- i; Y$ F+ t" }5.类型可以不同,但数据类型之间可以转换, s6 g& o5 j- G1 X0 I7 g8 ~

    : j4 H$ g2 k. @  l+ i2 s3 ]! ?5 W6.对象中必须有主键,数据库的表对主键无所谓8 j6 t, \7 E# K4 u& b
    5 z5 D1 R; u$ ^0 E1 m. x% H* p
    7.数据库中有主外键关系时,对象中可以有,也可以没有
    " ~! Y7 ]6 P, P3 E0 J" c" [( B4 d, ?* ~# b9 h  q5 o

      u9 v, F, e$ x  r4 u/ B5 o# F& _9 w3 c. H
    二 、有一个映射的描述文件————>xml  n5 L3 _& d/ e: I: |) t
    . E- L, e& n: O6 b9 D* b
    三 、怎样实现描述文件————>一段程序; ^4 N7 \) S6 y% A2 F) f
    # ~3 Y$ A4 o4 O" Z# j6 m" O& B( j' e
    对象 映射(mapping) 数据库
    : Q7 P# i( T. g# W+ D9 }
    : D  h' }5 e" u; n# Euser- ?) x1 ~! S% B1 {) p6 q, T1 i# f

    & q3 l; w9 H, R7 a5 aid=11
    * T. e# ]: f" {0 i( f3 q* Y3 U* k0 s7 @" y
    name=”张三”———— > (1) —————> tbl_user(id,name,age,tel,address)" a8 O) \2 v: C

    + c3 p$ v0 e: Z9 {; Bage=25 <————(2) <————
    6 J# T" o/ M+ G1 _
    5 R" m$ @5 W# Y) d' x( z
    9 B/ j  s3 K! U8 {6 L( M0 k7 A5 \* X1 |: f: q
    (1)从对象映射到数据库/ i  m, C' P" H9 |2 y7 }

    4 r3 X' y+ c4 t$ ?1.JDBC- l- e2 F0 p+ A- B) Y# V

    + n# u) |6 B8 S  w' Z  W. F2.根据描述文件来动态拼接sql
    % Y' u+ o% a6 |1 V7 h& K. X
    6 D$ g: }/ }5 D* t3.执行,添加到数据库中
    % ~  {4 J+ l1 l
    8 k* o# |; |+ c' P6 S # g6 n1 U6 T7 }. |3 @
    6 q, ~  [) V# U1 [3 `% ]1 Q( g8 H' o
    (2)从数据库中映射到对象
    ! J; L/ _( A6 s1 I# ?2 P+ U/ K7 \, t. J1 a
    1.JDBC& R! E" G0 c: G: l

    % l: |/ ?8 _. K$ K3 M, e2.拼接查询sql. D4 l/ J1 k. |/ Y. r0 M4 {
    / R6 \. j" M/ n( ~- y1 F- g
    3.ResultSet- x) l( @( T/ Y& d

    ) _! g6 N$ M, ~, _+ N4.Model * h+ z! Q- b0 x  k

    7 J9 }" g  D' d, o% G# E5 j& w
    1 [) ?) T+ E, I# u; o  Y( n) l1 R+ |3 P* x$ b( Z7 c
    hibernate9 E1 ]$ B0 I, \+ F; v, v8 Z
    开发流程:
    ! V+ N5 T# P5 z( d+ W- Q  N9 W4 }% K4 W! h3 G  ?, f
    是什么?
    + [7 N3 `  D+ {hibernate是一种基于orm 的轻量级的框架
    : r( l0 M. z" f: `! h
    % D$ }. b2 _6 ^# _, B & L# s/ Y& r8 C; P

    . H3 a5 L; Q8 B有什么?
    ! b+ b/ G& k, h7 D1. session 保持连接状态(依赖事务和连接池)
    : W( D1 g5 k9 H5 e( M- k" u: ]% E# o" P
    2. Transaction事务
    . _  Y; ?4 m3 v) p# d! a# y
    - @) S8 E( y& z, c0 N3.
    8 t" p" g" ?9 n+ H. ~2 VConnection Provider 连接池
    # ~9 l9 I. |8 M( {
    , A! Q' V0 g& J8 t. q8 v
    * v. U9 j; L9 p+ @" n, j6 l
    2 _4 }5 c& b- K, y能干什么?4 u! h" h. y8 M# ]* M+ o
    1.orm& \/ H* G% B8 x9 Z6 ]  @! s" N
    : L% V/ w/ m! \
    2.提供操作数据库的接口,简化数据持久化的编程任务( U  Z8 p/ l! G2 m& a
    . }4 ^) N2 z' C  y

    9 q) Y2 U0 x0 F! d3 e' N. Z) Q1 x9 @" G/ l: [" S2 r4 v
    怎么做?
    4 o! U: Z! `5 Q; p+ g& x1.搭建hibernate的运行环境,将hibernate的包和hibernate所需要的包拷贝到lib 文件夹下
    " r# U& `) \- i8 |3 m
    " l  B+ V1 z4 e' [, P0 Z* Y9 x6 Z2.O(vo)! a& I) R7 U: @5 V

    - C" G+ R; Q$ ^) }% s) w3.R (关系型数据库中的表)& _% u* o9 p: T& K7 [  q( q

    1 ^0 P/ `- h0 z  v' Z4.配置文件7 _- D+ ^) a0 W) ]% \( K

    ! x+ Q+ \9 L/ {) }3 ?4.1 cfg.xml 放在classes根目录下,默认名字为hibernate.cfg.xml
    - o$ b4 J: F- w; v+ M* {& h3 J' ?0 h2 v4 @. T5 n& n
    a.与数据库的连接
    % C$ `5 n4 C% `8 Y; p/ v+ i5 l  r; M
    b.可选配置
    4 }1 T( \% j0 }/ e& g: Y  b+ {. Y6 H9 I, U2 d  t9 f
    c.映射资源的注册+ w3 r: }- V3 U" L* J% h% {$ v" j
    7 t/ K$ \4 \2 O$ {+ y  {  b1 c
    4.2 hbm.xml文件 名字与类名相同 并且与类放在一起
    3 |2 M& e2 u6 A8 x, `3 Z9 I9 l7 K  B
    4 ~6 K4 p' Z8 J( qa. 对象与数据库表之间的映射
    , O# D+ n0 _/ J4 u
    ( }' g7 h" O, r, sb. 对象的属性与数据库表的字段之间的映射8 _# u+ x% D& o: A# r9 t

    9 V& W( O9 ~" \9 |5 y+ k/ a4 @) Kc.组件之间的映射
    ' d' @& e# ^/ g  G6 d' ?/ s8 q2 A' [4 h/ l1 X
    d.对象与对象之间的关系映射/ H% A7 o' n* w5 S- P% `
    . q0 @5 T: b% E# I( b* c& I
    5、客户端
    , I# {7 |: m5 T0 E7 v% s0 a. T! r; ~! o4 T' B& q5 i
    1.得到SessionFactory
    ; U$ _1 Y  Y  Z- g. a% u; B  t  V- U) Z% W/ ^
    2.通过SessionFactory 工厂来创建Session实例( {# ^+ [0 n2 c

    ( u% e* }# `% f- ~: n, }3.打开事务
    & R2 H0 D. a8 i8 d1 D' @4 o* Q/ `5 m2 [. h  g
    4.操作数据库
    & r3 g* Z6 S  c$ k; L. N5 V, k# \1 W9 t& v3 c( L, i9 u" e0 z
    5.事务提交
    " b9 H" Z3 a4 ?9 B; r* B# i  b/ n! F. ?" y6 Q
    6.关闭连接
    $ R2 }8 o9 x, f. {; f3 d4 h! }3 ^% D- I
    运行流程:
    ) ]( a' b' L3 \" B. q2 K
    + g8 k, l- h9 p整体流程
      z) M) Z4 k  i* _  M' A1.通过configuration来读cfg.xml文件! v) k$ f& j9 k; @: z. l! Q
    $ [) X* d$ h$ S. x" T6 D
    2.得到SessionFactory 工厂(根据数据库的连接来创建sessionfactory)! f9 s" F! [' N

    / o( Z2 E/ g  D  `: k8 d9 N1 N3.通过SessionFactory 工厂来创建Session实例
    0 |7 G' q! z9 L) ?1 g5 [/ @# I) n0 c2 F) M% Z
    4.打开事务
    % @. k, Z) z; ^1 T% I2 O! k: C- w3 [5 V1 y) ~
    5.通过session的api操作数据库
    : j" S# _/ F3 @, t: L" }" Q! _
    6 e2 w3 F* S, v# F) j7 p3 Z6.事务提交
    ) ^0 r  d/ \4 d$ A
    ; `: j7 _" q2 _( B7.关闭连接
      W" @/ s6 A, Q2 h" s3 {: c5 s& ^/ p) d) [! t/ O) o

    : v8 \6 P2 Q& r2 T- I( D
    9 x( ?/ U' K& {. ]5 z: fsave/ r6 F) u3 V3 I% C0 D1 X( m
    1.to—>po* ?( Z; I% {7 s; m
      V% t' w- `3 o; ^* ~
    2.根据model和cfg.xml中映射文件的注册来找到hbm.xml文件# Z0 H7 W) d: x; v6 W' h

    & A- G! @" w' {* ^3.根据hbm.xml文件和model来动态的拼sql7 Y* x% G2 r" T2 I7 I1 [) h" u
    # J3 t6 R" |. Z0 W+ s# U: _" f" E
    4.客户端提交或者刷新内存  F  k6 A$ U7 T2 d! V4 B

    ' m6 G. Y' E1 g* n" w9 [5.执行sql,值放到数据库8 H/ I, o' A2 N) k9 Z9 t$ T

    ! V- g: N0 }! w- T0 ?" S % d& \  T" v: m! O& u( L! d

    $ |" G0 S" I; ^update、delete
    / v" e0 ~' `& s* }, [1 t1.根据model 的id在内存hibernate的缓存中查找该对象
    2 {/ o8 q# a  _( C* w) I  D4 d, s* ]) A: F9 M( V
    如果内存中没有就到数据库中查找来保证对象的存在
    2 t5 n: u) i7 s' E
    - C0 @& {5 X, u- o- D2.根据model和cfg.xml文件中映射文件的注册来找到hbm.xml文件# g( H4 e3 C3 \( T, h
    ! Z+ z1 a$ Z7 V6 B7 z/ F2 |6 V; H* I3 W
    3.根据model和hbm.xml 文件来动态拼sql
    4 x0 B! s% M# r1 g. B
    # L" E) I6 D' c5 l- ~1 C4.客户端提交或者刷新内存) V" _* x- E/ p( ?
    5 ^8 u/ ^, }3 \( Z9 [
    5.执行sql, Y& K9 k$ J( j  z5 `! f- K7 z1 H
    % D! Y& k7 a& E+ H; ^3 z
    : k, m6 l1 f# f) i9 d
    5 L* ~+ n! d& x( Y
    Query% X) z7 e  y+ m5 G
    load. X0 \( e( V* l8 ^) k

    " j- D* e1 A9 Z9 W/ s1.根据model的类型来找到hbm.xml文件! a% Y- C1 _/ v8 r3 j$ Z

    9 k% c" m9 T- ~2 ~: D' V, K/ e* b2.判断id对应的对象在缓存中是否存在,如果存在,就直接使用,如果不存在就进行下一步。
    * t* G1 z4 b! ^
    - f/ P! `8 M) K- b& N1 i3.用id做为查询条件来动态拼sql
    6 U/ n$ v! e* D" {9 P) g& {
    4 P- A+ T( y; f0 f" p! Y& u7 @8 G4.执行sql 查询(先在内存中查找,如果没有找到(会抛出例外),就去数据库中查找)7 P2 `! {3 \, Y) V; C) s
    ( g) b1 K* g9 b, e
    5.返回一个model类型的对象
    * U4 l1 d6 A" E+ L
    & u. H2 |8 G. G: o% B# Aget4 X' _+ b1 e5 Z" M7 X

    # x+ h4 M0 B: [/ E# m! F    1.根据model的类型来找到hbm.xml文件: d# Q4 ]& [* `: B4 M0 O
    2 u5 N5 C. U! U- s, E
    2.用id做为查询条件来动态拼sql
    5 m$ }; E* k4 e8 F" p% z. f
    . F  p8 s. V( H3.执行sql 直接在数据库中查找,如果没有查到就会返回null- \3 _+ c' h* w, T  T& V2 j" M
    ! m6 v/ |0 c/ G" @' H
    query0 J0 J4 j* e7 c
    ; L+ m- |5 X' g! K" D, X, X2 L" E- n
    1.分析hql语句,得到model的类型1 k; H) L/ k4 a: G; w1 X
    + a+ p7 \& E2 i% K, @. P
    2.根据moedel和cfg.xml文件中映射文件的注册找到hbm.xml文件
    5 l7 F( N8 U: N- S* U! K
    7 E. {. T5 }# T- X3.根据model和hbm.xml文件来动态拼sql
    % n" ~% W+ o0 n1 u/ @
    2 a( ]2 ]% q9 T5 X: A# ^) ^4.执行sql查询数据库. L4 j9 r( o! c2 h& Z- W
    2 M+ k7 H' ?  j
    5.返回一个resultset
    # o8 w) o9 ^% r) ^" ]) v
    + Y; l7 ]2 E4 L6.循环resultset的值,放到model中在放到集合(List)中/ J5 ]. [( n  p* L
    * e% B3 w: f5 E& |/ F- p( [

    / ?. X' J0 ^9 b" ]% _2 Q  k7 ^$ A1 E, m3 U$ o5 y: u- u: Q7 Z5 q
    谈谈hibernate缓存机制- R- W( L" O) I! {* X. }8 C& x

    4 {/ @2 ~4 @8 n4 H缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了。打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去数据库中取,也省了很多事。
    9 d+ H" J) X# e# d' R9 G' ~  T" @1 [3 p6 i/ H% i  g5 q' `+ ]

    4 q) E& B! _  f, a: U- t* \1 ~2 l3 c5 s' Z9 w
    hibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。3 n8 r! l2 e9 U* I
    . a4 w, a6 b7 f; x$ `0 o
    . L; j/ h3 ]0 t6 H, F" V
    7 a& y) f' u% f
    对一级缓存中的session事务进行数据的预存取,数据在各个session的上下文中存在(单例),当session关闭时,就是session.close( ),整个所有session范围内的数据全部清空;二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二级缓存只有一个区域 ,画个图比较容易理解。# N. r* _* _, j5 ?+ V: [' U
    9 R9 F6 o( E! O6 h7 K" C! }
    + {  D; V  _7 \- P1 v$ y9 r9 F

    + n& S6 P9 ]7 E; B  x0 X% _& R) B| 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|' H' t$ I" D9 `! L2 |$ z# ]7 b! k

    3 |) Y: y1 O: w- y; N  ~& y+ y| | | |
    , `9 g9 }( i% x* ]0 ]2 Q" h  c+ E: r
    2 M% ~5 I5 }! \7 `" S/ N; w) C3 w| | | |
    4 }3 {+ D, F+ p* y0 \
      G( G9 Z! M( w5 U—————————————————————————————————$ Z& A3 V! U" [1 p2 W% `. u
    + T1 c" F" u6 y
    sessionFactroy级别的二级缓存
    % O3 j- G( c% ^% a7 _: A  Z% l8 p. N7 o2 P$ w5 v( P8 U2 c
    ——————————————————————————————————————-8 K! S! ?: M+ {4 @* Z' n3 L2 s
    9 k2 ], l# v; N, m
    |4 ?- g3 @! l0 q. J* G
    ' o0 z+ K2 D$ g, f4 o7 G! P
    |4 g5 O8 \( u% T1 J6 g

    " J! l8 p" T9 C  s4 a|: y- f5 W# o" h% T' |
    , E7 ]; t& g4 @! U+ [4 @
    ——————————————————————————————————————0 t% B# e1 G1 f$ P
    & p% ~$ R  a3 l# w8 R
    DB% Z. u/ H9 Q' l0 O/ c) k

    - B# L2 [2 \/ \' K  J0 h0 o' x) Y—————————————————————————————————————–
    $ S$ m5 e8 O8 ]  k: R0 U
    + G# ]7 {' c2 t. C
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    16#
    发表于 2014-12-03 12:48:12 |只看该作者
    Spring6 T1 x# t7 ?4 u  G$ e4 Q
    • 是什么?& _7 \4 q* Z3 j" ?* r
      6 f9 e4 P6 S- x# g6 l

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

    - v8 _( F6 x  E
    • 有什么?
      0 m3 o  n8 x1 U" _  D+ K% P

      0 W' o5 v; u. G" ]0 k

    + H" k) @7 L- x

    每个包的功能:

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

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

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

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

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

    AOP :面向切面编成

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

    " D  D/ f: n" i! q
    • 能干什么?! h" w% @: I0 k; t" w# q. B
      + H2 b7 z" j# [* u$ z

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

    ' t, o0 W4 x4 F- O. Y8 B$ j
    • 怎么用?2 C! x+ y" V" `! b9 }5 Y

      4 T, V, ?: h2 O
      • 搭建web工程,引入spring的jar包
        3 C, C) {6 G+ q, ~
      • 在web.xml中添加如下配置0 J& ]2 H+ g+ U. K( i8 C
        7 L+ _8 B4 `  C) |/ l1 n9 x. F4 p
      - Q, ^& g$ E& }* c9 ?6 j/ s0 \
      4 x0 L, u  m! R7 z- f& L2 L

                contextConfigLocation
    9 {* l+ Y; e: U! V; Y0 U

                classpath*:applicationContext*.xml
    # @/ \5 z; j; Z  {$ W3 F, C2 W6 R

       
    3 }+ U8 e- U4 k

            
    - V' s& H- ?$ S; N3 R  |5 R

                struts27 i: d8 s9 g3 `3 t9 U/ I: g3 ?

                7 U. d& H* L& P% `6 c' N

                    org.apache.struts2.dispatcher.FilterDispatcher
    5 }. h' U0 ?5 U+ ?

                
    % C# z# D# `% c* S* k  O6 V0 v7 g- c

            5 s: Y: U0 x; n( ~

            . C5 Y# P9 R/ ^& N8 X

                struts2) ?4 c( B9 t6 L* U

                /*+ w& g5 N9 ?3 l: i, R& G3 z. T& K

    8 D* m& |1 N+ y# ^/ s% ^

    2 p+ g9 O, n4 n9 Z8 o, B( d+ b

                ) m" S2 u3 E5 R; n

                    org.springframework.web.context.ContextLoaderListener
    5 h% U2 ~4 p, ~6 f

                
    . X$ |  m7 |) e" H; l

            

    • 部署
      : k. p3 K* K- K$ v- h

      $ e+ \  a( L& q3 T6 t; r
    . I+ C! `* ~( g( q! p. o2 R( }

    - J6 G6 o5 g9 |0 _8 L
    & U# \  ?% y( v6 Q
    • 容器和bean2 k+ x6 c( o) d- o- b' }

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

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

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

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

    3 H, w) j; ?6 [7 ^8 D0 L
    • IOC控制反转% j& b+ h# W+ u% j( E& j& k

      * j' R8 o2 X' R2 G3 Z" f

      9 H, ]; I& Y( ?. f8 I( ] & r3 M' k$ d( c
      从前的应用程序想要得到A的实例他会直接主动的去拿,当用了sping后,应用程序由主动的去取变成被动的等待,由spring来控制应用程序所需要的对象
      5 z, u4 }$ ]! h& j1 Z7 q
      • IOC的优点" L3 F  x0 A& j
      1.可以通过IOC来获得实例
      2.可以通过DI来获取注入的资源
      • 配置IOC的原则/ x2 {1 _" }3 L
        • 一定是可变的资源才采用依赖注入
        • 一定是层间的接口或者是模块之间的相互调用才采用依赖注入
          % u& P6 c8 \- |

    # O7 S6 @7 W+ w6 {& w. m8 S' H
    • DI依赖注入( I5 E+ y" Y/ B* Z& x' f

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

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

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

    例如:

    在配置文件中


    . a6 ?6 q5 ~  u3 }5 v
    ! c& t5 r' q1 M  |. _* L3 y+ i# Y: w+ Y4 S) H

    在应用程序中

    Public DBDAO dao ;

    Public void setDao(DBDAO dao){

    This.dao = dao;

    }

    3.构造器注入

    . Z. e- _, x' s) a

    4.ref 表示参照其它的bean

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

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

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

    6.lookup注入

    7.singleton

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

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

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

    8.DI的优点:

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

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

    2 B5 n4 `+ J: w7 f6 s
    • Aop面向切面编程
      - ~' K0 i, s7 r6 v1 |& J1 U. l
      " w5 g, |3 ?7 ^& x2 V' J

    1.AOP面向切面编程 一些较好的模式或者是示例—-范式
    % _* {$ k: Y4 z' e4 `( F

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

    2.AOP的思想: 主动—->被动(追加功能)
    . W" Z9 C. t& S( T8 |+ W

    3.AOP 的概念
    : N4 a" H1 x0 k" h8 Q/ A6 e, j

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

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

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

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

    5.引入 :扩展的功能

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

    7.aop代理 :实现机制

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

    4.AOP的事件机制
    1 g9 \, H4 o  u: Z- |2 y

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

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

    3.找到切入点

    4.确定连接点

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

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


    $ M* o: [: R" u) R; B
    ( S. G4 Z( E1 Q  Y+ H$ |) J
    0 R- A) D2 ]) I- I- k$ Q" Q* Y6 m( T; L! n

    , f: U9 K7 h& _5 l$ G
    % S4 x7 m3 E4 e
    + e; A4 i8 }1 T( }0 P

    5. AspectJ
    : R$ h7 g! L! G3 W& J9 k

    5.1.在xml中配置比较烦琐
    8 R* ?! E; |/ r. U  v

    所有的入口必须从一个代理(ProxyFactoryBean)开始
    + s; \% ^: l8 O


    / F! p3 T* I  h# M
    2 j8 h. r, d9 @

             
    ) X9 E/ d7 Z6 y) ?8 J2 C' s5 L, D" s

    " t  V8 F: [6 S8 D         
    9 k( n  X. v- G& l1 z7 @, j

            2 Y! ?; g5 J  N4 H; {" ?7 j

            


    ) s* T' Y+ d8 V4 f+ w* q/ Jexpression=“execution(* com.javakc.aop.MyTarget.t*())”/>
    ; @- q- K8 q6 ]0 B% ?% V/ I

            3 u# ^2 u$ _6 y4 z

            - q' q, P3 H6 d* H7 E2 O

       
    ) O6 d  X% F! V, v) K$ \* `

    . k7 U# {' B% I4 l% z0 o% G4 W
    1 f6 \- J2 j- _/ v0 ^

    5.3.使用注解的方法相对简单5 ?" I. L# C! V# l" W

    @AspectJ的基本语法
    % p3 |* ~. `3 ?0 Y) C+ o0 f

    1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面
    & h! L  k; }, I  H  A' \: ~4 A

    直接在类上定义@Aspect9 L! A. P; y9 W

    2.@Pointcut声明切入点. f0 D* p; R# `. H: M3 t5 f

    2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字
    ; ~0 {( _4 W. f2 S% R. D/ R# L

    2.2、可以使用匿名的pointcut
    7 D8 z7 W  {' `2 I0 x- d5 [

    2.3、执行切点的几种方法" ]# k6 t6 K) \0 Q$ q7 i1 ~

    2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法/ g  S, S7 U- \$ Y# T; g% ^( h

    2.3.2 within 指定到包,不能指定到类
    - T0 q. n% O+ [4 [4 v4 L1 T8 @

    within(”com.javakc.spring..*”)
    # B$ `9 E0 v, e6 b7 |6 O" K

    2.3.3 this 指定到实现接口的所有的实现类' y* L0 Q, D( ]

    2.3.4 target 指定具体的实现类2 K- y5 F( S! [/ D3 }

    5.4.advice的五种类型的示例( y& X  X  r2 d5 F) i* t

        客户端必须从接口走才能得到监控,实现想要追加的功能
    2 J* i. O  k" h2 Z

    5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)7 L+ M% w5 T5 w% r/ O

    追加的方法的参数名字一定要与retrning的名字相同3 s: ]2 f3 `% f, M; s+ L5 \

    在注解@AfterReturning中必须加上pointcut和returning两个参数
    2 B; g# \, f. N& v2 U! k' M: n5 z

    pointcut指所要监控的目标对象的方法# Z1 d3 }, J. Z  f% e

    得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配
    ; ~, ^% b( z1 H, R, C0 I& f

    完成追加的功能
    " P  X* \. i5 x7 |/ q

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用: ]6 @9 {& J# D0 {

    (1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)9 ]9 d. g* _! `2 c; l# l

    (2).
    ! E2 j0 {; @2 w# D; Z2 q* r0 R

         2.直接引用匿名的pointcut5 ?% D0 C/ F+ K

         (1).@AfterReturning(“execution(& t3 K2 f$ v- H4 V. r

    * com.javakc.spring.schemaaop.Api.test4())”)
    , E4 o8 T  w5 }) u" X0 q

         (2).@AfterReturning(pointcut=
    " z% i4 P1 P3 U5 k5 K

    “com.javakc.spring.schemaaop.TestPointcut.t4() &&2 e( l! v  m% j: S3 w

    args(str)”, returning=”retVal”)5 v( {6 V+ Q# f; R% r8 F: k

    @AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)
    * Z& B0 g) @& h+ M

    public void testAfterReturning(String str,Object retVal){
    4 H1 h4 q# n- J7 d2 M* k$ }

        System.out.println(“afterReturning1=>”+retVal+”=>”+str);: ?' G: D- I; X: l! C* x

        }: _7 i9 M8 C8 X$ i* E

    5.4.2.@Aronud# B, z) v& W9 \/ @4 G/ `, e/ ^: _( s% t

         注解@Around环绕追加功能;! Y( I- J# K, r5 f% R/ \; [

         在执行目标对象的方法的前、后追加功能;; b$ L6 |! o: Z2 f- d2 W0 [' A. G3 R

         必须有参数;第一个参数的类型必须为ProceedingJoinPoint;7 h* ?% u* ?( n

         通过ProceedingJoinPoint的实例的proceed来调用所监控的4 F$ U$ a& m# @  d

    目标对象的方法" p& y$ Z) t( X# E, W, _% y" T' E6 j

         1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    ) o) v  k+ l/ ^1 r

         (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    2 R2 R, M$ |+ f$ O8 C- k

         (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()
    2 n+ O8 Q4 J4 F

    && args(str)”)+ \( _4 U# s6 p- A2 F

    2.直接引用匿名的pointcut
    $ P* B% i! O) f

         (1).@Around(“execution(, I4 r- o& t; d: h+ {- Q

    * com.javakc.spring.schemaaop.Api.test1())”)
    ( q0 w4 {( T3 {4 [

         (2).@Around(“execution(
    + ~4 R; a3 f& K2 E4 t- U

    * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    9 z& L. s/ e! b7 {4 v

    // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    % e5 {$ ?' I% A! i! M! R

         @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    3 j4 F5 @% x$ d; p

    public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{5 |2 x& @+ A' q

        System.out.println(“around1==========before1pointcut==>”+str)8 M# _) m: s7 c6 r# b

            Object obj = prj.proceed();1 b0 M8 u8 P' u! s7 c7 v+ K. d8 L' @: n

            System.out.println(“around1==========after1pointcut==>”+str);! s; w8 o- K1 K

        }' n5 @8 e8 ^& n- ^% E

    5.4.3.@Before
    4 `8 C9 o1 n& h

    注解@Before在执行目标对象的方法前追加相应的功能
    7 z4 a* R1 z  O

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    - ]3 T; i. Q6 V8 F3 c; e

    (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    4 a- m4 k9 B' @

    (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)+ j) k4 P! @. o4 W

    注意args后的名称与参数名相同5 U( P  Y0 a3 W5 N

    2.直接引用匿名的pointcut$ s, H! b3 I5 L* b" b0 T( H

    (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
    0 `: }! x; k& g* Z

    (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    6 D, f' Y' d, e( O  n* B; [

    注意args后的名称与参数名相同
    " H: v% F  P# L# J

    // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    : R  b6 r& a) m. z) q6 Z4 z

    @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”): _, a" v* M7 I$ r+ ^3 q

    public void testBeforeParam(String str){& a# t7 t# Z$ p" W

        System.out.println(“before1=param=>”+str);- w2 K( {+ o, o0 H; B

    }: V" N; j; T/ J2 j6 b/ r; o* o3 ?

    9 b" S3 P2 U8 {) R: e

    5.4.4.@After: u$ V2 f+ `5 ^4 W7 j

    注解@After在执行目标对象的方法后追加相应的功能
    ! R- r  O. t/ o. {% x0 \8 z

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    - I: v+ N  U' T/ Y1 A4 L& Q

         (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)/ s, _$ o/ \  C% E' W9 H+ n

         2.直接引用匿名的pointcut
    , R. g! K; y. L  y/ Q

         (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
    ) n& \0 S. E  I: h/ b

    @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)' O$ C4 z" J8 e' y1 _

        public void testAfter(){4 [& b. F- c% ?$ V

        System.out.println(“after1== >pointcut”);1 U, s# a  A$ t

        }
    5 U- r0 ~% E8 r) d  l- c7 e

    5.4.5.@AfterThorwing( h$ o( k. e1 X7 B

    ; G. v& k# L7 `$ c

    2 t6 x% }; G+ n3 V
    • 描述一下spring中BeanFactory和ApplicationContext的差别4 A/ J9 D8 L  Q1 L) Y( r( u

      * L/ ?  L/ i1 y" r

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

    ' n3 z, K$ W% f, [* f: d  W) J8 f: O$ I
    • 谈谈spring对DAO的支持
      8 I5 `. j% |# E' L" e( `& s
      2 O1 `3 o( J+ p

    Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。
    9 `# X2 X+ D, l  N* Z

    简化 DAO 组件的开发。8 Y  U2 k0 Z5 m1 U* }1 W
    Spring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。2 B, Y4 |/ H3 v8 i1 V" u$ T

    IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。* {' V8 M: K8 m  B) Z8 B( h

    面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。# j; S" y, H5 O. ^7 l+ y4 S3 Y

    方便的事务管理: Spring的声明式事务管理力度是方法级。0 {9 A  M/ u3 V; p/ T7 U) |

    异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。. @* t+ C0 X0 `

      u) h7 H& b  k$ P6 ^

    ! O. _; a0 U; W/ Q* H
    • 谈谈spring对hibernate的支持9 v8 |5 Z# `, r7 e
      : R+ ]2 \9 F$ x1 D: Z& v3 W* P

    在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。* U9 z8 p! `% p9 L* C

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

    1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:8 Z# r' C6 K$ [; ?7 U- |, F


    , |) o+ A+ G" w# y) h3 R% d, J

            class=“org.apache.commons.dbcp.BasicDataSource”>
    ( i+ h. N0 B: J' f$ x

            : S# r1 P/ o3 e" C& f5 o* Y

                oracle.jdbc.driver.OracleDriver
    4 z4 i1 C" O' n3 L& l3 w4 G1 H. I

              \$ H7 @' h0 \6 i

            
    ) d" m# {5 \. O+ X5 O; n$ {

                jdbcracle:thinlocalhost:1521rcl! A' p) `/ G9 ^# I8 B4 W1 p- V- e5 |0 T

            9 O& s$ }3 }7 N

            5 }, Y; N, C- Y) T

                javakc2
    / |. Z: n6 j. d

            3 }, g3 R& |% d1 u1 Y& a' p8 j

            : [, G% e0 P3 z3 M2 u4 c, o+ I

                javakc2
    + n0 r% \3 l6 n& }7 x

            
    4 M! W5 W/ R' @- P! o3 @1 f. a& P

        " C6 o4 _' L* R5 Y

    ' ~! v. X' ?+ g3 o

       

            class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>
    2 r- o! M5 N8 L) u: n4 J

            % E6 `0 N* b' ~( A

            ! B8 q: u+ m+ e+ a, F$ v

                
    * s. B+ H8 m; w/ K: S8 N# U; x! Y

                    com/javakc/spring/h3/UserModel.hbm.xml  S' V$ o2 O8 i7 H6 y2 o

                2 r( Y" g: E4 B0 H; U3 a

            
    7 d9 p+ Q3 c+ n3 b

            
    4 o, W% L7 y  S( J

                * d) {, k9 [" _6 J+ z) o. f

                    hibernate.dialect=org.hibernate.dialect.OracleDialect
    9 M9 ^: W4 W; |, ]

                8 p. ]0 u, v% p" ]* I; T

            
    * k1 @  r2 q1 `8 L, ?

       
    . V* Y! S- |4 K) B5 m

       
    / j$ Z5 h* a9 I4 k2 p0 U; j

            
    & s7 k" x, B1 R3 m, Y6 N5 I( H

        0 |& ?7 f/ ~1 B+ ?

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

       

            class=“org.springframework.jndi.JndiObjectFactoryBean”>. j4 k8 t% t+ V  y* ~4 H

            
    ( D' P  q6 f5 O# P4 _) j, V

                java:comp/env/jdbc/myds
    ) o: Q/ P( ?$ O4 }" l# S1 U

            
    % E. ^0 |  b6 F! K: y

       

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

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

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

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

        # c. B3 m0 }+ b0 s: D3 k9 N

            ; ~0 q5 j# E5 S& L* ~3 }' y. u; [

       
    ( s- L" V: Z0 H6 d  l

    & q% o" i- J" S9 z

       
    ( k# F: c6 w1 [% l& @' {' t

            
    ( [& z+ @8 T% @& r  l% I; ~! n6 N

                
    7 G. B1 [) h' P* m  r7 D

            $ s9 G7 u" X# Q; I# Z

          z' E2 _4 J' ]3 A( {

      A9 N9 S- Y# C- d

        0 |" e% T( \' \4 }6 f' D* i; R, G

            , J8 F9 q. U4 N1 e" ?

              E& J8 x+ a1 T4 f: X7 ?

        5 x) E7 S8 ^- Y

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


    ) n3 b3 V) f1 E( L/ N; c/ Y5 c) O
    Spring2.0之前事务的写法
      q8 V; a! T5 b! j  Q8 l9 F

    8 I* P. J7 v- @! ~5 d: k9 ]% @. ]) V- Y
            class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”
    " F. h0 q0 Q( Z- B& D
      L# S  q* {# \7 w& M( h
            abstract=”true”>. f+ Q4 p& a% C4 k, |

    & V) B+ @$ `  v6 B& t# n/ q7 |. Q* D  V
    . S' `. `  Q* M, i: _

    / F9 d' B( d) _! T2 M/ G                PROPAGATION_REQUIRED,readOnly1 m4 h1 q5 z; l

    4 F9 t8 V5 `& j4 x8 l                PROPAGATION_REQUIRED& k' \8 q9 T) \" H
    ) t1 z  f( Q7 z* j

    9 V% b3 K7 I; p# u, f  ^. [/ ?
    % T) n; c& L- E5 E, ?: a' x/ C# _1 E/ a; h5 r9 [. h$ p4 f

    * l" B  y$ v" ?0 Z' `
    , K2 O# M+ B5 ]# U$ ?/ y4 x- s
    • 谈谈Spring对事务的支持: d1 A" H& k: S. X& N1 V

      9 P0 [2 R# m% f4 a1 O/ m/ ^3 q


    5 F* L$ v) ]4 h3 z1、声明式事务管理:

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

    2.做法:

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

    2.2

    2.3 注入数据源


    2 U* j7 L! c8 ]9 i: ~* R7 Q
    . b: L  m* i% ]  ^2 u# b" @4 J$ s6 ?9 n: i1 e, m
    8 {# w, v# e) F4 T+ D  X, N

    / r3 g% p) B2 s! |7 Q
    6 w9 f( e- z& n% j/ c2 \" @; }

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


    5 q7 j; R; D; T+ f) o
    6 n: q; {8 ?/ V0 v3 _
    ! q; C& J! Z% Q4 Y& v) N

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

    5 \& p/ d6 w5 I

    1 e# i( R8 L4 k5 H6 {4 c/ A# u# j
    ) ?, I& o8 [1 z+ o8 O
    & P, K3 o4 K: S& N1 x+ s; O$ x( n

    2.6 定义切入点

    & d. ]. c4 n  q  A6 z. a  `1 x8 b9 d
      u: s9 C3 B4 [# d
    1 H, R1 P% ]' m8 [4 }  K

    : N$ e# }5 `0 a! M2 R2 F1 s$ V7 K8 o5 a

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

    1.注解@Transcational

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

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

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


    % j1 f3 O- b, E: \  V* Q9 N* E& D6 E! o! |5 T8 E+ _: Q

    如何在Spring中使用Hibernate的事务:
    * g! o7 x) H4 q+ E% B* C: v, q7 y3 l


    & a  g) m1 Y3 H  h: _% D


    " v4 h% n7 i* O; m  {' l$ F

    . p7 c  C. Z  G& I5 b" c

    如何在Spring中使用JTA的事务:0 N7 J! a% Z+ X  {# F


    " B5 c3 K0 ]. j. ]
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    17#
    发表于 2014-12-03 12:48:32 |只看该作者
    事务( W% ^) L8 T3 a. M" p- R
    ACID, x: @6 S! h3 D
    (1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失败
    + t4 M- p4 X$ |6 n: t2 Y8 P5 R- n  {+ w) G8 ?# x6 s% B
    (2)一致性 :操作的前后满足同样的规则,保持平衡。: v2 m# o6 M6 ~5 B3 [  H! e/ n

    / M% t7 U0 [8 R8 e* S1 H& _(3)隔离性 :在事务运行的过程中。事务内的数据对外的可见性和可操作性(必需由数据库的支持)
    8 d  C1 Q' {# X7 P
    + [7 }; k% y( |% `% `) }(4)稳定性 :保证数据在事务的操作的过程中不会遭到破坏,而且是永久性存储的
    7 F5 M4 }8 _# R0 P  t; u# Y
    6 w1 C* M' d9 p7 w
    7 I2 T) d. E$ K) l2 N% c8 g* g/ ?* C" w) p8 N
    事务模型4 H  }  r. G( c( \
    (1)经典事务模型又叫平面事务模型(JDBC) 事务不允许嵌套6 W1 R/ E7 K. ~; q

    % L# w, v1 u# ~6 h. e(2)嵌套事务模型, w" Y% \) l# W9 b! A: s

    # O  g# B5 P6 U, d
    , k$ r* o( `: j  |% X, h+ Z, ~3 Y0 \
    8 k! y/ @3 @0 F! b+ b% ~事务的两种方式5 \. f- f! J2 t. ^/ e- r
    (1)声明式7 c! c- t1 b5 G

    ( ~1 _, }6 o* |7 x2 |9 k1 Q3 s在配置文件中设置以下6项
    9 z+ K' a- {# L! y$ |3 n! v6 B( u5 A5 r+ z. H' Y+ _2 K! V  H$ i- \
    (1).required
    6 y; R4 p# {: }0 ~' _  m9 N7 w, \9 K( D
    如果客户端没有事务 在bean中新起一个事务
    # _- \4 g% _' t- K& E" r6 E# b: x7 }* T( E/ L* z, [
    如果客户端有事务bean 中就加进去" P) W2 P3 t' s
    8 R+ ?+ Y! }; @
    (2)、 requiresNew
    - e: N& d, ^3 R1 P5 y* e% Y
    1 z# f5 K! A# k, |不管客户端有没有事务服务器段都新起一个事务
    ! b- t# |& F4 O9 f6 T) N# N+ Q7 U# @/ {, }
    如果客户端有事务就将事务挂起
      E- n/ I) w8 @0 `, N
    3 {" H% ^9 f' M+ q6 ~' b2 M8 k9 |8 v(3)、supports9 B( R4 f4 |7 B8 v3 L

    % i) j' H) ^0 j4 E: [4 `3 X. R9 O( _. V) Y如果客户端没有事务服务端也没有事务
    3 w7 h0 M1 K+ i5 P
    7 T7 ?, d0 d( C) }如果客户端有事务服务端就加一个事务
    : Z; l6 Y( b8 h' C% m
    & f5 Q0 z, r% x: W! ~: |(4)、mandatcry
    & X! z# S8 |( L+ v( a5 q. S1 ?$ x# D
    如果客户端没有事务服务端就会报错" H1 t2 E+ }9 `+ L7 K

    6 w1 F$ Y$ J6 q- a, U  G如果客户端有事务服务端就加事务3 @; G2 U* H0 w. @- W# Y2 z, ?

    . K+ p( ?; w/ Z8 M- t(5)、notSupported4 u) S* [5 J% W2 F) R- F9 X

    6 G" ?2 H  [: [$ o; \. @8 i不管客户端有没有事务服务端都没有事务& i% x" d( w6 {1 w5 t4 m! m
    % k% T2 `: f6 v& Y5 u- Y; m
    如果客户端有事务服务端就挂起
    7 }% c" w8 O, K- E2 i2 ]* r4 K/ u! `- _8 Y* S( S5 X
    (6)、never2 M9 G4 {5 M1 E4 L+ R1 q9 w
    & Z, |2 L; \% x9 t3 r
    不管客户端有没有事务服务端都没有事务& o6 b  y* a, X6 l

    / o/ K4 m! ^  g3 O- _7 q8 ~如果客户端有事务就报错
    ( q% d  b' g9 c& Y
    7 G2 ]. D( T+ y6 J! {% H$ e( J9 P(2)编程式事务9 h7 _8 |' G5 t& N

    : s1 d1 S; z+ @% B4 WJavax.transaction.UserTranscation: u- G# `; Z) @* w' c

    ! ?0 ?; T  I. kJTA 事务可以精确到事务的开始和结束; }/ }) M" h% p0 f
    4 ]( h. U8 X( a+ L! V( \& L
    : u  y3 H9 O4 x0 g/ @  M" |

    ! Z1 z* O; j+ p. y" ?事务的隔离性6 X* }' I& ^, {- |
    Read-uncommited
    & Q1 c; i, _8 ]+ _! T# d, u2 V- B% Q7 ?+ B8 C6 {
    读取未提交的数据(基本上没有锁)脏读,存在不当读取的问题。
    & p; f& Z) H) R" P9 i" j" _2 W, W1 W# l6 _
    Read-commited
    8 K1 L2 |8 p8 a7 `9 o8 T- R# E& l) G7 B0 G% C
    读取已提交的数据(行级锁)- b  A+ u6 a) L4 z: ?8 q) x

    , T9 F7 s; W3 q无法读取已经写入,但没有被提交的数据。( @* A' j& g: k% {) w* r

    5 ]+ _# x) h/ sRepeatable_read
    0 q' `& J8 F/ }
    ) \0 t+ d, n% S" o读取的数据不允许修改或删除
    ' e$ w( q" p( }# d! i# |! c* t
    % e" Q6 t9 P& l# B2 k不可重复读(行级锁+不允许修改/删除)
    $ P1 `; [' S, W# I7 f9 q5 b, b: b9 c- i6 z
    Serializable4 h& A+ s& T7 C* E$ Q
    & D/ F* x, W( i
    幻影读(表级锁)
    & A* k: g, W- j; l& X) l7 G" l8 G* ?) ^$ K! e# j( Q; W* v  _6 C" T8 n: m6 y

    6 |- y0 H# s6 J# o3 f  m; {) ?4 H, G5 ~$ R5 `) q2 r2 P
    struts2 u/ w: Z1 _$ n
    开发流程
    / r# F0 V; M+ y& r) P/ R1 A9 U& b& o- y1 W
    1、创建表单. b/ x/ u; U0 E( w( b% q

    ; C5 {, f- i8 m2、从表单中获得输入
    ' t6 p0 f6 N' d% @3 O; Y; y0 S/ o; J. o) }1 j+ Z  H: h
    3、处理输入(业务逻辑)
      P+ n! t" \; f' s- U  k4 x4 m& c2 e4 p0 P$ l
    4、根据动态输入改变输入流# }" b9 B/ x0 S8 b; r  g
    % q8 J9 |2 H+ A' ]3 o  ?( Y5 }
    要完成上述四步,我们需要创建
    0 D5 _  v3 K  o5 H  _/ c8 y+ C6 H9 a! T1 \/ F! J; s( N9 @
    1、一个ActionForm4 p) r- y7 [' n5 Q- D5 G) W5 i, |( z

    " p  X* Q' X7 J8 W2、一个action
    % p4 H* Z+ O( |4 Z. g! o
    4 P8 g8 h4 l$ I4 H) i( C" e3、一个配置文件struts-config.xml
    ( C- Y/ |) ~& U8 A
    : y1 H3 j+ y4 c$ H4、创建页面- |; U  }' a2 Q, O

    # T- l, V/ Y, v) |: @/ S0 \创建ActionForm
    3 J( b9 W& s4 U5 v* [; F% }. |* ]0 Y
    1、写一个类继承ActionForm- d3 x6 E8 B, W3 Z( f$ E4 c, e
    & p! l2 M0 a+ u+ U( f, h" s
    2、私有的属性2 M: P7 G+ a* Z

    ( Q1 ]! v; V# r2 L3、相应的get、set方法
    * k: j! v! z% q, C8 X/ @1 a" s7 ^" w' W& X/ P' f, t+ z$ U
    4、重写tostring、equals、hashcode三个方法0 L; n2 j( c# v( Y1 ^! `
    - x6 A- J, {; m. Q
    创建action
    - d- M4 M5 w( g3 u$ _7 }/ T$ W
    2 |  F. X. l) U9 u* g7 U9 `+ d' j1、写一个类继承Action2 {$ M1 [1 C( F5 x- ?

    # \4 v0 l# @# T$ a4 [' c2、实现一个公有的方法(回调方法)* n, U# E9 A5 Q2 d) @( I6 s/ k3 h

    " G& m5 D" M4 ?; @8 W4 ]/ Epublic ActionForward execute(ActionMapping mapping,
    9 x. ~6 `, N  ~! n" N+ Y- |2 ?( w! K- t6 D* E# H- s2 o! w
    ActionForm form,
    : P/ p  C9 p9 v2 D0 Z8 h  Y4 o: I9 [1 @' l" V  _2 V! ?8 k( e4 b
    HttpServletRequest request,
    " m+ ~  F8 R& {+ r& j; O3 W7 p0 s  [& H% s3 R5 g7 Q4 Z
    HttpServletResponse response)
    / |) p- [  v: j" u/ l7 V' y9 F& O9 _7 W! n0 [
    {* _3 Y$ s" A- D" D: p0 Q

    3 q5 B; c% M  r, F7 S//1.收集参数
    $ x9 k, u% D/ @) L6 y
    5 O. z, }: B& `* s! j* y% Y) yMyActionForm myForm = (MyActionForm)form;1 t+ ?5 e. n* r+ o$ c
    0 u; C& E% }. O: N0 O8 `
    //2.组织参数. \! v% ^: @% {& A

    1 D: G5 P& O3 ?" E
    2 N% k' m0 m) |; D9 m4 X7 H9 d0 M7 M: k4 P
    //3.调用逻辑层: u% F, U* t/ @4 ~2 |
    2 G) S$ r* K& {; J% q( `3 I7 V
    boolean flag = true;
    " Q! e9 L0 V! j6 b3 L9 z3 E1 K; t+ j+ w* o8 X
    //4.根据返回值来跳转到相应的页面0 X% F) n' u1 q& r- c( ^

    " ~3 E9 ]1 T; O! f4 h0 @ActionForward af = new ActionForward();5 B* \! \2 k( ?# z: X- N
    0 n+ u" d  z5 [) g
    if(flag){: G7 y& b5 i( o/ }5 V! ]

    7 t( h8 @7 A( G5 ]) n8 Kaf = mapping.findForward(“1″);
    , M0 U; J+ P" i; U! ^2 Q& H* V
    9 I& I) b( l/ N' Q6 D: c/ `& d}else{+ v- Z' E4 V7 l2 `& ~; C
    + f: B' P: G4 i) U9 G6 [3 t, z
    af = mapping.findForward(“2″);
    ! p6 M4 A1 f3 Y% J4 J* k8 E9 U7 R% G/ ]3 q  `
    }+ _# g. J7 H5 z6 ~3 i: F0 {2 e0 [
      O1 X% S7 a- E( e
    return af;* y! d# S, o+ \6 C+ C% \# U

    9 k) e( p' j2 w+ ?+ ?}3 k0 W2 w+ L5 T' p* l: S
    3 p$ E" R6 D3 H
    配置struts-config.xml文件
    ' J6 ?8 U# z6 X( R7 X
    ; V2 Z$ L3 L/ v) h  ~1.<form-beans>- W8 }) g' ]" q# w3 A

    - o$ J# L6 c1 f8 E$ p; E- Q<form-bean name=”myActionForm” type=”全路径.MyActionForm”/>
    ' |0 }7 }$ ^( S9 z! ]
    : o7 n1 n# I7 c" W0 o  [1 P- `' c<form-bean />- a# }- o: m' @; ^. D6 a

    : U: P! y, m$ ~# S6 @+ H5 g3 V$ @</form-beans>2 I1 I# [4 H/ d

    9 z$ V/ `% i" h2.<action-mappings>
    9 c, U3 u4 w) G9 ]- f$ l9 [/ B  {. O3 i
    <action path=”/sll”
    4 p. ^# f$ V) Y6 S- f) f$ _4 s& K- ]# g! d( A+ t
    name=”myActionForm”+ ?0 Z0 i& R# H/ ~  f3 X+ m# G6 `
    ( ?" ~8 M( k& m1 Z' `
    type=”全路径.MyAction”
    4 U6 N8 c/ H0 f+ m3 J; m
    ' x% P! h0 b1 `- E  e! Ascope=”session”* B7 t0 g% g0 T3 K5 U( o- n

    5 u' E2 j  c9 v2 r3 ]input=”错误返回的页面”>9 o( P- S2 q/ K1 }

    / L. }) p, W" w<forward name=”1″ path=”/1.jsp”>
    6 a. v  b1 f; i' Q  X, B3 {# d
    * r8 z  ^+ {5 s/ A% e7 J<forward name=”2″ path=”/2.jsp”>/ C% a, g+ t6 A2 ^" L

    , J# G. n) A  ?) U  d; m1 Q; R7 ^+ U</action># w( }5 I0 o% r
    ' c: e6 F) c$ _% i8 |! N/ y, `/ \. g
    </action-mappings>1 l, ]( F6 ~& T8 l3 k

    4 T, d( b3 N& @" v) R* U5 o步骤:. R& j  X# s: v, N# I
    # w' @, `# e$ m: [2 Q) [
    1.创建一个空的web应用; g; @# O9 N4 ^+ ^7 d7 f

    : h9 m# u" R( {; p2.将struts的包放到lib文件夹下
    1 Z5 o0 Y: @. [$ \) d5 t9 T
    " y7 m% L6 r& g+ q/ K; q5 w3.将.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目录下$ A- i: V; U% k! B4 D  r

    ) x, y+ \  @. p* z+ F4 f2 ?0 I5 p4.配置struts-config.xml文件和web.xml文件
    & |. B/ K$ |. O
    # s$ ]0 c! X8 a' v3 N9 U" [5.在页面引入tag文件uri
    6 B+ _7 E5 V/ O0 d+ i/ G/ `2 L, Z+ \0 F% a# m0 q
    STRUTS运行机制
    3 t- ^- m0 B9 J6 \; A) ?& d3 P' Q$ k, T9 s$ M
    1、界面点击产生请求
    # d5 W- z; W" N! R7 ^
    ( c1 U0 h* U) e4 R) P2、容器接到请求/ z7 {* K2 t1 p  E5 _1 X1 s

    / Q/ }, v7 L  D5 X+ I7 M3、匹配web.xml文件中的*.do来调用ActionServlet
    ' e2 L: _8 b4 ^* |4 W; K. T' |
    ; [9 I/ j4 O6 s4、ActionServlet的处理; W  R6 W. X* \4 s
    ; j8 O" V+ D* R- z  E/ i% w: x8 T
    4.1 读struts-congfig.xml文件形成ActionMapping
    9 U; B. I( Z1 ]" y- ]& Y/ u: V7 X/ U; G* D
    4.2 通过path 来匹配Action类,通过Action的name属性来匹配ActionForm类
    ! J/ H$ ^" u! m' i2 h$ C7 l( F8 R5 h& \. C9 ^
    4.3 通过反射机制来给Form添数据/ P1 ?9 d' {5 B2 I3 G- {0 B7 i8 o
    ' ]+ ^/ c* K) d2 z, g/ i$ E
    4.4 由ActionServlet转调Action的execute方法
    2 g7 _0 F  O3 U& n+ F1 \
    " M" @' |* a, Z& D4 _, @4.5 得到execute方法的返回值,跳转页面
    , X8 G7 O6 x( i0 Q
    , G. b; [3 l0 }( M4.5.1 RequestDispatcher6 {0 S+ j8 d3 c$ ]0 H

      [2 N% S' u7 e8 p" f4.5.2 response.sendRedirect(“list.jsp”);
    " E; I4 R5 h; ~: n$ C1 H
    - D2 }; O7 F) J5 w7 r( I' W6 m/ p
      c9 E( l: e- o: T# G
    $ O& Z: q. m; y3 w进入execute方法2 T' q. O+ I' \4 C
    # N9 j' n1 ^$ z& P4 L$ }8 N. z. ]
    1 收集参数8 A5 U5 x; z  ^+ ]3 m& G

    : n) x- D/ ]; R  f, q2 z2 组织参数3 l3 z/ n. W0 b7 S  c) Q2 ~" |) u* G

    - ?) J# n/ x& V% C; _  s/ b3 调用,逻辑层
    ; Q+ @. Q  |+ R0 q  g( N$ P( V8 N; K' Y) D% H  q% B( C: E* q& v( z
    4 返回值6 T; C6 t7 a7 E4 X& O1 |
    - u$ c5 o0 O: @5 ?/ V  k# E' Y
    4.1 选择下一个页面 (ActionForward)
    ( Q2 c5 r; w0 u. f! \) K1 K: Z3 ]# r% `6 j
    4.2 把值传给下一个页面% C$ `/ j6 f' b

    ! F, {6 C! P8 M( ?- }3 C
    % V( T8 ^% Z0 Z' O( P* ?( q
    & J  q3 s% t9 d, l5 @" t- s7 P比较struts和struts2的不同( m# S; B" m1 Q- W# y8 o! g
    9 E3 M- w3 \& H9 f8 m% C
    Struts# z0 C2 b6 D0 T* G: `- U
    + m0 _3 ]8 j0 d* Q& y
    Struts2
    . _, L9 |  L2 a% y6 @) ~! d6 Y/ r5 {' R4 u/ j/ k
    组成        五个部分:ActionServlet,ActionMapping,AtcionForward,ActionForm,Action        十个部分:AcionContext,FilterDispatcher,ActionMapper,ActionProxy,Configuration Manager,Action Invocation,Interceptot,Action,Result,Taglib8 h" |) }6 A7 M  L3 p! G
    url        .do        .action
    6 ?$ ?' [# @+ ^0 k9 _& z分发控制        AtcionServlet        FilterDispatcher9 s4 ^7 Q1 j; [/ V+ M+ I5 o; O
    收集参数        利用JavaBean技术,将数据封装到ActionForm的子类中;
    ' J3 d  j! ^7 O: |) H* @4 H0 h一个Action对应一个ActionForm的子类
    * r& @9 C3 x7 t( t4 f& u. q4 a# J, `, r) P+ }+ C; |/ @
    使用拦截器将数据封装到值栈中。% F9 F- `7 V! H. u+ ~5 J
    使用域模型,一个Action对应多个值栈中的Model6 w* d/ G/ ^: }* r
    ) I- V8 V2 R" R0 ?
    读取配置文件        ActionMapping        Configuration Manager0 a1 g" [) G1 P. D+ x* {1 U8 e
    拦截器        无拦截器        执行Action前后有拦截器  V! \$ X, D1 V  O7 W. K1 z% \
    返回页面        将字符串封装到AtcionForward,进行跳转页面        Action中直接返回字符串,通过Result跳转页面
    , T* o, P3 D2 D5 ]! ~" N$ p2 z( d页面跳转方式        两种:dispatch,redirect        三种:dispatch,redirect,chain
    # B( ~# {( N) {- F* H( \; N值栈        无值栈,Action通过在request范围内设置属性,向jsp页面传递数据        有值栈,Action和jsp页面通过值栈传递数据,jsp页面通过OGNL取得值栈中的数据# H' E* f+ y* d- I" v
    配置文件        struts-config.xml        struts.xml$ _/ y# h) p. m4 b% b
    中文问题        不能解决(需要使用filter)        可以解决中文问题:/ ^4 s6 W8 S* I
    1、在jsp页面添加Meta;1 B# J$ b+ [& K8 \5 s; ?8 J

    % q% x- K5 ^  O/ T, x2、修改struts.properties中的设置。
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    18#
    发表于 2014-12-03 12:49:03 |只看该作者
    其他开发工具和技术
    % [/ d! x( Z8 w8 U1 G. z) lAnt
    + G" q" h+ a7 I* u2 NAnt是基于java的批处理工具
    ) c. l0 T- N$ k  q) F3 n& q
    , @. x- N: s) B' {6 m' m/ {% a一、配置ant的运行环境. q: n$ Z1 l) U+ \9 Y
    " A* I" q/ ~& X) t5 q
    1.将ant的bin目录添加到path中
    / q. U1 ~3 q& P" `% P; s3 n3 X3 g# U4 J( \8 h
    2.配置JAVA_HOME+ q" j7 ?+ K  t, X8 o1 T  y
    . U& C  T, N0 N- ]6 U  A- A% l
    3.配置ANT_HOME' B) R2 H7 ~" R" r( L+ a
    . U+ Z! _3 j; v/ U# L- I
    二、配制build.xml文件,该文件放在应用程序的根目录下  a% o8 ]5 ]5 p% U, y  y# z

    8 _% q: ]' r9 `% _: f9 Y- s3 a编译java文件
    / j9 u+ {% N* v) W: T9 a; }. z  s) Q4 m* U+ \
    执行java文件$ F; m! a: e* r* [
    0 m0 b6 L3 r2 ^0 y
    copy+ B$ n" l: F$ ]& k( P# X1 c

    9 R7 Z$ d5 a0 U% X( H删除: B$ R4 B8 B2 R" |0 n# B% h

    . {. b- @+ y/ F打jar包9 v. _1 i& t9 K! d
    8 D1 L- V; _3 r3 b" Z
    根据注解生成配置文件* G; P, l4 x' S9 w
    ; m: |, l2 x$ [0 Y
    Xdoclet
    8 F) K- ?; {! ~* X+ c* ^3 V( v( g% h通过注释生成一系列文件的工具(txt、xml、java、html等)
    1 A) E; C( X9 c  D$ Y. v9 G7 `% ?" \; ~# a/ F+ u# A/ m* |! j1 v- j
    xdoclet本质是摸板技术+字符串的替换& h  e5 f9 P4 n' J' D* ~2 t1 h" C4 |

    / S% w( C  q0 P; a% \1.在java文件中写符合要求的注释(将hbm.xml文件的内容搬到java文件中去写). h0 _/ {+ \* W( n# y- W

    1 L8 R! h+ j5 X' \1.1 在类的上面 写与表的对应
    9 g6 b6 w% m' B: @) E/ H# q
    3 Q3 Q+ u6 Q: W1.2 将每一个属性的注释都写到get方法的上面# ?; F  n, K% B) W% k+ P

    4 Y& w/ }( c2 d( v# [2.在ant中引入相应的task来驱动xdoclet
    - I9 |+ n5 _( |9 P  v; [, A+ m3 a
    " U- B0 R2 ]" q% N' x% d # w! d. [, N0 J1 ^# d1 S7 `" ]

    ' b/ y. e9 v" Y( Q1 {7 Olog4j日志管理: m8 X* s0 `. l3 ^' S
    1、是什么?
    ; D9 O2 L  p4 I0 V$ R) a
    ! f' y( _& B2 `8 \. D( Q3 u+ W在开发期间用来测试、对整个日志信息进行管理的工具( D8 R: {% n$ Z" B* X( X) b

    % y, ~2 r( l6 N! e2、功能
    3 `; v8 s4 R3 i/ m7 v2 @( `" Y3 X1 `' ]0 ^/ G
    1.控制输出的目的地. U" J/ E% x# w& U& ?2 Y/ X

      ]' z3 D' k: L; K5 Z+ V8 [. b2. 控制输出的格式/ _) B# Z: P; R" O
    2 _+ y7 ~. O  q# Y- O
    3. 控制输出的级别" v3 q' s/ o, j6 n
    , m) Z/ [2 L- N* m7 S
    3、日志的级别: M' j5 e+ H+ `  V
    2 a6 e  _+ D# w6 \  ~( g. d4 C
    1. debug 调试9 G/ l9 o* K9 w6 B1 t

    7 d3 v* F# ~4 U" K( T2. info 给用户的提示信息
    9 S* Y9 Q5 o( g# m& ~% u8 c+ h" v1 B  R5 M! b7 g
    3. warn 给用户的警告信息
    ! `1 m4 S  ]* {" C8 d; p8 B
    1 b2 Y/ K- d& S4.error 给程序员用来调试' T# C" U1 x( E, N# h* \

    ! f. L4 D3 s+ \. I$ i$ f6 m- B- eDebug—-〉info—-〉warn——–〉error7 q+ T- b% Q) P/ O, I) Q
    : w+ p/ m. j: `, h: y: i
    4、配置
    0 v+ v) b7 s' ]) }8 ]7 M* T9 c+ {( C2 Y! Q5 e" d% q2 M- Z, d
    1.配置级别
    1 N% A/ j0 m1 y$ Z. h6 A* v$ A& L" [) K/ _
    2.输入源 (控制台和文件)
    1 a1 ?! k# r8 p; b' m3 x4 D9 K0 b, }1 I& n
    3.可以进行分包控制9 ^" F* l% m3 f( |
    8 C7 K! s1 n* m
    Log4f.logger.包结构 = 级别
    + {& M) T: [8 T( t, W3 {! P
    % S  B* h" R' Y! b3 @) r2 m/ B5、使用* N( S8 p# T" Y# W& a) r" r
    / Z  F# l, R1 V. v* u
    Logger log=Logger.getLogger(Test.class);5 ]9 o* b& \3 d

    & Y% j* e- _/ W    public
    ! m: D8 W* p: }, ^* c! R1 ?8 Y8 I, w- }) bvoid t3(){7 _2 r4 v' E8 `# g+ e% K; u" P2 \
    4 Y/ V* v. E  I. [: c7 Z" Z6 A
            log.debug(“this is debug”);
    ( u% s" i) ]" B3 S/ c# I8 Z, k
    ! c/ z+ G8 j; ]" J( q        log.info(“this is info”);
    ; G: o2 ?3 U8 u1 H" J- R1 ^: v5 Q- i
            log.warn(“this is warn “);
    8 ?2 j, C) e: R( }* D/ F4 I" A8 Q4 G  t' W
            log.error(“this is error”);
    * D- r" E% x4 R' F4 A% d3 K0 }) n. P. a% E
        }
    8 L1 A& g. x7 Y7 ]' s' V  [- A4 B0 P0 T; p' L2 a7 L: r- Q
    Junit
    3 ~+ n4 i* x+ d/ e, l1.是什么?
    9 T' i4 \6 r5 Y6 `" B: ]; v6 v' g  F0 ]
    单元测试的框架- u4 ]4 M) J2 B, N* t
    . c5 M% d  s6 w
    2.怎么做?
    9 c6 ]* A0 p) k7 o* Y# K6 k0 o0 x5 S) {3 i+ I7 u" q& j
    写一个类继承TestCase0 ?5 ~" u& J; Z
    $ A! A5 R( M1 E% L+ ]7 ?- X3 v
    测试的方法一般都以test开头并且没有参数. ], e  k5 ~" k9 t) u% A1 u' U1 ]

    3 y) T1 m# B4 f; y3 m在测试方法前执行的方法public void setUp( )5 E$ A1 n. q) Y; d* N# y! J3 e) y
    1 B0 S* Y9 K; R
    在测试方法后执行的方法public void tearDown( )
    % W  j# I9 x( u1 M; e1 i% p
    - Z, J# ]. }7 }5 l2 q+ zerror和故障的区别  d8 @& L6 Q8 c
    + O$ d& s; ~  N6 [6 }, e* {
    error :代码有问题& ^8 @! }$ v6 d( v

    $ x! Z8 U3 Q* m+ K1 ~+ r' g+ Y故障 :逻辑有问题与祈望的值不相符合. k0 U9 E- r) p" D0 L" @
    9 ~9 W3 f& a( g; k$ C
    生命周期
    1 M5 b, o+ L, I4 q; e7 E7 C7 B- a6 ?0 M0 ~3 C" I
    测试—〉SetUp()—〉testXX()—〉tearDown()—〉结束;2 q0 y2 o+ s5 ]

      w1 E0 }* ^# @0 B: v7 ?- kTestCase套件
      h$ Q) `3 V6 m  a
    ! @5 Z$ |3 e- z% f1 {8 qpublic class MyTest{) f% a1 X2 l: H" e8 \

    $ I" T5 [( J. B1 Q2 d  j2 J        Public static Test suite(){
    3 a0 X# g2 b4 ~5 @, j9 ~: C( i. _. u5 ?0 d, k: }  _: O) n. g
    TestSuite suite = new TestSuite();" l' A; A- [/ v- f0 ]5 h. m8 S1 X
    ) ?9 {. E6 Q3 `: G5 q" N+ ?5 o& m
    suite.addTestCase(Test1.class);* b- h# W4 F7 ~: J) [( F: m

    ' ]  s1 [6 N& k: [suite.addTestCase(Test2.class);' G" q$ |1 t2 T( \+ y

    0 a( k5 \- J* w1 m( _% }}' h8 \$ Z* C, b% }/ O) f- V. B
    6 d: n9 {6 J1 D& u8 ?$ n
    }
    3 S/ ^( l6 k* J' W; m+ ]4 g
    . f4 H# l1 ~! E' W! ]9 F* `% J& Y # u8 u/ F; f: E. t. R3 v) t2 L
    4 J7 ~" s) N+ \
    Ajax
    % Y" r& ]! y0 J! F- U是什么?
    - j; W) s# @1 ~5 s, a8 y+ J2 oAJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。是一种创建交互式网页应用的网页开发技术。: q4 t2 U. F3 F) c  f

    8 Q' K$ x9 V! K; w无刷新页面。  p$ B! ?: G2 n9 U5 c9 \- @

    ; \* q  F& R! ~有什么?# T: Z) q  ^: J
    AJAX是多种技术的综合,包括JavaScript、XHTML和CSS、DOM、XML 和 XSLT、XMLHttpRequest。
    ) f7 }8 y5 m% j. M; _1 Y1 c
    ) M7 U0 U: Z3 L  ~8 w* T能干什么?
    4 D. M4 Z$ X% }; m0 @" }5 u2 q使用XHTML+CSS标准化呈现;( n4 `) \$ o/ V  L/ Y
    使用DOM进行动态显示及交互;9 \7 Y# O" Z! f" `
    使用 XML 和 XSLT 进行数据交换及相关操作;
    ( j2 j- Y( B- Y6 m/ E3 B& P! k/ d使用 XMLHttpRequest 进行异步数据查询、检索;
    0 n# R, d6 c+ T) i$ F( L. ]* L使用JavaScript绑定和处理有所得数据;8 z  y; g! Z; t4 p6 U

    : w% `  z' H8 X7 N9 c/ q传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。! U) q/ @% H- M0 F) f# q$ v, R
    / p. h7 P/ g  P( G- c6 d/ I
    与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。9 Y$ ^& i! M, f$ T
    * {" y- K/ q; K' f$ ?
    使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。( \# o0 `* g; Q+ v# @& \

    ' k, Z6 X- E( Q8 }2 z对应用Ajax最主要的批评就是:4 n7 w& @7 ^$ L6 d+ S. P
    1 它破坏了浏览器后退按钮的正常行为,就是用户点击后退按钮后不能看到之前的数据;7 y' D  ^+ f3 S% K# l0 y" I
    2 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;
    ! Y9 C; U$ T0 A% T3 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;: L' o+ ^. \. ]5 ^" q
    4 Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;
    / w- ~9 L2 U$ `$ q, o" D  v
    0 [4 H. S6 K9 c+ \$ Z/ g" z& V怎么做?  G/ v* q1 L0 g/ P$ A5 b& J
    <script language=”javascript”>
    $ V3 k8 T# q9 R! D6 P- G) J
    & }, }* g4 I0 J. v7 T" Tvar req;. m1 N/ j: _. @" L4 X2 k

    ' M( F, L, d1 `" J5 x5 Yfunction add(){
    6 v( Z! \9 B/ H" d9 }( ?3 o
    ; S4 R1 g! ]) u5 L5 D" O//1:创建用于传输的对象
    3 q% o/ }) S7 y0 w1 K7 }" ]0 g- E
    0 g9 o; v. _# K9 `! }; r' c8 Ereq=new ActiveXObject(“Microsoft.XMLHTTP”);
    ! K% J/ ^, z/ ^- H: u1 k* }0 f( _- A/ G
    // 声明返回后,处理数据的方法& W! s% h8 m. ]; L! @, z0 Y
    4 C3 o: ]7 s2 D
    req.onreadystatechange=manage;% e+ M4 j: c) o( J5 z! t& `, A2 d

    * F/ f# P% \* B  _6 \//2:准备传输的内容1 o: {3 i6 C. H% X

    0 ~) s$ @9 y8 ^var str=”test1111″;
    3 m/ Y; d# Z3 E. `7 e: F4 F$ e4 a  I) Y4 E/ a* \- j! H: E" D  `
    //3:发出请求
    # J' N1 A1 G% ^  r) }# U: ]% }) V8 [1 _0 `- k' A5 M; R6 @
    req.open(“GET” ,”/others/ajax/test/t2.jsp?str=”+str);7 R+ D& w  s, r5 d0 R6 `; k5 w

    0 z, H( E. r' Z& a2 O0 C8 Preq.send(null);
    # O0 S- I) M) @& V+ N1 e; T  E7 ?7 _/ o0 {, i0 W
    }
    9 M0 W' ^3 f9 U* g
    7 `" _! G) I1 @/ e5 U$ m/ O8 J//4:接受返回并处理; U* S! M! j8 s" q+ q8 \2 r' t

    ! H5 d( |  }- S3 d. z% jfunction manage(){
      j4 C/ n/ c9 ^* j5 l* X% i7 J% Q2 {1 a5 [8 [4 |
    if(req.readyState==4){2 x+ x& Z# E4 T6 A$ {& D

    % f7 r7 }3 u' O9 {1 X( q8 Xalert(“r==”+req.responseText);
    5 G- e) y4 Z% X# M7 C" t+ r9 n3 X* x: m8 \
    }1 N1 r- E& A; w$ ~' ~0 g9 N: w
    2 k( ?$ ]1 M) ?, |, }" l" l# x
    }1 Z2 [0 U" g5 i: \

    6 \: W  J; |9 \( O</script>
    & {& R: j$ w# j2 p. T! Z8 u. _$ I5 |
    readyState的取值如下:2 ^- c- e) m6 G6 |1 N
    , @) J  V6 V, d$ _# l6 B
      0 (未初始化)
    & S- e$ F# |5 R. T
    8 |7 `- i& c# G  1 (正在装载)
    ; B; f9 y9 q/ j' n, M8 J# j3 i
    5 `  e2 k" C7 [4 o/ N# [/ f- k  2 (装载完毕); R7 V; j: l" ^. [' }

    ! @/ ~8 j) ~; T& A  3 (交互中)5 T5 u7 o3 W- D0 r  j1 t: T6 s
    ) N9 F9 E1 r, x# }7 K
      4 (完成)
    ! Y$ i5 y1 z" I  _0 K0 j+ O# B& w9 u2 J6 o

    0 K  k3 S# R9 E- }: w% q* g. x+ N3 G( Y/ I2 a2 R
    原理
    " T& ~" I/ A) e4 B$ XAjax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,可以是xml格式,也可以是一个字符串,然后用javascript来操作DOM而更新页面。
    1 ]) K: a/ T. s5 r/ ?& {$ |! P* l# [
    Dwr
    - w0 \  \# z; u$ }# K) h是什么?
    ! K/ p! j; u1 N* t5 o7 N+ h) v/ BDWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的页面。它可以允许在页面中使用运行在WEB服务器上的JAVA函数,被调用的JAVA函数就像是在页面中JavaScript方法一样。) u* K, E" y8 `6 w: q4 N

    ' p9 A2 x2 D! P( L/ s有什么?
    8 G0 m, V5 i# o* j它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据;另外一方面提供了一个JavaScript库可以帮助web开发人员轻松地利用获取的数据来动态改变网页的内容。
    / n: z# f8 P8 U+ R/ e, X2 M# S6 K% A5 y
    ' h$ m- N( C9 v
    & C0 H: x; q1 G( N) q
    能干什么?
    / g+ y& Y; Q9 V* n+ n$ g. k动态地把java类生成为JavaScript,感觉调用就像发生在浏览器端,实际上代码调用发生在服务器端,Dwr负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制。* q- i/ w* L+ p& E  F7 E# e/ S: U6 {6 u

    : |3 t- H2 j) Z* V
    0 B' D" Q0 {$ E8 e3 S, t; {7 O6 G
    # x8 q3 v& J' N6 w, v怎么做?
    ! {; c) ^( [' v8 ]2 k① 编写配置文件
    0 A/ C/ g: z) h' }' ]* f7 @
    : p* {" ~! V' @6 Fweb.xml: \$ c8 R; Z+ R; S. G1 o8 ~
    , v" ~% f( O& p. j3 d1 O2 O
    <servlet>6 F/ u7 K9 [# l9 P
    9 d6 G8 X/ ]0 u
    <servlet-name>dwr-invoker</servlet-name>
    / y6 `, \2 @9 `; c* x8 R7 w: N  C) |5 l5 i* m  o& B6 k4 P
    <servlet-class>+ @# p2 Q8 j. p# O9 W1 T+ w

    - k5 e/ }2 M" J  A# Lorg.directwebremoting.servlet.DwrServlet, h! U: a9 e5 Q3 ^( p' f3 M4 P0 g

    ; N5 n0 A7 b7 I- L- x2 Q( r</servlet-class>5 h5 B; d2 V  I: u/ a9 c
    7 q3 _6 Y* a7 k
    <init-param>, @  M  t$ ]5 i* O% [
    $ g  I: b4 P4 n
    <param-name>debug</param-name>4 e" Y1 C: u8 V& x: r# U5 K

    0 x4 i! |: f' \4 w<param-value>true</param-value>; p0 n& W5 W# M8 i

    1 ?3 Z# [" s4 }</init-param>
    ; E" l4 X% m2 e7 X9 ~7 D. ~; a( K$ N# ?8 m$ G6 y7 X/ ?) {
    </servlet>
    ' e8 x; s. s. y2 t% p6 c, b2 O' _0 w& J/ a! R4 [
    <servlet-mapping>
    : g9 Q# }4 f: u- g4 i6 a
    ; \" }1 H* r3 b, J9 d3 Y" K<servlet-name>dwr-invoker</servlet-name>4 ~6 s" g  T- ~" O

    8 F5 n0 ^! C9 R2 N* Z9 U<url-pattern>/dwr/*</url-pattern>$ V& @$ E2 d. V% M- \: o

    & Q4 v; M! w3 R  j% i/ p</servlet-mapping>  W; i4 R2 y* N3 o: ?1 q

    : z0 y. p0 i2 {# edwr.xml" q2 p; i! ?2 e8 ]+ o7 `& V* L; ~

    9 u. W+ Y7 Z6 t* M" V1 k& Z+ u) z<allow>$ F+ \1 B0 D0 Y, K: \" R

    ; |9 A# y# `# d5 @& i* J; l5 M<create creator=”new” javascript=”kc2″>
    & C: f$ ]3 l: y6 f9 |. F, N& {* G8 K" O+ y) |; U1 n
    <param name=”class” value=”dwr.Service” />% P- m6 J1 t" c$ M: s  F

    . f7 a( v) Q' N1 R% c</create>& f0 B, g8 n# v% f
    0 f. @( M' A. W: w# L) }  t
    </allow>: [7 V+ _# W5 r( ]' V# t
    : p! N8 K* J. Q6 r
    ②编写service
    # n7 d2 F# X2 K$ v2 [9 k/ u* o6 r5 P8 ^
    public class Service {' M% N: y8 \& L" o

    + J! h2 C' _# H' o- Z, j7 cpublic String sayHello(String yourName) {
    ' K- \9 R2 T3 X. Q( ^& `# C! L; c2 E/ a+ e+ J# c
    //可以是访问数据库的复杂代码
    8 W. x* J- r. q7 V! m( o/ ?6 V9 a% B
    return “Hello World ” + yourName;% f3 S* M) Z+ g+ X9 z+ }/ ^; V

    ( |: G* F" j; f8 b4 s}
    + y3 x- ~. n" d( X
    / ?% S- |) h( F4 ?+ O, o}
    7 R( o6 g6 l; R0 R, z' k. f" _( \$ A7 S8 w0 [
    ③测试DWR+ z/ X( P" Q# q- e/ b9 t

    9 F4 e% L8 `  f* L6 b$ C/ F将代码放入应用服务器(比如Tomcat),启动。
    ( e! |4 P+ R3 I  Q1 C/ X' v* X
    - C/ z) G. n  ]8 H4 P然后在地址栏输入http://localhost:8080/你的工程/dwr
    ( o8 \" C4 P: x" @3 s0 [* ~: l) b- ?6 p0 M
    ④编写jsp页面1 h: `4 W7 ~( C% U- t4 \& v
      O- {) I4 A. W0 p* F! H0 }
    1) 要引用3个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js4 ]) V. K  i: r2 y! M# j9 Y

    . m1 U9 [$ R5 t( `8 v0 x5 p2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样
      p# h# a* C/ W  d+ m7 |$ y' {) p( e1 d: h) K6 {& \
    3) js里的service.sayHello和java类的那个有一点区别,多了一个参数,用来得到返回的数据
    回复

    使用道具 举报

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

       

    关闭

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

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