科帮网

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

动态微博

12
楼主: admin

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

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    11#
    发表于 2014-12-03 12:43:50 |只看该作者
    JEE
    ) k: {; {+ l# C# C, a  a简述JEE
    6 S- M+ G6 ~! t8 w7 s) @! O9 uJEE : JAVA  PLATFORM  ENTERPRISE  EDITION
    . n8 `% `" k! c4 n
    ; ~) v, B+ \4 r9 AJEE是一个规范集;) J0 F* ~6 m9 M
    0 r. v, n2 O1 q9 m
    JEE是一个框架集;
    - n" b& j3 i5 @' t2 g7 ?+ A3 g
    JEE是一个技术集或API集;9 t1 d& _8 e' ~! ]
    , r: m; ~" ~3 `: I. S
    适用于创建服务器端的大型的软件服务系统
    : j1 N1 a2 r, c' f
    ) }7 U/ H8 }8 D+ q8 ]5 H & m6 u8 K  h; ?6 H& Z1 ^- D" ?( _8 S

    + }9 T  G2 s' p. K. cC/S B/S 模式% e! Y8 m/ \5 o: g4 A! {
    C/S client/server即客户机/服务器模式,客户端也参与程序的运行与计算(富客户端、胖客户端)7 q  W- F+ X0 L# s9 _: H4 \
    % `9 K7 V+ \2 \# D$ K2 v* O
    B/S border/server即浏览器/服务器模式,又称为瘦客户端,客户端不参与程序的运行与计算
    9 ?( l7 c5 l% v. O7 b7 ]9 J) W) z2 s1 ?- y
    1 r# Z, u# I# R' B
    5 l) Z) d9 G! U8 J2 p
    企业级应用(大规模的应用)的特点7 j6 |! r: V. }; K0 P' T7 S7 P
    1.生命周期长、稳定、可靠+ A( f( Y$ i2 a

    * J: q& s# n% Q2.组件往往分布在异构的环境中,能够跨平台4 a3 F- ]5 a3 R$ o
    9 S& @/ B* n2 R
    3.维护性、扩展性、重用性
    : K7 t3 t* v# [! s  z% S# Z1 ]# p4 H! u" h4 k& y
    4.有事务、安全、线程; ^( |7 s- Y2 n2 e1 m" X7 x
    8 W! t7 G! F' H; l2 C

    5 x, s$ R' H9 L1 B' e4 d& }$ b* @) o7 R! r8 q
    什么是业务逻辑?# |5 u3 l7 x1 \. ?6 P. |
    依照业务逻辑划分模块,
    # U0 a# K& c6 y% d- j' O" t! w8 q
    所谓判定业务 就是具有以下特征:) _+ K2 i: p" E" i6 _
    / Z5 a1 u! u5 X& x: P
    1.业务流程
    , T0 F( z1 \$ }" H
    % H+ L) o' Q1 }% A* Y+ V& V$ _' p2.业务判断% ]3 L" W% M0 P  n# a( p

    & s3 J- K8 _- [$ t  O0 t- z% a3.功能组合
    ) l/ e5 H2 p. d7 ]0 r
    & k% ]6 o, e+ O# K1 x 9 W# m8 J. g( ]. J2 o+ g
    . T& F7 q- q8 k' E" z5 p# z
    平台(角色)的划分
    - I8 }6 b, G7 a( R  q1.平台供应商。提供满足API集实现的厂商(BEA weblogic IBM webshphere)
    : J5 ]7 j! u+ g1 [1 i
    ; a$ L8 @4 B! O3 u2.组件供应商
    ' D: x9 m6 c) Y. Y! W; C$ ?4 _% _. X% P* H
    3.组件装配人员/ U8 S) Z" ~. _0 ~  ]2 Q3 A
    + G+ V& w2 ~+ S4 g
    4.部署人员
    " e7 R) u. H3 i1 v& M. H0 M1 i, o! v  F, ~( g3 M8 {
    5.系统管理人员
    9 e: c7 k/ `- o- n4 o, U% m
    , V! S: V1 u9 Y0 u6.工具供应商 提供开发组件所使用的工具(Jbuilder、eclipse)# W0 k( }8 ^( G
    . a! u$ `# _% H2 x. ~/ {# V
    + B. e: u- ]; K; Q

    & o$ h! M  u! W, h# e8 [1 R) s) Ajava技术分布(设计架构 模块内部设计)
    - |; X' _# |$ y2 Z+ K% G* q1.表现层 Servlet、 Jsp、 JavaBean、 Taglib
    ; i! K# a$ c' w8 E! m# u
    ; b) [' X1 D9 z2.逻辑层 EJB(SessionBean)
    - U& s2 N# l$ n6 L* p1 H' d- ]+ a$ B$ V! y/ C( j; \# o
    3.数据层 ( JDBC  EJB(EntityBean))' ?) d, W' y  p( g$ y, p

    4 ]( H" ~+ K+ i, |. i. G: S4.服务 JTA(JAVA事务架构) JTS(JAVA事务服务) JAAS(JAVA授权与验证服务)
    + ^" x8 h1 O  h
    / I5 f) F5 A1 V( ]5 o8 }9 @; s5 b5.分布式通讯 RMI(IIOP)+JNDI 、JAXP(JAVA 的 XML 架构)0 Z0 c) p5 Y0 A8 H7 i0 V

    0 R: c- \: B5 RJAVAMAIL(邮件服务)、JMS(消息服务)、IDLC、JCA(JAVA连接器框架 (成))/ B1 m* b% X' A
    ( a) v  n! [8 w' q

    / O8 h2 F1 e; a5 m/ k1 T* l; l0 V2 D9 W% s
    JEE的体系结构: 是一种组件的体系结构9 X8 H# H4 k5 L
    1.组件 : 能够完成一定功能的封状体(独立的功能的集合)
    3 z9 G! a% D0 y& w; W# |: H' n$ V/ J6 W( }' P
    不能单独运行,必须运行在容器上
    ! G! F5 Y; w: j; }6 p! a. |( O& E7 }) _
    分为两类:web组件、ejb组件
    / w5 S1 K) U& ?, z, A& ]
    ( F  h% J9 a3 U* y$ `) ~; P8 t) a2.容器 : 提供组件的运行环境,并对组件进行管理(一段程序)
    ( w2 h* _: n% u) S( n
    9 Q1 V. {" e4 _/ G3 ~. i/ `* s管理组件的生命周期
    % D7 W- ~: D0 x, ^4 C# G
    ( J; E* L! T& P1 X# y' L+ Z不能单独运行,必须运行在服务器上
    / V$ W, B5 a! L9 \4 D( f8 \7 V* \- a6 j
    程序(组件)通过上下文来调用容器(context)
    1 A+ e3 Y$ h0 R( @8 L0 l) U  U1 T6 _$ R5 Z+ ^/ X' V
    组件通过web.xml向容器描述自己,使容器能够认识组件
    " M4 E5 _  k. k6 \& s) o' [
    $ g7 z+ w5 v+ M. h) T' \/ Q容器通过回调方法来调用组件* V7 Q6 G# j% I8 W# B' |& Y# z

    ! S5 B/ }5 I- I9 z, e分为两类:web容器、ejb容器% s, }) r2 m! \" S; N, I
    + q; P7 ]9 R" Q4 d
    3.服务器 : 提供容器的运行环境,提供大量的JEE基础服务7 c/ A  h) i4 g- O! A
    2 ^6 i7 T1 y1 W4 C8 u- _* P
    web服务器(只提供web服务)
    . H4 L6 f$ N) v$ Y  J+ K" s! d- t9 \( F" g* f" v( i" [) j
    jee服务器(提供web、jee服务)
    # r2 P5 a- a/ m. [; z$ t4 o: v9 I7 j& h3 W- e* O" d( B2 @

    / |  y3 L7 n# g
    % ]5 Z, T( A' \) Z  U什么是回调方法
    5 W/ [% Q* R6 Y* [% P3 Z由容器自动调用的方法,就叫回调方法。
    7 m5 t* |  w5 Z. L
    & a( O  A& a: p) w+ f9 Z7 \  z # L# e+ G2 D) x* R

    ) J% m+ L( j5 d! ^# M3 ?RMI远程方法的调用机制0 s2 m# b5 {% W, p% j3 B
    例如:A主机有B()方法,C主机有D()方法,A 想调用C主机的D方法. |( t& C3 a& Q5 c

    2 @. Z1 c/ M% q; [1 t8 X( D( [9 G
    : i) d. O6 B6 V5 h7 t+ v
    6 [9 X5 W  e2 \2 d' z' K6 _ 0 ~8 W! S' G, B+ E/ K( H

    $ S( y7 _  {$ \# ^学习方法/ w$ m7 `: a1 ?
    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/ C7 w. E8 d7 ]/ `8 j' S
    •     描述war包、jar包、ear包的结构
      ; [- S, y. ]7 A  i; n5 H7 @! h
      + d! k) B3 e8 T/ o9 l
      & e$ L$ B0 d) m! w3 r, v7 Y

    war-                            web文档压缩包

    —WEB-INF

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

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

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


    " J% P: d& y2 w

    jar-                             java文件压缩包

    —META-INF

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

    7 _0 i% _* ?( V% r: L8 X6 }

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

    –META-INF

    —Application.xml 配置文件

    –*.war

    –*.jar

    $ p' e4 u) e+ w- @* r& E5 t
    • 什么是servlet?servlet主要做什么?
      1 ^5 a, K! m; \* ?9 D
      / w% ]$ F/ \$ C3 \
      ) w, e- E( a% I/ A) `6 a

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

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


    6 G# t$ M" Y- E- l8 y
    • servlet 与cgi相比的优点?servlet的缺点" R) e# h5 R( [& R9 |: t
      8 R& k9 ?- t1 i% [3 F, B
      1 `; F6 e" j) U$ ^. c9 u4 p

    优点:

    性能(线程比进程更快)

    可伸缩

    Java强健且面向对象

    Java平台独立

    缺点:

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

    5 u# A( q; L( F! Z' x6 a8 H' ^
    • 常用的servlet包的名称是?
      4 j- k8 }( ~# ^; f0 T8 K" Y
      7 k$ m6 p7 T/ ]

      5 _" s! }6 _$ ]; w7 M- ]9 B. ^

    javax.servlet

    javax.servlet.http


    # b, a3 {( W3 E' T% q. }/ [; v- I# v
    • 描述servlet接口的层次结构?* A/ z/ X8 `* k$ y$ q1 U6 [5 D
      2 _+ F2 q9 V* x7 ]
      7 }, M( y6 |& i/ u, }5 L

    Servlet

    –GenericServlet

    –HttpServlet

    –自己的servlet

    ServletRequest

    –HttpServletRequest

    ServletResponse

    –HttpServletResponse


    9 Z" ]9 }6 V% V! A
    • 对比get方法和post方法?- E$ R" k" q3 W/ G/ F( \+ q/ G
      * x- |8 K4 j( x9 ~8 o
      3 j/ u% e3 t. o

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

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

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

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


    0 P5 ^6 B1 A$ f, {+ |
    • 归类描述HttpServletRequest接口都完成那些功能
      5 Q( a3 ?& F+ f3 W

      % Y8 @6 x6 R/ j8 z8 T# {- W  Z/ z# p& V
      ) I! Z% \3 _% e. H) O' o8 Z
      • 读取HTTP头标
        - @. T1 x9 A) k, Z# _# M2 Q
      • 读取cookie& ]6 K- F% ?5 g' Y6 Q" @
      • 读取路径信息- w6 h. H9 j: H9 d
      • 标识HTTP会话。
        7 L  i% Y% |; Z+ |0 Z7 Z* V+ z1 R+ w( m$ Z5 \" S

    % F$ F1 T1 a0 _2 W$ x
    • 归类描述HttpServletResponse接口都完成那些功能  R0 r. t( g* H: S' ^7 P
      * V0 H, K; L! a9 p- _
      8 P: |" P$ O1 X' \
      • 设置HTTP头标: |# M& M& D+ v( R
      • 设置cookie, f2 ~  n/ N, M8 j* Y
      • 设定响应的content类型, A2 P$ U( X9 \7 @# w) E6 c- e
      • 输出返回数据
        : M* b' {! h1 `) z9 _* J) r6 {# u$ P( L& r

    . J  k, l& E  r# v- u: y
    • 描述service方法所完成的基本功能?默认是在那里实现的?
      . a, ^, U) @  F- |
      5 }# u" _' @3 M9 R! ~

      : s3 z+ |4 j  n! N

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

    实现:默认在HttpServlet类中实现


    % a7 @* H% r: p6 p5 k/ \
    • 如何开发自己的Servlet?描述应该做的步骤和每步需要完成的工作8 N4 d8 I$ L3 d8 ?! L

      " p' c; W7 f! \! Z2 K; E% {: a. U4 n# N3 P

    1.引jar包

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

    2.开发servlet类

    1)首先继承HttpServlet

    2)重写 doGet( ) doPost( )

    3.部署

    安装web服务器,例如Tomcat

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

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

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

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

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

    4.启动服务器


    7 |, n7 C! n7 R: m7 x# P, q
    • 为何servlet需要部署描述?; O- J$ b. p8 M5 K" A

      + [) d- R( H: B+ y& m) H! J. t" ~3 p! k/ z5 Q+ z

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


    * n$ y3 |  p/ v8 j* a9 Z
    • Servlet基本的描述应该是?请写出来: Q; I) `/ G$ ~; D4 e3 v8 ^
      , N* H. M6 I; z
      + I- b4 [4 i# H; m7 ~

    : D( k2 m6 w7 o8 j- F! g7 c' V4 K

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

    9 J, M6 K, x5 A+ p8 o
    • 如何在html中使用servlet) m# `! G9 Z, H" h0 ~
      & z; h1 ^% `/ c

      % }2 t/ e4 V& P! f2 A- k

    FORM标记

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

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

    语法:

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

    {HTML form tags and other HTML content}

    </FORM>


    ' D; D) n1 T2 o0 n$ a; N( e
    • 如何接受request中的参数9 E- [* r0 T" L7 y

      5 z8 ]2 E; q; U. n  R/ K% cString userName = request.getParameter(“userName”)方法2 O; d4 m/ o% F0 |3 y: C

      : D; P' A6 u* _, Y. \

    ( l5 A9 Z& X/ H7 L" a0 b; t' y) m
    • 如何接受request中header的值
      - c) ]1 P7 n9 h

      3 o8 V  k/ e) ~: w8 ]# N: f" K
      ! {# b2 a6 u: R# H1 ]( k7 h

    request.getHeader(name);

    request.getIntHeader(name);

    request.getDateHeader(name);

    request.getHeaderNames();

    , r; ?' I9 h1 u0 A# E
    • 如何输出html
      7 i+ E( R! S" F! B
      ( W  p! ~: t$ t, J- {

      / X4 U1 x$ E( d8 x

    PrintWriter pw = response.getWriter();

    pw.write(“<html>”);

    pw.write(“Hello”);

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


    5 I& j8 W  @# Q) b% d
    • 如何设置输出的contentType  v6 X- A! k/ E) K

      ( ~2 ]% l* F3 p  o$ A8 ?6 z$ j* @1 z1 n: T9 o" B4 e# o+ s

    response.setContentType(“text/html”)


    ) s9 O7 u% }4 d; U8 H
    • 描述servlet的生命周期?
      6 Q+ {5 q0 H& u5 _1 P8 |) ]/ L

      8 P' c' R4 [3 M0 f# q3 ^
      7 j8 v/ q6 k& i0 T

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

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

    ! t' [1 M  o, N' n) @
    • 描述init,service,destroy方法的功能和特点
      6 B/ c4 }# h9 `4 Y

      % I6 b# g3 Y( U0 H0 t" V0 r' \6 k6 P' [$ f

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

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

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

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

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

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

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


    9 M3 s+ y/ l1 }" |3 c
    • 什么是回调方法?有什么特点?
      # ^* A- ^$ V; F& C" g) H8 V

      : \5 C0 n0 F- [
      ) _& c, H3 h3 S

    由容器来调用程序的方法

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

    & y: m6 p& {3 [" B
    • 如何设置初始化servlet的参数?
      . |/ ^  d- u  u8 l+ \+ f# q4 o
      ) K. J5 K) v* Z) ]6 u; k  x# K
      在<servlet>中添加如下配置# q3 ~& y( ^' w4 H& D
      4 @- X% N$ W& p" ]9 z

    <init-param>

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

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

    </init-param>


    9 G+ Q2 Y& x7 l! t! H4 c3 `
    • 如何获取servlet初始化的参数+ J0 m0 L% k) \: C( Q
      3 x! @( g1 V2 z% Q
        }  d9 L' {* W% H0 b5 `, w7 V7 K

    public void init() {

    greetingText = getInitParameter(“greetingText”);

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

    }

    % Q0 O6 k" G- W. `% @* ?
    • ServletConfig接口默认实在那里实现的
      9 }# e0 ]8 {* A/ f; A

      ) y" [" j: m8 n# |  D( i& M6 z; N/ H! I) }) A

    GenericServlet类实现ServletConfig接口

    ' n2 _, G) t; R5 [( m$ x) i  v
    • 什么是ServletContext?有什么作用?
      : V! W8 T* @. b) f& q# Z( c8 q1 i3 G: i

      - r- s# Y: m9 K8 D- {
      ' j) T$ p7 L- b, x3 ?" U0 D9 q

    Servlet上下文

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


    9 p6 w% U5 ^' E( A. f
    • 如何访问ServletContext接口?是在那里实现的?$ o5 N/ F* F3 @6 a
      ( o5 N( f1 r4 b9 E

      3 i5 A( F6 L/ B

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

    GenericServlet类实现了ServletContext接口。

    $ m. c- H& F' c' C9 `
    • ServletContext接口的功能包括?分别用代码示例) c: S* d+ O% |0 ~! e% o
      " ~6 _) R0 {# v6 l5 j% P5 ?& @
      + i( V) u( U  V2 D

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


    " D3 M. H# P# A+ B2 |
    • 如何设置ServletContext的参数?$ t0 h$ [7 G* A8 \

      + H+ ?; I& w- a0 V; Q- ~/ a  W1 Y+ E8 V, C/ h% a* I  L

    <context-param>

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

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

    </context-param>


    + _5 {3 F3 j4 i
    • 如何获取ServletContext设置的参数值?$ d7 b9 g! s: d& D
      8 \3 ]: q+ o# e+ D+ ~
      . S+ j9 a7 E2 n( N2 ]

    ServletContext context = this.getServletContext();

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

    : y* D- c. `$ m5 z
    • 描述Web应用的生命周期?
      9 S1 [2 G7 T+ z- W: ?5 b

      * F) D* v4 Y: _8 W# d1 o5 _
      ) z1 ~( A: C1 G8 x7 @: c( y( F' {! x

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

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

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

    ' Y" k4 v0 M9 A3 S1 c! k
    • 如何用代码实现监控Web应用的生命周期?
      ( n( P2 ~3 K% \9 o5 ]

      0 s7 [$ ?. a/ }# k
      9 w( M  b* r+ n3 i! i
      ( U4 I& f9 H& i& [* k0 K

    public class Test implements ServletContextListener{

    public void contextDestroyed(ServletContextEvent arg0) {

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

    }

    public void contextInitialized(ServletContextEvent arg0) {

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

    }

    }

    7 o) E* ]/ g) H' p8 G

    web.xml文件中的配置:

    <listener>

    <listener-class>

    com.csy.Test

    </listener-class>

    </listener>

    8 \( H6 o  D5 L7 k) C# E
    • web应用中如下错误码示什么意思:400,401,404,500
      ( Z9 z# g. w  G" _7 q& B
      - t1 N% ?) ~) b/ ?5 i9 L: y; G
      400 Bad Request//错误请求
      401 Unauthorized//未被认可
      404 Not Found//没有创建
      500 Internal Server Error//服务器内部错误
      + s) l/ {3 i. z. p! x
    & J1 P* m& d* [* T
    • 描述Web应用中用声明方式来进行错误处理的两种方法2 o* A" ?) J: ^% w3 b5 u$ D1 K0 p
      2 G, ]0 D5 \$ n+ J3 R

      5 F7 G) p$ i% A6 A

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

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

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


    8 ^+ g; w+ C. t& a
    • 描述记录异常日志的方法,都位于那些接口?" c# C- I4 l$ ~2 [- e9 m
      " Q$ b2 p, e6 {, d/ ~, _
      1 t8 N7 N$ u" A+ i  v! {

    GenericServlet:

    log(message:String)

    log(message:String, Throwable:excp)

    ServletContext:

    log(message:String)

            log(message:String, excp:Throwable)

    * Z1 c4 q) J+ H- e: n: f
    • 什么是会话?
      , Z) U1 T! X/ I- @: p( ?
      $ @- w+ ]( \/ H$ w; {1 S% F) M; ?

      ' y1 J; `* H7 P$ O! m) t: ]8 g4 u% A

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

    , q9 o& g: Q, |1 C
    • 如何获得会话?& u$ j2 B4 T+ v. W4 p; f2 }7 T6 w, x
        B" l0 z" k. I- L; T6 u
      HttpSession session = request.getSesseion( );

      ; ], I# H9 O$ ]/ P2 G

    # ~$ E$ p# ^, s! T1 c% l! x" R$ A
    • 会话Api的基本功能?
      $ u# m/ @0 j8 g, e. j* e9 E% Q/ @6 v  c
      6 @, d+ M$ Z, Y& z( j  N: p- w
      8 M. {9 W1 f$ p8 i, Z

    getID() :String* E  J" |, G( e' h8 r4 t

        isNew() :boolean, P6 `0 l" @) I; ?) o

        getAttribute(name):Object
    ; u; i) n/ ]2 P8 ]8 G, c, j; P

        setAttribute(name,value)
    ; G# a3 U. `; R# M& u4 U

        removeAttribute(name)

    $ E# S) L2 V/ T( `; n" {
    • 如何销毁会话?
      ( N/ Z/ `3 E( W! D! g7 `8 C& A

        K- C9 Q0 ~' w3 u( |- L
      4 h9 x. J3 S2 X

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

    <session-config>7 V" F' ?0 C1 B

             <session-timeout>10</session-timeout>7 d; ]0 H, b. [4 g  S. j0 X; n

         </session-config>
    4 C7 w8 V. M5 [  Z; T

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

    invalidate()
    ) @% s+ ^- v3 ^" ~8 H

         getCreationTime() :long3 j6 B. W% D1 p( e; ^

        getLastAccessedTime() :long5 j, b2 X/ O( Y* j, q' t

        getMaxInactiveInterval() :int' I3 F' E( o* @7 E

         setMaxInactiveInterval(int)


    / g1 p, P7 p! E' s8 L
    • 描述会话保持状态的基本原理
        \. @6 ~6 z! j7 P6 d% G

        `! M3 V: L+ k6 c  y5 a8 Z
      ) P- [2 A: o  d

    5 X8 k2 v% P7 }9 d7 O/ V* y! R

        client server/ E% p; B1 e" E5 f


    ' b2 O/ g4 W# Q* c

    request
    % _, N* i7 f* k/ e, D/ Z

    response (sessionid)! @; j3 ~! p# v# o' U

    request (cookies)
    # @8 O' q  w( B/ }

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

    ( K- C" R  Y2 z3 F3 L( S
    • 请描述session和cookie的异同之处, Q) h. P9 v2 G2 b/ n9 F7 {
      + D2 S! l, t" c& M' D$ J+ `) W

      8 ^  F7 _( I( t, e( D8 L5 l# O

    & K# M$ W( N" |7 I1 d& `7 Y/ J0 [; v
    • 如何读写cookie,代码示例$ J8 z( g1 V1 H; E6 P' C1 R3 a
      1 t# L- {* Q/ A2 a& M
      ( C1 g0 C( a1 A3 {$ c  L

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

    response.addCookie(c);

    读:Cookie[] cookies = request.getCookies();
    5 v1 Z' E! w5 R

            for ( int i=0; i < cookies.length; i++ ) {
    ( a( @0 F8 Y3 d" [4 @

                String key =cookies.getName();4 U  s2 v. ~! a( M( }

    String value = cookies.getValue();
    6 R- T! T3 C0 b. m+ S  }

    System.out.println(“cook”+i+“:key=”+key+“,value=”+value);
    0 K4 Z' J7 q" X* a' T

         }

    $ L2 F+ G' H- y& @' o6 K- x
    • 什么是URL重写,如何实现,代码示例* V- `% J* f+ H* f: w0 L

      * X9 b8 d, |0 W; A
      & Y7 m, `& m! r8 b, V

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

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

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

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


    + X# g! u& S0 c, E; _  m) }2 I* I- a/ R
    • 描述web应用的4种认证技术3 H" \" L5 y9 E, s

      ( [+ n% `5 A' V* V+ P* f* f! E/ @" t9 [4 f$ |8 Z7 e

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

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

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

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

    + m4 A7 x% V- j; W9 C
    • 什么是授权,什么是验证?
      ( N2 L, s: n+ \3 p

      + q7 X/ g* T) k  K+ F& L
      : h- G9 S+ w4 ?& r: z, h3 s

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

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


    * n( C5 p5 B  r
    • 什么是HTTPS
      ! h& k% k0 Q5 n' I
      9 b+ ]/ C9 }6 i1 C8 Z

      ! v; i9 p7 D" _! m8 [: g: @

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

    1 U1 f2 L9 M% d: j9 a
    • 什么是审计?9 b3 F( G! P. i
      0 t; @7 z6 L- R6 F. V9 n. u# T
      ! }/ t# O* @7 I, y; V' ~

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

    4 D9 ~# F# f, [3 w, J# k7 r# e
    • 如何实现声明性授权6 P7 z! b) v7 c
      , P. H* ?8 h6 i# T  L: a9 w
      ' O; P9 L6 c( V. Q$ X/ L2 a. Q

    1、标识web资源集

    2、标识角色

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

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

    在 web.xml里配

    . d! B( l) Y- y, h
    • 描述servlet并发问题?; K$ U2 t  j- y( ]; e' K' l# f# l

      4 o( g  Z  P9 ?( C; l" w2 x0 K4 R0 A2 d

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

    ( O; U  a. ]; d; P4 ~: j' Y
    • 描述Web应用中的六种属性范围
      ' C+ C, Q7 M& d0 G3 p* _

      ) O& R4 i6 Q" r. F5 O( y$ O3 N: W3 x4 p! X+ g! b

    局部变量(页面范围)

    实例变量

    类变量

    请求属性(请求范围)

    会话属性(会话范围)

    上下文属性(应用范围)


    % W5 f: }- l; c/ s6 n/ K- h
    • 指出上述六种哪些是线程安全的$ m5 l% h: y0 j- \

      * {% C% Q& Y2 Q' p. ]0 ?8 D
      ! j2 W1 _; _3 D) z

    局部变量和请求属性


    * z8 P" ]% l: n# H* t
    • 什么是STM?如何实现?# t, ]9 T: [1 q, r

      ' M  q! H# k2 \2 L' Q- l9 T& y
      ! i5 y* M( {* F: U

    SingleThreadModel接口

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


    $ g( C7 F/ f0 y; n
    • 如何实现并发管理?* Y8 I' `8 @# h7 K/ I
      " {3 K! [5 D3 k5 w8 b4 |8 h
      , Y5 H& o& ?8 Y  A+ h- a% f

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

    使用synchronized语法控制并发

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

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

    . k" p* s4 O& T4 c4 [0 ~  G
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    13#
    发表于 2014-12-03 12:45:45 |只看该作者
    Jsp% b, j$ g2 y& E/ Z2 [1 p  e1 F- D
    什么是Jsp?
    8 R5 c/ d8 d0 M( g9 c2 pJava Server Page    结合java和html在服务端动态生成web页面的技术# I7 g! D9 d! _2 v' z  ?" x1 @! y

    * I( i' I$ ~) _) r3 e # E) P/ s+ s! j$ ~. K

    ' F0 R( k3 {. [) x描述Jsp页面的运行过程?
    , q, a6 @( |9 ^  [" b, a第一步:( n& m9 Z$ M! A9 v( n
    8 i/ f& h9 s  A3 q8 O' ~! Z4 |
    请求进入Web容器,将JSP页面翻译成Servlet代码
    6 l& u7 l5 S+ ?' O4 F2 n6 x' Z. T# S& a) h( P5 I, C3 ~3 v- Z* k( J% O
    第二步:3 ?% s" R) Q! c/ e& N0 Y
    - M2 E2 d( S$ M: @0 A
    编译Servlet代码,并将编译过的类文件装入Web容器(JVM)环境
    4 V) i2 y) ^0 n* H7 ~. }5 y% o% B: I! Q) H/ o, v, g
    第三步:8 P$ d$ r/ \) Q  ?) w9 U, N
    + R$ V  y" r* |9 z. b
    Web容器为JSP页面创建一个Servlet类实例,并执行jspInit方法
    # ], R: m$ k; n; t, D' ~' M9 \7 s
    第四步:) Y# {5 W1 {5 [) p: h$ z
    ' ]3 X6 T; {* f: y7 U& P
    Web容器为该JSP页面调用Servlet实例的_jspService方法;将结果发送给用户
    # L2 i, s' O3 r$ D' R& L; C
    2 E+ W) e' D$ z+ s6 v1 D5 j- k
    % P; w# I$ z% f7 R
    1 M: J# k# G% O! Y- ?; |: f, Y- R描述Jsp页面的五类脚本元素的功能、写法、并示例
    + y( W( l) b9 V  u$ k3 r7 a& V注释 <%– –%>& ~  Z9 L  r! t: c, w
    : L5 V: |  v% ]/ y7 A9 U# e2 Y
    <HTML>) n( @4 t: i6 A3 u4 k/ q. v
    2 T8 F9 i1 q+ u/ w9 c6 e0 f8 t) @
    <%– scripting element –%>
    4 N. a* T; ?9 V$ R6 y+ F  ]
    ; q: t7 S: J. a; T/ P/ ]</HTML>% ]  G; {5 K: O( u/ u
    0 b: \. V, N: R9 }9 t
    指令标记 <%@ %> 指令标记影响JSP页面的翻译阶段! }" X& C3 T& g8 P' n

    1 }8 q% j/ @& z9 g<%@ page session=”false” %>$ q5 |- {5 I+ \0 n

    , l  {9 K1 _8 i/ j声明标记 <%! %> 声明标记允许JSP页面开发人员包含类级声明
    8 f$ g- X) @1 X) G- s
    0 i. z0 G# b4 Z8 w  d( \- ?0 b' E8 z<%! public static final String DEFAULT_NAME = “World”; %>
    ' w3 H# R4 R$ N# Z
    " z+ Q* r$ g- U& u$ M4 j    脚本标记 <% %> 脚本标记允许JSP页面开发人员在_jspService方法中包含任意的Java代码& k6 O! K8 C5 R. o0 A
    . u; z3 m( t* Y# |
        <% int i = 0; %>
    # P: |, m+ h5 w- |# t% u4 S4 B9 l" [/ z, U) e
    表达式标记 <%= %> 表达式标记封装Java运行时的表达式,其值被送至HTTP响应流 <B>Ten is <%= (2 * 5) %></B>) Z* s! Y% W! h

    9 |. k% Z2 I7 V7 A- b
    : C/ f% I' G9 t
    " ~8 B/ L4 `0 g0 X描述Jsp页面中的注释种类和写法
    7 k- \1 k9 N# K" k9 h# J( b; }5 pHTML注释
    2 T) V1 _1 L& _0 c+ {9 d8 z$ f% g/ U5 r$ D. W+ A
    <!– HTML注释显示在响应中 –>
    6 R) d* i& _- N! ?) n' U' W3 f9 F$ c* y; X
    JSP页面注释; c9 Z* [  X" R% I1 H' V# z; o5 c

      k& n; W  D9 |! }; f0 s# m1 w6 {<%– JSP注释只在JSP代码中可见,不显示在servlet代码或响应中。–%>" H; d( ?& U) t

    ( N7 K: H; q& hJava注释
      t! [' m( c2 o8 @5 A- m( d# x- K/ t' ~4 z/ ^$ |. ~# _9 y* h9 n( W
    <%  q# Q6 F* G) {; n
    1 ^8 ^0 v8 N, J. Z6 y# ~
    /* Java注释显示在servlet代码中,不显示在响应中
    , D4 T  b7 r3 O: v  |
    7 }% N. r7 V9 N$ O6 _/ a$ C*/( Y0 F5 r7 j( o
    / h$ L2 w+ g& S2 r# h
    %>
    / k5 K, K% u" K; F5 T. n
    " h2 C8 M* U$ Y# N
    $ D: g' v0 k4 B9 p$ X) I8 m. v; d; a7 u! _2 u" G+ |4 G
    描述Jsp页面的指令标记的功能、写法、并示例# u% X* B' K: t/ p  z+ q4 t5 [
    指令标记影响JSP页面的翻译阶段. G$ w5 j- ^$ o/ ~3 t* x
    + B1 S! H& i7 C
    <%@ page session=”false” %>
    7 `4 v& N5 C, _4 r; K$ d$ V, r" k+ m
    <%@ include file=”incl/copyright.html” %>
    / i1 v5 A. V' g( z1 x, z& u! r$ k9 B' K6 t5 j4 W! W2 ~3 S
    <%@ taglib %>+ p: L% d; Y1 [9 M+ ?
    ! c, B: v( m! e

    2 N' x% I7 _, I9 _' a7 f! z& n; D- Y
    + N  ?3 y* k' G描述Jsp页面的声明标记的功能、写法、并示例; D  e7 b; O7 B% s6 x  Y7 K- x& F% P! ]: k
    声明标记允许JSP页面开发人员包含类级声明
    " o2 t. I9 I' ?  m! ~8 z- e) Q% @$ x7 ^: k2 E
    写法:
    ! O+ T4 @+ G( r2 V. g# l! Q/ B2 W& x# G
    <%! JavaClassDeclaration %>
    : g( e8 p0 V! @2 O- v9 @
    % k9 I* U2 ^3 y7 e8 G9 g6 Q) J* H例:
    ' i" Y6 h  i; D8 K, d
    5 N8 W' h6 }$ I' c7 }- f1 ]7 v! j<%! public static final String DEFAULT_NAME = “World”; %>- p% g7 T2 P( W2 w
    5 d0 |4 I% C: Y( m/ U9 Z
    <%! public String getName(HttpServletRequest request) {
    ! d  t$ Z5 v% c: H
    1 S7 c$ ]: h! e1 T5 q1 Ureturn request.getParameter(“name”);
      e9 i; e' I% l& J3 x! ~1 O& U% C7 P
    + @) J' U* [8 K& N}
    & b7 `% c; Y. [
    * G0 p/ D; S5 [' ]# l4 V* v) x%>
    7 s$ @! X7 v4 f" Q
    7 ~' M8 e* u7 U  F+ F3 R( y0 g<%! int counter = 0; %>9 F4 m/ e6 T) [$ y2 Z( z

    4 n4 R* e8 P4 V: T
    & \! m: p3 F1 ^# A8 D2 s" F
    5 _! d0 [* ^: _. g描述Jsp页面翻译成Servlet的规则5 @5 _& a$ y  W4 ~  Q6 l
    jsp中的注释标记被翻译成Servlet类中的注释
    3 [5 O, v% _: N9 m
    1 M: R* U4 P. C+ Rjsp中的指令标记被翻译成Servlet类中的import语句等- z% x+ Q+ N- _% [- M' X( I; Q

    % |, a/ P. _# V% \( sjsp中的声明标记被翻译成Servlet类中的属性
    7 Y% `/ h/ d! ]4 b# x, M$ ]8 B* i% T6 ?+ E& {/ g8 p7 D
    jsp中的脚本标记被转移到Servlet类中service方法中的代码0 q9 d& ~; @/ X) p3 S

    1 {3 n9 b; O& E6 P8 H$ U% Ojsp中的表达式标记被翻译成Serlvet类中的write()或者print()方法括号中的代码
    . P( [1 z4 N) d/ V% \" N% Z( f3 f4 H( h4 A% f! z! l' _
    * K$ \/ Z; U  }( B6 I+ c  N! x$ _
    4 g6 g  S. W3 {
    描述Jsp页面的九个预定义变量的功能、用法、并示例
    + S" \) |8 B7 J6 F: A! o+ Rrequest 与请求相关的HttpServletRequest对象
    * H; g7 X6 _1 b5 {+ R) X3 `3 L1 D) A1 \& y" I
    response 与送回浏览器的响应相关的HttpServletResponse对象
    4 @; s2 l. _  i) r0 B1 O. w0 a/ K, K
    out 与响应的输出流相关的JspWriter对象
    ; I. M' Q: C, A+ ^8 i" s& l6 r+ p. A4 {  ]* W  ^( F/ x
        session 与给定用户请求会话相关的HttpSession对象,该变量只在JSP页面参
    2 A7 j5 r& l6 T
    8 j6 B1 `* a2 V: e与一个HTTP会话时有意义
    % B+ P8 L) Y9 D* F( _
    1 p) j# R  l( N$ l. B: x    application 用于Web应用的ServletContext对象6 l" R4 S/ `- \4 K& y2 y  j4 j

    ' \, u8 T- K* y& _8 n. H9 k1 Aconfig 与该JSP页面的servlet相关的ServletConfig对象
    + M. B6 K3 y0 c, t' O7 |
    / a  i$ t6 O) W; z$ }pageContext 该对象封装了一个JSP页面请求的环境
    2 ]; r$ g5 F! r5 g6 Y, o- E9 {/ D
    ; c  x# z6 f' M( y# D( Y* l( b9 P' Qpage 该变量与Java编程语言中的this变量等价
    + e$ B( W, W( [5 [
    4 P. f* m; X; L3 J1 K4 t# [6 a    exception 由其它JSP页面抛出的Throwable对象,该变量只在”JSP错误页面”中可用9 J: P/ @6 A( U$ l

    ; x$ d, E* B; X  K4 p6 a2 j
    6 ]) |1 W2 P! n1 I7 l7 f" J& @: k3 p
    page指令的功能,写法、并示例,并描述它的如下属性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding7 K8 }* j7 [1 [$ y8 a$ E/ N
    import import 定义了一组servlet类定义必须导入的类和包,值是一个由$ f7 f& q, Y, H, G' o

    + P) M$ j% }9 s0 z: K) s; v逗号分隔的完全类名或包的列表。
    1 I9 |2 M. b* I# X. _( B; ]
    5 J( A8 P9 d2 q' T2 qsession session 定义JSP页面是否参与HTTP会话,值可以为true(缺省)
      E0 q, h0 P  w4 @: [, D
    2 K3 y1 p: T9 y( c! ]: j或false。0 f& B* Q( j' X  {4 L( L

    + e) }0 D! D3 Y2 M. e! \  v) ^% cbuffer buffer 定义用于输出流(JspWriter对象)的缓冲区大小,值可以为
    $ \1 k- y8 `+ V) m  W% l/ Q1 L
    8 F+ A$ L4 C, E. K3 hnone或Nkb,缺省为8KB或更大。+ M% f& l4 `( e/ b8 K
    ) d& a; T" P  {% [
    errorPage 用来指定由另一个jsp页面来处理所有该页面抛出的异常
    : v% d7 m0 i3 F- P! S. [5 @# M- d7 U8 Y8 x" P
    isErrorPage 定义JSP页面为其它JSP页面errorPage属性的目标,值为true或+ b9 P6 n' b9 R6 o# y9 U
    ; T4 ]5 t& u* c3 M5 ^
    false(缺省)。" V" Z: s7 R6 V, \/ b

    1 L' r' e2 y, wContentType 定义输出流的MIME类型,缺省为text/html。3 b+ \4 r! O) c: Y) [

    / i; P# m' `, ypageEncoding 定义输出流的字符编码,缺省为ISO-8859-1& q. n2 e: T. G4 o' O

    0 x" y+ I9 t5 C4 ]- j& k; m
    + ^# |0 x9 N+ w4 {. n& |: t; F3 g, x" G8 v1 J" ]9 p
    描述MVC各部分的功能?MVC的优点?MVC的缺点?
    5 d- D7 T( Y: EMVC各部分的功能:
      l* L% }* E2 H' \& M# a$ r" q
      D5 p( P: j) B" a! UModel(模型表示企业数据和业务逻辑). x' M, s& Z6 ]3 l" h

    9 ^/ P1 C: J9 E2 ^封装应用状态: d2 f2 `) R) Z  X

      z+ X8 H. A% T0 q# C% A" {响应状态查询6 x) _- ~/ ^) _- ?& ?% p6 ]( z

    9 f, Z( C2 y1 R! M* b* j: J暴露应用的功能- J4 R$ c( R0 O, E, L
    8 x3 b1 x/ X- w; q2 b
    Controller(控制器接受用户的输入并调用模型和视图去完成用户的需求)
    0 z% t' B' [/ F5 n, L9 L" |9 u( S' p3 @- a4 u3 Y, N& ?, c  R
    验证HTTP请求的数据! @- `! K" K; |+ F% @
    ' ]! D, X$ N, O/ Q1 R) f$ ?
    将用户数据与模型的更新相映射
    & a* ]+ r, ~: V% i9 {; O6 B4 n0 }; O) W0 D5 C
    选择用于响应的视图' h% k4 V: R  ^$ l# H3 i  r

    . H1 H& S$ ^3 ]) J, v" K$ FView(视图是用户看到并与之交互的界面)2 I% e6 Y9 N0 A2 }' }$ V

    3 ~0 W% o- p$ C产生HTML响应% B/ R% X1 ~( z8 T2 g$ V# |

    0 `; E% t2 k) w- `: d" C请求模型的更新2 X5 Y6 b" k( Y* }1 k
    0 J/ Q! I1 }0 q- q* T
    提供HTML form用于用户请求8 I. W- J; V" t: c
    8 s  Z" _2 G( n$ s
    MVC的优点:
    0 n3 q9 L* p/ D3 x. b8 T' ~4 W3 o# C' y& ?
            低耦合性:视图层和业务层分离
    7 D+ l% b- e9 M9 E; u' m
    0 y! [% L0 p# x8 X: U高重用性和可适用性
    7 c! v" E: M, K9 J& _7 E5 @" g
    1 U. F9 L) d* l' i* x7 g较低的生命周期成本; r# W: N! `8 {7 ]9 |+ q
    6 r3 e0 [4 N% X
    快速的部署, V3 j6 `% W+ h# E/ @4 y, x4 d- t

    ( I  W! |# ]3 `) d$ `& d- b可维护性
    6 ^8 K+ P, W( h
    ( }! e. V9 ^3 n有利于软件工程化管理
    - Q  A3 S5 s/ @/ b1 K: \2 F% r' P
    提高软件的健壮性
    - S1 g' i, u2 e7 n. o# b2 U. r; E' Y8 j4 w2 [  y4 N! T
    MVC的缺点:
    ( r. x+ S  T( C- R- K
    4 G- r, ]; o3 s        工作量大,增加工作的复杂性,MVC不适合小型甚至中等规模的应用程序
    1 }/ a! H+ K' m$ Z6 Z
    5 B8 M4 ~, y) N; o7 g8 O
    8 x0 m. A+ ^1 c/ }/ F7 `+ D8 l7 c4 z1 [1 W' ~/ y/ J9 d1 h
    什么是Model 1结构,以及结构中各部分的功能
    9 a1 `* y4 d. {3 u, ~结构:jsp+javabean
    ( d: p2 r) }: e
    * q; s/ P: E1 KModel1中使用jsp来处理web应用中的视图控制部分
    8 Y5 y/ F# E5 h) }' E" P/ ?5 [5 Y: }  A5 i* K9 \' s: G
    Javabean收集参数  c/ H: F4 M; c. \  D) h0 q

    ! `' a! ^3 {5 ]' |
    & L: T7 _7 B$ F, |" ?: I% K# g- n( A4 g! |
    什么是JavaBean?6 d5 V5 H9 l9 J! r
    用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。
    : {* R. f* b1 y  U4 ]
    ) H) M" M+ u% a- `* m; A
    9 H; q( D$ G; m5 D/ T. M. v$ _% y9 {2 v
    JavaBean的规则?
    1 S- v) [4 `; Y  m( V8 d3 `' t6 y使用get和set方法定义属性
    ) I/ _# b2 f# l- w0 {' n( c. A2 A: K; B- Z/ c  J' |& ^
    一个无参构造方法
    4 C( X6 b% I: z) l& v) E1 [8 V! c: w) S0 h! B* x
    无public实例变量( 所有属性私有化)
      w& m. L9 w2 {1 @- I% Y+ ^$ K& E! w/ G0 C" j' k  n2 A
    0 K% ]2 h' i& i# Q: Q3 \" K! u4 x- ~

    ( C  S, [5 C( O4 H什么是jsp标准动作?包含那些?分别都是什么功能?如何使用?8 l0 U2 k, }9 o! Q+ B: J
    JSP页面中使用类似于XML的标记表示运行时的动作
    1 [+ ^' N- H6 T  P: X, L) ]6 ~( F
    9 S& P/ g2 a$ l  J4 X* Njsp:useBean# E  e1 w1 I1 w2 L+ I, T5 y' x

    4 N- R% q; i7 ]3 Y* f9 Njsp:setProperty
    : C/ L2 b  B: F! o! K  @8 K6 @7 z, s* J7 {2 [
    jsp:getProperty7 k( ]+ ]4 n1 E/ C
    4 ?+ A, r" H. C, z" y
    jsp:param; I# q5 ]( L- H" m' s8 ]6 z
    3 s* u( o7 q; T
    jsp:include9 d+ v' s9 Z4 g. h, d- c$ G2 I

    & o+ B+ T. p- l' D4 q0 S- b; o9 u& wjsp:forward9 f9 q+ x3 u* `  v- W( Z

    - N  A3 b" x  p1 i% y
    5 V6 f/ F% g. k4 H3 U9 v( ]) B! Y
    用代码示例如下标准动作的使用:useBean、getProperty、setProperty
    & {$ Y6 R$ Z$ Q# F- {6 L2 D<jsp:useBean6 {4 f3 z# l# L/ {" l! R; x

    3 e9 k3 T! N1 j3 Z& K1 h# kid=”myForms”
    3 ^1 G2 W# M- c& m, L' y; K+ Z% W1 s/ F3 j) @% u2 l$ P& x
    class=”com.base.mystruts.forms.MyActionForm” scope=”session” />0 V+ G7 _5 O' k* Z  u
    " M9 k! Q" l% c- |0 z% B
        <jsp:setProperty name=”myForms” property=”name” />: d0 Q0 S  j  O* e7 Q

    & j6 T  I4 V: G- P/ Y8 t<jsp:getProperty name=”myForms” property=”id” />
    ( e2 O/ x# A+ T9 ?7 z( U  r: O: p

    # f/ X# ^2 {" t5 n9 B
    & t8 g' X7 v$ r& }/ b+ g描述说明Bean的四种scope
    1 i: w& m: m- ]- X1 p" m9 |, v2 P- R4 Y' @page
    3 d% f, s% V9 A  w+ A; f
    / f. X1 }5 _, J2 x$ d! G4 krequest+ ^* z+ n, ^# F
    ( `3 V; U4 k4 e; b9 H3 c. ]
    session
    . T- g, c6 i/ C: |4 n% ^- N) z' N4 R% y, g- F7 y5 [
    application# p4 h( n: ]2 h. h  w' J
    0 I. W3 F4 V: e7 ~6 d8 r
    : O* J  f% p& N& s) H* K" l

      z) b  j) l& Y" C& m* o描述说明页面上的字段和Bean中属性的对应规则; J. a: e' M8 X& X' G4 v
    id 指javabean的变量名
    1 Q# Y1 S' |+ @+ r! ^( G, b' }+ c1 r/ J7 c
    class指javabean类的全路径
    1 T: Z3 G/ t: r/ @# x
    ! j0 T1 }7 t. L+ U4 L& ^scope指javabean的应用范围- l6 h+ k0 @" ?8 ^2 ^2 F7 `* S
    8 v0 D6 n6 t* m* }) ^4 {, Y
    name指所用到的javabean的变量名1 g+ Y, U9 D- I& c0 U
    9 n0 O3 Z  s$ w
        property指javabean中的属性
    # d# r3 L# g; D$ J, C5 x! ~0 y7 y4 q1 a3 u; J* w
    & C/ S1 Z# [9 g5 ~; ~

    $ o& Q; u" F, b3 ^3 j  O/ M. E描述useBean动作的处理过程
    5 T, K& Y5 x7 ]1 x+ Q- o3 e# J; t使用id声明变量
    - k) R) {, I& q% j6 h  [- D( H' R: s
    . {3 ^' P" M9 P- W9 V; ]) B5 P试图在指定的范围内查找对象7 z# K5 c( t5 t9 @
    " L& z; R( U) n8 G7 n
    如果没找到2 a4 t9 c6 b* Y2 `$ [+ M7 k
    + d' A2 q; W; f! U
    创建一个类的实例
    & X+ f3 I; H( J. R+ O4 a5 ?1 T" N5 f5 u* i  w# h8 p4 h7 A
    执行useBean标记体初始化对象7 {. U0 ?! R. S1 F" d) [
    ) _/ }" ?: A1 T5 l& L8 C" w0 p. Z4 n
    如果找到
    - s! d& j. V1 U2 |2 M, G; E3 }9 S; j
         将对象转换为类指定的类型. ^; F2 J3 G! J

    # u9 J+ z4 h  q' Y, v7 {. M6 H5 ^7 i 0 z; S6 A' @, F

    0 y# a# e  _$ E1 Y描述forward动作的功能
    & P9 P. Q) `/ X使用脚本代码处理请求时,可用jsp:forward 动作产生一个不同的视图,
    1 L3 K3 f5 O, _' M& s- G
    2 W- e% j2 j( l( W& h4 T6 Y7 v使用同一个request:& H; N+ W8 @. f4 G6 X8 I. \) G
    3 R- K4 M& k+ Q/ S4 J, M) H
    ) c( I# @) G( t7 v7 K4 _9 ?

    ; E8 ?1 A; z8 o5 x什么是Model 2结构,以及结构中各部分的功能
    3 k% U; [! o# |- l/ Jjsp+model+servlet
    2 u% M+ Y. D+ N3 l+ E  U' n% |# u
    7 Q/ f* e; w! q+ P" r' VModel 2架构使用MVC模式,JSP页面充当视图,Servlet充当控制器
    & W/ i/ E* Q; j/ i  g# F
    * K9 C2 k+ \1 t0 N2 c: fServlet控制器:" i. i. r; c/ r& v$ o
    & J1 X- p, ^7 I) B2 H; K9 Q% E
    验证HTML form数据( A' ~) k4 r! L
    ( ^6 ]! A+ p+ D
    调用模型中的业务服务
    & ]% c1 Q- X" Z9 z9 G) t
    4 x; i' h! u+ W& P( r6 N+ N存储请求(或会话)范围内的域对象
    ' D% a, M7 K0 I& i6 ?- n) C1 @' x4 Q  R6 C& k
    选择下一个用户的视图! ], {7 z, i: `: m$ T! j3 F

    6 d1 a  j/ W) g3 f' Z2 ~JSP页面视图:" W2 {/ v1 y- R  y: W1 V1 [

    5 \' z" |- T. v  ?' A使用用户界面(在HTML中)* y4 q9 b. L; Z' z/ f+ O
    ) Y, v$ F1 r& H6 T  ?: w8 i
            访问域对象
    2 s# t# ?0 R( b2 O; K, l+ b, ?9 P+ {/ B. G3 K9 x) {& [
    ' N. ^4 v9 }# G! ]5 a7 \
    ) D* t7 z3 D5 I- d, Q
    如何获得分发器?分发器的功能?
    : c5 H3 q$ y/ k6 k8 k上下文对象中的分发器:
    4 b8 {/ S$ H0 n
    $ j2 h& q4 c7 I& iServletContext context = this.getServletContext();
    + ], z+ L$ N7 G, o$ [* m+ a
    7 C/ B: D4 B: b! ~# N" gRequestDispatcher servlet = context.getNamedDispatcher(“MyServlet”);
    1 ~$ b$ v: `4 |5 I+ z1 X& U1 ?  Z, I: U
    servlet.forward(request, response);
    " ^( b# \& X3 S8 v% Y, f
    ; _' @& E" [  F- o" j请求对象中的分发器:* M* H* d/ w8 `) U' |2 U# _
    : m! n1 p( g$ S7 y+ h
    RequestDispatcher view = request.getRequestDispatcher(“tools/nails.jsp”);1 Y. P' M2 r& n8 s5 Y

    + }0 E2 e  E- I4 H& Y( rview.forward(request, response);' n# i: i0 L) _: O& I2 q7 U. Y

    3 m9 w0 D3 m3 S) O: v2 p可以将请求转发到另一个jsp页面,并保持请求的传递性
    9 g/ e! G6 q; @& P5 W6 t& f" u* ^. i2 D  `9 E% l
    ! C: ]# o& x1 M- d! k

    % m3 b9 Z& p' K3 y, uJsp中页面跳转的两种方式?, C: W/ c; M4 F" z, i" F. f/ D0 \
    使用分发器跳转页面6 p( g' J7 y7 b6 h3 n4 M
    RequestDispatcher dispatcher = request.getRequestDispatcher(“url”);1 U2 D5 \0 t( n) x! d, V6 O

    2 A# d" B2 N: O( ]7 R+ ?. qdispatcher.forword(request);! K& K& G' V) u$ Y3 O/ Z

    6 _# U/ e5 v7 O1 l& t/ Q  K3 R/ k* b    特点:保持请求的传递(上一次请求中的数据,在下一个请求中仍然可以得到);2 r' [3 Q( W7 R: x. E* c
    8 M& E' l6 ?. H
            转发的页面只能是同一个Web应用程序的其他Web组件$ h( Q! U# F0 \. l, {

    * k% ^3 z2 k: Q- f' X- v使用重定向跳转页面7 K9 d+ ~' ^/ |- b
    response.sendRedirect(“url”);6 r) h9 o9 F9 a9 {  `$ i( v
      T. u1 g5 K! c$ b, H' b
        特点:产生全新的请求,(上一次请求中的数据,在下一个请求中不能得到);* {" s. R+ `# l8 G  H

    8 m7 W- `6 }8 a, S' U5 ]+ i7 f        重新定向的页面可以是任意的URL
    6 o8 l: x1 c  {: h$ d
    7 V3 n) q# X7 O) ~) ^+ s / t0 Y+ a9 M! \* M7 X4 w2 B2 \
    " {6 A( X( j8 P& G& F% g0 a2 W4 t
    描述Jsp中引入另外页面的两种方法,并比较两种方法的特点?+ P- e2 R4 D+ w4 D* Y: c
    <%@ include file=””%> 在编译期间把另一个页面完全嵌入这个页面,可以说是一个页面! Q5 r* _4 J0 B1 j  W: D
    ( v+ o! N: I4 p9 a; ]/ ?4 H
    在这里可以共享变量1 C: W$ ~0 [( p

    / x  }3 G! K  ?" W: [5 S& \<jsp:include page=””> 动态的再运行期间把另一个页面加入这个页面,可以说是两个& _/ T2 J* X3 I+ ^1 J
    1 G& }4 l* n4 i
    页面,不可以共享变量
    - P! g: y9 U6 V' N
    $ y7 R# |: U# f / h: Q  h) j5 X+ {' {
    6 m% n/ d, s2 `5 H8 [1 w, u# T9 m8 |
    什么是自定义标记
    5 k8 C) _' l+ s: a( V* b, S自定义标记库是一个Web组件,! ~, H4 E. `6 s* b
    2 v$ r+ q0 I  a$ t
    包括:( p5 T5 ^' [7 g; e
    1 F) K* P) Z! y9 p. [4 I, }: G' q
    一个标记库描述符文件(*.tld)0 U$ ^3 |& L# m; x+ s

    ' j/ |: ?! f" ~% U4 K  I, C所有相关的标记处理器类(*.jar)& ^  z& N) ~7 o7 I
    3 E$ e$ S/ L, k0 A* P% M
    5 L$ y. J! \1 l0 }1 H/ o0 p

    : b$ d3 {1 f; E3 I  G描述使用自定义标记的步骤,以及每步详细的工作
    ! q+ z" I; G  @! J5 n$ F使用自定义标记前,要拿到.tld和.jar两类文件- |$ v7 o) G5 a0 F, c
    7 H& Q9 N. E( d/ E( h$ U
    把.jar文件放到WEB-INF的lib里面。$ X3 r7 c8 U9 s
    把.tld文件放到WEB-INF根目录下。: x3 ?  U4 [* I. N
    在web.xml中配置。
    $ R1 U2 y2 Q; R9 K! t7 W8 Q. i<taglib>" J9 G' O/ U) B5 c+ H( T

    4 h) _; R. I; d* _0 x0 I  k2 `<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
    3 C# v% |6 r# e# s% d5 E% I1 X
    0 k( B) A% R9 K4 l# M     <taglib-location>/WEB-INF/c.tld</taglib-location>2 q; y$ _5 v: e; S3 E

    + U- n6 G+ |$ ]/ I0 b8 x' ^* S</taglib>
    . `8 B0 U; c1 F4 G  E8 |6 t" N  O) |  l# Y
    在页面中引用。  i& W6 c8 v5 z' c1 s
    <%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“s”%>
    3 ?  R5 T8 P& |( f; B, l7 f' Y0 f1 m" `/ @2 F) f7 ]! Y! T3 A
    uri必须与web.xml中的uri对应
    3 _$ R5 l6 ?, J4 V0 |2 @* G0 o4 L+ M3 D
    prefix是前缀,用来区分是哪一个taglib" S7 X* I1 E! u! ?% v

    0 f, U+ v+ X# i# F% B# _8 ?使用标记; d( Y4 q7 n; ?
    格式:<prefix:tag名称 属性>
    1 i9 l, U$ L/ N8 b
    : y7 t' x: [) T) U- A+ l& y; Y<s:forEach >
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    14#
    发表于 2014-12-03 12:45:59 |只看该作者
    在tomcat下配置数据源
    - e/ p* b: Z5 M( u  g: o; E1、服务器与数据库的连接
    - Y6 L3 H# e" F( R  ^8 ~) {5 x/ D- D- o# v$ r
    配置server.xml文件
    ( j( X& Y5 @. x2 w
    % Z2 s! d' c( g# U/ \9 H: b" g, `% h1.oracle$ g, A! x6 Q1 O/ \% y, d
    ) d9 ^. l! ~3 ?+ @" T7 t0 g% J' U
    <Resource name=”jdbc/company” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”1 |6 H% l) c; k. M. _7 H( \3 O' J

    4 H, r3 i' I% M: K; |3 d                        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”9 J& [+ m3 e# y; F1 B" q& x- n

    3 F: d  v! z$ {$ o) Wurl=”jdbcracle:thin127.0.0.1:1521rcl”; I) z. P1 C: f) R( P9 ~% l

      ^; V. G& T5 X5 {& KdriverClassName=”oracle.jdbc.driver.OracleDriver”+ [: J9 `7 W% _$ Z1 u/ o
    0 K. g0 m$ e6 F# C  z
    username=”aa”' r& L0 {5 b! @! z( Q' D
    - d/ Q( w7 x+ \! S  R! X+ F
    password=”aa”
    / b2 p* h$ C" u9 G9 {2 F6 R7 i" V) k' |8 s: q5 B( L% X# b
    maxActive=”50″+ W# `9 U* U; h$ T8 }

    7 T7 Y$ ~- R& S) U- {5 rmaxIdle=”10″
    . t. A" A- K5 [6 Q  w! z) f7 R: Z6 @. m+ d7 g# ]9 p3 m
    maxWait=”-1″
    & j7 I: U$ v' R- ~
    ( G7 {) e' n7 _; s& G/>. R& w- H# A9 W) Z

    4 d& {& l& e+ A2 l6 s7 A- v2.sqlserver
    ; @1 [) m- E+ `. \$ B; g! Z$ h' C3 o2 L7 \. }4 T
    <Resource name=”jdbc/webpage” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”3 Y+ z& P3 V* Q1 u/ W) p) c
    9 i9 t3 m6 i: P2 n' n, d
            factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”2 a2 U! R- ~) ^9 W( [. h; M
    ( ^* A' L) p/ b( C0 f
    url=”jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;
    ! i' g1 y4 K' V3 G  I; t* Z" \. T& b! P4 T+ o; ~% z1 S% X8 d, }1 c
    DatabaseName=webpagetest”# Q) I6 P! h; A  i4 O  d8 R
    2 q1 W4 K5 z5 N1 V" z0 n
    driverClassName=”net.sourceforge.jtds.jdbc.Driver”- t- _! C* Y  S6 f; S4 S& X* Q

    - O. }2 C, M, U0 v9 qusername=”aa”
    ; g' g4 P4 ]. g, I9 q
    # M& y8 \% f- ~7 S- Q1 k; Fpassword=”aa”
    3 Y* ]3 n/ q# x* \; _5 b; J/ N# G% A8 _5 e
    maxActive=”50″
    $ w- q9 y9 r; c* h7 l8 Q. L, ^1 s) z- A! l4 R2 f7 C
    maxIdle=”10″
    ( r9 J$ x3 K9 ]! j1 w
    # C6 E4 g' j/ q$ A( p( T1 rmaxWait=”-1″/ ~3 g! H7 D( u+ Y

    . x9 a7 F. C8 a2 t/>  U  A+ D) U7 J5 F

    ( P5 M9 v, L0 f% O' i( `4 b; k2、配置自己的web应用的xml文件
    # ~5 \; f3 L& i* V% o0 |! ?7 R. i! s; a# C5 d' T" d! Z
    " }! X8 E' q. `7 G7 ?8 ~
    6 e. s, \" M$ d0 |! k* B
    <Context path=”/eb03web” docBase=”F:/workweb/eb03web”# r* ?8 _( R, u5 k
    $ \; r0 i" i3 B
    privileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>
    & ?3 {6 q. ~6 G4 U1 a" Y2 u% E' h% Q% Y
    <ResourceLink global=”jdbc/company” name=”jdbc/company” type=”javax.sql.DataSource”/>
      l6 Q# d8 Y. Q, k/ Y
      F$ u3 r" T4 T2 `$ I3 K: t</Context>
    / @7 f6 R: [" O1 g3 L* ]
    / E) L1 m& ]. u/ ]( w6 V ( W0 U$ K, @- H0 M( J9 r
    . Z9 z/ u' g7 ?) p9 }
    3、配置web.xml文件& z5 e5 a8 }9 S0 R, k, @
    - g1 \, j& w2 l) ~8 T1 L
    与服务器建立连接
    - u/ d6 H0 \$ ]+ H+ {4 U. ~* `
    8 s  Q* {  N4 f4 d0 i5 N<resource-ref>7 ]5 J/ [. |8 ]) y$ Y% J
    5 E- {' S! J2 z
    <res-ref-name>jdbc/company</res-ref-name>; Q! {$ ?& a$ U9 P0 N. c/ {( Y5 [
    2 ~: t* Y+ h1 U, j
    <res-type>javax.sql.DataSource</res-type>
    - V: l2 Y" Z0 ?# P% n  \& W
    0 `% M, U7 z7 ?5 W<res-auth>Container</res-auth>
    / h1 g9 [+ B7 F' R, d. }5 z+ j7 W
    </resource-ref>) b+ L$ S9 d& E! X; i4 E  }* T" d" O
    " b( L3 E: a1 j' S- u' ]  y
    4、在应用程序中不直接与数据库连接,通过DataSource连接池建立连接6 F' t9 F# d. @2 t$ a5 e

    , @2 @  J, T9 p2 H% H//1.在程序单独用时设置系统的属性,在tomcat下可以不用配置,3 s3 W. {* h0 L; E+ g

    1 n. K1 }0 R5 oSystem.setProperty(Context.PROVIDER_URL,””);; o) D5 Z6 N  G
    - p, k0 b, }% D& N; b* O/ K- q
    System.setProperty(Context.INITIAL_CONTEXT_FACTORY,””);2 P4 Z  a  z- j# x4 Z9 L. U
    + T) A9 y5 b2 A; t% T( r! F( H* ~5 k
    //2.创建一个上下文对象8 |8 h% o, f3 e$ m% L) U

    1 d( n3 G  E7 X" Q3 V) i& HInitialContext context = new InitialContext();
    # r, C. p" z  p* h. v) L2 N  e" D0 b8 k; A% U2 I2 Z2 x; t3 p
    //3.通过上下文对象在连接池中查找DataSource
    - \8 T4 p" H6 ^9 ?: i" Y  u9 D$ W4 S( \$ v1 y
    DataSource ds = (DataSource)context.lookUp(“java:comp/env/jdbc/company”);
    ! m, }7 W2 a5 f3 ^; a
    & `0 `! [* m  r( R( n- P//4.通过数据源建立连接
    & ?" m% w  d0 V
    $ L' f% Q( F8 t, F) |4 h5 Mds.getConnection();
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    15#
    发表于 2014-12-03 12:46:30 |只看该作者
    ORM对象关系型数据库映射
    4 J' \. _. z% v. D( h$ g8 G) F- f/ y(Object Relation Mapping)  |; ~3 r. w! l- t) ^. I$ D
    ; n1 V; Y( E. O- u
    一、映射的特点% c1 y4 p5 r0 A

    - M1 {4 e& n" w# b' p  O$ t1.一个对象可以对应多个表
    ( L9 ^. d4 J5 t
    ' y) c- }8 u- O! @. @* ?+ d% {2.一个表可以对应多个对象
    - s7 [  o$ p  J  `/ s% Z; M: ?( K0 b2 k* w1 D
    3.对象和表的关系不用完全对应1 Z) O7 j$ \/ S  r% p. p% ]

    ! |3 g$ e7 o* U6 X& E( {$ }4.对象的属性的名称和表字段的名称可以不同
    + f+ l* ~) {; M& `# [
    ( K# @& _# i& k8 \# J/ d5.类型可以不同,但数据类型之间可以转换- P& d1 }$ `1 L5 s' u
    ! G% n  _& B9 ^- h' F, q( Z( G# C3 @& E
    6.对象中必须有主键,数据库的表对主键无所谓+ N% z' `4 r, q$ X  {

    % j7 g: i" y- ]- X7.数据库中有主外键关系时,对象中可以有,也可以没有
    8 }+ W. J0 n. v  X! ^/ a/ w  u' W; T' e3 V8 O" U& b2 F* Z

    4 k2 R& a% ^; i( @* w4 I/ l9 Q  h3 W& Q/ q, I
    二 、有一个映射的描述文件————>xml# e2 g- X9 _2 e; j* P$ u, G1 z

    8 g5 [9 w4 z2 [三 、怎样实现描述文件————>一段程序+ l6 l7 S  G/ j/ m  J# y- v0 H

    8 H1 C! r3 {0 H' y1 x对象 映射(mapping) 数据库
    5 R2 K. s9 b, t6 v- J0 Q# ]( {3 @4 x: r- c" m1 ?1 D
    user0 W" X9 I" G' j, X6 J: W* T

    * I* c& {+ M& W  Y* X8 Yid=110 {4 r) n2 a+ A$ O+ @- T/ q

    7 A0 E7 I& ~4 T5 D$ Rname=”张三”———— > (1) —————> tbl_user(id,name,age,tel,address)6 H2 ~0 {# J( ]1 n0 }$ H0 l3 ?0 ~

    + B( r( c3 @0 s" gage=25 <————(2) <————' i: x) J$ U7 s, [& y& V3 J

    , j" @  B7 D$ [' G& U
    * S( M+ J. k; O( J3 x8 {- p* z
    : o$ K$ B. S  D7 x* U7 ~. X# ?% t(1)从对象映射到数据库- Q* |% p% [" G1 U. E

    * X6 z$ B) @& t+ E  ~( V1.JDBC
    : Z% m! W$ }- G' p" u/ `6 c
    8 _+ c) X* I) k2.根据描述文件来动态拼接sql# D' A( S) A0 M  u6 m
    ) \% T+ |  O3 ~/ v
    3.执行,添加到数据库中; }5 e, {; I' `  q' T
    0 ?, Z) u7 I. k( Z8 |
    ! ~8 ~# Q9 J( A- b* U- D5 l5 Z$ {
    , C% W' x* a( }% D7 h. z
    (2)从数据库中映射到对象
    8 E7 z: s" ~, H; _, h' M6 x: h# g% V2 l1 J$ \% {; T) y
    1.JDBC& K# V7 N* r+ v; @6 ?$ X2 X

    ( G; |. W# H* x+ l* i( @2.拼接查询sql
    ( Q% r  c' z1 E/ O4 Z/ H5 X- f% \6 Y- s, ]/ m4 }
    3.ResultSet, r- y$ x8 [; H, y6 C7 C
    - P0 V# B7 L$ T. ~2 `
    4.Model 5 o  c  e& {9 {  e- `9 e2 c# y4 e2 @
    9 [( E8 \2 D: J5 t
    2 F& n5 U) E- u/ b
    0 _; O" u1 G7 I* T2 ^/ }
    hibernate
    ( x! R4 {5 g3 ^- n2 z  J开发流程:3 b$ F* f) Z3 W

    * p- B7 h: y3 w$ o2 M" [% N是什么?" X" T) B+ o7 ?% M( ~+ |
    hibernate是一种基于orm 的轻量级的框架+ k0 @9 [5 ^8 x4 N- D8 x
    ; B5 j/ `" i* q5 |! f
    $ s1 Z0 h1 O9 l. U- U. O* H

    , n; K+ {# L( \! l有什么?
    # ~5 c. U3 H: A. W$ I  R1. session 保持连接状态(依赖事务和连接池)
    . m# e  b, h6 I; y) l; b
    4 D* o+ u- z5 w9 z( p2. Transaction事务
    8 ^: k, S+ r; _& T) d* {6 x, `7 Z  G5 B6 a
    3.
      r% [$ j& N" O; {' b( nConnection Provider 连接池7 ~: L2 u' C- w! ^8 g& h
    / W* l0 @5 z, K$ O& E

    8 q: J7 |2 i5 C+ N) m7 K) ^8 G) y8 h
    能干什么?
    # ]3 \1 A, }, N1 L1.orm7 |6 e: t7 X* T4 k1 s

    3 i! d$ p* P0 T( t- i" z2.提供操作数据库的接口,简化数据持久化的编程任务. r' B$ |  A: ?  \% E* V  y

    , l3 x6 B8 \; y* \4 F8 `* E  s
    / [( R- ?0 G, X0 K+ a* a9 a* ]
    # n, e- S% `2 A1 m8 G怎么做?: c  _$ l) E  b+ U+ M
    1.搭建hibernate的运行环境,将hibernate的包和hibernate所需要的包拷贝到lib 文件夹下; l% _: z; R/ {( \1 b
    + }, s7 Q  I" ~+ q% s+ @
    2.O(vo)8 m6 F$ t# e; [
    * l# p, e6 S3 ^1 V% E: P4 j
    3.R (关系型数据库中的表)+ E% `' a& R. ]3 l& b& v, x- v

    0 c% f# H" a+ ?+ n, J4 {4.配置文件
    6 U) N) B# F# _& ]$ U0 U2 R; D- n+ Y' Y4 p5 x& V2 p
    4.1 cfg.xml 放在classes根目录下,默认名字为hibernate.cfg.xml
    ) U! q4 p. n6 c
    3 n. Q( P# [- A. y" a& }, Ka.与数据库的连接
    4 }; k* j  R' w* w' p/ I2 B4 J
    1 O8 {0 o0 K$ e# M+ B& V: G- h% Rb.可选配置
    ! }$ d& q( g8 T, J, F, L( M1 T% X: g9 u% U- c: V: w
    c.映射资源的注册
    + A4 q: e$ T" z
    * Y# x1 G# \: a2 q0 }4.2 hbm.xml文件 名字与类名相同 并且与类放在一起8 f0 G$ ?8 X( z" J8 A
    + s; R8 U5 T) u/ @9 N
    a. 对象与数据库表之间的映射
    * Y! v! ]$ O! \  x$ g: k3 l
    ( M. W1 F- v* i5 pb. 对象的属性与数据库表的字段之间的映射
    % ~, F9 g* b% p( v$ P# _1 l( C- m7 S0 E
    c.组件之间的映射
    7 e5 P9 q/ L# m; g+ U* N7 M4 u( j0 |0 P3 C6 q4 D: {
    d.对象与对象之间的关系映射& }- B7 p2 G7 ?: R8 y8 n. V) G

    ) F" M% {9 l( ^  g5、客户端7 f- N& q* ?) Z* F
    / B. l; c. x. h# c4 o  m) y$ f
    1.得到SessionFactory" I* @7 |! S# x7 t

    4 l, H- ?* q0 ^9 c# k) [( W2.通过SessionFactory 工厂来创建Session实例
    - s! u9 {0 N) a- l, u( P( w5 v9 G# ~. V) u9 J
    3.打开事务$ m  m2 M6 \; t' E- r
    + k. f( p. L" a* m0 Z; g( O
    4.操作数据库
    6 w1 \+ h+ m# T; D& Q% s
    4 a" A  v$ k% u  ?. d& {5.事务提交
      B* A& y: a3 a* y! k
    ' W( v, \' b5 r! Q5 h6.关闭连接; ~( I( m. j# S& W' ?, ?
    + `  C: z" R: O. m, f
    运行流程:. [5 v5 M. h9 O7 B) u* `2 ]
    # [/ Z' C- y( D
    整体流程0 o9 K) b+ W; ]+ `) a8 [2 e- J) I
    1.通过configuration来读cfg.xml文件
    ( g+ ?4 m/ m) D/ i% f# b3 F! r0 Y; m  D# p7 N: l" O* u6 O3 C9 k
    2.得到SessionFactory 工厂(根据数据库的连接来创建sessionfactory)* M6 ]/ L8 m3 V. Y4 ^8 ~4 d

    1 m  C% V8 l7 F+ _9 r9 \4 O3.通过SessionFactory 工厂来创建Session实例' B5 V7 @+ W$ k' i* b9 |" z

    ' u2 u  ?! b8 ]: V) g4.打开事务
      g+ _7 b8 Q: ^# Y% Z5 O* X! O* o: S: `3 \. B
    5.通过session的api操作数据库
    7 }, y( I. f, p, ^+ O3 ]7 Q! }4 M3 W& t3 P3 ^" i. }1 s
    6.事务提交
    . C+ a5 P5 ]* w- G
    , C7 \+ o; y$ W. i8 B1 m% u) f* l7.关闭连接
    ! O, S' L/ e5 h; A4 n6 D
    . H5 m( ~, R$ V. r
    0 F+ j# q' t1 ?+ ^6 Z1 f: L4 _% K' l( g( J
    save: u3 V1 ]7 |8 G, ^8 n& W
    1.to—>po# Y6 n! Z! y4 k  M; k' w/ _( @: S
    8 \; [) }. w4 V8 k9 {( i( |7 C
    2.根据model和cfg.xml中映射文件的注册来找到hbm.xml文件
    * j+ }3 v& V5 M
    ; M4 @, p' u, S7 a2 o3.根据hbm.xml文件和model来动态的拼sql
    - X9 z$ [/ S8 r3 F  i
    / b- O( v4 F* a% q* {7 G* Y4.客户端提交或者刷新内存
    / L- y) v& i& j% c' H5 w
    - Q4 e, v7 Y% A' J5.执行sql,值放到数据库0 C" n! r' j: m! P# |: t" e
    5 C. [% h8 g2 o) [* V* P
    $ l4 }3 D* P$ [

    + f' j' [7 C# Lupdate、delete
    % `) b. Q  [3 Z' R# ]1.根据model 的id在内存hibernate的缓存中查找该对象6 @- v5 \7 Y, T

    ; N' e7 q4 O& x% {如果内存中没有就到数据库中查找来保证对象的存在
    4 y2 T  i# n# D6 f9 R6 V; H- R5 x$ n- {  s% g. O# f
    2.根据model和cfg.xml文件中映射文件的注册来找到hbm.xml文件
    & r4 H. G% d0 b2 U" ]1 h
    9 i3 _& p- s, V- u0 Y3.根据model和hbm.xml 文件来动态拼sql
    3 N! T3 f" @- v- C1 C8 z3 C& y4 J1 u0 f. D+ S) m4 N
    4.客户端提交或者刷新内存
    $ \+ @) D, H  l/ v2 B
    ! R3 @* _/ C; j  r5 ]# _$ d+ D$ m7 M5.执行sql
    # W. N2 P+ X. m4 E( _& a- O" d/ }. w6 ^, o

    . ^: ~; N' b* f1 Z3 J% B1 J
    9 j* P8 H' c, V" |+ `6 Y4 iQuery. i3 l/ s/ B4 P8 g
    load
    & _% o. d; l. [9 w
    1 l, r$ O3 K- C4 [4 e1.根据model的类型来找到hbm.xml文件
    1 e/ M& P5 d# Y
    : g% N# M1 C# y+ h! h# z/ V  P2.判断id对应的对象在缓存中是否存在,如果存在,就直接使用,如果不存在就进行下一步。
    $ x7 {; ^) P4 O& A$ G
      K9 v4 W3 \+ }3 T3.用id做为查询条件来动态拼sql4 j/ O  s% b8 {% T) i6 C; f
    ! }$ k. A+ g" k
    4.执行sql 查询(先在内存中查找,如果没有找到(会抛出例外),就去数据库中查找)
    1 Y7 z4 ^9 @( F7 F  {( u3 l+ Y; n; Q" u: h9 u$ x
    5.返回一个model类型的对象8 `9 I# O2 f# v* r

    8 M% v* G% D& s' `" Q( |% aget
      X% [* h4 k. f2 M# z1 u6 `' p2 u7 A- I6 \+ q- }
        1.根据model的类型来找到hbm.xml文件5 K2 _+ i0 Q4 _3 D  s% S4 \( f

    9 J1 Q$ }6 G0 R* U' \$ R. s2.用id做为查询条件来动态拼sql
      }& G! }" K  }# O& C  |9 N
    8 L" X8 C/ a- i( x. w3.执行sql 直接在数据库中查找,如果没有查到就会返回null7 V2 o, u, n5 P" Q$ n! C/ F

    / g$ a6 W& g, p6 J6 g2 m  S& r: }query' {0 H5 G* `8 D# v' d' d1 O
    . f+ I! \* }8 f4 F6 O6 d
    1.分析hql语句,得到model的类型6 w. ~; j( b) T+ ?3 Q% k

    # }. ^4 O) q+ R2.根据moedel和cfg.xml文件中映射文件的注册找到hbm.xml文件9 D# n8 U9 y  G5 B9 _
    9 y. k! A  b, C
    3.根据model和hbm.xml文件来动态拼sql
    . l% W  _* s/ y1 ?% n0 Q8 Y# ^
    / A- o: X; w- `  g: Y% k4.执行sql查询数据库
    0 a) E4 @: I5 @6 e
    7 h( I  T) Z4 k5.返回一个resultset% c( _$ V! ]$ p/ X
    : u+ F( ?! z" x3 o! d' z
    6.循环resultset的值,放到model中在放到集合(List)中! [: M: r( L3 Y3 C6 Y* n9 _

    9 A) V: t- Z7 _. Y * S" O% ~4 e7 A" L6 u7 \

    & {* n# |# L  N) d谈谈hibernate缓存机制
    ( m' P* _7 c/ T
    ; ~4 [* R8 f" i3 h* Y3 W, h缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了。打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去数据库中取,也省了很多事。
    + W6 @) g0 s# t6 l5 j5 a3 q6 j
      F- R/ Z! E( j1 i! P6 Q# M$ v
    # f% k3 h. r) m# ^' L( d/ N( U
    0 v; p9 ^8 U; W: t: V( \) \hibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。6 }, c& z$ G3 o4 t  q

    ' \7 v: ]0 \4 D6 B" _
    9 O/ ~0 b9 G" x1 ]# \3 ]: |
    ' D# C; l- b' o3 ~  h对一级缓存中的session事务进行数据的预存取,数据在各个session的上下文中存在(单例),当session关闭时,就是session.close( ),整个所有session范围内的数据全部清空;二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二级缓存只有一个区域 ,画个图比较容易理解。
    . T9 d2 y; }6 Z% J9 x
    # k  `9 n9 B3 L9 I
      i* y% ]6 d& a2 E2 M3 O: [' R3 ]5 i7 h- t' C, _& _$ V, g
    | 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|
    9 `! K! E3 ?) O& c  Y/ u& y" ], H3 N$ Z, [4 `
    | | | |
    0 i$ H9 u# Q3 p4 ^* _+ p% e- |0 V, Z0 }2 F5 V
    | | | |/ t# h; v, s. T( ~/ g, o& k

    4 c- |3 |$ d# o—————————————————————————————————
    ' v# j! S1 a; ~# j3 L" r, ^, A2 g- L2 m1 R$ Y- i2 F- c
    sessionFactroy级别的二级缓存
    / n3 }4 I9 _% s5 o# W
    4 @1 |+ G( D) h8 ]" @) Z# O, ]——————————————————————————————————————-
    0 U" w" m" G( y
    2 _9 ]! u) x9 g|
    5 X5 v/ C& ?1 D- O, ~0 B, c' Q+ T/ T; X. t
    |
    # v; C( V- s# m* x4 ~
    * u+ i$ [7 Y# I1 _$ Q$ s|7 u+ v3 K: p; ^% N

    ' r: t: X! q1 ~: E9 q0 ~——————————————————————————————————————
    . T, O4 ~" W+ B+ _  _8 \  U% _$ R& s' K+ k( ^, s
    DB
    % Z# ^! b) Y( e7 ^, V
      p& M& Y' D* G—————————————————————————————————————–+ `& w/ F5 s2 a$ W
    3 ~4 Y& W7 B1 b% D2 D7 ^- |/ X
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    16#
    发表于 2014-12-03 12:48:12 |只看该作者
    Spring$ w( R5 A4 K% x, c/ ~* w
    • 是什么?0 K$ C5 V5 P$ n
      # Y4 p2 R6 x0 @

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

    4 [1 S/ S1 Y- \6 T
    • 有什么?
      0 L$ a4 j# U, W& E, |- `8 L4 E/ b

      : B2 X$ a0 R- G5 Q: l3 W4 n1 _7 m
    & w5 Z% ?8 i6 i( s  t( M

    每个包的功能:

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

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

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

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

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

    AOP :面向切面编成

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

    - d" ]& u7 @* G+ q( \+ C9 v
    • 能干什么?$ Z: G9 f3 C/ k8 t* d0 E
      3 U( b" B; W' {0 r6 t' \1 f. \

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


    8 X& e! f: @+ \' Q0 h0 K7 P
    • 怎么用?
      7 d3 x+ R3 z4 V

      - L' M- c7 w2 p& a" y1 p
      • 搭建web工程,引入spring的jar包+ m9 m* r9 H& M
      • 在web.xml中添加如下配置1 A7 m+ s8 K+ E; B% D( \7 X

        + w- Q1 {# O+ z. ^3 r

      % N0 C/ X6 W% ?) l2 H7 \2 x6 h$ l

                contextConfigLocation
    ! ?3 M% F& K' d1 B1 @

                classpath*:applicationContext*.xml4 K' a# f; ^$ v. C. v( J  t

       
    - a4 `/ Z2 N" ?( E

            9 J  m, ]% ?' l' L) v% R, X: d

                struts2
    ; r3 ~, W" S8 E

                1 T! h: T( ?  V  h( X; `

                    org.apache.struts2.dispatcher.FilterDispatcher
      d/ P/ R; q* u+ ]/ d3 p

                ' u# N6 y" e; \. ]: i! F: z+ X: k

            ! h7 z) F+ o) M5 K! ]

            ! |- S0 X* U1 E. L4 D4 B$ Y# _

                struts2" Z( v/ m1 I) r* \' O

                /*$ J1 r0 t) e  L( H5 d4 l# M; h

    * l7 `$ `. t: e- ?

    . @% s5 d( P3 r  P

                
    1 h+ `! F0 _% e

                    org.springframework.web.context.ContextLoaderListener
    ) c9 z; g% c. M$ _/ b+ r$ X  q% T

                7 ?' B$ T& D! z! q6 a

            

    • 部署; r; x; R+ \' v. o& p" p# p+ n2 V
      ' j' X% w% k- q* w

    & V& u5 J% u% `8 Y- n; y3 N5 \  A
    6 E4 N% |) R( K* b/ e& S& N1 r7 Y/ G4 J3 V& R
    • 容器和bean
      " t0 E8 E# \0 D3 @

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

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

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

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


    * f8 d3 D; R" y# M, ?0 G
    • IOC控制反转. V& P: }- K, ]9 _, }  a2 [  t6 H
      7 U% i) v4 ^3 X! j& e% @

      & m+ Y/ ^4 n/ T% c
      $ U# ?# A) A9 G6 U, t. r7 G
      从前的应用程序想要得到A的实例他会直接主动的去拿,当用了sping后,应用程序由主动的去取变成被动的等待,由spring来控制应用程序所需要的对象
      6 Z, R- @; v' J- n6 M- g6 c
      • IOC的优点7 U0 I& O* x3 x' B, ^6 T1 _
      1.可以通过IOC来获得实例
      2.可以通过DI来获取注入的资源
      • 配置IOC的原则
        & k3 B9 e; g4 Y& f7 ~' j$ X
        • 一定是可变的资源才采用依赖注入
        • 一定是层间的接口或者是模块之间的相互调用才采用依赖注入* Q8 n4 m4 }) E

    & l# G" i$ ?3 v6 t: b4 A) b
    • DI依赖注入- t# a0 q+ t% m" _. Q

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

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

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

    例如:

    在配置文件中


    , z8 B! W& o2 U$ e/ L2 N* V9 V# M) F! j; q5 f

    : W; a. ~6 Q6 Z# i' C) X

    在应用程序中

    Public DBDAO dao ;

    Public void setDao(DBDAO dao){

    This.dao = dao;

    }

    3.构造器注入


    9 l7 U+ G) Q" n, v

    4.ref 表示参照其它的bean

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

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

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

    6.lookup注入

    7.singleton

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

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

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

    8.DI的优点:

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

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

    8 C. d0 G6 F" w3 }' n
    • Aop面向切面编程# j6 y7 S: S7 G  [5 i# n5 w
      1 ], d$ v3 m! I( `; Z: |! V% o

    1.AOP面向切面编程 一些较好的模式或者是示例—-范式# a* M7 [. a# x0 c* P+ V6 v1 Z0 `! I1 _

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

    2.AOP的思想: 主动—->被动(追加功能)
    & l2 M9 V& d. x* K. h( x3 Q4 B

    3.AOP 的概念
    4 F9 J# B9 |% E5 K* L

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

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

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

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

    5.引入 :扩展的功能

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

    7.aop代理 :实现机制

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

    4.AOP的事件机制4 ?  {+ F+ B% f0 [: F, h& ~

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

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

    3.找到切入点

    4.确定连接点

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

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


    " d3 O" e) L3 W5 U8 q- f3 w
    . l0 b5 H4 x! S- g. B) W$ u3 F8 g8 a  [- g; _$ f6 H

      y- T! G5 y) W0 b9 C* h* `2 N5 [  q7 l+ Z; K4 N+ z6 ?; U
    , a- [8 e+ u! I. O3 x* }

    ; Q# w- b& ?: _

    5. AspectJ% ~! d* u# L/ z9 \3 \

    5.1.在xml中配置比较烦琐
    ( K) f! N4 _0 z6 K  i/ B9 ^9 `

    所有的入口必须从一个代理(ProxyFactoryBean)开始* H: J. _# \2 M5 C4 d- V; P' m3 R

    3 r! A5 h( O( u! c$ E$ t% k* v: r  z

    / D1 z4 w) t: d

             4 Y- ~$ x# i1 x" l, H. [
    2 P- Y; a% D5 W# H- T; X
    : A9 K' B9 D- A
             
    ; v6 B% q5 u7 y6 V, p6 [6 b) S

            
    0 j( O! I% Q/ h1 }

            

    0 g$ }$ D( d: ^) i) I' d
    expression=“execution(* com.javakc.aop.MyTarget.t*())”/>
    $ A9 [7 L8 S) q0 `

            ( o2 O' }- l+ }, J

            7 K/ J6 e3 k5 z

        " C% s( L% c3 A' w2 U/ ~; D' n

    # x2 ?6 E. x- |5 j3 s
    * ?% W3 s8 Z! k

    5.3.使用注解的方法相对简单
    % ]' M; d! V4 Q8 r6 j+ k

    @AspectJ的基本语法7 J" l" y' B+ O$ P7 ^

    1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面
    / I5 ]) x6 l' w2 d

    直接在类上定义@Aspect' d$ h# V; L5 m

    2.@Pointcut声明切入点, _/ g' v  w8 m: T

    2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字
    0 _9 h- C. [, E- p' d5 \4 z4 Q

    2.2、可以使用匿名的pointcut( t& U) \' ?6 Y

    2.3、执行切点的几种方法
    ) f& T# `0 [, K& M4 M: }

    2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法# A/ k) Y5 N& b; r" @: ?

    2.3.2 within 指定到包,不能指定到类, q1 K4 o0 K& ], v7 B

    within(”com.javakc.spring..*”)
    9 N; ~  G, E% k9 b$ F

    2.3.3 this 指定到实现接口的所有的实现类
    % D, ?; b$ u. v* O  ?4 u

    2.3.4 target 指定具体的实现类
    / N) u( e$ Y4 k9 ~5 e+ L

    5.4.advice的五种类型的示例
    0 f% E0 V+ X* }7 M$ [; ~

        客户端必须从接口走才能得到监控,实现想要追加的功能# {8 \3 @4 x% G) B9 Z

    5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)
    4 D  [3 ?  [; z2 Q0 ~3 \

    追加的方法的参数名字一定要与retrning的名字相同" U. w6 g( U% A5 D

    在注解@AfterReturning中必须加上pointcut和returning两个参数
      z3 ?- E8 ~0 [, k' R4 S

    pointcut指所要监控的目标对象的方法
    , x$ S+ S7 l- t  m

    得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配6 s' ~4 S' d* X* [. U: v9 F9 e! {

    完成追加的功能
    * }% D" s  }, }( p3 b

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    ( a- k! t. p; i) r7 f. ^0 g4 h3 ~

    (1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”). u* M& D" P; N9 z& L

    (2).4 [. @; M9 O7 k# [

         2.直接引用匿名的pointcut
    6 }- `- U* R" G4 n0 \( G0 Z7 M

         (1).@AfterReturning(“execution(% `8 h0 i) V3 v6 }

    * com.javakc.spring.schemaaop.Api.test4())”)# Y$ G% X# i! _. o' n

         (2).@AfterReturning(pointcut=
    1 ?% n' w6 k2 s

    “com.javakc.spring.schemaaop.TestPointcut.t4() &&( I! T! j& }, l/ Q

    args(str)”, returning=”retVal”)/ a& H4 K; l; E& ?3 _

    @AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)
    ' W9 |9 Y' ?4 h" `* o3 i, s

    public void testAfterReturning(String str,Object retVal){9 F: t+ _: S+ |& }

        System.out.println(“afterReturning1=>”+retVal+”=>”+str);/ n1 ~, u7 m7 e" K2 S

        }
    % ~5 \# H* C% D, h- \( g* N* J

    5.4.2.@Aronud
    3 J; k& V5 [, T1 c

         注解@Around环绕追加功能;" `& G6 w0 P4 j  d

         在执行目标对象的方法的前、后追加功能;7 B4 N: C9 d+ K# {  E3 p: h0 m

         必须有参数;第一个参数的类型必须为ProceedingJoinPoint;+ V1 }) z% f7 e, V% j

         通过ProceedingJoinPoint的实例的proceed来调用所监控的
    4 d$ O3 R+ ?( C; A3 r3 a

    目标对象的方法7 I: Y, h: X, B! ]% y5 W/ u" N! Y$ D

         1 定义一个pointcut,通过方法名来作为pointcut的名称来引用8 U& J! Z8 b5 L6 h4 N7 ?

         (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)$ Y) h2 L- a7 T% Z

         (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()9 X/ [. A) G3 A( M1 L

    && args(str)”)
    . k3 d- u1 ~' |' J# n; b

    2.直接引用匿名的pointcut& p$ M# G/ c; m5 @+ R  ~

         (1).@Around(“execution(
    5 m& L. v+ \2 |9 b5 i; Z! m) f

    * com.javakc.spring.schemaaop.Api.test1())”)
      G  y' u! Y/ l' V

         (2).@Around(“execution(' ]* h+ p/ S4 A1 Z' B

    * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    ) {  Z+ H" h. L

    // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)& I9 X: A, J+ m& r

         @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)& y2 w; \4 b+ Q: E

    public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{
    6 w. O; J( F3 B7 G+ h) p3 e- K

        System.out.println(“around1==========before1pointcut==>”+str)7 {8 d& B8 Q7 ?, O. ]

            Object obj = prj.proceed();" t% N+ a# N( b9 ^* o: J

            System.out.println(“around1==========after1pointcut==>”+str);
    5 ]$ `5 l$ o2 Q6 G/ ?

        }
    8 i& R# v4 L) X

    5.4.3.@Before2 H" K9 z6 b& j$ t" Y

    注解@Before在执行目标对象的方法前追加相应的功能; h7 s8 D; [0 X4 B

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用8 x! o7 N/ [, m* p+ u, I

    (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)* H8 W. y  k- ^3 F+ w

    (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    , G4 I3 B0 R1 l+ f& @

    注意args后的名称与参数名相同
    ' Q; z4 K7 s+ A8 S. ^* l

    2.直接引用匿名的pointcut3 e/ h5 K0 e; x+ P

    (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
    0 P% o, N# a; H8 n

    (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    8 D  B' W* G" v* }

    注意args后的名称与参数名相同6 Z( f7 ^3 n- O7 r: ^% s

    // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    0 O  f* O  l1 M

    @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    ) d" {6 M4 p) |0 M3 a% ]. K

    public void testBeforeParam(String str){0 L! L7 B/ L" h+ F. s" R5 A/ m7 \/ ?

        System.out.println(“before1=param=>”+str);
    . |9 L# C0 W9 C

    }
    : \! h# p/ K9 G9 U

    * d8 A0 G( t2 m4 K# R1 ^

    5.4.4.@After
      a2 P- i( F+ B

    注解@After在执行目标对象的方法后追加相应的功能! g8 y2 ?$ [5 j

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    % d( n2 L% d2 G: R; n0 l

         (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    4 C2 Z  G- W9 Q( A! T" {; s

         2.直接引用匿名的pointcut
    - o% r! l+ t/ P0 C8 G

         (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)0 X8 T( j0 v% ]+ H+ [

    @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    / p- N; M* e6 h% x  F' A  N7 R

        public void testAfter(){  P+ Y7 B8 m/ X, `

        System.out.println(“after1== >pointcut”);
    2 @3 Q9 h8 F: V9 C4 v

        }) y! D/ s( C9 l6 ^& s- T9 \

    5.4.5.@AfterThorwing
    + b/ c! D7 \7 C0 P

    - C! G5 d, z3 v7 L" ?8 [3 Y$ A
    5 S* B8 G5 g# l
    • 描述一下spring中BeanFactory和ApplicationContext的差别8 l3 I+ \: a$ x3 ^- ]9 V  N# l
      % _5 H! G+ _0 w* n% }, O. u- W! N. L

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


    ' D& b( L& W- f6 E5 D4 a
    • 谈谈spring对DAO的支持
        Q! M2 Q+ ?& Y5 g# t
      - W+ t' ~$ ^% n1 B& U; Y

    Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。
    + i# e; G5 N0 R; j0 `' J6 C7 F

    简化 DAO 组件的开发。
    . W+ M9 }, n- H3 Y0 wSpring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。2 r& B- X/ _5 w9 R% p" E

    IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。
    2 t- x9 X9 A3 ?- b# p; H

    面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。0 F: Z9 N; ^4 i7 k& P6 ?

    方便的事务管理: Spring的声明式事务管理力度是方法级。0 h$ {, [0 a: D/ o! u

    异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。& x! l$ v' k2 `5 |

    - y' |1 W5 m, h2 o
    : g$ f6 _; f% a7 U  [% u$ X- B
    • 谈谈spring对hibernate的支持9 E4 r8 Q  j# [3 Q8 y" l0 c

      ; j: F' M8 W5 E4 I6 B$ B$ x

    在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。
    1 ^" _$ M) e  M4 F

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

    1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:6 G5 |  `, S& F


    1 J$ ?# L( ~( }9 u

            class=“org.apache.commons.dbcp.BasicDataSource”>: H  V4 }5 T7 x3 g" V

            / I6 H$ h5 X. f% m" b6 T

                oracle.jdbc.driver.OracleDriver5 r% }! A% Q. b) n' V# W, U5 v+ }4 X

            ' ?2 B& i. e: y8 y# J/ _4 s

            
    5 t: ?+ L/ I# x

                jdbcracle:thinlocalhost:1521rcl
    4 J1 o9 u: x# V# M9 Y# ~$ K

            % }" X; r7 P! E- W  n2 p. h, {

            
    : D1 Q, G- ?+ m

                javakc22 Y' q$ A9 Q3 ]8 i' w

            
    4 x" g! F3 V2 z/ ^2 w& a* f$ J( @6 S, F

            ' M) F" J3 W* E( e. m

                javakc29 i. T9 L5 M' K: y( v

            
    5 D, A4 T5 H* e  k, h! M0 x

        ) J% w5 e3 B8 T


    2 A; m+ p3 [+ p& B6 C8 N. Z

       

            class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>% H; S* H. ]2 B8 L  P# A

            
    5 ^9 ~3 o# S3 L4 [0 q% j6 |

            & d# M, B$ r$ h# Y; H9 r8 B

                
    1 A* U9 l0 G0 G7 ^# `

                    com/javakc/spring/h3/UserModel.hbm.xml* v; ^# s$ B' [, d7 f2 F& T9 U

                . P+ m) \; Z8 L

            
    8 X8 Z! g0 M! g5 M

            * @1 r* S8 k6 K- c+ x% h9 \2 R- E1 ^

                1 S" Z1 X6 g) \$ C  L& o" T

                    hibernate.dialect=org.hibernate.dialect.OracleDialect
    % n! o: N9 W2 o' c: n2 s

                / @8 y& h* H. e7 i" N

            
    7 ]6 X- q8 F' n# Y4 Y" d- D& f# a

        + q/ y( J, T: x0 ^$ T2 \

       
    / V6 `8 l1 {% M- \) S4 p

            # v! m" ?' L, b/ I

        ; M3 H) ^4 x8 f( Q) M* |

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

       

            class=“org.springframework.jndi.JndiObjectFactoryBean”>
    . A% K6 e2 I& a6 B9 Q

            " i! o: P, A- G& i% m+ X9 q

                java:comp/env/jdbc/myds
    4 ^% S" Y- E+ V- `( `8 _: P

            6 S( @) N. Q9 o3 u* Q

       

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

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

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

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

       
    $ I  B8 d6 {. |" h  U+ h/ [# R/ z

            
    ; ^/ L1 ~  `$ F6 F: {" o1 b* ^. o$ U6 b

       
    : T; u. `' W" p- ~* |9 x" F% L

    * F1 r3 \3 M& e) Q- N4 x

        , o: X6 @+ L3 r( u3 i

            
    + ?1 w. }& M0 [' ~% S

                
    # h1 i+ E6 h. J8 z

            4 t# N& f& \) G) c  W4 o

        - l5 F- f/ Y' B/ m4 M


    ; W6 J& {- C+ z1 C$ d7 g$ o

       
    & H& W3 p' _/ b$ t! ?

            . ~; X0 s  s$ z# z3 @: e+ F4 t. o

            6 K& Z! X, `% h

       
    & n1 N) p# p4 a" a+ o; G8 `

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


    ! t4 x1 a. N- t2 H: F6 X: N
    Spring2.0之前事务的写法
    6 V/ E4 |5 s( H% L, }
      y4 T' I/ \4 ]) ^$ d

    ' H' I& ]  }7 I3 S7 s9 g        class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”0 \. @$ S+ `1 ?3 S- R8 ~

      @6 ]6 H( X. u. Q5 r# s. F  v! @        abstract=”true”>% F+ ~7 o7 p# h3 b

    5 Q( `6 s7 H  ^! R3 L" g$ x
    8 K$ E. o  N3 @9 b+ U# s* G
    9 n9 b9 V0 G( {" R
    - p( d% ]5 Q/ x                PROPAGATION_REQUIRED,readOnly! j$ Q1 @3 O0 j/ R
      |3 w& y- l6 ]  n
                    PROPAGATION_REQUIRED# Z* W% f; H. p9 X

    : i6 a+ U  R8 A1 X/ x
    3 J1 t6 S: C4 n0 {# D7 ~" ?; U8 i: Q  N) K
    ) R4 Y' s# g6 i+ G4 b
    ; V5 W5 _' }- F! H
    / U4 a4 _- m$ F$ w
    • 谈谈Spring对事务的支持% {+ K# B' p' |3 G+ M1 v
      9 v: c# g8 n6 A( q0 X  i, }7 s

    1 l: D2 q. n3 G: G
    1、声明式事务管理:

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

    2.做法:

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

    2.2

    2.3 注入数据源

    / L: s3 p- \6 y: z6 W

    " ]! m. t  }" z5 s* v
    & N. a4 ~& C/ F4 ~
    % s/ C! F9 ~/ g: \/ L! m' @
    9 `5 H0 E& D% ^% e* E) i7 ~5 |$ w1 {9 ~4 C( y" Q4 j

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

    2 ]4 Q8 w6 E7 R2 F+ V) ?

    1 s  H/ a) o: v; }1 P# i+ s( L, t" J0 ^+ D  X3 ]% `

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


    * d, I% F, X" S2 ^2 W2 g8 [+ R0 m- T8 ]' H7 ~( l0 c
    6 `$ n* H3 Q2 C$ U8 Z  i# Y
    ' R$ M. {+ L. q6 B  H$ S' h; }

    $ M0 D* I' g+ K; {" l0 U9 b; ^

    2.6 定义切入点

    1 P% m4 u, i* ]( D
    & g# }0 H" m9 t& H7 y3 Q

    8 b/ D0 y! \7 t- _# X. n
    # A! E7 [( x, R  r. }$ U' u! S9 B% J/ e4 z, s* O1 I: F

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

    1.注解@Transcational

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

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

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

    + t* c# w: s* r  N' z6 d, A
    * s7 J. v. Z7 T9 V$ z+ X: ^  J: [

    如何在Spring中使用Hibernate的事务:$ o% E' ?3 F, ^; @/ K, u  r! f


    - n/ L( ?5 u# d


    7 l! G1 l% }8 ?4 V

    - q( _2 `; `0 m5 F0 `! V- o6 H

    如何在Spring中使用JTA的事务:
    - Q$ h) G% V9 Y

    : W4 X1 ]6 \/ C0 C: i0 @' i
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    17#
    发表于 2014-12-03 12:48:32 |只看该作者
    事务
    + T- H  B$ f9 C1 h. Z' xACID
    5 a2 E3 u! U) n( w- w8 b(1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失败
      }4 n3 r2 i1 W9 g& l
    " G1 l- E9 L* u8 d(2)一致性 :操作的前后满足同样的规则,保持平衡。
    , s! X" S8 H" L: w0 e$ p- m
    % C. ?4 M" J+ ]' l) W(3)隔离性 :在事务运行的过程中。事务内的数据对外的可见性和可操作性(必需由数据库的支持)
    # G* F4 C+ Q) ~4 l  x8 B; _) o4 q8 T, C. ~& m0 K
    (4)稳定性 :保证数据在事务的操作的过程中不会遭到破坏,而且是永久性存储的
    4 x3 |( X5 M' P" U5 B0 {0 L. k; {7 c( o% k, g

    + Y7 `: S! Y8 T, i" F2 O% i+ e
      r! `/ B1 L# W  n/ \事务模型
    ! C8 p0 _+ ~; P" H% a# E; l4 w8 B(1)经典事务模型又叫平面事务模型(JDBC) 事务不允许嵌套: c% e! D: p" T2 l: K0 e1 _) Y

    / W8 H! V" [, \' m" D0 G, U9 P0 N(2)嵌套事务模型0 l( P3 Z5 m" @8 N
    + Z0 S+ S+ A  M: {, \; `
    * p  Y$ m  ]5 X: k

    0 J3 w' X- H0 F事务的两种方式$ s, G4 G6 U& t) ]9 v9 @
    (1)声明式# o2 C# x6 M; E% q8 G& I

      \, e/ k( P! ^( t# ~2 h在配置文件中设置以下6项" P- f8 J0 T9 e% h2 k) v2 c
    2 _& a* A0 S6 E4 u
    (1).required0 h  A7 `9 V6 ]- M' b+ J
    $ j! ~; d+ L+ \: \4 Q
    如果客户端没有事务 在bean中新起一个事务
    $ B; v0 z/ g1 c( @9 c+ R+ g
    6 n, y' p3 B' Q7 g6 J& l如果客户端有事务bean 中就加进去0 j+ @) r! H  O* {/ L! e
    / C* P' M+ k# a0 j
    (2)、 requiresNew
    2 y) {( ^2 l- W9 q3 e: U# T# p9 h3 a' _8 v6 w# j
    不管客户端有没有事务服务器段都新起一个事务" ~& V% h0 J; O2 _

    1 c9 {+ k1 C! P+ j如果客户端有事务就将事务挂起
    7 {# \! E! U7 e/ `
    2 |  ~" t' x4 _% E8 {(3)、supports2 v$ l; _4 q% @9 g" s( A
    $ E5 D. S8 G# o( d6 K+ }  f8 k
    如果客户端没有事务服务端也没有事务) o3 \2 D1 D" l8 J( B

    ) q8 E* r: L* E/ `/ e( N4 `! I4 W0 M如果客户端有事务服务端就加一个事务
    4 m' F8 D4 N6 J: J8 y3 N( d/ q4 T4 u* ?8 L* U! j
    (4)、mandatcry
    # X0 }0 g0 E6 _# F! I) P5 N* W7 B5 j6 ~: I. I6 n% W4 R+ j, z  ]
    如果客户端没有事务服务端就会报错
    + Y% w) Y  o4 o6 W2 D0 ]
    0 D- T9 I9 ?' w7 S) n如果客户端有事务服务端就加事务
    , |1 p( i5 O7 \
    & _1 E4 i8 N1 J' N; B# e(5)、notSupported
    4 \/ \3 K( D7 s, e, S3 r: r' v% `# Q+ j$ C' a
    不管客户端有没有事务服务端都没有事务
      J; x& M8 H% m# w8 ^) R3 C3 \5 K" n/ _9 ?' j( `
    如果客户端有事务服务端就挂起
    , N0 [  [; h" ?- M$ f/ T" w& y
    ' z. D( b* O# C/ A2 _* q& x$ L8 _: F(6)、never
    1 Q" g( G3 _9 X  ~4 b# r1 ?  I- h9 A& B: i. L+ Z) A
    不管客户端有没有事务服务端都没有事务
    6 A- B* e$ U& I2 o& x( z, f& j  f) g) C7 _7 d
    如果客户端有事务就报错; w8 v' P7 D' c: H9 j

    ( q$ B2 k- L. |, N(2)编程式事务. u. K0 C  d" C' L: V, x' ]: F/ e& `

    : |$ B, a8 B) z3 qJavax.transaction.UserTranscation. W& A8 X( m) k+ ^

    9 i" D/ @0 P" ~JTA 事务可以精确到事务的开始和结束
    # C0 Z. o+ J- P5 `4 @; @, U& O6 i" x9 h/ C, w

    6 \6 [6 q; z1 m
    * \0 J/ i5 T5 Y/ k$ ~事务的隔离性7 ]& m8 k( m8 I9 ]# m; A
    Read-uncommited
    1 s$ _' p. }2 \7 U3 ?
    ' `2 O7 R% L' Z读取未提交的数据(基本上没有锁)脏读,存在不当读取的问题。8 P$ R1 ]7 ^7 H" [6 p) [1 w* [

      ]9 j4 H6 Q& \' `, K! sRead-commited) t* i. B0 G4 M3 k* a; m

    $ Z; ^7 `) b3 A8 M读取已提交的数据(行级锁)
    * Q: N( z4 L0 Q3 w
    9 T/ ^- d; y( ]5 i% @无法读取已经写入,但没有被提交的数据。
    ! o. U2 H$ K; Q: A
    4 e. [9 q$ h8 h& {  N4 pRepeatable_read8 c- K) h4 \+ p) V) |6 Y- O+ {$ w1 C
    ! Y7 ^% U) h5 r& [- x
    读取的数据不允许修改或删除
    ) \$ S  I- h# t; u9 S; f% m! @: c
    不可重复读(行级锁+不允许修改/删除)
    . b3 x& [9 r+ u* @: R) _5 u" Z) p2 B5 Y# t
    Serializable
    ( l0 o7 S  d( t7 e; I, B0 {$ b$ Z( `3 q# b2 E
    幻影读(表级锁)
    ( Q0 c$ S( @  q# x
    & h6 B( }9 ]' y$ c9 B7 m6 g9 ~/ z
    " G+ T4 I9 r; o& f: L% w3 ^8 w
    # S9 ]% n/ |0 A) B% S. Dstruts7 J9 A, A  }3 ]! R% R1 ~
    开发流程
    . h; L' p. ]! p4 t/ i& R* w0 J" q4 \4 t# c- ]7 w
    1、创建表单
    & Y( u  |9 f8 W: L9 Y* W+ g6 y$ W* D; {
    2、从表单中获得输入
    7 {& \) L, O6 T! v
    . h$ Y) g; Q9 {  _4 A8 p3、处理输入(业务逻辑)
    ! E) A7 T" d# ]$ B9 h& l9 z
    ; D6 P$ n. X9 ~! Q. A+ ~4、根据动态输入改变输入流
      q# F' i2 B: @% f1 u' h  A# O% A& d2 m
    要完成上述四步,我们需要创建
    9 Z9 [* U/ [2 E) H3 L1 b  c+ ~% W# S; }) i
    1、一个ActionForm
    6 z, T5 \' ^5 L* d* @" X1 Y' F, f8 v0 D+ p
    2、一个action& _$ l3 e! `* ~. O* p

    4 ^# X; F# H% k5 b# ~/ \3、一个配置文件struts-config.xml
    1 [2 Q7 P; |7 M0 m- Y
    2 T0 \( j5 v7 \. w! Z  l; K( P4、创建页面" v/ A# x( }3 J( e# u- n4 ?2 c
    , ]' ?5 Q  s$ t/ l/ h
    创建ActionForm
    4 W  o  T* c4 l; G7 e$ i6 w1 |5 v. t3 q: D* |
    1、写一个类继承ActionForm8 I$ b  g3 ]- y3 ~
    + t' f0 }' _9 i; r, H
    2、私有的属性
    5 \( W  C8 a$ E6 [* c4 `- G
    7 u; H* d$ {1 U3 ^! h3、相应的get、set方法9 ?0 D, ]# n7 }' B6 L
    . h  F# `7 l7 k2 ]2 V9 R, _
    4、重写tostring、equals、hashcode三个方法
    + Q# \2 r! n% D. R9 P
    4 I5 d4 }2 s0 j% q* D3 ~5 S创建action
    # I% o5 U& v* \4 u, G% y& T) a  h, b, J. W4 A$ B" C  j9 B
    1、写一个类继承Action
    $ r% s6 }2 ~6 x( `& C7 z
    5 a6 }+ i+ V% d- ^8 I2、实现一个公有的方法(回调方法)+ B+ V5 r; g3 _/ R3 {

    3 A6 J4 H- U9 |* y- v' f) ?( V* Apublic ActionForward execute(ActionMapping mapping,) c# E: h) h. V6 A+ [* A
    9 b) O4 a) m, |6 j$ P
    ActionForm form,9 b( t* l1 l% K* h5 \! S
    8 i' K9 e& H; }+ F$ r
    HttpServletRequest request,) `( {' f, w8 u* I
    " {" o. N9 {) x7 _8 q) v
    HttpServletResponse response)& u3 H7 h, i7 q$ i8 q9 U

    0 A. q  k! Z! n6 H6 q8 ?% b( _7 h{
    & O7 _7 G3 ^- F/ i& v5 G  Z9 K, ~/ C. C8 x
    //1.收集参数  u' z, D+ ~2 x$ `! O
    ' k& o. @9 y  p( d
    MyActionForm myForm = (MyActionForm)form;
    % S% @6 d0 t: T
    1 h$ G& T- r0 }" T' ^$ R5 F//2.组织参数
    3 Z  r& [! [8 i6 D! n5 W) h$ f7 V; j4 \" V7 u
    / R  n4 B; r# _8 j. P4 M  t- |  d; K, \

    2 s' [! j" `" y: k# ~: E- }//3.调用逻辑层. P" p; {4 l/ j; }0 r8 @

    ' b6 Y8 s5 r8 _9 Gboolean flag = true;
    7 y" a" U& t- V2 T) f! M: @  C9 j1 Y# K2 O3 q: p
    //4.根据返回值来跳转到相应的页面* ~* p, e9 r( A& ^: g  f9 _
    " b8 d* I; S8 z7 W' `/ o# ~
    ActionForward af = new ActionForward();
    3 }6 M; P# @7 ~; E! s8 @  `8 q& j3 _: A( H. N
    if(flag){
    1 Y( H. L8 m+ Q) a, J  Z8 H) s" ^- K+ b" e/ S
    af = mapping.findForward(“1″);
    & ~$ u& c% h1 ]! J7 k3 W& B8 @- j
    7 c; l2 B3 c  u. W}else{5 ^; R- o, j# `% X0 m8 H( I
    * C( L2 p$ n0 `
    af = mapping.findForward(“2″);3 S2 [; n% R! S
    ) \2 A( ~% s% B" N; ]
    }
    ) ]1 B& E3 B# O1 s) |0 v5 e+ z' Y/ E- r& a# {
    return af;
    $ C4 S  ?& e3 \3 W$ p0 j3 r6 Y; q1 X  O6 f& E; q* {/ ]. x$ J3 F
    }; t" R1 A8 }( n' X9 J/ \
    5 Z: n! @: f+ U- r1 c2 ?6 W
    配置struts-config.xml文件
    5 Q$ v  Z1 U0 ]" k% o" p. N, q7 T
    , ~. t3 R7 J  H/ K5 r8 {3 I1 x1.<form-beans>' z5 d: U0 f8 |# ?. T  R) D: x6 _

    3 f: c0 a$ f% E; G+ I- X7 N<form-bean name=”myActionForm” type=”全路径.MyActionForm”/>! t& E1 M* @. F9 c% |4 y6 d5 N5 n
    6 D% z" [6 @$ n& `2 q& ^5 y$ l
    <form-bean />
    3 d( I& \" S9 k+ [2 b
    % [* U: o( `: n- ^  x8 V  a7 V' k. g1 y</form-beans>$ m4 q- i9 `3 k0 B- G4 G

    9 {8 I; I& O* w5 }: r5 T2.<action-mappings>, ~# x. S: l2 F4 _0 |- t
    & y# B* a, \" G+ D4 s
    <action path=”/sll”) j9 z( ^, _) k+ I# ~$ R( y" z

    9 c3 A6 w1 @# i+ A$ @/ Oname=”myActionForm”
    : {% O& N+ y$ m. J& e7 _5 l! R) n
    0 h; }, q* P) d" C- q2 y0 wtype=”全路径.MyAction”% e3 z2 _1 D+ ]) K4 W; |

    ( |( k" e# P! O) {scope=”session”
    + h" b0 k) I8 Y% R. }% j
    1 u; G0 u* b; S- e  Minput=”错误返回的页面”>, P( R2 d, g$ H$ W0 K0 p% {
    5 t5 z' h- Y' l0 [2 E7 V, a
    <forward name=”1″ path=”/1.jsp”>
    ! ?0 J3 K  z2 q; `/ g# j% n$ J8 w
    ! `0 U* B5 u: M, [* D1 G: j6 P<forward name=”2″ path=”/2.jsp”>/ O: J& p+ l5 L; m

    4 E) Y7 x# K) M! K</action>$ b  g- s) S: u1 P7 S
    1 P( f3 F# k* [( j
    </action-mappings>( I% L: B! S' T% P+ N5 j0 Z- D

    % ~, @* H7 u' y* U$ [: {9 o4 E步骤:
    7 q1 R! U( v, V6 I2 K$ C- S. E+ L; ?
    1.创建一个空的web应用' T, L) K$ v5 z1 G0 Q

    " f1 Q% r3 R% N) ^$ Q2.将struts的包放到lib文件夹下
    2 x7 T! H0 {$ R2 w0 z7 V6 M8 _
    / J+ D" T# z1 a6 K+ F) o7 @* ~3.将.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目录下3 j# L4 [% x7 V0 I
    9 O. x9 G! q, f, r
    4.配置struts-config.xml文件和web.xml文件2 f: e3 g- ?8 }9 ]0 E, \2 H; s" v
    , n0 R" q- n# e0 C2 r3 `' `6 G2 D9 l
    5.在页面引入tag文件uri
    1 A2 F; s) X2 K4 Q0 o; ]9 x, W6 L/ F4 R0 ]$ \
    STRUTS运行机制
    8 E0 V, D3 G+ }
    ( m9 g$ e! K, g0 `/ q1、界面点击产生请求
    . `  g% w) }; K# y  Y- u; H9 J9 |
    2、容器接到请求
    / O/ y  e8 w( _- Z4 }4 @# i7 ?% d& d5 A/ g( I
    3、匹配web.xml文件中的*.do来调用ActionServlet
    # H  Z  x; b# c& o  m4 \9 O: y+ X- \4 d, Q
    4、ActionServlet的处理4 C1 ~0 T$ [; u. ~

    ! f3 O  P, v& T9 S4.1 读struts-congfig.xml文件形成ActionMapping
    * \. y) r- |' T+ _6 t2 \* C) q% x& e  N' X$ e6 {. w, U
    4.2 通过path 来匹配Action类,通过Action的name属性来匹配ActionForm类
    % T% f- r' D. D0 {( N" j2 ?
    7 M0 I+ F  k  D: g0 W; F: K4.3 通过反射机制来给Form添数据; H% l  Q7 M8 d% k
    6 c* F  A" t" F" z  X9 W! k4 ^# q
    4.4 由ActionServlet转调Action的execute方法1 y1 y# b" e" E$ i" n. Y/ d) l, B

    3 z, p' L/ ?$ W+ e# l4.5 得到execute方法的返回值,跳转页面
    5 x% |, c( {! I* k! u1 _/ s0 Q( C$ A4 b( k3 d8 L
    4.5.1 RequestDispatcher
      v. u* V: `  A- O
    6 {" K- A7 K" k6 a# ^( A, A: K4.5.2 response.sendRedirect(“list.jsp”);' D  O3 _$ f! Y4 S7 d
    & P8 d# M; g+ f. O* N( H
    / w  C* s  z* Z7 @
    8 W2 f( z; A8 a
    进入execute方法
    . H& @3 D" @+ o7 z9 H/ V& X4 T( F- `& f
    1 收集参数
    ; ]1 T9 \$ J- ~, s5 H
    / L/ }3 E2 |* `% @# Q( n* Z, d2 组织参数; ~. |" v& M4 s6 Y
    9 j5 q" r+ b2 v
    3 调用,逻辑层
    " ]) w6 ~3 |" q! A- d6 O& J+ a. R
    4 返回值8 k4 w9 E6 }" `

    ; Y* u. U4 x$ S0 l- R0 @# r4.1 选择下一个页面 (ActionForward)
    3 P! @0 l% E1 \* t2 m' c9 a: }' Q
    4.2 把值传给下一个页面: J4 V* E* X# B, u  C2 @% L( {

    + J: N. D0 \5 [( f
    & h3 t9 p% ~+ ]2 w. ^# `0 Z. ]5 U; |, L: A5 f
    比较struts和struts2的不同
    . F8 z/ T  r. f5 ~' j1 c- X5 L# p2 w  {; X2 X" ?0 u( |
    Struts
      r5 H- [7 g1 u$ m4 t  c1 ^/ X# n0 {5 i. ^( Z
    Struts2- K; o' ?( L  s: Z, N7 y
    + U" D+ B2 A: q8 B' T! x
    组成        五个部分:ActionServlet,ActionMapping,AtcionForward,ActionForm,Action        十个部分:AcionContext,FilterDispatcher,ActionMapper,ActionProxy,Configuration Manager,Action Invocation,Interceptot,Action,Result,Taglib$ v: s# ]* O: [& M- M  P, K
    url        .do        .action
    0 M/ T  }  F% j% q7 @5 l分发控制        AtcionServlet        FilterDispatcher1 _0 E+ ]! b  Z
    收集参数        利用JavaBean技术,将数据封装到ActionForm的子类中;
    0 F. j- C" m0 H1 h4 ?一个Action对应一个ActionForm的子类
    2 E  W9 M: _' J; V7 i; z1 `. `# j0 B7 x
    使用拦截器将数据封装到值栈中。9 r6 x& ]- G9 V  d) x
    使用域模型,一个Action对应多个值栈中的Model
    & F) I4 K4 {9 d, z1 o' T# @' e. U
    读取配置文件        ActionMapping        Configuration Manager
    ( Z6 d. ?) h  ^拦截器        无拦截器        执行Action前后有拦截器
    : C% Y3 S: [) V! u* `6 \! e0 w! W, F$ S) z返回页面        将字符串封装到AtcionForward,进行跳转页面        Action中直接返回字符串,通过Result跳转页面
    * I1 @9 |9 j% O3 f3 H  c. }页面跳转方式        两种:dispatch,redirect        三种:dispatch,redirect,chain4 Q2 z% O) K5 ]
    值栈        无值栈,Action通过在request范围内设置属性,向jsp页面传递数据        有值栈,Action和jsp页面通过值栈传递数据,jsp页面通过OGNL取得值栈中的数据
    3 }" h& \; y% ?' \' t配置文件        struts-config.xml        struts.xml
    1 ]+ Y3 G5 k- ]6 ]2 n; n中文问题        不能解决(需要使用filter)        可以解决中文问题:
    " C# B6 y7 v7 B% \( F# M1、在jsp页面添加Meta;
    , z2 d8 q/ f" c& v/ r! J% A+ T1 F
    2、修改struts.properties中的设置。
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    18#
    发表于 2014-12-03 12:49:03 |只看该作者
    其他开发工具和技术
    ( [: N9 l" S& l! O6 L. vAnt" }3 `, }6 H- K' s, Q& |9 m
    Ant是基于java的批处理工具. V0 s' s7 f) d0 ?- q6 s
    ; o3 }  X3 U- ^
    一、配置ant的运行环境
    ' T( i7 L0 ]5 }1 }8 a/ u& o. }! n! h/ u
    1.将ant的bin目录添加到path中0 T" {+ ]* K! `3 K9 B
    / u" p( g3 z7 h# F2 ^
    2.配置JAVA_HOME
    - v. H; {  A" s# h. ^* p" O
    " a* \! R% d2 y  \# f/ f3.配置ANT_HOME
    6 E% l' B$ L+ S! o5 Q( |1 V6 I1 t0 B4 p" \2 Z. {; d6 Z0 L
    二、配制build.xml文件,该文件放在应用程序的根目录下
    . U3 u2 x0 H1 u1 `$ k
    / `% w: U" m7 _. q) K编译java文件
    - E+ ]4 I3 {6 e, r0 `  K; a1 r/ M  y5 B; q2 c! b4 b/ ]  s/ ~
    执行java文件4 X0 ]' R- E. g" R
    3 |- d+ h5 c" [# J3 n! W+ @
    copy
    3 B6 ~- A2 Y; B/ A8 f' [8 f/ D) t' Y  x% t! j4 U
    删除0 v, K  [# M* i0 |: t5 _. H$ K
    2 u! T2 ?; a/ l# H: `
    打jar包  o8 ~+ X; X, s: b3 @% f9 N/ Y

    # P* @) K2 g( t# O根据注解生成配置文件
    ' C# M) X8 @. [" J
    ; s- a8 C0 l% R; y/ }3 h7 ]; vXdoclet
    % `$ D; ], [7 D. g通过注释生成一系列文件的工具(txt、xml、java、html等)$ a! E) ~, F% |- M2 {0 R

    / x. @& e8 v, f4 `xdoclet本质是摸板技术+字符串的替换3 }# I) S& k; v2 N
    1 M8 x5 w( V  \! d7 n1 z- K
    1.在java文件中写符合要求的注释(将hbm.xml文件的内容搬到java文件中去写)- Q7 j: f5 m) d

    " T% l$ G3 d6 ^# t5 {% Y) A- b2 ^1.1 在类的上面 写与表的对应6 m/ o2 ~; {+ K7 A# C2 ?
    1 f) \" S! j+ U/ Y/ a3 v" L
    1.2 将每一个属性的注释都写到get方法的上面
    + k. r, C5 e2 b& U6 M$ w' q
    $ Q0 [& g# Z) e' z0 \2.在ant中引入相应的task来驱动xdoclet
    . R+ e* P( l9 U* {! ^1 Q3 e- g. l) |1 W; g- a$ I( T+ Q% u! P7 S' `6 J

    7 Q9 z  h2 N) b* {, S
    4 i& M3 l7 [5 G* Ilog4j日志管理9 l' {/ U: a  H; ?
    1、是什么?2 W, T$ L6 L' U& D. `+ p

    3 T! M5 g- b! ?( E在开发期间用来测试、对整个日志信息进行管理的工具
    : d) {5 d* V7 P: S% M7 B& E
    8 E- L! d, X7 \2、功能
    $ n" ]- O, g, D+ u: }" t) a& x
    9 F) l5 @5 [) m" g- l' e1.控制输出的目的地
    " }  v  e& q6 n3 G7 G# `
    , d( X9 R  v7 h, Q, h/ r3 w2. 控制输出的格式
    8 O; i7 j, o/ X* g& x6 z* {6 b! P8 X
    3. 控制输出的级别4 O, Q. b# Z2 K1 Z2 w

    ' Y6 S2 a! x! o5 U( U3、日志的级别! u, [: }$ u/ o- q2 e8 o
      z0 [9 D1 v2 U
    1. debug 调试* ]& D! O6 O3 }! g3 m! s
    & S' V2 j$ y7 v0 Q, R
    2. info 给用户的提示信息
    $ f( W3 `) d) k/ Q  ^1 i! V- q2 I. m& p7 e
    3. warn 给用户的警告信息
    5 S2 n( z. t3 P! E1 Q, Z- p. ^" w% w6 w5 [. v
    4.error 给程序员用来调试9 h8 s5 v2 D7 i( q% q) S: l9 u5 h3 N

    2 e2 k+ R+ d/ y) w- iDebug—-〉info—-〉warn——–〉error; O/ y+ g# F# K1 M. p

    ; h7 Y) N* e- r7 E6 o2 f' h4、配置
    ! B% I" t* X4 ^' E7 S. l$ k% r& f# h1 p; {! Y% x9 O
    1.配置级别) _! f# B% d1 e, J( @' t6 H$ k
    8 s3 }+ Z( A8 }3 D; J
    2.输入源 (控制台和文件)
    % n0 Z, Y7 k) T+ u! j: L0 q  M, e6 v! N7 l: [
    3.可以进行分包控制
    + S1 ~1 w% j3 M  c( _& b( M/ |& T; }! _5 ^5 d' j, m# c
    Log4f.logger.包结构 = 级别
    2 j" d+ j$ I( W/ R0 {& I% G' T, z& d- V
    5、使用  E( a3 \2 i4 W6 N. D! p1 N
    " I( H9 @" ]: e# p# @5 h
    Logger log=Logger.getLogger(Test.class);2 r) Q4 l) u, h9 }- x+ d

    0 S; D- s9 p1 p# u+ ?" ~/ K! U    public" n% b" K3 T! \* ]0 x3 i
    void t3(){
    * D! d3 j1 |& e0 A$ Y) P; y& G3 x" z$ Q- b1 Y! U, e
            log.debug(“this is debug”);
    2 b/ E3 f) ~, M( i
    3 }8 |/ G( r# n$ F6 C. e2 T+ w        log.info(“this is info”);
    ! }* E5 q& |8 ]2 c& X; L
    3 Q1 S/ y* V% i/ w        log.warn(“this is warn “);
    " W5 q/ ~5 ]& i0 A6 ], ?  ^
    . p5 \4 ^% ]/ C$ X5 J7 W$ K) F        log.error(“this is error”);# h+ u- b' v) F% a* U0 S
    % i7 j* m+ \8 o/ o: {
        }8 H+ A4 F- P% S* i/ N% L
    . V) G& o+ {4 Y: J. G
    Junit
    2 I" U& p/ B  b1 d) Y1.是什么?9 ?. Z2 K! J& V8 m% M3 c& {

    - y- z( w0 F' f/ B+ ~5 L) W+ I3 V单元测试的框架
    6 _8 u( v0 m' B' F3 l4 c2 Q9 H# Q: [7 q  k+ v' r
    2.怎么做?
    9 Y3 {& D0 u( R* l4 E- g/ k+ f# {  l' d, q5 f7 M
    写一个类继承TestCase' l; R2 T# h3 K* I8 `7 e) L
    & }# v1 O# ^1 x, {, v% V
    测试的方法一般都以test开头并且没有参数
    ) q9 J* e0 V+ X; O$ h' A4 `
    + G/ z; k; d3 ]' X在测试方法前执行的方法public void setUp( )
    # e" q' @4 C" c9 M1 f; x! Z" }! O9 P: c) J
    在测试方法后执行的方法public void tearDown( )7 b# o# o" f, Y! ~. n
    5 H: {$ ~6 T3 O+ O
    error和故障的区别
    % K" L& ~& m8 D; b! d8 v' B; W% p: N; W+ Z% o! M7 w' G! T
    error :代码有问题
    7 h0 n. J$ d* r1 C1 P9 n2 g( ]; r+ \2 ]! ]$ M1 c
    故障 :逻辑有问题与祈望的值不相符合+ h6 V- H" D; v6 ^8 @2 v5 q  ~

    ! V  B; T  W* s4 F9 {生命周期/ u# G7 u8 @; h: j6 I
    2 l. q1 v7 M3 a3 j
    测试—〉SetUp()—〉testXX()—〉tearDown()—〉结束;
    * j$ a& ], E( |" H2 d1 d
    - n7 l# R- H* U: p! l  tTestCase套件
    " q2 X$ k6 P- q' f2 K% s7 q: M/ ?8 J4 [! R3 `, \
    public class MyTest{- W9 ]2 y2 `+ f, r( |: f
    , o2 F1 g% ]. \' Y2 u0 d- l
            Public static Test suite(){
    0 z# w1 r/ A2 b/ S+ m9 p, I/ T/ f
    " r! x" `6 Z/ Q3 I) |3 Z' qTestSuite suite = new TestSuite();
    * Y2 Z9 C: X% c
    / U- ^( s3 s5 C1 o% g$ E; W. Ysuite.addTestCase(Test1.class);, `" M. x$ u- Q% r
    # [' [( c' P: ]5 u* x; b
    suite.addTestCase(Test2.class);9 a2 C5 U( X6 I- E5 Z$ W8 P

    " U2 k5 _- c& q; O+ ~/ J; |' X}3 J4 w( S0 q5 [) \! ~7 Y3 Y' u8 g

    " r$ q' ?) K+ r, N( ?5 u( T}. t; k3 n8 L3 R& \% J

    / o" J+ E" ?. Y9 E/ X0 e
    & d2 X+ ?  R) D7 u' |2 p  J! _2 ^. S# d% h
    Ajax$ e" j" I* r, f2 ^
    是什么?
    + e3 U& ?* H! QAJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。是一种创建交互式网页应用的网页开发技术。
    5 t3 _- g' i3 F& a: Q1 s
    : D( P  P+ g7 S# M* X无刷新页面。
    % ^; ?& ~4 n. O! E) {* G. u4 O' @7 g2 k/ a2 g- E
    有什么?
    $ |7 H8 A- c; W- T+ zAJAX是多种技术的综合,包括JavaScript、XHTML和CSS、DOM、XML 和 XSLT、XMLHttpRequest。/ r( A/ o; e0 V0 O

    & g3 }: }, P, w) D/ Z4 ^能干什么?3 x: k6 u% s) m" R+ |) l: G4 ?
    使用XHTML+CSS标准化呈现;
    3 ^# d/ n: f+ o4 V. C使用DOM进行动态显示及交互;# w' t5 \& g, c7 `7 w2 u" ^* [' m
    使用 XML 和 XSLT 进行数据交换及相关操作;0 C8 O' ]5 ^  _# K
    使用 XMLHttpRequest 进行异步数据查询、检索;+ t* h% t' R# j1 B  W
    使用JavaScript绑定和处理有所得数据;, p- Y4 O0 X7 p8 h/ D
    3 {) Z5 O# H4 e
    传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。# r# l1 M6 T0 X3 `6 x( Z: s

      D7 q0 X* z5 s4 C9 w与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。
    3 _/ Z+ i' ^8 [6 V
    # d: k- e) E; a' l# G3 {8 [使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。
    4 s; P9 W  V! r/ U7 S2 }# C* B1 T3 e/ U& x9 L+ |9 a1 h& |' U
    对应用Ajax最主要的批评就是:
    " P4 F' k. Y: i1 它破坏了浏览器后退按钮的正常行为,就是用户点击后退按钮后不能看到之前的数据;
    1 [( I) ?( T, i2 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;
    . l) s( G0 k5 r3 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;
    ' b* L' i7 ?; k, x: Q$ w4 Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;
    ' f/ c6 B1 n9 x/ o0 T) c) L' H5 s8 }/ _4 @  ?2 E4 j
    怎么做?
    : i: b6 A, G  ~' T  i4 n/ `: Z) M<script language=”javascript”>6 f* u3 E+ T: l( m+ p% Z: _3 d
    7 h+ q8 w6 D, N8 q1 o8 B
    var req;0 z# ]4 R: H, g

    4 c1 C1 ]+ o0 m. u" V& Xfunction add(){" z! D; \5 n' x. I, [. q# Y

    & v4 ]. i# K& Q7 p! t7 r. ]//1:创建用于传输的对象2 F* a& ^, y5 t+ V
    # N- }) N& K- {  H3 n
    req=new ActiveXObject(“Microsoft.XMLHTTP”);' A+ n+ i$ {: K1 z4 N3 W  W# y. W, {

    9 H8 |- n( v( e- \( I// 声明返回后,处理数据的方法
    & ?+ Y  I: R+ O1 o6 E0 l
    1 Z# i5 o: \( V- _! m% U3 c- b: o6 u7 sreq.onreadystatechange=manage;: J' j/ @/ M" J$ H, F

      n2 `8 i9 `2 h* M! t//2:准备传输的内容0 h4 y& o9 H) A! C

    - n$ ]) c! p9 ^5 ?9 k+ D8 Evar str=”test1111″;" b, p0 j! R" \; a
    : \! K' Y9 P' t
    //3:发出请求) k, ~" x* n; C5 \# T5 G

    ; E$ x* L* ~: [+ z3 freq.open(“GET” ,”/others/ajax/test/t2.jsp?str=”+str);0 t0 }/ G, B, w& h' y% k; n' H
    + J" A- X) i- s/ H
    req.send(null);
    * Y+ m4 K0 P1 |( a, T4 z1 w
    : y3 o$ T  I$ w) \! ~3 \' d7 p}' L* k* K+ N8 p: O- I; d
    3 {7 U3 I$ ^: }: \. e2 O1 B
    //4:接受返回并处理8 x2 k' R5 S0 |+ b8 q( }4 O0 X2 ]

    ! }( E- {! V! g6 z8 Lfunction manage(){
      W& G' s  u5 d! W6 y3 U9 [8 L
    ! H! X% G3 v+ g0 ^if(req.readyState==4){
    ) r) g$ r! ?" @
    + h9 T  q6 u$ t- C2 c8 G3 Salert(“r==”+req.responseText);$ E9 o+ s, r+ \. I

    ! L+ i0 U0 c9 t. X% o}& M3 B/ \+ `& F( a5 Z. E( d

    8 S" r0 i8 n$ q. m: T8 x}
    + ?1 k! M3 d9 |4 G7 D
      i& S8 }) C' n4 c7 n</script>
    4 k- w9 x9 h9 x- D, e
    / M/ }' b8 E! N8 i7 AreadyState的取值如下:
    ; S8 E( l: J& W; {, e4 `3 E  a. k  {: X1 ?0 f
      0 (未初始化)
    , ]% ?$ I6 g! S8 V' F) F; a* D0 @* f, N' `) H& }4 V
      1 (正在装载)
    ; w' r0 {; w, c4 d4 M1 h( a7 q
    4 G) M  x& J. n: ?  2 (装载完毕)& B. t  ^& g+ f' P

    6 [" w2 _( R9 h) b7 k% @: ~  3 (交互中)% z; H( ]+ j2 X% ]& w. C5 e6 c* a# Z
    ! g/ T( Q" f+ e: i& a( J% Y+ ]9 C
      4 (完成)
    9 {6 d3 z. H% F3 q5 n+ @. V9 h" X( I3 y; M
    1 Y6 L) o* k) f1 W" {

    . f9 c0 U0 ^( _7 o, I% [3 C原理3 x$ J3 S$ k% ]2 N4 v
    Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,可以是xml格式,也可以是一个字符串,然后用javascript来操作DOM而更新页面。* D) ?2 d6 n' S1 y5 @3 N2 B
    8 N3 V5 W- V. Q5 g6 V6 d; H
    Dwr
    ! \  k4 H7 A- t# N6 u  Y是什么?; g3 ?$ h/ a/ a. ^
    DWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的页面。它可以允许在页面中使用运行在WEB服务器上的JAVA函数,被调用的JAVA函数就像是在页面中JavaScript方法一样。
    ) _0 \5 `/ k) Y. B6 i
    " S+ J& U% R, P/ Y有什么?! W( V- R$ Y, ^
    它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据;另外一方面提供了一个JavaScript库可以帮助web开发人员轻松地利用获取的数据来动态改变网页的内容。5 s  P6 F# V' F6 u
    ( r; b/ A% C0 T! a/ r4 f

      w) R) n% S3 ?6 ?0 U4 D! M! N* q2 T1 W3 P3 X4 g1 f+ i
    能干什么?4 p& C' Z; C" A( {
    动态地把java类生成为JavaScript,感觉调用就像发生在浏览器端,实际上代码调用发生在服务器端,Dwr负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制。
    . L# l* j  @1 d7 A9 l4 p5 X0 C+ U: c

    9 |0 Z7 w2 q7 E* Q
    0 K; ]. v( G$ P  h怎么做?
    6 k. A# q& R! c) q, k% O0 I! p① 编写配置文件1 w( [" e- B7 W

    ! ?+ P  Z$ n. |4 I; oweb.xml# r1 T1 F: L: n: z5 s, c) E

    0 }! m# [$ F& v0 F! {7 J( x$ S: I  S<servlet>0 p+ I( B# T( n- G
    2 f5 V% R. G- ?6 \6 W2 D/ y( s
    <servlet-name>dwr-invoker</servlet-name>% b, `% I5 p  n
    , g8 J- J  {1 M
    <servlet-class>
    2 @5 h4 ~- }9 o1 {( q0 y3 w0 v% S; d
    org.directwebremoting.servlet.DwrServlet
    9 u: ]3 a' H& z* ~% M
    2 e' r# E# f* ^4 n</servlet-class>- h! }4 s$ `, C+ M
    5 d* X) J' ~$ g" G
    <init-param>' e) x8 C; m  M( g% |3 i

    . b4 s# m, Y# R1 T" {% ]<param-name>debug</param-name>. w0 F; L% R5 d& [% w2 |% v
    5 @. O3 T1 x' D* B' c
    <param-value>true</param-value>3 |2 }' ]% S& D7 b0 L- ?8 Z
    1 h2 r6 C# J! [. }) A) q9 C  H
    </init-param>5 T: c5 `" v) |' L8 J

    6 F5 b8 l9 F7 Q' ]</servlet>
      v! |0 P5 `: }$ H5 I
    . d! m" M& O3 Q% {! d8 ]; p<servlet-mapping>6 n# x  F4 E* Z  n
    % e( I; P+ k. q. Y  U
    <servlet-name>dwr-invoker</servlet-name>
    8 ~+ k" l4 i6 f6 Z+ B4 b/ z1 [0 I' D  T. a1 v- \
    <url-pattern>/dwr/*</url-pattern>* g/ ]! c4 q; P4 ?

    9 C, V& E  s: s" r9 O</servlet-mapping>
    . e; A% M  W! X$ y
    & j. D/ K* P5 c- f& J' ndwr.xml/ W7 ]& B3 v! N9 N) _

    ) S( T  D: a4 g<allow>
    ' h) C* b+ C/ R& g, i0 n$ O7 `. w0 S/ F: G) O7 @
    <create creator=”new” javascript=”kc2″>3 p. x9 V0 K6 w( z
    , t# _. g; `! e% Q' p
    <param name=”class” value=”dwr.Service” />
    / A8 s( f3 B& X) W! X5 t9 N6 p# e
    </create>
    6 m$ X- ~& I* P, b/ g1 G% m7 J, D" C& o1 I" n5 ^. \  M1 M
    </allow>
    : t0 `' y; S4 m' V) U
    7 `6 r6 k' E$ l) i% |- |②编写service% w3 t- D1 w  j& d8 E* C

    ! P8 V/ E6 \2 b. s, Y. A0 x; y, ~public class Service {
    & P+ m% y- W( C' w! U! m0 y" p/ R9 c; F
    public String sayHello(String yourName) {* {2 s- A, F3 X2 e- M

    3 C3 S8 \* Y0 ]6 V! t, B7 S//可以是访问数据库的复杂代码" v, w  l5 j+ J+ `$ Q8 }
    * F  D, O2 S' g: L" F
    return “Hello World ” + yourName;* P5 c) x& F  E9 l* [  {* {

    8 u' M1 @' n8 u}- P1 |. i- I" R( v# f

    1 P9 R5 S2 P$ t# c) M5 _}
    ; W5 u, C6 a8 K( @8 q) C2 e1 I+ S. {# M& }7 m
    ③测试DWR2 \. y; Y3 Z, l) y% R/ C
    , e) D9 V  C5 n3 g& g
    将代码放入应用服务器(比如Tomcat),启动。' U( B0 Y1 A; W, i. ?" A) c
    8 M2 l& X3 Y( n9 _8 x9 ?- }" k+ n
    然后在地址栏输入http://localhost:8080/你的工程/dwr/ u/ M- H! _' p! y9 u( l
    . a! U/ A9 R/ \/ E, C
    ④编写jsp页面
    7 |4 Q- L" N5 J+ R' Z4 {$ D8 b6 m- \$ I
    1) 要引用3个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js
    3 c# F. t# Q5 c# h" a6 ~
    ) ]2 p- J. [3 a- T  O. `7 [2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样
    2 K1 A9 [% v0 _$ l, y7 }4 N' N, G' q! [6 y$ E# W; d: ?' _
    3) js里的service.sayHello和java类的那个有一点区别,多了一个参数,用来得到返回的数据
    回复

    使用道具 举报

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

       

    关闭

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

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