我的日常

登录/注册
您现在的位置:论坛 盖世程序员(我猜到了开头 却没有猜到结局) 盖世程序员 > 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 |只看该作者
    JEE0 K5 n  @* e3 N4 w
    简述JEE
    ( d& i1 d+ a! w5 p% ?JEE : JAVA  PLATFORM  ENTERPRISE  EDITION
    ! M5 q, O7 u, U) ~1 C' v* s4 k# B7 x  ~! e+ A
    JEE是一个规范集;7 w" J0 k; h7 d3 C
    " g( Q  [" l" {8 o+ f- _  `
    JEE是一个框架集;; O' y& ~- y+ b( a& ^
    9 ^! f- G# F. J8 Y& A, V* [
    JEE是一个技术集或API集;7 `" S2 Q4 A% Z4 `$ q; j# `
    4 f5 i2 q1 b+ q
    适用于创建服务器端的大型的软件服务系统
    9 ]( w* ~5 e4 o2 x" L% d+ X* P* _7 L5 j+ k& t/ v& ]

    ! T" ^# {: g1 f5 H, O: `* X2 C! L4 z% X3 h6 m, r8 s1 a) S7 G2 a
    C/S B/S 模式7 V6 B% y- P7 o2 r) }, v
    C/S client/server即客户机/服务器模式,客户端也参与程序的运行与计算(富客户端、胖客户端)
    , j  O; B2 W7 s7 i. q3 `, ^3 L/ Z
    4 t. u, k- S/ E1 k4 a1 r% bB/S border/server即浏览器/服务器模式,又称为瘦客户端,客户端不参与程序的运行与计算' a; H% S8 a3 [, a5 G9 w- ^
    4 F0 a2 y# g( F

    , R9 P" k2 R1 n. O7 o: j1 c3 a  r" C8 Q& C
    企业级应用(大规模的应用)的特点
    ! k3 P# E3 v6 M5 d9 R; e+ N) d1.生命周期长、稳定、可靠: b+ R5 A. c3 a7 Z) w3 R+ E  M4 e
    : h  V4 [" ^9 }! Z
    2.组件往往分布在异构的环境中,能够跨平台+ S( `9 X- [7 g7 x0 n; ~
    : a1 A& q* n# w' y. y- e" u$ k
    3.维护性、扩展性、重用性
    + B- E4 s9 X& {8 d, n1 Y+ l7 e" W; J) x% X0 p# Z4 ^
    4.有事务、安全、线程3 i" G3 c9 A0 J

    : i& @( X$ _; p1 @5 x% H, u
    7 c& @5 b. ?' ?) L3 R+ c
      I5 G0 g0 D  v0 m' b, e4 w什么是业务逻辑?( M1 U# j9 o; K6 z
    依照业务逻辑划分模块,
    : M% }8 {3 C$ U  ~7 F& Q+ M2 i  x8 h
    所谓判定业务 就是具有以下特征:$ Y# A4 @" G5 D( }
    5 j* [, G8 |& k) \& z0 s! j: W1 M( t
    1.业务流程
    + Q$ H* q1 R* c2 X5 Y4 ~4 T6 o% }* ]- ]$ R/ Y: p7 p& D+ g
    2.业务判断
    5 r# A' X% W* e, ?# F
    : }" N1 V4 f+ f3.功能组合" p8 ~- ?) t6 X5 e+ W: A

    : Z2 v% S; I* C0 z- k. | 7 z3 J# q& m9 R8 }7 q  K5 f
    * {0 M  M# _* g8 D
    平台(角色)的划分0 b  b! }7 J  B8 S# j5 z  n
    1.平台供应商。提供满足API集实现的厂商(BEA weblogic IBM webshphere)
    + l, e' b! ]) |- e
    & }0 `8 G5 D" y3 Q# z2.组件供应商: m! }+ Q3 ~  l( |- ^
    / }0 H) m) _3 p( G1 z* y
    3.组件装配人员
    8 r* F2 T0 P+ M; {6 [' G, m
    8 R+ m3 F0 o% ~2 K8 b6 H5 I4.部署人员
    & \3 i$ {  a3 j  \8 u4 B
    ; ~* \' E: b7 v+ k$ B2 q5.系统管理人员
    ; A& F1 F8 s4 M8 G8 U' _2 c0 p7 u# d: ~6 Y) a3 o; m
    6.工具供应商 提供开发组件所使用的工具(Jbuilder、eclipse)
    3 O2 Y9 d4 u9 w, d
    ' W& q/ R+ U: m) u / {/ R1 x* ]8 T# ^$ K; b
    " e# D% j0 [" Z" s3 v$ n
    java技术分布(设计架构 模块内部设计)
    0 t+ E1 L8 O# @! y$ }+ y5 A1.表现层 Servlet、 Jsp、 JavaBean、 Taglib5 z6 ?0 Y; {3 f2 y7 u  `. b6 }

    + r; h. y/ _) a2.逻辑层 EJB(SessionBean)
    $ k: R) K* R0 A) b; W2 t" [0 J9 m9 }* M2 }4 [/ E' Z
    3.数据层 ( JDBC  EJB(EntityBean))
    9 ]  ?- I. Z7 e6 L7 ]% T6 p3 F, B' l$ x* P4 J% J3 d
    4.服务 JTA(JAVA事务架构) JTS(JAVA事务服务) JAAS(JAVA授权与验证服务)+ o2 G. u0 T6 a7 C7 H
    # U+ u! N7 L# F6 E$ H
    5.分布式通讯 RMI(IIOP)+JNDI 、JAXP(JAVA 的 XML 架构)$ F" x' w* f8 \$ ?+ I0 X

    " a1 L( S3 C$ T  q9 O/ ^  ZJAVAMAIL(邮件服务)、JMS(消息服务)、IDLC、JCA(JAVA连接器框架 (成))
    1 W7 q4 k. e8 w+ f( x5 Y2 i) m- F7 a+ f; p- z$ F; ~% c

      w4 r. u1 p6 J3 m( C: U1 p2 M: ]! d
    , Y8 a4 x/ t* `: K9 ], nJEE的体系结构: 是一种组件的体系结构1 Y, k/ X8 z  Y1 [
    1.组件 : 能够完成一定功能的封状体(独立的功能的集合)
    7 Y1 t0 I" ?& r; L6 ~8 {0 o' m
    % ~5 f2 R! Q9 h/ ]不能单独运行,必须运行在容器上$ H' ^0 w/ @$ f. Y) F- a5 G
    9 v  U9 X0 h$ W
    分为两类:web组件、ejb组件
    $ ]: \  S! _- e/ b4 `$ H4 D7 U+ {7 u4 A1 m! U/ F
    2.容器 : 提供组件的运行环境,并对组件进行管理(一段程序)9 y; W3 j, U# _5 q2 G3 c6 S

    8 F. c3 [- ]2 t1 @& U管理组件的生命周期
    3 ?1 {8 q) T/ p: F- Z
    " d+ g9 w5 T, l, \' {6 l不能单独运行,必须运行在服务器上$ B3 Y( T" T+ h. h) k

    ; `. m: y, {; T, O5 J3 c程序(组件)通过上下文来调用容器(context)
    ! d" c. c7 J) C9 I; F2 A0 k6 H* P3 l) Z
    组件通过web.xml向容器描述自己,使容器能够认识组件
    " t: m! m( H& S! t7 B+ C+ o
    & r) `6 {8 {  I8 Z5 j. s. W容器通过回调方法来调用组件8 _) P2 J0 @( t" E6 ~
    % m/ S  u# M6 v
    分为两类:web容器、ejb容器
    . x% _, D; z+ p. Q/ c6 B) Y: ^+ A, X* L! T8 m" [: K
    3.服务器 : 提供容器的运行环境,提供大量的JEE基础服务
    - j. L3 r4 E( A/ m" {: z
    # ^: q# R/ I7 }, h5 l5 X# N# uweb服务器(只提供web服务)
    9 m8 p# P! ?$ U- ]; X
    ; \& o. y* H4 \& c) F+ j  Yjee服务器(提供web、jee服务)
    9 m# T- R  M, }( c5 I, ?2 \/ _8 s1 K9 j: ^1 o, O
    . D; V8 |2 w) I; d
    ' b% S8 ]8 S0 K6 I$ W
    什么是回调方法2 i3 `. r6 C" \, i
    由容器自动调用的方法,就叫回调方法。
    ' c9 k3 i2 Q' F0 j- {# H' c0 k  A! v  i3 @4 n0 A, E

    3 p2 B& v: q; E) ]* `" T/ t5 j
    : h" t/ h: y% E* @, u4 VRMI远程方法的调用机制0 _! Z% _) T$ n9 `3 T; R( }/ Y
    例如:A主机有B()方法,C主机有D()方法,A 想调用C主机的D方法1 K$ U1 y' c  V: t+ k
    & N& l. \) E" W* x2 r* g, r& f" Z

    + U1 A5 }) B9 p9 F( i8 e
    / c& T, s" U7 t( c/ W( A
    ' P( H: Q  S. O4 [& X+ W) C6 |1 k3 U1 H7 k
    学习方法; \+ |/ i4 I/ O
    1.规范(熟记) 2.熟悉API 3.多练 4.多想
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    12#
    发表于 2014-12-03 12:45:29 |只看该作者
    Servlet
    % v1 X4 Q# K  C( H: m! }
    •     描述war包、jar包、ear包的结构; u( s: c* |9 i3 S
      : }3 c- W2 _: D1 j2 m0 n  \

      , D$ `$ }' W$ O. J: W0 h3 |

    war-                            web文档压缩包

    —WEB-INF

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

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

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

    ! I# J, y9 m# ~" i3 Y

    jar-                             java文件压缩包

    —META-INF

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


    " f5 R5 L) ~% M7 k5 _$ Z$ k2 X

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

    –META-INF

    —Application.xml 配置文件

    –*.war

    –*.jar

    ) b1 R1 {( L- y1 m, N- X, T' E
    • 什么是servlet?servlet主要做什么?% J3 k9 N. ?6 o% D; w* z- `! g
      1 J# U6 ^7 F) v. L2 ~2 _

      % T( @( O. F' B6 [5 @% y1 M

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

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


    ) h2 ?  Z1 G0 R$ H
    • servlet 与cgi相比的优点?servlet的缺点, D2 @: b' O! Y: P6 G4 ]

      . _3 h- D# k, l4 M$ \9 G+ Y+ V2 @( t+ T' e( Q8 K, F

    优点:

    性能(线程比进程更快)

    可伸缩

    Java强健且面向对象

    Java平台独立

    缺点:

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

    7 O- z/ D% \! R6 Z, }
    • 常用的servlet包的名称是?' x1 ?5 _6 P2 Y1 I( B- l- o

      ! {& J" }1 R( O4 t- y  @/ e) k8 i
      2 X) V0 |9 o: F: B  E2 w; F3 u3 l, Q

    javax.servlet

    javax.servlet.http

    2 [2 \1 y) D) b3 Y
    • 描述servlet接口的层次结构?  }* B( v! T, ^3 W' s) }- N& D( i

      / a( _# g" {$ N! L. e4 F( P- B- y! z

    Servlet

    –GenericServlet

    –HttpServlet

    –自己的servlet

    ServletRequest

    –HttpServletRequest

    ServletResponse

    –HttpServletResponse


    8 ]/ J7 n' P5 P
    • 对比get方法和post方法?
      - H0 D7 n1 T. V% o

      ' ]2 P; |3 P9 s; u4 {/ h9 a9 ~
      $ p7 {- ]/ z  A. x1 y' F

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

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

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

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


    3 ^" t! [& y- y3 ?
    • 归类描述HttpServletRequest接口都完成那些功能
      / R6 m7 E) ^1 r4 y; j1 k

      0 U. y8 @" {/ W( l6 \
      2 `3 ?2 J/ S; {& l6 Y5 Z
      • 读取HTTP头标# [- j5 a% [) A
      • 读取cookie0 w9 }1 s5 r, ?6 v  B4 a/ ]3 a' Y/ r
      • 读取路径信息: {7 `% V7 d5 B) Z
      • 标识HTTP会话。
        ; m0 T2 t& Z# ~7 t" o; S% [. `
        " j% c* [+ K* ]# ?7 Q" d# A+ _
    " Q  t, v% u9 i
    • 归类描述HttpServletResponse接口都完成那些功能8 Z4 Y2 r. c& u6 j4 U  q- v) D
      ; k3 [7 i' h& ?" X

      + i( K/ ~! W/ Y! w
      • 设置HTTP头标
        + T1 Q$ R& }2 L- Z/ I
      • 设置cookie) w0 i) c! H) c3 ]. z
      • 设定响应的content类型$ ?7 l" G9 k0 n1 t/ e
      • 输出返回数据! O3 s; J5 ]4 r* M- x) t  h7 d
        - f$ U5 R, K" l1 U  [/ J
    ( C. x+ N; v1 ^$ C
    • 描述service方法所完成的基本功能?默认是在那里实现的?) {4 e0 ~" E9 L$ {0 r

      3 y9 h9 I/ M+ j0 R- s0 r  y7 n
      6 K4 S9 Q4 l/ M" o  ?) K- {+ q

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

    实现:默认在HttpServlet类中实现


    , c: y# L9 d# v* q% ]
    • 如何开发自己的Servlet?描述应该做的步骤和每步需要完成的工作
      / g: A1 {( e0 s9 x% z' E

      ! `! B- U: z8 b
      % c5 t/ M" ?1 ^7 G  s0 w4 [

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

    " l; q3 w7 s2 G& V$ s: V
    • 为何servlet需要部署描述?) e* E) c7 ]: \8 d3 I3 }) r' e
      8 i8 }' B" V# l8 u6 d% \
      9 m* Z) s. `* R1 q7 E' m6 q7 I

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

    , f- f" _+ b7 m/ C7 A3 V
    • Servlet基本的描述应该是?请写出来' D. r2 f4 g2 ]7 G# V" K9 @( v
      + c" y* c( k  W6 }1 e% T' p

      4 t- \: Z4 W8 i' k4 ]
    ! ~0 b3 ]/ y2 }6 V0 P

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

    4 d5 @3 y: X0 w! }/ {
    • 如何在html中使用servlet
      2 P, U. W* f- S# o- t# E8 W: B! P
      ) R4 g$ l! b3 v" V* ?
      + n& j. b# r& p! H6 n' x6 [

    FORM标记

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

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

    语法:

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

    {HTML form tags and other HTML content}

    </FORM>

    ) E, B% G* O% G* P3 y5 ]) `# Q- Z1 x
    • 如何接受request中的参数
        U6 u: r, |4 t5 ~: J/ v+ }
      # i: C. f" y7 S' O8 x/ D
      String userName = request.getParameter(“userName”)方法# y7 r7 U, m; u
      8 M3 z" Z9 v+ Y! R$ V2 ?

    * D8 X- N8 S: ?7 X3 k9 v
    • 如何接受request中header的值) G# z  b3 ^1 S5 h$ n6 y2 @

      8 C" i, Q, H. r" l, d
      " c( j0 r% V7 f  a5 C# |- v5 U1 h

    request.getHeader(name);

    request.getIntHeader(name);

    request.getDateHeader(name);

    request.getHeaderNames();

    * B  t" C  e# H6 J/ r, S
    • 如何输出html
      5 x- J% }/ Y, K/ G" [

      1 I1 N! Y/ }" x" V/ V8 s( D. M/ M4 T# X. u& `

    PrintWriter pw = response.getWriter();

    pw.write(“<html>”);

    pw.write(“Hello”);

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

    1 V2 k  w" U6 ?  ~
    • 如何设置输出的contentType
      . v' _) J1 f7 l' u3 `. ?

      * z+ V7 z, N& n/ K+ w
      ' p) j, n; k. Y

    response.setContentType(“text/html”)


      w  a) e8 L& M/ R$ N
    • 描述servlet的生命周期?! y0 Q$ F' X! `
      ! i5 N# D& S; H  q4 j) q

      6 K: N. a' q. f8 U" w1 d

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

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

      n. S# B; K1 E! \1 r; h
    • 描述init,service,destroy方法的功能和特点0 U* Z2 U( g  }" V. T2 v* S1 n2 n
      1 A  U7 x, x5 l. J. ^

      3 g5 ?0 E  x+ M7 h

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

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

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

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

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

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

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

    . `# [% N3 I/ D0 w4 t& b" D0 }
    • 什么是回调方法?有什么特点?
      8 H5 _8 {' Q- k; F
      # j. U: Z+ S2 V- V; w' T

      & F. X7 t8 K0 Y0 h  h

    由容器来调用程序的方法

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

    2 r) }: j; E3 u
    • 如何设置初始化servlet的参数?
      4 \- ?% r% ?* O1 A. c. p& m, }* T
      ) i1 g) ~) X- Z8 A- Y
      在<servlet>中添加如下配置2 j# {2 g- v2 F

      6 ~. T. B4 }8 |# Y

    <init-param>

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

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

    </init-param>


    9 Q4 i/ t& p4 }  i
    • 如何获取servlet初始化的参数
      ' p% X  @6 A2 R# F) t( |

      4 f/ z7 h4 l7 P& _6 b
      8 j1 A0 h4 X) c' B" _4 [

    public void init() {

    greetingText = getInitParameter(“greetingText”);

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

    }


    7 Q2 Y% J$ P$ S# S- k( V5 R
    • ServletConfig接口默认实在那里实现的
      ; l* w8 X1 ]! t4 P( P1 E1 _- E, f
      3 a2 E2 T$ t- j2 Z& c! `! e
      % y& K& L! @: h5 D! G( @

    GenericServlet类实现ServletConfig接口

    1 ?7 r  p) s+ ~$ K
    • 什么是ServletContext?有什么作用?
      , H4 A  e2 Y. w5 [
      8 }3 ]4 d; B) {( W; L

      5 ^$ T  {* F  r

    Servlet上下文

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

    . J0 ^7 j- @) s* I  p7 j
    • 如何访问ServletContext接口?是在那里实现的?3 k4 ]) J  ]! u  z

      : h& X/ K$ ^% f2 F( }, f' x; z$ p! z$ g/ y  A4 v! u- i/ n

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

    GenericServlet类实现了ServletContext接口。

    ' @& ]5 B0 S: R$ v6 |) p1 L. [2 H
    • ServletContext接口的功能包括?分别用代码示例2 g6 A9 ^2 a4 r$ @$ P
        f% e% `5 q% C2 B4 y6 I

      . M! o1 P+ z2 m" H1 l! L

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

    6 Q; I0 _4 W. q& b' i- I% c
    • 如何设置ServletContext的参数?) w1 s3 q6 e( N! L7 Z4 a. ~
      ) B& C0 I2 V8 b0 K8 T5 R

      # u. {) g, E1 ?& q

    <context-param>

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

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

    </context-param>

      j! [! K9 X4 l% Z
    • 如何获取ServletContext设置的参数值?
      ( \* t; Y0 N, Z) r# ~. k8 I& L

      2 n/ L9 u! e& |! z% L5 S! k2 K, D
      6 g: a( X- T' c  b5 a; m# q

    ServletContext context = this.getServletContext();

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

    $ N- T( F7 _/ J. k" U
    • 描述Web应用的生命周期?
      5 I; M2 K4 [  Y
      5 f0 m1 g1 @4 T, ^

      ! D5 J6 i# U4 R0 T

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

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

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


    " z' |) p, j: B  ~# M& \
    • 如何用代码实现监控Web应用的生命周期?
      ) }! i) @. r3 [. L
      9 n" I& l" Y( h  H( t6 G
      5 |' ]6 W$ L4 `% n7 {
      / R  ?; ]3 _( Y* D8 |6 j0 H

    public class Test implements ServletContextListener{

    public void contextDestroyed(ServletContextEvent arg0) {

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

    }

    public void contextInitialized(ServletContextEvent arg0) {

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

    }

    }

    - t8 O+ I9 W# E% ?: c. q- h2 Z

    web.xml文件中的配置:

    <listener>

    <listener-class>

    com.csy.Test

    </listener-class>

    </listener>


    7 R. d+ m) L& v5 Z0 X1 |3 H3 t# r
    • web应用中如下错误码示什么意思:400,401,404,500- p3 k2 a' g. e9 t

      . \  d( g1 r" r. L) m+ y
      400 Bad Request//错误请求
      401 Unauthorized//未被认可
      404 Not Found//没有创建
      500 Internal Server Error//服务器内部错误

      8 {8 W1 p! `; z
    0 j* @2 K# }% F0 S
    • 描述Web应用中用声明方式来进行错误处理的两种方法
      1 H- m! l5 n1 h1 U& P. j4 K
      8 A2 q# K# \# K: ?
      * L0 r* ?4 y: q& D; y  [4 `

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

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

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


    : k3 d+ B9 S2 Y& E& E: I1 w
    • 描述记录异常日志的方法,都位于那些接口?
      " g" P9 g+ T9 l8 j# R9 y/ |

      9 ]1 I3 r* W$ C1 K3 x( P4 M; S! b% m! N' w( [7 I

    GenericServlet:

    log(message:String)

    log(message:String, Throwable:excp)

    ServletContext:

    log(message:String)

            log(message:String, excp:Throwable)


    . W8 v5 @) x5 G0 E$ ]
    • 什么是会话?5 r, |8 K, z( W/ U. F
      % ~5 V% q/ ^7 K3 _+ l

      $ E  V* V. s7 a( U# [

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


    4 A) X# u, z! P( p2 S. F' s% V
    • 如何获得会话?9 c8 g1 a1 N3 z9 {3 y* e

      - T; b. u; T! F- R
      HttpSession session = request.getSesseion( );
      * R' M) A, D0 W3 W: a2 `$ v! I0 J5 i
    . N8 W  v, w- b7 v( n
    • 会话Api的基本功能?
      + P: d9 v8 d* @- `  Q! u

      5 X' d) L- C- I5 L- v
      % M$ {) M0 u- Z8 H1 ^

    getID() :String" k0 t. R+ L& d7 A: Y- r7 a! U

        isNew() :boolean4 _/ Y$ Q% j3 s1 U6 f

        getAttribute(name):Object' s5 ?* b4 m/ u! T

        setAttribute(name,value)
    ! Y5 v# l! |+ B8 x/ g% G

        removeAttribute(name)


    % H3 [$ S1 V$ x1 u: F
    • 如何销毁会话?
      % {0 P! c9 s* L) j

      % `6 \8 \; l( k' r! y$ ^6 I
      1 ]6 N# A( c0 J) r& K! h

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

    <session-config>
    5 G& w2 }9 S0 }( m8 y

             <session-timeout>10</session-timeout>2 V  q! \, K( t7 e& E' k) M' ]/ v

         </session-config>
    * ^! J' x' I1 L$ T

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

    invalidate()4 j1 s" H4 C8 U5 y' K$ E

         getCreationTime() :long& w% @9 G% ?7 ?! d; x- ]( d! v

        getLastAccessedTime() :long- T; P8 l3 ]- u5 X

        getMaxInactiveInterval() :int& @0 L5 U% s4 z4 Y: d

         setMaxInactiveInterval(int)


    - Y) S: S0 A( i7 r. t8 G
    • 描述会话保持状态的基本原理
      5 b5 d0 |& P- ?+ `, s4 n. g

      / P# k  J' L6 f3 ]2 R3 \& u1 y7 E$ e+ @- V" L

    0 l1 G5 Z8 {3 m" t" \

        client server
    ; J7 ^4 R4 q" z( V) [+ G

    4 q! P+ l) z4 e( J- Z

    request
    $ T& W6 m  a: S

    response (sessionid)$ K% [4 y% Q* [

    request (cookies)$ l5 C3 \) q$ L# R& [- Z

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


    6 r. g  ?- L* A' ^/ v" `9 i
    • 请描述session和cookie的异同之处
      9 ?; e1 C% f& A3 O1 C

      8 a7 V9 N9 m5 Q- k& {" V2 @
      + k7 ^# Z& `, H' r* S
    , y0 `' P2 Z" L# K$ a- ?/ K" D
    ' G1 q9 ^% S3 Z' Q4 z
    • 如何读写cookie,代码示例+ [% e9 O: d" h, Z

      " Y) z7 p2 @8 `0 H0 t" N3 A! s. V  Q6 E

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

    response.addCookie(c);

    读:Cookie[] cookies = request.getCookies();
    9 ~9 v. X, M' `0 P  y5 z! b' k- ^

            for ( int i=0; i < cookies.length; i++ ) {3 g6 Q0 h8 Z$ N  I

                String key =cookies.getName();
    1 H: R; y; `) f1 o0 V

    String value = cookies.getValue(); + ^! ~. M! R4 T& Z% W0 z8 ]$ q

    System.out.println(“cook”+i+“:key=”+key+“,value=”+value);
    % M: m0 T* {5 o% T. q7 v, B

         }


    : R5 s1 D7 v2 z; }* M! J
    • 什么是URL重写,如何实现,代码示例
      + S5 h  P+ m  ^2 p7 o4 O
      ) s1 z3 T) C' e
      1 J+ c0 w/ |2 R# y- @2 f

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

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

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

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


    8 H8 S4 ~7 V( @$ f$ J0 H9 ?; D/ b+ f0 X, s& M7 w5 o6 i" v8 d
    • 描述web应用的4种认证技术
      - }0 E0 {9 J/ C4 o7 P
      / l9 Q1 _: @. @% Y; ]: ^
      : K& T; C9 z1 |8 p

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

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

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

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


    ; c, z8 Q8 Y6 P8 i$ [' u6 I. X8 Z
    • 什么是授权,什么是验证?. y% f" m, ], I( U7 l
      ; k" O; `% j/ ]+ B; X; [" J

      + h6 b1 Y0 W  Y

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

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

    * G# k3 A% G3 ~
    • 什么是HTTPS
      7 {* f7 w9 h- x9 J* |2 D) U" J
      0 b5 n, F( G& o, X4 ^

      - n  c+ U% u7 z( v7 G

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

    5 m* h' F2 ^! C  a4 {
    • 什么是审计?" S$ D4 U9 a5 t/ W' P9 d
      ! `, y6 U! }) c2 n& t3 l
      # C' w. w$ {) |7 {9 m

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

    / u7 l' t1 i( c( r0 Z$ m
    • 如何实现声明性授权; a* g1 K. {4 T9 D$ l
      - E; |/ K6 p$ E  e' x* ~

      2 R+ j" N; L1 w3 L- u% ^2 w

    1、标识web资源集

    2、标识角色

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

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

    在 web.xml里配


    ! p$ F/ k6 o9 M
    • 描述servlet并发问题?4 I1 r2 _2 ^0 ?. t2 T0 C5 q7 S  }

      " X  b8 W, M1 G& D
      ; ^  z' _# L3 }+ E) H

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

    ' g/ m$ q/ V) T' O- L) o
    • 描述Web应用中的六种属性范围" i9 j4 S( v+ N( K/ k2 t
        ]- V4 i" Y' g, N; @

      : N" W5 g5 L8 e6 |& E  y

    局部变量(页面范围)

    实例变量

    类变量

    请求属性(请求范围)

    会话属性(会话范围)

    上下文属性(应用范围)

    7 d6 k  r3 O6 `( b3 J3 c
    • 指出上述六种哪些是线程安全的) [. O1 ]: B7 [8 V9 c9 h' {% r( B
      ) a0 ?8 [/ b$ R) Z! J  i) a
      : X! y8 w; D% g2 x! L0 R

    局部变量和请求属性

    1 j& x- H5 d  b6 @& e
    • 什么是STM?如何实现?1 Y0 [/ U. s6 w+ V& g- b% s
      ( X1 L, W' ^, j6 L! O( Z* J
      8 G  i; G9 f& b5 @

    SingleThreadModel接口

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


    $ h! G" |4 S$ N% u0 y+ X: A- [
    • 如何实现并发管理?' }6 A  Y0 X- k) e8 l

      % {, L9 A; U  v4 F& J0 I( j4 e% M0 s* _: z8 Z  Z/ v

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

    使用synchronized语法控制并发

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

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

    ( V- x& I" {: H: d9 ~
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    13#
    发表于 2014-12-03 12:45:45 |只看该作者
    Jsp+ \; h9 G9 c' U* o( P! O: s' B
    什么是Jsp?
    - i4 c0 S# ~+ ?' RJava Server Page    结合java和html在服务端动态生成web页面的技术4 c3 [+ K7 A8 i" B* D& U# ^
    $ r5 o# }% ?& y
    0 F  l/ _# i( g. j5 O+ K0 N# y

    * Q3 q6 I0 T$ o1 a描述Jsp页面的运行过程?
    + J' m; C! R7 t4 y/ p- e第一步:& }5 W9 q9 \9 B

    ) @" m. u- o( l1 C7 Z/ I请求进入Web容器,将JSP页面翻译成Servlet代码( B9 E$ q9 P! m# [3 y
    2 p" ~/ \# F  q5 T, e
    第二步:/ Q  o5 @/ B/ P) Z- B1 H

      F' H! _0 B6 O3 B6 _6 G/ p编译Servlet代码,并将编译过的类文件装入Web容器(JVM)环境
    ' K4 h2 ?" t/ [) [+ K- g  G# g, }* m' O3 n9 e" G4 _, O+ K
    第三步:% l* c' }1 \3 T7 @8 C; V* {" g$ U
    8 o) U' `. |- ?5 ^1 d4 B
    Web容器为JSP页面创建一个Servlet类实例,并执行jspInit方法, m, {" |9 c7 |, v6 t! s. b6 {

    5 u9 j0 p* I* B8 f9 n第四步:
    8 r% K4 A! F# ^( K* u# X: p6 F! s$ s) z
    Web容器为该JSP页面调用Servlet实例的_jspService方法;将结果发送给用户; k4 f& W. y% A( \
    : q0 U* e2 r5 k; x( ?0 z' y% P

    / l4 q4 `: E$ i) [" `* B4 Y5 f
    / g# z, Y# |3 z描述Jsp页面的五类脚本元素的功能、写法、并示例
    6 |4 G5 o/ M8 {注释 <%– –%>: Q/ d: i* e" t5 X# u% R. Z6 L

    + z; m1 S. ?7 D  a4 |3 O<HTML>
    , p$ H4 X, ^0 S
    , u' z9 ?2 j1 `( I: A<%– scripting element –%>
      k; ~  l6 f- ]6 k; i2 i
    1 M, e& N4 Z# `1 r% u</HTML>
    ) H: L4 S+ |* Y) l
    / L3 a! F" b7 [' J指令标记 <%@ %> 指令标记影响JSP页面的翻译阶段4 m5 R4 e( w5 v; Y/ A  p
    8 j$ M7 @4 M! m: ?0 \
    <%@ page session=”false” %>
    / H* |. S) o  G
    9 O3 \' M  h3 V- e+ k声明标记 <%! %> 声明标记允许JSP页面开发人员包含类级声明6 [, S6 w+ @/ i7 p# d* i

    5 ~4 ]& T3 X) M<%! public static final String DEFAULT_NAME = “World”; %>
    + _" @1 D7 T( A4 Z/ Q$ ~$ g5 H# f- k3 I+ g+ ^/ }3 _
        脚本标记 <% %> 脚本标记允许JSP页面开发人员在_jspService方法中包含任意的Java代码) o+ V" n0 _4 _+ j

    1 `5 |* s+ d9 W$ {6 W& ^    <% int i = 0; %>
    3 R) ?- F, n- M
    * ]: ^& H- V* w; D  Y& F& c* j表达式标记 <%= %> 表达式标记封装Java运行时的表达式,其值被送至HTTP响应流 <B>Ten is <%= (2 * 5) %></B>
    # S" l# P8 ?7 E8 s- k/ }+ y& l3 Z; r2 U6 M

    / v4 w" G$ n; i6 }, h  g. J: a' C$ l
    描述Jsp页面中的注释种类和写法0 L5 f0 L. F/ \5 r1 F+ n' r
    HTML注释
    , G  x: K. r  }9 h* \3 B# H* d2 s! f% }! x
    <!– HTML注释显示在响应中 –>9 A1 Y: C" l8 c! I" z' u2 ?$ h; k

    / X2 @) I' f0 D; r3 K, n) z& aJSP页面注释
    9 T# ^' ?$ U4 m4 {' U' J7 v) E1 d* Q
    <%– JSP注释只在JSP代码中可见,不显示在servlet代码或响应中。–%>% G3 A6 j! W9 u: b! j* |/ x( l
    ) Z+ p" F4 W" K8 Q# m0 p" |8 J
    Java注释" a' H0 o, n2 M, D
    + {+ w; h4 Y* E( o7 }
    <%
    ' B/ y* u# t6 Y. ~* [9 Y4 l, ?4 ?" g
    /* Java注释显示在servlet代码中,不显示在响应中
    * d! k  m. K* o3 j
    6 L% Y4 g- S4 g" C+ P*/: D0 m8 \, M; k; d
    . G+ E" k0 }& w1 h% y
    %>
    ) d8 K/ D9 L7 g0 R8 e# A3 f% b+ k; |4 ^' n; m7 v+ S

    & ~7 I+ W! @8 Q/ z; M) h. i6 e$ E! T8 d! ~8 T
    描述Jsp页面的指令标记的功能、写法、并示例
    ) f4 ^" k0 o, b" r5 B指令标记影响JSP页面的翻译阶段
    # @% E: J, f, P* T$ b% g4 K. v6 q/ f& k9 D5 c
    <%@ page session=”false” %>+ D1 P) K* w( S% J/ g. [) x. C/ C
    - U& O+ P1 \' [. r' E, U* G
    <%@ include file=”incl/copyright.html” %>9 k8 z$ ^' T% X- ]; w/ ^: L  i1 E" {- S

    9 H5 [8 h$ |: T' b  }0 g5 e9 ?, c<%@ taglib %>
    - a" d- I9 d% r6 G: e0 C2 w
    4 d) G# H1 J' \ $ a& ]' {2 Q9 o! Y" C  Q2 h

    7 O* O8 I2 g2 G/ [描述Jsp页面的声明标记的功能、写法、并示例: n; Z; I  T! B; h1 p  K7 C
    声明标记允许JSP页面开发人员包含类级声明
    4 k; t5 ]! L0 f7 \8 f- M: b( g; x- N6 r, W. Y- `% @, Z6 H
    写法:
    % I7 f, h( B6 l" g7 i: J4 U# t5 [: }' r7 x! ^
    <%! JavaClassDeclaration %>9 a% w4 \( r7 M7 A  A2 U8 T2 ]2 u

    , F2 d+ b% B. O! a; ]例:
      Q! i! B0 l; R! r+ v. Q5 S& s$ a
    3 o" l1 s3 z. R3 x2 G<%! public static final String DEFAULT_NAME = “World”; %>
      y7 P& x2 m( B( a% q0 Q, G! n8 C4 R2 T$ {8 j: \- D
    <%! public String getName(HttpServletRequest request) {
    2 `0 s8 V( C) u: g; [8 `1 k- J" K% G8 z+ f" K
    return request.getParameter(“name”);
    " q/ {5 u: z) ?: M+ }' e5 T3 y* E2 ~0 c& f
    }4 f4 {  j# q! u8 i

    9 S2 z, h& G! |' r%>
    0 a; v) `' w! u+ d7 s. e* \5 d, Y: j* U! ]
    <%! int counter = 0; %>
    8 j- w. h! c8 D* s. r% S( p
    ; \# G; f" `  S! o! w & c6 H  q. g9 j9 C& F
    9 B- _) k" N9 c8 ~3 p! w8 F
    描述Jsp页面翻译成Servlet的规则# U; }3 F7 [3 c+ J0 m
    jsp中的注释标记被翻译成Servlet类中的注释
    $ P  w: \2 J4 ]: `8 s2 V. Q4 \3 ^* T* @0 y: d8 a7 m
    jsp中的指令标记被翻译成Servlet类中的import语句等9 E0 {; E# c  ~# \. @- _: s

    ( a" o& p. r( }( r3 }) hjsp中的声明标记被翻译成Servlet类中的属性  V+ d3 K$ f5 m2 M3 \, M! E
    9 g8 ~$ s2 i, O/ j- i
    jsp中的脚本标记被转移到Servlet类中service方法中的代码, L. v- w2 f. f( r. [! ^3 n

    * C- O4 k9 q7 x1 Yjsp中的表达式标记被翻译成Serlvet类中的write()或者print()方法括号中的代码  ~; ~+ R% ~$ Z+ X4 T
    : z! i, t4 q: t" y" E( ?
    5 }+ Z$ Q' O) K6 j/ [/ s. v" [
    4 B& ?* v' V3 H( b5 ~* c
    描述Jsp页面的九个预定义变量的功能、用法、并示例
    4 H+ V; p: ^. @1 F0 Vrequest 与请求相关的HttpServletRequest对象
    : I* q6 Z, I$ ]4 j1 V* g; T% O9 u* q& ?$ C, n$ C% \, {7 n
    response 与送回浏览器的响应相关的HttpServletResponse对象. ]- k% X) E9 e  w( i! `; J' o

    - |- w% m+ z4 z5 j  Kout 与响应的输出流相关的JspWriter对象& Y+ p) V$ k! a- w! \5 H

    & Y, X3 P+ l7 W% B  R. W  C    session 与给定用户请求会话相关的HttpSession对象,该变量只在JSP页面参) `0 g# p3 A! f

    , U+ b  d% E- y* \* {( Y2 @* A$ M与一个HTTP会话时有意义
    # |) v( X1 X6 @& V5 S$ z
    ! G( c. H4 d6 |) j/ N# m$ Z    application 用于Web应用的ServletContext对象. \; ]7 y5 Y1 e7 V# ^

    % U! ~1 T5 G9 Bconfig 与该JSP页面的servlet相关的ServletConfig对象
    ) N5 O) b. D5 U" b1 _4 M/ f1 W8 a" r4 p& ^0 S  e
    pageContext 该对象封装了一个JSP页面请求的环境
    % @2 h7 a9 E5 U, s# [
    1 ?) N& s7 |, |5 p0 E% k' npage 该变量与Java编程语言中的this变量等价
    : c6 G: R" G+ l" i$ ?5 R" Z2 a7 ?0 f( F! t1 ^, D
        exception 由其它JSP页面抛出的Throwable对象,该变量只在”JSP错误页面”中可用3 Q5 H. ~6 J8 c. e, G& e/ c) d
    # Z' z# v7 J# J# U( g, U6 H& W5 ?# y
    6 H& h1 {4 V4 Q8 z4 m7 A6 S/ D9 C
    " E6 w% S/ @" ^6 e2 A* i
    page指令的功能,写法、并示例,并描述它的如下属性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding
    ) O7 s# e; W4 f1 r( U, Simport import 定义了一组servlet类定义必须导入的类和包,值是一个由) }$ `# a* b4 e  ~7 X6 L

    % ]* ~2 o5 ~7 K  S) U5 Y逗号分隔的完全类名或包的列表。
    ' `/ |- r9 g$ W: I) Q; [; z7 |0 d3 N6 n" \' H4 l' c! P2 o
    session session 定义JSP页面是否参与HTTP会话,值可以为true(缺省)
    + W6 p: M# |$ ]# T0 C9 X
    ; L, q; m& m2 j; X+ ]或false。0 k, J. O% P! B7 l/ s  x* S
    - Q& y; D, }& T7 H+ a2 ~
    buffer buffer 定义用于输出流(JspWriter对象)的缓冲区大小,值可以为' E! d1 Z* R$ |7 X
    " N! {. P# s- ?$ d0 h" F% `+ C
    none或Nkb,缺省为8KB或更大。2 n5 L0 b- T# v3 _
    . E& u7 x3 R3 ^" h
    errorPage 用来指定由另一个jsp页面来处理所有该页面抛出的异常; \' e2 |# ~6 u4 P) V

    6 ~" h5 o7 Q: F  _3 j' X' n+ iisErrorPage 定义JSP页面为其它JSP页面errorPage属性的目标,值为true或/ D' r0 V/ v8 u0 [  R5 K8 A

    $ \: I  @8 X2 }6 k" y3 x3 L1 Vfalse(缺省)。
      }6 e. ~2 O+ U; t$ R
    ; C# x' H% L& x1 M+ Y4 C! Q' I( TContentType 定义输出流的MIME类型,缺省为text/html。
    ) k) k  C$ y6 M4 h: a5 m+ W1 d2 |+ O3 M7 Q# x
    pageEncoding 定义输出流的字符编码,缺省为ISO-8859-1
    8 f$ A  @! B' B* ~( L. @. c
    * \! u: R: S; U3 e; g % I: n, C9 N0 }  x% L1 r; `
    8 R; l! }$ s3 V* \" q9 n
    描述MVC各部分的功能?MVC的优点?MVC的缺点?
    9 I+ j) f! c0 k# U7 B6 X; K& sMVC各部分的功能:
    8 q( {7 M# I3 _5 S/ a, [8 ^8 {! s3 f6 F+ o$ b* j+ G
    Model(模型表示企业数据和业务逻辑)
    3 ^6 P; A+ ]: }# y8 n# o. H  q$ ]6 R  E$ |$ o! ?
    封装应用状态; W4 w5 |* ~$ Z: J

    # Q' q% K" e. Y6 d. G响应状态查询
    ; Y: W7 r+ s$ N6 u) t
    / {- x. |6 Y# m! }# G0 ]暴露应用的功能; }% y& {+ a4 ~% d' ~

    8 K9 Q: U5 \0 f8 }# k  g$ JController(控制器接受用户的输入并调用模型和视图去完成用户的需求)
    4 Q: G, m* y: D% R, d. \! W$ V; m" e$ ~  F+ T5 a8 a
    验证HTTP请求的数据
    2 |( C$ h3 E- e3 }9 Z4 S3 A( H
    * d: @$ y% O  h) E9 l% y将用户数据与模型的更新相映射2 n2 C$ P$ d# H1 i, U3 H

    ( d" v( B% o1 k& j; s: P- d选择用于响应的视图
    $ O" ]  w9 ~# S; m6 f4 V8 {% ?0 `! n9 S& a; S5 Z
    View(视图是用户看到并与之交互的界面)
    + J2 O9 b' x! E0 {
    6 h2 m/ \! ?. ^8 X9 E8 q4 Z9 p0 ?产生HTML响应' V$ f5 z6 E% n

    5 |$ Z  D9 x( P9 d请求模型的更新
    # c4 j& Q6 s7 ~# S# v& [! p% u( x, B1 T1 o
    提供HTML form用于用户请求
    3 c4 Q; v4 ]- [* }$ i
    , R$ z1 |4 ^9 m: J8 MMVC的优点:/ M$ I+ Z0 Q& f9 H  M9 C; O

    . k7 `1 d. p) Z9 Y+ k5 f* i        低耦合性:视图层和业务层分离
    ' x8 A0 T* s; E: D  V) q/ l4 f1 t7 l: n' E
    高重用性和可适用性
    " \% ^% x, n# o5 r8 E$ @( q) ~1 \6 B- ?5 X, M* r
    较低的生命周期成本
    1 x2 n* P, L6 a0 j
    , C- B# y4 L# M8 C- Q6 T0 ]快速的部署- F' w/ T* l/ i. s

    & \# t" A& G( {5 N可维护性
    2 ~2 T+ l& l- r  S* v7 X/ S
    " v, q1 t" }. }) N  K有利于软件工程化管理8 X: P4 _% b  ]8 i% H% Q

      w  R" ^# V. G. |$ c0 }; A提高软件的健壮性0 S9 o1 r5 b' F" z9 A
    2 ]9 A$ v+ V+ m$ F: k
    MVC的缺点:
    ' t7 m8 _+ `: g, h) I2 M7 K- g
    / \$ S& E" Z0 G, Y0 p9 R1 t        工作量大,增加工作的复杂性,MVC不适合小型甚至中等规模的应用程序
    4 b' q6 x* j- ?0 {- ~) J4 M" Z! }8 e. F# {7 K6 Q: ~+ r* H9 ]
    ' b- g! c$ `2 G

    * |) b- ^7 S: f) h什么是Model 1结构,以及结构中各部分的功能
    $ {5 z2 z' |+ a7 f/ B/ o结构:jsp+javabean/ g% r; n; Z( B7 h5 X7 U

    * l& Q7 P8 m6 H& ZModel1中使用jsp来处理web应用中的视图控制部分) m9 Z0 p& ?* v5 T- f1 N
    ( O1 [1 M8 p& D  Z4 |. h
    Javabean收集参数
    - }4 m1 e; `9 u1 P% R& H/ @) R4 f1 c6 S) B; N# t
    6 p* w5 s/ w& ]4 \% t3 y+ X' Y

    ! w- V5 {: g( s! }5 K什么是JavaBean?
    1 G" C9 Y& Y, H/ y* ~. K用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。9 S8 s5 s$ d1 x) \1 S& r

    ( b- y0 X! A% Y  K6 o 7 [. i* t) _" r5 m4 {6 b

    1 h# a! R; z5 H! A) C: V0 X' rJavaBean的规则?3 h3 I5 t/ y/ |- M
    使用get和set方法定义属性
    4 _- I1 @+ \2 O$ A: G# c
    4 Q0 W; y2 e0 N+ I& N5 ^一个无参构造方法
    / i+ P3 ?, m% X+ }+ y; \9 S/ |
    无public实例变量( 所有属性私有化)& T- t$ c" n. s9 \' N7 ]( h
    ' X  a( w( |( m* A

    ( I! V( W& S+ y# O) y2 i. R5 T+ i/ U; _* t, l. B, }5 V
    什么是jsp标准动作?包含那些?分别都是什么功能?如何使用?
    9 R( H5 H5 ]6 i  ]: n6 UJSP页面中使用类似于XML的标记表示运行时的动作! f7 e, S. J0 B8 V+ e" t

      C- P, B  m( C  i; ]  G# e+ T( W8 T+ l* cjsp:useBean# Y) j; S' ?2 p1 J2 t: }8 g% ^% W

    + x6 d' R& ?' zjsp:setProperty
    / V. A: E7 W$ ^; f1 M; O' `2 `6 m) U& k) F
    jsp:getProperty
    . q  [# q  @% D- K9 G# @& A. h. r( f7 @/ W. V
    jsp:param) o9 X- C# s- i! P, J

    5 D9 j+ I, L( H0 ~% c" Sjsp:include7 m( r$ K) |0 g* r

    1 J9 k9 O: k2 i5 o* S2 H9 T" cjsp:forward& C0 p) i$ A& Y" m2 H  @' @
    ) S6 _% ?' ^- C! f* \$ h
    3 \; |+ ^- w: z
    - g5 @) J+ y0 X5 E$ n8 G
    用代码示例如下标准动作的使用:useBean、getProperty、setProperty+ f- ?" u9 h/ R( H5 v& ^4 ]" V1 ?
    <jsp:useBean
    # ^. n% ?( h$ W8 O* g7 ]. p. i" Z  \4 K* i- H
    id=”myForms”0 X% E! p- X/ d8 Z) H! k# P: `
    0 d9 D! f7 G7 L
    class=”com.base.mystruts.forms.MyActionForm” scope=”session” />& Q0 S' G; g) `* Q8 F; c
    6 N; n. B  Z* D  R( C
        <jsp:setProperty name=”myForms” property=”name” />
    . S' y( k; U7 U) i  L: z/ E: c6 [6 z5 D5 O" t! [' e8 Y: E
    <jsp:getProperty name=”myForms” property=”id” />
    - H% w8 N4 F* h8 x3 E
    " T8 a* Z' m3 |7 s2 S6 B& O
    9 |$ O( j0 I$ ~9 n% _  E
    % y" ]# F, p2 C) L- y4 d描述说明Bean的四种scope
    : Y* r8 C9 |, }. L( Bpage0 o( `, S7 s' F
    + P- A/ ~! [* R
    request; N9 X3 H/ m! p5 c+ Q, O7 o
    7 m. u* C( X* t& {9 J3 K: h
    session5 m& U6 L) ^" p8 B2 Y. I
    # X& w) j8 A& i& E0 ?, a2 L
    application
    ; Q/ b/ M* C! k! O  z! H- O+ N7 S
    # l0 d7 u1 N6 D( e+ D , ^3 ]: R% f  P8 `( V& d* i4 v

    6 t2 v, h/ @5 j0 B8 W描述说明页面上的字段和Bean中属性的对应规则
    ' N8 s; ^& F+ H1 did 指javabean的变量名
    5 W9 v9 Z5 {+ P- q- g% e% m$ Q' ^3 o, L9 I( @7 S0 `& @4 d
    class指javabean类的全路径
    1 t( o8 z; ]+ N4 x/ m# i7 d# J
    / {8 ?3 L1 @7 G$ ~scope指javabean的应用范围
    , p3 ~. w5 t  K$ i6 K) U
    # h6 {  ^. M8 Z1 z' tname指所用到的javabean的变量名
    7 ]9 o) Q8 `* B7 z
    4 J! u2 Z$ W# h    property指javabean中的属性
    3 m0 `9 m, \! L. o7 I2 H: Q8 S) N
    . i: b# a/ s8 L! g4 Z" K7 e
    0 n3 J5 s! e9 s% I- k$ B, _+ k' }, s: I
    # V6 r- w5 h9 ~描述useBean动作的处理过程3 e' {" A6 |: b* }( P% K/ ^  k7 S
    使用id声明变量, U5 i' c& `& S$ ?: B1 d1 M# C. `1 d
    7 ]5 D$ z9 f: c# i1 T
    试图在指定的范围内查找对象( R% N6 ^. t. f4 A4 Q. q
    + j! I# [2 {3 P' n+ y' V, E
    如果没找到, P9 M+ v9 O, f/ M

    5 K# l% a9 _  y4 x. ~# f' Q创建一个类的实例
    3 M8 q) |0 [& ]
    $ s, i. ]! O' {* f! Y& K) `( H. \执行useBean标记体初始化对象
    9 q# H: {/ ]1 `' }1 M
    / |; j8 a/ [% c; ^7 c4 H& z8 K如果找到
    ! X5 r( W$ N! z9 \7 l, W
    # R2 u3 Y: Y3 N: h9 w3 u     将对象转换为类指定的类型
    * y: K" u5 L. T( j5 j& }
    ) i8 Q8 Y; N7 _+ K) f7 K
    5 `9 n8 P3 k% V/ C
    + R/ o- N' R  F# R# p6 {描述forward动作的功能& m9 a2 |& j# B- b2 n' n/ ]
    使用脚本代码处理请求时,可用jsp:forward 动作产生一个不同的视图,1 ~1 R2 \& ?) [: f/ p8 Q& G* ~
    / c) Q" H9 \; ^) S* J" W1 x" {
    使用同一个request:8 m: U' t  Q4 ?8 M: K

    " n5 I- S% W, {+ o  j 2 w' }1 V$ w9 t/ v5 l9 Q. G/ f

    3 ~) J4 z) ]3 |2 K什么是Model 2结构,以及结构中各部分的功能
    3 _- F  v4 m5 h  U: d$ w9 qjsp+model+servlet- S0 f; W4 V6 o/ ]2 B2 S7 Y* \
    , W$ h" ?1 m6 e0 q& v6 a  i
    Model 2架构使用MVC模式,JSP页面充当视图,Servlet充当控制器
    ' E" X/ R+ I: v* c! `1 @' R; h& z2 \4 T2 s/ m$ N% l. C& t) C1 j
    Servlet控制器:
    % N+ j* X( {+ L+ h: `* z
    ' [; i" ~  T6 n' w2 E验证HTML form数据
    ) v" W8 v. e4 p, f+ Q5 [% `$ S9 D4 J! k4 E9 n" [. W
    调用模型中的业务服务, N  a, \3 _5 L" r7 B
    ) A2 J: a+ A2 w- m
    存储请求(或会话)范围内的域对象$ X" Q4 K' C& j  Y

    & [1 R! K( l3 a4 H- u1 I$ U: l* A选择下一个用户的视图. ^0 F9 z8 s9 O4 M9 ]) h
    / G* |$ i  P0 S& f6 L! U- y. V6 I
    JSP页面视图:" k  j0 O1 u- L6 A" @

    ) Q/ N4 T8 Y( X! ~+ s7 j使用用户界面(在HTML中)
    * i% U+ H' j( r  @$ N# J' c" w, i; _' F) G+ }
            访问域对象
    8 w+ v7 f7 E) g# T# l
    1 [  f6 ]3 i: ]
    & S; d: I, I; ?: G# s
    & i# g& A* @; b% ]5 L& v如何获得分发器?分发器的功能?  P3 v5 Z. Z6 e( n+ ~: ^
    上下文对象中的分发器:/ u8 f2 R. u! X+ {
    3 I0 B3 ?/ S/ m7 E& \0 h
    ServletContext context = this.getServletContext();
    1 |$ f6 I* }, q, F% |' f
    6 Y7 S4 p3 @' d# }. FRequestDispatcher servlet = context.getNamedDispatcher(“MyServlet”);; N8 q5 g% Q: V) t& s

    5 |/ Q$ E; r1 c; a8 D# L2 V' `0 lservlet.forward(request, response);2 {/ `. `& n% R4 f

    2 E& D% g9 ]. D5 b请求对象中的分发器:
    . q0 R. G) s" w5 k6 f
    $ k3 n4 A/ O; u' p' x8 p# `- Z/ HRequestDispatcher view = request.getRequestDispatcher(“tools/nails.jsp”);, G9 k( A6 w5 l, ^4 r

    ( F9 h) u! z4 W8 r' Pview.forward(request, response);
      [2 O/ A$ ^$ e8 f9 u7 M2 V7 _
    : E6 c+ G% H" ~可以将请求转发到另一个jsp页面,并保持请求的传递性+ f+ F/ j- o: J( ]4 W9 Y1 l
    # m7 ^5 L" P' K
    ! W- H; ~% L( S- R0 V4 U2 b/ L
    ' _# D9 h" ~, u6 f* k8 |
    Jsp中页面跳转的两种方式?
    ( M9 V' B& s( v使用分发器跳转页面
    : G" e: b# P, _( `9 C0 QRequestDispatcher dispatcher = request.getRequestDispatcher(“url”);
    8 m* N/ I9 N1 ^6 l
    ; j+ t, K3 j& y9 b8 G8 |# ?dispatcher.forword(request);
    % `% r- [% ]% v" M
    1 |0 V0 V& A3 ?7 G5 z    特点:保持请求的传递(上一次请求中的数据,在下一个请求中仍然可以得到);
    9 Q3 P' m, H3 s7 h  p' k, X5 ]/ `. o9 `$ |4 u4 [7 H
            转发的页面只能是同一个Web应用程序的其他Web组件( m9 o# J! K' n4 z3 m& W: a( ?5 \
    & P& u5 x6 Z+ s+ x/ {  b
    使用重定向跳转页面
    ; U! ~# P( Z: A% p# ?' @! kresponse.sendRedirect(“url”);9 w5 S! w* p+ Y. P' X; |

    * P+ ~! ~% @4 X+ I8 z) W    特点:产生全新的请求,(上一次请求中的数据,在下一个请求中不能得到);. h6 U: n4 H9 h$ j; a5 x

    3 N: Y; C7 o: ~# z        重新定向的页面可以是任意的URL2 ^7 ^% f, E! ]' C- x

      x8 t* k' a+ o 2 q- s: z3 \: K/ Z8 d1 Z" H  Z

    ! l8 }5 b4 K1 A$ h: ~描述Jsp中引入另外页面的两种方法,并比较两种方法的特点?
    0 E# T5 T# L4 K  |$ E7 q<%@ include file=””%> 在编译期间把另一个页面完全嵌入这个页面,可以说是一个页面2 F% \- U6 R- T% q7 Z+ s( |+ l! G
    5 s9 X% T& |6 s5 }- c* A
    在这里可以共享变量
    ' H( D0 X1 n1 p, G1 A% v- K" F# x: D6 H% s4 c. g. T4 o
    <jsp:include page=””> 动态的再运行期间把另一个页面加入这个页面,可以说是两个
    " }8 }$ f& p) w+ a  e
    1 n0 ^0 W4 r  l$ P页面,不可以共享变量
    1 I- s& a  \6 ~2 y7 |: x! N$ v2 r: H6 }- g2 \7 o/ @2 s7 O

    5 J8 J( a2 W4 x, R& [
    4 b4 L1 d+ j0 H$ l2 v" f: h7 a什么是自定义标记
    , U  H) S# O  D, H  I; ~自定义标记库是一个Web组件,. D0 \. D/ F1 g- D

    - z! X+ U% ~+ |) a( U8 u5 ~包括:
      f5 D6 k8 L! M* b! K( U; r, s; \# G9 |, O) J
    一个标记库描述符文件(*.tld)3 S' L2 B+ D; y3 @
    ' H2 z) Q% W5 T9 ^# q
    所有相关的标记处理器类(*.jar)
    ) e% d9 d0 F1 d: ]
    + q6 ?) J) F7 T  c$ [# K% e1 r1 ] 1 C! N3 z& X* F3 J# J$ ?0 e: C  T: t
      |# s6 Z  E9 Z) w+ C% m: ^: H/ G: g; y
    描述使用自定义标记的步骤,以及每步详细的工作
    4 G1 V, R* r1 T使用自定义标记前,要拿到.tld和.jar两类文件2 x  k- o$ N2 m- J) e4 H

    6 ?( U1 ], V; P把.jar文件放到WEB-INF的lib里面。
    / _; U8 H+ n5 |" B0 [6 O" F把.tld文件放到WEB-INF根目录下。
    7 \7 n; i# i( A8 k在web.xml中配置。
    9 V. [0 d+ \# p- \<taglib>" Z7 Y+ ]! ]8 N4 y" X$ o  }
    " d. k; m, L, k- p
    <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>$ i1 v, c  R3 F' w3 _+ f

    * v* ~' p, u: f5 A! Z+ ]! o     <taglib-location>/WEB-INF/c.tld</taglib-location>
    : Q3 _% T" U2 W. V1 b1 D
    # f0 s3 x) v# }; j( B% w, S! [</taglib>) Y3 s: w- b8 H$ j# f+ L& H% z

    5 `2 |* V0 Q1 @- U  _) A# \2 S: v在页面中引用。4 ~$ K; n- ]+ J3 }/ r6 o
    <%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“s”%>1 Q9 S1 p% {9 t. b6 [' J$ p  n
    ( h& G" U' f  _/ C+ W; l! e1 v
    uri必须与web.xml中的uri对应( [$ ?- ?1 \) a. u

    % s7 J% C3 D' P4 o0 }prefix是前缀,用来区分是哪一个taglib2 I! d. d2 [0 T. [7 f+ n6 q

    & _: g% l9 O$ b' w6 h" y1 [) L( R使用标记
    : v5 `0 s  _5 n格式:<prefix:tag名称 属性>
    : C) S; T/ z- w5 z# F% q4 U
    ! ~0 z+ c) ]8 ^& k6 {+ r) f  ]2 ?<s:forEach >
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    14#
    发表于 2014-12-03 12:45:59 |只看该作者
    在tomcat下配置数据源: c0 h9 M* p  g4 A5 T2 B
    1、服务器与数据库的连接
    + ]/ b4 o! h1 u  v0 V0 [5 t. k- y  Y! ~5 j: [; ^) ?' p5 I
    配置server.xml文件
    1 N5 _0 I% M7 ~. Q# y
    2 w/ M" M; g: \% ~1.oracle
    * i6 K5 r+ T7 Q
    , y) _: G3 _4 I. }* K8 |$ N<Resource name=”jdbc/company” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”2 d. ~6 g" x( c

    9 t4 N) E. I4 b+ g                        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”
    ) M. K8 i) N3 t
    3 D5 @- ?$ @$ iurl=”jdbcracle:thin127.0.0.1:1521rcl”
    : t- b; t% K$ z1 Y9 c6 H% u6 \  a) m5 m& D3 @2 P  e3 F9 [9 j
    driverClassName=”oracle.jdbc.driver.OracleDriver”
    6 y0 Q: b8 P) a& t  w6 |, a- C* d$ n5 t) ~% ~6 x0 l* x/ P0 |# [0 P
    username=”aa”# k; j, z9 p5 J

    ' L: [+ z5 I$ b2 C: _% fpassword=”aa”" b+ X, J% P6 o% H5 i4 r

    & T6 H' L; f: a% ]( omaxActive=”50″
    % _/ N6 ^- V6 x2 ?) P: O( E- x- S: d
    7 l% ?; a: S$ {9 wmaxIdle=”10″
    2 J; _' x# e8 u
    6 H0 ~  G' r9 p. i0 b6 p& N8 HmaxWait=”-1″
    / M& `: b2 G0 Q7 q4 ^
    ) \7 d& X3 p8 Y' J' ?; m/>9 R+ D$ z1 O; Q3 M! \& O& ?
    4 x- o! t5 ~9 g9 \- h3 a* U
    2.sqlserver
    ! D- P% p  _4 M% x6 p2 h# y1 u4 Y0 R
    <Resource name=”jdbc/webpage” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”" k. O$ R( v& Z; u# f% Z8 ?# }

    7 q  ^& k& f% X9 ~, s* v% V# |- D        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”8 b, N* R1 A) u/ X

    ) l; o% M" \7 \2 uurl=”jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;4 S' H0 G& [' q& ^# e, E" y0 ?+ z

    ! i" M+ o( k% k- T1 mDatabaseName=webpagetest”6 |; L3 a* e2 r/ \

    ' k7 ]$ d/ A. k- {" j6 a4 cdriverClassName=”net.sourceforge.jtds.jdbc.Driver”+ P7 C" y) q* r  F% ]& M4 G* A6 J& y
    1 Z  W. K3 g( i  N/ r+ w# y
    username=”aa”2 c% E/ R  \5 N
    4 d* A/ j2 L: W' I: T( e( x# H1 N
    password=”aa”
    1 ?2 W. p/ d) n- r4 `) C+ c
    4 [( U8 Y  L3 c. @maxActive=”50″
    " H# Z5 F: t' b, X, C8 q
    0 ]0 K$ f  y  EmaxIdle=”10″, v! m3 q% W8 q1 v3 a' d6 \5 E: [
    7 \3 ]* @( ?2 {  ]3 H$ b8 M5 G4 Q0 |9 U
    maxWait=”-1″3 J) O8 l* r7 I
    % u5 D  c$ {( C5 B) o
    />
    0 @; }& ]! K" M' h- {/ D
    : r2 E  w. T: J/ r/ w5 F& m8 }% n+ H2、配置自己的web应用的xml文件6 W7 B! k$ `) n; Q( J

    - b  V: c9 H- P, n2 e 3 j2 S5 |+ @( p( ]
    2 h+ h9 n8 G1 ~) Z4 X6 K' r
    <Context path=”/eb03web” docBase=”F:/workweb/eb03web”
    4 h5 k: N. F- y" i7 J; H* n, J; A9 R4 N/ F
    privileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>
    0 I+ ]; V$ B( C+ Q$ S0 y) @/ L% c8 Z" d
    <ResourceLink global=”jdbc/company” name=”jdbc/company” type=”javax.sql.DataSource”/>" Q  R& y5 C+ j* |) `4 B
    : R4 U1 Z$ t4 k9 g# @+ |
    </Context>) N  O& I8 U$ ?

    3 Y2 ~$ }; O, b # z# e+ i$ M3 x! @# c8 y3 K7 d

    5 P) Z2 J; E8 E" A7 P; y3、配置web.xml文件
    9 S6 y+ W; l3 ^6 v) ]( f& _: @' k1 a# Q. R5 s
    与服务器建立连接. n: |* q% f" _, ^1 i- t' s
    9 ~" `5 h; `) M
    <resource-ref>
    7 [& i% e! A3 y" @( f+ [6 b3 E3 Y9 z1 m9 Y# @. o
    <res-ref-name>jdbc/company</res-ref-name>
    * F0 C: y$ Z6 K' C4 G; B
    2 e3 p2 W8 l5 K& T<res-type>javax.sql.DataSource</res-type>
    4 W! C* [/ s: D2 D
    & ~' c4 i( C' Q; H0 S<res-auth>Container</res-auth>- m$ g% R. Q* x/ u3 K# V2 Y

    5 d8 e' W. W% I1 w, d# }* D</resource-ref>) i) i$ G! s- X+ N5 m

    ( k0 f+ [. l7 f' `- k4、在应用程序中不直接与数据库连接,通过DataSource连接池建立连接
    " h' p5 E3 u7 D/ M9 V0 [
    % @  x) r1 _' n' `: z1 r3 _" {% ]4 m9 q//1.在程序单独用时设置系统的属性,在tomcat下可以不用配置,
    0 A# C2 G( l) R' e, B1 H1 P" t) ]/ @  J1 v9 w6 }
    System.setProperty(Context.PROVIDER_URL,””);
    & e  }. Z# j9 Z; T# D  y- a
    9 {: F0 r/ d; ]$ @  }/ U) TSystem.setProperty(Context.INITIAL_CONTEXT_FACTORY,””);5 C% L1 T) d% h' r* K6 r+ a
    ' `, g' c# Z2 \
    //2.创建一个上下文对象
    - k. S* b) h; P# X2 r, I* H0 v
    - ]& g7 {% b. m& A& c, W" R$ MInitialContext context = new InitialContext();
    " ^$ \: w/ @# S5 Z; k5 @5 n" c  L! F6 x' T! _
    //3.通过上下文对象在连接池中查找DataSource
    # W. N: |$ s* ?
    9 x* s3 e# ?0 g! h& @DataSource ds = (DataSource)context.lookUp(“java:comp/env/jdbc/company”);) |% i% o" O* \
    : y% _" z/ b+ \/ n- ^# L, Q
    //4.通过数据源建立连接) w  ]/ ~2 Q8 Y# c% u# b( [. C" |1 p
    # p5 p0 m6 r* x1 w
    ds.getConnection();
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    15#
    发表于 2014-12-03 12:46:30 |只看该作者
    ORM对象关系型数据库映射9 ]# M/ v- D) H! S" _! W0 z
    (Object Relation Mapping)  [6 z2 Z  H8 a. \0 k5 a( @

    6 `( z, J/ F3 {- c+ u, Z一、映射的特点
    ' W+ T/ [& V6 T
    & q+ G: W* f& U1.一个对象可以对应多个表7 D( j9 @/ J, \

    ' W8 x8 G0 I/ A; M+ U0 U5 ^. d& t2.一个表可以对应多个对象
    # w* B. v: I  n/ \0 |/ j  E* |: l6 L7 K
    3.对象和表的关系不用完全对应
    . A* C( V- t+ B6 P
    6 m" u% X4 x5 o% T9 f/ z4.对象的属性的名称和表字段的名称可以不同
    4 }) J/ i" x6 o* c/ d: J$ O0 s& }( x  E% m+ ^) t$ i
    5.类型可以不同,但数据类型之间可以转换
    8 \0 B# \# S" F
    1 h* [+ W1 U( N4 o6.对象中必须有主键,数据库的表对主键无所谓
    , b/ H+ j7 l% A: r: d0 u  Q* q
    " @$ N+ T& Z$ f7.数据库中有主外键关系时,对象中可以有,也可以没有4 V% V4 M8 C6 b% ^
    0 w% ]$ T3 {; {( z- T

    5 T( {7 ^% b8 l" y( z" u
    ! ?% t( F' ^& c4 G  K% W9 m二 、有一个映射的描述文件————>xml
    ' C3 F+ A* ]  D7 i4 e
    2 ^- V4 B. N, Y  o/ l三 、怎样实现描述文件————>一段程序
    - ~7 Z, r  m7 U" e( K
    3 P( K5 B1 q7 E' v  s' v, o; i对象 映射(mapping) 数据库3 {) ^. [8 c1 |3 I$ {" H
    ) N6 }: l: f1 T  ]
    user
    7 a5 R9 t7 o$ P5 E5 R) _# c
    9 M) v9 O; V5 W4 C! i  Z* Kid=11
    ( |; w) w, R0 N0 I* A3 f' f. z6 p8 J! B3 O6 @8 e
    name=”张三”———— > (1) —————> tbl_user(id,name,age,tel,address)- Z1 I7 m2 I- b

    ! w) F8 x" Y# n$ q7 d$ c; yage=25 <————(2) <————
    ' U9 E+ J9 G; l) h8 P. H
    " Q/ s3 l) n. I/ L/ [ ; z# n/ d' |; E, {: k9 D. B5 v

    $ p) Z0 ]3 p! u& u* r/ u( U5 h8 y(1)从对象映射到数据库7 A9 e$ V. o/ _+ r  {: H- K0 ]4 W) R2 U

    % L' g* S, A) E2 `% F: H8 S; K1.JDBC: l# B" `6 F: L2 W
    7 U0 K" e2 J4 O: R  b
    2.根据描述文件来动态拼接sql
    2 [& R$ D' a. F1 X8 |, r& ]% d
    1 W( d; H( x( v0 t: [& |( I3.执行,添加到数据库中
    3 z1 W8 M9 j$ g% e8 c+ O0 L7 o. q# ~
    * p0 U& |# R6 e5 y
    / A; O/ @( l0 D/ ~; J. \
    ( _( g6 ]- H" y, o  \(2)从数据库中映射到对象' {6 @1 X' }% Z0 u1 r8 K2 U6 ?

    5 d7 J2 u2 K: M1.JDBC
    7 m5 ^$ r% }5 d# b0 s1 m& y" \
    - k- ~, ]7 F' C( m6 V. x  W+ a4 R) J2.拼接查询sql& a. q0 S) M) H% y3 N

    . x  l2 K7 D7 S; U3.ResultSet
    7 d- y* [+ K% u# A9 l; |& D  b/ m$ l, t0 F7 W
    4.Model
    " N0 i4 w! A& F2 V8 t( B
    ( L7 R! m+ r  N9 x4 \ 5 ~5 D/ f' _) f  J# y8 V0 ^/ H
    2 K$ J' Q% t- Q- ^& P1 l
    hibernate
    8 T% |1 `) D; W- O, w$ w* T$ s- u开发流程:$ t+ }; r6 F! B4 N( t8 U
    ; K1 d# a1 k! ^" B6 w
    是什么?# Q+ x7 @% I: O: w
    hibernate是一种基于orm 的轻量级的框架
    # \! J$ `! P2 }" _3 p6 G
    ) R# l2 O" Y' C* \* A4 S& {
    $ @" Y: }( B( j  W# B' K% T
    * w* R) R4 d3 {有什么?% r$ k; N$ q$ h; e6 R7 S; |% ]5 f& P% `
    1. session 保持连接状态(依赖事务和连接池)5 ~+ e/ F5 u, n9 L' @

    4 E& {# F$ l( Z2. Transaction事务
    # a. W" B8 f2 H( U9 M
    & [- b+ l$ {4 A$ E9 q3.% m# l, S, S3 ?0 G
    Connection Provider 连接池' j! _! f: j- L% F% {

    2 Z  d# I2 u. Y. X/ q" k3 h% S' A 8 Z, n  z0 \5 ^% E5 T2 H' N( v
    + s3 M9 W) Z' l% d- D6 Z' c. d
    能干什么?
    $ a  y2 t$ v3 ]+ G3 s5 o/ s" \7 q1.orm
    7 g( c, O0 K% j$ F" _% P
    & m3 w* @# m0 Q2.提供操作数据库的接口,简化数据持久化的编程任务
    ; ~& q3 J: Y+ r& v7 F& y) c$ f# Z7 `. |- \
      ?# ?4 r% x: R: b6 U; b2 x- m
    / ]7 L; ~3 {/ {/ r8 b7 ]6 N) N
    怎么做?$ L/ [2 V+ K: B; J6 y: Z) G
    1.搭建hibernate的运行环境,将hibernate的包和hibernate所需要的包拷贝到lib 文件夹下
    ' `- l7 |! |  e
    + I. G/ |) o$ I& J' l) K2.O(vo)
    + e. P. I9 x) h5 E( J! @1 ?7 }- D
    3.R (关系型数据库中的表)
    3 U% L* A4 Y& F! X* `! N  w+ w4 l. [# G1 h7 U* C
    4.配置文件
    3 i* x3 e) W/ T% ], I: B
    / X. u6 @4 l. E/ E* n4.1 cfg.xml 放在classes根目录下,默认名字为hibernate.cfg.xml
    % ^: [; \) A( c$ u3 H" f: T
    , e9 e+ j4 l$ W+ n# X3 O/ Qa.与数据库的连接
    " ]. u2 l5 E, ]3 ?) x/ E* H* a/ W9 b; B5 q( I
    b.可选配置3 Q- P& Y- ~0 y- E2 @

    , h3 Z/ y" ?8 H# h7 P$ kc.映射资源的注册' M0 q6 _6 x9 v3 A
    ; \4 k6 p3 S2 j. |% s' |4 Z- W
    4.2 hbm.xml文件 名字与类名相同 并且与类放在一起
    . o# }! t9 w0 S  N  f% V. Z/ t- Y, Y/ i2 Z0 n" C
    a. 对象与数据库表之间的映射
    " d' B" D$ v* O1 `7 n. @7 K+ o" E. S/ d2 k
    b. 对象的属性与数据库表的字段之间的映射& ~; N+ V5 L/ O7 n& A  D& K6 T

    ' Q2 _4 J6 @; V4 q5 _3 }/ _c.组件之间的映射
    4 w. r: `/ L: s6 T- d4 ~- |; p% j1 |' x- j4 S4 e
    d.对象与对象之间的关系映射
    : X7 W( ^' y# Q: B$ J+ B/ s3 M- `9 o
    5、客户端1 ^$ |9 T2 C8 }

    ' s, W# j1 r* \* u, z1.得到SessionFactory
    - J* ]$ l) V0 C) I
    " c/ ^3 d; q- |2 H2.通过SessionFactory 工厂来创建Session实例
    & a& F& h$ G) l5 d8 Q3 i
    % ^3 K' O, q: w" G' ?# p3.打开事务1 l6 ?7 S- [7 u7 n, Y* n7 ~
    5 j% v8 k& r, q" H# I
    4.操作数据库3 j+ J+ J" l/ @. O
    * x* C. o  K# X. c
    5.事务提交
    6 F  j4 ~5 N3 [2 ?7 Z- m" _) z. H) |2 T! Q
    6.关闭连接
    - \$ ^. ?. y) V" A; Q4 B
    1 d% l  `8 L" M* b6 F运行流程:# [8 l2 `3 E. ^. z8 C% ?6 u; H+ T
    2 F& K0 U- J/ K6 F
    整体流程
    4 |! W! L/ ^- N! q/ ^: W3 K1.通过configuration来读cfg.xml文件
    5 u' ?( W  U7 \1 X7 ~; [/ s
    $ L( |: R9 R$ V  n0 Q2.得到SessionFactory 工厂(根据数据库的连接来创建sessionfactory)
    ' q) o' G* U! ]8 N2 q: D; F' u4 \! n+ P: b
    3.通过SessionFactory 工厂来创建Session实例" o' x& K8 S$ f/ n9 c. _$ B

    ' h4 `' ?0 D$ [5 A' r$ f- {4.打开事务
    ; p; K" l/ C+ W6 P9 n. r: C1 p9 P1 k4 j3 ?) l# f- F
    5.通过session的api操作数据库5 K% [! x! x9 k/ a" l& s
    * K& t, n7 }. Y; b7 I7 G' V9 ]/ x
    6.事务提交
    ' y0 s. G0 `6 j1 ]% C$ M/ r( A& w" ^/ r8 p( y! {1 b
    7.关闭连接
    ; v$ s& x9 |7 K! A& h' ]# ^! G2 ?" M1 h' d4 {: }! |

    7 I+ z: [0 K' _: R+ I
    5 o/ Y: f! z' csave
    8 f6 E, {6 g; o" E% Q1.to—>po& T* c# {, Y0 _+ _8 p
    : _0 s9 l2 e! A) e) i/ r% g* [
    2.根据model和cfg.xml中映射文件的注册来找到hbm.xml文件* s* f+ p- W3 @) T8 _  x" x
      O- \; M; g  V
    3.根据hbm.xml文件和model来动态的拼sql
    & R6 E: S: q- m3 z0 p$ r1 Z4 b
    ' X: i# t' H; B. V. U& Z- I' _4.客户端提交或者刷新内存
    % N" K" A& Y; ], \5 M6 {) H$ [  I/ W  T
    5.执行sql,值放到数据库
    6 o" O0 m& N9 H, Y0 a3 o3 d" H9 D9 M
    ) z/ B. l: X" x$ W8 P
    ! I. Z- L& Q# o% ~5 L7 a8 w; R- m! L
    update、delete
    ; r0 C9 C+ ]- Z9 D4 Q1.根据model 的id在内存hibernate的缓存中查找该对象" G# |" N( a9 O4 x% {+ l4 h
    + R$ v/ x; A6 j! K* v
    如果内存中没有就到数据库中查找来保证对象的存在
    0 |7 q3 T/ x1 L1 b. ~0 Y$ i2 P6 J9 o6 P6 P, |
    2.根据model和cfg.xml文件中映射文件的注册来找到hbm.xml文件4 R; q* U& Y, ?, [" V, F
    , J( x$ }$ S; g+ F, M3 r
    3.根据model和hbm.xml 文件来动态拼sql
    , y! J+ M$ s# N& C6 U0 ]& s$ x9 K7 ?5 E) H
    4.客户端提交或者刷新内存
    . Q, \4 v$ X+ H" z# {
    - T8 A2 d; f! h) S, \; X5.执行sql* ?( l% C1 g, F2 d

    " s* Y! K/ A5 r; o& q5 d7 I9 k' u 8 w+ ?* ?( M0 K4 f2 I2 u
    7 c! X0 x! Q6 e. b4 I
    Query
    7 ^+ x7 l( M# w7 i. iload
    + a. c% n! m! ]" s
    ' z+ X7 A2 s2 F& f7 {9 r, Q$ r+ g1.根据model的类型来找到hbm.xml文件
    1 g) I1 i$ O" @2 |- {
    ( b" x  m. M2 @/ b: g$ C3 v. V2.判断id对应的对象在缓存中是否存在,如果存在,就直接使用,如果不存在就进行下一步。5 H. m' s1 l2 a7 B- e/ X9 @" n( ~; V
    * ^+ w2 H4 X$ `. X  N4 T/ M) r4 C
    3.用id做为查询条件来动态拼sql
    $ @2 x) A' @' j$ g* L& q8 _9 @/ e3 Y$ ^. r: M+ X# }
    4.执行sql 查询(先在内存中查找,如果没有找到(会抛出例外),就去数据库中查找)
      M5 F' g0 c8 |0 ~
    " N% Z# f+ P/ A- `$ j5.返回一个model类型的对象
    / Q7 ?9 D. w# }: C% S, l9 x/ L* X" A0 Z: C  e0 J, ^- P
    get
      A/ I# W# v' R# H$ H) J  ^1 W; l
    & `+ h( G% j: @& n8 [    1.根据model的类型来找到hbm.xml文件
    8 ~: I0 d' I5 a  r; H; K- X. K  t0 K* B* e: M- {0 z
    2.用id做为查询条件来动态拼sql2 a& ?1 x9 U% _1 t4 C: X5 o
    % A6 z  B5 F' R8 E; ?& R3 \
    3.执行sql 直接在数据库中查找,如果没有查到就会返回null1 n- F( s& |1 [# _
    * r$ V8 G3 }& {8 J5 {4 C2 K* s2 ~
    query
    " H! ?1 \% Q- X$ N* E  L8 @+ y
    % Z" `& t, K% t0 S" M2 Q; F1.分析hql语句,得到model的类型& p7 x" c# ~1 j! s# i' b

    1 j8 V5 t( o3 X! ^! L, y1 D2.根据moedel和cfg.xml文件中映射文件的注册找到hbm.xml文件
    & G  r2 J! i7 K) S) Z
    2 k( L% K  d5 E) M3 d5 m+ N3.根据model和hbm.xml文件来动态拼sql- y! p0 e, c. @9 {* m

    " z, U5 m" M0 [0 H" R$ `% T/ V4.执行sql查询数据库3 ?& z2 H6 x' ^6 P9 Y
    4 F7 m; \- U3 i) u+ ?4 ~- J9 X
    5.返回一个resultset
    3 o* B4 f+ f3 x2 |/ ^7 t
    1 M5 P8 E7 c, X: r6.循环resultset的值,放到model中在放到集合(List)中* N5 p% c6 ]3 S7 J+ _
    ; ]" r: B9 M7 ^

    " r5 R$ Y, {* G8 \2 N; m7 c/ K; |2 f
    谈谈hibernate缓存机制
    & ^: x, p  x7 F! \, Y* F; _7 M' m! \. X0 A6 ?  h& X2 x" Z
    缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了。打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去数据库中取,也省了很多事。* j  r: a; M7 J% Y' x

    $ V0 q/ m( w3 B9 k 5 t% E& H3 p, f: m6 l

    . ^( ?5 F% n' Ahibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。
    ' ]; b5 _, x4 ~( [& ^7 @' k
    8 W6 x) }# V7 x/ k7 x" ]2 g
      m! }/ @; v, ?" v7 ^# N/ Y
    $ a* M9 ]' s& R( z3 h* |对一级缓存中的session事务进行数据的预存取,数据在各个session的上下文中存在(单例),当session关闭时,就是session.close( ),整个所有session范围内的数据全部清空;二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二级缓存只有一个区域 ,画个图比较容易理解。7 X5 O" Y$ [5 I8 `$ h  S

    & p, Y" h; n: \/ Y- F
    $ k& O7 ?: \7 D  p% s5 j
    6 q% S; H+ }$ H6 w. k4 s) P$ ?& r| 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|" m4 m) Z& `- W& F0 d
    + R% R+ [( n2 h$ D9 z9 m7 C* `1 H
    | | | |* f; l/ N7 O' h9 g, m/ ^1 Z

    * S$ ~/ T6 Z; P7 P, V| | | |9 y7 |7 b4 \$ s, w  d% K+ k. o
    * o% B% F6 C0 J5 z  c- C
    —————————————————————————————————
    ' D# ?* D  S# F6 |1 B
    / ~6 S& J( V, Y! @1 WsessionFactroy级别的二级缓存6 U) V( x, p+ |2 M
    , I4 f' G7 X5 C4 F" H* ^) z5 @
    ——————————————————————————————————————-# \1 {% j( P# u$ `8 [

    : Z4 m( }4 s9 ^/ k6 |' X|/ G9 b: O5 Q' w( t( [
    0 h! M3 l/ R) c+ W2 t" p$ O0 Z- k+ b
    |
    7 u5 r2 D+ X7 f  |& X6 m% x( w$ F7 V. i5 q
    |
    9 l$ x7 h# Y$ `5 _" O
    4 x: z) G8 ~) w7 ^( A——————————————————————————————————————6 _/ D. G3 n6 g: H/ D7 D
      T, D, R, L% l6 `. ?! z
    DB( E4 w: U7 s. X1 v% \
    1 Y* j) i: W  _: y
    —————————————————————————————————————–) \% U& x5 h# s7 i

    ; D) w' Q2 b7 z% d1 i! z- Z- u/ @
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    16#
    发表于 2014-12-03 12:48:12 |只看该作者
    Spring+ n% K& _6 k/ |* {3 o- n& `3 E( t
    • 是什么?
      - |1 j$ @6 E& y2 d$ f
      0 I- b. _- _! R& h4 T5 ^  K/ G

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


    3 E& t4 l" h) J- s, ~: I% C
    • 有什么?: C' r0 P/ R9 ]8 ?

      - r# Q' i0 y, J9 Q9 O

    4 F$ J, l* H& N5 J! G

    每个包的功能:

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

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

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

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

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

    AOP :面向切面编成

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


      {* ?* Y3 d$ `. p& @9 a" Y3 n
    • 能干什么?- M8 J. ^9 q. x5 V  F! ^
      # r8 V, |5 J% n# u7 B& `

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


    . e% r% j8 Y* @
    • 怎么用?
      ; \; c% I) b9 X# D- U
      3 \8 [1 j, ~2 }6 |6 ^" V+ i
      • 搭建web工程,引入spring的jar包
        0 p2 z7 w  r. {  V
      • 在web.xml中添加如下配置( v8 k; O( U# ^* o

        9 J6 h& Q3 r  Y  k( h
      " I/ u) B. B$ T' E% W+ q

      9 f. q; M: O; N, [! W! @. ^

                contextConfigLocation
    * q' S9 f% s/ q% w

                classpath*:applicationContext*.xml9 }# @( U4 e% u5 k6 f1 u- @8 _2 m

        % G! B7 t3 x5 i4 R/ ~- i

            ) ^" i2 R) T0 X% w: {* C

                struts20 `' W4 Y5 c$ \# @3 E) A

                7 ?2 C( m3 \4 _4 |

                    org.apache.struts2.dispatcher.FilterDispatcher
    6 ^' N) v" U# u" m

                
      y, d( P" _3 e6 d+ {9 [& M" Z* j4 p

            
    % A- s' ?' o) e. f

            
    ; p; I& y5 ~4 Y+ @7 R

                struts2
    2 K; z  ?" L3 k6 h# v& ^% c2 q- c

                /*
    2 s: p7 a  U4 B  f% a


    ! V1 r9 V; I+ g; K& P

    7 ]: r6 j3 \0 y

                
    ( B2 ]+ ?( }- E' `+ _. z0 D* \

                    org.springframework.web.context.ContextLoaderListener
    & e: j8 J4 t: q; v7 x. w. m

                # S9 C' b" r4 ^) z( j

            

    • 部署
      , \# J% \; h) c& r- W3 t- N
      5 W* [' O- T  N1 K9 g
    : T5 _4 v: K$ r

    * S' A  s/ w% ?- N1 T
    % W! E/ n: f- Z' {0 f
    • 容器和bean
      5 }4 p9 B' s! ^0 N! Z6 w* X2 d

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

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

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

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


    0 K) F7 ]: s; F; ?5 A  {7 S
    • IOC控制反转
      * h2 n8 |  s9 |2 n, i- \
      ! {9 i! W- m5 @# Y- A1 n
      , ?, E* e. i" u, B
      . a. s' x7 R" q% y9 A! ^
      从前的应用程序想要得到A的实例他会直接主动的去拿,当用了sping后,应用程序由主动的去取变成被动的等待,由spring来控制应用程序所需要的对象

      5 J8 m: m8 G  p
      • IOC的优点
        5 V2 H. M  T/ P
      1.可以通过IOC来获得实例
      2.可以通过DI来获取注入的资源
      • 配置IOC的原则9 K1 l; P; F$ e$ @5 C) r. |
        • 一定是可变的资源才采用依赖注入
        • 一定是层间的接口或者是模块之间的相互调用才采用依赖注入
          - W4 L7 C* o2 b; ?) o3 Q; s
    # u. j8 b" Z. ]9 U0 Y
    • DI依赖注入
      2 {, v% r7 X3 n- {4 T+ j. ?9 r4 a1 j

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

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

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

    例如:

    在配置文件中


    . i1 f' a! A) v- i, E7 G0 c, j1 i, y$ H! F5 [

    ' G9 ]/ u  l% T. J$ ^

    在应用程序中

    Public DBDAO dao ;

    Public void setDao(DBDAO dao){

    This.dao = dao;

    }

    3.构造器注入


    - L0 Y8 M5 T. i6 b( }) O, A$ |

    4.ref 表示参照其它的bean

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

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

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

    6.lookup注入

    7.singleton

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

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

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

    8.DI的优点:

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

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

    5 X( }. Y- T9 F) j8 I% b
    • Aop面向切面编程
      6 X% E$ E* y4 @! w! z0 R! f

      ' c% v1 {& |0 v/ O8 e

    1.AOP面向切面编程 一些较好的模式或者是示例—-范式# a* V8 I# c) F

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

    2.AOP的思想: 主动—->被动(追加功能)% |) S9 x& q  a' y

    3.AOP 的概念
    + r# }$ S- i, O: ~# _

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

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

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

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

    5.引入 :扩展的功能

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

    7.aop代理 :实现机制

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

    4.AOP的事件机制
    ! D; N# l& E$ d1 G6 Y. Q5 J

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

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

    3.找到切入点

    4.确定连接点

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

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


    ! V6 I4 r# @- U. M. k9 I$ X
    ) i! ?5 B$ v% Z" ^) d
    2 \; K. Y8 v1 m9 T
    3 H3 |# C1 y4 b% Q0 f9 N/ i# k& \4 C( L0 t& L* v
    6 O; p$ \' Y# {2 d. Q+ O* C

    0 i" {( f, k; _4 h

    5. AspectJ
    $ T3 ]  @3 O' U% e

    5.1.在xml中配置比较烦琐6 ^; G5 ]& F, c, c( ]

    所有的入口必须从一个代理(ProxyFactoryBean)开始
    . {) _  g0 C  @+ w

    0 F" b' Q. m9 c4 T! {: n6 r
    7 R/ T4 H! x2 ?9 o) g

             . _$ V- x8 t8 n

    . n" H6 f5 }  l  m. H# D* E
    1 E# c. o$ N4 w         
    $ @# j0 K# }+ C$ o7 ]9 H

            
    ( ?6 {# E# t! B3 R

            


    : m5 p- a) E# {. gexpression=“execution(* com.javakc.aop.MyTarget.t*())”/>0 K( Q$ p- q4 O/ ^

            7 {# j' t" c4 u+ A' n; P( N

            ) b# q! `% Q( W7 {) Z

       
    3 C0 c' w  V4 l+ [' j) k


    ! I: g' ]. {% _9 h* {4 a; M6 y/ g6 ~

    5.3.使用注解的方法相对简单8 A0 S+ o3 e  M6 |; V/ i. s' E

    @AspectJ的基本语法
    ) N4 L( n5 H% s% e# C7 X+ L& J

    1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面
    6 j0 i. c7 V; g4 {3 m& q. }

    直接在类上定义@Aspect
    5 ^: M/ d8 x( U0 C! a

    2.@Pointcut声明切入点
    + y( J0 z1 P1 {* [4 w

    2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字% h" c9 W. `7 ^8 r

    2.2、可以使用匿名的pointcut
    1 }4 k' Q* ^$ s3 H' v+ u9 K4 r) N

    2.3、执行切点的几种方法; q5 v1 ^4 Y! F) S  T  ?- K

    2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法2 J  y& u: i! G$ v0 H

    2.3.2 within 指定到包,不能指定到类
    9 _. \# W9 @8 P8 R8 ~

    within(”com.javakc.spring..*”)
    1 q) Q5 k* Q1 y0 Q% e

    2.3.3 this 指定到实现接口的所有的实现类
    ) k" V% N* H! u4 j1 n1 Y

    2.3.4 target 指定具体的实现类" D. u' o6 Q. I. b0 v( p1 U3 p

    5.4.advice的五种类型的示例9 I8 v8 n3 w7 {; z8 {5 f

        客户端必须从接口走才能得到监控,实现想要追加的功能
    & u( y6 P/ f' z2 A4 [$ a, n  C

    5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)9 B- `: O' `! w4 I

    追加的方法的参数名字一定要与retrning的名字相同
    + F7 E: W1 H) J

    在注解@AfterReturning中必须加上pointcut和returning两个参数# a) x  o/ j  x4 \

    pointcut指所要监控的目标对象的方法
    : H1 R& J3 D) I( x/ E0 w

    得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配5 }% o+ H) f, B% n

    完成追加的功能9 f$ K$ l& K' e

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    1 a! i# G8 N6 j+ d# N# y

    (1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)
    : N0 p  o; O" C+ h3 L5 q

    (2)., _( V* R( w7 h  P& C" M

         2.直接引用匿名的pointcut% J, ^, t- x! g7 |6 n" M

         (1).@AfterReturning(“execution(" D& u8 D' d  E2 `. I1 A/ y

    * com.javakc.spring.schemaaop.Api.test4())”). e9 U; z8 `- R0 k- }; Y

         (2).@AfterReturning(pointcut=
    & P+ I( w1 |. W  A3 Y) t9 i

    “com.javakc.spring.schemaaop.TestPointcut.t4() &&3 o; j! W; p0 O, e' J

    args(str)”, returning=”retVal”)+ I7 D- f! I' `# U( t6 k/ Z

    @AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)
    " ]& z/ ^! M: [* e/ ^, a) u

    public void testAfterReturning(String str,Object retVal){
    + B# X' w; O9 _' L" b" @

        System.out.println(“afterReturning1=>”+retVal+”=>”+str);
    4 `% N& G' S7 V

        }
    / G, e5 t! C- I: H( d- u& d6 S+ c- C

    5.4.2.@Aronud
    : O% A* ^9 ]/ {9 B, i

         注解@Around环绕追加功能;/ f' [. {+ o$ b( p

         在执行目标对象的方法的前、后追加功能;4 i4 u3 o$ V5 [" w, o

         必须有参数;第一个参数的类型必须为ProceedingJoinPoint;# y/ X2 `& o0 }8 M5 P

         通过ProceedingJoinPoint的实例的proceed来调用所监控的
    : ]6 q+ G2 L+ U) O+ `" j% p8 V% N

    目标对象的方法
    9 o3 G. A, k& P

         1 定义一个pointcut,通过方法名来作为pointcut的名称来引用& h7 j6 x. x. r2 S& j

         (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)2 ]0 \9 T- _* x

         (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()
    ) ?$ @3 g# r( H  }6 Z

    && args(str)”)5 u, Y( r( n6 L

    2.直接引用匿名的pointcut
    7 m1 @- p  c( A" J1 a/ t" \

         (1).@Around(“execution(
    % m+ Y, g& e( F- P8 r% Q

    * com.javakc.spring.schemaaop.Api.test1())”)2 V3 ]5 U3 R2 V% I

         (2).@Around(“execution(
    & Q1 q  b, E/ s' Z' V$ W" s/ W9 U7 ]

    * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    " c3 L0 r) g: b% V

    // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)1 L# U4 C" G8 K, Q3 M, p/ k

         @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)$ p4 u" h+ W5 l9 e* E

    public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{
    9 k/ u" s5 G9 E. ]& W! g

        System.out.println(“around1==========before1pointcut==>”+str)- S' _9 G: F5 a6 u

            Object obj = prj.proceed();
    , ^5 w5 _% f2 k$ l

            System.out.println(“around1==========after1pointcut==>”+str);
    . l0 l0 Z- Z8 Z' ^7 W( K- L

        }
    0 f. S- c  i* D4 v5 K

    5.4.3.@Before
    ; P' N3 _6 x3 D5 b; r* N- P

    注解@Before在执行目标对象的方法前追加相应的功能. W; _6 c" `8 T  ^2 X) `. f

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    ) |$ [# d8 P. q+ y8 d; E

    (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    ; A) ~' X$ [4 @! U% y. z2 O

    (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)% _0 R# b6 ~5 A& J% F5 d

    注意args后的名称与参数名相同; j; s/ K) M5 V

    2.直接引用匿名的pointcut% b9 n. F: Q  ~. z7 A

    (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
    # V! s7 z, t' P7 U  X( w: J: E

    (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)2 Z6 I# f& ~3 u- H  X$ _8 X

    注意args后的名称与参数名相同7 I) |! B4 }  C0 f9 F% C; \6 a) g

    // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    1 T2 b: d7 L+ b! n

    @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)9 T" E( Z- x; H2 c0 P3 _

    public void testBeforeParam(String str){
    - w& C3 N' K; S5 P  ]$ f5 w

        System.out.println(“before1=param=>”+str);0 Y& C) H! T# g4 r# b0 x

    }
    5 g# @0 G7 [/ n* X8 y


    " a" {2 _2 F+ E) x0 L* `

    5.4.4.@After
    6 i. N) ?& B9 i' k+ x% g

    注解@After在执行目标对象的方法后追加相应的功能. y0 h/ E: B, m/ ?' }+ E. z" ^

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    ' z3 J! N, @( D5 Y

         (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)/ B4 K" p9 u; l; {

         2.直接引用匿名的pointcut
    ; l. u. Y$ @0 `+ }

         (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
    : X) O. A, m/ r5 \

    @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    + S2 v* u" L' j: J$ J* j$ U

        public void testAfter(){
    2 J% Z9 D) q# _4 N2 y5 z

        System.out.println(“after1== >pointcut”);
    & J9 n- K- R$ n$ O( A

        }1 C: E9 b) a; ?! u+ I  _& A

    5.4.5.@AfterThorwing
    ; q1 `3 @! L# E+ g1 p1 C

    ! }; ^- T' I9 Z1 K- o0 j+ h5 f

    + ]  i6 Q& q7 i. J8 t
    • 描述一下spring中BeanFactory和ApplicationContext的差别
      5 b! N* I  S7 A+ O7 W; I# }  c
      $ j9 f; w$ ^5 W1 }

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


    / A0 k# C  B/ _, `/ U& v
    • 谈谈spring对DAO的支持
        k: Z; s" v4 `( D

      " ]9 ^, |) u- T

    Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。, `; w1 v& W- L3 a8 r1 I7 m

    简化 DAO 组件的开发。
    ) d; B7 u7 s" w' Q! `! JSpring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。( B+ ?9 A- x5 h  U4 y

    IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。: k8 ~" k) @& x' P! U

    面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。
    2 u+ W  b1 ~- d

    方便的事务管理: Spring的声明式事务管理力度是方法级。
    1 s' S6 T) u* V* e$ E( l

    异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。' H2 W  x1 |- p9 A9 o# K- U+ b) C* x


    ( c1 ?0 z% H, Y% e: D" S5 U) {6 B, D
    • 谈谈spring对hibernate的支持6 w; N8 d! E; \  ^
      $ ~3 Z5 x& \: n+ K( V. v: Q

    在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。: |: O, Y3 h9 p; M; G$ o1 n. l

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

    1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:) g( \  s" {2 D

      a' N; i. M* o& v) b, M

            class=“org.apache.commons.dbcp.BasicDataSource”>' ?  v( g3 y4 G

            + m4 J) t  Y" r0 d. L

                oracle.jdbc.driver.OracleDriver
    0 p+ K% _* E3 x# j0 ]

            
    ; }8 h0 k% A/ j6 u  o

            ( e1 ^! l: \* _! w1 A: K8 ~( e

                jdbcracle:thinlocalhost:1521rcl: U# C" {6 x3 @3 @

            
    ! n8 W& Z, Q; e

            
    $ P( e% ]1 @* Q: z, j

                javakc2
    ) P5 e  K( ^- L$ ~

            - _1 P& A8 z# m: g$ p1 z

            * D4 N) K7 H0 h7 o

                javakc2& R/ M* i) d& A( X. k: }8 I

            
    8 L" o0 m9 H, d8 ]5 U+ E

       
    7 x1 E  O* T9 L; v: f+ g- k9 |


    4 S- `8 E9 U7 g% ^! t

       

            class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>, V: C5 s2 ~7 r2 w% w9 ?

            
    $ j4 k9 f& g% P3 z$ i. h

            
    - Q' D, m# _+ Q8 e8 k* X/ \

                6 |' |- r4 D8 x  W: a, B' P2 l! Z: B

                    com/javakc/spring/h3/UserModel.hbm.xml
    # Z# ?; f. A3 X' n' B

                ( i: z# Z8 e7 r$ J: z/ ~

            9 Y+ S/ Y4 e, I  e' n" ]

            ( y. Y/ N" ?4 J- _9 q+ P" Z

                
    * s% U8 W+ O" X9 ]8 ~7 S; k

                    hibernate.dialect=org.hibernate.dialect.OracleDialect- H1 p- h9 W  |3 D

                
    # C$ w1 H' @# V  x5 P. G

            , P. ?  s  t2 Y$ D, G

       
    ! `# @8 P7 W- P! F

        $ [. O" s7 t+ y. y: i1 p" J! e

            
    % R3 O% \2 V: Q+ o

        : i; }5 q3 [  Q/ e

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

       

            class=“org.springframework.jndi.JndiObjectFactoryBean”>
    " x0 s5 `5 F1 F1 ~/ v2 F2 x

            
    " o/ k/ L2 L5 V9 J7 b. W! M

                java:comp/env/jdbc/myds
    * X; N. C3 x7 C

            7 F# c" f7 {' W' X. X4 ]2 s" l

       

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

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

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

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

        7 e) V- i5 {" |; w& y+ V8 I; |

            
    # y- c2 S3 W5 U& e

       
    6 i, V9 {) V4 S7 m. c


    1 \$ E. Q2 \% Q+ g$ O5 E+ \

       
    0 g3 C0 E/ u! j$ f1 O  z

            4 ?/ _, }0 N+ Z, M

                
    . S5 B  G4 F1 l9 e$ z

            
    9 w7 V+ y, T4 {. k# l

        ' [/ O! h$ k" m


    : W# v0 W' o, y# b) O+ n/ w

       
    ) [, n) Y* Y+ _, P6 r

            ! Z% h3 ]  G' ?; T

            ( E* O4 W! a: O

       
    ; D# P7 U$ N0 U% m0 S8 W

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


    $ ]% ~7 N' r' s3 \
    Spring2.0之前事务的写法" q7 I/ m2 F& w8 P: h. m4 U" j
    ' y* h" _% u, H( O+ b( y

    1 H6 Q" `( O8 P) z" c        class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”; k+ p4 n- @2 N9 J! N; x
    ; {- w& @( X$ ?6 t# q7 w( M5 M% U! H) i
            abstract=”true”>1 E6 i* o( L0 A% J- M
    : S# O. l& V- ~8 y
    , E3 U4 J1 V$ b$ S% x: R
    5 p0 m& [3 l$ o$ Y5 A" s
    / S! i- P' I, e$ I' X/ ]3 d
                    PROPAGATION_REQUIRED,readOnly  I; T; p* H1 {- b6 n. J

    5 i6 ]8 c" U: E/ G                PROPAGATION_REQUIRED1 _0 p; U; S5 K: x) i% f
    6 n# R! x8 j+ ~' Z7 Q/ T

    - V6 k4 L4 q1 h# E. W& C3 f$ i( B" d
    ( _5 K7 e0 I* K" u7 x6 [' K& J, h6 G, g0 Q$ W; o
    : j& k1 w- e# q# U6 d

    . J8 V$ F" z  i- q- {; Z4 ?
    • 谈谈Spring对事务的支持
      ' R, o$ Z& u" Z8 v+ v/ R* H! L1 C
      ) c  F3 s; w* `5 }5 m- o2 x% i, I


    : Z; j) y. Q9 b! f, Y" p1、声明式事务管理:

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

    2.做法:

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

    2.2

    2.3 注入数据源

    ! `2 Z0 Z: k; L- s7 N) h3 t

    - g! H0 L$ ^3 Q" }7 {1 y! R3 z0 x) s" }

    9 {0 }/ N. Y7 I$ ]9 c$ ]  e/ v( i( L! |- `* V

    . A# u4 W6 \, ~6 V1 {, w

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


    " A0 U0 f3 j  D- ^$ l% c6 S3 M; |; z# \5 y8 t5 w/ y

    + X, Q& w& d6 W# E! u' D  h

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


    4 _  C5 o1 `% p9 u
    . ]' n1 c( }; _7 X
    - @5 x$ S; e6 q4 R& i( G+ g& j# u/ ?2 I" j, v& Y, g

    ) A0 m- B/ [7 w1 f5 `

    2.6 定义切入点


    * k; X9 _# {! K' Q7 d' h& e$ C- Q+ q' f! e( y! d) [, e8 I
    2 {9 w. ^- ~7 ^- j! u+ m; P$ s2 v

    8 u- [  ]% ]+ b" O1 p3 t# l7 g  X% s/ n& I" v2 h% T

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

    1.注解@Transcational

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

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

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


    & t0 e$ w* p( {  P  @- K. Z& J5 h. \$ Q+ g! _% h# ]5 j6 \

    如何在Spring中使用Hibernate的事务:! }# d( h8 K) U$ Q# {7 {9 ?( s3 Z


    ) w# L) h+ n# Q7 F3 W) H6 W7 u


    9 Y$ S! z) Q' W) E

    , w/ z7 h( l* ]/ }( Y

    如何在Spring中使用JTA的事务:
    & s4 ?; V- b. h' f4 j6 j5 A

    8 ^5 U& L7 ]$ B3 ]
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    17#
    发表于 2014-12-03 12:48:32 |只看该作者
    事务
    8 A6 k9 S! L! a, DACID& t9 |, p2 \' ]' l/ ]# z2 O9 ^1 Q# ?
    (1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失败
    4 ?' p) S0 I& g/ l6 H8 m/ o+ a4 }8 B( H8 R: T+ y) S( v2 f6 A3 s3 A
    (2)一致性 :操作的前后满足同样的规则,保持平衡。( p/ |* O( ?$ v. l
    % R7 E+ y: L% w8 d3 ]0 _
    (3)隔离性 :在事务运行的过程中。事务内的数据对外的可见性和可操作性(必需由数据库的支持)
    : Y. U2 F- \3 e. t7 J: O' U9 O2 L2 Y0 u8 _% v* i% O- u: z% b% f
    (4)稳定性 :保证数据在事务的操作的过程中不会遭到破坏,而且是永久性存储的
    / x# L- k" n+ i7 a
    * |# t; e; j- f5 d( l! V - @. S% |3 H/ S9 u
    & H( Y+ d+ V. d
    事务模型/ ~- @# [, c) {1 q! w0 [
    (1)经典事务模型又叫平面事务模型(JDBC) 事务不允许嵌套" P8 O' v4 q9 P; O* F4 c) g* M
      e8 z7 d4 n/ i8 A5 ~! B
    (2)嵌套事务模型
    4 H4 U* F; o" f" ]+ e: `7 W  F2 K; o. o/ S: B& m. [$ [

    0 g5 d6 m& T, _, X. ~: Y" }9 U. E8 J  ]7 F" X
    事务的两种方式
    ( T1 F5 \* ]* f7 v! V(1)声明式# E2 J$ l0 x3 b* O' T- j! N
    3 G4 L; k/ F1 f/ F7 m+ G  h# w
    在配置文件中设置以下6项) r: d; \* p, c$ B; r* S4 V' T3 s

    7 |/ U. [* d7 o* }6 D(1).required
    * o+ l! ]% _+ t' ~) S  q4 l" M2 H5 c* R. Y$ C" W
    如果客户端没有事务 在bean中新起一个事务
    . ~4 A: A  s9 o3 c3 j7 z& ~, t4 l3 x% N+ w5 @. C
    如果客户端有事务bean 中就加进去
    / f! p9 {* ^# E- a" d* |. R
    ! d7 ]2 l, P' v# s# d(2)、 requiresNew  x, m+ Y5 G% Q& @9 q+ [7 _
    + ~, Z* q: b3 Z) m# B7 G  [% `
    不管客户端有没有事务服务器段都新起一个事务
    9 V/ v; g3 h5 N+ a) ~, n& o7 T
    - R, N: N2 S! ^如果客户端有事务就将事务挂起
    ; J2 l8 A! U- C7 F. K
    . O/ M* x- t- o$ |(3)、supports
    6 P" @3 Y* O8 d, p  t0 F3 E. e4 R6 z- H8 m
    如果客户端没有事务服务端也没有事务
    1 G0 c* o2 C5 o, U1 _, y) K
    ! S- G: F- v, |9 j9 r# O如果客户端有事务服务端就加一个事务" D2 t& e8 b% ]- {( h
    ' z) A& R( p+ `% e; Z3 t% R* e  F
    (4)、mandatcry, o. ~: Q. c4 N$ h0 c& n6 U

    5 l- J9 ]  J$ ]! m% J) I+ e如果客户端没有事务服务端就会报错1 d0 }9 E5 U* M  x
    * G) P+ Z0 B% a% M& W
    如果客户端有事务服务端就加事务9 n6 Z) n& Z- ~4 v& C7 [

    6 |$ y3 L1 K+ {3 T( I7 v! j7 S(5)、notSupported
    & H7 W+ d3 {  i0 x$ q: e+ \9 t' C3 `# b) Z- L
    不管客户端有没有事务服务端都没有事务
    ! l+ Y, A, f+ l2 p7 C7 H7 n6 n
    7 \+ b+ v# B* ~0 h) B0 {如果客户端有事务服务端就挂起5 p! A1 l3 w" Q+ Y- q5 \( q' x

    ( @& l0 n1 T% ^3 t(6)、never7 c5 o9 m) \- ]7 L0 n  B4 `
    * t5 }* S$ H) X6 I4 q0 S. [( h
    不管客户端有没有事务服务端都没有事务4 s/ q" J" w, v/ b+ r

    ! u, s8 P) q+ r) V/ g如果客户端有事务就报错3 P1 u" @3 z! G
    1 g- {, v1 f2 Q/ y  s* t$ H
    (2)编程式事务
    ' m: j" x. x" ^; B# K; N
    6 f8 O4 x7 e% Q/ P/ k' O! {Javax.transaction.UserTranscation
    % c% a$ x) M, z1 P. g3 B: L1 q  D! M7 S, V! z
    JTA 事务可以精确到事务的开始和结束
    : ]. _7 R. S, e2 m' y, \% F, n6 c5 t3 T; Z. w. ?: [/ L' l
    + r- V7 a; O5 _& {& J$ q
    1 S4 R8 T7 c# E- Q! i/ }) }. _0 [+ @
    事务的隔离性6 z( x) e+ Z4 A# q; ~
    Read-uncommited2 Y1 C( _* g! q$ t

    * W- X% f; h; {* ^4 |读取未提交的数据(基本上没有锁)脏读,存在不当读取的问题。( ^1 s1 L( ?( Y
    ) V* o7 y4 ^, }, R4 @. ]. L
    Read-commited5 K7 M. M1 ^8 }! m* G0 E/ |
    4 ]' b3 Q9 D: `* |  Y9 a
    读取已提交的数据(行级锁)$ ~9 R* O, X: e! Y
    ! u" W: q" K6 O+ t/ x
    无法读取已经写入,但没有被提交的数据。- ?8 w, n- k% T
    $ R8 M; ?' _- u/ y9 W
    Repeatable_read
    ( y* ~4 \. f  {% H; \3 I3 _9 y
    % q! z# U5 c' l+ d. m读取的数据不允许修改或删除
    / E6 P2 h' Q' w& V. [, P% |
    % i, A  ^/ s4 |1 p3 s2 ]3 Q不可重复读(行级锁+不允许修改/删除)
    1 W: |9 a( |2 ]
    + Y) y2 A6 U6 d' i$ A4 PSerializable( t. D' G1 J) J& p' G
    " R, ^" V0 `3 F) `4 k( r
    幻影读(表级锁)
    + h: `3 z3 x0 }: \6 `2 C4 d# O7 b

    ) x2 R1 Z8 p+ b; i$ C1 m" }& c0 b6 y
    # Z# D# S" G( L- p3 g" g, @struts9 X- a8 L' F9 C8 n
    开发流程2 I5 _5 Z6 I% g5 E- [% F. l& y
    * a3 l1 o; S' E. z5 u5 j4 O
    1、创建表单8 t, l2 C5 `  H3 o4 A5 c' M7 S

    $ f+ b4 G+ f9 Y7 |. s% v& j- C2、从表单中获得输入$ T8 ?% E  d' c" v8 a% s% b4 c& C

    6 K% a) y# {: D) d$ b1 ~3、处理输入(业务逻辑)5 c; o7 I; T2 b  R6 e2 ~* Y
    9 p2 r. l& }# `% l  j
    4、根据动态输入改变输入流( k% H  ]3 \; }1 g1 z4 U# C

    0 U  o8 _+ l9 n3 R' P1 G  p要完成上述四步,我们需要创建
    - D* U# y5 C; V9 l# E6 ]& y  B: f, p& j$ O' R& t* C) C3 X% h4 n
    1、一个ActionForm
    ; X# e& ]4 Z5 z9 c. _# s
    6 h! z+ y8 j6 \, b0 C7 N5 N7 c2、一个action) T/ K( t* L, c8 C
    # G/ r* V* B& x9 r' C6 }  R4 ^
    3、一个配置文件struts-config.xml6 O; j: I: `& n' i7 Y% N
    " ^# z7 h$ U$ s6 C
    4、创建页面5 z. a* B; H0 z$ X4 H; }! U! b. w2 g( I

    1 P* C$ c1 g: A( a& e: L创建ActionForm
      |- T$ U& q( l) I0 |* w
    ) }  E+ r5 `1 E- l/ h* I3 ?! j1、写一个类继承ActionForm
    $ L- ^2 q5 R, y6 Z% P6 p( i" Y; y5 `: o
    2、私有的属性1 g. {( _% ?6 S/ t$ D3 c0 [

    * z  @7 D; B9 @" I. o# @3、相应的get、set方法
    " Q: K- y* @$ x" p* n
    2 e, u2 e/ d3 ^8 Z4、重写tostring、equals、hashcode三个方法
    ! w/ t# m# B0 g* d& O& [) F
    * E( k" P+ Z4 f创建action$ D1 O  x5 S  N- J7 o$ I0 U; @
    ! Y& o# M( O* g0 D2 ~- l3 o
    1、写一个类继承Action# o( {+ I* I) o3 ^0 v& b2 h& p, z
    ' A  I4 J2 {7 |% y( o* Z0 p3 L
    2、实现一个公有的方法(回调方法)
    4 f8 C4 M( X  |- M( k; F0 |4 _1 N: C% o; T9 Z; |5 f
    public ActionForward execute(ActionMapping mapping,
    9 E* x5 R9 d* f2 H9 y" J' n& s9 B  n$ L% y
    ActionForm form," h2 x( w) I$ t/ G2 S
    % K: J" i4 G. P' t5 L* N# J- y# v
    HttpServletRequest request,' m8 j* g- e7 g$ j, j: l
    / V/ F( A" U, n( L
    HttpServletResponse response)# T3 s9 {) [' t, _9 |: n  J
    ! C) O1 A: u( e
    {! p" d/ a, a" H
    ! R( v& Q/ v- n- |
    //1.收集参数
    # c5 K9 O( S' Q2 u$ y. @/ e! h# ]5 L6 F* n3 u, Q2 z
    MyActionForm myForm = (MyActionForm)form;
    ; @5 i/ l. X- B9 r9 j! [1 `2 ~5 D* M0 `! R, k' k
    //2.组织参数( b& G/ J! ]; T; P: n8 Z7 ]  x
    - _$ f# Y5 H& q! K3 _( [

    1 [8 L1 l$ D9 }/ T- D4 {  b1 p% _' M" T% y" b
    //3.调用逻辑层
    3 |9 f( f9 x4 R7 y2 u
    * d  P% l/ F0 n3 a0 Oboolean flag = true;0 y5 b3 O2 w$ Q1 l( V9 e" T1 X& y
    . k/ `. ^; N0 s1 h9 C1 Z( y- s
    //4.根据返回值来跳转到相应的页面% m4 L5 Q6 [& E0 Q* T4 [4 X( T
    0 `& ~5 D. k# x- [6 m# r' X9 W
    ActionForward af = new ActionForward();
    . F! Z7 c+ C( `# `$ H+ i4 \# q' W6 z0 ]9 |
    if(flag){% D3 }2 {- [; R) Y
    8 h) \# ]" z4 B1 P* T
    af = mapping.findForward(“1″);5 o+ @) D/ w1 W1 V

    3 h+ j2 u3 [3 B2 W! S# Y' d5 p}else{
    9 f- M; a3 D0 r. g8 A" }! i. {5 P% g5 }3 M
    af = mapping.findForward(“2″);% k! c9 k# S0 O
    ! w! `5 n9 o4 x+ M8 P/ A
    }
    # ^2 W- z$ ?% ^" T) t' {+ c9 Q& Y: F6 [1 }! J
    return af;& N% o3 e: t4 v3 J$ o" P5 X3 `0 G

    2 Q& D# H: B+ ^0 [5 u2 K9 m}& D+ ]3 p  c4 g) J/ i9 C& R
    ! b, {3 T; Q) v7 e
    配置struts-config.xml文件
    & m6 D/ w5 v$ ~# W: k) h+ ^+ H% j; T: m1 |% |5 L) \  C
    1.<form-beans>
    3 ]7 x1 ?( A2 ]1 I+ A" M! F$ n0 d5 I& ~- o. H2 \& w
    <form-bean name=”myActionForm” type=”全路径.MyActionForm”/>
    6 K% {) R# t- d$ H" ?5 o5 [4 ?
    6 w) W( J# s* `' r8 W<form-bean />
    * \. K4 E- o, L+ `* k; f
    & h1 |7 v2 x; @</form-beans>
    : m8 H4 I5 ?+ b) a) k% C' `6 T' L7 z3 {
    2.<action-mappings>
    8 V, `  z6 o5 V) U
    8 ~  j6 S+ R9 X<action path=”/sll”" h; v! q2 n  ^7 G' U
    $ f8 i1 K: @( D1 `/ f1 W$ e  X
    name=”myActionForm”
    - B$ N# t2 C% E7 X) w& o3 v! ^7 C8 v! P1 D* {6 y, a; I7 g0 g- @# p/ f
    type=”全路径.MyAction”) ~! U& Q% [6 m+ q1 x7 d# |/ l) \0 }1 D7 w

    0 P9 h7 x' f* x% {scope=”session”  D1 B& d9 F/ f' k' k0 U. O
    . F4 U2 G3 M- S1 h- C5 \& ^
    input=”错误返回的页面”>
    % D' s: U% n3 p0 Z7 r: i1 ]5 C/ ]
    * L* ~6 W- g( v<forward name=”1″ path=”/1.jsp”>$ W9 }( j% R5 P1 O4 r. |- K

    / z* f! \2 C1 \" T; `3 c+ g<forward name=”2″ path=”/2.jsp”>2 m! ]  x% F8 i
    ' T9 R; d( n! P- w% @+ x
    </action>
    ' K) ^7 t( p) i. O3 C6 J7 s
    ' ]* b2 X' D$ a$ y& T& G9 M</action-mappings>
    , k+ }" A4 a; j; {7 h% ]* n* {  D! P$ X9 |
    步骤:
    5 m! o' s* G- v* O# q( B* R3 K9 L/ p2 ]" S  `0 |
    1.创建一个空的web应用
    # i* p8 ~; q+ F* _
    ' T3 S$ V: d( {6 T- F+ C7 X' _2.将struts的包放到lib文件夹下
    : Q$ ?7 c( Q8 I* J+ L
    , V) C1 o( G5 w- ^3 V) t1 F3.将.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目录下5 \* S+ F' }+ w* ^  q
    0 L* z& k  e/ Y* R7 h
    4.配置struts-config.xml文件和web.xml文件
    % I# x2 K7 |0 B, V; B
      }4 I, G, i3 s5.在页面引入tag文件uri: ?4 N6 |; I( O$ [) d. s" y

    : k" b8 E" ?% C; V' ^$ ySTRUTS运行机制( h; d! n  J5 h! l

    0 {! I! l7 r' K; @7 M- D3 `6 E9 H. i1、界面点击产生请求
    + Z" x7 Z5 H2 v* W6 a
    & c% A: W2 x; y5 `4 p% m% i2、容器接到请求4 D/ w& `) _# I
    9 L# s$ A1 R* H0 O/ U2 u
    3、匹配web.xml文件中的*.do来调用ActionServlet  l; @5 ?5 r  @

    # Q6 B+ D' M. F3 W! C4、ActionServlet的处理
    $ p& d; L8 P5 @( l
    4 m3 h+ H0 x2 D2 B) b: \0 y7 D5 u4.1 读struts-congfig.xml文件形成ActionMapping# a6 w" w2 I+ C& l3 V: a0 C$ v

    0 ~4 L5 `) n) Y( n& E- A4.2 通过path 来匹配Action类,通过Action的name属性来匹配ActionForm类! b8 }  ^$ G+ S7 O. R7 S
    4 A& f+ o& {2 z0 w! g6 K( ~+ V
    4.3 通过反射机制来给Form添数据; b0 Z- |8 o% y& U1 L
    # ?8 E6 R" X$ G7 z
    4.4 由ActionServlet转调Action的execute方法7 `% u0 x4 o0 f8 [

    ; d7 e& J% W: [% r- u" C+ z0 V4.5 得到execute方法的返回值,跳转页面
    3 M8 n* u& [2 k! M1 {/ @8 ^- k/ ~3 g4 {. `6 N
    4.5.1 RequestDispatcher7 g. X; T% h9 Q  U8 |: G# e/ l

    / `; A' c- z! P; R% ]4.5.2 response.sendRedirect(“list.jsp”);4 L+ g' F# P# V! i6 _8 a

    / |, ]: _$ y5 S - ?5 O; c  k' X) h2 f9 ?: Z

    ' l' ^7 f- y' c进入execute方法9 f: q' p  `: k
    + F/ a% l% x) i
    1 收集参数
    # ]6 n, m, s, [" B7 J+ P
    ) w1 Z! n6 ?7 [( A2 组织参数
    9 B! S$ g( S7 z( S0 a& H/ w
    / q  n% \. Y  I# M6 O, o- t3 调用,逻辑层5 D. W$ `0 F$ c# B0 l9 C
    4 F3 T, g! h' i) x
    4 返回值7 b- P$ u! T. U( W- o

    1 ]5 r* q# i% t: V7 R4.1 选择下一个页面 (ActionForward)3 O; y( ^' V1 E6 u+ Q/ w+ A

    , l6 g! W# Q+ v3 r/ t4 Z: O4.2 把值传给下一个页面! _! t0 j( [, {4 C- h
    * r% ^6 Z* b% j. Z: N

    , {& V, o$ b% l  s( T# {6 j2 q
    / H' h  q$ L# ]- b* m5 l比较struts和struts2的不同- ?( B! D1 ^* d9 f! E

    ( n' `  G, D$ r+ I4 mStruts
    : s- ^" L" ?& B/ B8 e- I
    % V/ l) J& S$ B) F. C3 LStruts2. p( E$ i  v9 [

    7 C1 C5 O' Q2 t组成        五个部分:ActionServlet,ActionMapping,AtcionForward,ActionForm,Action        十个部分:AcionContext,FilterDispatcher,ActionMapper,ActionProxy,Configuration Manager,Action Invocation,Interceptot,Action,Result,Taglib* o3 p: y; s. T# R$ Y
    url        .do        .action
    - s6 y  L, N/ u9 t分发控制        AtcionServlet        FilterDispatcher9 v7 p; A$ H' V' u9 d
    收集参数        利用JavaBean技术,将数据封装到ActionForm的子类中;
    + Y0 U/ u8 s' K; |9 N0 ?一个Action对应一个ActionForm的子类
    , H, ]; w$ e8 `' y) ~
    8 Z; m% C9 W: ^7 B6 m使用拦截器将数据封装到值栈中。
    ) |6 F  |. n% Q7 i! Q. Q. C: ?使用域模型,一个Action对应多个值栈中的Model" `( x: W! |2 d

    / p, F% W" j' R' c读取配置文件        ActionMapping        Configuration Manager
    9 b" \: G6 ]$ t9 ?$ y拦截器        无拦截器        执行Action前后有拦截器9 l* t& S1 e: A( |4 R" J$ o( g
    返回页面        将字符串封装到AtcionForward,进行跳转页面        Action中直接返回字符串,通过Result跳转页面
    3 K0 Q2 z* P, m* |3 d" S& O页面跳转方式        两种:dispatch,redirect        三种:dispatch,redirect,chain! v( t1 v' h) j
    值栈        无值栈,Action通过在request范围内设置属性,向jsp页面传递数据        有值栈,Action和jsp页面通过值栈传递数据,jsp页面通过OGNL取得值栈中的数据# E" [4 h# C/ C: E
    配置文件        struts-config.xml        struts.xml5 V5 M5 T5 E- q+ H5 |
    中文问题        不能解决(需要使用filter)        可以解决中文问题:' L, ^% M/ D2 y  e+ \, W
    1、在jsp页面添加Meta;
    + N1 Z& i: s  f* t  F: B; q/ m. ~2 [% d& z3 C, A; K; c
    2、修改struts.properties中的设置。
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    18#
    发表于 2014-12-03 12:49:03 |只看该作者
    其他开发工具和技术
    & I$ B- ]6 M# |; n) [7 w" I' ZAnt
      _: i8 e0 F3 uAnt是基于java的批处理工具1 g  r3 F! C; U' b7 e/ l/ q0 ]
    8 p" r# F" f2 k+ P
    一、配置ant的运行环境. \3 j+ \& W! Y$ J6 N$ t4 R" a
    , [, n* h) B2 m, l2 J
    1.将ant的bin目录添加到path中
    ( B' c4 `/ H+ A5 E0 ]( p
    " {* E, w6 H- y/ V! p* y: O2.配置JAVA_HOME
    % ?$ \9 k7 S' Z4 m# ]. E! I
      j' z3 m- `  ?2 S  J3 b. p3.配置ANT_HOME- z( O- z% K% q; a) E  {% G3 M
    ( Q2 V" Z% v& e7 M! o. f
    二、配制build.xml文件,该文件放在应用程序的根目录下9 R0 ~* ?3 Y5 i8 d& c* o1 _

    4 r, {3 k% h2 L& N# m编译java文件2 u; o$ S1 F/ a# }: b- W+ c
    ) B0 v& |* ~) w# h. d
    执行java文件
    3 p/ H3 O, V) w2 Z( K% M7 n' Y9 |2 g7 w  X5 P6 G' ?
    copy) Z  R3 u3 w5 e, g2 I* `

    2 K2 L$ U1 D2 |( D8 O3 L. L删除
    - K. O. k4 d+ A: L/ e; y& |; t
    8 W8 e0 p1 \0 X" ]3 [% g. A) Q: K打jar包
    $ g4 L9 \- F; \5 A: e( W
    3 |0 K5 F9 y  n! G1 s6 h根据注解生成配置文件' D. ~. P0 U3 I' l$ r/ C
    ; ?8 v  J5 P+ e0 x' m8 G
    Xdoclet
      x4 \( R. |+ l0 u" K8 u, |2 A, B通过注释生成一系列文件的工具(txt、xml、java、html等), I. s* o5 G7 Z" l3 c

    / p0 L: ?+ K. }* t8 n% uxdoclet本质是摸板技术+字符串的替换
      `9 i9 J4 a" b) |  O4 q% }" d' y) B) W  ^
    1.在java文件中写符合要求的注释(将hbm.xml文件的内容搬到java文件中去写)( ^* O: w$ w' M# o
    " [; w, x2 {# c0 x( y: [9 {1 g) t& b
    1.1 在类的上面 写与表的对应
    ( G' u3 q5 e( y
    5 M1 _7 N  w# H1.2 将每一个属性的注释都写到get方法的上面* w9 Z2 t$ ]2 c+ B9 p
    ( l- D$ V6 A. r$ A8 P+ f6 I( M& i
    2.在ant中引入相应的task来驱动xdoclet; Y; o0 ]9 h6 e! b9 c

    4 v* D! W/ _+ B) |/ @6 S# r
    5 _( p5 e" \& H* W% i/ ~* P! K; K( m; C7 h7 D
    log4j日志管理& R# ^8 `! P7 m* I! j6 [" D* V
    1、是什么?
    6 a* E  x+ Q: B4 G+ V# a- U' c+ N. V
    在开发期间用来测试、对整个日志信息进行管理的工具4 y- q( @2 H# J* M4 A

    % A* j+ a$ L& T2、功能0 m; O& ^/ m7 w1 \' ~/ k
    3 u' b! C+ t1 @' d3 X1 a
    1.控制输出的目的地4 w1 K/ d; c, M& D2 A3 ?  U% e4 m
    1 g, g7 q3 j: {$ P: ~' b
    2. 控制输出的格式; D5 k/ K9 w: L# m3 K4 u1 D- e; ]6 W
    3 u+ K# a) h% `0 d' }* b
    3. 控制输出的级别
    ! S! A3 U$ i! a7 X) T
    ; q) h4 j) ^& S7 o0 D/ U9 e, c3、日志的级别
    2 M7 @% w& E6 R
    ' T/ I* p  Z4 Q# S. v" u1. debug 调试+ _, R2 l  e1 |8 V! I

    8 Q2 N. a0 O& N; V, V/ K2. info 给用户的提示信息) D2 [& D1 L1 d" m1 ?* r

    % C, `! e% W! `3. warn 给用户的警告信息
    , V' g% k. V) W9 m! Y0 I
    % F: P6 i7 j) D  @, i4.error 给程序员用来调试
    " R% x; \+ G/ C0 p
    8 y- ^- G! s8 K2 z, d& gDebug—-〉info—-〉warn——–〉error1 n1 H) x8 S8 s9 @+ `) _

    % o! s  ]/ L% j* y6 o4 g! w4、配置
    - W" G& q  H" i3 [7 r! l  e7 {  f* B0 s+ R( \
    1.配置级别
    3 E% f  S! J6 {8 k' o
    3 T5 S# \' j0 ]+ _3 z, V  j/ ~2.输入源 (控制台和文件)  s% X0 i3 c& j. H. M
    8 D! E2 Q; T7 V4 S
    3.可以进行分包控制
    - H" Y- m1 c9 z5 t' s. R. U# @0 _/ j# e7 d1 [6 `. `2 p
    Log4f.logger.包结构 = 级别7 T: J/ B: f5 M, y3 a" A+ d
    8 P8 i# N2 E2 f
    5、使用3 x3 Q7 F+ X" r$ v5 g

    $ Z) g! T% u" @& k9 a. n# SLogger log=Logger.getLogger(Test.class);. `/ i8 p" m/ C+ z+ E/ V

    ) z3 J* A7 ^$ Z5 m+ }4 u    public9 x  Z. U/ N+ B: J% M& W# l4 n
    void t3(){
    ) z4 N( Z$ O5 {# P! m2 B: e1 V
    ' p7 ~$ }, Q1 \" N/ C8 F% `% G  |        log.debug(“this is debug”);
      C, h' ~5 k+ R4 ]5 Y
      V9 }$ M% v1 J2 ^0 S        log.info(“this is info”);
    - w* v; f! Y5 S! M1 B% X2 l+ G% X, J
            log.warn(“this is warn “);: O( _; y- S' m+ I8 l, Z

    . S) M& z! k  p        log.error(“this is error”);
      \5 o3 n' d) n/ l  o! k4 n4 b3 _- W3 O  b7 M% l+ m
        }3 S( E1 Z, N; m" A5 u0 `" _, H
    . w; R+ x9 Z% r0 c3 x. o1 F( g
    Junit$ z$ x. h2 c% V0 x. k+ j1 w# R/ z
    1.是什么?
    / o9 x/ {) d( K" i6 L6 i" K# x5 r( e2 I2 Z% p
    单元测试的框架- C# R' x. j  U) n+ l' E- B
    3 B+ ~* |+ N/ _3 e
    2.怎么做?* w9 G$ z# u. M1 P6 N: ^8 {, T

    # y3 h' t* r8 D# ?' z% s" O写一个类继承TestCase; d# K3 y) B$ n' r2 h
    ' \7 n, c' {2 V, x% w3 ]( T
    测试的方法一般都以test开头并且没有参数' q; U! l- \4 q! O
    " K- b5 x4 X. N1 T) S" v  ~
    在测试方法前执行的方法public void setUp( )8 U5 e$ R7 c" i# }  K, I' m; d5 m
    5 v$ R* E( r- S' W6 J
    在测试方法后执行的方法public void tearDown( )8 L, D' A' ~& L! M

    % b0 C" f; H! B# @) Rerror和故障的区别5 Q/ I9 j4 `2 t3 M; J
    + h; Y7 d1 @8 `" v" w
    error :代码有问题, b9 s2 ~# ?" L5 l+ S1 c  G- U9 v
    $ B  z4 d) \0 u7 R9 g0 J
    故障 :逻辑有问题与祈望的值不相符合* z4 C* x8 P7 f$ L6 u% D. L

    5 X! w( J3 h6 K( _5 s0 V生命周期2 c( A: n. J  [% \

    ( s* k( h9 {3 v. |测试—〉SetUp()—〉testXX()—〉tearDown()—〉结束;! s& o8 C& p( `2 {

    * |9 n9 ?7 T: ^5 T# K$ ]0 YTestCase套件
    1 v6 n" v. s7 q/ V# q$ K" U' \2 M+ E2 C1 q' S
    public class MyTest{0 h; S( O% Y" h3 V1 J7 K
    3 S1 K. O8 [+ J3 S- M6 D
            Public static Test suite(){
    : Y: E9 f3 x6 f+ L% p0 E
    , h- M/ ~& P, K; E+ l% lTestSuite suite = new TestSuite();/ j4 s" n# U" `) w, o' H8 O7 w

    * I/ N# _  @) F: M2 f5 E. `' usuite.addTestCase(Test1.class);* G: \- N( y: s
    7 B5 m' q# N5 C5 x0 w
    suite.addTestCase(Test2.class);0 O1 y- E; l3 i8 [- Q& [( Q1 u

    % g( h" L  L$ I% j}1 V% w0 D4 B7 c$ ]0 K; i
    ; r. \) k0 t: P" |6 H7 y
    }. P+ u) V0 I+ R, Q$ U
      R, w  Z2 a+ W, ~) X5 U1 Z

    % I/ l3 _) G+ ^/ e4 }) `& H* `% f. L
    9 q" Z( M- K+ L( [Ajax9 X5 J8 y& A+ [. P& {7 N+ G& o. H
    是什么?8 S7 M4 t5 P! }8 H+ \0 `( X) ^# M
    AJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。是一种创建交互式网页应用的网页开发技术。% T9 V2 E- E7 a
    ; D3 P% M6 H3 p, X3 R5 u8 Z- D  E/ i0 i
    无刷新页面。
    ( _9 n- o. B1 r' `# y& Z$ F# b& x3 u# Q% |9 N
    有什么?
    1 k% d+ Q0 `1 W2 m8 CAJAX是多种技术的综合,包括JavaScript、XHTML和CSS、DOM、XML 和 XSLT、XMLHttpRequest。
    6 Q) R$ }  h$ C) z0 u: [4 K$ \( A
    + G6 I* A" `8 v7 D3 Z+ R能干什么?
    . c7 P1 Z) ^2 h/ i6 s% c# o使用XHTML+CSS标准化呈现;5 e& M: b$ f3 d- s8 x* W
    使用DOM进行动态显示及交互;
    4 O, f  p- G0 r9 p  B2 c8 o使用 XML 和 XSLT 进行数据交换及相关操作;
    ( f, p/ F1 M) K; k& P使用 XMLHttpRequest 进行异步数据查询、检索;
    * }; ~% E, Y' u使用JavaScript绑定和处理有所得数据;
    + x' c* d7 e" s0 b2 P
      G+ @; O( e5 J) ~0 c& }传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。
      t: w$ a' ]9 Z5 k7 h6 q7 ]# E/ S4 e( i. Q0 T
    与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。7 B* b# e4 m: d

    6 [4 ^3 k5 C1 x6 z5 |8 l使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。
    $ s% N0 {# ^+ c1 M. B' b, o. H) _0 a2 f
    对应用Ajax最主要的批评就是:2 L* ~3 f( p, @, }' ?
    1 它破坏了浏览器后退按钮的正常行为,就是用户点击后退按钮后不能看到之前的数据;
    3 a: |9 l1 `* f- Y2 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;( K0 j: \, Z: ~$ F  c
    3 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;+ y6 J7 G# V3 N3 U: C
    4 Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;5 d" M) ~3 ^: m' M7 z& B' ]

    : }3 {4 `" Q- p) M2 ~- S怎么做?
    ; }9 y+ G$ u" r" l$ U- t<script language=”javascript”>7 X3 C# _8 g$ x' x, t
    8 o4 B% M+ `) f, s  N
    var req;
    9 k2 ]! p3 w9 A- x3 s& G. ?( z, S) V7 e% X) H  F/ G7 y
    function add(){
    % P1 S6 a  J0 a/ i0 X  Z
    / a& R: g. v. i//1:创建用于传输的对象
    1 Q. {% ^3 R& u7 H' n9 w  c8 B8 S/ k+ m/ g
    req=new ActiveXObject(“Microsoft.XMLHTTP”);  b/ g/ S% w1 K+ `
    $ i, A. ]1 x" m% O1 o/ L7 a
    // 声明返回后,处理数据的方法  e" U2 _4 T1 C" C1 F  r; ]+ h$ z

    2 Y- C8 N# F3 U# Q+ B4 \4 sreq.onreadystatechange=manage;3 H6 y4 F; O# m

    % ?4 K$ a- o* k9 `4 u. w. T2 N9 t2 Y//2:准备传输的内容# D. ?' r/ D6 U* O
    & ~" X$ o6 b" t8 L
    var str=”test1111″;
    7 i$ {/ m% E" m7 J5 X* \5 M
    0 A  D$ v- a) C//3:发出请求! }% U: Q" s# e' R
    1 |% c; F; a! I5 D/ x" Q6 a
    req.open(“GET” ,”/others/ajax/test/t2.jsp?str=”+str);
    $ o, |  g. i0 A2 H* U4 _$ j
    * Z1 u0 `/ Q( P% R5 j, mreq.send(null);
    " ~) }( E3 T& N1 j
    # r0 D+ q- T! ]1 o8 b}# z. S7 y7 B  s# o* W( e# `

    * y+ n5 V$ t. q: r) j//4:接受返回并处理" S! K& L: O4 F% A& `1 k1 b
    8 b. F8 f& Q0 @+ E0 u
    function manage(){1 {- b# u8 t5 _! Y% d

      u- Y# A) a/ z9 E# b" ]( R+ Dif(req.readyState==4){$ U. ^9 q4 [  z2 m. n' p% i

    + k5 a  U, n0 b3 ?- Nalert(“r==”+req.responseText);% M7 ~+ n$ u: X: [9 H# J

    + x3 I; V( H) F}
    * S* H1 z& t/ P8 s3 Q! d$ c
    1 C2 b7 s/ p; G- H) [}
    * T- g% }, X8 n
    : z$ q4 A5 F" i0 J9 Z: M</script>
      _6 D; w5 l4 p0 I$ r( z6 D3 Q7 k0 C) F( l( ?6 ~- a$ i* B/ m1 e: w% E
    readyState的取值如下:9 V9 F# a( j9 K, l' U
      U6 l& [, n( m
      0 (未初始化): C- S8 s+ T% F8 H

    9 r+ S4 @8 T' M, w4 F  1 (正在装载)) s1 W2 B0 m' u% U6 i! f  Q2 i$ s
    * t, v. q. U8 L& I. m5 ~2 A
      2 (装载完毕)
    ! n# y; F) b% q( w/ U- E, k( \
    6 a- t: ~. W8 B3 c1 g. W  3 (交互中)
    2 H; W3 I8 B2 S; R" R& l/ _6 ~- o
    / \: t. w3 _( U# ~  4 (完成)
    4 I! T( i2 r! S" A; n9 K+ N( t& _, `/ U, p' \

    % a5 l; c7 H: _7 _& v$ W2 y; t
    ' {% o  B0 _, ?# k" s原理7 i. X* c! I+ U' [) w: J
    Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,可以是xml格式,也可以是一个字符串,然后用javascript来操作DOM而更新页面。
    ) U, O: T, n+ j/ B6 i; @" ]8 |
    ' ]6 z, i$ ?1 _* }Dwr& J. d/ X2 x5 N3 R0 ~
    是什么?8 j/ `/ c2 l9 H+ x% a7 S- x" }
    DWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的页面。它可以允许在页面中使用运行在WEB服务器上的JAVA函数,被调用的JAVA函数就像是在页面中JavaScript方法一样。
    + d2 p/ v5 ]7 p$ ~' E2 F, u. q4 X4 D5 @& q
    有什么?$ e2 _: @) c" W- i
    它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据;另外一方面提供了一个JavaScript库可以帮助web开发人员轻松地利用获取的数据来动态改变网页的内容。
    " k. [$ t) Q! {" Z9 `8 J2 `! n/ p6 @6 G& b/ L

    2 f5 g% l4 i2 S# F6 e4 K- T6 @' X7 U$ s
    能干什么?
    . e8 Z9 ?& N2 j动态地把java类生成为JavaScript,感觉调用就像发生在浏览器端,实际上代码调用发生在服务器端,Dwr负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制。
    2 {0 U6 v9 z! f# O, M
    $ W5 V+ Z) Y! b3 P
    ( a* k, g4 V8 D% w" H" E3 D. [  l! L1 V% v
    怎么做?& N0 A! I, c$ _6 p4 ]5 v) L
    ① 编写配置文件
    / k$ l3 Y! `6 k" h0 O: c, t: \
    ( S0 B2 Q8 ]: i* F0 lweb.xml6 f' z  J& M- [+ u/ G- \: [
    ! C9 `% J4 D! ~- P$ \( d$ H
    <servlet>" Z; I+ {8 t# r

    - R: [, H4 h6 m9 c6 S<servlet-name>dwr-invoker</servlet-name>
    0 [8 H! y0 q7 k& i1 o) P: Y( I4 v& M( z0 Y
    <servlet-class>( d$ ^3 X  r3 z0 Z# O5 V+ k

    4 l( Z# P5 ]/ ^/ I7 r& @, t3 |org.directwebremoting.servlet.DwrServlet
    - ?) n8 j) t  L. \; q, K. X
    ( e) b3 }  F, W/ r</servlet-class>
    0 ~; ^/ n  k* I8 t7 f$ h
    7 V# u4 f# ~7 k8 Y3 Q/ N<init-param>
    # M& v6 K& }0 Z+ f4 ]# F- b- _: ?6 B* X6 m
    <param-name>debug</param-name>/ ^" ~; M7 n, _

    . j1 F. q; ?! L6 E0 O<param-value>true</param-value>
    * B4 s' G, n' y7 _, I
    : X' b  c5 _8 e/ Z( ~9 i7 @8 h2 M& }</init-param>8 u7 Z% S- D" o4 m
    5 n$ L7 f* C. E% l2 k7 s" W, q
    </servlet>' H) T$ k: V7 s

    7 e& l) L7 r& M: D3 K( D1 p7 n<servlet-mapping>
    / v/ l% R$ y/ T, Q' L) P& o1 G( {& l8 ]3 h
    <servlet-name>dwr-invoker</servlet-name>  F3 u  S% k& S% R* O
    % h/ w( d5 }: z$ Q+ |6 I
    <url-pattern>/dwr/*</url-pattern>6 F0 P7 _6 S0 j* P4 V' J
    4 _$ M7 b( }% W9 ?) W8 x/ u4 \
    </servlet-mapping>/ V5 i- `6 }" Z6 g6 X
    ) u/ a( H: b; m/ E7 b% ]
    dwr.xml
    # A7 a! b* x3 Y# u9 I0 Y. _+ }& H6 R
    <allow>
    2 M2 s7 H1 U8 e" t+ d' e. {5 |8 t1 z4 k6 \: H, z6 a$ P
    <create creator=”new” javascript=”kc2″>
    8 G0 a, q; f# V& J! w
    2 v7 x$ Y7 [& `5 q<param name=”class” value=”dwr.Service” />
    4 c9 n; P: z4 J- ?; K, B. }
    ' j8 R4 r2 p# E! F. [</create>
    2 s  Q2 c, n% e# e" @2 J: F9 }  J  b8 m# t+ D: I* a
    </allow>- s( Y: j+ a' ~/ c, R5 r
    6 Q( U) t/ N' l/ U3 f) i. c8 w
    ②编写service: Y6 B# R# N6 J: r; \/ f2 ?/ p  R
    2 [: e. M/ q9 F  w" e" K$ t8 d
    public class Service {5 Y/ T/ X  u4 l) v5 W

    0 O2 K$ X$ m# |5 s* Jpublic String sayHello(String yourName) {. I( T& N6 w9 J7 b4 g# ~8 T) Y8 |/ G

    ( s. f9 P4 h  N6 e; ~6 H2 [//可以是访问数据库的复杂代码
    ; J4 A3 I8 ?* Y' `/ _. `; J
    7 L6 n; b& b4 wreturn “Hello World ” + yourName;
    ) X1 ^& u2 }& x. _; u0 f& H! A4 d9 d0 O  X5 h3 e$ Y1 `
    }
    8 l- g0 r7 @: I9 B9 h- J  z7 D3 M1 }5 \- `7 T$ `
    }
    2 ^' X  S) q6 O$ Z
    & [$ l; s) N  u* E4 q' K8 \: V③测试DWR; t4 M- q0 V. p7 @2 c/ A
    % F* Z- ^+ i( ?$ a8 \
    将代码放入应用服务器(比如Tomcat),启动。
    % V# U, ?9 r/ E9 q, j0 }0 Z8 g# S! C
    然后在地址栏输入http://localhost:8080/你的工程/dwr: C% Z# [9 H" f& X+ B7 R

    + m& m- c6 Q/ [④编写jsp页面! |$ M. K3 a% q! @2 j
    9 p* j2 z4 @, M) r9 E% O# D/ D
    1) 要引用3个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js
    1 `/ l3 S3 R) s: a
    6 I4 p& i* g. Q8 Z2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样
    : |5 g1 B: Y! z. X3 C) a6 g) h2 n7 W6 b: I% J8 W& M4 A
    3) js里的service.sayHello和java类的那个有一点区别,多了一个参数,用来得到返回的数据
    回复

    使用道具 举报

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

       

    关闭

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

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