我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > 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 |只看该作者
    JEE4 z/ ^# |& R) V9 D6 C
    简述JEE
      V9 {7 k- |9 G6 X; p2 l5 ^# cJEE : JAVA  PLATFORM  ENTERPRISE  EDITION, P/ f0 Y( Z/ `! U7 o% a5 P9 h  \

    % L' U8 o/ X- d& q+ n0 [JEE是一个规范集;
    6 X# E+ z" N! |! F9 \
    2 C  [5 r/ E! u4 w1 W: RJEE是一个框架集;
    3 z* \* F) \3 F" g/ T$ o: @4 C4 ?# ~0 ]+ v3 {
    JEE是一个技术集或API集;
    ! e" _0 o- t0 z( i% p# V! ~
    6 c$ [' \7 I0 L1 g+ T5 P! ]5 s适用于创建服务器端的大型的软件服务系统
    ! _4 V0 I4 |3 @9 C) ]* n4 |
    ) c" {8 z) ~- D. a. i# S2 x ( k- L7 U4 A$ B* q6 @

    % i! f3 D1 ~4 H" |' F' yC/S B/S 模式
    ! G4 `& r* i% m, w/ N, aC/S client/server即客户机/服务器模式,客户端也参与程序的运行与计算(富客户端、胖客户端)
    1 J% x! \  ~2 T7 U; M
    6 g$ ?: o. S; |0 {/ c, XB/S border/server即浏览器/服务器模式,又称为瘦客户端,客户端不参与程序的运行与计算
    ' t6 ]% w6 R# F! G- O9 c; X) q2 e1 D7 w/ J; x

    - z+ T. S4 v9 V6 o
    * j: o/ i4 n  P: k% h企业级应用(大规模的应用)的特点
    ! j# }7 ^# y1 f0 ]  U: R1.生命周期长、稳定、可靠
    9 Z/ c( m% V6 m- x" n, ~
    ) D! K$ g" @. J9 w. I2.组件往往分布在异构的环境中,能够跨平台. F/ k2 d" k3 o9 c5 z+ X5 B

    % U6 |" d# L0 _* e2 _" o+ k* u3.维护性、扩展性、重用性
    5 H" f8 i2 p# S& A: r) Q- I
    ; v- f0 d( U6 a  y/ m& X+ D7 a1 A4.有事务、安全、线程
    : g* z4 Z! f, R" v& X, v+ N5 K6 W% P. y7 r

    " c: g; z2 ~+ t' M0 m& L* m: T, x; V6 Q" D5 c7 j
    什么是业务逻辑?: F# j: x1 D3 S4 u0 D
    依照业务逻辑划分模块,
    + d/ t+ L) i- [% ~+ X+ S' ^& D+ I& a% I% c
    所谓判定业务 就是具有以下特征:
    5 ?% S6 ?; x! _# e% X
    * R: G' x) @9 S$ M' |( M4 g2 w1.业务流程$ x( I' c+ H- {2 M( X" e
    ! b# L) Z6 q  b) [$ ]
    2.业务判断
    6 w4 w: e0 F4 a$ @' s4 p0 ^1 N% T
    - x& d8 C: i& @  c5 b5 c) r( n; q- v3.功能组合* p7 j  s6 x( q+ A

    2 K3 I6 ^. F. |: c8 T # A4 \( e- R' |% U3 M
    ( b3 H9 T. p1 B, X% w
    平台(角色)的划分" n1 a5 j, ~  }8 B  M
    1.平台供应商。提供满足API集实现的厂商(BEA weblogic IBM webshphere)4 L5 [5 j! B) X6 w
    - U, D+ H6 u  l4 \( f: f
    2.组件供应商8 C% ?* N: Q5 m0 e, O" e
    5 s1 H% S2 J. Y6 n( O. J& E
    3.组件装配人员
    8 Y! H7 z. r7 _* F6 d
    & C) o" t0 f$ v  Z& w* ?: z4.部署人员2 t! L0 O) p9 b. k

    " J+ Q' [, g; p% z, V5.系统管理人员$ H. o4 W% [0 y1 z+ w0 f! [6 O

    7 J% N+ Q4 W) w! p' Q+ `0 r6.工具供应商 提供开发组件所使用的工具(Jbuilder、eclipse), |: `! {8 W5 j6 w+ @& [
    % I# D! ~8 Y4 Q6 ?

      Q/ P- \8 |: y* F$ f) R  \( o
    / p" v# ^& K% O5 h4 ~9 J2 G* Ejava技术分布(设计架构 模块内部设计): T) n) j* R( Q$ @& x
    1.表现层 Servlet、 Jsp、 JavaBean、 Taglib2 t8 ~* P7 L' i
    9 z, e  T! ~9 T: d1 l
    2.逻辑层 EJB(SessionBean)+ m+ ^2 z6 B* U6 x8 X# D

    : N: M( C1 l4 b) g0 A. C1 u3.数据层 ( JDBC  EJB(EntityBean))
    & ^2 K4 S! E$ u
    + M# J0 e0 a' c4.服务 JTA(JAVA事务架构) JTS(JAVA事务服务) JAAS(JAVA授权与验证服务)
    5 b( O" W5 [. }/ X$ e+ C8 ^3 e! A. M3 i3 B, R# z+ o4 g
    5.分布式通讯 RMI(IIOP)+JNDI 、JAXP(JAVA 的 XML 架构)* }+ p* k& f5 z1 L1 l. G

    " b8 ~5 E7 ^/ B5 J1 U  u$ pJAVAMAIL(邮件服务)、JMS(消息服务)、IDLC、JCA(JAVA连接器框架 (成))
    / _5 N# v  B; }: V* U* v$ F, V8 f0 {" d9 y! c8 m

    ; I) {6 m6 j# I# O
    % ^" i$ j% L$ R4 sJEE的体系结构: 是一种组件的体系结构: W) i0 `1 [% M$ j) g- M
    1.组件 : 能够完成一定功能的封状体(独立的功能的集合)
    ( e8 k9 N! V" u: r  e; ^; w
    6 y% A$ b: e% Q: h8 s5 n, d不能单独运行,必须运行在容器上
    9 \0 F5 Z: I: ^/ z% H! g4 i' f% {
    4 \+ M1 Z+ v1 v9 z8 {分为两类:web组件、ejb组件
    ) z7 W% V, t9 B* }; S/ ~5 e
    % V7 j; d8 t3 b9 Q# S1 f  ~  F2.容器 : 提供组件的运行环境,并对组件进行管理(一段程序)9 b0 w) L6 H- W) e) \2 \0 Z* A
    8 _3 x5 k7 M8 F  R
    管理组件的生命周期& b. X% C+ u, R/ J( U) Q

    7 t5 x0 G1 G0 L% r/ u! R不能单独运行,必须运行在服务器上
    5 C. y. X, t" h4 b1 U1 Z: n* |- A8 f4 P8 h) c! r1 [' V
    程序(组件)通过上下文来调用容器(context)" v  w( o" B. T6 {$ n* B

    2 ^2 P& z0 J8 u/ A组件通过web.xml向容器描述自己,使容器能够认识组件
    3 Q- b, @$ {5 t3 Y1 |- p7 M" N3 q) D& F( m9 b
    容器通过回调方法来调用组件+ j4 @- E5 o+ V, ]4 \: h* p: c
    # I& F: b. t" e9 K; }1 x# q  y  ?& `
    分为两类:web容器、ejb容器$ \& i8 M. s  U! e3 _7 ~
    3 p4 J/ _7 J! K; E$ ?5 U
    3.服务器 : 提供容器的运行环境,提供大量的JEE基础服务/ p7 J2 z3 q8 Q/ z

    0 v$ A2 a; s/ L. Q/ hweb服务器(只提供web服务)
    + y* d0 h4 |, i, ?1 s5 D" c; j0 `
    jee服务器(提供web、jee服务)6 S, m1 b; g7 A. M! j; x
    3 M0 O/ U! [5 Q2 F

    4 {& m: V  c. s/ M& O$ }7 g( K, d# Y5 O+ l5 [; f  b+ v& T
    什么是回调方法( t! V4 \. n$ H' B" N' p  d2 m
    由容器自动调用的方法,就叫回调方法。& v3 V! `; x, x% q2 ~3 A
    6 O' e0 d& \5 [8 y4 F+ I

    5 I" u4 w# a4 V
    6 m! Z: {: ^- w' z1 k" oRMI远程方法的调用机制
    3 ?8 ]5 H$ @1 L/ r7 ^例如:A主机有B()方法,C主机有D()方法,A 想调用C主机的D方法( l- I1 C% S4 Z$ q  l1 f! y  H
    : e& @2 C3 j" z- P: o. I

    6 O. M+ P; W2 N- c: P. r+ ?; _
    3 s) {0 ?" Z9 F' o8 i3 S 2 X, t! {' c5 |* a: X9 H0 |! [

    ( a4 \5 G% d- q) D& r1 i1 T' @6 O学习方法+ k' |0 Y/ ]$ L9 S# t8 d- B' C- q
    1.规范(熟记) 2.熟悉API 3.多练 4.多想
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    12#
    发表于 2014-12-03 12:45:29 |只看该作者
    Servlet9 e& O6 L+ o' t+ _" k; H
    •     描述war包、jar包、ear包的结构
      % e: X  X1 q- S* ?; C+ k
      5 {& W) Q# ~) Y# B* i
      % ^) h# ~( Q# y- N! Y

    war-                            web文档压缩包

    —WEB-INF

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

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

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

      m( V4 ^1 O2 n

    jar-                             java文件压缩包

    —META-INF

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

    ) s4 i' d5 _$ C+ l

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

    –META-INF

    —Application.xml 配置文件

    –*.war

    –*.jar


    ! @* x. m. Y8 d, \: r) c1 |
    • 什么是servlet?servlet主要做什么?8 y+ q+ A+ Y; X: ~6 R+ J8 E

      6 v' w) z+ Z7 Z8 {" [  M8 ?% h8 U5 q, i; Z% M% O

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

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

    0 v2 D5 M4 I/ u4 ~( [3 |+ Y
    • servlet 与cgi相比的优点?servlet的缺点
      : y- g) v& K' c9 j4 M' N
      9 N8 v7 o9 C, `+ Q2 n' D

      , _+ O* g% U' D5 e* |

    优点:

    性能(线程比进程更快)

    可伸缩

    Java强健且面向对象

    Java平台独立

    缺点:

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

    : E: A% M# S/ P' R
    • 常用的servlet包的名称是?( Y8 ^9 W7 |, |# l( l7 T: G

      5 T7 K* v/ z/ {7 @; ]
      : P$ V7 @6 ~# Y  L, f5 E

    javax.servlet

    javax.servlet.http


    8 x' j! x9 ~! j5 h
    • 描述servlet接口的层次结构?
      ) @, d2 Z. c1 q+ z$ N
      : }  U. P4 M% d% Q
      & U1 t- u1 k/ d, I4 t- H5 ?7 ?$ B

    Servlet

    –GenericServlet

    –HttpServlet

    –自己的servlet

    ServletRequest

    –HttpServletRequest

    ServletResponse

    –HttpServletResponse


    # g# J2 L+ q: u. ~; q: `
    • 对比get方法和post方法?
      ) P. I- ~. f: g! S2 R

      + s- S9 |) C0 y2 s' D* V6 Y
      ' m5 o: j- h" L% |  O

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

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

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

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


    2 g! J8 _" \8 G9 d8 w5 \
    • 归类描述HttpServletRequest接口都完成那些功能
      , }' H4 Z$ Z' X
      8 m$ ^: b( |! g. Q  }/ R( t: P

      ( m6 X1 S' K0 v2 z. |
      • 读取HTTP头标
        1 h1 J: L2 Q4 C
      • 读取cookie: U/ v9 v7 p3 o
      • 读取路径信息  [" Y4 Y+ T* @' |
      • 标识HTTP会话。; ~4 v6 K( @) L2 }. C3 S2 B  w$ z

        + y! T7 v8 m# S1 K$ Z/ D' Y
    ( E0 k  g6 o, P# T: K% H
    • 归类描述HttpServletResponse接口都完成那些功能7 C7 x. n; t% g* R  F
      + b$ x' h& D2 M! r* g7 c

      ! _  x, [& q7 R( L7 C8 r& T
      • 设置HTTP头标
        * y0 \3 d( Q" v: O" n& g% g
      • 设置cookie3 l/ p/ G4 @  D3 u
      • 设定响应的content类型) ~* e: f/ ~! T# k
      • 输出返回数据
        + Y% I7 W% I2 g' o8 ?& H5 D$ y  ?3 b6 U  U
    ) o. I" l2 X! K" T
    • 描述service方法所完成的基本功能?默认是在那里实现的?# ~- o' w* t# t( c
      7 ~4 e1 R: i. Q4 e6 `  T% F
      9 x/ {2 [5 K9 P3 n) F

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

    实现:默认在HttpServlet类中实现

    , m6 G  d2 h3 R* ~
    • 如何开发自己的Servlet?描述应该做的步骤和每步需要完成的工作
      9 H) s( h) d. k2 \* @! A

      ! G( f* Y* M. H' R2 I
      & Z6 N9 C/ x( Y8 S: a

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

    ) O0 h2 {" f  q. ^
    • 为何servlet需要部署描述?% m# b2 w( i9 Q  l% r

      " c& l$ `$ y" G' |
      # Z* f$ J6 i$ J; D

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

    / D8 b( X7 x! j8 m
    • Servlet基本的描述应该是?请写出来8 c/ _$ ]% C: \" N1 I9 B

      & t; _1 {/ B1 R; }5 K6 x( ^; p" ]' p5 A2 Z/ w1 o
    0 R6 o6 A; `7 C/ b

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

    " w+ B; G* A* D& Y+ B, f
    • 如何在html中使用servlet
      * p+ R* q* G$ d' Q) x5 @+ C

      2 ]: f/ {5 d5 t( E, c' I$ [& F- y9 H$ m+ \

    FORM标记

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

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

    语法:

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

    {HTML form tags and other HTML content}

    </FORM>


    $ l8 ^# j5 {3 W/ t- s. t8 I
    • 如何接受request中的参数! G0 E: B5 i, |

      $ l! \: t; `% c- a: nString userName = request.getParameter(“userName”)方法  T- j0 E0 o" f' d7 s$ s  P
      6 l9 ^" E% x. p
    7 |: o# R( O- a1 g0 n
    • 如何接受request中header的值
      , I4 |! W  [$ P) U
      2 ^1 j% P( v/ o. k

      . T1 o% x9 B/ m& e" P; e2 m: O& N( w+ i

    request.getHeader(name);

    request.getIntHeader(name);

    request.getDateHeader(name);

    request.getHeaderNames();


    : |& X8 v) Q5 u- G  @* V4 J
    • 如何输出html+ f1 e) E4 H6 d: c; O

        g6 q4 Z  h0 i( e
      8 V% U/ N$ z) g+ }. f/ ^' k

    PrintWriter pw = response.getWriter();

    pw.write(“<html>”);

    pw.write(“Hello”);

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


    . j. D9 N! ^6 k" W' p% o6 c
    • 如何设置输出的contentType4 W  b# E! l4 O1 o
      7 b& l" [0 q* A% c$ P$ W

      + m* [" M: H* [, z

    response.setContentType(“text/html”)


    7 ?7 H! h5 B4 u* Y. f/ @/ H( o6 }+ O% U
    • 描述servlet的生命周期?
      & u3 r( ]6 C* P) e

      & {( G; |# w0 \2 h3 i3 ]  y" s9 @3 o/ r0 L) p

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

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


    0 E' d- ]( P2 T3 U4 {7 p
    • 描述init,service,destroy方法的功能和特点0 I" B6 z, Z9 v: K- ?

      3 Q( T! x$ J+ E! t: Y  X$ [" e0 k0 w5 y

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

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

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

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

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

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

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


    7 T; |0 N3 c1 k2 m) o5 s
    • 什么是回调方法?有什么特点?3 X% Z6 h9 o6 k6 K( ?& [+ {
      # l" n; P8 y1 H+ I* D
      * L. Y* R$ A9 m) C

    由容器来调用程序的方法

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


    6 o1 U" Q6 X6 D. [4 H" i7 y
    • 如何设置初始化servlet的参数?
      ( }& K* T( ]' i2 P" R
      3 z9 S& B& j, N/ b+ U
      在<servlet>中添加如下配置8 z" c5 J; F" o" c6 a/ q- i
      ' {, O$ d+ R5 |6 u0 c8 R6 \

    <init-param>

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

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

    </init-param>


    0 d+ K2 q( A( t1 Z, K
    • 如何获取servlet初始化的参数
      0 B: T( |$ N" R6 v' ]1 v7 L" f

      5 v" q/ _- r' {: s. y2 O  V- a* Q( w4 L& ~) s( `

    public void init() {

    greetingText = getInitParameter(“greetingText”);

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

    }


    3 R6 q: X( h5 e" c
    • ServletConfig接口默认实在那里实现的3 O( o; g$ o* e; K+ H

      ! e* S) q; X# r3 k4 q* ^% }; R, U7 Y, S& Z& L  ~+ @: p; W

    GenericServlet类实现ServletConfig接口

    : J& z. v6 c1 I% K% c3 o5 n/ |
    • 什么是ServletContext?有什么作用?4 h6 o% u& q# d" L* ]  }

      . X1 C7 S( H) f( d6 V" W( B6 I4 p  k& H: E2 Z& B+ b% c

    Servlet上下文

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

    ; `0 X# e% |0 L2 A- I: }; y1 w
    • 如何访问ServletContext接口?是在那里实现的?
      9 m  U4 X4 S& P2 u* ^: F- A3 U

      " s5 }6 M0 y& n. |3 m1 M7 s; j& [1 g' Y. O* r7 G$ n

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

    GenericServlet类实现了ServletContext接口。


    # Y! c. P0 Q$ p! Q8 o9 X+ c
    • ServletContext接口的功能包括?分别用代码示例7 c& W% Z9 V# \9 m& t
      / F3 ^2 `# U: Q5 y
      + ]2 T9 P7 ~) ~! L; C6 y) a( |

    只读初始化参数:     getInitParameter(name:String) : String

    getInitParameterNames() : Enumeration

    读写访问应用级属性:getAttribute(name:String) : Object

    setAttribute(name:String, value:Object)

    getAttributeNames() : Enumeration

    只读访问文件资源:    getResource(path) : URL

    getResourceAsStream(path) : InputStream

    写web应用日志文件:log(message:String)

    log(message:String, Throwable:excp)

    9 P1 V$ R$ c5 u* i- d/ O9 L
    • 如何设置ServletContext的参数?9 a6 n! @, M/ c! k
      ! ?* w# q" e& ^" V7 a$ R* {

      $ x. F* X, D# T: N

    <context-param>

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

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

    </context-param>

    / ^* T3 ]5 l, s) V- P  D  @
    • 如何获取ServletContext设置的参数值?
      ! x$ h% B# {  B! v' o) Z

      - ?  a" D3 ?( f8 V* P5 f
      0 ?1 l0 k1 g! c8 U# B

    ServletContext context = this.getServletContext();

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


    ) E, C( I  c- p& O7 Y
    • 描述Web应用的生命周期?8 Z) e: S  R: B8 u" x
      5 L- \7 _- F/ Z5 E1 S" l
      - ?( r- U& d$ `. M

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

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

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

    2 b# |1 f  \- S, Q& @
    • 如何用代码实现监控Web应用的生命周期?
      # L5 w* G0 X* v: C- S
      % L' I0 L! V, Y1 }! X( c
      5 r% N( o; i/ a1 r

      2 R1 @8 l, x( o

    public class Test implements ServletContextListener{

    public void contextDestroyed(ServletContextEvent arg0) {

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

    }

    public void contextInitialized(ServletContextEvent arg0) {

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

    }

    }


    : y' I; o5 e- w5 \3 U

    web.xml文件中的配置:

    <listener>

    <listener-class>

    com.csy.Test

    </listener-class>

    </listener>

    0 _  s% U" L/ u! o: g1 d
    • web应用中如下错误码示什么意思:400,401,404,500
      / L( f- ^, H6 R" s4 q

      2 c/ _$ P4 s* S/ k
      400 Bad Request//错误请求
      401 Unauthorized//未被认可
      404 Not Found//没有创建
      500 Internal Server Error//服务器内部错误
      + l8 r4 y; k3 n% s# z/ G3 ?' i

    2 @4 N& b6 z9 b; l" t
    • 描述Web应用中用声明方式来进行错误处理的两种方法
      0 `& w  M9 F. p- |

      % A# P4 _4 }+ l; A, E$ Q* i, d. K8 l. T8 Y( y* j0 [

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

    <error-page>

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

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

    </error-page>

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

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

    <error-page>

    <exception-type>

    java.lang.ArithmeticException

    </exception-type>

    <location>/error/ExceptionPage</location>

    </error-page>

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

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

    7 v! P* O  e2 ^+ `! T8 r1 Q+ J
    • 描述记录异常日志的方法,都位于那些接口?
      ( F9 o6 O4 c) n: g# [0 {
      9 [# h1 ?) d4 _6 W( }7 p" L7 O7 n+ l

      4 }+ d$ b$ B6 y7 M7 h

    GenericServlet:

    log(message:String)

    log(message:String, Throwable:excp)

    ServletContext:

    log(message:String)

            log(message:String, excp:Throwable)


    ; X- ], M) i: k! @0 }3 N: z
    • 什么是会话?+ ^" S6 y/ d- r- S7 L0 l1 @. k) S& [

      0 b3 z: e! k3 o0 L8 ?8 ]: l. O! l. E/ \, V

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


    " F# g0 w7 T- J; r1 _, c# X
    • 如何获得会话?
      3 @$ S3 C$ R/ J3 a) @- N" ?! k

      5 [$ T! y4 U3 c4 {. O% W
      HttpSession session = request.getSesseion( );

      9 j4 z2 Z3 D! w* E  i
    % p+ T7 T' [* A, y6 f0 Q$ g* z
    • 会话Api的基本功能?
      1 T: A. D* W2 g7 X0 n

      7 ~3 P' h3 v" _1 y+ p/ y, E  ^
      2 K/ a+ ~5 W$ h1 \; k; J" Z

    getID() :String+ l2 M# _" \$ }, Z: ]9 |0 z

        isNew() :boolean
    6 B) j6 t# C0 u/ J

        getAttribute(name):Object$ r( D. X  ^3 I

        setAttribute(name,value)
    ) v# z/ W/ F9 Y: V5 @2 a! D

        removeAttribute(name)


    - T+ @, M9 {" J: I7 }( w3 _
    • 如何销毁会话?
      % C5 _3 c9 [  K5 [
      / [% k( f* j+ y# F. h/ _  ?

      / X( R* d" J3 ]3 [3 ^. x

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

    <session-config>
    ; I6 Z; ~3 T4 i

             <session-timeout>10</session-timeout>" t1 C0 d& ]2 ^

         </session-config>$ h" H& g' `+ T) S! i  e/ `

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

    invalidate()
    ; w+ B) s/ j7 a1 }

         getCreationTime() :long0 [# O8 C  Z' L+ C4 z- ?# p

        getLastAccessedTime() :long
      |7 R# p9 ~$ G6 i8 j

        getMaxInactiveInterval() :int. s. T3 T* C4 ]# T

         setMaxInactiveInterval(int)

    - K& ?7 `& L4 W- e& E' m
    • 描述会话保持状态的基本原理/ I$ J0 E# q' ^0 H7 _
      " u% N( X9 C: _) _; u

      ( C# f. H( [( v# F# {: V) l
    1 }' `: o0 B2 ]( o

        client server
    7 ~9 A* y$ L- l' ]


    , U8 `% V; w9 k* n) K. e+ J

    request3 l( _) M* e5 K8 C

    response (sessionid)2 y( z& a7 s/ `

    request (cookies); ^. f( Q% k4 e) m' t+ ?

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


    . g7 b0 B& \) t0 n2 J; Y5 k
    • 请描述session和cookie的异同之处
      ; D  z1 Y4 a# e/ ~8 i% n$ C. \. F3 ]

      8 i+ @3 {/ ^: `/ \+ U
      ! n; V% [, n; ], s! X

    8 R) s! @; Q: w9 c9 ~
    + H( D* I8 s. ^6 _
    • 如何读写cookie,代码示例0 h0 i+ X1 d$ H, J$ }: |" p
      . W; f1 L  ]4 d9 `* j
      1 u. {/ k1 _; W% W2 F

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

    response.addCookie(c);

    读:Cookie[] cookies = request.getCookies();
    ' b7 }. v5 Q8 ?; K7 Q4 c* K

            for ( int i=0; i < cookies.length; i++ ) {
    2 u$ O2 H2 Y* v) y. n9 S

                String key =cookies.getName();. h% S8 d7 J" i  e* T/ c/ \6 z4 ^

    String value = cookies.getValue();
    / Z2 E( B# I6 E0 A

    System.out.println(“cook”+i+“:key=”+key+“,value=”+value);; u- G( J+ R' f: d$ O/ J

         }

    ' _6 @0 W; T5 m$ L+ a1 o
    • 什么是URL重写,如何实现,代码示例2 w/ E0 S8 r9 O# o: k- n) ~. V5 x

      ; y3 P0 `0 L2 ^
      7 w2 h: X% j% g* f$ Y' b

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

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

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

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


    7 z) U  V5 d+ Z% I0 F& ]- E4 @8 g% ~6 w3 ^! I
    • 描述web应用的4种认证技术% T1 @6 f: V: H6 P: p" O( `
      ; e$ u9 s- J, J7 S( z+ ~% k
      6 F. V+ V$ x# \& F  k  G

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

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

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

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


    % S5 w! w% \4 i
    • 什么是授权,什么是验证?4 A  h9 n' {; F: x" h; `

      % Z" X% Q5 m' [7 \3 R: I/ [& U; j6 x( p" @

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

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

    9 _& e# q3 s+ C5 L5 p( q
    • 什么是HTTPS. F) }  {* _6 h  ~0 a

      $ u$ l6 E$ W0 B- |% N  \4 ]' G( U2 }" n& }3 R4 k

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

    % P0 k' n7 h! f8 @
    • 什么是审计?
      ' `+ e9 A* z2 N' A

      ! v' b: C, ~7 @" \7 q
      , J% S) h8 O$ X% B* v

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

    5 ]) e) H( e1 `  v
    • 如何实现声明性授权
      - ~8 D/ K1 f! h, {. X9 j
      ' Q1 P, _( A. s
      0 K  y% h2 X, F5 K

    1、标识web资源集

    2、标识角色

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

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

    在 web.xml里配

    + \& L% g0 n, q
    • 描述servlet并发问题?
      9 K4 V* _  i% F' i
      4 V1 Y  s. n$ p. f

      # ]* d! y; P: P. l$ D) \- v2 Y

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

    / o7 q2 `: ]& P1 R
    • 描述Web应用中的六种属性范围
        K; h3 M1 g. f& s* E9 [# n6 D
      ' }# r7 D* C$ `7 c1 r' a

      . x( J# R& S% x0 E  ?, h/ c

    局部变量(页面范围)

    实例变量

    类变量

    请求属性(请求范围)

    会话属性(会话范围)

    上下文属性(应用范围)


    ! M4 h# `$ U. t
    • 指出上述六种哪些是线程安全的3 n+ P' r5 Z  e5 q, _

      ' j2 C) e1 z4 `7 l* \0 P
      7 d+ s& D9 i1 s7 h. e5 t5 ~

    局部变量和请求属性

    1 p# j0 v1 `- H9 C) {$ U; |3 ]
    • 什么是STM?如何实现?
      % N1 u$ ?8 s' G

      , Y6 e. P) i7 `# Z8 J. k+ r8 w0 z7 z) J( Q% V( k( w, E2 w0 c: O

    SingleThreadModel接口

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

    , f5 a6 [2 G- ?- m& D. d; n' c& X
    • 如何实现并发管理?0 N4 u' u# l! Q/ O! S* d
      / n! V/ s, m5 A: @' u' _, V
      + ?2 Z/ a6 K* C/ Y) V

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

    使用synchronized语法控制并发

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

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

    9 y; E. P+ y2 \7 t0 t
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    13#
    发表于 2014-12-03 12:45:45 |只看该作者
    Jsp
    % M' ~2 m+ K- L; d* j! c什么是Jsp?+ L, Z' @) t- N, ?! d
    Java Server Page    结合java和html在服务端动态生成web页面的技术
    * {! H3 f" v; j: \& R# b/ K  I! V8 e$ @$ `' f  E1 V$ k. n

    ' t" V. V4 N1 o+ v, T6 l4 }) m0 O/ i1 Y  t6 T' E9 T9 P4 a
    描述Jsp页面的运行过程?
    * Q) ~" |/ k5 S9 Y3 k第一步:
    ' h# u& d% K- A5 w" m: h
    ) c+ [0 F* |1 M. P- }/ S1 U请求进入Web容器,将JSP页面翻译成Servlet代码
    - ?. ]6 Z& |  c1 z5 I9 O# o* I
    / E! O6 N% F- L% x% k) X' O" ^& i第二步:7 o7 A+ \3 o$ Z, X  G2 ~

    * ?* v1 ~% e( ?9 d% c3 ^编译Servlet代码,并将编译过的类文件装入Web容器(JVM)环境
    , c1 t& O: ]+ l8 O2 Z; U# H8 s9 E4 b$ n3 v6 W  e+ t: d
    第三步:. C7 {5 E2 Z* z# h. p) J

    + `7 v$ p/ C+ ^( h* h+ YWeb容器为JSP页面创建一个Servlet类实例,并执行jspInit方法
    / l8 \1 A% {2 t' i7 ]; }* \8 w7 `- i& n. z# j8 R' ?+ N
    第四步:( r9 i; N: H" c

    ! |+ T. a1 o7 w2 R  [- lWeb容器为该JSP页面调用Servlet实例的_jspService方法;将结果发送给用户
    , g9 J( S4 T0 B5 V. x6 l2 f/ |$ i: l1 {0 C* S
    . L" W7 E- n' n9 ~# V. U

    # h8 R8 b( f9 v( p% {- L描述Jsp页面的五类脚本元素的功能、写法、并示例
      y$ @% o7 h3 z7 `2 x注释 <%– –%>
    9 }# x: V7 {- t( q+ O7 v) U  j. @8 v& `" B% [' c( d8 M: p
    <HTML>
    ; E" a- l' e  Y1 U# o2 A  N8 O; Y) B# `/ U, P( E
    <%– scripting element –%>
    % x$ p* ^" _7 {3 k( x
    * Y( I% k6 v+ p2 U</HTML>
    9 Q+ O3 i. Y1 u' L8 [, B
    * X$ D, ~# o6 `# ^指令标记 <%@ %> 指令标记影响JSP页面的翻译阶段& n" L3 O3 p! p! _9 v  _  G
    : P& L" b$ e) p, @9 J( O, t" w' I  h# U! ^
    <%@ page session=”false” %>
    . j8 M$ \& \2 v8 X1 U. _
    0 \4 x8 `7 [2 z! K) K% Q* \声明标记 <%! %> 声明标记允许JSP页面开发人员包含类级声明% y6 E) V" q1 v$ @' Y3 d: j

    8 N" Z  }' H# ^2 n2 N" Q9 _* r<%! public static final String DEFAULT_NAME = “World”; %>6 M4 J1 ~1 @' h

    5 K, x8 s- f1 P    脚本标记 <% %> 脚本标记允许JSP页面开发人员在_jspService方法中包含任意的Java代码
    5 x. z  d& ^0 a1 Q& e8 d  e" Z! F1 G
    4 B/ B- X1 f7 z8 V0 i    <% int i = 0; %>9 Y/ Y2 Y3 f; o7 [7 A( [# V- Y
    $ R. i- ]. G3 {7 G% |: y
    表达式标记 <%= %> 表达式标记封装Java运行时的表达式,其值被送至HTTP响应流 <B>Ten is <%= (2 * 5) %></B>
    1 E5 O4 `- K. n# b% n* A9 `, k1 k1 x, F4 \. X: z

    ' [9 e/ H* ]8 r1 f! X" j2 w
    8 c1 ~. q' J9 @! y2 z描述Jsp页面中的注释种类和写法
    ( I8 w8 Z7 c' [, `2 dHTML注释! n) U6 ]+ S2 I5 f6 h
    + o- E1 [# r* Z/ w  J* d) x
    <!– HTML注释显示在响应中 –>
    ( s% L$ `! N0 w1 D5 K# w  w- d" f0 t& m. g
    JSP页面注释
    " W" {7 d& j, U6 M5 m% |4 w
    6 [+ m$ N$ l* u<%– JSP注释只在JSP代码中可见,不显示在servlet代码或响应中。–%>  i  H# h/ L# @
    ) R6 J4 x4 D$ x. S, z1 x
    Java注释
    / @0 ]( Z3 ~3 N# }! C3 t+ k# [: |; M
    <%
    : g' m% f& q8 y0 o. X! {' |5 I4 R6 X
    4 Q+ x. d- i1 _/* Java注释显示在servlet代码中,不显示在响应中+ _- H, u) Z+ O( y

    7 w% M5 O( M7 |& d' @*/0 W6 @! g6 j, v5 y9 ^" k7 n( i
    5 S* p+ [$ G9 |; W4 f% n1 g
    %>+ ?! m2 Z" v  w- }. ]* W) J" b

    ! E5 F- B  H5 L% h! X( { % x; r( _. @8 B5 A0 X0 L. P" ]

    % C% d7 @4 h: T: M% v( ]" T描述Jsp页面的指令标记的功能、写法、并示例9 v6 r4 }& v# i* L
    指令标记影响JSP页面的翻译阶段6 T# D# B9 r- N# }0 c& N

    + C0 y+ ~( U% `" L, B, H2 F<%@ page session=”false” %>
    . G( S+ r! G5 s* j. I% I- k, I9 v4 E  P" C. o
    <%@ include file=”incl/copyright.html” %>
    - q( O: U9 O; t8 K
    + U& D3 S# B4 z5 Z+ z: o! m1 u<%@ taglib %>1 b/ N( C4 g1 `7 v3 H- s5 Z

    3 d+ o! e7 v& }% E   f3 a- M- o- S& o' u, x2 ?

    ) D) j9 O3 z* J$ b9 r; `2 _# X描述Jsp页面的声明标记的功能、写法、并示例1 p! W4 i8 }: h# @+ t1 _5 D
    声明标记允许JSP页面开发人员包含类级声明
    5 o0 L- a7 C  q9 e. ]" K4 f5 W, m* W( a3 j* P
    写法:
      I* M) \1 G, v1 z5 ?  R* e4 y' y+ E0 l
    <%! JavaClassDeclaration %>
    1 W% Y$ q# f6 A
    $ J& B. d- u% |# q1 U例:4 i/ Z( V+ [" X; E- [7 e' }
    7 a4 C7 n; n$ [
    <%! public static final String DEFAULT_NAME = “World”; %>9 G* W$ ~! {" d3 o5 Q

    ' G/ N" H" P: |/ Y8 G& ?<%! public String getName(HttpServletRequest request) {8 `5 L" E6 {( i6 @
    ' s4 \  Z" U" g$ v0 @
    return request.getParameter(“name”);
    5 P7 s2 b: s4 K- v/ F
    : I. V: ]/ d: i: F4 K}
    5 _+ L& M8 T1 O( k! i
      x- U: o1 z0 p; l  ^7 p%>
    . F% W; Q- |3 A+ S' d$ E! X) J6 c6 L' `) a6 u9 _' w* F( a
    <%! int counter = 0; %>% y$ B( ^$ S2 m! [% k
    ' ^! {& H& B+ T( c$ W; r8 H
    . S/ p# i9 O; z( ^
    & s! |# R1 }  H8 f
    描述Jsp页面翻译成Servlet的规则
    . ?9 G4 p2 q1 U6 c' @% e% l+ yjsp中的注释标记被翻译成Servlet类中的注释0 Y- {+ S0 w8 w9 p
    8 l; c  |3 L* M9 Y7 y' t
    jsp中的指令标记被翻译成Servlet类中的import语句等% ^8 c+ K2 H- {- q; J

    ' Q1 T6 U# F( y8 N+ Gjsp中的声明标记被翻译成Servlet类中的属性
    " V" o- n& |+ P0 l5 l+ n$ I7 ~( l% B+ C/ c
    jsp中的脚本标记被转移到Servlet类中service方法中的代码
    5 @- c( h& P' W! P- [' b. ~) W" ?' Z6 m% j* ~
    jsp中的表达式标记被翻译成Serlvet类中的write()或者print()方法括号中的代码
    # W$ S. g- x4 y# _- L! I
    6 N  u2 Y. V4 O. I6 M/ M' N
    * n& _+ z/ @$ i& ?' _* U% U2 z/ k8 E* H2 Z4 V  U' v9 g" Z
    描述Jsp页面的九个预定义变量的功能、用法、并示例. `; m3 i; X( q$ b$ [; o/ q% t
    request 与请求相关的HttpServletRequest对象" M! Q* A: s6 K3 P, S" t

    7 V$ P' ~  j' F" }- z. sresponse 与送回浏览器的响应相关的HttpServletResponse对象0 W0 O2 X+ T' D* `

    ! ?1 ]" L6 Y/ B6 _% f/ {out 与响应的输出流相关的JspWriter对象
    ! F, H# b7 i8 t
    " n9 [' {1 Q; C% S2 \" ?    session 与给定用户请求会话相关的HttpSession对象,该变量只在JSP页面参: k+ Q0 v# A$ H7 x4 }

    + D8 j/ G/ w- S+ Y1 `* p. b7 ~与一个HTTP会话时有意义- t5 W0 {5 y% R5 e( m& R, a5 g

    7 X2 p0 G8 a5 c) W, j' ?9 v- e    application 用于Web应用的ServletContext对象# m8 R: z* [1 \6 ?5 x% E- t
    - y, v8 C) E$ }& f1 H4 ^# A/ _. J
    config 与该JSP页面的servlet相关的ServletConfig对象
    * Q2 N4 ^  i- `; l
    : e7 G, N5 e9 f0 d7 h; kpageContext 该对象封装了一个JSP页面请求的环境
    % l) i) @0 l5 |9 _! N, {+ N( P
    + m/ h) {- V$ O  e5 u) Y! ^page 该变量与Java编程语言中的this变量等价- b) J. m9 }. `

    1 G. o6 b% g( H) l. m3 y. o: A! Q2 e    exception 由其它JSP页面抛出的Throwable对象,该变量只在”JSP错误页面”中可用
    0 o, f& R. v& O# E) d3 B: s& n) J7 \' G
    # j" a8 ~# q( ~

    & M( E6 f! K+ }! A$ Rpage指令的功能,写法、并示例,并描述它的如下属性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding
    , Z. m: l: z3 k6 Z* Aimport import 定义了一组servlet类定义必须导入的类和包,值是一个由
    3 `/ |" _, V6 c7 N) T$ [6 x0 J! o3 U5 m+ [6 H7 N( `& \9 J
    逗号分隔的完全类名或包的列表。" ]. Z4 X, ^; Z! G+ Y' ^
    ' f9 `& o  X3 j/ c
    session session 定义JSP页面是否参与HTTP会话,值可以为true(缺省)
    8 o6 x: y, @3 |- o! s9 Q. v2 w) W7 A9 z* S5 s6 s4 t2 b
    或false。5 Q; k. z- {2 s: x
    8 s1 p5 n8 P" x1 K/ P5 b: O
    buffer buffer 定义用于输出流(JspWriter对象)的缓冲区大小,值可以为2 H7 M& h/ Y" X! X" M

    $ R6 x. h! L! ?. lnone或Nkb,缺省为8KB或更大。  i  u" t4 S' Y
    7 t$ S7 C8 x1 k4 h
    errorPage 用来指定由另一个jsp页面来处理所有该页面抛出的异常
    ! S* o/ p; ]6 h5 ?& D7 A! {( ?1 h0 \9 w
    isErrorPage 定义JSP页面为其它JSP页面errorPage属性的目标,值为true或
    5 _! v; E& q/ q! g5 M9 D- [9 ]8 r+ {: }' ~  i/ P$ g) ~
    false(缺省)。
    5 o+ ^' h4 E5 q2 W
    / @: w4 @7 a( p1 JContentType 定义输出流的MIME类型,缺省为text/html。
    # z/ E# Y: `' W/ x" ~1 `8 q9 S6 H1 }1 }0 K
    pageEncoding 定义输出流的字符编码,缺省为ISO-8859-1
    % Q+ r+ N) N4 K# n' d
    - l, P' B  l2 c1 f0 ~) P4 ?" T
    ! M) ]0 I6 o0 q5 ~) k  m' H+ R
    描述MVC各部分的功能?MVC的优点?MVC的缺点?+ r7 W3 Y8 U5 L: C- O
    MVC各部分的功能:
    ( o% y: }1 w# k+ m. q% ?6 m  k& U8 `, V) P% ?' R0 N& l5 T
    Model(模型表示企业数据和业务逻辑)7 b' o7 Z; w$ Y4 h% A

    0 Q& m3 x- k2 b: q( u/ H封装应用状态
    8 ]4 {& l) M0 }" z
    . ?% B6 H5 r  Q2 P) I9 w7 Z2 b响应状态查询$ q: c4 _  O2 `4 f4 B

    ' X$ O% U! O' B暴露应用的功能. t# A# F; F1 L3 X( r  `
    9 J- ^  K2 G, x3 z- K; G
    Controller(控制器接受用户的输入并调用模型和视图去完成用户的需求)
    7 e  a* Z( l# Y  a# M8 E2 S& z1 {$ g5 U/ a
    验证HTTP请求的数据1 O. S1 N$ ^$ i$ c4 g2 K
    / R0 v8 l' Y* r/ R8 `8 a  z! ^
    将用户数据与模型的更新相映射6 w2 r1 I8 J) y7 _- M; ~

    7 |- E- Q9 t; j7 {9 o选择用于响应的视图# f! P( T" ~5 |  X
    ( s6 X( p6 }" G: p8 }" m, l; P
    View(视图是用户看到并与之交互的界面)8 Z; U( Q  O5 P, Y. X4 O

    ! f1 }- M4 J5 H9 \: D9 r产生HTML响应) K% E; t, {! Z0 z

    * `4 w* e; P1 O$ w6 [5 P请求模型的更新
    6 z0 L, L' I8 H8 k  w" U
    . g# ~3 N5 ]7 w' ]$ _# k9 k2 t7 U提供HTML form用于用户请求
    " a  s) N* L5 C! i2 l0 m' b/ ]* @* r
    MVC的优点:- ]3 M. S5 |) a8 k
    ! ^* Z! l2 K+ x* j1 E
            低耦合性:视图层和业务层分离
    6 Y# Y4 A7 H7 D7 M
    / Z) W/ F8 P5 x7 ~3 m高重用性和可适用性
    0 c: v4 I0 o1 c  }9 o
    $ X( }& d* M3 b. W: Y# o较低的生命周期成本
    1 k0 ~$ B/ f& z) @8 ?0 S0 I8 m* r! w0 i, i8 d4 |) V( N
    快速的部署/ P5 `8 A  ^4 i9 l" I
    # o* p# U" n! L% R/ ]
    可维护性
    + X6 D; ^4 Q8 I; L7 T; w% m: A1 y6 O0 E
    有利于软件工程化管理3 f" ]7 W* |/ C4 @3 E+ R- ]

    4 C8 F1 P8 N* g- P# W8 o提高软件的健壮性' s1 c4 ~2 E4 ^: G) C
    $ n0 u. t0 O7 p4 E
    MVC的缺点:
    , H1 M% U2 q; t1 w' F
    ' m8 x) s5 z! G: l        工作量大,增加工作的复杂性,MVC不适合小型甚至中等规模的应用程序5 g8 J  o  e% d9 c) I6 Y6 R- v

    % O( d9 p9 i+ ~ $ E) d- {# k7 C+ j$ J( N# c

    . J$ G4 T% j0 R什么是Model 1结构,以及结构中各部分的功能$ z1 n$ I8 d0 C2 ?: G9 d3 Q9 `+ n
    结构:jsp+javabean
    8 E2 I9 R! V2 I) i# ~/ u" q
    - W' B7 ?5 o" U' w  ^9 pModel1中使用jsp来处理web应用中的视图控制部分" K$ H5 T5 }/ D) \% E
    % l4 g* U$ o8 S, P, C
    Javabean收集参数
    ( K+ m5 G; g3 e2 g6 r9 z. h: D$ [: }5 v9 \# p0 F. y2 S; M; s

    8 P& H: D& X0 ^6 H
    9 r4 T+ _3 J8 p) p, s2 l" u什么是JavaBean?
    ( p$ c- h- p; d. `( N* G用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。
    3 ]8 u# ]9 B6 i3 K) y
    - A9 n% U8 b; n, |
      N: ^1 T% ^& r, C
    ' y; Q" @2 O+ p: t- I0 xJavaBean的规则?
    5 t: C9 ~7 k- f5 h6 l使用get和set方法定义属性
    0 q& }* K$ G  y$ h; R4 ^: k6 B" i  v4 ^
    一个无参构造方法
    2 f) E" _. n# y7 }7 q% }8 ]9 A
    ( M& t9 ?. {8 A0 k& D2 B9 ?0 O无public实例变量( 所有属性私有化)+ i; i( W$ z! C0 V4 k

    3 ^# i! |* S/ }8 F. R" \ ; D5 y) _7 I2 p  y) e

    2 H4 S/ ~6 v6 @) Z. r什么是jsp标准动作?包含那些?分别都是什么功能?如何使用?
    0 Q& V9 |+ _0 K. @4 {* OJSP页面中使用类似于XML的标记表示运行时的动作
    ! v# p, s2 {1 U# H" C' Q0 }
    * W- J$ J% e/ s* Wjsp:useBean6 x) O7 J& U2 A+ T9 Z0 e

    3 x) x* ]8 i- \$ _3 Djsp:setProperty0 a8 D% A9 [  z" \1 |# n8 q
    9 ~& l% G- ?$ I1 i, v0 u/ {% H# B: i
    jsp:getProperty
    * t; _) v) `  y
      I6 }2 ]3 t  b$ Ujsp:param
    ! d* d6 X4 Q' W5 m! t1 B
    6 }* m! K& e; l% c9 G" _3 i# Tjsp:include0 i1 D; P' o; ~+ R

    ' f' R4 f  \! [% s7 Djsp:forward! A$ ~4 b7 Q+ ]6 |9 A' v$ _0 P. s
    ) l. e) q" x! t3 Z3 l" V) m! ^

    6 H( d9 N" `9 Z  {' c& n. M4 x
    $ l% m( ^3 U( E8 @  C2 ]* M用代码示例如下标准动作的使用:useBean、getProperty、setProperty9 S6 d) b3 Q2 i4 c$ e: d! q: n
    <jsp:useBean
    ! A( w$ _/ _# J1 s5 Z. ]4 }$ y5 L) C! L2 ^2 \8 r0 M% o# W+ K6 G
    id=”myForms”- \# y3 g: e$ `: w" X% s

    7 c5 {% g9 z' u3 cclass=”com.base.mystruts.forms.MyActionForm” scope=”session” />
    6 ?, c" _+ A$ d1 }/ C6 ?- [: q% S7 R! f3 J; J
        <jsp:setProperty name=”myForms” property=”name” />
    $ y5 {! X( V5 Q" f% }, L# D# F: p, s7 Q3 B/ s! K
    <jsp:getProperty name=”myForms” property=”id” />$ f, q9 ^% x* S" G0 F& w
    : y+ e, }3 e* _! N
    + U3 m- S) |0 Z3 o
    * J. i9 `* l5 c. \# d# n* K4 n2 B
    描述说明Bean的四种scope2 U6 I& u% @( ^- x
    page( l7 b: i: ^+ p- u7 @

    8 W5 \8 \, N: g" L& Q; arequest) {( w9 O0 x; V( I$ r

    " k: {5 V9 }9 m. c" w+ Bsession
    + Q* L! ]6 X/ @/ R/ y  n& J
    * }% d3 j  [) b, Q; Rapplication- R( U$ [) R0 b
    $ U' l# w  F! x

    + i! L' u; y9 @
    # r$ p; K6 R9 |1 T描述说明页面上的字段和Bean中属性的对应规则1 G' n$ I0 w4 A% J, n/ T* v
    id 指javabean的变量名
    4 m1 g; q8 V& J# A* w& ^8 [+ _
    ! U# c8 e5 Y5 l1 ]: |* M: Bclass指javabean类的全路径, Q5 H7 O! R9 @# u  N, {

    ) H" V8 m/ d7 l# b9 p& m, C; r0 ?scope指javabean的应用范围
    * g/ ~1 m; f% g* @( i' z' L  H; m
    name指所用到的javabean的变量名
    : q9 t& @2 V6 A6 d+ Z
    7 X* Y; T$ T! t& r2 ~    property指javabean中的属性
    . w' F$ A0 v, s1 o+ q  I* A
    6 T% X+ {5 C! I4 x3 `, H  s* G  d( R 8 Z) v0 _/ R) }3 [$ X
      R" u2 Z6 L+ \6 z. x. A3 L; n
    描述useBean动作的处理过程
    0 m! ?/ @3 J8 ?% n/ j使用id声明变量: A7 Y0 ]6 @4 t; F' A7 A
    # @5 w. }. p  V
    试图在指定的范围内查找对象2 z% v: F/ d, K

    , V; a6 e3 j' V9 w$ T$ X# g' s9 u如果没找到/ g0 L& V8 u) l4 A8 f

    5 P# _" J" d+ B( [" S7 I创建一个类的实例+ |8 w2 {  A: m. O! w0 g
    , C  p5 `, i/ K/ Q2 C0 O0 N
    执行useBean标记体初始化对象" y+ t) y+ `4 D! }* X7 c; e' k) B- L* B

    - ?2 {1 Z/ d/ N如果找到
    - S/ i( y5 h& X8 @
    & K3 L, q- x' K' s. Z# h: z     将对象转换为类指定的类型/ x0 b. }% Y/ K! x

    ( n0 |9 Q- e) n3 o3 i ' x1 P! S8 }, k& `" d5 v* _" A

    5 C5 U1 [5 l" c/ q( x描述forward动作的功能8 L0 T$ [9 ]( u; h
    使用脚本代码处理请求时,可用jsp:forward 动作产生一个不同的视图,
    # H" H( L( g: V( L3 x9 ]; Q7 x- \& e, N; W' g5 s5 K
    使用同一个request:3 t* r) K( u! S' h7 h

    5 w, T' q7 }; E* [5 x 0 `8 _% ~3 H/ B' n  d

    # x, X* d: h+ [8 c什么是Model 2结构,以及结构中各部分的功能" u& m6 v7 M7 d4 @% a- v4 i. n1 X
    jsp+model+servlet! G# T# m  T$ `& k3 F0 h7 ~. X
    ( F, N& k8 c' }, j) N
    Model 2架构使用MVC模式,JSP页面充当视图,Servlet充当控制器  K8 T# E% R8 C( m) P) _
    + F7 `& n4 Y) Z% q0 l3 t
    Servlet控制器:* I' B9 M% U; e. p7 k
    5 {% O* o( J" \0 C
    验证HTML form数据) Z( b+ J8 q4 F7 a$ u* E, h' B2 ~

    2 L7 ]( w2 w3 r" O! T6 V/ r* e) M6 F$ G调用模型中的业务服务
    / w, v, |6 f4 T/ K! @  J7 v& s
    4 u  V1 l: g( D1 |; ?# }, }' Y存储请求(或会话)范围内的域对象
    . k1 U9 d4 U* h" ~" m
    + D! B- _4 O) c: Z' a8 L8 H选择下一个用户的视图" x) p2 r& g7 L! s9 V

    8 S- \/ F% z4 A% WJSP页面视图:8 q+ O$ T4 f: S8 y- W6 _

    " G: c) C/ K5 L+ a2 R4 n; s! v使用用户界面(在HTML中)
    5 X: x8 }, G% @5 n1 h; u
    1 b2 g) y" j) t/ f1 o        访问域对象
    # a. c6 p% z9 |: _1 A) t( ]
    # O+ N8 f4 O" y- e( p9 }: E 9 k  @3 o0 i: q( ?
    9 h. L% Z2 K. G8 |
    如何获得分发器?分发器的功能?; R6 J/ u/ \+ Q, {
    上下文对象中的分发器:
    % i$ Y+ y$ F8 \" g4 ~! S/ @4 s! U3 j- [
    ServletContext context = this.getServletContext();
    . t7 t) A5 W0 _# p
    : ~7 N( [3 I, c' cRequestDispatcher servlet = context.getNamedDispatcher(“MyServlet”);/ }% c* G+ B8 t( L: ^  [+ @

      @* `# |0 V& z# v3 r9 Pservlet.forward(request, response);9 a" s3 t  g" C! W/ g9 X

    + d. X% S7 S& J  a) I3 W3 z请求对象中的分发器:1 q  Q! d. q! ^8 y, B* k

    / p1 e' @  J) z, {RequestDispatcher view = request.getRequestDispatcher(“tools/nails.jsp”);
    , J: @, T8 ?" d! j; C# T, w1 Z4 a0 z7 q( y; W& C9 e
    view.forward(request, response);
    , y2 M7 Z# {( C1 \6 F$ ^- I0 a# m) h8 I! J
    可以将请求转发到另一个jsp页面,并保持请求的传递性
    # {9 T: O7 ~5 l
    - W  {4 R) V- \% c. \8 E 8 S; \8 y2 j1 K4 S% Z
    & x% J1 C. ?' p8 F' H7 b5 |
    Jsp中页面跳转的两种方式?5 @2 W+ T- \0 v$ ^8 h, L
    使用分发器跳转页面
      h! O! w* n5 H% @* Z$ ^RequestDispatcher dispatcher = request.getRequestDispatcher(“url”);
    2 S1 g7 J( R/ s6 q- B0 D
    ; c+ D1 d$ x/ e/ L! E' S% ydispatcher.forword(request);8 p! e$ D& Y8 W+ F! d

    ' M5 e7 C$ K' m7 ^( U7 t    特点:保持请求的传递(上一次请求中的数据,在下一个请求中仍然可以得到);% o5 n$ |0 B- K$ K

    . B* x  B- L( F6 p& f        转发的页面只能是同一个Web应用程序的其他Web组件3 x8 I7 [. O3 A! C" _  w- P

    9 q) I, j4 M: a& G6 J+ R使用重定向跳转页面8 O6 @" t  Y/ C# N4 Q/ |0 [
    response.sendRedirect(“url”);" ~! T9 X& |. R1 z6 z" a, X
    ( g# H: k$ h/ m( z  B7 O
        特点:产生全新的请求,(上一次请求中的数据,在下一个请求中不能得到);
    ( g9 w- d( u2 g7 ]& `: I& I( ]. n8 X& J% ^$ o' q+ J
            重新定向的页面可以是任意的URL* w, K; \9 R* T0 G6 J

    3 d3 X* B; |$ d . A9 v1 z& \0 H8 V( ]' m4 h/ M

    : \) m  [$ [# b7 ?$ o" J描述Jsp中引入另外页面的两种方法,并比较两种方法的特点?
    * [: b$ E) Q/ m- S3 R<%@ include file=””%> 在编译期间把另一个页面完全嵌入这个页面,可以说是一个页面( z% N+ f8 k8 ~2 n3 W
    . z6 T- k1 {4 C$ G
    在这里可以共享变量8 o! @/ N2 ?5 X

    , M7 P# X# m. ?5 t% c<jsp:include page=””> 动态的再运行期间把另一个页面加入这个页面,可以说是两个4 t" r) L9 w% f7 b- r. w: T

    . @& H3 Y. D- ^8 N" `& M5 n页面,不可以共享变量
    # T8 z- d. g& e% R. n: I2 d
    $ f4 s( S/ C- f3 H% F: B
    & A& U+ E( ]  |6 d
    ( l& H. f: F8 y  m6 n0 G. e什么是自定义标记  M# M6 B+ n- f
    自定义标记库是一个Web组件,, {# q# m& ?4 s' t. b6 {4 {

    - R( f2 C' ~. L: d$ X包括:. f9 |, j& b( }

    7 y2 a* p4 z. I- R* _8 o4 @& e6 H) c一个标记库描述符文件(*.tld)
    7 y& J. e5 V. ^. I4 n& k, c; j
    ' d) u4 \' n( v" H! S所有相关的标记处理器类(*.jar)
    8 B7 C+ _( L* c! ~
    $ y5 M  s; W3 i/ e. Y$ w. v
    0 D% o! A. O. l' B8 k5 ~* G
    1 T8 C7 y) h# ^6 C: x描述使用自定义标记的步骤,以及每步详细的工作
    / L) _/ E0 M1 W- @0 D使用自定义标记前,要拿到.tld和.jar两类文件' N% i- V1 Y0 T( S; o
    $ k- x7 b' p( {, q1 U8 I8 c
    把.jar文件放到WEB-INF的lib里面。
    0 u1 u  _, ~2 _3 Y! B把.tld文件放到WEB-INF根目录下。' J9 {2 n) a2 E7 d
    在web.xml中配置。
    . \$ R& e' y2 i/ X9 i<taglib>
      H- B$ ]+ l  c7 @+ g, A# [* \: T: F! x# |/ s! m" Y3 ~0 h& k
    <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
    $ X: J1 k7 H& o( c  U5 \, V* }2 s, w  O( B5 D+ z
         <taglib-location>/WEB-INF/c.tld</taglib-location>8 D5 E6 a9 f6 c% x& Q: P4 f

    . I" w$ ^- i% a; @+ g& J</taglib>
    : n) f( \6 J4 d4 o6 X  ~3 g
    & t+ R8 D. ~! C1 d5 Q在页面中引用。
    ( {* q- U7 A2 [2 T: `# [; \<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“s”%>6 M9 ~3 X! y6 k6 l% ?5 }9 g$ D! l2 v3 Q

    # I3 c- P6 i9 g3 r4 Ouri必须与web.xml中的uri对应
    & v* K, L2 Z6 K& U# r
    5 {2 I/ b( G) ~2 V9 W$ tprefix是前缀,用来区分是哪一个taglib
    $ j5 s" n  B% x
    + q8 u$ B3 X) H+ m. p4 E2 p使用标记# d- C" _( i7 _) w' b+ B- Y
    格式:<prefix:tag名称 属性>/ L$ C- [5 y% L: s

    . t/ C$ T9 I/ |0 p<s:forEach >
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    14#
    发表于 2014-12-03 12:45:59 |只看该作者
    在tomcat下配置数据源
    ; b$ I+ X) L6 l* P" q; r1、服务器与数据库的连接
    # W6 r( ], i- z% l2 A7 A7 e: `
    ) h! b+ w# `3 ]; H5 D) I配置server.xml文件/ T  H  o; R: n, F* w
    6 u% A1 \4 K5 }; M  e2 }3 _
    1.oracle: T1 Z* [* v6 n1 h
    4 B! p( ~* }' F/ b
    <Resource name=”jdbc/company” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”9 k- B. J( ?; G0 p1 `: B
    / r1 R0 E0 {' e) }  l% i, L1 R
                            factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”; @( N# @, d& P. p+ k5 S
    & a# D" O; u, ]' |5 D+ p* u
    url=”jdbcracle:thin127.0.0.1:1521rcl”# n3 U6 D3 E" P" ]. S3 T
    : z. r3 M: s* J4 M5 [
    driverClassName=”oracle.jdbc.driver.OracleDriver”
    ( b% s$ r  Y$ [! ^2 t9 \2 }1 B( a/ F
    username=”aa”
    , \) T' L- t5 V
    : o1 t3 t- M# X9 p6 gpassword=”aa”
    6 O9 r4 S$ L! X; D& P
    1 {+ a: x8 H( D' s2 }maxActive=”50″0 O5 ~7 C0 R/ {# q. Y

    # M" l  A/ ?/ B4 K9 FmaxIdle=”10″7 ^% ?! J" ^4 {- C7 n: H

    2 L/ l* w$ V5 Z- k+ @# KmaxWait=”-1″
    6 s5 A  W( s& D* u9 y+ g8 Q$ c" H1 y' v3 Y  d* @4 w% ~$ `
    />+ w- e3 ?5 F, N$ n+ L/ x; [. X& R
    4 m9 |" b1 _5 e0 Z" u/ q8 \. R
    2.sqlserver5 L( V& i5 r9 o8 q, d: ?$ z
    , I5 b( A# u% N+ q% E
    <Resource name=”jdbc/webpage” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”" M0 _9 y! g. o; G

    8 s+ H. a6 v8 n$ u        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”$ [6 u- C- g! ^3 P
    * Q- o& `4 E$ c. Q
    url=”jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;
    . q, V( W. h7 f* H1 C) H1 k
    . Q4 W; Q" u. vDatabaseName=webpagetest”7 E8 r7 b5 K* P9 ^5 l$ M# M

    . T- e: N7 K: j, J) N0 u, K2 ?5 CdriverClassName=”net.sourceforge.jtds.jdbc.Driver”) \" T) ^0 F: ?" [

    / m- \7 E5 M  ^$ |username=”aa”
      I( N- ?& }2 W4 v) [4 V( M( V
    5 s, C  P4 I  k; ^) Zpassword=”aa”
    ) Y1 c  C( u) d
    7 l; a$ G, m* DmaxActive=”50″0 Z* P& u4 ^4 n+ ]9 a

    # {  O0 [( x9 i& P/ hmaxIdle=”10″% s$ m- S) p/ h
    * i( g7 N4 |! y$ g" }+ |
    maxWait=”-1″
    2 Q; O- B2 d% ^" P0 {2 I2 L  e/ I
    0 s, s' {! M- e  G# _/>
    & F3 s% ~+ U' i7 A$ A" ^7 c9 f7 u  a" G3 }  |& p
    2、配置自己的web应用的xml文件
    ! f+ t3 q" S: [$ _
    ' }9 f) c7 F7 c# S 9 t2 d  G% \5 Q+ R+ X8 E2 D0 _

    . T4 z5 i( J2 _' `. R, U<Context path=”/eb03web” docBase=”F:/workweb/eb03web”
    # ]0 K3 R4 c$ d/ m% Z: K- |) h% p7 b. W+ U
    privileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>+ j/ _$ d6 _9 g. h5 j. Q# s

    3 M' o2 V0 F" h  S# E  m2 E" t<ResourceLink global=”jdbc/company” name=”jdbc/company” type=”javax.sql.DataSource”/>" @9 f' J$ Q9 g) z: D
    3 f" ]* a2 p. q+ m* Q
    </Context>8 n; v: Y! t7 d- r, D7 d/ p# N! W

    8 G8 ]8 {  f/ D1 p% K7 \
    ' M7 S  r) X1 [  j% }
    - j- f. M3 y* g5 v0 `* k$ e6 o3、配置web.xml文件
    ' j/ z# p- \% g' o# b7 M* q5 {' ~' \, u  z7 g' l
    与服务器建立连接! m: }/ S/ d9 T% }" B, ^2 R* f
    4 M1 k0 a# f4 {  ]+ w& O- M
    <resource-ref>* S7 Q; A; b) l$ g3 X: i, E2 ]. e& \

    ; P' V: k% Q+ o4 ?9 ~  S<res-ref-name>jdbc/company</res-ref-name>5 H- [7 W. R' x8 E. q
    ! {. V/ t" L% m9 J# _. B
    <res-type>javax.sql.DataSource</res-type>
    1 M' A2 J# h$ n. C( k4 p( R, {0 H; ~3 f+ C7 L9 o! H
    <res-auth>Container</res-auth>
    " |3 J8 S3 I$ D5 g- ^8 |
    # r2 W" P4 c1 W( I+ J# p- o  Z</resource-ref>7 J0 K6 S( U  a& P" i! r) w

    1 ~+ K0 q6 s& ^. h$ i$ ~* {4、在应用程序中不直接与数据库连接,通过DataSource连接池建立连接( s& s' t" b+ @2 G8 u2 a. i- P

    * ]5 `( D* ~2 }# P9 t5 [; N//1.在程序单独用时设置系统的属性,在tomcat下可以不用配置,
    ; |" j7 I$ {6 y' x# N* E. t- P- n  \
    4 H" I' ?4 D, q7 CSystem.setProperty(Context.PROVIDER_URL,””);
    . C/ U  a- k4 I
    - H0 h2 B; w/ _$ R) ]System.setProperty(Context.INITIAL_CONTEXT_FACTORY,””);$ M' O) ~9 s; W; Q" O& S
    ) ]$ ]; G/ N! W7 x- c; m1 U3 J
    //2.创建一个上下文对象
    : j7 L  Q9 P; Y6 u8 f
      V. y+ `# C" x' z- }& ?$ M' @InitialContext context = new InitialContext();* B# S+ B* G1 v* p& v4 ^7 d

    ' c' ~* N  H& I* a! T//3.通过上下文对象在连接池中查找DataSource. w) q2 m9 m5 B* u; j+ g
    : q4 l4 `8 ^/ S* @7 O+ \
    DataSource ds = (DataSource)context.lookUp(“java:comp/env/jdbc/company”);
    " {7 d! p9 Q6 F( Q7 E3 [( R# a! h+ k% z$ a3 p, L
    //4.通过数据源建立连接
    # u4 j( W# G2 T) O
    9 V  X3 N/ I$ @' Dds.getConnection();
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    15#
    发表于 2014-12-03 12:46:30 |只看该作者
    ORM对象关系型数据库映射. W0 O1 b) L( f7 d* U# t3 W
    (Object Relation Mapping)
    : |- c8 l$ y, u0 T" S4 e5 a( i! b
    9 V- S) ]  o3 V一、映射的特点
    . ]/ ]  i, r8 I9 ]  r# e' R% a, W& z
    / K, M6 V& e' F+ D9 f* N: S% a: `1.一个对象可以对应多个表3 s  z) O5 {' A

    / Q- w4 L/ M; s. F) [2.一个表可以对应多个对象
    + Y* ~, l% H+ Q7 N$ {1 @, Y8 `8 \; ~" G# P4 P: R' v, P
    3.对象和表的关系不用完全对应
    ! j: F3 l0 e- u+ ]
    1 c, }; Y5 B& F5 Y' M4.对象的属性的名称和表字段的名称可以不同; }5 L, }5 h  G4 I

    + u5 d3 J( E3 v1 N) D5.类型可以不同,但数据类型之间可以转换/ B7 h" \$ G* i

    : W9 Y; v" c! f# d& ?  {% }6.对象中必须有主键,数据库的表对主键无所谓
    6 e2 s9 A3 v. ?6 B' i
    3 @3 Q0 i7 Z4 c- l$ Y  Y! g7.数据库中有主外键关系时,对象中可以有,也可以没有. q6 ^1 A8 Q4 z8 |+ H0 h- W; J

    ; U4 o5 M* F& v  M , n5 m. i' _& r+ V2 S/ O" N
    ; }2 q/ `  P8 a6 d: k
    二 、有一个映射的描述文件————>xml
    + P$ t: r3 P$ }) L. }" y# _  [; e0 L# s- t  _' I. c  Y1 Q
    三 、怎样实现描述文件————>一段程序& H% L) i  M7 v$ V0 x
    4 |0 X% c1 g8 c( M
    对象 映射(mapping) 数据库
    ; o' I. A& ]1 A4 O4 @
    9 i; [1 B" I3 M5 R! luser# h1 g+ b7 p4 |; }0 K- O: b+ J

    ( w' s6 d+ t% b6 v+ X! Y+ T7 zid=11
    $ w/ m% N( Q! L1 j* i+ M6 m
    6 d+ m1 Y& V& n1 a) `* ?* ename=”张三”———— > (1) —————> tbl_user(id,name,age,tel,address): |; [3 M7 Q* h& g; @
    4 o5 b# m% B& w
    age=25 <————(2) <————
    , s* S  P, p% K4 @6 P8 C1 e( p- A
    4 c0 j. S2 Z/ v( _ ' _$ S- y4 b& S* N2 p) B

    ) Q7 b5 h% u7 i$ h) ~(1)从对象映射到数据库
    8 r6 ^2 n7 d/ r' e* q: M5 P9 y' ?3 X) m
    1.JDBC
    9 T) d3 l1 v' r5 @6 h: e! K0 {' i3 O* k/ @$ M  ]# {$ d
    2.根据描述文件来动态拼接sql
    3 K& @- }: A3 j! \3 I4 t
    - r. G7 E; T" C3.执行,添加到数据库中
    2 r; |. H2 Q, g! e  t) I
    ! O5 V& ?' q' R1 B5 ~" Q
    6 d" ]% P* j$ F' b9 w+ d# a0 `" L( o) J9 ^
    (2)从数据库中映射到对象
    * h$ b4 b" J; H" H" k
    % ]! [  @9 E8 m% F: G1.JDBC
    4 C* Q" S8 j, f) A, o0 v9 ~$ C- a# Z( x2 l4 g
    2.拼接查询sql, i0 |. |! @" J7 F$ O
    , C8 G$ z. Q6 m1 ?  j
    3.ResultSet' S: o7 O1 D* F6 d$ E" D" D

    , n* I' l/ E: k4 e4.Model 3 h% y( X& G+ e! e

    + t7 |" Z  C" F$ W! j ( |( t; b5 a+ A( B& K% f# r

    " `% F  Q# M$ z- |hibernate
    : S% c/ z3 }! F* S. v- N开发流程:0 f8 N. c9 J( H+ G, d/ ~

    6 K2 z2 T$ p. o是什么?
    # I) q$ m9 b- Z) `/ nhibernate是一种基于orm 的轻量级的框架, Y  j- C" `( I. |

    1 M4 t, a( Y9 n
    # `) d9 V# k' y( N0 Z* J( X6 m
    ( g6 k4 o! {" ]; Z9 @, j! s有什么?( {4 d, }& `5 u# Q
    1. session 保持连接状态(依赖事务和连接池)
    - j; B  c# C" s! W% k/ |: @: O+ n+ n( J' Z
    2. Transaction事务
    % U4 \8 Y* y+ k! R  T# |# p0 n7 i; k% i7 ]4 z) O. P4 h4 m: D
    3.
    ' m+ j) x0 U, u5 iConnection Provider 连接池
    ( N/ w# g9 W  ^% a4 P4 f, f3 }, l* C/ Z+ D' ?$ R9 k
    9 W9 c0 M3 K3 s1 _* k# o
    & w  v$ D) v; O* y* G/ u
    能干什么?8 ]4 _/ U$ ?' `4 l% d
    1.orm$ \# q' i. Y! `2 x/ M, ^' Q

    # i1 s/ A, \% l2 X2.提供操作数据库的接口,简化数据持久化的编程任务. O/ u6 l! U4 Z) W7 [* l

    % N: t' J8 P* i- c9 t
    ! h0 U4 H% O% G* Z  s6 O* v, j2 K; o- _) L
    怎么做?, o* n* p# P5 S% w
    1.搭建hibernate的运行环境,将hibernate的包和hibernate所需要的包拷贝到lib 文件夹下
    ! W/ ]2 S0 ]" R5 X
      S7 l0 h/ s" t6 I5 V2.O(vo)
    : X( B9 P4 z) J, }. S+ t1 Q8 K
    7 G" _* r! Z. x) l. ?+ g3 l3.R (关系型数据库中的表)
    " P1 Q3 \8 T' L  N$ n% ~
    4 p. {( h7 P. v; A6 {4.配置文件
    5 I. G$ l* c7 C! g3 i
    3 x  s) ^! b, [* `% u" m4.1 cfg.xml 放在classes根目录下,默认名字为hibernate.cfg.xml1 a9 _, I" C# E  P

    . o9 T3 M* w$ O5 s2 Z6 ba.与数据库的连接
    ( @: F1 y) t, f3 C+ F! V" u. F" O0 H1 R* N; V* ]4 f* M
    b.可选配置. E  q5 W% w4 z: P- Z6 ?0 T

    / K1 K: d, w( x7 h* jc.映射资源的注册
    7 O3 G8 |2 B: M) E; x  \, C5 t4 \, g4 ?8 X7 W
    4.2 hbm.xml文件 名字与类名相同 并且与类放在一起
    ) ?. n" o% Z2 }: c* \
    9 k% S# y8 V) p8 x3 `) Z4 wa. 对象与数据库表之间的映射( Q4 [: r. b) d" c( p

    $ ^; U& N+ m2 v: L9 C+ N/ i# M! U: B* l. lb. 对象的属性与数据库表的字段之间的映射
    ' H* ?4 Q' x4 ^$ L: L: T
    & v' [  l1 h; p0 [  U1 o! ^& rc.组件之间的映射& b" ^  S$ y7 H8 m+ v1 V$ q
    1 l1 T5 T: _$ Z& w. a% C3 q
    d.对象与对象之间的关系映射
    9 s- ?# G; _+ ^* f2 z" G8 p
    1 l2 h  ]6 a3 B8 k+ v8 I9 I5、客户端
      s* p5 `7 W1 b( G2 v! v3 a' J9 C4 t8 x7 N) p% `
    1.得到SessionFactory
    7 h0 K# Q4 r1 U# Y* {8 C* D( [" s
    2.通过SessionFactory 工厂来创建Session实例; x: b$ O# w5 Z3 o4 b0 ^! O+ D
    8 y7 b1 S0 _1 {& q: v$ }) Y8 h
    3.打开事务
    7 L  \2 h1 J% F- ?  e) m; w" w( S+ v7 u; p4 R7 C  ~
    4.操作数据库
    # `- L- o! o$ T( g
    ! F. x) X, }6 K% r6 f# r7 C2 V5.事务提交
    * n5 ]3 W" q# ]3 s
    1 G. t( N' E  U- K7 @  [8 o( w6.关闭连接
    ( w  c8 ^9 u9 L/ X) N0 `3 `9 @$ r3 c/ Z2 V* X3 p- [# k1 r% q
    运行流程:# {1 c; Q3 x; b# M2 a
    0 b' `! X6 H) L8 m3 B3 @, f
    整体流程+ |2 A! T1 c: p( L# N, e6 |% ^
    1.通过configuration来读cfg.xml文件/ M1 G# L  Z: ]5 V7 E' ]
    " R& o. K0 s( W% X$ _9 K0 g- m
    2.得到SessionFactory 工厂(根据数据库的连接来创建sessionfactory)( z: B& a$ s3 B. \) a: b, `

    + ]: L9 s7 R9 ^1 Q: T+ m, P0 Y/ z3.通过SessionFactory 工厂来创建Session实例
    # D! z* w9 b6 d* g9 l
    & d  t( y3 p+ d% {3 `4.打开事务! t+ g8 ?" R5 s

    # v5 k( h. Z* P* K9 P6 Y; k5.通过session的api操作数据库5 v+ y8 K! t2 J0 l' R- A. s

    . G+ L9 u9 @0 `' _2 f/ Q6 p6.事务提交
    $ {1 P, N; ~' F/ m% q4 a0 _  U0 Z6 V
    / N# b+ g5 ^7 [; y! N7.关闭连接
    # ^& Y0 W# u" R7 z% g
    & i: \3 V$ C, g, p$ r $ H' m# |/ o! p7 g
    4 c5 c8 F$ n; k. y
    save
    ' j* f& L) n+ P% Z( F1.to—>po6 {6 f$ z% r; y: D7 o) L. l4 |
    ( g5 P" F! I# h( z& i
    2.根据model和cfg.xml中映射文件的注册来找到hbm.xml文件
    # @: O, o( r$ w  Q  I5 C. R; \$ X5 R( U" l' B8 m
    3.根据hbm.xml文件和model来动态的拼sql
    % p6 Z/ }$ C5 N! A5 k/ c/ k5 ^7 Q- N  C4 I
    4.客户端提交或者刷新内存
    ! s$ L5 b1 ^, i3 @
    + H/ T9 n. Q6 k' G# ?5.执行sql,值放到数据库, A2 A) W7 H; c% |& O9 h
    ! c/ n, ^/ _1 k' Z$ f

    ) J1 R- `" r% m- _6 w' t" U
    ) S: c, h2 @4 W# Fupdate、delete
    ! g& n, T& d- B& d% G8 n  z1.根据model 的id在内存hibernate的缓存中查找该对象/ L4 e' B2 o: g6 w, M7 V  F
    + i: F" x2 C) [! s" ?: u
    如果内存中没有就到数据库中查找来保证对象的存在
    % o6 v; ]/ H( g6 {8 H& J& N1 [* B9 T3 N9 d# P/ I
    2.根据model和cfg.xml文件中映射文件的注册来找到hbm.xml文件2 _$ h! v" A6 S- ]# y9 g

    3 H  M2 ^, e( ~# ]9 w3 H2 A) K$ U3.根据model和hbm.xml 文件来动态拼sql
    " D% P7 ]$ y0 i3 C" F
    * Q& _$ R* T9 l4.客户端提交或者刷新内存
    / E( I; i- [& C+ F& t0 b3 b1 P" t8 O- f2 G3 N/ g$ N
    5.执行sql
    + e3 e9 P4 U; E) S7 {8 M3 i/ d- L. |3 b+ v' i& B  j

    # Z2 Y$ [4 K3 Q1 p' H9 G9 A" |8 ~- H# f& b
    Query
    - k, A* F  q. O: b5 wload8 k( P& l) g& u) H
    6 h7 a/ Q8 T5 g. l
    1.根据model的类型来找到hbm.xml文件/ }- F- m, V- c2 G

    " k+ S) G% s9 P' h: \2.判断id对应的对象在缓存中是否存在,如果存在,就直接使用,如果不存在就进行下一步。
    4 B7 @5 R' |8 p0 p5 l. O8 |
      s: g( m3 U( J$ D- F3.用id做为查询条件来动态拼sql
    0 d9 g/ k( F6 T& M" y" {' s- L+ E6 w+ Q5 j8 f) l  d
    4.执行sql 查询(先在内存中查找,如果没有找到(会抛出例外),就去数据库中查找)
    ) B( {3 s" @, D$ \& V
    / i0 k" e& w+ I. m7 \: y5.返回一个model类型的对象0 t9 R- Q! [, T1 n( T+ t

    4 U1 l, m3 }( N7 q) Oget6 }2 |! t$ B4 h- y0 X

    " K0 ]: j% a6 W: y5 _( ^; |5 y    1.根据model的类型来找到hbm.xml文件- Z! a$ y# }' ?5 }

    ! D( Y4 c4 O! ^2 F  d* H7 }2.用id做为查询条件来动态拼sql
    4 N$ y( t$ w6 C4 M3 t: h" Z/ k# ^. s
    3.执行sql 直接在数据库中查找,如果没有查到就会返回null
    0 ]& b6 q9 n: n( Y# K0 U$ p
    " q6 R2 P( Z+ b; K! d) Pquery
    & K# K  H2 ~# Q7 c5 F' R
    8 t0 y; ]+ b1 W' _1.分析hql语句,得到model的类型1 D5 L3 F! _- Q$ ]; T
    . P& J: {) L" _! z' e
    2.根据moedel和cfg.xml文件中映射文件的注册找到hbm.xml文件+ @! n" `) j. Z

    + q9 ], q. q' D) F) N8 q3.根据model和hbm.xml文件来动态拼sql  Z, ]7 m: J' X, A  n, L0 j9 r! n- H8 u7 [
      R$ T# e/ U4 I& `  S# W) `- r
    4.执行sql查询数据库+ q. M# F# d$ q7 V5 {3 S
    / M4 I5 l0 c9 c
    5.返回一个resultset
    7 ~$ Y& u" {' {" _+ N8 k- Z4 ~! C8 v2 W, h9 M- G. a1 L' L! X$ ~
    6.循环resultset的值,放到model中在放到集合(List)中$ a" k& ~0 L" R9 V2 l

    9 ~, j8 V  }# ^; P4 D3 w' b8 h ) m1 b, `8 A0 P- I) v

    : e/ }; h9 I. S8 I4 I% |谈谈hibernate缓存机制
    * D, q, m$ S' c8 t
    * U- {9 I8 B( A- Q( C/ m. P缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了。打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去数据库中取,也省了很多事。+ J) A  L# }( ?, t% Z
    5 ^. H  P0 b% S9 O
    ; Q2 }/ n& l3 C# j; U) L

    & r) o% u  ~& b; V( ehibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。
    7 D* b, @& a- a6 W2 x
    , {4 _2 s/ S( \( \0 N4 L6 h+ I ! S3 v$ t4 Y. y; w' c- L

    % k) W* A+ B8 O. T- R& ^对一级缓存中的session事务进行数据的预存取,数据在各个session的上下文中存在(单例),当session关闭时,就是session.close( ),整个所有session范围内的数据全部清空;二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二级缓存只有一个区域 ,画个图比较容易理解。
    7 T" K: S- G, _. W) M$ e/ R& Q! }1 z1 N, D+ A; u& R) u% i% @( x

    . S! Z. _$ t: Q# W+ L  n3 C
    4 p* L: N" s0 y0 J| 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|
    0 _" `# I5 d) y
    ) l2 A7 Z4 m& P" @- J& l  B# K| | | |# f- p& R- V! o' v
    9 o( ]2 p" p. J" c* s4 Y- x' j( i
    | | | |5 A& x7 c5 m& j2 N& |
    # H) t+ X% H6 O+ E* s/ V
    —————————————————————————————————+ ]" B9 a! _/ a- D1 k% q
    * Y% q( H$ k3 P$ Q
    sessionFactroy级别的二级缓存
    2 U' P! Z# D/ a$ x# h' A6 z
    ! J! M& q7 w8 e+ v( Q; d" D——————————————————————————————————————-
    ! R0 J/ L1 q+ u1 v" o3 U* K0 `, n0 O  t) Z5 t
    |
    , ?/ \8 U; j; ^* B+ P: z+ k) j  e; W7 q; C$ [4 B
    |
    . D' z$ m+ J) N4 n$ G3 p) D7 P. Q# l" ]7 k
    |
    ( L( i7 K: L  R0 n  v% h/ Z3 P- ?0 U: E/ _$ o
    ——————————————————————————————————————5 v7 g; g- L- A# {) [
    5 L1 `, A) O; R
    DB& K0 S, y9 M  L  M5 b2 L; c: _

    & |' @0 ?" J( \—————————————————————————————————————–
    & V# Q7 t  t+ ], o: `- S6 N. r+ |% w8 m- ]6 [2 s
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    16#
    发表于 2014-12-03 12:48:12 |只看该作者
    Spring
    # |/ S% _9 d' }7 @1 ]% L
    • 是什么?% {2 Q( ?$ x; I/ X/ _# t

      : W* I  Y* R, y- @! w

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

    ( |. o' L( I1 w. N" u, d  ]$ V0 W
    • 有什么?  @" |# m. p4 V, U' y/ Y

      0 x5 }+ S4 M+ y2 b1 A2 T' h8 U! R
    % L0 f- k9 s& x& y: }

    每个包的功能:

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

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

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

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

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

    AOP :面向切面编成

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

    : a4 h8 R' S+ {+ v" [  E0 m/ H
    • 能干什么?
      & Q( f( Z& @/ r; b
      2 o- j7 a& P( G; Q& }

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


    ! i. Z" a# E. u) ^3 ^
    • 怎么用?
      ) B' o6 B8 u" u$ D: k3 t7 c

      & o$ b, `1 }& y! y- ^
      • 搭建web工程,引入spring的jar包7 V' E# a8 u1 Q% K
      • 在web.xml中添加如下配置
          J$ H/ {: n# Y6 M
        ' {4 v4 w6 ?" K7 H3 N
      , U6 x# W/ t$ j! R

      - F6 h& Y  V: O: K9 v6 `; X- F) d6 O

                contextConfigLocation9 d: G; b9 r& P7 n% t. E9 Q! w' a+ m1 J! ~

                classpath*:applicationContext*.xml6 N; }4 j# A0 ]+ s/ V. W$ V

        # T3 B6 c, _9 a# `

            
    * I: L& t5 x0 b9 Q

                struts2
    2 y3 s5 t7 m, Y% m! Z

                3 W$ U/ [$ d) J7 |4 }" ~

                    org.apache.struts2.dispatcher.FilterDispatcher' F2 ^' D9 u* o

                ! k: c5 ?) V% S. D* R

            
    , a8 _5 p) ^8 E! k8 h* i

            7 d/ q4 B8 C/ ]

                struts22 Q0 g$ x4 z& ^9 ]6 y( z

                /*
    8 B( g! `& e1 \- C2 \3 _


    1 J: [- z- a0 G: e+ N/ `. ~

    % n; y9 g/ Z5 }2 c# T" d  e

                + f5 e7 |/ \4 ~

                    org.springframework.web.context.ContextLoaderListener
    0 w- M1 Z# z4 T4 W+ t. ]3 y& x

                + ^4 W7 A* _! L- v* v

            

    • 部署) r. p0 n) Y0 G! o$ o

      , y. ~* K+ V9 I1 B0 K6 \+ p
    9 h* p- v% D, x( r/ u0 b6 P7 m) e

    - t* b" p5 z5 K" y8 M
    0 D4 S2 P) i  [9 b; u0 N4 y
    • 容器和bean
      - ?  U  H+ N, ?$ u; }/ D9 M

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

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

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

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

    ' K; |* i/ e" l
    • IOC控制反转
      5 V9 }! k7 g" Q( z5 P) v: n6 `0 D5 n
      " X4 b& U* f# r( S1 ]( ~; ]

      - L% F: F: T9 l; o* x. x
      从前的应用程序想要得到A的实例他会直接主动的去拿,当用了sping后,应用程序由主动的去取变成被动的等待,由spring来控制应用程序所需要的对象

      ( V; K- V+ I% i* k1 @0 [
      • IOC的优点
        * s+ k5 D2 `% e5 M  O/ u$ a
      1.可以通过IOC来获得实例
      2.可以通过DI来获取注入的资源
      • 配置IOC的原则6 t% U0 K/ d' m5 F# y
        • 一定是可变的资源才采用依赖注入
        • 一定是层间的接口或者是模块之间的相互调用才采用依赖注入  k+ \9 Z: z4 {2 D9 n$ O$ e# [9 I
    " X7 B) ^( Z; M; p- n
    • DI依赖注入/ j: J+ j6 ~6 V) \( A4 U

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

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

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

    例如:

    在配置文件中

    2 S# O! y9 T+ f; x7 x
    ' j5 l+ D/ o, v, d7 H# _" ^
    " y$ \2 Y# Q6 Y5 [& J* g

    在应用程序中

    Public DBDAO dao ;

    Public void setDao(DBDAO dao){

    This.dao = dao;

    }

    3.构造器注入


    9 }) W, E- s  Q4 h

    4.ref 表示参照其它的bean

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

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

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

    6.lookup注入

    7.singleton

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

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

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

    8.DI的优点:

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

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


    4 W; S. y( R3 S0 l, e/ M
    • Aop面向切面编程* f" Q& I$ {7 X' A

      0 u7 N. `; ^' @& o

    1.AOP面向切面编程 一些较好的模式或者是示例—-范式5 {) m7 n/ ~- D1 N

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

    2.AOP的思想: 主动—->被动(追加功能)2 q3 }* J7 p7 [1 ^) g1 }

    3.AOP 的概念9 @9 Z3 i4 T+ w; W- K& T

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

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

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

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

    5.引入 :扩展的功能

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

    7.aop代理 :实现机制

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

    4.AOP的事件机制0 ?8 F* v0 m2 C* ]

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

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

    3.找到切入点

    4.确定连接点

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

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


    / R1 |# a" w7 ~! |3 U
    1 W$ t7 |6 O! Y
    $ h* a1 I/ h5 X) B4 Z! `7 _9 B  p) U: b- b* q  K

    7 y( I( Q# l0 L! o! f# x3 ~
    1 `& h) e( l; N4 g3 X0 G3 s0 {7 [1 ~# C/ g+ ^  C

    5. AspectJ0 P  f0 i  v3 X* \

    5.1.在xml中配置比较烦琐
    : b& j0 B% @! f3 F6 j' i0 O9 M) h

    所有的入口必须从一个代理(ProxyFactoryBean)开始
    ( }6 i" J9 m" e2 I


    % V; c7 G" `* ?$ C. N7 M $ l6 I3 l4 p  T4 S; m

             
    0 l7 |/ F+ ]/ ?( k6 v) U
    ; L1 m7 L) Q4 u) l* R) m1 v& P7 _
    & H( [+ |7 Z1 |# {1 x2 a2 o% {         
    ) ^4 w7 _, |& S: i' w

            
    - `1 O% e! z& M9 Z9 c. K) N* q

            


    + D$ _: V5 V; E) \" k) X3 jexpression=“execution(* com.javakc.aop.MyTarget.t*())”/>% G$ J) y) E/ @5 u; V+ Y' i

            
    # p) i* b8 o. G: v& L+ h

            
    6 r, B+ p( T6 E4 A5 l  t0 a

       
    7 L5 A$ j6 a- [1 v, U4 m1 D

    $ {3 c# v8 L% d9 T* [" m
      ?% J: l* m3 N8 I

    5.3.使用注解的方法相对简单& g. N' v$ o. V4 [" y$ }3 F; [

    @AspectJ的基本语法
    0 [/ X  c  A' F6 V6 y' u) B

    1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面
    4 \: q6 a/ p7 ~# y

    直接在类上定义@Aspect/ r) O8 [5 C, W% ]6 M

    2.@Pointcut声明切入点
    " a# Y9 e- g" Y$ Z& C/ w3 N: V

    2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字- ]6 U3 u9 @; M' D7 h

    2.2、可以使用匿名的pointcut
    * E& Q4 P8 ^/ z8 }4 f5 F5 g6 w

    2.3、执行切点的几种方法
    ' g- X. G; b/ Q' r! }0 Y- t+ m% O& ^

    2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法5 a4 v3 P) q0 W* L- l

    2.3.2 within 指定到包,不能指定到类
    . L! l& M% Z! H3 ^$ v  |

    within(”com.javakc.spring..*”)
    ' l; K. m, x% s% S( v" c4 ^6 ^

    2.3.3 this 指定到实现接口的所有的实现类' Z; E# S# c9 ?0 ]

    2.3.4 target 指定具体的实现类
    + N' X8 v. p( P. V* a8 {7 F

    5.4.advice的五种类型的示例
    " D2 U# f3 U0 G! D4 X3 S! o

        客户端必须从接口走才能得到监控,实现想要追加的功能
    ( U9 S- P4 {- x: b4 Y; ]1 N; F. z

    5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)
    ' f/ w6 _# {- _7 y& t

    追加的方法的参数名字一定要与retrning的名字相同! ?; E4 `+ g9 k* }( x

    在注解@AfterReturning中必须加上pointcut和returning两个参数
    ( Y: G2 k) o' N! l/ \0 A. E" e

    pointcut指所要监控的目标对象的方法
    - l; f6 P* x# j7 _" ?, q

    得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配
    # z# j+ |, j( U: c

    完成追加的功能
    0 i( q8 a1 T+ N5 x' N* s2 w; Q* p; D

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    0 c* t0 M8 D3 `% R2 o6 V8 Q

    (1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)
    2 b5 \9 \. a. @  E! \- x1 j% Q2 m& b

    (2).
    8 u, u2 o- v$ p1 w+ S3 f$ z6 J4 r

         2.直接引用匿名的pointcut# u- L1 x% u3 Z9 l

         (1).@AfterReturning(“execution(
    % T$ q, B2 o7 j0 l4 Q' Y9 G% k

    * com.javakc.spring.schemaaop.Api.test4())”)- E8 K9 M4 Y5 W4 g! f8 p7 C

         (2).@AfterReturning(pointcut=; }6 W3 z! g$ y" s7 t1 c3 k; R

    “com.javakc.spring.schemaaop.TestPointcut.t4() &&
    7 k7 K; G3 ~6 A9 g1 J4 R

    args(str)”, returning=”retVal”)& |. D: Y+ L' S  c1 {

    @AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)* }4 [( F% M* C' R2 f4 A

    public void testAfterReturning(String str,Object retVal){
    ) M1 k9 Q2 Z, P8 r

        System.out.println(“afterReturning1=>”+retVal+”=>”+str);
    3 ~8 N& u+ Q2 e# |* y4 s9 B

        }5 h2 r# \- K; ]0 m: S7 U' s

    5.4.2.@Aronud5 T1 m6 f% p5 ~7 X  b

         注解@Around环绕追加功能;* Q7 s9 i" v4 w  G' `

         在执行目标对象的方法的前、后追加功能;
    ( B/ i0 r8 M, K  G

         必须有参数;第一个参数的类型必须为ProceedingJoinPoint;: q' h9 r% b( S$ O- Y

         通过ProceedingJoinPoint的实例的proceed来调用所监控的8 G6 r' L. g$ P/ H* q# h

    目标对象的方法( o9 l6 t3 `. Y7 ]

         1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    7 S! q. M- X5 l* H4 f

         (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    + G) I  h$ L: v3 I, a  A3 u

         (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()& ^( m% V7 k  s" a# K. j

    && args(str)”)
    7 M" a8 a) d' L" w. |

    2.直接引用匿名的pointcut* p3 v' c- n, x8 o

         (1).@Around(“execution(
    & ]' V' K- j; K+ s% T4 Y

    * com.javakc.spring.schemaaop.Api.test1())”)7 s: h0 i# i  I1 B: w0 ?) `, Z0 r; ^

         (2).@Around(“execution(- ^- N% y; t4 J! }% c6 @1 Z

    * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)9 K+ L- ~) Q# w( o$ P

    // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    4 F& Z, e8 r% n" [8 O, ~9 w3 i

         @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    : q- a( w7 n0 a  Y5 D. W

    public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{- Z4 ^+ Z. P: }; g) D% ~' H' [

        System.out.println(“around1==========before1pointcut==>”+str)" G) i% ]2 g/ F( _

            Object obj = prj.proceed();- h$ n+ {$ d! u' R" ~

            System.out.println(“around1==========after1pointcut==>”+str);
    9 W" b1 @7 Y+ ^0 I7 D# t

        }- I# A: ~) v. W% ?) S$ w1 v

    5.4.3.@Before- @0 k) T- K; t: o4 a! T

    注解@Before在执行目标对象的方法前追加相应的功能
    0 J: A6 y3 i( A5 T

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    , `1 j6 D. d4 o7 t, P" I; [+ v

    (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)+ G! y7 r& u+ s

    (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”). T+ b0 f  y; b- u2 r

    注意args后的名称与参数名相同
    ! y% B* @9 W+ H) x1 H. Z

    2.直接引用匿名的pointcut
    & L: [8 H, X) v2 O" t8 w- u/ f6 t

    (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
    . C2 q+ l' I& Z7 z4 u, N9 o8 [

    (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    7 E( C9 F4 `% \* G  Y

    注意args后的名称与参数名相同
    ' Z) P& ~% j9 {; q

    // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
      i0 V' B  O, h' X+ S# Z; F% p- z

    @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”). B! z4 ]7 u; n: a; L/ W

    public void testBeforeParam(String str){
    ' r1 I) q6 v) k4 n

        System.out.println(“before1=param=>”+str);" v" r4 Z" X$ h) P- q7 S; t7 H

    }
    ! P: N  N( ^6 q* J" ?

    ! R  m1 x( b; b! l

    5.4.4.@After
    ! p& Q' S4 b  G4 s% }- T0 D  N

    注解@After在执行目标对象的方法后追加相应的功能
    6 k! l/ b5 W' Y, {

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    0 o. Z: h7 @, Z  x+ U$ P

         (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    - `: d8 w, F* w( r9 x

         2.直接引用匿名的pointcut6 e' \) d' L4 C3 R' S# @

         (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)& Q+ B; o" F" W) Y7 N  d' |. g% X

    @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)% U0 B: C4 _* t1 l$ r

        public void testAfter(){0 r5 g6 {8 q$ w2 U4 {6 L6 u

        System.out.println(“after1== >pointcut”);
    0 U( L. \' i! z7 @. [  I

        }2 g7 ^. ]; l# m3 i/ ^, l& c" P. o

    5.4.5.@AfterThorwing$ C' p8 x; X9 X* f& b' |

    ( [$ E$ \3 ~% S8 G
    ) b) v4 q" z  L3 ?, ?
    • 描述一下spring中BeanFactory和ApplicationContext的差别0 N( i" M$ n* G8 F3 v% `. f
      $ L- j! Y) @, @3 U5 Q

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


    + u# o, S. n& M) o" `
    • 谈谈spring对DAO的支持0 ]8 m2 {' \1 a1 s
      ' f  C4 n* h4 b

    Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。" i# J7 E# N+ j% q5 q9 ^/ N

    简化 DAO 组件的开发。
    ; i7 C- @$ g  ^Spring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。* j/ X7 R$ N6 A; s  W1 A2 t. E

    IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。  j! K6 i( A. i% ?2 s! [2 [6 z

    面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。
    ( A" I7 g. u7 ]

    方便的事务管理: Spring的声明式事务管理力度是方法级。
    + n8 W# O: E8 p2 Q

    异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。2 o* l! v6 o" x) c, K


    + U. w- ^9 m# F( f4 C0 b4 ]$ N5 r. j2 ~) d
    • 谈谈spring对hibernate的支持. i& _4 s5 q4 U5 N5 e! d

      ! V+ M0 ~! Z# m

    在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。0 U2 m2 T- ?8 V8 g$ Z( U

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

    1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:( h2 i4 n; W$ J! Z4 p


    4 [: ]9 Z- Q7 m4 _

            class=“org.apache.commons.dbcp.BasicDataSource”>
    ; F& Y3 e$ d7 f% Y6 k1 F: q4 w

            3 U: C) S$ Z+ j, l$ F

                oracle.jdbc.driver.OracleDriver! C5 J  H3 \" a( S& t# Z! u

            9 V, ^& c& T8 D% r% J+ ^2 x

            & ]* ^9 Z. `7 N/ @

                jdbcracle:thinlocalhost:1521rcl/ {% @  q; Y8 J* L; m! W' p

            8 h9 O+ V) G9 Y8 O! ^

            , x6 u0 ^, y! f- j/ F# Z

                javakc2
    ) D" h1 G7 C- @$ k7 Q* @

              r& \1 N% P( Z

            5 u. G, X/ a4 M2 _6 j

                javakc2. Q7 ^% x6 d2 O9 I4 Z% h* t  }9 ^

            
    ' M5 t/ a$ R+ i" B6 O

       
    $ k( r4 O) G! R. |

    & p+ w8 D9 Y7 U9 w% n

       

            class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>' T; Y# ]4 j( _( g6 s

            
    # `( `' Z) h  ~% N7 \6 B* \: p

            
    " B  z$ L$ f" w0 m. d6 p

                5 L6 o( _( U, ?! b1 c' f+ D

                    com/javakc/spring/h3/UserModel.hbm.xml) r6 y$ H+ q9 J# d

                
    6 T' f4 M6 U7 i4 Q. Q1 e7 J

            3 T/ `  v) u2 E' r9 y+ l

            - V" v: o6 n* s4 X

                
    8 U% o' Q" W3 k' r7 @! n" Y0 n5 }

                    hibernate.dialect=org.hibernate.dialect.OracleDialect- @- U4 T! F) a. r/ E. U8 N

                4 v0 p9 B7 @3 @4 ~

            9 `5 H+ v7 S: E# t

        9 e, Y* k# l7 D' n

        8 m. J" N) e7 J

            ; f+ }" d5 M# P6 B$ W# m

        ! k. s) F+ T2 ]* t

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

       

            class=“org.springframework.jndi.JndiObjectFactoryBean”>1 w& W6 H: x* F

            
    . c' A% l, j+ B

                java:comp/env/jdbc/myds# L+ N3 h/ G7 r7 V% i% J+ r( V8 T

            
    ) N. p8 A- e3 \9 |7 v5 t

       

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

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

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

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

        7 _  p( E) o5 U; B6 ^0 _* R& C

            
    : m0 Q; j: e! d6 ~  @1 ^) P- t

       
    0 t* b  ~2 z; g

    2 @) f6 H4 P" o1 K4 A

        ) z6 v% K# U& s8 T

            2 i3 }" ~# z+ F0 v6 m: a: V

                
    ; r4 m' ]- b3 t7 @3 K

            
    % t2 }# R& q( l* s

       
    & I5 e# ], u$ S" W


    % g) Q- P4 m9 Q- d: D

       
    / S6 t' _4 D% D; W

            
    - u) z7 l4 X/ l3 |, {+ g" B

            
    , ?; ]' e' T; G& [9 S% z- r. o! R

       
    ) i# o4 ]2 \  T1 c2 t% o/ x

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


    ; _; v: F0 P0 C1 k5 K1 m/ v! Y
    Spring2.0之前事务的写法9 q# X0 q5 Q& T( g8 j

    % m! h7 Y, T$ u. }. q* G# L
    % Z$ O  u8 ?6 Z; V4 u2 Q0 R# |- B+ y        class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”- ]+ E8 j% N9 e8 [* N: ~  H
    * g* w; I- ?; n
            abstract=”true”>1 n& l9 l3 O( C8 V9 _
    * N7 ?9 D8 _7 E% I
    . b2 C: [  L0 ]8 H# s5 l

    4 s2 E6 o0 Q& D7 X7 o
    & N- m- g% N: u( f& a6 H                PROPAGATION_REQUIRED,readOnly) V& c8 ?2 Y" d6 A) U1 ]
    1 z/ o% \/ a( t+ E
                    PROPAGATION_REQUIRED. x& X) {- ?5 H" X
    8 u: o6 D" P) a6 I' G+ ~: K
    # h' m% Y+ f5 M$ ~$ `  ]1 V

    , V* _' z) O* f! Z  |; }3 ]  A
    . f' k% }1 _8 {* e7 ^* W% Q

    " i# d5 k3 }; Y+ n& T; u2 Y5 s( y1 M% \# r$ B) {5 K5 y
    • 谈谈Spring对事务的支持
      # \0 D) z* J. X" A% g4 n
      + L- i+ x8 D% {  u3 n7 T( }) G


    0 p# c  |) e6 V8 E1 j. u1、声明式事务管理:

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

    2.做法:

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

    2.2

    2.3 注入数据源

    - Q4 z& N2 M) [+ i

    . N9 H! e# k- G6 f- a; f9 y5 h, k' l
    9 b( m: \% h! ?$ d  A# T

    . y; Z$ l5 \4 r1 s1 ^  r" F$ J

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

    : c9 i7 {7 @* L; \- k4 X- z5 L
    * b0 H* |9 f; C" y; `* t$ `

    ( u1 I9 J4 M, k* R) \; D: }- q( v

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

    3 h% W1 R) Q, R3 g: w9 u. p
    ; u  V8 p& b) L. H! V' L- j- k& A
    $ n' S- {; a; H  b; R  G) B8 T: r

    + R  N7 ?( v+ J' W0 V( N$ |
    $ j# J1 G& z, S

    2.6 定义切入点

    ( c) w. e/ }3 A) E
    1 M' k  D' U% g# n$ y1 K( J) g
    ; d8 h  K. o( s8 _, x; X  F4 l; {, Y% Q

    & `7 r1 @/ Y5 K2 A+ f) K* l
    ! b* p# d- M9 I9 g& |5 m

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

    1.注解@Transcational

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

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

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


    7 w/ @- |" ?- h* ]+ |. p4 y7 G5 x/ Z- ^. R! p- c6 c$ w3 W& o  n

    如何在Spring中使用Hibernate的事务:7 }2 @3 ~/ _% Y5 h

    1 ^- z2 \6 a( R4 Q1 V9 @


    . O7 i2 I& G2 a. [$ n9 O$ f! w


    4 X) ^  t+ K. l% j: @0 S

    如何在Spring中使用JTA的事务:
    ; R% @% h1 b  Y) l


    % v" [/ x2 a* w* F
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    17#
    发表于 2014-12-03 12:48:32 |只看该作者
    事务
    ; A  X. }. ~4 N5 p% XACID
    ' t( ?  b" ~! @  k& ^& g3 R(1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失败
    4 f9 m4 R* e+ g* I0 a
    7 u1 q" `+ x5 E- q) S/ w(2)一致性 :操作的前后满足同样的规则,保持平衡。; @( H5 V- e2 e/ |/ F1 H
    $ Y6 `- c6 h, z* D9 O) Y2 \
    (3)隔离性 :在事务运行的过程中。事务内的数据对外的可见性和可操作性(必需由数据库的支持)9 M4 @  v2 e/ V; \; N  O
    $ {7 \" F" D" a  C/ v! a! [
    (4)稳定性 :保证数据在事务的操作的过程中不会遭到破坏,而且是永久性存储的6 a: e: y# R8 ?2 u5 m# ~

    ' G) X( e; c6 T) f
    * \$ Q/ _* I8 J8 ^* p0 |7 X6 E
    + ^7 @) |( t, X' I! H+ g事务模型% C5 @) ^0 T3 A
    (1)经典事务模型又叫平面事务模型(JDBC) 事务不允许嵌套
    ! V, W" h% B/ C0 ?
    % j7 Q# X5 O# e& P(2)嵌套事务模型+ G5 x5 z) B0 W# I4 h: k

    4 v; o& @7 I. i2 m% [( |) J' v7 y
    # F! l% X# F/ T4 b4 b- T. c% F$ a6 }/ z+ S/ R8 O! T8 Y4 b
    事务的两种方式
    9 F- H1 A  E3 \* b1 ~(1)声明式
    0 e" O' Y9 e  A7 p6 R' Z# M7 \& D4 x# V; l6 T' x+ k* O1 g) r
    在配置文件中设置以下6项
    ; t  ^' b8 E  x* B/ V; T5 a, ]4 A
    (1).required4 Z+ w% b4 ?8 b3 M: U$ z
      {, O: o8 Q9 O1 ?$ h; Q4 J3 [
    如果客户端没有事务 在bean中新起一个事务
    % C. ]9 K" C' ^3 v2 n" m
    ! A5 A2 v- d$ c$ j如果客户端有事务bean 中就加进去
    5 t7 u$ s! O/ M' \) S1 A9 \& Y0 K0 _( k# Z
    (2)、 requiresNew& k  m: p/ @! ]8 y! T( ]
    9 ~1 O* W8 _; ?6 I6 G
    不管客户端有没有事务服务器段都新起一个事务/ u% K$ J, W* o0 Y/ y
    ) Y7 P& t5 i: H
    如果客户端有事务就将事务挂起
      @8 D" H% W; K0 `9 I8 U9 n
    ; ~+ g5 z9 o  I( _+ S  `" u0 l(3)、supports6 i8 {3 x6 A: M# O
    2 L  C. a- K3 j' T6 W% Y$ G3 C- c
    如果客户端没有事务服务端也没有事务
    $ s2 {5 u) C2 ^% P2 }% ~# @1 F* S" P; p
    如果客户端有事务服务端就加一个事务
    ' B( F5 D2 C" G0 k
    3 J$ L7 b8 }+ @0 H9 z! g6 J# B- O(4)、mandatcry2 V: x) z& ?( S

    9 ?; T: D1 n# o; ~如果客户端没有事务服务端就会报错
    : g+ K! t  q1 ~% V8 k2 V- i/ _. M- y5 Z3 p
    如果客户端有事务服务端就加事务
    2 N3 v7 Y1 L6 h5 u) n9 J
    % v) ]9 ~5 ~  {; j7 A(5)、notSupported
    0 N4 E" X5 p/ s2 m& P3 g6 e3 }7 ~4 E9 ]7 A+ j9 p( |4 ~  ?/ x
    不管客户端有没有事务服务端都没有事务
    + E) }+ h) j6 A( R% I$ e* z1 R; _$ L1 m
    如果客户端有事务服务端就挂起
    7 E0 U4 g' e. ^8 `' s5 s( [- v- _# A1 B3 f: L7 q# l
    (6)、never
    % e3 p; K' c* J0 s* v5 }
    % s0 J6 P3 Y! n5 v. P不管客户端有没有事务服务端都没有事务& R! ~' f3 C4 r

    , L$ a+ c# t8 l# S如果客户端有事务就报错0 J' s) F- G1 Y- F7 u! h  ^5 \" h/ X

    * N, V! d3 w5 {' v. h+ d(2)编程式事务
    " @1 x5 }( ^4 T- A) {! o
    & {0 Z* \3 `- z. _' GJavax.transaction.UserTranscation
    # a( q# S% o" }( O6 W8 r
    # _" ^1 T: {3 D( u8 cJTA 事务可以精确到事务的开始和结束
    ; L; U; P# V- T& B- y; x+ }" C5 A& Y! d; r+ e- E; M' w

    1 h4 Y* m0 J! Q: K/ b1 A0 W: y. w2 q# p1 _" C5 p7 J6 A
    事务的隔离性) g! g" e( Y0 K  N4 a0 N
    Read-uncommited
    2 p- `4 n; E9 B
    # l% u& \+ a$ `读取未提交的数据(基本上没有锁)脏读,存在不当读取的问题。
    3 n8 |+ g* G- O5 ]. ~& u, J9 v( R" a- G* ?/ r
    Read-commited* t5 e7 j; _2 C/ F. E& w
    1 Q3 {! K7 a. g/ D& L
    读取已提交的数据(行级锁)
    0 n! \3 w4 A6 R5 E5 u* b" g; ~+ C  u
    无法读取已经写入,但没有被提交的数据。4 h* }5 E8 T( ~! H+ {
    8 T. W, a( u6 Z
    Repeatable_read3 O5 Q, l1 j  e" c  E

    8 p1 d4 l0 ~& n" A& \5 x读取的数据不允许修改或删除) c* e1 W3 A9 a8 `- G7 |! a! F& q
    / K8 \* b/ ]5 ]
    不可重复读(行级锁+不允许修改/删除)8 Q  ?8 _$ B  D
    6 o$ @; V9 V" h( o
    Serializable
    . j  z$ z! n& ~+ H
    9 h3 |) o* Y+ F8 w7 I$ t' r+ G幻影读(表级锁)
    " W6 m: u% |5 E! `2 Y* t$ k0 p+ h2 v: y
    - c, Q+ [  E8 [+ k+ m

    ' `8 ?) ]7 ]' Vstruts1 o: v% k6 H2 [$ M% Z- u4 W  @& l! D
    开发流程
    2 `4 q4 N1 w0 q. ]3 I) u. x
    6 f6 v1 N; Y* ?! B' ]( c1、创建表单
    7 t0 o7 y3 h% O8 s; {8 D( }) }: d; d9 ?6 ~% C
    2、从表单中获得输入' \1 ], y5 r7 X% I0 n  U; Q
    ! \" F6 c' d' c* k' V  u& T  d: ]
    3、处理输入(业务逻辑)
    + p( C+ z; H- O
    % B3 s3 v* O) M& A, u# A8 H- e4、根据动态输入改变输入流
    ' v( s0 N- O% D& X8 h
    % D  @  x6 B7 v6 D; l1 J要完成上述四步,我们需要创建, K- S: _: U. A

    / U& {+ x9 d4 a1、一个ActionForm
    / R& ]1 [; F1 f1 y. H0 U1 O% T' [  T1 h' D6 ?! \) w
    2、一个action( O# o3 I% j! E) p

    " M: A* }+ [, U- z; A3、一个配置文件struts-config.xml. e. B3 z; F  d; W+ y1 c

    % D: z) f9 o& T8 V' E3 s4、创建页面2 N- h; o2 j& N  h' _" D
    / F) x+ }% V' j* y9 n4 b
    创建ActionForm9 D2 f: B. w" }* I* B8 P. \3 F

    3 c3 J  c: s* U1、写一个类继承ActionForm
    2 T) E8 a$ E. L5 ~% p1 b' z5 T! w
    & i$ j- |' M! {  Q: `/ T& V% V/ X& i2、私有的属性
    - z* B5 D' H0 Z) k3 k9 h& Z* N* o' x0 D  K: |' n1 ?. |
    3、相应的get、set方法
    . [. H/ l$ S/ W# l  h% o
    4 w% i1 T" W0 Y( c- y) n4、重写tostring、equals、hashcode三个方法
    5 G. z# i8 ]- d$ }& h9 T6 T8 S) N) S3 L2 M- W
    创建action
    7 M. w8 A  z* ?$ W" x
    ! J, z" T  {9 d  e+ J1、写一个类继承Action
    ! z5 D. u: @1 M, ]# [* F0 c3 m) h' Y$ `- W. r0 k- J
    2、实现一个公有的方法(回调方法)* u: e" r+ o+ E# V
    ; {/ {4 Z# D- w3 W+ {
    public ActionForward execute(ActionMapping mapping,) f3 P( j% ~$ D. D
    * N& d& h8 a* {' p
    ActionForm form,
    " U. \! x! v1 u- ]) A- L) @& f4 Z+ P+ z
    HttpServletRequest request,. N* J2 `% F: S4 y3 n0 {: b9 w3 }
    7 y# U2 E, B6 N+ i
    HttpServletResponse response)
    ; }7 E8 m7 O: J; e- R! u
    / v% n8 M" J" |{8 w& X$ z, k, C$ w! J
    / J3 R7 r8 V7 O. l
    //1.收集参数
    / Y6 v$ W; s+ A& q
    4 [: J5 n6 L5 T: A8 _2 q1 RMyActionForm myForm = (MyActionForm)form;
    9 h7 W) Z; v  l4 \# C3 b- T5 Q3 Z9 p$ w6 ^5 ?
    //2.组织参数% m& z; s/ p, `2 k7 j
    & H  f: b0 x* I1 w6 d
    6 l7 Y4 u" g" p4 p3 A9 I
    1 D' q( E- Q# m0 I) ?3 l# y
    //3.调用逻辑层7 o5 _, _2 I7 z6 h. d

    6 W/ F; l$ I4 P$ Xboolean flag = true;
    " H/ P" I; U; `( R/ q( q0 C
    3 a' j) c7 D1 Z4 R5 r//4.根据返回值来跳转到相应的页面% u3 j& Q: l4 M: U: B

    2 l) F1 G3 D% U! V. \& J; KActionForward af = new ActionForward();! t$ ?6 e3 L6 c' T! t. l7 F! l3 @- |

    - p- h( K1 |) F8 N" `3 x1 bif(flag){% i, n5 x2 Z# d& b" F
    & \; g8 h6 l4 Y/ _1 r; k6 f
    af = mapping.findForward(“1″);" W' C$ ^+ \- s

    / \7 `- l, `0 v' r& j6 R! ^}else{5 ?/ t8 _8 ?8 j, z
    8 v) q* i* U, k6 M& |
    af = mapping.findForward(“2″);: @" p% D3 ~& f0 V$ j7 a  f  |

    ! x0 G& J: T+ J. ]7 w# h- O# o}$ G3 |$ b! n0 J" T# v# }' j; \

    ' I" Q* J/ ?- g( [9 `" e& nreturn af;: y7 `$ ]5 \; {1 V8 {
    " H: A$ ?* p9 ~% k1 ^
    }
    ! M* f6 u. q( x8 ?& j1 L  ~6 i0 R; j+ Y2 y5 T. @
    配置struts-config.xml文件
    ! ?( L3 ~! b6 l( g' [
    8 y( U6 @2 f$ w) D1.<form-beans>
    5 P5 S! {( D# Z3 W/ _
    . P8 x* ^! a: P; _1 v) E+ P/ W. Y<form-bean name=”myActionForm” type=”全路径.MyActionForm”/>
    - f. v. X9 x  U: T) J8 g; n( I0 e; v5 P( y1 B
    <form-bean />
    & T' [3 Z; Y! I  [8 A
    : G/ s' C+ |& n3 U" Q  d- w* v7 Z2 c</form-beans>! d* v% D0 x# y/ q
    ( i% _5 R$ R, w; d3 D' Q
    2.<action-mappings>
    6 A6 Z6 p7 C  S  s+ A4 `& {0 b+ W6 @( `
    <action path=”/sll”
    - e- @+ e( U; q
    . M* ?) l2 ~4 i* Y; f: fname=”myActionForm”4 _9 M, L% P9 ]: h0 s

    7 C' i* c- c; S- f# H7 L% [2 Vtype=”全路径.MyAction”
    4 L# M( i1 ?7 u' N% Y& H% e/ P0 y3 ?) L
    scope=”session”; q2 {3 f2 |1 ?3 ]' u$ S

    4 K4 `' `9 d5 d4 R5 |: Binput=”错误返回的页面”>. ~/ L' M# D( V& O: `
    4 E" o1 P  O  ~: z# L
    <forward name=”1″ path=”/1.jsp”>
    ) L1 X4 l3 |/ c6 A- I% H$ P6 m5 u$ u; t- c' g2 S$ \
    <forward name=”2″ path=”/2.jsp”>5 u6 t/ A% C5 D
    * I3 E/ S3 ~) r7 U6 E6 C) g
    </action>
    9 I8 \$ z& H  D2 [% k) i
    ' H2 e  ^$ d# u  r5 u$ f) M6 ^" u</action-mappings>; @: z) x# _) @9 `" S! x* g! `
    3 |) B! z( B4 ^8 o
    步骤:, {; {! o  L% s" h' x8 z. X

    - k0 a6 o! _1 G" I: O$ T. ?1.创建一个空的web应用
    $ B( U& q+ [+ k/ q# y% K
    5 Z+ S) I. q" N0 k, w2.将struts的包放到lib文件夹下
    $ M0 W3 c+ I( k
    - j$ ]8 P! U, r( s$ b6 o% I3.将.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目录下; k$ x/ K; Y8 \4 m" a

    ) A5 V# {$ x5 W" i- }+ \- k8 X4.配置struts-config.xml文件和web.xml文件6 S0 q3 [" x- t
    2 x" @% ]( d0 {0 W- l" Z9 I
    5.在页面引入tag文件uri+ z8 T& o& C" C1 e9 S

    9 d  W) F" L/ Q4 E3 bSTRUTS运行机制
    - s* E1 u& y3 Y- L$ g) G4 e2 Q; k. |3 S) ]5 l; K' o
    1、界面点击产生请求
    3 Q/ y# N1 z2 V' ~  e; V6 x/ O6 B& G- O, {" G2 ?
    2、容器接到请求
    + ^. V3 e! J$ k2 d+ ?" l' o. X* y- y# y
    3、匹配web.xml文件中的*.do来调用ActionServlet
    / T6 A& F# @2 a/ o% p! G
    ( \4 ^4 L7 n5 J. }# b' @4、ActionServlet的处理
    0 L8 G$ x; a+ }, m
    + e8 l: r: y! y! o6 W8 i4.1 读struts-congfig.xml文件形成ActionMapping! v* U, I" c( ?* h, s& v. D
    8 b% m; g& P( P% T6 S+ v% k* g
    4.2 通过path 来匹配Action类,通过Action的name属性来匹配ActionForm类: b' i& u; n4 h2 g2 ~6 g4 K1 Q

    5 b7 w+ d, U) P8 s+ ^& s/ \4.3 通过反射机制来给Form添数据
    & R: w) g( Z! ~, G4 y2 q9 w9 h+ R- e+ d
    4.4 由ActionServlet转调Action的execute方法2 m% C& s) Y% f) W8 G% s/ V
    9 O. ]2 K+ t% j- k% J/ N
    4.5 得到execute方法的返回值,跳转页面2 L+ G/ v7 |* E
    3 s/ h6 l0 B/ J0 _3 \
    4.5.1 RequestDispatcher7 e/ K" E5 E7 ], m0 P
    , u/ D2 C) A' j, ?: C# U
    4.5.2 response.sendRedirect(“list.jsp”);
    5 R( `5 t  J, O; N
    + U& }% H4 g9 e4 ^9 o 5 s) ]5 R4 I0 t/ g% q! f( I- v

    ( D0 p. N) d7 ~: i% r# z, O6 M进入execute方法0 \0 f9 A% E8 d# b

    9 p" _+ j4 y7 h' H4 j1 收集参数4 Q& \/ n9 Q" ]

    + o. Y0 G# U' c2 ^: d9 Y- y9 G) P2 组织参数
    % q4 T0 h+ t1 j, ?, G& J# ^; \- ^  E% U8 p( @
    3 调用,逻辑层
    / W( X9 ]; G  B6 F  P/ `2 ~" P% \0 B- |) ?  W
    4 返回值
    ( j8 r5 a& e4 D! q/ ~  p2 ~% g
    5 }( V, W8 M# S4 F# n% @4 O" P9 x! N4.1 选择下一个页面 (ActionForward)8 K& k) G8 v! w0 F
    : x  O# a, c# E$ c3 p% C+ ~
    4.2 把值传给下一个页面
    / W3 [- d' ]2 u
    7 K4 A1 a% ]! [7 \
    6 V% G2 o1 c+ [) e8 _# ?$ C, X
    % p/ z% B  Y" I$ x6 t% N比较struts和struts2的不同, z* X; l- H1 [

    + B; x# k2 J5 \/ c) xStruts
    # u4 C- O3 F' S; s5 T: M
    ; I1 ^8 o( j0 xStruts2
    9 @! V. Y7 X( Q" a4 J& r3 h% U# ?9 A3 u+ p/ U* `
    组成        五个部分:ActionServlet,ActionMapping,AtcionForward,ActionForm,Action        十个部分:AcionContext,FilterDispatcher,ActionMapper,ActionProxy,Configuration Manager,Action Invocation,Interceptot,Action,Result,Taglib- G" Q& n% k$ m$ s- m6 J
    url        .do        .action! P  P1 x4 e3 \( T) W1 i
    分发控制        AtcionServlet        FilterDispatcher
    ) d7 s0 T# V1 \" [# O收集参数        利用JavaBean技术,将数据封装到ActionForm的子类中;' I; ^, S7 f. i6 h( H1 c5 f
    一个Action对应一个ActionForm的子类  ]( P  f: F* ^/ M" z, f( P) M

    * d  x- T$ X& }3 n/ ]+ B3 j使用拦截器将数据封装到值栈中。
    0 c4 J# b- k- ~使用域模型,一个Action对应多个值栈中的Model: _. c9 D% K2 c0 y4 R) M
    ' {$ _" a3 ]+ o/ F* {9 x
    读取配置文件        ActionMapping        Configuration Manager! B& A) O7 H+ [- W5 P
    拦截器        无拦截器        执行Action前后有拦截器- Z; n+ }5 Q# R7 c6 B; u' ~: K
    返回页面        将字符串封装到AtcionForward,进行跳转页面        Action中直接返回字符串,通过Result跳转页面# ~1 d; W( f# g2 ?7 l! D
    页面跳转方式        两种:dispatch,redirect        三种:dispatch,redirect,chain
    3 D1 K. a2 l9 r' g2 Z6 l5 e值栈        无值栈,Action通过在request范围内设置属性,向jsp页面传递数据        有值栈,Action和jsp页面通过值栈传递数据,jsp页面通过OGNL取得值栈中的数据) f% B6 m* T" X# v8 x& |/ W( d
    配置文件        struts-config.xml        struts.xml5 ~& N. M5 Z( h5 P/ f: |+ a+ s  ^
    中文问题        不能解决(需要使用filter)        可以解决中文问题:
    7 O$ H& t, j, R: y. q, A1、在jsp页面添加Meta;; y4 y, x) M! X& Q
    2 ?4 j, l6 A. z/ A5 _% t" M* b
    2、修改struts.properties中的设置。
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    18#
    发表于 2014-12-03 12:49:03 |只看该作者
    其他开发工具和技术
    ! v3 y1 w! {( y: IAnt
    ; M4 m  r1 i% l8 f( |Ant是基于java的批处理工具4 H2 `8 \# E9 |$ t1 K; I3 J
    - q  _& A. ^5 G( t, s/ ~/ n
    一、配置ant的运行环境
    7 [- h7 d  V7 ]' @- o# S) |- [- h
    + H" l0 P/ [, b. W: G1.将ant的bin目录添加到path中
    # S- {3 A* \& ?
    : P! [5 B1 N6 ]+ o2.配置JAVA_HOME
    3 Y* m$ v8 ?& {! q
    9 m9 B, |# i! U: V4 G4 H3.配置ANT_HOME
    $ K# g  M/ d% Z) Q
    ( K/ r# W# E' j, I! a二、配制build.xml文件,该文件放在应用程序的根目录下: Q% v% o3 w& \8 v2 c3 A
    & }5 \7 ]' P5 f* {4 {( R: @  y
    编译java文件+ ]% t, P1 L& j9 O( H* x3 ~
    $ _+ V& _3 C5 ]* k  Z
    执行java文件% y4 u2 F. m  ]) z+ C9 ~/ B8 j
    # A. h' z3 n  y. x* H0 r+ |
    copy' j. w( l* w2 ]3 ]! H
    8 j8 ~3 K; Z0 l' F# w0 Y8 i
    删除
    ( Q, d% m( y; b( i2 W, W; h. k
    打jar包# ?, G4 A4 q% m) X0 U- o5 R

    1 c/ n$ T" I+ `' A7 [) c8 u3 z根据注解生成配置文件/ m7 a3 W, @4 o
    + s1 A7 Y. c% c: p) c# \
    Xdoclet6 ?- a+ h7 E3 s1 e7 d8 s; J8 @
    通过注释生成一系列文件的工具(txt、xml、java、html等)$ o: m! @6 P0 r; Q

    5 W( B* K8 ~+ @0 K' m1 G! |! t* D6 Fxdoclet本质是摸板技术+字符串的替换
    : K* u' T2 F$ P$ j
    4 ]; S: @( P" i0 p! ?1.在java文件中写符合要求的注释(将hbm.xml文件的内容搬到java文件中去写)& e% a+ W' P" X% ]% ]

    8 ?7 @1 p5 g% {' F8 n1.1 在类的上面 写与表的对应5 f( W8 W4 B+ w: a3 X' E2 B
    ( x, Z- s# B; l, }
    1.2 将每一个属性的注释都写到get方法的上面
    : B2 O( D9 g3 @; ^
    " a& X: \. }5 N% @  s2.在ant中引入相应的task来驱动xdoclet
    : ?$ c" y" U  \" ]& r, R4 i, Z$ t, ?0 i1 f- H6 z! ~$ ?2 |- |

    - Y7 z4 q, p" q; e, z' M; u: X
    / x: @: g$ ^% B6 }" Flog4j日志管理) R) p. A7 r* Y
    1、是什么?  c5 v/ p! V6 U3 [' F8 X

    7 V8 ~' m' f; b% n- W. ^2 _: z0 ]- K在开发期间用来测试、对整个日志信息进行管理的工具: `" i! r; V7 J( w

    7 v+ D4 m' |) M( b* @2、功能
    ; L# t+ ?& q: u' q& W: p; J' ~# B4 y+ K- |% v+ q- r2 m  u- X
    1.控制输出的目的地, e% M. S) [. Y- l

    0 _) m6 ?* d0 y* c- \2. 控制输出的格式
    8 J) N: M# D9 z# n5 {
    " R! Q, x4 @, G2 H6 m9 C$ V3. 控制输出的级别$ [2 [4 \  ]- i3 W7 Q4 |
    + W0 e( u( X5 n
    3、日志的级别  a( A3 D  P' Y* M/ ]& w

    . n  W) n$ G! S- B1. debug 调试* @9 N% j1 @' N2 [7 I! w6 M

    4 @8 w0 [$ E2 X4 J% z0 p2. info 给用户的提示信息
    ! I+ k( {. Z2 @/ P+ P; R- S' s/ b! v5 m0 ^' `* N
    3. warn 给用户的警告信息
    7 l8 ]- i, \4 R6 V
    1 B  v! O5 a$ _! K6 f+ d2 t4.error 给程序员用来调试
    % m1 O. B9 ~8 k: z) t5 M3 o* c0 w, J  u) d
    Debug—-〉info—-〉warn——–〉error7 V! E$ y% F' u# O  o1 H( V

    7 R4 X/ S% w# j5 K4、配置
    2 m1 U2 [! U+ I/ C5 R
    " N2 }1 \. K) {+ V, G1.配置级别) ~! r3 U& A# S' N0 @3 ?
    ) B, O: f7 y( ?# O: s2 h- B
    2.输入源 (控制台和文件)+ f3 L4 E+ x9 C  Y" X) n, S
    2 C6 }" Q6 h# z0 C2 \
    3.可以进行分包控制
    9 L0 `4 ~- h. o( _& B7 V: K6 l. P" S3 ^
    Log4f.logger.包结构 = 级别
    ; d( L6 f% c7 z# W6 }# \( r6 `0 \- M: y! p, E7 N0 C+ [; P
    5、使用; G0 o* [. x/ h! s# h$ B
    . N' O) D/ u$ Y) i" ^
    Logger log=Logger.getLogger(Test.class);1 s+ ^5 v4 h& B: j

    2 b5 j( x: e# n" g) P4 K    public' \8 N$ M3 a/ x5 R6 P
    void t3(){2 t) U) w% i3 \. d: U1 C  [
    " c  F% C( P3 Z7 T# Q9 c
            log.debug(“this is debug”);* U0 L( y; P$ K% I& }
    8 e$ Y: @3 l5 f! D
            log.info(“this is info”);
    & u5 t4 K. h1 }# e. }/ ?2 F) d2 W& M4 v: Y2 w' z& I
            log.warn(“this is warn “);, E5 ]! \& b/ O
    . @1 ]0 J/ ~0 P$ k2 f  L
            log.error(“this is error”);
    1 V4 Q1 e: G4 L# W1 v+ x$ Q2 A$ ~" N! ^
        }
    ; @& F* |  N" ~$ I7 ^, w9 i
    " F* b( q6 r0 J+ YJunit
    + Q+ |6 [& u& A* @1.是什么?. T# A" i! u, }0 d; t6 H8 {

    7 U! w: T3 Z8 p# g; N! ~) G单元测试的框架
    & ?. h0 w0 i9 c( @  T1 U8 q" S" m+ q+ l6 T# t& n$ r; d. g
    2.怎么做?
    ) T# @8 C) _' e' D! v+ r4 j1 ^9 y
    写一个类继承TestCase. w" q3 |3 `! ^0 L, X5 B

    / [( x. f* M* ~, w: n) X- E9 L- b测试的方法一般都以test开头并且没有参数+ Z- J5 [. o3 T- X6 S
    / g/ q; m) x! M7 L# Q  P
    在测试方法前执行的方法public void setUp( )
    # W) R) p, s2 U1 A5 x" A5 x$ e% `/ }' |7 Q7 N6 U9 M
    在测试方法后执行的方法public void tearDown( )" S" b5 I$ Q  U6 g" H

    ( I" c" \9 U, verror和故障的区别' O7 i, t7 I( y: \$ G# S

    1 G( j; ?/ A$ F4 |, D( F! J: herror :代码有问题
    % R' E( i5 X0 ^7 a2 t2 G9 i8 `! D6 B7 w: m8 Y6 I
    故障 :逻辑有问题与祈望的值不相符合. A, P+ h: {- v1 \" e

    ) g* o8 Q+ K- F, ]  [8 H生命周期/ W% d5 s3 {# W- D2 @) \: Y
    ( ?' P8 Q9 ?& A+ ^4 G
    测试—〉SetUp()—〉testXX()—〉tearDown()—〉结束;
    ( _( k* F, F* Z9 v* {! k0 J& z" }" l: L$ A6 c
    TestCase套件
    + d# J2 o, V* r0 z& r. u. }/ K, ~
    3 Q; c3 I% c7 ~9 \. lpublic class MyTest{
    $ g8 D7 }9 r& N' c% t! j  [5 c  G  W% C
            Public static Test suite(){" s* |( K. A* s) J" Z

    % W! K9 a2 f! F0 RTestSuite suite = new TestSuite();/ m$ I9 d0 s! K9 S

    ( v8 h4 {- n  Isuite.addTestCase(Test1.class);9 T$ h1 M4 \5 f% c: L4 N
    : A# K9 [% h5 b0 P! x1 S
    suite.addTestCase(Test2.class);
    3 A. v; v8 B: P# ]1 n) P: v" |9 g+ a, ~9 v4 u4 d
    }
    9 Y5 Q0 o1 b% k* G
    0 d+ B' |$ I1 t4 Q}
    6 V2 \: Q( L( @- z: C8 b9 F8 a% Z) h; N9 G- e" `. _* i* I5 o8 H, t: `) ]

    # n" Z/ r, Q' V8 I. P+ F! L# w' y+ n* }! h* Y: U
    Ajax
    & ]8 _" `+ {+ \是什么?
    0 R$ i& q, M+ M, d( [! GAJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。是一种创建交互式网页应用的网页开发技术。
    " [. ]( |0 t) o+ E1 f$ O# _8 \8 K2 ]+ E% u/ T4 ?( H
    无刷新页面。
    * |# U, t- t% V2 J+ B5 }% U* _; H# L, J. ?0 |9 q
    有什么?
    6 x0 ~- I: J  e* s3 u! t  cAJAX是多种技术的综合,包括JavaScript、XHTML和CSS、DOM、XML 和 XSLT、XMLHttpRequest。. Y. [' u0 b; q: f6 X, ], j
    0 w& d! P3 l. Q4 r- b3 F
    能干什么?1 Z8 F  b( D, f, l/ q$ g
    使用XHTML+CSS标准化呈现;
    2 ~. g" s$ E# H. e. u0 S使用DOM进行动态显示及交互;
      [; Z- @: @' B4 k使用 XML 和 XSLT 进行数据交换及相关操作;/ J7 r% N' [% e! X$ `$ x
    使用 XMLHttpRequest 进行异步数据查询、检索;
    % p% h& F( M1 n8 A7 \) ~! J使用JavaScript绑定和处理有所得数据;: F* J8 b: ~6 i& N" q! ~0 V) q

    . F: H8 ~4 z* L/ N: }传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。
    4 \: B9 I* a% q4 x# I3 r
    : I1 o! h# [# w$ q5 L与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。
    7 w0 W4 W1 m6 H, S* n- G6 a
    4 M0 c) M3 S2 B使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。
    4 {& M. ]7 [" x% \$ R. N2 n) \4 f8 w) J& ]8 Y3 c
    对应用Ajax最主要的批评就是:
    9 t* q$ t( C6 p; }  h9 {1 它破坏了浏览器后退按钮的正常行为,就是用户点击后退按钮后不能看到之前的数据;. K8 C; V6 {, B1 s  n9 l
    2 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;: B( ^6 h% S# v& O# h: r. X
    3 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;
    ! Q. x0 ^! B  i5 P, T  W4 Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;% f* x3 [* H# ~1 m% H

    ) z1 Q! W! T, P怎么做?2 t+ l% P  P6 p( E" y2 Q  A
    <script language=”javascript”>. u" `8 L. w! w9 _: r0 Q- y
    & x. |! T: V6 k4 O
    var req;
    # b3 O4 Y6 L# I& J% o2 U
    . z) i5 U* u4 a* v6 k! Mfunction add(){- u: j' h7 v# ?. U/ b

    3 o( c5 ]* N) ]8 J//1:创建用于传输的对象0 p% ^( r4 C7 ~$ r
    / y  C0 i  y( x
    req=new ActiveXObject(“Microsoft.XMLHTTP”);2 B9 @1 y3 Q3 }2 w/ L

    4 ~2 R0 r, ?$ a- N1 C/ k// 声明返回后,处理数据的方法
    0 E+ Q( m* E* Z* U% f7 [$ m3 N2 R
    ) ~! _' n: \& M: a) ^- v' [- G8 Ireq.onreadystatechange=manage;. c$ b& \. q7 S; s* `
    7 a" c: R9 m2 F9 m' _
    //2:准备传输的内容; N0 _4 J+ }: f5 c

    4 G, G( l1 U/ k& a) u4 m1 G0 jvar str=”test1111″;
    3 {! z' Y2 H0 V4 @/ Q* S5 v' T( w9 J9 {  F7 O* R
    //3:发出请求
    # k. d& [7 {* f9 M; f
    2 f: C# J" P# C1 x+ q9 e# N7 |) Rreq.open(“GET” ,”/others/ajax/test/t2.jsp?str=”+str);
    * F8 P( Z% Q5 f7 ?+ o4 F6 \& |* e/ L- y, n' w; }
    req.send(null);! E; A4 a* A' h6 x4 {

    . X* Y* W/ g7 V}
    * K+ S, t; z$ V5 n* `0 H% S  o9 Z- A7 h
    //4:接受返回并处理& j. V: |/ c9 N, U' B4 X2 h
      b- A$ z2 f% n* s4 k
    function manage(){( z! n% {. Z# L6 w  g! ^

    ! \7 \# R4 n2 O9 [! mif(req.readyState==4){4 U2 W5 K: U! a; i, x4 G; v

    4 ]# W. t9 D6 f% h( C! J; lalert(“r==”+req.responseText);* M1 k0 e+ e) ]1 c! |
    $ |' L) ^1 i8 A' _7 g+ x
    }7 G4 ?& t9 T% C; J$ Y4 b! t: L7 v4 L: y
    , _( r+ W) G9 n8 M9 K
    }2 l$ e8 Z6 ?% M! D3 o7 d& q+ |% O, S. |
    4 X2 g0 u3 K; o9 K' q4 O
    </script>
    ( z, [" k' ], {) O- S+ E* Q+ t# R
    readyState的取值如下:
    5 ?) i7 C: P8 f
    ; F/ C" y' o, N& x  y$ w6 t  0 (未初始化)0 ]2 M9 H( [! m, h% q6 [6 N
    7 U1 E, I5 g# ]5 n$ p# a4 l; P
      1 (正在装载)! }4 [! ^+ W# s* f- |3 o- }: u0 z
      ^+ f3 l1 s% g& [8 k" C
      2 (装载完毕)& J7 }/ |( f% v3 G
    ' m0 a* K" B0 S* i4 s
      3 (交互中)
    & q* X2 `4 m% q& m
    * F9 R' N" C1 M/ x  4 (完成); A( \9 H6 H2 `0 h! B
    5 H" @* S6 ]. p3 c! ^' Q
    % E. ?- w) Y1 B, L3 ^
    % H5 F. U/ j/ Q" h, e$ b( V0 g
    原理
    : q- B; A) n. ]0 V4 K& Y, nAjax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,可以是xml格式,也可以是一个字符串,然后用javascript来操作DOM而更新页面。- C; k0 m1 v7 Y& \7 @5 `- M
    , z% F5 g5 p" Y: F; }+ b
    Dwr
    + o& y9 O' h' ^6 ~$ c是什么?% J; q( I" V* j! V
    DWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的页面。它可以允许在页面中使用运行在WEB服务器上的JAVA函数,被调用的JAVA函数就像是在页面中JavaScript方法一样。# j4 A; t" Y" v9 T+ ~6 |3 \

    3 b7 @! x; K. v& O- T. }3 w有什么?
    8 ^/ J( B4 V! x  w" {5 Q它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据;另外一方面提供了一个JavaScript库可以帮助web开发人员轻松地利用获取的数据来动态改变网页的内容。
    1 q/ X9 V$ r5 F+ O* X" T
    ! o& p5 k# Q/ j& r& ~: k% ~3 R
    6 b3 K2 M" R/ N- q0 P" Y/ @% C9 \7 Z3 q8 o. N7 ]
    能干什么?
    8 D. n0 y, y# X( L9 m& s动态地把java类生成为JavaScript,感觉调用就像发生在浏览器端,实际上代码调用发生在服务器端,Dwr负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制。
    " Y& }' f% x8 T8 `/ S3 k3 S9 K) m1 l( q- v" ]

    3 q; c" s3 g8 U" I9 p2 C' e) H, b
    ) [, M$ |, Z7 ?9 c怎么做?
    9 B1 z! N' L. Q0 R  e6 c9 n2 y9 t4 F① 编写配置文件& K  T8 L+ `0 b+ O
    4 |$ w/ Z6 I7 N: ], P
    web.xml
    + C: k' D! X- I  ?) ~7 \$ ]% E3 J; j& l1 J. F  D1 R6 [
    <servlet>
    5 e  ?  M( \5 s. Y3 Y5 Z9 `( e/ U& T8 K6 _4 O4 B
    <servlet-name>dwr-invoker</servlet-name>
    ; j. R0 q# w5 [, ^: P( t* S" q; J( _. m* N5 K8 C
    <servlet-class>, n% u+ p" @* V5 E- S, j; x5 E) w

    , H9 _$ |/ g. D" B2 c4 [org.directwebremoting.servlet.DwrServlet
    9 F$ ?9 W/ ~6 ^. b
    4 x6 ^( b5 L3 w. `. ~. z8 Y</servlet-class>7 m2 \; k. M( K# c
    : U+ o6 |4 V% r8 s
    <init-param>; V; B0 {# I, G  `) `) p- P

    , y' Q4 n; d- D, l& q<param-name>debug</param-name>; J$ L" t2 ^, E" {2 `

    3 c% H, c# y6 e2 _; B5 R<param-value>true</param-value>8 g) w  O/ j2 w: n2 h
    + r" d( H. ?6 t+ I! C" c
    </init-param>' }0 q  R* J, l( A  j0 [3 Z  O6 H" g
    ' X1 e* f9 X5 K$ @$ j8 \
    </servlet>; ^# z  _' b0 e' ]7 o0 _

    2 z2 ^8 Y2 k, g% y: H<servlet-mapping>5 H/ e8 H; M, f& I% c5 V; _

    $ ^" e; S/ L, S9 z5 F" r<servlet-name>dwr-invoker</servlet-name>
      [1 e! [; R" X* u5 H
    ) f  g0 s3 o, C6 c; K1 l% u<url-pattern>/dwr/*</url-pattern>1 q9 j4 M6 W& I& h) g/ j8 U

    ) o. p0 |* M1 f6 {" s</servlet-mapping>* N1 g) V# @  O1 m; \- a

    # U1 S% k9 D* _0 q  r, zdwr.xml
    $ }4 e, C6 ?. m, ]! p5 ~
    ; P" `9 z- J( y7 y9 [9 x& b- W% Y<allow>5 e$ K0 S! V* g7 J2 ]/ p  u  |3 W
    ! o* A' A2 I+ B, S3 A; h. R9 ~- F
    <create creator=”new” javascript=”kc2″># T  u( n% C+ L& w/ D: T
      n3 K, j8 i  B2 M5 ], Y7 \
    <param name=”class” value=”dwr.Service” />
    * s" }6 ~/ {. H& W
    3 o) M/ e2 j/ @</create>' t3 ]! g# a# @6 {; G; R/ I

    $ m* U% K$ o* ^% ?: F! Y* [, ~</allow>
    3 e8 _: U* i. D$ O2 L# X+ t
    ; Y9 c% N! Z1 _4 Q0 }②编写service$ t4 p4 M0 `. O. Q
    3 B: n0 J% h7 w: A- v2 I
    public class Service {
    , V  z0 d, K, G0 I0 W/ C1 u; j) w
    ! ^  m* S( Y5 R9 {" q( M2 x8 }public String sayHello(String yourName) {0 D- x) b# \, K( \4 T- g

    , m0 P; O+ N4 ?0 I# @4 |* z//可以是访问数据库的复杂代码
    ' _) s! z# m2 Q2 P: S+ {4 o% X4 \. g0 O
    return “Hello World ” + yourName;
    $ \/ G: `3 m$ X$ R$ v1 F! O
    & }7 Z. \( m% S4 T1 w}
    ( M$ E: u% i: X; n
    ; r+ U& B: [/ j9 L/ s}
    - B9 B5 u; a8 b
    : j0 h% E$ J8 [  `6 d6 \+ B% d③测试DWR
    5 |2 h4 ?; }; a" a3 Z7 P* t+ C2 ~6 z
    将代码放入应用服务器(比如Tomcat),启动。6 p9 D, S6 F- I9 z( r. J6 J: D* ]

    + }2 D* D0 ~# m9 D5 G1 p然后在地址栏输入http://localhost:8080/你的工程/dwr
    % @9 ^2 U; S: o+ R4 _! a( J  Z' J+ j; u. Y8 Z. n
    ④编写jsp页面. C* f. i: a7 ~% L6 K; D

    ! A) [) {4 t6 ]9 I1) 要引用3个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js* `9 Y9 a# b6 ]

    , b8 x. X8 M: ]- d4 d2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样. E5 i5 C3 V% `# ~6 f8 j3 X5 N
      j' l/ r1 k5 F: i! F% z3 }
    3) js里的service.sayHello和java类的那个有一点区别,多了一个参数,用来得到返回的数据
    回复

    使用道具 举报

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

       

    关闭

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

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