我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > 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
    3 Z6 _. |6 i" Q0 I3 U4 I* \. S) Q简述JEE1 Y$ A2 B+ k4 `1 I9 H3 I! ^
    JEE : JAVA  PLATFORM  ENTERPRISE  EDITION
    9 i* t1 w/ @7 s; W/ _/ V  r$ n* t; o8 d3 |( J
    JEE是一个规范集;
    ! z% Z7 N, U* u9 A4 {7 J
    3 _# k, S& K8 q- v2 B+ P9 rJEE是一个框架集;6 l9 i! q+ x5 w0 d6 R

    / k4 V+ \. d' ~" ~5 I# d, PJEE是一个技术集或API集;
    ( I. \) X  O3 b) i( |! D% Q
    % ~) @1 X# N. n/ m0 E6 ~适用于创建服务器端的大型的软件服务系统2 H0 ]6 V; ?9 }( K2 ]

    7 r5 X# l7 z) X0 F6 \! A 4 L; b3 N9 n  S* t, F, K" Y
    ! _( V8 ?& ^' D9 D
    C/S B/S 模式
    * T" }3 b& X3 z' XC/S client/server即客户机/服务器模式,客户端也参与程序的运行与计算(富客户端、胖客户端)& m, J. h  C. D9 T) D

    . i' v# Z0 V6 n: B4 g3 f4 EB/S border/server即浏览器/服务器模式,又称为瘦客户端,客户端不参与程序的运行与计算
    7 t4 W& j2 C7 @7 c( ~# n4 g5 s9 G6 l! m" M# K  h, X% V/ x

    & j& ^& M# t( B3 ?2 d: _
    ; G# Q& U& [2 k  Q0 V7 J: ~企业级应用(大规模的应用)的特点+ U1 u6 k7 \/ q4 h
    1.生命周期长、稳定、可靠
    . z3 n1 j3 X( ]( w% l  c9 D7 f/ O7 C1 t6 r7 T3 Q
    2.组件往往分布在异构的环境中,能够跨平台+ d; i9 K0 r; F1 R! ^1 k& o
    / F+ T3 M3 J6 K7 m" p2 ^
    3.维护性、扩展性、重用性
    . @4 l* z% {& ~# X9 _3 _1 s+ L" [
    4.有事务、安全、线程8 y+ B% b9 P8 H( I

    1 s  Y  P# I! h! |3 O4 I % [7 b+ X3 G4 b& M; x3 m
    8 I& Z# }5 D6 A# h, d) l- j
    什么是业务逻辑?* r  h3 c1 n$ I
    依照业务逻辑划分模块,
    # Y8 y/ S! s7 {* C9 W  {
    ) w5 l0 ~" Q" C; G/ N+ m所谓判定业务 就是具有以下特征:
    & b) f/ `' @" Z
    9 B5 j) z0 I) e' p1.业务流程) s0 C, q8 S0 x& a; q

    , W0 U9 i+ U* H! T8 f2.业务判断
    ! D$ s6 k9 ~% y# j$ v) G5 r4 Q9 O6 ]# a+ |' ]
    3.功能组合
    / L& m3 V' h) w
    ! v) n1 J/ S- @ 8 D9 ^, M# i8 i2 T- c9 F4 I
    & E- a0 u8 F% t+ C
    平台(角色)的划分8 R, t8 a( Z5 ~* |  Z/ C$ W
    1.平台供应商。提供满足API集实现的厂商(BEA weblogic IBM webshphere)& O* I8 f" A- p1 d
    9 e, E2 c& e8 A0 }5 p  ]
    2.组件供应商
    ( S7 Y. b2 S0 A- F. C3 q
    ; u3 t! D3 @) X1 }7 J3.组件装配人员
    2 K" b* E6 d: \% }- V. u+ @1 N) E; Q% ]
    4.部署人员
    - Z7 S# n, u! ^$ x' h8 H9 @) p4 N
    0 u' d# d- A* R+ G* v5.系统管理人员
    ! Z" X) U: D' ~9 G5 l. ?
    & a  l. ^5 B) R4 j$ P- q6.工具供应商 提供开发组件所使用的工具(Jbuilder、eclipse), b3 [5 L' {" A' E# g

    $ O4 j+ V' B0 i+ e+ o+ N) T ) ^9 t- R& p$ X

    / ?( {+ s0 e( Z* yjava技术分布(设计架构 模块内部设计)
    * B4 {$ q6 e( z1.表现层 Servlet、 Jsp、 JavaBean、 Taglib+ m+ T: I) _2 x8 Y$ [& R
    9 ]$ Y" Y! G) |5 l5 G" \
    2.逻辑层 EJB(SessionBean)$ H  A- _* m3 X, {
    4 N+ _" D6 S* \- c3 c- s
    3.数据层 ( JDBC  EJB(EntityBean))4 o7 l( G) z. o
    9 Y) M' |& ^, ]  Y
    4.服务 JTA(JAVA事务架构) JTS(JAVA事务服务) JAAS(JAVA授权与验证服务)! `7 `# O# C* l. O

    + L3 |: j' D4 k/ u5.分布式通讯 RMI(IIOP)+JNDI 、JAXP(JAVA 的 XML 架构)
    2 P7 e8 p  F3 |( ?4 S
    7 W$ u5 S1 C& x1 v% i% y  D+ L. I, vJAVAMAIL(邮件服务)、JMS(消息服务)、IDLC、JCA(JAVA连接器框架 (成))1 E" g  ~: l: f& U

    3 ?, H/ n1 M- R4 L8 `( D9 c/ _ / h& p! T. v9 {5 v' ~) w

    : U5 x. j# d: o  BJEE的体系结构: 是一种组件的体系结构
    1 u# T$ p, t, E. m0 e1.组件 : 能够完成一定功能的封状体(独立的功能的集合)+ ?/ S( P& k2 B$ B8 i- m6 G
    3 w2 d3 o$ D  j; j2 T, g' S0 U
    不能单独运行,必须运行在容器上) _4 v  w" V9 t) t$ i

    ; L1 C" w: \- _3 ?1 G- \分为两类:web组件、ejb组件
    ' G  \% _$ c% `+ K; j, K! D) A- l4 t) E% J8 U
    2.容器 : 提供组件的运行环境,并对组件进行管理(一段程序)3 _  u( q6 ^8 ^: ~2 Y9 J

    2 G3 T& f- e. J  p" m) E8 _管理组件的生命周期
    * Z2 I" x* Y- R7 {' E7 [2 g& V" O1 B/ p
    不能单独运行,必须运行在服务器上
    * Y/ y* g9 E! s8 ~8 o! I0 F* E/ K$ ]$ Q8 K8 u
    程序(组件)通过上下文来调用容器(context)
    0 [' I3 ~) A8 Q- X3 Y& u1 q) |# ^. `8 c2 j
    组件通过web.xml向容器描述自己,使容器能够认识组件
    & Y+ J6 y7 t* J* U" l" ~% z; V
    : g. s5 m/ O, Q$ m$ i0 g容器通过回调方法来调用组件8 G# ]7 Z; U6 s2 u" a8 U7 t$ ?

    3 W$ a( J7 ?' v( d. s分为两类:web容器、ejb容器$ Q5 t* E% z8 \. Y, K7 ^$ `

    $ i0 U  s( f0 l3.服务器 : 提供容器的运行环境,提供大量的JEE基础服务. w& J% E& `! I: Z' P) I

    8 H% x) `' F' I  ]! lweb服务器(只提供web服务)
    - W. H7 k* }' |
    ! o3 `& H& q1 P# Y3 Tjee服务器(提供web、jee服务)
    * h, S9 ^5 N) T1 I" L) E  u2 q2 O

    4 K: w  p6 u3 v5 v7 s
    : T; n* q0 P2 F3 S- m* s什么是回调方法: E' L8 A' G2 h2 ?0 G+ G# t4 }1 R
    由容器自动调用的方法,就叫回调方法。; Y9 H. a0 X! V* W) F7 I$ s% j) z9 q9 \
    4 z; @+ k- t2 g6 g! z' r
      z) F6 {4 v! q" g

    - K; Y3 O: O  XRMI远程方法的调用机制
    , w8 N2 D+ a; \6 F3 r5 c0 z例如:A主机有B()方法,C主机有D()方法,A 想调用C主机的D方法/ l7 {% K. ?. U8 D5 ^$ \, n

    " I0 b& Q3 G3 [' N/ _$ x, r
    " H! p3 n1 ~, u3 M% S
    1 A& s( s+ L; u) @. S5 N& a- `$ I / ~& g/ ^) M) I$ _1 s* M
    ; y1 K* P: [+ ^2 H
    学习方法
    & J6 U6 H0 Q' A4 I0 u) m1.规范(熟记) 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
    ! h$ a0 i' c5 A
    •     描述war包、jar包、ear包的结构
      + r! b- r9 j% d7 ]

      - L# G6 Z  k: g# @7 c# c3 |6 S$ X& I

    war-                            web文档压缩包

    —WEB-INF

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

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

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


    / M; G3 d# v' d$ u3 @  C. n

    jar-                             java文件压缩包

    —META-INF

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

    1 `  K* z3 k; T! \# A

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

    –META-INF

    —Application.xml 配置文件

    –*.war

    –*.jar


    3 O8 J# g: k( T1 S5 y! J6 ~) w
    • 什么是servlet?servlet主要做什么?8 G( c$ P( ~. w1 l) Z( G9 N) n

      0 [, S2 [. r; |, ]6 U2 v' L. F& {1 k7 j& E4 h( u

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

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


    - {. T. a) K4 _4 O* d7 b
    • servlet 与cgi相比的优点?servlet的缺点
      8 {$ f6 W3 e/ o* M$ S$ z
      4 w2 i0 C: i5 |# a
      4 R8 R& I/ n+ ]" L2 k' Q

    优点:

    性能(线程比进程更快)

    可伸缩

    Java强健且面向对象

    Java平台独立

    缺点:

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


    - I' y# a# U1 x( B8 S
    • 常用的servlet包的名称是?
      6 z; Y4 m9 O  R* F( C) Q
      * S; W; d( \( `4 f/ K1 X' e$ F4 p# \

      6 H) w. I5 o1 o, c+ l, S

    javax.servlet

    javax.servlet.http


    3 @2 d- [- n0 P
    • 描述servlet接口的层次结构?
      : r0 S; L$ ~; H# v
      0 j7 I0 M2 \5 g

      ) [* V* Y5 P7 e) e0 {& l1 F

    Servlet

    –GenericServlet

    –HttpServlet

    –自己的servlet

    ServletRequest

    –HttpServletRequest

    ServletResponse

    –HttpServletResponse

    " {, a5 H$ D1 h- t( |
    • 对比get方法和post方法?
      3 W6 \; O) s9 W

      9 r" G# H8 r/ U" m; D' P
      ; C% Y. B2 @. L  Y4 A

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

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

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

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

    4 A0 Y) K1 P" z; g
    • 归类描述HttpServletRequest接口都完成那些功能
      ( ?# \" B3 F9 d8 w0 _5 I, u

      6 g+ o' m: d: b# ]  _! d& t1 T9 t5 d: p6 [
      • 读取HTTP头标/ V5 Q7 h- F6 T7 h" @
      • 读取cookie
        $ ?4 V- k  F$ D! `  N) a
      • 读取路径信息
        & d/ s9 o0 G. _, u8 m* L9 h& O
      • 标识HTTP会话。
        6 N, `% m* G# @" x! j6 X# b2 U% ]" h* E7 e
    ) S' f1 }$ e+ z
    • 归类描述HttpServletResponse接口都完成那些功能; R0 q( `& d/ s+ q+ p( B
      + A4 b% h# p; t

        j4 F4 m- c' F
      • 设置HTTP头标
        3 I$ z, I! c( X5 L+ r" k
      • 设置cookie
        " [, ^3 z9 K, Q" k/ r, o
      • 设定响应的content类型2 e, T% Q* j  r2 ?7 C
      • 输出返回数据+ h3 d# w/ m! J  p; g3 k

        + U) p- C1 E2 e0 B
    # S& h, c& u2 ~1 F3 G% t3 `
    • 描述service方法所完成的基本功能?默认是在那里实现的?4 o! s5 F, L' h2 d5 s; ?

        x2 ^0 b6 h+ E' i8 I) {: T( E3 L: m2 O0 g2 s

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

    实现:默认在HttpServlet类中实现

    ' E2 z7 Z7 h8 t' ]1 K
    • 如何开发自己的Servlet?描述应该做的步骤和每步需要完成的工作8 `: ]3 f  v! C2 L& @4 ]/ Y0 F$ P

      7 v% b  n4 B1 S5 C& O  o, _
      5 j" I- `8 e  z$ `9 t! W; r" K

    1.引jar包

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

    2.开发servlet类

    1)首先继承HttpServlet

    2)重写 doGet( ) doPost( )

    3.部署

    安装web服务器,例如Tomcat

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

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

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

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

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

    4.启动服务器


    7 n3 E; ^1 D, L
    • 为何servlet需要部署描述?  }! }5 Y* o$ O
      2 a7 S, o! l* x- Y9 L# ^) T9 i
      5 n) c  w' t/ _& m8 K! M( Y

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

    $ c0 Y* i8 l' y5 D5 ^4 i. k2 G
    • Servlet基本的描述应该是?请写出来/ n4 z% d, h3 C& s

      ; p  q! I1 D( Z! c; }  V8 k! s" h4 z: N3 t: `: o9 a
    7 z3 I7 ~- G& E) G1 y  I+ Z

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


    + s$ a/ ]4 b2 k3 x; ^
    • 如何在html中使用servlet
      ' s7 t$ T  F/ f) N( u

      + x7 B0 N3 o3 q; f6 O
      , F2 B& [  l% @. O$ L

    FORM标记

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

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

    语法:

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

    {HTML form tags and other HTML content}

    </FORM>


    : }& ]2 S* Q" ]( G
    • 如何接受request中的参数0 r; T; t; x  G$ s" h

      4 g) n. K& _: b: H& TString userName = request.getParameter(“userName”)方法
      4 w8 e& q4 b& [$ w  ^6 h
      ; g% L* ^3 C( R& Q/ r3 T- _5 \$ v

    / n) M" P4 K+ W  p3 Y1 m
    • 如何接受request中header的值! o  n  k' S% g/ Z9 S4 y# d
      6 J9 N8 |% G  T, C  }

      0 T% D& R9 x& ^# h- P3 E2 H

    request.getHeader(name);

    request.getIntHeader(name);

    request.getDateHeader(name);

    request.getHeaderNames();

      F6 v2 L$ v5 l
    • 如何输出html
      1 {. m, d$ j) H6 a8 ~: L. h
      ( a. J/ E- |# M2 b2 b

      3 c+ m  K8 [) \8 r7 ^, i& ?; o9 e

    PrintWriter pw = response.getWriter();

    pw.write(“<html>”);

    pw.write(“Hello”);

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

    3 Z9 J0 k/ V- U9 e  x
    • 如何设置输出的contentType
      ! H! ?' ^& y! l& C+ F
      & K; S" L) w2 b& D2 M$ Y

      9 n* x) V; G+ Q, ~" U0 R

    response.setContentType(“text/html”)


    : G  q7 u( w5 v* m1 _  F( h
    • 描述servlet的生命周期?
      4 c" b# w% g) F$ t. [
      * ?$ b" m/ v( {2 P

      ; S* Z5 w; t- ?9 @

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

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

    % P- x1 p4 f3 T6 ]+ m5 l
    • 描述init,service,destroy方法的功能和特点
      - E9 B: U3 Y, B) B* z- w

      - o& m! J$ m. c2 j7 l& a8 O) v7 M

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

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

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

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

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

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

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


    ( ~# r5 {/ P% ~8 x* F6 N1 j: w/ V: T
    • 什么是回调方法?有什么特点?
      7 U- ?: M$ ]; W7 b" X4 ~0 [

      . ~- k- t4 H9 ~6 q/ a0 I* U! r% E+ K9 ~

    由容器来调用程序的方法

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


    ! {7 S  r* `1 q; k- O& }: s" A
    • 如何设置初始化servlet的参数?
      9 Q4 R* J5 O5 B# n. m: u

      + J. J! X, Y& s& e在<servlet>中添加如下配置7 A. O. f+ t9 U$ ?

      2 f0 _/ E& V# G4 o' {  F2 [

    <init-param>

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

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

    </init-param>


    1 ]) g% p5 k( m
    • 如何获取servlet初始化的参数
      ; L* b: C# S( L

      7 a& z6 q; l, _! I/ L& q8 G7 ]! `$ ^% b

    public void init() {

    greetingText = getInitParameter(“greetingText”);

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

    }

    ( d6 C* m, `  ~/ E, l
    • ServletConfig接口默认实在那里实现的
      & A, j6 j" M/ q+ k) |: ~6 }0 A* l
      4 j) X3 p: @* A' N# d  J) `

      7 U1 n" p2 L/ B0 A: _

    GenericServlet类实现ServletConfig接口


    ' Q$ G* c# C7 h9 b9 [0 R
    • 什么是ServletContext?有什么作用?' k+ e, I' o3 P1 l- t+ k

      8 l+ R. u: ~/ D' d* q% v" B' ?: `  ]" S, f7 u

    Servlet上下文

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

    0 _* N3 U" U; F5 }0 n( i2 M
    • 如何访问ServletContext接口?是在那里实现的?
      " ?8 j) |) y4 m- h3 C+ C" C
      + b  P, @: d" p, V" q) j% I0 x* S

      . N; `& M5 `: E4 g

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

    GenericServlet类实现了ServletContext接口。

    * M  X) w! ]+ k
    • ServletContext接口的功能包括?分别用代码示例& n4 z9 j6 R% O6 b% g5 Q% q
      3 \/ y5 _# C5 ?  q! H4 ?* i

      - L, v* j" b( y1 Y& i5 N, r

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

    8 P( a6 p! f& @
    • 如何设置ServletContext的参数?
      9 c9 o# ~' }- _1 p

      5 Z/ F; x; P) j1 `) w  Q2 Z; e5 k# g, v

    <context-param>

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

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

    </context-param>

    , d! X+ d% I3 e
    • 如何获取ServletContext设置的参数值?2 n$ J3 B/ Q" U  f, n, X
      # W+ s5 @/ c; d( w4 `4 J# h

      6 {" S' ^, @+ R" W0 p

    ServletContext context = this.getServletContext();

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


    0 c/ P1 d9 T! d9 _6 ?6 m
    • 描述Web应用的生命周期?& t1 D2 T9 y- M

      0 {1 q" a$ T8 h, j7 w. D0 O/ O, Z$ B, q8 x( ]" p! n

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

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

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

    & f& K! l& w1 d6 ]
    • 如何用代码实现监控Web应用的生命周期?
        J5 ]/ G4 g% H. V. G5 Y
      - {2 t7 \- K7 w* c/ Q7 D
      $ _& O) @! H6 |3 v

      2 z+ f$ y! C7 W9 n/ g7 }

    public class Test implements ServletContextListener{

    public void contextDestroyed(ServletContextEvent arg0) {

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

    }

    public void contextInitialized(ServletContextEvent arg0) {

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

    }

    }

    # ]7 W5 [9 R) a% w

    web.xml文件中的配置:

    <listener>

    <listener-class>

    com.csy.Test

    </listener-class>

    </listener>


    1 @! m5 Q4 K' w
    • web应用中如下错误码示什么意思:400,401,404,500
      ; r# |. Z2 C! d* H# R; I0 X1 H

      + l0 Y3 k; r' j* A6 Q' P! R( j; W* f
      400 Bad Request//错误请求
      401 Unauthorized//未被认可
      404 Not Found//没有创建
      500 Internal Server Error//服务器内部错误

      7 A9 l' z3 d" k7 L3 {3 r9 |

    : Y. J: ~6 e3 M% A& I3 }1 Z5 R  P
    • 描述Web应用中用声明方式来进行错误处理的两种方法
      ! x0 x7 C# }* T

      , j) Y' u, J0 K+ r( H$ N% o5 e7 }& W' ~, V6 u

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

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

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


    3 l* u8 I/ d4 r& }( K
    • 描述记录异常日志的方法,都位于那些接口?
      5 m  y. ^$ |) F" T/ K/ N2 u. g$ n4 [

      ! v# ]" u6 ]+ k/ v* D' Y# Y' p, A/ @( m( h

    GenericServlet:

    log(message:String)

    log(message:String, Throwable:excp)

    ServletContext:

    log(message:String)

            log(message:String, excp:Throwable)

    ) f5 C* K& m0 V3 x8 n3 R
    • 什么是会话?1 u% c8 Z3 ^' v% [
      , X' j  U: z- r; f' o' l
      5 m! @) {& p- z* C! A

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

    . v6 j, Z# Z4 z$ H% B) ?
    • 如何获得会话?7 m. H6 ~6 M( }/ g1 W  o

      - E: o. n3 i/ G% a/ N) }" D, f6 X
      HttpSession session = request.getSesseion( );

      : o$ X+ S5 |: M1 o: a9 l$ Y% b2 _
    - i. v! T" P0 k6 [
    • 会话Api的基本功能?
      , S& _; A# g% _/ w+ W" ^( R4 O

      - o6 x# U$ {2 Y0 @+ Z' k9 k* L1 I. r" C8 T$ E

    getID() :String" o" O0 E! I/ g# J) A& m, L# K, N

        isNew() :boolean' m9 m- g6 s% x

        getAttribute(name):Object7 f! Q5 R: W# ^- w: t

        setAttribute(name,value); u0 `! l* m. d2 C

        removeAttribute(name)


    & `; T0 Q$ H! S, q! _$ m1 m
    • 如何销毁会话?9 y( U' K, p  g0 ~
      - z$ V4 X" A+ \7 g* H2 u3 N* c
      9 ~& M& A: c% o: R7 u2 X

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

    <session-config>$ k/ R* y, a0 X1 g3 F8 L

             <session-timeout>10</session-timeout>+ Z* E1 @: d5 o! p' U9 u$ Z

         </session-config>
    2 \. e6 V8 E! {% h

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

    invalidate()
    9 b0 K; ]' a/ k9 A/ f

         getCreationTime() :long/ x1 ~* a; k$ e+ L8 F5 Y% J/ O% N, d$ }

        getLastAccessedTime() :long* v9 n7 o+ I" h% [$ [1 j6 Y

        getMaxInactiveInterval() :int* T# P: v. x5 q, ^; i& Y4 R9 E

         setMaxInactiveInterval(int)

    ; p7 _( U' j5 G
    • 描述会话保持状态的基本原理) ]5 X6 Q% G. {; J5 z
      : v$ [8 Y9 i/ O. e7 w
      0 N0 M' S5 j0 j2 C5 H. L

    : d( X* w8 l$ p) O9 P

        client server7 U! P, ]% D. H2 I* M* _/ F


    7 g, k8 Q: R* s/ q( \! j

    request( w/ h1 Z- e  s+ U

    response (sessionid)
    2 L/ q- |$ n* V, D

    request (cookies)
    8 W+ z& |# S/ Y1 K; B3 |5 o3 N

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


    / `: h* {# N( t; B/ H& s9 ]
    • 请描述session和cookie的异同之处- L6 y1 `; q* T% l" n3 r5 l$ O
      ' R; w* \. S) h7 V; `
      . E$ p& p, J# E* E" c7 c" E0 ?
    5 R& c0 `4 O+ s, F# S

    8 F# E/ F7 W. o0 n; @
    • 如何读写cookie,代码示例, L2 ~! ~9 o' v! p  D2 `/ n

      : R) g6 W5 K+ s* N& t6 ]
      / i( Z7 m3 p: ]( B

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

    response.addCookie(c);

    读:Cookie[] cookies = request.getCookies();
    6 h! v' m9 d) I6 x- E' [4 y

            for ( int i=0; i < cookies.length; i++ ) {, }* y2 t8 k9 R- s: p; |

                String key =cookies.getName();
    1 }* S) V! Z: N! X7 m) C. a" x

    String value = cookies.getValue();
    ( U" ]% x& d% A) z: j' ?! a  _( G

    System.out.println(“cook”+i+“:key=”+key+“,value=”+value);
    0 F, ^/ u# t: \% |+ N1 C

         }

    ! B9 y/ B4 S( {* d; @0 _7 o
    • 什么是URL重写,如何实现,代码示例5 q9 I" J) Y' A' ]8 H
      $ W& a: V, E  s) N2 J0 h

      ' c" J: |9 v8 Z/ A3 y

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

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

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

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


    ( y( f$ c& {- o* J" Y0 s2 D) x9 l
    9 T  r/ W- i3 S' @
    • 描述web应用的4种认证技术% D- n  ]7 ~( N# K: D" W

      ; e( o8 T  {. X/ M2 {$ `0 [8 K, c, x# y

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

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

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

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

      m  B) i; \! S/ M; z
    • 什么是授权,什么是验证?4 O) C4 K. Y+ k3 P0 ~. I6 w

      6 \( n+ w* p! t1 j( c; F" _4 E( x: N: }9 {

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

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

    1 W4 E4 U9 K" M# \- r' P
    • 什么是HTTPS1 I7 d6 f1 S' Y0 }
      5 C) F; [+ l9 T

      1 Q7 s" r" G' J) s9 x, q  f

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

    . g2 e" k% [1 \% l/ S4 e
    • 什么是审计?  b. g( G. {) y& B3 E" n* X0 m; s: q4 V

      8 ^/ R) E1 P9 d9 B4 @/ E4 z6 n# |" j6 t( N, `

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

    5 F0 f; ]4 j& L
    • 如何实现声明性授权2 v# p1 U. E) }) L* i  P
      " D% p$ \/ z# P: r& v* Q0 Z$ A1 I

      1 c0 g* J0 y! }# n( y" j6 X

    1、标识web资源集

    2、标识角色

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

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

    在 web.xml里配


    8 w; C8 \( n- P: S& m! }; G
    • 描述servlet并发问题?
      : X* e2 G, `' g3 v/ z# \. z7 H" l

      5 l+ U. H: {9 W7 e( N# N$ l3 S8 Z0 p9 f3 n: V3 Z

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

    % H) h* ]* S* G0 Y$ f
    • 描述Web应用中的六种属性范围( E0 ?* z! Y. U/ |; o- I8 T

      " `( S8 S  E# Y0 B$ z) Q$ a
      / \0 g  T; m5 \# t8 t9 t, J) u

    局部变量(页面范围)

    实例变量

    类变量

    请求属性(请求范围)

    会话属性(会话范围)

    上下文属性(应用范围)


    # V& b- d4 D, H- V) R) ?) z
    • 指出上述六种哪些是线程安全的$ @* }$ F* d+ n8 i9 Q9 @
      % R! A+ {. b/ q8 X( {7 R" i

      + r! ?" l' Y; D7 K

    局部变量和请求属性


    ' Q0 c. M% `3 [, u0 H
    • 什么是STM?如何实现?
      / c0 D: [4 `5 e. v# X. M2 T# W1 C

      1 G- W" K9 L' e; W* ~  }5 E' Z3 L( b3 x( @, O6 F9 |$ s, ^$ j

    SingleThreadModel接口

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


    ) Y" P3 _  O& a( g7 Y
    • 如何实现并发管理?/ _: P% F6 f1 O) O3 N8 {

      ' u' J; [; }& f" c7 o2 e  H8 d: ]
        \9 y4 ]$ [6 o+ Q6 q# l: v4 m

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

    使用synchronized语法控制并发

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

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


    6 x7 R% l) ?/ E6 e9 U9 d
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    13#
    发表于 2014-12-03 12:45:45 |只看该作者
    Jsp" O$ y1 z/ U3 s9 ?
    什么是Jsp?
    % |8 \) |4 j  i- U/ w' K; tJava Server Page    结合java和html在服务端动态生成web页面的技术; M9 \" L0 M! o: c
    ' o& e  P* L' g. {8 L
    # o1 J# ~+ M+ w6 X) \
    * D1 P7 Y" z8 y3 a7 k
    描述Jsp页面的运行过程?: A0 U* k- i( z0 Y. N
    第一步:
    4 x( i5 a1 n2 J+ {
    0 Z; S" Q( }; \# ?, O  I请求进入Web容器,将JSP页面翻译成Servlet代码
    ' Y# p: @) L2 i; \" K( v
    % Y% S6 {4 P: G( s+ T! ~3 K; p第二步:& Q* j! |. A% F; _9 p0 _! g
    4 Y8 I4 P/ d6 f/ L+ Q
    编译Servlet代码,并将编译过的类文件装入Web容器(JVM)环境
    % S5 q  `+ K8 h. z1 f5 [
    " M0 z$ F4 u* P3 z3 s: x. q, b" g第三步:
    0 Z9 P6 X6 M2 ]. `" T+ O, }# s$ G
    ' p' n% y: {! W# b4 `5 `- j  TWeb容器为JSP页面创建一个Servlet类实例,并执行jspInit方法
    2 k5 W& r& s3 C$ D
    9 E3 E! R( L' `2 v第四步:
    3 ~) E! b8 w6 r. Y% m: Q' w3 j: f( V: ^! [+ @* W/ v: x
    Web容器为该JSP页面调用Servlet实例的_jspService方法;将结果发送给用户
    % r+ Q8 b( A9 j" o* z$ n+ g  T8 }" o  [' j/ T
    " T" L( R( L8 D0 b: Y: t8 p

    6 Z" c7 V2 e9 p( @; w* G! C描述Jsp页面的五类脚本元素的功能、写法、并示例( U* \/ P5 z6 f" r
    注释 <%– –%># K2 Z. U1 ]: r/ m5 s/ O! l, e
    $ ~% @1 ?' T2 Z( n( G
    <HTML>% D  j, w- w% Q& L; H

    8 E: d# l. ~6 J% g<%– scripting element –%>. Z3 `6 P0 ?0 T# ^! V4 V% s8 I( ~% [
    : _) C0 R; `$ P% F
    </HTML>
    , R  r# t" f$ l' q6 F) i& p; ^2 P
    指令标记 <%@ %> 指令标记影响JSP页面的翻译阶段
    ) _( j5 I+ [1 O
    7 Y9 R, }: v7 J% p<%@ page session=”false” %>
    ' F$ w* a" S( j, T! n& D- P/ F+ N4 W) D4 q- f' y# X  q$ O
    声明标记 <%! %> 声明标记允许JSP页面开发人员包含类级声明, C# s+ F+ L7 B) w  i, n3 ?

    % {% M1 J1 u5 }: a! k8 }- [3 f<%! public static final String DEFAULT_NAME = “World”; %>& {  H* o$ `4 C; `$ ~* j

    9 f6 E9 D9 f) N* q8 Q    脚本标记 <% %> 脚本标记允许JSP页面开发人员在_jspService方法中包含任意的Java代码
    : S3 ~% I8 R% e& D8 Q8 C, S+ }9 s# C; f
        <% int i = 0; %>: X7 I, [% Z) U& q% D

    5 o7 C4 S, h5 H# C( O表达式标记 <%= %> 表达式标记封装Java运行时的表达式,其值被送至HTTP响应流 <B>Ten is <%= (2 * 5) %></B>
    9 \' j& O% F! |. y
    . ]2 l: o! I- _$ `+ Q% }6 b * L3 I8 P% q# b0 b$ p0 M8 `

    : f5 E* i+ v: q2 t$ }9 l! d4 @描述Jsp页面中的注释种类和写法/ e4 {8 x" I& X. `" t
    HTML注释
    5 I2 N$ W# N. V- F2 p+ K+ y4 M* `1 \( _$ ]+ h/ z
    <!– HTML注释显示在响应中 –>2 N/ g/ K  q: [6 w( A; E
      o1 T/ S! k0 v+ \
    JSP页面注释! {+ ^: |9 @  e+ c) L# y8 {
    - Q" \! T/ i' B" f
    <%– JSP注释只在JSP代码中可见,不显示在servlet代码或响应中。–%>; l3 y/ c6 A3 K) F4 A7 x  [
    # i" X" c! M" r) y0 _
    Java注释4 J* B9 N" k# r5 i

    5 q  ~; U2 l1 T<%
    : ?9 `) D0 [  N
    1 _& L0 T8 ~7 v6 D/ X/ e7 \* S/* Java注释显示在servlet代码中,不显示在响应中' s5 G$ ]4 r1 j+ o- {; k: \, p
    ! l. p2 |% {; E& j& S  v8 e, }1 H
    */. N! w- n1 S# l0 z6 w  H
    / n  N  [# q( p8 s$ t: p' _
    %>* l  Q( _2 k5 X

    2 |2 _, O/ h+ H + k0 x6 i( h, I$ ]8 \

    0 P6 {/ h; p; U% r0 o, z( Y$ _描述Jsp页面的指令标记的功能、写法、并示例1 S1 m5 `( E6 U; {
    指令标记影响JSP页面的翻译阶段/ U+ @* X, ]/ a6 [5 m

    6 Z$ a& P0 P' W8 p<%@ page session=”false” %>0 b0 G6 k( a" \* C; k2 K
    , P) v9 W1 D  q) r9 E
    <%@ include file=”incl/copyright.html” %>
      ?# Z1 h7 P5 l9 a. k, l6 T' Z; v7 c! Z* X
    <%@ taglib %>( O2 _# R! @& w% g8 a1 w

    7 F4 u$ |6 T* O1 `  Y
    ) b# \; Y9 E1 l5 m" \4 z( s
    ; o. j& [  j- j. ^, j6 j描述Jsp页面的声明标记的功能、写法、并示例
    ; J5 ~& J3 z% l0 s& {声明标记允许JSP页面开发人员包含类级声明
    ; }9 ~- l# L( c! K% y6 z7 q" L$ H7 F" L% w! }+ |1 v
    写法:
      I: \8 n7 ^+ n& c  @. I8 Z, c+ J+ H0 D8 x+ J
    <%! JavaClassDeclaration %>
    * z8 }. B& l+ B2 M
    . K3 ^( r! ?2 `% ^例:7 {3 K+ ~) f. b" `
    # i; J+ }7 |" }2 u# ~! t! O
    <%! public static final String DEFAULT_NAME = “World”; %>
    $ X, q8 d! O, O. A4 Z2 ]" [. V% \" S0 ^
    <%! public String getName(HttpServletRequest request) {
    : l% [9 v9 ^9 t( L$ k. B# H+ [% t3 j7 j
    return request.getParameter(“name”);' y* d# @% X7 \5 Y2 c

      c: G( ?$ ~" Y5 `+ ~7 y}( x1 u0 x) _9 X9 F2 ^* r0 l
    # G6 A% B' i8 Q3 w- [6 z
    %>) }8 u6 u: k+ C
    2 i, ~" `+ c8 z& r8 J
    <%! int counter = 0; %>" O' R$ j( ?3 \0 i0 k4 C- o

    ( R0 b# E* F3 W
    & x% m, f) r; j9 R. [* R
    6 b9 e; Q; x: D9 P5 t% K7 E4 l描述Jsp页面翻译成Servlet的规则5 }" j) B$ B. J9 g/ [& `
    jsp中的注释标记被翻译成Servlet类中的注释
    7 H: K& \0 q: n
    % `! K6 j+ Y' n6 h1 }jsp中的指令标记被翻译成Servlet类中的import语句等9 |, T, h/ D- f! o5 x3 o

    5 w  ~1 `: a* ijsp中的声明标记被翻译成Servlet类中的属性% L# W5 c% H  o% `! C
    2 H, Z6 P9 v- ]- \
    jsp中的脚本标记被转移到Servlet类中service方法中的代码/ n/ U2 `* F4 B4 w9 b- X! X3 C
    , z0 y* l3 F0 R1 ?; J
    jsp中的表达式标记被翻译成Serlvet类中的write()或者print()方法括号中的代码( ~* l. h8 u* Z( G" c

    ' y! m# [6 M3 ?! v% n- v
    & u$ A0 ^- j) a& G" p
    ! k) y% K- `5 J+ Y/ w描述Jsp页面的九个预定义变量的功能、用法、并示例
    ; w+ C  }2 V/ ?7 q- j5 K3 Wrequest 与请求相关的HttpServletRequest对象  o" _  k7 ]2 K) e2 ~8 r# w7 ]+ U2 ~
    * J1 E# I# C* D
    response 与送回浏览器的响应相关的HttpServletResponse对象' Q( T9 }5 f* _; A
    % y% C  t0 P* K+ s' r  m
    out 与响应的输出流相关的JspWriter对象
    4 [5 s* j% g4 h& n' x) v$ Y) ^; T* e3 C. d& W
        session 与给定用户请求会话相关的HttpSession对象,该变量只在JSP页面参
    # g: V2 @: W  ~. f0 M
      V0 d( G5 u. ]9 K. E2 A与一个HTTP会话时有意义
    ( W( T2 i0 @4 _6 m& T% V# {( |" N) s/ a: ~5 Z, [2 i
        application 用于Web应用的ServletContext对象
    ; n" e7 b1 v/ E1 O0 K6 n1 U1 ~# C+ a' B; h7 P* K) o0 i
    config 与该JSP页面的servlet相关的ServletConfig对象' O. [5 n  J( B. J
    2 |$ q& R2 d/ p( t5 ^3 F$ I
    pageContext 该对象封装了一个JSP页面请求的环境' Q8 E$ U" d" {) G* n4 ~* v9 z

    6 s! k# e" w6 ^% y  y" Rpage 该变量与Java编程语言中的this变量等价
    9 H9 d1 F0 k  y" Y5 H9 I2 x
    # C1 M+ y) ^1 b    exception 由其它JSP页面抛出的Throwable对象,该变量只在”JSP错误页面”中可用
    . P/ K' K- \+ k+ f; a3 D  F: B' a- D2 I4 f$ }2 [. b

    . }/ w) a. S4 o  Q" Z; q: L0 Z! x  i1 i" ]: m! U, I* X
    page指令的功能,写法、并示例,并描述它的如下属性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding* f  h2 A. l1 P" j1 l$ O' Y
    import import 定义了一组servlet类定义必须导入的类和包,值是一个由
    ) C" G3 }( G3 _& |1 j. G6 Q: o# c0 ^3 }" U
    逗号分隔的完全类名或包的列表。3 Y5 w$ Q$ T4 q% o+ r3 _

    3 Q/ Z: ]% l2 u4 h. r9 `* T) dsession session 定义JSP页面是否参与HTTP会话,值可以为true(缺省)! i  m7 Y  H& g2 v& m" `

    : j/ a. P6 p7 K5 H或false。( Z9 \$ [3 ^* p% {6 {/ t7 p

    / v. q( |( F) g2 j( wbuffer buffer 定义用于输出流(JspWriter对象)的缓冲区大小,值可以为6 z, X( y  n8 Q; x) R7 V, o& P- g
    # X2 l  O% b: h+ x! v; k" n
    none或Nkb,缺省为8KB或更大。
    , A- [" T+ C  `" s- y0 d
    2 d9 J0 a  n6 q/ s0 perrorPage 用来指定由另一个jsp页面来处理所有该页面抛出的异常0 ~* U9 a5 o+ C, B

    - ]# i- J$ m) N. L2 {9 e+ o, m5 ^isErrorPage 定义JSP页面为其它JSP页面errorPage属性的目标,值为true或( V! s( x; |0 V! R. _# V- L% V
    + R: n) @1 m5 {5 j  I
    false(缺省)。
    1 o1 m6 W5 `, k& A; S- S, f# f5 j7 c0 j$ m! @9 Q
    ContentType 定义输出流的MIME类型,缺省为text/html。% p" r* c- ~) F
    / N. ^! a0 p# D8 w0 o, ?" U
    pageEncoding 定义输出流的字符编码,缺省为ISO-8859-1
    . u% N, H+ ^; w8 b# P; R: B! W2 x4 c; E8 ?9 P- Y) |7 W  K4 m/ P
    : C( U# ~; }! r% K6 j, f- K

    ( g- Q9 `3 O( X! C! A; g9 w7 F, U描述MVC各部分的功能?MVC的优点?MVC的缺点?
    9 g* Q$ N1 f4 [# X8 M$ ZMVC各部分的功能:
    ' K( P0 v9 J7 M8 _7 A. Z
    % c. Z7 l$ t% X# p- J% ]$ W2 j% QModel(模型表示企业数据和业务逻辑)
    ( j! c5 R- `, f5 O
      \3 g$ o* O' r/ h: U) E% @封装应用状态. |8 c  q! d; S1 ], \8 P! h
    ( L# b" I/ ^6 w+ ?8 e& z1 b& O, a
    响应状态查询
    ' R% K- Q" X' F' v' Y2 U0 `
    ( |( G  h  o; U暴露应用的功能
    ( C% |( r9 f! r2 W, P% n) e
      s5 }5 ]2 _, ]5 ]0 `3 U" f8 mController(控制器接受用户的输入并调用模型和视图去完成用户的需求)! P% R# F, w7 @9 |0 [! q$ s
    2 g  t# N! l% @/ Y4 i% Y
    验证HTTP请求的数据. V- v7 K9 m% _8 D& ?" q
    ' R0 T8 q6 n  K) S( \
    将用户数据与模型的更新相映射6 ~9 B3 t* x& M+ Q! r% }% E! l

    3 a6 [; C( |& [* r; q- l选择用于响应的视图
    # o$ v  a0 l# g5 n% T& t/ _9 }6 y7 r2 v
    View(视图是用户看到并与之交互的界面)' x7 D* r: h/ b8 _% x: J  X& ^  F' {
    7 p$ I# R1 U7 w0 z. w3 I: f
    产生HTML响应! a# G7 c3 m5 c# T1 }1 |+ y1 Z5 f

    7 R, c% m% `/ p$ P) I5 q8 S请求模型的更新
      N5 H2 w0 A5 z  N6 I( z  O! Z: L: A( L5 r+ F' v8 Q8 w
    提供HTML form用于用户请求" |7 ?- K" J0 x9 {& p( r+ l
    * }* U# L9 `5 Q6 W& W7 u/ O2 P
    MVC的优点:
    + |* ]' L( i$ n0 t% ?  V6 J: P9 t+ X6 J; x2 L. O# B/ {" b2 }8 I
            低耦合性:视图层和业务层分离2 u3 D! i7 C1 e( l

    6 _; }, w6 ?& W高重用性和可适用性
    8 |" N! n* G" D% H" t' t% C
    # x7 a+ y2 n, x  ~* K较低的生命周期成本
      N: t9 g- M1 @3 J' r8 x) u9 Q3 B$ N" j7 E0 u6 M
    快速的部署1 l# B6 r/ ~' ]
    * ^4 y+ L; [5 q2 b
    可维护性, }; G. S0 ^8 U) L
    4 @" N" J. \* b4 h' u3 X
    有利于软件工程化管理
    ( p; b8 _, ?4 t5 m) z. o8 s
    $ O* P/ @: G3 R1 V* h) Y+ M; _% A9 v提高软件的健壮性
    & ?- B5 u7 v8 d9 }. y+ t% N* k+ Z9 M2 I& t
    MVC的缺点:" u7 F: M* X) J" l- `/ E$ I4 {6 y5 ]3 b

    ) x# \. u4 ^+ Q  z        工作量大,增加工作的复杂性,MVC不适合小型甚至中等规模的应用程序
    $ M8 C  i$ E( v+ T4 w% ]5 ~/ [  q% n: l1 _8 \' Z* G6 B
    1 n) a& _" u& G

    # Z: x3 v/ i  C. y0 F) q什么是Model 1结构,以及结构中各部分的功能
    % h! W, H# j. R5 k. s0 C结构:jsp+javabean
    4 R) C& z/ i' C) F; E8 {( C) A( ~9 V% r( l
    Model1中使用jsp来处理web应用中的视图控制部分* R0 d% L* U2 j. h2 A4 q( K: t9 c( x! a

    / w& @" N  r, k, _7 B- SJavabean收集参数6 q! J/ V" `" n& U+ m

    8 |3 N7 y1 v' M8 V! K
    ) E6 C- d/ E+ x& _& D$ `4 \7 t
    # }, h3 c; _  r9 }$ w8 h* e什么是JavaBean?
    % x! f0 `1 A/ O; u* p+ n用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。
    0 a$ F9 C! L7 T) k; A7 D7 z6 T
    + k1 A: Z8 h' X& ?# } 5 ^. N3 P! G! V' Z# }6 P' R
    3 R% R' L2 n: @4 h" ^
    JavaBean的规则?$ a: K8 \; N" P$ G5 A! v% d
    使用get和set方法定义属性
    0 ]" E. X; @- h2 f
    - E6 Z3 j! o0 {+ {* z  b' V; o一个无参构造方法- o; t7 u; p( G0 `

      \5 u2 ]; Y  q无public实例变量( 所有属性私有化)# u( K1 V% Q) U* A+ F, z
    ) Z, F1 s$ ~# W5 M; _" W1 l0 F- B
    2 d5 t8 a  T- b, @; N# V/ ~( g! E- }

    ( ?0 Q1 W+ y8 t0 G" C" U什么是jsp标准动作?包含那些?分别都是什么功能?如何使用?
    8 ]# o% u4 e3 wJSP页面中使用类似于XML的标记表示运行时的动作, ^% |, c! N; m$ A

    ( F0 ?0 n) C) W  v7 F$ V. v: U7 gjsp:useBean" S- S7 O- H- M. W8 I& d
    ) \) V" Y' w3 T0 t  U
    jsp:setProperty2 R9 {1 `% p' R' x. d7 a0 O

    4 Q/ K$ M1 ^+ O+ r) k- Z& |jsp:getProperty. y- |4 I6 j# M- r3 }2 _- x& U

    $ T) B& ^: U% sjsp:param5 Y! m, k9 O, ]5 B0 ]

    & W3 N# L+ b( P5 ujsp:include4 [- ]1 a3 C  |0 ?* c9 a* F

    0 f5 Z2 S# R) E5 q, pjsp:forward
    8 ]2 E2 U9 g, e1 u
    8 a8 p( u/ |9 W; o8 C 0 z( P1 \3 s! n5 V$ V  b0 |& ~3 u2 c" ^

      W7 ]1 O. H+ T" ?用代码示例如下标准动作的使用:useBean、getProperty、setProperty
    7 _5 I  M8 k4 O6 I0 l" ^<jsp:useBean
    & S5 u4 g$ Z& ?) N3 H1 E3 W% v6 ^! N
    id=”myForms”
    ( b, D" s9 g- d9 q* b- k" f. x+ W/ F2 p& I" T4 F  b
    class=”com.base.mystruts.forms.MyActionForm” scope=”session” />& b# M4 v4 w1 B" T8 F6 Z8 j

    0 F* h' ?6 Z+ D    <jsp:setProperty name=”myForms” property=”name” />
    $ ^) u" z4 M6 i
    4 z. ]9 }% }5 D+ M" J$ e<jsp:getProperty name=”myForms” property=”id” />
    - e) r: o  y+ B
      _; I) I+ R1 |' s5 O8 B
    2 W, g3 E. x7 `/ Z; o& W2 P
    ) k3 s) B2 f, g: U描述说明Bean的四种scope# }& K. T' y3 x1 T4 X
    page# w) e2 r* s6 ]7 ]: Z
    * u1 q+ }1 `" U
    request' F* ]( d- L, e* E

    . P' M* d* e& u0 wsession
    ! d0 e8 Y& [4 P3 u& E4 Q! A3 B1 \: |. `( ^; c9 b
    application4 L% H- @( a5 Q% ]1 J: q

      N* d# p2 l) V# n
    3 y& s+ w# X$ ?2 O( a( i+ [8 ]$ X2 q' G/ k1 w2 X2 E( k. L
    描述说明页面上的字段和Bean中属性的对应规则# I' h, E, O4 \9 j* a- A
    id 指javabean的变量名% X. {  S8 q& p

    , M# M2 c+ m4 n. ^! Eclass指javabean类的全路径( s& D+ C9 y) S2 Y+ p* b8 X
    4 ~4 u8 W# ~: `5 }' \
    scope指javabean的应用范围
    # J- Z3 i2 h0 _4 ~' `1 X
    - a$ S/ `. p2 H/ F: w9 k0 sname指所用到的javabean的变量名
    5 }& u+ d1 u- V) L
    ! Y! R  h. A% l" o. s6 g    property指javabean中的属性
    5 w, b4 M' E2 }3 K" h  B/ I* `7 d, T

    1 ]5 [' }7 v: l) q& D7 P
    , H! Y( p+ o( }, Z. x1 D. C& R, r描述useBean动作的处理过程
    3 I, [8 P3 I1 o5 R使用id声明变量
    : ~& q; O7 y5 l5 ^& u) ]/ Q0 |5 @% @, i7 n1 C- @$ q
    试图在指定的范围内查找对象) H, Q+ g" X, ?
    4 ^7 _/ t! m5 B$ }. t8 N' r# o
    如果没找到0 K* e! \# n$ _1 z- ^/ B) T, B

    4 L- R8 F- `: e) q  ~9 ~5 \* q创建一个类的实例
    & o9 E* J3 H- A! P2 \
    : O; d. o$ p) Y1 B; K" M# a执行useBean标记体初始化对象# c# S. {4 r6 U- @7 l% O
    4 E8 d, E! z; d4 E$ N: p. l3 X7 w
    如果找到! _0 R0 q1 @/ ^+ C1 f1 Y

    * A- j  L' }; Z; f) r     将对象转换为类指定的类型0 q# k) D9 \, q' p

    / [5 U) J* N8 C3 w! \
    / R$ T" P" b5 l% u3 E) g9 d9 I* R: a' [4 c6 A
    描述forward动作的功能1 K) O8 l" F6 |( K) }' D
    使用脚本代码处理请求时,可用jsp:forward 动作产生一个不同的视图,; k4 O5 L0 I' x  f% v/ N
    : Q. H4 j7 Z: l0 v4 V: v
    使用同一个request:. K# W- v6 w! p5 o. }  ?& k
    & `' Y8 H( t& ?7 ^, T

      n, v' `/ V( p; F) U9 a4 t, H5 x; M- |! L9 h- K2 D3 _
    什么是Model 2结构,以及结构中各部分的功能
    , ^2 B% N  r' Ajsp+model+servlet8 r2 s, i& P0 x! d0 J
    # {- Z7 i$ c" v1 l& i% [
    Model 2架构使用MVC模式,JSP页面充当视图,Servlet充当控制器7 g2 _6 j5 |: W- G0 m! d
    , f$ ~  s8 z$ |1 a) T/ a" U
    Servlet控制器:# E; I4 y: p9 C7 S0 y
    0 Q7 B1 e3 ]% \3 y4 A3 c9 F) ^6 [- L
    验证HTML form数据
    % I' v4 h; ]9 d, e% J# l& h
    8 v: z& D' |1 G: ~1 s调用模型中的业务服务' W$ u6 S# q9 e- K% y+ i+ y
    , Y) A+ T/ k0 n
    存储请求(或会话)范围内的域对象
    % _& Z0 W* v8 y$ c0 v( [: ~$ ^7 |
    2 \7 \+ ^! t3 y/ B( m( _选择下一个用户的视图
    ! M3 X  Y) l: \5 U+ p9 L, C
    & C9 W8 C1 K0 o. u& Y* A- dJSP页面视图:4 Y6 D4 B* h3 t2 @! P) b

    / u! A% I- J- T% S9 P$ z使用用户界面(在HTML中)* P. A! b! D3 d/ p4 n

    / g: Y# {9 x: ]        访问域对象+ W* |8 C3 y, O# o8 X: Q: ~
    & R/ l( X! F4 F5 V! D! x

    + C5 R6 b4 @5 j' z* s6 M3 O9 G! A, g
    如何获得分发器?分发器的功能?; r, L8 ^+ n( Q" @
    上下文对象中的分发器:
    * m; G( M" o* S& L1 N! X: ~4 F, {, w1 R, |
    ServletContext context = this.getServletContext();# T* R; v" }; ^( Q3 c0 e

    7 h& _. o3 s; b1 ZRequestDispatcher servlet = context.getNamedDispatcher(“MyServlet”);
    4 d5 s: I% `# r6 a1 x' I: {- Y  Z- A6 F- ~0 X. l3 j, X9 e& K9 ?0 M
    servlet.forward(request, response);( W" ?, P0 W9 _; J+ |4 B1 |3 C5 s

    9 {4 w1 Z0 }& o* c请求对象中的分发器:
    ) l, N/ X; j! @% E4 p
    7 l+ s$ C% O( G* Y6 ~1 j3 h9 ?RequestDispatcher view = request.getRequestDispatcher(“tools/nails.jsp”);
    % L: \: X' N5 x! e( _2 e: X# h) U0 _! _3 {- `* q3 h# T$ w
    view.forward(request, response);
    ' |- ]) j; k" P# t/ @8 R% a' T# ^, }! g$ [
    可以将请求转发到另一个jsp页面,并保持请求的传递性
    " R) x" O! i1 X7 _' H1 y4 O- M0 H/ Q5 S( m/ d3 L% y! V4 f2 E

    & X% n5 f3 U5 b, o' u  }% h2 p* M" P0 V4 G
    Jsp中页面跳转的两种方式?
    3 K1 b* ?8 K' u4 u1 i4 D使用分发器跳转页面
    9 ^2 Y# o4 U# f7 o) _4 l/ xRequestDispatcher dispatcher = request.getRequestDispatcher(“url”);" z9 T6 d" k% _; F+ P7 X
    . D0 [. ]# M- g* }1 M0 w
    dispatcher.forword(request);
    ' l  o, q& |; |% a) i4 l$ ?1 ~8 _. e) Z0 |- `) U. K
        特点:保持请求的传递(上一次请求中的数据,在下一个请求中仍然可以得到);0 h- N0 f5 J0 C$ _4 e, m. Q2 G

    5 S9 o7 T- J. u1 i! \" e' @7 j        转发的页面只能是同一个Web应用程序的其他Web组件8 u. k$ n6 R' d, F* R
    $ C+ W4 _" N+ J
    使用重定向跳转页面- ?* l0 _7 l/ ?+ I; N
    response.sendRedirect(“url”);. \! F) r# p* W  M; ~  L4 w: C
    $ Y: r8 Q" e3 T2 M8 }/ o) k2 n
        特点:产生全新的请求,(上一次请求中的数据,在下一个请求中不能得到);$ S6 t! o% e8 X  s5 A  ~/ I

    . j- w; U  n$ r. D! b* A        重新定向的页面可以是任意的URL
    8 G, }% j! _: r& ~
    * \) b5 a; d0 P
    ; b* V0 s, t" q0 @+ j+ R8 m3 r* k7 n8 B* L' x+ H
    描述Jsp中引入另外页面的两种方法,并比较两种方法的特点?& T# K  C3 n" F3 `
    <%@ include file=””%> 在编译期间把另一个页面完全嵌入这个页面,可以说是一个页面
    7 G$ \# x% a0 f& r% v: q& {* L- l0 a4 V" W
    在这里可以共享变量- ?, E/ h0 |2 }2 f
    $ Z& [9 U5 Z; e$ A" r3 H% K
    <jsp:include page=””> 动态的再运行期间把另一个页面加入这个页面,可以说是两个
    # Z: m$ y9 T* s
    * R/ Z" I7 O9 ?* t  K: ?页面,不可以共享变量
    8 D$ b5 w; T' ~/ |" P: j7 q6 i3 A. t: y' G9 t5 E

    ( {  V3 B  I$ R' [1 a
    7 x2 D7 J$ W3 X8 h9 D什么是自定义标记
    " ?* V% U) `; H/ ^3 c自定义标记库是一个Web组件,1 n4 H) q) {* V7 h/ e. Q
    : r/ D5 O  {+ L( z
    包括:
    ) T% e, r" K- A- c) H
    7 R' |, _! h, w一个标记库描述符文件(*.tld)
    9 E* Z& x, j) t4 u1 z8 u# i
    0 M% B% D6 ~: c( E1 X; h所有相关的标记处理器类(*.jar)0 t) e; \9 \- N; ~3 r
    4 f) \1 y6 ^/ s% _! D" V

    " p% r/ h( @: v0 N$ D7 v. ]0 M- G% J4 K" D/ [
    描述使用自定义标记的步骤,以及每步详细的工作
    2 V% K& k+ ]6 Z: N: E' V使用自定义标记前,要拿到.tld和.jar两类文件7 G( x( @. `* p+ F% g% f" [

    * P3 A! U; P% G把.jar文件放到WEB-INF的lib里面。& ^* z) V( _; r6 y
    把.tld文件放到WEB-INF根目录下。
    # ]4 d# A, G+ \2 ~( ]在web.xml中配置。: |  w9 g7 v! l/ I  C
    <taglib>$ t; ~: H% a# ?3 {; s

    8 T5 Y5 i" x/ Q: @' O# f<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
    - {% D4 ?* r/ ^1 g, N8 L  }( I* {  U9 p) ]: C
         <taglib-location>/WEB-INF/c.tld</taglib-location>" h' j; Y5 [" A+ \

    0 d% H% `* p: {$ a</taglib>
    : S+ D' F! y* ?& d/ I: `
    7 P& b; u$ C+ G4 G! j: Z在页面中引用。
    " P/ X- u' g# H/ e8 Z<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“s”%>
    4 K( F, E- H+ L
    / n0 B& }  y1 E5 V, huri必须与web.xml中的uri对应
    ) _3 u9 `, j9 x4 Q" A" P" r$ W, p
    3 `1 M- I' G1 e3 ~4 T9 n5 D# _prefix是前缀,用来区分是哪一个taglib
    # @6 c  X4 g6 H; }  L- V: ~% D( d0 a+ L% f5 u. e% H9 M
    使用标记- Z3 m+ h; N: F3 ~3 P  h7 t1 W3 U
    格式:<prefix:tag名称 属性>1 e0 {1 \0 o* v* O0 `4 k$ s. l: i
    . c4 o( O8 N( k
    <s:forEach >
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    14#
    发表于 2014-12-03 12:45:59 |只看该作者
    在tomcat下配置数据源
    . Z8 k. D  y3 d9 K8 }1 d0 b. N1、服务器与数据库的连接0 d5 e/ U/ ~( F# p) O9 Q

    ' O3 D0 h& B2 H/ h) F配置server.xml文件5 a8 O8 c& _' n: F. k8 n! S% A# g* o
    + a. K; X. g+ w& r
    1.oracle' ^6 L7 J* h+ K, a" g1 e

    6 o# R% L% W/ k+ l9 ~<Resource name=”jdbc/company” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”0 s. @6 \. g; w. b
    . M; A7 l, U- V
                            factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”8 Y6 Q) i& K" r; N4 w7 {! Y
    - C+ P# I: z/ B, o$ z8 G3 r
    url=”jdbcracle:thin127.0.0.1:1521rcl”
    3 p  W1 c, V/ L' s' Z7 Y( U$ {' Y, a5 F( ?( v3 e4 T" Q
    driverClassName=”oracle.jdbc.driver.OracleDriver”
    3 ^: z/ }* J5 Z+ s  q8 Z, `9 a: H) f6 [; P
    username=”aa”
    / c& e/ P6 t4 B; c1 h3 }# ]" a! j3 Z$ M# S# A8 O
    password=”aa”* q) F3 w( \$ ]$ m
    2 s' x- h; t9 D( o! v
    maxActive=”50″
    2 p/ N! h+ }3 @  K/ I( p8 {7 T( W  f; E, S2 O. G5 {/ Z
    maxIdle=”10″& ?) C, M" C4 V2 Q9 \6 p

    - a% M+ F# {$ vmaxWait=”-1″
    : Z4 S6 T$ v( [) x1 [8 i; \" s/ b# W  n  V6 X
    />
    # g9 }; \% ^& ?" F1 I0 l+ B% h% w+ B9 U9 C' T
    2.sqlserver
    3 e& T6 d9 l# h" a0 Y
    : A1 w6 y7 Z2 ^' [, \& n4 f( u<Resource name=”jdbc/webpage” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
    1 a: J/ b9 h* x# _6 l* [6 ]1 X9 Q& M0 B0 ^7 K( w! i# X2 I% Y+ F
            factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”' O. Q7 [1 h. i" \
    3 J+ O: C, y8 ^! B
    url=”jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;" h% ^% E3 \# H( D' C* @% M
    0 j) P0 S8 t" O& d/ y- o$ U% w. d
    DatabaseName=webpagetest”4 n2 d1 m, P8 J. F  _, Q6 Z
    ( {9 X  M! Q, q1 H! D8 `
    driverClassName=”net.sourceforge.jtds.jdbc.Driver”
    ! H: \# n1 n1 k
    : F/ W; Q( B; p9 T- G. `9 a! cusername=”aa”
    ( e( u3 U. E: ?) L0 L! a3 l! A8 J3 K) c9 f; y* l' o' h
    password=”aa”/ C" l9 k' `7 z* z. r0 y

    . t' b7 k" g; y9 p  C, l  HmaxActive=”50″* g3 r4 j) C! u# l- g
    2 V! R& s& R4 Y& b& o. N
    maxIdle=”10″
    & ^* d8 d4 u# T$ h
    * [/ K& I  d  a+ l8 ~maxWait=”-1″
    - T2 b2 i: i( ]
    8 I$ B8 V! ^# F+ ^' j' d6 Q: M/>2 V/ e9 d' [2 t4 P2 N9 v

      w1 A$ f! z( q+ L6 t6 h. h: u2、配置自己的web应用的xml文件, \  Q  t9 f2 p2 u* J$ x

    : E9 E5 S* k* d" Y7 i8 n7 x
    - @% }. m. T$ O
    : S3 ~# e4 N( k# {& U<Context path=”/eb03web” docBase=”F:/workweb/eb03web”
    $ ?: G% `2 f- W% R2 ~& D
      {' `3 C. k1 Y$ k( j6 aprivileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>2 n/ X& L9 U. {5 e3 G& N5 G
    * W& |9 s( G( f. R2 _  F
    <ResourceLink global=”jdbc/company” name=”jdbc/company” type=”javax.sql.DataSource”/>  E& i* q0 Q( L) ~8 \
    / G3 G2 X- E# A' ?# Q6 X& A! y
    </Context>
    ! x! \; z1 m8 x" ]
    ; ?6 P9 r4 V& W6 v) {
    ( k- k  \$ R' i" A. K
    8 O& q, E& k! f* u0 r  s* Q3、配置web.xml文件$ T: a( a1 Q% ^7 e- o
    & l* @1 b% x$ p' B0 v5 x
    与服务器建立连接
    : F+ Q; `/ p8 B7 W0 B/ l8 r  U# I
    % T" @1 K+ q+ S/ ^6 V& z<resource-ref>
    2 e* T9 Z; i' a. y9 X4 |. ?/ W3 [( ^+ w0 n/ I6 p7 i. {0 O$ N" |
    <res-ref-name>jdbc/company</res-ref-name>
    $ G* O$ J  F: m
    " D! A- W/ m8 |  ]# l<res-type>javax.sql.DataSource</res-type>
    . ^. z# u$ I4 y3 w+ z( N! o3 C- c' S- {. A# H
    <res-auth>Container</res-auth>) g. O# W- _& ~; @! |1 Y: z2 d0 _
    , C# N! y- q1 o- _
    </resource-ref>- p( E8 c! Y: F" Q6 w

    1 t$ L4 e( m, w9 t# I. T1 g. u' Z" n* N4、在应用程序中不直接与数据库连接,通过DataSource连接池建立连接
    ; m: J- K" U! t) X2 i2 y
    ' v+ Z/ v4 z( _7 c# ]  C//1.在程序单独用时设置系统的属性,在tomcat下可以不用配置,8 ]7 J$ r- I& p$ [+ v+ k

    8 S; |" {3 D" }4 n! K* ^' O* RSystem.setProperty(Context.PROVIDER_URL,””);4 o7 P9 t6 }' D
    ) c2 d0 u; \5 f9 E
    System.setProperty(Context.INITIAL_CONTEXT_FACTORY,””);
    : G$ `  t) B% ?6 p; r
    , r- y" w$ p  }9 |( Z) z* V//2.创建一个上下文对象0 m  m# G, |0 L& w, N% W, Z

    & |0 g# H! V- h" e. a0 \  {0 eInitialContext context = new InitialContext();9 e7 t) I3 I7 }9 G
    & Z% L: d8 o# X7 j: p6 L
    //3.通过上下文对象在连接池中查找DataSource
    # x# P" O! \1 w8 g' [
      b9 J" m' p; ~8 ZDataSource ds = (DataSource)context.lookUp(“java:comp/env/jdbc/company”);, C0 P! c3 k0 g: I0 o: K0 Y

    & x$ }4 ^+ _; U) f/ B- m, S8 a6 U  y& t//4.通过数据源建立连接0 D) I. O# l+ Q: k: ]# h" t

    ( v  ?! ]0 ^( Y9 vds.getConnection();
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    15#
    发表于 2014-12-03 12:46:30 |只看该作者
    ORM对象关系型数据库映射- l1 r+ y: R4 c' Y" f$ z* b' ^
    (Object Relation Mapping)
    & u; P) b* c  I5 c7 ^6 \% b7 v/ I3 X$ a; L; V# O
    一、映射的特点
    4 J# `7 R. V' ^; v) t
    / }8 V% z/ P* k5 ]* S' x1.一个对象可以对应多个表
    * R! g$ h1 j7 ~6 A+ E* a% J1 X  Q. u) o3 ~
    2.一个表可以对应多个对象
    : u8 ]5 K( u- z( _2 j7 l4 ^; T* X
    3.对象和表的关系不用完全对应
    ! c1 f+ ]7 I( v/ p7 H6 R+ m( O' K( B7 d3 Q2 R2 c$ v9 [
    4.对象的属性的名称和表字段的名称可以不同
    % M1 H3 C. z; T4 B; t+ r% D* Z; h  x6 [1 [" G* U+ X
    5.类型可以不同,但数据类型之间可以转换
    1 g  W3 m9 b' L4 u( b
    , p/ h5 n0 @# s& c* @  ^7 j6.对象中必须有主键,数据库的表对主键无所谓6 @( p0 q" k+ R

    7 G1 k$ Q9 p4 g' X' C7.数据库中有主外键关系时,对象中可以有,也可以没有
    0 R6 y- l! R$ r; S+ E0 w9 U6 b; S/ @  m* U: ]. r
    7 M$ O0 D' ?' ]& v1 P/ }5 Y8 _

    7 g  s% N9 Z! T! T1 F二 、有一个映射的描述文件————>xml
    9 ]4 v- m% s8 c5 `3 y' b; x$ Z8 ]) j. u; M* R
    三 、怎样实现描述文件————>一段程序/ Y- h5 ^$ Z0 x$ O( D

    9 J2 B, G3 F) o4 Q: P9 J对象 映射(mapping) 数据库' k2 E, T9 g/ G8 |5 ^* X5 ^. {1 |( g

    # w/ E* N) P) ?2 N: _2 Wuser
    $ o0 J6 G# d& B
    : v4 H& f- m3 N: y+ Q- o8 {2 u8 wid=11
    ! b  A6 |& T. a1 o
    % g8 ]( E/ {5 c" V4 u3 O4 I1 Bname=”张三”———— > (1) —————> tbl_user(id,name,age,tel,address)' \% i# A/ O) P) f+ ~( C; X# W
    - g; n9 f- R0 C1 l  ?6 @5 R
    age=25 <————(2) <————) q, h# s3 ~0 M- ?* u4 |: C) m

    % F; p9 b+ I, L0 {/ w1 R  u
    8 R" e' b' Y1 w; W. S  |6 l5 o: `$ n2 ~1 w$ i4 L% _
    (1)从对象映射到数据库
    ) R3 I( H$ a# |( @1 E/ F3 v1 u
    + B; X6 `2 d  O) S" R& a( v" Z. }1.JDBC
    8 H0 x/ l) K' G* n
    ' z5 m3 c- s4 K0 M2 Q9 U2.根据描述文件来动态拼接sql" X# m) h$ z+ P) J' k  x4 I

    2 q' ?+ k5 n3 O8 d6 W9 o1 y3.执行,添加到数据库中
    0 {7 p- w" S% y' o
    " ]1 C$ V3 {5 y) ~8 p
    - m" m9 ~& v5 K; t9 Z
    6 Y  _/ x. o) o$ K! B(2)从数据库中映射到对象5 Q3 _: ^8 f( }8 e) g
    9 R: f+ h) O' w. @$ f
    1.JDBC/ D& S: M2 ?/ U, K) X, P
    * ]$ s- ?8 n/ H) [0 C$ R
    2.拼接查询sql5 U% G' J0 X3 r( y5 R

    3 z" ^7 l+ ~( O7 ]: G& c3.ResultSet3 q2 ?1 E: r1 ~3 ]
    ( l9 ~- H3 z% U6 \7 v4 }) D6 s
    4.Model
    . A$ S! B( }0 s/ I  z3 g0 H4 G
    & r+ q  ^$ I: i; d! X% W8 E
    " u3 `  n8 a3 @: B* F% X/ |: ^1 ^8 R: E% i* N7 B
    hibernate
    ( r# N- F) C: I$ e开发流程:
    " V2 |& Y) W4 N3 B+ A/ ?+ F! H  l, b$ j) w/ ?2 @1 ]& C. Q1 U3 T
    是什么?, i2 v* H: d& f5 y
    hibernate是一种基于orm 的轻量级的框架
    5 m9 }  Z( y6 y& E, h( B" s( c5 _
    : H$ q) @" n3 t, U  @$ J* f6 I 9 q- n0 M! ?) N, R) t

    , z. O# W2 @0 [有什么?; X- O; L1 k; I/ w1 b- \
    1. session 保持连接状态(依赖事务和连接池)
    * u, W! S5 a  {) p  ~
    $ o5 l; o4 {' r1 [( f, [8 h2. Transaction事务! ]3 k' B: `( x* K+ v; F* V
    0 m  T: n% T0 {. |+ n# t
    3.
    5 d1 _) |8 J9 k' F0 cConnection Provider 连接池3 A4 Y. @) j$ Q; n7 @/ `
    : h& T1 @) M9 }  O+ B, X

    ( }8 Q. u6 ]- F$ s$ m3 [7 |: m# h0 _8 G* J9 A  y$ {5 P7 X
    能干什么?
    6 t! X, l$ E9 Q& t9 V0 I* Y1.orm
    # x+ V! }8 }% b( N
    ! L% I: S9 v# P( P/ K2.提供操作数据库的接口,简化数据持久化的编程任务6 u4 a% V! T2 E1 h( E; h
    ! o' G2 }9 }. z% [; }; ^* @

    + X2 t$ D! [" {3 a% O. F8 n+ U, |9 k5 \) D2 H9 y" J
    怎么做?: R' o6 B, h& g  e2 b
    1.搭建hibernate的运行环境,将hibernate的包和hibernate所需要的包拷贝到lib 文件夹下3 m5 B* z" e7 B" W
    % N  `' K4 ^+ Y" m* x8 ]; n
    2.O(vo)$ p+ q; t8 D/ k+ A9 K7 k

    - u% X  `, `5 M" |3.R (关系型数据库中的表)
    3 [$ z+ W, w, v% e0 b" f1 s' n4 a% W
    4.配置文件: r0 m5 m; A) m/ ]2 t9 I

    ) \+ ^% a, w, f4.1 cfg.xml 放在classes根目录下,默认名字为hibernate.cfg.xml
    . u2 T( f4 X9 e+ A
    7 T7 k4 ?; Y9 _: s8 r1 ja.与数据库的连接, N' S. G1 P6 {  z6 s
    : D6 B* C8 S5 ^# t& A
    b.可选配置# F. r& k3 H  w" A7 t. v
    : m8 R* n7 s7 l: m) P
    c.映射资源的注册  V+ i! X7 ]& f/ W2 A( n
    $ |: M/ f% ^; e1 Q
    4.2 hbm.xml文件 名字与类名相同 并且与类放在一起
    " z+ Z) s2 D' ]; _8 @0 ]) n; q8 s9 d" u$ k
    a. 对象与数据库表之间的映射
    " E- ~  V" f. G0 Y! `' J% T& A6 o/ K0 k& T4 y9 b
    b. 对象的属性与数据库表的字段之间的映射
    6 W, ^% b: q; Y
    7 o" S; Q0 g# E( bc.组件之间的映射; m. m8 [" C, i* P' Y
    7 Q$ c6 W% l" v& f) T9 J2 ]
    d.对象与对象之间的关系映射; J% T/ x' K9 s- `) ]- l  a. J: w5 }
    5 `4 V3 k% Z' v- Y
    5、客户端2 M! N& i% m, N. Q$ w5 s
    7 J0 ?6 F8 T! A* ~; a
    1.得到SessionFactory
    % @6 w; ~6 f7 O! c& [- f& T8 j9 Q. L3 r. V" p
    2.通过SessionFactory 工厂来创建Session实例
    6 _+ n8 i6 Q. H6 e0 P, ~1 h  d4 [( [- U) M' w; o
    3.打开事务
    8 E' i: g8 C$ q# _+ s4 x/ e3 i2 d+ C/ h5 ~7 N3 H
    4.操作数据库
    8 E7 ?3 m8 `$ S. o$ B3 ]3 @# f8 g! _5 K  l9 m$ j& B  e% u
    5.事务提交
    , x+ `8 O# l& k3 ]: E
    # {% ?/ x+ K; B7 B' O: [1 B6.关闭连接: W1 d: g4 ^5 ]7 K

    + J  |4 \% T$ o1 q运行流程:
    : K: W; f0 W& c! H. t1 p3 Z0 R- v8 g) E+ G5 D$ x  x
    整体流程2 ]! E4 N; Y/ t  I
    1.通过configuration来读cfg.xml文件3 ?& s  A8 f, n3 I- U
    4 T+ d& x- ^4 V9 A: M
    2.得到SessionFactory 工厂(根据数据库的连接来创建sessionfactory)
    % ~- @4 E* h6 f
    , I" Y" k# }$ ?  L3.通过SessionFactory 工厂来创建Session实例
    6 u9 J2 r' n% c, j1 K5 Q) d' K( x  u8 K) S" p
    4.打开事务# j0 F+ a" z: \0 m( i/ L

    5 j: l' {$ _; _5.通过session的api操作数据库. x* t7 c. _0 I
    ) E* l$ l8 g! {5 K
    6.事务提交- h( {5 u& T' C% F
    5 D( h( g/ B0 V0 v' l% D  Y
    7.关闭连接
    8 M; _& M# K% G0 L/ `) `
    6 I  M7 U; I- y% g% a9 ]  k# R
    ( r. A! ^% ^9 p: }" Q' f9 [* [% e4 K; n
    save% O% [. H' v) P+ M8 `  M' k7 m
    1.to—>po
    ' {6 B3 F7 G, Z7 |8 H  v! K& c2 X$ t3 e
    2.根据model和cfg.xml中映射文件的注册来找到hbm.xml文件8 h. m% B, j& N

    9 @5 W% i" V2 u# i2 X* W& {3.根据hbm.xml文件和model来动态的拼sql: ^* S6 N1 J8 o6 M2 ~8 C
      f! J: e: g) K$ x" z1 i
    4.客户端提交或者刷新内存
      W3 d6 L2 V8 w4 F7 ~( {2 f5 g3 X0 _$ F2 X4 \* @& a4 v4 f
    5.执行sql,值放到数据库' o( L) a5 t- E1 n; t% D
    4 ~8 x" s! W2 [- T

      O+ q& X+ B( x" S
    0 v& \) s! r; G  Z7 v5 @update、delete8 Q( S, w9 E4 b% v. m+ H
    1.根据model 的id在内存hibernate的缓存中查找该对象7 K$ f7 J0 B8 {) [* D& m. B
    4 [( Q. X" Z) n! q
    如果内存中没有就到数据库中查找来保证对象的存在
    5 L2 Q  s0 E1 F! F9 w  G
    2 P; c$ B, z7 E8 |) b+ G% ~8 f7 n' ]2.根据model和cfg.xml文件中映射文件的注册来找到hbm.xml文件
    9 c' e* U, O% R. U2 j8 M( d9 T  @! u9 Y: f- x9 R; Z
    3.根据model和hbm.xml 文件来动态拼sql5 z4 L9 x: L0 Q3 P

    & @) ^4 p' ?3 w9 L" {' F4.客户端提交或者刷新内存0 l+ c* N! l# t4 ~
    6 N0 L9 p/ W% L- {4 Z# E& G, M% C
    5.执行sql
    ! x3 a  z1 ~9 ?: C6 Y9 s( D
    4 [7 M+ Z/ t/ |6 o " B7 r. N+ b  Q) h4 C1 p
    $ D8 Y+ I, T$ y1 ?) J, y3 C
    Query
    5 T; l# N( a/ _& Z; H9 y, y3 @  cload
    9 X) S3 M. Q, N5 `2 i0 `
    % f4 Z4 T9 l  H- S: h1 K: i1.根据model的类型来找到hbm.xml文件% S' `! n/ K: Q# U/ f/ ~
    5 W2 w+ x3 F+ E0 J6 X+ S6 p
    2.判断id对应的对象在缓存中是否存在,如果存在,就直接使用,如果不存在就进行下一步。4 Y; i: Y7 T0 B  q1 L
    % j1 |: M$ L4 j$ ?% `
    3.用id做为查询条件来动态拼sql, ^% Y# s% b3 A( N6 W
    5 r/ @5 |; Y1 Z1 `
    4.执行sql 查询(先在内存中查找,如果没有找到(会抛出例外),就去数据库中查找)
    * a9 W( b/ ~$ Z+ Z$ U& G
    + _! U6 O! I3 E; F7 Z4 ]' |/ J2 Z5.返回一个model类型的对象
    3 Z: c' @' j! s% I5 \0 y) R: C& r  `+ }4 n
    get
    , l! P3 Y6 |2 w3 s" v* B7 o  q% B  ^$ I  A
        1.根据model的类型来找到hbm.xml文件
    ( V  |: N9 L: @& k! C
    ! }( O% `( H) t  y8 A* ^4 w/ o2.用id做为查询条件来动态拼sql
    - E6 I: _4 v6 Y" X
    - ~6 Y8 V4 _  ~5 a, J' n6 W  p: [3.执行sql 直接在数据库中查找,如果没有查到就会返回null
    # L6 t) r' i8 I6 A
    ) l( X! y+ b; N+ }. _5 Tquery; h+ ?; m+ l$ D1 C3 x
    ) {6 r6 D4 w, T9 L% s
    1.分析hql语句,得到model的类型- ?, A6 }1 O. m6 R

    3 k4 r8 [3 C* Q5 k0 `2.根据moedel和cfg.xml文件中映射文件的注册找到hbm.xml文件
    / y( u# ]- z8 v! l! F% p% E# z' y! e: @$ \# g8 }4 k
    3.根据model和hbm.xml文件来动态拼sql2 `& ?; B! H6 U2 R( H

    ; x2 w, o) L( G4.执行sql查询数据库" Z: w, g) G- p8 I. ?

    7 Y# ~' Z+ a: K5 i3 Y5.返回一个resultset9 M4 V. I% z# X& h; \  G) Y+ W

    " l* B+ y" G4 u" |; B- {1 t6.循环resultset的值,放到model中在放到集合(List)中
    ( g5 d9 ~7 P& g, g+ ?# M/ l& V* z4 u' r9 L& z  Y+ s" {1 e

    # J( o+ L- t$ ?' y0 P4 p2 V) p" V1 [
    谈谈hibernate缓存机制3 @  g& }6 Q$ t* d1 F4 O

    % M. I* v$ Q3 z+ P- S# @缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了。打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去数据库中取,也省了很多事。2 j$ {6 F7 J: f1 a1 a
      o- v8 |( k* F3 K/ ?' F2 d- _

    . X1 D  w4 ~# U. @$ T0 d1 u! F' U! k
    hibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。
    3 i/ {% d* x: Z/ j; W8 v/ e8 l% O* k

    1 `: y& c7 g! {. j. T8 P) o
    5 s) W( q& G7 w对一级缓存中的session事务进行数据的预存取,数据在各个session的上下文中存在(单例),当session关闭时,就是session.close( ),整个所有session范围内的数据全部清空;二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二级缓存只有一个区域 ,画个图比较容易理解。$ B( s3 T# Z% }9 q7 r) t2 a
    3 V# ?; Y" a1 H, P$ s7 ~/ x

    5 m- W' }. x# H  }8 ?' Y+ z2 ~3 `& \; s$ G- Q
    | 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|
    + O. T( c2 B; Q, K7 w5 t) G( B8 l; E' k3 }% L( g  [$ c
    | | | |
    # [+ Q4 ?7 N- o4 }
    $ q) h* i6 W+ q| | | |
    6 G( V8 U% n, m8 m
    " i* p0 `$ S/ ~5 d—————————————————————————————————
    4 X( i+ k5 |5 z
    7 H! V- ^; r( psessionFactroy级别的二级缓存
    * E% Q1 W  Q  o4 y, p" t, @' n  k
    ——————————————————————————————————————-4 j6 p) G, i7 E! q0 V; G: Z

    / |8 r6 N- C" @& N; j3 C|
    2 Y- Z* c& a# |; F# p9 G' x5 Q
    " l% h: O4 S% h! [7 T, |1 Y* i|, b- Q" m6 k8 X& X. m$ b& q1 @

    3 Q* K0 `+ L& K4 l2 T% T+ l|' w2 [/ q% M3 K, b" _

    0 S- _8 p8 t) o% s: ?——————————————————————————————————————: b$ D$ S6 G, \

    ! e- F3 \! E0 x, i. q' UDB; U7 r3 M2 F, f4 g$ V

    / A2 a% e, D8 f" z& n9 e$ P—————————————————————————————————————–
    $ R8 D0 U  z/ J; q# s: f4 k+ E9 ~" _  Y5 x* t8 J3 [: ?. y
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    16#
    发表于 2014-12-03 12:48:12 |只看该作者
    Spring
    + U$ ?8 Z7 z- r  w8 ^5 T, J
    • 是什么?
      % k" e9 M% V& {( b" E1 W

      " Y2 q+ M* t/ M& `/ P5 h2 f

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


    3 @0 m4 Z6 P- k  {
    • 有什么?8 r! T2 X% n8 j
      . {* g1 T. Z& f- t$ \" Y) u2 h

    " I5 k3 J8 v9 W3 K# L  w

    每个包的功能:

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

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

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

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

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

    AOP :面向切面编成

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


    + H' z+ x& ^* l7 q7 u% U) n; `9 ~& G
    • 能干什么?3 y7 V6 D' ^0 P% J& T8 |

      ! b  A' B% P" b( m/ n

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


    $ R% d2 B6 E' k
    • 怎么用?5 b! N$ v6 r6 I) }- {7 `

      , y+ ?1 s) s7 [
      • 搭建web工程,引入spring的jar包
        ) S. q# R) R8 f9 H
      • 在web.xml中添加如下配置1 |- h9 c" o# [! y3 a' y# w
        2 M! V! v! _0 V$ [

      / K& O& U) M; ]1 Z% T" \0 w( ?  B9 U5 w! t" z2 Z, x9 U7 {$ T9 ?

                contextConfigLocation
    & a3 M5 h3 G" }+ K2 m# L9 M/ G

                classpath*:applicationContext*.xml
    " c4 O* }) J3 r! t

        0 ~& Y  Z1 _4 s, E

            
    0 ^5 X: t  k$ t; }$ U; U# l

                struts2
    : f( s4 w+ v$ Z! [

                
    5 _/ c8 I2 d  ]: }+ j8 I. M, z

                    org.apache.struts2.dispatcher.FilterDispatcher
    0 i7 q# ~% a2 n

                / t/ @; B" n3 ~

              {  o; k2 A! d4 q

            9 [; I1 M- j7 P1 F% r* b1 K

                struts23 E( O, e: {! G. L5 c5 G. C

                /*5 v/ Z6 R" l  D: U2 q3 n' S

    8 C8 l) n9 i. v2 l% u# X/ e


    ) ^, l! C& S7 Q+ S5 d+ v

                
    " j+ a: Z$ j: w# f. q2 \

                    org.springframework.web.context.ContextLoaderListener
    . [% ~5 T6 D/ x# P+ T* ~! S" A

                
      w* a2 X- H& q3 E8 o; o" I

            

    • 部署
      6 D' r3 B. S) p/ c' U7 N+ E

      8 P1 m+ ?$ R! H& R. i1 h! |1 F; r

    , ?6 }, g4 b) E& v7 s6 }1 g  }1 Z- S2 z# |
    " i! v: F* W5 n, N8 Q- M
    • 容器和bean
      * p3 l' o+ N/ I+ K

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

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

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

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


    8 D7 |1 G5 _( S' v, I1 S; v
    • IOC控制反转
      4 b& c$ l5 u7 J/ _# z# y$ {( p3 s
      8 T2 q; j/ `! T1 F- }7 X9 \

        o# }% `# @7 O7 ~( c ( m  y. G- M# u# l3 K) R7 \
      从前的应用程序想要得到A的实例他会直接主动的去拿,当用了sping后,应用程序由主动的去取变成被动的等待,由spring来控制应用程序所需要的对象

      0 a9 k! D, N& C
      • IOC的优点
        . }0 B7 P! i! J/ [7 a9 q+ R- s$ t
      1.可以通过IOC来获得实例
      2.可以通过DI来获取注入的资源
      • 配置IOC的原则6 B$ ]1 G5 \. z
        • 一定是可变的资源才采用依赖注入
        • 一定是层间的接口或者是模块之间的相互调用才采用依赖注入- V9 x8 j: o3 p% [" }& q8 n4 j0 T

    3 ~, L# \% A! D2 C( g6 R( [
    • DI依赖注入
      1 A$ o7 O  b8 v- ], P

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

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

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

    例如:

    在配置文件中


    6 d* d3 L4 ~+ {5 @
    / }! d& ?- t, K% I. l! j* Y) i( a1 g1 T/ O/ y& Q

    在应用程序中

    Public DBDAO dao ;

    Public void setDao(DBDAO dao){

    This.dao = dao;

    }

    3.构造器注入


    , Q: a/ c8 B; Q% U' `/ }5 [0 [

    4.ref 表示参照其它的bean

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

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

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

    6.lookup注入

    7.singleton

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

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

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

    8.DI的优点:

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

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


    $ ]4 y7 d; }! Y* T; D- e
    • Aop面向切面编程% u* J9 `9 m* m& B
      9 V$ z; S3 [& g" C2 A

    1.AOP面向切面编程 一些较好的模式或者是示例—-范式  M+ j6 _% O  E; f* _

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

    2.AOP的思想: 主动—->被动(追加功能)0 r( x8 z: h3 f! z

    3.AOP 的概念" c: U& C4 P2 j- C1 V

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

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

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

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

    5.引入 :扩展的功能

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

    7.aop代理 :实现机制

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

    4.AOP的事件机制2 G: ]( g  `, T! ^, u

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

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

    3.找到切入点

    4.确定连接点

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

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

    ) E4 S, Z" l+ f% j7 F

    8 F! c7 o7 H% P! j" W
      k' Z5 A7 Y2 C  @6 f+ U
    - {/ F0 `3 d5 n7 G9 k  x4 A* @3 z" Z; c/ p& a& p

    # }/ w, E2 Y" _( r5 ^. N; F0 l# V: W4 M9 i# a- \

    5. AspectJ4 _9 `3 @0 `+ T; ], b

    5.1.在xml中配置比较烦琐
    8 T. [" G+ M+ A& D

    所有的入口必须从一个代理(ProxyFactoryBean)开始4 g& Q' [! i1 P6 [$ Y0 q


    6 t1 _2 _0 x0 |+ H& n
    5 I2 P. m9 K) ^. B

             2 M& i0 s! U0 Q5 R% a+ V6 ~+ V

    5 Y* E$ m2 _2 T# H2 w3 l
    ! e7 }$ N- o5 p+ U         
    $ [5 s, k! f0 }& }

            & |8 @1 P3 F0 a

            

    / D& V5 j/ x, r' M
    expression=“execution(* com.javakc.aop.MyTarget.t*())”/>
    1 h" H: r# ~& X: _0 {) q- }

            
    9 J8 O* O% H4 h! z) Z

            
    5 l$ R4 n8 ]/ H2 m4 Z

        $ L% [1 W2 g2 G$ h5 Z2 O

      }( w' f& U. e& x+ x  L. \

    ; h" ^; _* Y% F' n6 g# r

    5.3.使用注解的方法相对简单# P7 }+ K* `& I! C3 y% T

    @AspectJ的基本语法" q' L) f7 g/ n; Z

    1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面& h! Z0 L1 O/ t. `) P, D$ L3 G' c

    直接在类上定义@Aspect
    % [" F, J) N. @5 D) p

    2.@Pointcut声明切入点
    + K, [' D5 H- j* ]# m' [! J) K& G

    2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字
    " g$ Q1 ]' L4 N  w* k; \" V

    2.2、可以使用匿名的pointcut
    + `1 g$ f( x3 n; r5 J. {

    2.3、执行切点的几种方法7 A. a( Q* F$ W; y, y/ s; ^6 M- @) h

    2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法3 I" f" M6 m4 S

    2.3.2 within 指定到包,不能指定到类
    * c+ z. ]* o) K$ D

    within(”com.javakc.spring..*”)
    ; D' m1 \9 X9 R

    2.3.3 this 指定到实现接口的所有的实现类
    " T7 \9 w  e- P8 B# R

    2.3.4 target 指定具体的实现类. H& W, k- ^9 R, K

    5.4.advice的五种类型的示例( q* F2 z( R3 I* r

        客户端必须从接口走才能得到监控,实现想要追加的功能# j+ {* Y: M+ X" D: D+ a

    5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)
    7 ^6 U( V( t' c+ p- Z

    追加的方法的参数名字一定要与retrning的名字相同3 V; q& d  }7 z

    在注解@AfterReturning中必须加上pointcut和returning两个参数1 L5 L0 @6 P5 K* T2 `! C. V! \) {$ k& l

    pointcut指所要监控的目标对象的方法3 i0 c: I6 U+ l4 O7 {  f

    得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配% `+ y/ F7 f1 e4 t

    完成追加的功能- q1 Y  R# n& P: t

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用$ w# L' T& W% T! k; s

    (1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)
    0 F( M5 f! u7 O2 }: K+ u: E% }

    (2).0 U) O0 a: ^% F4 `

         2.直接引用匿名的pointcut
    - r; p6 t, P6 l! m

         (1).@AfterReturning(“execution(0 D9 f6 r3 q0 k  M

    * com.javakc.spring.schemaaop.Api.test4())”)0 E% S) Z% j- I2 i8 O/ W; Z

         (2).@AfterReturning(pointcut=
    2 v4 s' Z7 i9 P' c- r% g

    “com.javakc.spring.schemaaop.TestPointcut.t4() &&
    + u+ W: h" p  j  |( t

    args(str)”, returning=”retVal”)9 S8 |3 `9 O" j5 F9 a: f2 Z9 s

    @AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)
    ' [( S% d7 s, j: E

    public void testAfterReturning(String str,Object retVal){
    & x, P% k) L5 e' K3 r6 u! E8 z

        System.out.println(“afterReturning1=>”+retVal+”=>”+str);- `" _0 L" o- F/ E

        }  T4 k9 W/ J# r1 S( S4 ^1 A

    5.4.2.@Aronud7 v/ m6 @" `" L5 }* G. m

         注解@Around环绕追加功能;
    9 P2 I: a; `6 N

         在执行目标对象的方法的前、后追加功能;* O/ s* j+ e  S  k+ p

         必须有参数;第一个参数的类型必须为ProceedingJoinPoint;
    8 E3 k; z( J6 `) m& D; k. K/ l

         通过ProceedingJoinPoint的实例的proceed来调用所监控的
    2 t- @. f4 P& J3 U

    目标对象的方法3 L3 {4 W+ L- D. J5 _! y6 B

         1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    ) n+ }* w( l+ z! @

         (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    6 T9 h5 I+ F3 C+ P  I7 ]2 ?

         (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()$ W1 @; D' c- p

    && args(str)”)
    ' b4 ]2 d4 y8 B# v4 X8 }* h& X

    2.直接引用匿名的pointcut7 p# L' p% c: j4 i; \

         (1).@Around(“execution(
    , o2 y0 ~+ l' D6 Q2 T+ A

    * com.javakc.spring.schemaaop.Api.test1())”)
    / b) u  F0 \2 E4 n3 H, b" ~

         (2).@Around(“execution(- u, q. D8 ~/ y( H: i' R/ P6 J1 g7 V

    * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)1 r, M) Z8 O8 L+ n% C- \: Z

    // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    6 C/ l2 X$ {+ O+ J, _9 j- B

         @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)1 Z% F# p' w+ K9 \

    public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{
    ' j( ~5 U" P& R4 ~

        System.out.println(“around1==========before1pointcut==>”+str)
    7 L2 _$ P5 L8 i- a2 Q

            Object obj = prj.proceed();! ]* y  t2 y6 K2 j7 W! m

            System.out.println(“around1==========after1pointcut==>”+str);) d- b# c( S8 x

        }4 [2 L7 D& g" L

    5.4.3.@Before8 k% V, Z1 X* T. J8 z4 w

    注解@Before在执行目标对象的方法前追加相应的功能
    : S# m5 A' s- S

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    3 x  J0 [4 ?$ x$ M/ n7 Z

    (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    * n; S# |- `8 u$ w) ]' v

    (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)$ |0 ~% ?) f" E' X

    注意args后的名称与参数名相同1 j. e( J8 X) m- J

    2.直接引用匿名的pointcut
    * ~2 m3 O& o+ |8 {; R+ X) X5 ]& K/ n/ r

    (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”): L& o, H  U6 H" w/ W0 H

    (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)- N' O, q/ _2 W  p

    注意args后的名称与参数名相同( W5 a) R! j! Y; n$ f6 [6 |; s7 C" O

    // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)/ Q3 B" [4 x+ O! d

    @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)  Z$ n& b; ]* ?% W! t

    public void testBeforeParam(String str){
    1 E: {, A+ I  g9 W: j

        System.out.println(“before1=param=>”+str);
    : @2 V- n7 E$ j/ g+ ~# U* J3 e

    }
    # g/ H! C1 ^: k# |9 P/ s

      n5 B  [2 q/ C+ C8 F4 a( B

    5.4.4.@After
    ! O: ~! V" a1 @5 k" n* T( W

    注解@After在执行目标对象的方法后追加相应的功能
    0 o' B6 G: \& l1 c/ J

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用' A( _' l2 P% n4 l" u

         (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)9 u& F% u/ |5 R+ g' ^: d

         2.直接引用匿名的pointcut9 P3 R- S# @, z/ f3 t( |. f& a

         (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
    , @: H! E! f, w! |) d8 y( ]5 A

    @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)! Z1 K3 d) y1 d- B% F& l4 ]5 n

        public void testAfter(){
    2 O/ v; J% M/ H' Z5 t

        System.out.println(“after1== >pointcut”);9 ^! ~/ m* @! n: b# }$ D

        }- R/ [4 t0 U# g* y( V# v. e

    5.4.5.@AfterThorwing
    + o  H4 }+ O) U. N  v# s8 G


    2 ]: I2 P5 y& ~- A$ P+ B! ~* V7 {; U
    • 描述一下spring中BeanFactory和ApplicationContext的差别3 i( U  m& ]6 @+ i8 K% ^0 N* X

      ' g7 x/ b' \3 \( L% p& x

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


    * L' {/ Y9 i1 B3 ~" O
    • 谈谈spring对DAO的支持4 g: j2 q1 A9 t; d$ v, Z1 h0 o6 V
      6 w! D7 g8 J2 H. T7 _" j' X5 `

    Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。$ \1 b7 Q) |' J) p- O* T

    简化 DAO 组件的开发。$ n/ _( c" |1 T: D  b9 J- B
    Spring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。1 ~2 o, S- e6 {6 Z3 ^

    IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。" P* q. K/ ?" c- ^0 e1 H) M8 z

    面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。/ o7 u( ~8 M/ b- V- K) X* o

    方便的事务管理: Spring的声明式事务管理力度是方法级。
    : |1 }- A' S+ W( }0 ]

    异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。3 `! ^, Q- C4 q; F1 l# r


    . u+ @; c4 o: W; G& |  h
    9 b2 T9 \  u% w3 }; v! b
    • 谈谈spring对hibernate的支持
      5 B- |3 @' Y* {- t) z* g& [' u
      6 O% P" J8 t" ]3 t; c* x; h2 M0 e

    在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。, q2 }! ?$ t/ d

    一旦 Hibernate 处于 Spring 的管理下, Hibernate 所需要的基础资源,都由 Spring 提供注入。Hibernate 创建 SessionFactory 必需的 DataSource ,执行持久化必需的 Session 及持久层访问必需的事务控制等,这些原本必须通过代码控制的逻辑,都将由Spring 接管ataSource, SessionFactory, TransactionManager等,都将作为 Spring 容器中的 bean。将这些bean 放在配置文件中管理。
    1 _5 ^% V% T7 U8 U8 |3 F" x4 I

    1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:
    1 ~* |. O6 B' c6 u! r


    8 d- O! ~  T! ?. X( r

            class=“org.apache.commons.dbcp.BasicDataSource”>+ E" z) R- T/ ?; i2 ~, L1 m0 i

            
    / z* A5 z6 M1 _5 R/ H  F

                oracle.jdbc.driver.OracleDriver
    3 t5 n+ @0 o" K  K, e$ M4 I9 @

            . U2 M' O4 r$ R+ S

            
    . I( n8 g. F" \8 o7 b

                jdbcracle:thinlocalhost:1521rcl5 t, S3 d; |: ]6 s  p$ v% t

            $ K; w! p9 C, }) i# I1 _, d9 ?, a4 d

            ' l. ?# l  A! k

                javakc2) \5 m7 l8 w; a" _: G

            / t( z; I" o. v# Z

            
    0 m7 _8 }/ Z% s. u+ @5 o+ z

                javakc28 }( ^+ y; d" [) M8 v# j7 G) b

            1 @; Y8 k: P9 W& ?" Z+ o

        # q! Q5 P7 G3 v2 Y, }& O

    % F5 f$ D/ }3 y% ^% f4 K! w

       

            class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>
    ) G1 q. O! l  k/ D# k; t6 P# \

            ' x: M; |; \* G' ?6 Q/ \- V

            
    1 S" V  y9 F, U

                
    . w( n: ]  D0 K+ u& h0 M

                    com/javakc/spring/h3/UserModel.hbm.xml
    " n' s7 D* l* g9 a* Y  Y4 T" v

                - t8 Y  X4 S* n+ z6 `, g# D

            
    2 q6 j0 f2 l4 f; j9 M* y9 k- s

            8 r9 B- K5 F2 {

                # u3 @* k# R7 G0 \5 j, f5 D" I; O

                    hibernate.dialect=org.hibernate.dialect.OracleDialect
    % a) j% a% L( r. o( B, ~( e& z

                
    & f* A9 D" q5 v" {0 a: ^* i

            , d$ {; ]; [0 G* h: H) W0 d

       
    : x4 R9 ?" O3 U  J% o8 ^

       
    # I9 E* u$ M0 L. p

            
    % h) F$ ~' s' T" D

       
    & v; n( L# L3 F; V0 H6 ?2 G

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

       

            class=“org.springframework.jndi.JndiObjectFactoryBean”>. ?8 j- G# e6 y; f7 E! [( r! @

            
    ; z' B5 Y: T9 o+ r- y; c* c) K

                java:comp/env/jdbc/myds9 u0 b" N1 b6 r, I# O8 |

            + f3 g  x) w" E4 o7 N/ Q

       

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

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

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

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

        / P) X! ]$ ~- z6 x

            0 n, K# o4 `+ q( D9 }9 b

        2 [. s5 ?* _5 ?2 q4 e


    * h6 T% p9 g* `/ @6 i' P

       
    + q; l0 w. N% N& X& ~/ b* Z

            9 [) Z$ I9 n& _; n" L+ }) m

                7 l9 P* K1 g+ ~. m/ J! C

            
    & \1 q7 h' K# W6 `1 w  m/ s

        4 L: p) ~+ F% s* p, _  q+ k3 N" M! x

    1 G5 |* F6 l& s( b' w% t

        - \$ m2 [: W% T" U# V

            
    % n2 q- V6 U/ E' W

            * L' P+ Z3 i" O

        4 a* |! ]3 g6 I$ Y7 ?' a" {) |

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

    , h( t$ b' X; p; ^8 Y9 m6 p
    Spring2.0之前事务的写法
    $ I5 f. l' W# J- g5 k
    * L3 c: d$ V! @8 w" q

    % u5 k( C: W0 T& z        class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”6 A# K$ E9 _1 A) y5 e3 o6 e" m
    + M5 n, f5 U8 A0 N4 h, J
            abstract=”true”>+ f0 g8 K8 V0 r2 k7 F7 x8 z; M0 `

    5 v3 Z. q  ^  d1 P& ~# H1 \: u* r! c- o

    " \( K1 G3 A1 g$ ?8 r' [1 V2 I( x- L3 S. h' {
                    PROPAGATION_REQUIRED,readOnly/ \+ r6 l7 `- x  C

    8 ^1 C% c% w$ s                PROPAGATION_REQUIRED
    ' A# C9 |7 C- I, T: N! m! M
    0 @9 z. `% `) r. p9 P' n0 @0 D
    / H* N6 M- t* @8 @3 m$ q* b+ J3 b8 G
    8 w4 k  |* O6 W/ c: W0 r- h' e
    9 O; @, p1 N. z; e9 U' \

    ! B) [6 Z5 |# x' x& K. ^1 ]; {; H/ C( A9 \2 W% N! l9 i
    • 谈谈Spring对事务的支持1 y' ~! [5 C7 ~, \1 D& e
      7 m5 v8 N1 ~( c9 V


    + F) ~" W2 V4 H' C2 ^% g# L, y1、声明式事务管理:

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

    2.做法:

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

    2.2

    2.3 注入数据源


    ' }- ~8 u( {* o
    9 x, e' t- c3 J/ Y) E& u4 u; D  _3 i8 [

    ) n% ~/ [) q. y) G% \/ z/ a. ?, Y. {% i! o9 T0 ^. M9 O( a, f

    " }8 v" U, R& @9 e9 y. s7 \/ G# D

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

    / |& |' ?; J3 b8 |1 ^- G

    7 e, |7 W2 C5 E- `2 i) {) e! ]+ O1 P' z$ t0 w: J: g

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


    + c& e4 ~: m) V) E7 C1 m. a! s# }0 Y. R  R- l/ z+ C) L8 w$ B

    6 @4 t9 N* Z4 c7 G7 v0 W/ {
    ' ?$ K  j7 N# Y( Q- k) q9 J, z
    ' d% D, A$ K$ W9 ?& ^1 h1 K7 f

    2.6 定义切入点


    * X, ~' `7 @7 H2 s7 t$ \
    ! D8 m; G9 B) G& P
      k6 t" Y5 h! V$ O; ~6 |% f' c/ c( l3 {8 c' h7 b
    ( Y3 I; l$ m: d. S

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

    1.注解@Transcational

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

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

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


    * _" }  V5 V) {2 @
      I8 E7 k! l$ c7 \9 W

    如何在Spring中使用Hibernate的事务:
    $ K- \* D8 ^% O" i, o


    . m7 c, s' M) N% z9 S. [) i7 }

    5 ?- L5 ^6 m) t- B' q/ ?

    / O- b# j9 K4 {2 ?

    如何在Spring中使用JTA的事务:9 Z; L) B4 a: i


    * ]; x; n3 U/ R! K: c
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    17#
    发表于 2014-12-03 12:48:32 |只看该作者
    事务+ W2 k8 W1 G; l) k0 K3 B8 W
    ACID% `& q7 [  h% q
    (1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失败- J7 z# C1 g: G% ?* h  x9 h
    1 t, J) ?& x# Y
    (2)一致性 :操作的前后满足同样的规则,保持平衡。& @4 S* Y3 l9 y% F; p( d

    . X9 x1 e, t$ b" D( h7 I0 D(3)隔离性 :在事务运行的过程中。事务内的数据对外的可见性和可操作性(必需由数据库的支持)3 \( y+ _) n( O8 q3 U4 ?& \0 e, ~
    9 {5 @0 r3 d3 Q* T& i- X
    (4)稳定性 :保证数据在事务的操作的过程中不会遭到破坏,而且是永久性存储的
    $ V- ?1 h% R4 z- v
    6 `. k8 ]  S! a) l & M. C) c4 }4 d# w3 _/ T( t
    & B9 C9 k# V$ _, B. z( S4 h
    事务模型! M4 h% E. f- i. O! g! N
    (1)经典事务模型又叫平面事务模型(JDBC) 事务不允许嵌套
    ; s. ^9 ^7 o9 Z# o/ T
    5 @6 A) q$ E& d7 R(2)嵌套事务模型, G" ~8 [1 K4 m
    / S) b+ G& R1 U5 I. z

    ; h/ X- A7 Q) U1 u+ t  m) x8 q& M" B, f
    事务的两种方式
    ! `, T! Y! _  i(1)声明式- y  V# P0 {, t$ G
    - F, R; f7 [( e! F; X
    在配置文件中设置以下6项
    - Y, a2 x: {( g9 ]3 e9 `% X1 c4 `: M$ v. G# Z2 c3 g* V$ Q
    (1).required
    7 q; u! m) H, W8 ^' P) n7 M+ d" k% H$ N7 |# L$ e
    如果客户端没有事务 在bean中新起一个事务& l6 e9 ^, `1 ~( V* U* K  `$ Q) n

    ) e$ n$ m# z" t% e9 K1 z如果客户端有事务bean 中就加进去
    9 I4 p  e" j) B& `. K- P1 J& J+ f
      M' w" e2 u0 J* J2 T5 `(2)、 requiresNew1 i+ s+ o: Y7 p: l6 V, J

    7 O. }! R1 l2 I  b/ H2 Z不管客户端有没有事务服务器段都新起一个事务
    - L9 `! o5 K/ \' Q* n* @& L
    / W9 ]8 M0 X8 U- j如果客户端有事务就将事务挂起
    ; t# P# h8 L7 _1 V7 j2 W7 k' M6 }" T) a/ u4 y
    (3)、supports/ N6 B, @, i* I6 _0 w

    & F; Q( w, e+ i* H9 c% S如果客户端没有事务服务端也没有事务+ Y3 P* t5 s; J5 q1 w# Y8 v) L
    ( y1 c' U8 A+ h8 ^! j# s& y$ d7 I
    如果客户端有事务服务端就加一个事务9 g! b  ?9 g- i# i
    % i8 W( ~) |" C7 M. O# \6 k; f( P
    (4)、mandatcry
    # D7 C$ ]7 ]% L3 M3 I8 l, H
    * {$ \) X& W9 ], Y6 }/ R如果客户端没有事务服务端就会报错
    - {- m5 r! d# N6 r1 x9 [% Q
    2 g% C- y* `6 V( j+ W3 y如果客户端有事务服务端就加事务
    , s$ T+ \" ~/ q" z7 `( F7 j9 P
    9 n& Z4 O/ _- p(5)、notSupported
    ; F" R3 u# A8 M1 R: |7 P" s8 L
    8 |; m; h. o; {$ D9 u9 ^+ @不管客户端有没有事务服务端都没有事务
    5 t; C. y, C1 y
    / Q0 t' q% |+ V* h如果客户端有事务服务端就挂起
    8 j! R! O; G' t
    * i$ A8 G' ^8 y- n, z) u. ~(6)、never* P  x# R2 q" f  L9 [6 t

    - g7 V/ D" s: n) O不管客户端有没有事务服务端都没有事务! S; {& r! }# g
    + {- G" E6 S! m  U0 f$ P
    如果客户端有事务就报错% c: G! B3 C' l7 w9 {+ N2 h% |7 o

    ) C& ?0 P1 c3 l8 |0 n& ?(2)编程式事务
    % L7 W7 W# }1 m  @& n: [6 n
    $ l. S' j! ^" R+ q, S  k  ZJavax.transaction.UserTranscation1 `3 B( M4 D( G# o' X) O
    3 R6 t) T# o' \' Q6 t# n& i
    JTA 事务可以精确到事务的开始和结束
    . s$ P' o8 ]; N6 c5 N% `
    5 T5 b$ |3 Z/ j5 z$ h/ Y3 B1 a+ h' c
    6 n) |& `, [6 E9 P9 H# ~5 T- T1 N
      F6 P8 B+ G/ {  o2 P# N$ ]1 \事务的隔离性
    - M; w/ ]% s% _. cRead-uncommited
    9 C0 ]5 e; y4 J7 v" t0 c: Z* [0 V) f5 b# ~, _) m: W- G
    读取未提交的数据(基本上没有锁)脏读,存在不当读取的问题。+ b4 c9 g# ~1 G& d+ [. j

    4 \& h! G, H8 r* @/ ORead-commited
    . b: v  d8 g6 u( M% j; `$ O# J
    ( W' o* g5 y4 s0 K$ ?读取已提交的数据(行级锁)3 d4 f/ D/ f+ x" T. z
    . K5 j' `4 l$ R% H4 H
    无法读取已经写入,但没有被提交的数据。. K4 G9 `  E4 Q" i5 b

    6 e* Q' K1 |2 B' N- S1 H, GRepeatable_read
    $ I' a% j' M$ w( F0 W2 y! {3 Y9 {1 F, a# P  ?# I
    读取的数据不允许修改或删除5 D6 h; R3 x4 p7 n) N7 x

    ' b: ]& u8 G' c/ o, c. W, w& h不可重复读(行级锁+不允许修改/删除)
    & T- k0 {7 Q7 X% ^; r' |
    8 J# X. i, L5 V/ V' r; o! ]+ ~& LSerializable6 ?7 V/ j& L9 e& p
    3 [; b7 \# e, P
    幻影读(表级锁)2 E  f* j$ C6 s+ `3 V! H
    / ]1 p" A' B$ m
    1 _! J6 @1 {4 K- w/ o- }
    ! c& K4 M- z4 x" o
    struts4 I: `* d0 v* o+ @( s) v  Y% y9 ^; V* m
    开发流程
      L- B' ]) x( A. _
    ; \8 @1 `9 S: g1 O- q1、创建表单
    $ r" ~! \9 l4 q' @* [$ E6 \4 q
    $ G: ]% C: [% u' F2、从表单中获得输入: e) B3 z& \' D+ Q8 S
    & l, n7 {. Q& r) R' T0 ?
    3、处理输入(业务逻辑)
    * S  E# `$ y( ]3 Q8 {9 V3 B4 R$ ]# f7 t9 y! w! t  c& a) }
    4、根据动态输入改变输入流. H4 R% K% S8 y' A4 E

    0 c$ e' S  }: B6 q要完成上述四步,我们需要创建
    3 }. W* z. o) i' e
    ' u4 G. V. j2 A' _, k4 T. Y, H7 |1、一个ActionForm( i6 v7 m2 K. v. i9 G

    5 u, f1 b  d1 d7 N6 u; K# {. ?2、一个action/ U' c9 F. P" O& X
    6 J* k8 S' F0 L7 k; t1 ?+ x( B
    3、一个配置文件struts-config.xml! b1 T- ~& ]5 ]. `& P
    8 N' P  f  u2 L: h/ x# B5 ]
    4、创建页面- l- B) l; Q' I3 g, _
    , l* K) P* e, m7 C
    创建ActionForm, k% ]: v4 A2 l7 ?, l  c% x5 b" K% d

    3 F/ f( I& h; Y3 D1、写一个类继承ActionForm9 K( n& p: R% r4 c: R

    # i- a7 m; J: T2、私有的属性
    ; k0 X# F% s2 M" q5 Q: s, Z+ y% w/ i8 J9 l% r- }
    3、相应的get、set方法4 _- p7 a# t1 q! n6 d; b7 a& }( }/ t7 d

    . k0 D  A: q; e; d! q1 U4、重写tostring、equals、hashcode三个方法
    7 ~! t. i8 \0 h4 w+ I$ l+ X5 }- g- _* t
    创建action
    5 |) J5 _1 O, U3 @; _8 ~
    , s4 J$ a" t) S& h5 ?1、写一个类继承Action
    9 Z+ ]& K( q+ G
    5 Q8 ~) z& o" W- u2、实现一个公有的方法(回调方法)
    & ?# p. U& d: R! ?; X" M1 u: H$ e+ U' E: y9 y* s) U, @6 N
    public ActionForward execute(ActionMapping mapping,, e( ^, h: T' I0 B& X  A( \

    2 B4 }2 F# V* A$ a  r: yActionForm form,% b' g- ^0 w1 {! w6 x

    $ V# ]5 q# {# E5 B* T0 t' U% xHttpServletRequest request,* E9 ?- E5 E8 i
    5 N$ y+ f6 ^% j
    HttpServletResponse response)1 J9 }) I0 L; L, [3 o! P1 E) E

    7 S% j* B6 ]. {/ H{# n2 w$ D# W# K1 ?
    4 d- V1 A2 T& i$ `6 ]
    //1.收集参数6 R1 x# l* p& i3 A* J; F2 ~! `
    ' B4 Z5 u: t+ e' H, @+ r7 z6 N3 ~
    MyActionForm myForm = (MyActionForm)form;! N4 V# N% y% P3 K& n

    : j4 y4 o, T' o( }2 p- {% I; `//2.组织参数
    1 Q! D& s: U: n. P& \; |
    6 ^8 H: [7 L8 a- _
      f. m' F2 z6 M! O& E
    0 ]4 g; k3 @3 ]1 U7 I//3.调用逻辑层3 [; F( U" {  f( o! e* V

    * }3 z1 ?1 j: `  @4 E3 F& rboolean flag = true;
    + _! l7 y7 I) \; V
    3 u3 j; Y' _, K) \4 p# s% J//4.根据返回值来跳转到相应的页面; \+ J4 k% V: G5 l8 O  ^
      ~/ y" G+ C9 U+ o. y
    ActionForward af = new ActionForward();
    8 O, B2 H2 `9 k  `& z9 F6 q4 N7 T* j: p( j
    if(flag){
    2 z/ a+ o( d# P
    0 m. y1 E6 C0 ~6 _af = mapping.findForward(“1″);
    # y* i3 O' E4 S% j6 J) L& T2 ?1 z4 @8 ]
    }else{$ N# @! ]4 X$ m  \5 }. L

    ! F6 p: f( y2 e+ h# jaf = mapping.findForward(“2″);
    ! M; r) z$ E3 m0 n* {5 V$ ~
    9 P  I# [/ O$ q) S( b0 e}. H" _& Z& ?8 b0 e- t# S
    ! c$ x' c  q* y9 `+ N
    return af;  x9 t- f( Q* r) W
    2 ?5 K  j, K! y  R
    }
    , C; `/ [0 L. ^5 _5 \/ P( K. B! {1 e: v9 @
    配置struts-config.xml文件) d" A: c5 ^# K0 S  h. E

    2 y. v* k3 _, I1.<form-beans>7 ]9 [, g' e/ o- _" X& q. {) h7 d4 H

    - x5 `1 v  T9 w) f3 x<form-bean name=”myActionForm” type=”全路径.MyActionForm”/>7 U! K! c6 Q2 U5 h

    # ]9 m" p# V3 S/ _$ e& q<form-bean />+ Z& R4 ?4 N, ?8 n( x

    % u5 A. c5 Y7 `' G</form-beans>  N8 w& M  i1 k: W
    + S. z# z8 C+ s; C- \# ^
    2.<action-mappings>
    " w. v  C4 Z: G7 W9 z
    " H) e5 b3 k7 s& i) ^) ~<action path=”/sll”
    $ f# s% J; P$ c2 U2 H
    . G/ t! H1 I/ }: ]1 bname=”myActionForm”) H0 P# J* m8 H8 O2 I9 d) R
    * f! G- A; W% ?
    type=”全路径.MyAction”" U8 y9 A- f/ D, k" s
    3 K" N' Z# H7 N, z! _
    scope=”session”7 d8 A, O# h% L9 d7 V. Q' Q

    ' x5 e* C/ _$ ~( Rinput=”错误返回的页面”>( o2 t5 z3 G7 j' }  X, ?( O/ b
    0 K+ F2 B& M) F0 }, V
    <forward name=”1″ path=”/1.jsp”>5 s9 G8 K$ C" e! `$ {2 u

    $ l6 V5 w  `( f% v( x/ m) ^<forward name=”2″ path=”/2.jsp”>; s. i8 y$ F: Z( f
    ! P. W+ Y2 U0 p7 h+ ?& b7 G
    </action>7 w4 ?% }- F+ H1 {& I4 P
    % V2 J! F: @) R$ N' @2 y
    </action-mappings>& e$ h# y2 X( `- `

    7 S8 s% U$ a* ]9 B: I5 E步骤:
    ' m- `4 k' ]( a- V) l
    ! G; V" B9 e& o0 x8 {! N1.创建一个空的web应用
    0 c; u, [' t1 G# O6 g5 l
    ; v, W7 ?( U5 y  d% Y2.将struts的包放到lib文件夹下
    ' ?6 V7 }, v& \
    # ~) S& K: N1 F3.将.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目录下4 B( d) T; }# I: |# |) F+ u% z
    7 \9 V7 g9 x+ ^2 e8 C7 \) e( W
    4.配置struts-config.xml文件和web.xml文件/ R  J4 I/ W' a
    $ k# l/ p- ~: f. j( I5 f
    5.在页面引入tag文件uri( o6 ^2 _: a3 l

    * ^& O7 `6 r) J- r$ SSTRUTS运行机制( a5 c( L7 u3 r/ p
    $ x8 R. f, C$ M- k
    1、界面点击产生请求
    5 _* N, S' b! ~$ n; F, B2 j: Z
    ! z4 h7 |1 O4 i; j2、容器接到请求
    ! B0 V  V; g' `9 d' ~  P# G) `4 s. w; [; Q; l- W5 `& O! ^
    3、匹配web.xml文件中的*.do来调用ActionServlet/ O  U/ _4 y& M* o
    / N7 \' m$ S! s4 p, d  h6 K* Z
    4、ActionServlet的处理
    , w3 I& {( m2 w) P3 L; h- J3 T# h5 r  F6 Y! y3 h+ F
    4.1 读struts-congfig.xml文件形成ActionMapping4 l; I: r$ c2 I

      T( S9 L0 H1 U; N! v4.2 通过path 来匹配Action类,通过Action的name属性来匹配ActionForm类0 R5 R$ [0 B4 O( f9 n3 B
    + b- p" V& x# m" O4 ]( ?
    4.3 通过反射机制来给Form添数据0 w- }8 h! \9 @% u! u$ O

    1 D* ~. S$ O3 z( e* P+ g7 w4.4 由ActionServlet转调Action的execute方法& D( c: F! e0 v) f

    ' X# Z7 ^  E6 N4.5 得到execute方法的返回值,跳转页面9 m& O9 q# i' s; R
    2 u6 e4 `# i% V9 j
    4.5.1 RequestDispatcher# L) F  ]: Y3 T; t6 G0 \' M0 r1 c

    5 [$ v+ W% t* _4.5.2 response.sendRedirect(“list.jsp”);2 L$ p3 J* K+ ~* O, r, O! Y

    % E) w. ~9 a! A5 h- R7 W$ J8 f 1 e# d6 G- g* |. J
    ) F1 q, j1 m- B" {  j& ~$ X
    进入execute方法
    8 ^& H, v8 g0 ^1 y, n+ _& Z* @! N7 E' j" E
    1 收集参数8 a. J8 N# K) d- I- K" A) I$ z
    1 b& ]1 c% A) Y& ~( N
    2 组织参数3 F+ M- g3 ]' d0 n
      d  Q4 M: _2 }4 ~
    3 调用,逻辑层
    % N' E' Q' _* Y6 l  ?, d& U6 B$ ~5 ^1 U7 u  |8 j1 p
    4 返回值: _7 X0 i1 R$ c2 q: s! e
    : B6 s' O7 C: b# l/ D. U5 \
    4.1 选择下一个页面 (ActionForward)0 {+ F: d. d' \" E; F' c6 ]* p
      A1 t. M7 P" B( ]( [2 G: b. S
    4.2 把值传给下一个页面
    6 X( A- j  G5 _% ?+ s: U6 W2 t6 K+ J& C0 i; \- ?
    / \( I9 P& d; L$ }# m
    1 Z* f& P& J  H- S
    比较struts和struts2的不同8 U! H6 E3 b0 V* i' S
    $ U) d8 p! S; L$ a5 W: X
    Struts8 }" n1 s* G0 `. W8 v# Y: n

    0 @; B+ C/ L7 v9 h9 W- ]7 MStruts2, ]0 K/ ]7 Q( F  o  Q

    # d' q( K7 G! T  Y* P% P组成        五个部分:ActionServlet,ActionMapping,AtcionForward,ActionForm,Action        十个部分:AcionContext,FilterDispatcher,ActionMapper,ActionProxy,Configuration Manager,Action Invocation,Interceptot,Action,Result,Taglib
    0 Z; R) w  P" y8 Y8 z1 G1 uurl        .do        .action$ J9 o; o8 r, b) e
    分发控制        AtcionServlet        FilterDispatcher/ ~! R$ i9 i$ N. a3 A+ i; K; A
    收集参数        利用JavaBean技术,将数据封装到ActionForm的子类中;) U: M! u. y2 P! E7 H* W
    一个Action对应一个ActionForm的子类) q/ W% F4 I! n- m( u' }9 ^0 g) e
    " h. L% i% F8 O+ y4 e4 b0 u, F
    使用拦截器将数据封装到值栈中。5 }$ |7 O) j# T0 R, Y; }- I0 k
    使用域模型,一个Action对应多个值栈中的Model
    % c, S+ z" U8 q7 a
    3 U8 B) d- Q2 j  K8 K读取配置文件        ActionMapping        Configuration Manager  c) D1 ^0 \) h0 N0 Y2 h2 `0 V
    拦截器        无拦截器        执行Action前后有拦截器
    + r( I, Q& ~# |! Q. `7 R返回页面        将字符串封装到AtcionForward,进行跳转页面        Action中直接返回字符串,通过Result跳转页面
    6 ^& A, v8 F6 `8 H, y0 p* `. C页面跳转方式        两种:dispatch,redirect        三种:dispatch,redirect,chain
    / K/ a" I) r+ c( e% \/ ~2 q值栈        无值栈,Action通过在request范围内设置属性,向jsp页面传递数据        有值栈,Action和jsp页面通过值栈传递数据,jsp页面通过OGNL取得值栈中的数据5 r( h) n& Z( N+ W7 e0 ~
    配置文件        struts-config.xml        struts.xml" j% e" [6 @7 \7 F7 x2 q
    中文问题        不能解决(需要使用filter)        可以解决中文问题:' e* l- C8 a% ~. {
    1、在jsp页面添加Meta;( M% t8 U1 o$ R  u
    : q' R, w/ S* l- u8 `" q+ C- ]
    2、修改struts.properties中的设置。
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    18#
    发表于 2014-12-03 12:49:03 |只看该作者
    其他开发工具和技术
    5 F% }: _. C$ T+ R$ {Ant% u% J' e& l& K
    Ant是基于java的批处理工具3 b  ], Q" E) _# H2 k. _' Y$ B
    , q# X/ G% s+ D9 |
    一、配置ant的运行环境
      X: y. I7 u6 C7 _( y* y( M* P# ^7 ?, Z/ z' p) W/ ?% w" k( n2 C/ N
    1.将ant的bin目录添加到path中
    ( C3 e- a" j. C  W$ A& ~1 k* I: i. Z4 r+ d! R% t- x
    2.配置JAVA_HOME# V3 q  t) G; ^  I5 \, T
    8 v4 |# f0 J9 d0 e/ X2 L8 @: A0 y, p
    3.配置ANT_HOME; k2 N' G/ Y* ~

    ; q3 v. [# r6 R: {$ V二、配制build.xml文件,该文件放在应用程序的根目录下
      l. T! p1 u. u: O2 m' r; v* u3 V1 B, p' e" r6 j
    编译java文件. X  l+ Y% e9 J' n
    ; t8 A7 Z: H' f4 b6 \# z2 x
    执行java文件3 Z' b! c; ]+ s( j4 k7 J

    + u) m; h; |/ _. T! }! q3 {copy
    # F6 v4 K7 X8 H$ B% t! t: o( h' O* y: d/ Y2 G1 G
    删除
      W9 x+ u8 C, ^5 i% q% R# z) _3 ^7 m3 u5 |2 }% i  ^
    打jar包
    ) P0 P1 h% J9 V/ @% k3 f. O( n6 q. A/ w7 e$ O0 n% ~3 R
    根据注解生成配置文件) x) O" g0 V+ U0 \; d

    3 u2 u/ ]9 k! {: QXdoclet
    ! m8 n% L3 I8 b; j. q0 [6 d通过注释生成一系列文件的工具(txt、xml、java、html等)  |( [4 }4 G6 ?. v3 Z, s8 l

    + c6 p3 f$ T( A, P4 Cxdoclet本质是摸板技术+字符串的替换
    ( B2 i: b4 f) x( m# f4 J. K0 T' G2 x) S! g
    1.在java文件中写符合要求的注释(将hbm.xml文件的内容搬到java文件中去写)5 x: b6 Z( t  @" l  j$ C- t

    4 C, u, B- s9 L, v/ X5 K1.1 在类的上面 写与表的对应5 d( L7 I, C" {4 {

    % w8 v2 y2 _9 A5 v; J# ?1.2 将每一个属性的注释都写到get方法的上面& E) i0 l4 J: S# K* O
    * D" D5 ]* [7 o- I! Y, c2 W$ h) V7 {
    2.在ant中引入相应的task来驱动xdoclet! H1 ~7 |: t5 T

    * P, j. r+ _0 m1 O" t/ y 1 N# q  M- r) N$ j! ~) c

    $ P) X2 i/ b& N# W' T* R  W# Wlog4j日志管理
    ; e% y( R( F7 o3 |, g7 i, o4 b1、是什么?" g$ ~9 }" q, A# v
    ! c  F1 U. {" I
    在开发期间用来测试、对整个日志信息进行管理的工具1 Q- j$ ~$ q& y4 E' [4 N1 f

    2 d9 q  w4 n& Y2 j, v" t2、功能
    ( x# N# @! ]2 @' e$ |! F2 e, Q* ~: b0 F
    1.控制输出的目的地
      c( `' F) @! y3 e- z. O
    + K% ]" W8 O* h$ {. p! q2. 控制输出的格式
    3 Y5 B, _) m( v4 Q& B2 B6 M. \" |2 k3 v
    3. 控制输出的级别
    - q5 t7 d) n7 @' i) Y! i+ w
    7 g: C- t% h! E3 ?; G3、日志的级别# g; F& U2 e6 f) I" a# P. J

    6 e3 f; N( S  v/ D: x1. debug 调试
    2 M& w3 m8 t) e8 i, c" f9 V) {, \5 z# Y
    2. info 给用户的提示信息/ }/ R4 Q1 k9 ?  C' O0 ^$ N

    ( K9 @% R6 a( b0 h& Q+ K3 T3. warn 给用户的警告信息: ~* o3 D4 J0 b: h7 d3 Q

    ' K8 Y) |  u9 x4.error 给程序员用来调试
    ' y: S1 r$ T. x1 q: `! M5 @# a* L  N+ s; @& I6 _
    Debug—-〉info—-〉warn——–〉error
    ) ?- K) _+ [5 k/ V8 h. |9 D  j- y
    * E  v2 A) g& L; p5 @* p% b4、配置2 B2 H4 O. t  e- h+ o. _

    3 e$ G  B5 l6 l' d5 ^0 p$ Y1.配置级别: U. |+ U8 {% k9 f" ~

    ) c/ u5 P: G2 g4 q1 t2.输入源 (控制台和文件)6 D+ b& N( D7 M2 t: S) r# G
    , W, m. j8 J! _" ~
    3.可以进行分包控制% H, ^9 M6 R8 _  j7 l, X

    ' k5 Y3 _# ^/ X  u& QLog4f.logger.包结构 = 级别
    5 Z1 o0 w: ]2 R7 u( K- R) {3 x$ j7 \$ ^5 ^( V4 b9 b
    5、使用, E3 z; f/ ~! e6 Y! g( c) x

    ( f% {" o$ a  ?/ c( t0 {Logger log=Logger.getLogger(Test.class);
    / s+ U: g3 A9 k" ]
    6 C. ?, x$ E: l3 H2 k0 y5 t/ t    public3 x9 q1 u2 [0 o+ I2 ?
    void t3(){; A* `/ o! Y: D- X0 ^- ]6 x

      u+ G1 K0 n- \# ]% c3 w        log.debug(“this is debug”);3 ~0 c9 i2 z# r2 o+ ~
    6 Q4 n* V+ k# F
            log.info(“this is info”);+ a. t- L* a5 A

    ( f2 a+ S" ^6 G2 C        log.warn(“this is warn “);6 @" C# V6 u) ~+ @3 n! }1 M* Z

    " c& q/ G( K; t0 o! o' T        log.error(“this is error”);- W8 a& u, w5 p' m5 Z

    ' p, k1 \( J7 C, C% Q3 i    }6 P- ~, \* W; Q2 Q3 h
    9 p6 T- a1 [' i1 e( C# ]
    Junit  L% \1 P2 B. I5 E- \- T) [
    1.是什么?
    % x, k9 g, |  \) q8 ^
    4 \+ {* t% ^" w/ l1 K单元测试的框架
    0 n' X* _+ X2 k- {/ U  n3 L8 D1 `
    9 w! Z) o. x" ~* H9 f! s6 ?2.怎么做?. S6 ^' r2 x6 n0 y) |. `7 U

    4 v( _! y" V: G9 v4 o  `. T6 M6 |+ N写一个类继承TestCase& n0 Z! L: W+ C. g8 C, X

    & j4 `  u* F1 f: R! d0 O测试的方法一般都以test开头并且没有参数5 k5 q7 g9 E8 _# W

    / o9 r, O& O( v% r2 _在测试方法前执行的方法public void setUp( )2 B( q) P7 [9 a4 }/ I% F- N

    " ?  r  O& \8 W% g9 L2 ^在测试方法后执行的方法public void tearDown( )
    2 p7 h' d& D, R# U6 B% ]
    9 \7 O$ u: {; U+ {' ~% Q. Aerror和故障的区别# e, k8 h& E0 L" x4 k

    6 \; \, i6 s1 Jerror :代码有问题
    ; M. m& X; ^  j/ p: ]$ I" K( S( @  }
    故障 :逻辑有问题与祈望的值不相符合
    $ F4 A" t: a# y3 {. L2 m; C
    0 K) \; m. m7 D- K1 ?2 b4 ~生命周期* Z% L3 J' |5 \  _& b

    $ N- w" f6 |* P测试—〉SetUp()—〉testXX()—〉tearDown()—〉结束;
    2 @/ a8 a+ ?1 c& b% z( Z  @, X3 ^
    3 Z$ q+ J! C4 eTestCase套件
    & r. Q  d& a7 r% w6 y7 ~; `( U6 g2 F4 `
    public class MyTest{
    6 R" Q3 |# b. Y* n; o1 u5 J
    # X3 z! s3 ^, K" |6 G$ r0 V        Public static Test suite(){
    ! S; N5 j  ~7 ?
    3 f5 a5 \: f: i8 {TestSuite suite = new TestSuite();9 k2 p; d, X* }" y9 ^

    . z; G7 E" Y+ ^$ c* K2 \  T' V0 w( h. xsuite.addTestCase(Test1.class);
    2 s2 ~5 D5 }- h' `- Z  _
    ; G7 ?1 P2 b7 L% c- V; Z. q5 Rsuite.addTestCase(Test2.class);
      A  o  V8 L$ i4 s( Q6 k
    0 K! m: N4 M2 L2 l6 R}
    6 Y1 {' s# A" D, q  G" R; L2 `1 T9 W, X# p$ x  V( K/ l0 A6 H' O9 L
    }# H7 J! C  l2 W1 V6 ]/ L# w& V0 S$ O
    : o) l$ ]- e/ t! ~; N( B

    4 w* s$ i- Z, E% Y( ^" m8 X
    ( ~4 P5 k4 B# q* k+ WAjax
    8 o8 b+ m6 r! L* E: v是什么?+ A3 H- F( c" j" K" v+ f9 `" O1 T* j
    AJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。是一种创建交互式网页应用的网页开发技术。, o- M/ l0 h( f% A' |& Q1 o

    $ ~" @. r  C' j+ l+ ]. i. K4 \无刷新页面。
    - A; i! |8 H( ?; ^9 e+ r$ v, n
    * k% k& G, l9 b3 }" X有什么?$ t7 G+ g: G& ^# \$ A/ B0 z
    AJAX是多种技术的综合,包括JavaScript、XHTML和CSS、DOM、XML 和 XSLT、XMLHttpRequest。" Q% j. u( ^2 u$ d
    - Q. a9 m5 N3 m( A5 b$ M7 j
    能干什么?* s/ n7 h" i$ I% [, v, h
    使用XHTML+CSS标准化呈现;& R* R3 z# y" i6 P1 e$ c. p8 U8 K! W
    使用DOM进行动态显示及交互;" r; T; d" i1 c9 I, _9 P
    使用 XML 和 XSLT 进行数据交换及相关操作;
    - r% U& a! P( _/ E/ t% p使用 XMLHttpRequest 进行异步数据查询、检索;
    - B' `2 s) i) a8 C7 z0 o" Y. S! L/ C$ W: e使用JavaScript绑定和处理有所得数据;8 g0 r9 a. e9 P& a- }- Z3 |

    5 s9 t$ K) Y2 W传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。: _. ]9 S/ G" y  I1 ]& \1 Z# y
    2 j' c3 F9 H6 h. y
    与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。
    1 j  j% J$ o. j# n0 R5 l0 S! A& r& b  Q' A; k2 ?
    使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。$ y+ G8 L3 V8 U1 w/ l

    * G$ t$ h/ `4 ?. ]% O对应用Ajax最主要的批评就是:
    3 n/ l/ D6 n5 M6 b" h) x; x1 它破坏了浏览器后退按钮的正常行为,就是用户点击后退按钮后不能看到之前的数据;& u( N( ~) D! o
    2 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;
    5 m4 n' d/ n  t. e2 D: p! Z% D; W, i3 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;6 j+ w7 \; z7 g- A/ ^4 E1 ^) H
    4 Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;2 d$ _1 M; M# ~; d. P. m
    : a5 K& q& R. x1 g
    怎么做?5 l5 @8 [- m; X& [
    <script language=”javascript”>
    + [3 q& o; _  p4 Z+ }6 t  ^8 l, i" ~  l  G% Y! |
    var req;6 c4 M6 ~) N7 J, \" U/ l! `6 k

    " q( n: I' `( y9 r* _function add(){8 `5 j" W1 {  q4 {2 C

    $ J- J. B+ J. w6 _2 L* A: a//1:创建用于传输的对象
      a6 }4 H1 O4 u$ [; ^# s4 o! k
    5 K) ]  K& i- v* jreq=new ActiveXObject(“Microsoft.XMLHTTP”);
    9 K! L! U0 H/ Z
    7 {- @# O& V2 j$ t// 声明返回后,处理数据的方法  v' T' D( o+ F. |  _

    / _; W& y" a6 @7 R- u( Oreq.onreadystatechange=manage;
    5 T3 w8 a7 o1 @' U/ O' b) K2 E! [, `0 B9 x
    //2:准备传输的内容. a+ A) _3 x( n7 {
    ) l! f' y9 Z1 d% U/ ~8 {
    var str=”test1111″;$ @. E6 R, e, j' b8 B

    % p8 }% Z9 n  D( `. V- l2 p//3:发出请求$ C$ t: X1 \. l1 \

    6 L% y: K4 [# U: _3 ureq.open(“GET” ,”/others/ajax/test/t2.jsp?str=”+str);- W# E3 z: J1 t) w4 C- Y& h/ B
    * J+ {1 R) |5 E6 l* k, Q
    req.send(null);
    7 u2 \8 \, H, m9 s  }2 d  [+ e; c
    ! M3 ~7 J( @; V8 a, s$ l% N% }5 O}
    : W5 ]9 r. d1 n1 q2 C
    , D/ w9 ?0 v) X! H( A//4:接受返回并处理
    6 \% R7 a0 Q0 D- h
    / s$ t- s* o/ V& n/ N% ~0 Ufunction manage(){9 v% ?6 h) e. _& ]1 I0 w3 w

    8 A- R: M: x) b( Q# Dif(req.readyState==4){: Q  A) T$ V+ x! }* Y; n
      R% m3 m0 [, e3 g$ E8 M) V
    alert(“r==”+req.responseText);5 @9 w7 G' l8 y1 p

    9 T0 y0 D7 D) z' R! r+ n8 z}( A1 m* X% J8 ?- _3 o- v3 ?
    ; ~) ^+ @; @3 p0 A9 y/ t* V
    }5 u% `8 k+ Z5 V; A
    ' q8 R2 V5 K+ a2 N! G, ~) g
    </script>
    9 J: p# L  x' J3 U. H% ]: H
    6 g% G; K# b" areadyState的取值如下:
    / ?5 d0 M" p( o. `& e5 Y
    0 S" g4 F  Q8 |: Y( [9 a, O  0 (未初始化)
    5 u4 h& X% A( h5 o8 }: D7 W
    " D, @- R* ^  y) V, ^# J  1 (正在装载)1 y0 |* Y- l$ A$ f) X/ z9 e6 F

    ( S5 c0 y$ J1 z3 v5 f0 z' p: e5 T  2 (装载完毕)
    ! T  }4 d8 H- i( O* G/ G$ b( Y% [3 l& v. v
      3 (交互中)
    5 x% {- Q: Q% Z/ H$ M9 J) H3 s" X2 u3 K6 V$ `$ ~6 d0 t
      4 (完成)
    ( x3 V6 Z7 L3 @' w3 S; r5 w! A$ i- x6 Y. v

    + A9 c) T8 p( R% _7 F1 E
    / X- g& I( w" ~/ V' I原理1 X8 t2 e/ Z7 |: c8 B2 `1 ~
    Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,可以是xml格式,也可以是一个字符串,然后用javascript来操作DOM而更新页面。
    ' Z4 q! Z  D$ `! l- q+ K( \
    4 u, j' K- `0 r. y, aDwr
    + J- L6 W/ k6 H( K' K' U) ?6 r% b是什么?( Z+ g; p; ~9 F$ z
    DWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的页面。它可以允许在页面中使用运行在WEB服务器上的JAVA函数,被调用的JAVA函数就像是在页面中JavaScript方法一样。4 \  `9 f( ?& o. g4 i
    ) m6 J$ M2 S; |) O
    有什么?5 l) X+ ]' s: E: d) [
    它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据;另外一方面提供了一个JavaScript库可以帮助web开发人员轻松地利用获取的数据来动态改变网页的内容。
    " B. g& }6 ]6 j" O- j- L* q' F. S8 |
    & J& H3 s$ O  f0 z

    : a/ d( s0 T* ~9 b" {能干什么?+ c3 {! T* a( l+ e, c7 D3 \
    动态地把java类生成为JavaScript,感觉调用就像发生在浏览器端,实际上代码调用发生在服务器端,Dwr负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制。
    0 @% e* ?: ?0 d4 m0 q9 V( d
    & R& o, Z! \- W
    % O( J' I4 }+ [" J+ F1 w* f; }% u& {1 F# m0 t% u/ n
    怎么做?
    ; M; O# B5 c1 N  N' }① 编写配置文件# c( G& D' y7 Z% N9 R
    8 i4 Y0 o- p' Q: Z; N: k' R) Z. T
    web.xml
    " L! F, X+ H# ^: W& m* @4 _( T) n# Y% a8 @- ]. x9 I
    <servlet>
    1 w5 d- x8 x( w6 _5 Q4 s( \" |: T
    <servlet-name>dwr-invoker</servlet-name>/ _& W) d- c. T7 z+ g
    : t$ V7 g: h, O, L
    <servlet-class>* C9 g4 c4 N, u# N) X0 R2 U- t

    ' a+ D: K; q0 }% S, qorg.directwebremoting.servlet.DwrServlet4 Q1 U0 ?3 f5 E# ?8 K: W* M3 H
    ' z. W* A9 ^! L/ b2 {
    </servlet-class>3 v0 \4 ]2 i2 s! V3 D7 @
    . U/ P! W- T2 [7 c) t
    <init-param>3 U( x: [* y: o5 h! R

    . m$ w  U' A9 Q5 l1 G<param-name>debug</param-name>
    : o' m/ g; E" E6 Y) p7 C5 K3 g3 U3 g: @; V' F6 e
    <param-value>true</param-value>1 i& N6 p, l2 Y$ {6 D

    $ b; B% b4 I5 y</init-param>
    5 N! I0 {/ v* u* P. U
    & j$ R- X- b- _3 d4 K  E$ C1 c</servlet># u# p* ~" I7 L
    & [6 D% |" d& J/ C! |+ y; E
    <servlet-mapping>! @) X: t. ?, `( h; z
    2 w+ G* P0 f! f
    <servlet-name>dwr-invoker</servlet-name>2 y9 E  A6 T) c4 ^9 U+ O: ~1 o  K

    # ?+ W: S- w/ |<url-pattern>/dwr/*</url-pattern>
    2 E' z+ I! ^$ V4 r/ a- l1 I5 c% T9 ]( O1 }  X* |3 r; m
    </servlet-mapping>
    % C% `# E7 `9 Z# B( g- r
    / a! @1 S7 q/ c+ N! zdwr.xml, X1 A+ |. u+ Q7 K$ j! t+ ~
    ! `# |1 y' u4 }. N/ W6 ]
    <allow>
    % [; \+ i& U* d5 x+ h5 W6 x. Y# n" F. y; n% p9 d4 H- D
    <create creator=”new” javascript=”kc2″>
    # u' a! @) C" }5 k) T9 J# ^
    , I  _- K1 Y& w  [- _; h& Z<param name=”class” value=”dwr.Service” />
    ) a: r+ t  b2 P: X9 v0 k/ E
    , f% f& {% U. U</create>
    1 f4 z& P; @" S3 x. Z( @7 E
    3 N/ w4 |+ {& m9 L% v0 P</allow>7 g9 j3 s0 C7 }/ E6 m- [

    3 ?# y4 |& m7 |! z+ ^②编写service
    + N( @5 q. t2 O* h" |& D# @4 _( I; m7 O  S4 G7 \7 Z
    public class Service {# D: X6 N4 ~, H. g1 X3 g8 r
    9 q( ~" b, f, j  v
    public String sayHello(String yourName) {2 D. @, u/ i" p- a3 O5 _

    8 @0 U' I/ a! ^% _//可以是访问数据库的复杂代码% e: U, X5 f9 ^6 h. r
    # K) f- p  R2 k) o" B/ w& Q
    return “Hello World ” + yourName;4 W3 {8 I* E/ e1 E

    ; I, p! q4 N4 |" I5 M: ]}
    8 i! h3 P, T% }2 L, A
    2 t6 l( R: i0 f- p3 C& q! x% y}
    4 ~$ d5 p; c% M6 `& V( ]9 m/ V+ v
    - T. P5 G- ]9 ^8 O6 U9 u③测试DWR
    3 l; Y1 n3 d4 f: N: S- `; z
    + _2 h# P" K2 q7 f( ^将代码放入应用服务器(比如Tomcat),启动。  m- g/ E. J/ c: ~" ^" C- F: n
    " M; _% ]3 A$ `9 k! ?! T; h6 U
    然后在地址栏输入http://localhost:8080/你的工程/dwr( D2 W4 O# p( r2 `% w

    ; K7 _( j! f  p# _; ~+ @④编写jsp页面( U+ {6 k. d! G
    6 h* Q! }. d" f2 V2 s# b
    1) 要引用3个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js2 t# W$ G( G  L+ n# g5 M
    1 R2 k, ?  f" _5 O% E9 W/ \
    2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样
      h1 q4 |2 X1 b* B9 u
    ( Z* ^; p& H  L4 s) I: k3) js里的service.sayHello和java类的那个有一点区别,多了一个参数,用来得到返回的数据
    回复

    使用道具 举报

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

       

    关闭

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

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