科帮网-Java论坛、Java社区、JavaWeb毕业设计

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

动态微博

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
    ' ~% v0 m9 A. O4 N1 ~0 F8 B7 R/ f简述JEE- m) _9 |9 A9 o% c, O
    JEE : JAVA  PLATFORM  ENTERPRISE  EDITION
    9 V, ?5 b3 |  I& V& D) `% X( K3 s8 x; b) P
    JEE是一个规范集;
    0 [1 i4 ~3 V% O9 o' i" J  |" `6 @1 n/ b0 s& z: H$ L1 D! m
    JEE是一个框架集;8 K  I5 i4 m  o7 |& f* x8 m
    0 t0 q5 d1 T# [. l2 \0 e4 h' H
    JEE是一个技术集或API集;
    1 T/ U2 o* b+ a( q. q9 [0 _6 s
    9 k+ F: y0 t7 ~适用于创建服务器端的大型的软件服务系统
    3 p- c5 }6 ~/ ?: x4 o1 l6 c: e& Y
    ! p* K* i) E9 e$ s0 C; d5 T; @

    5 H- |! }( E" G$ d$ }- X9 b. sC/S B/S 模式
    , B% p+ S5 L. K1 ]+ ~; lC/S client/server即客户机/服务器模式,客户端也参与程序的运行与计算(富客户端、胖客户端)
    9 v. x0 Z+ g5 x0 C0 k  M6 F/ T; v& n/ X
    B/S border/server即浏览器/服务器模式,又称为瘦客户端,客户端不参与程序的运行与计算! W: ~: A1 B1 b
    : C) S4 f% S. Z+ I3 I& X

    4 c0 L; a: o5 L! ^' M. z- ?0 R: Q; y( E6 H- m4 F
    企业级应用(大规模的应用)的特点
    # S" i' ^7 m9 a  y9 H- {; [1.生命周期长、稳定、可靠
    4 e3 x+ k: J3 j% b9 G3 {& y( ^
    % z. Y: v7 a" m, Q1 C2.组件往往分布在异构的环境中,能够跨平台* {( H- u7 ?# P/ E' \# U

    & p* H+ e( X# e3 C6 {3.维护性、扩展性、重用性) H$ w, y/ q: c0 \! F
    ( C& I# o/ K8 `- J. Q, \4 U
    4.有事务、安全、线程* i- n7 r/ z3 m0 ~2 p

    0 v1 \& Q+ f! e
    $ Y# {4 f: w$ U3 z7 r6 J2 @6 |  H" X/ K0 z) U, [$ t
    什么是业务逻辑?
    ! k" h, {# I# e) J+ z: v, v- `依照业务逻辑划分模块,+ a$ P7 H- G9 X  u( q8 |" o

    # w- R: W+ t- h/ c$ K+ U所谓判定业务 就是具有以下特征:( }; t. V9 t* ~1 l# m2 l0 p# Z  E/ G! m
    1 u( v* j- v+ X0 F! |
    1.业务流程1 p) @$ C3 o0 n7 u% L( e

    7 }+ W5 \+ g2 t' E1 G2.业务判断" b1 H: q, K- n

    , H% H: A# b% T# C3.功能组合
    ( N6 Y6 R& A! T0 U9 G8 [: i/ o; L1 E3 p( @: j; w

    5 b8 S) m7 a6 @* E' f+ @- x. ~( Z. p0 G( o) C- S
    平台(角色)的划分. E0 h! p( H9 v' O+ y. \& I" L3 Z
    1.平台供应商。提供满足API集实现的厂商(BEA weblogic IBM webshphere)0 m. q! W6 q/ @6 ]+ g% M3 c

    # ?1 C. }; `' [! L) y$ y2.组件供应商4 ^/ X7 U3 k0 [; W0 m  k/ [
    . u5 F8 j6 m, k  g
    3.组件装配人员5 `" k5 {1 p6 Z/ R) k
    5 a  Y, \8 i/ ~- \0 L2 ]; r
    4.部署人员
    $ M! P% Q/ M& t1 X& G! `6 L5 ~3 J; }
    ; I$ i7 Y; P4 H+ `5.系统管理人员
    1 n. N/ p$ j) F! Q, s; c# }) z7 p" @, P4 a  M
    6.工具供应商 提供开发组件所使用的工具(Jbuilder、eclipse)
    $ B" y- U% E8 [9 W: ]. w4 \0 T( |# l/ s% x9 t
    % k* b9 l7 R. \+ R* x

    ! v- V& i' R  D( _+ f: W; E. X; I4 qjava技术分布(设计架构 模块内部设计)
    & i0 G7 i$ x* R# j& @1.表现层 Servlet、 Jsp、 JavaBean、 Taglib$ q" X! V8 a0 ~9 x0 u; ]
    6 G* x6 Q! ?& X- B8 F
    2.逻辑层 EJB(SessionBean)
    ' H; i& W  V: \4 \" d. a/ }, Z1 H0 v' q6 l
    3.数据层 ( JDBC  EJB(EntityBean)), u1 L7 l3 A5 R; j

    2 J. G5 I' D, m$ A/ ?4.服务 JTA(JAVA事务架构) JTS(JAVA事务服务) JAAS(JAVA授权与验证服务)
    , [' j/ f: c( X6 c+ t8 }$ V, F
    6 a  l, @! h" e9 I: q5.分布式通讯 RMI(IIOP)+JNDI 、JAXP(JAVA 的 XML 架构)
    2 w( d: X: u# A
    ; S$ F6 y) b0 G3 o& _; [5 {JAVAMAIL(邮件服务)、JMS(消息服务)、IDLC、JCA(JAVA连接器框架 (成))1 [4 }! b. p, E5 j) g8 R, p

    + z; t$ Y- a/ {3 o
    7 _- S# o2 W( S# w* x2 ~' _/ s8 b: i  S. O
    JEE的体系结构: 是一种组件的体系结构
    ) K$ @: [. G; \6 o  p, S2 I9 N! R1.组件 : 能够完成一定功能的封状体(独立的功能的集合)* M3 X# v* x- T

    1 x9 Y6 x9 {4 E" C, w) e  d不能单独运行,必须运行在容器上  w; K+ e8 X0 u0 f- \) O, S. g

    4 V& g, b! e$ l. I- _# m9 r分为两类:web组件、ejb组件' N" o- {9 ?, s

    % ^, ~0 ], E6 w- ^" }2.容器 : 提供组件的运行环境,并对组件进行管理(一段程序)
    % Q2 m' Q% b, \6 \8 K# Z& T5 q$ ?$ R. M# z. m' f% z  g
    管理组件的生命周期; U5 _8 }+ ^$ e. M( f

    3 U& }, q! i5 H不能单独运行,必须运行在服务器上) }9 ~/ `, `3 b& }* Z3 w8 T

    8 M7 U# e! X6 s程序(组件)通过上下文来调用容器(context)# P7 ~3 r# f# \$ t% J

    , x6 _, W* N5 L! {组件通过web.xml向容器描述自己,使容器能够认识组件
    " A3 c1 ^/ o3 R# c4 I; [9 g( T2 q' C0 _
    容器通过回调方法来调用组件
    0 F0 _! R% d& S# ?
    / g& ]7 J) ~  B$ F分为两类:web容器、ejb容器
    4 O# F* e. f6 r( S7 A
    + D8 Y# m2 w0 N$ e3.服务器 : 提供容器的运行环境,提供大量的JEE基础服务# F4 ^9 n+ A. m' k
    2 ?! E2 |3 ]3 y
    web服务器(只提供web服务)/ R7 t  A* d6 n; B
    , k1 @9 B% a, r  ?
    jee服务器(提供web、jee服务)
    4 a1 X: v1 t5 }! t
    6 `- q1 @- P+ S7 l: F . l# @9 ]+ f4 u4 [3 X) y* r- ?& T
    0 Q  @( M/ ?. }4 H. F
    什么是回调方法
      }6 I7 k) z+ J/ Z. A由容器自动调用的方法,就叫回调方法。7 N4 x9 A! ~  H$ X' a
    2 {# K. |6 f; [( D! `, A
    % D/ L6 H( s# d0 [- C

    7 {; @, X  G4 s. j8 i" vRMI远程方法的调用机制
      U* P+ m& c; {4 g, N' Q) \& K. c+ p例如:A主机有B()方法,C主机有D()方法,A 想调用C主机的D方法
    0 }$ k# l2 U3 ~% A4 x$ U6 z4 o5 H; s$ _4 R) k& }, ~4 ^

    & C2 j4 [, M, E
    . k7 L; x: H% C/ N
      T* f$ z- p" S' C; H9 ~) T$ E; v$ z) S" m* w0 Q
    学习方法
    3 q6 T, L  X& q8 }$ u+ S1.规范(熟记) 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 |只看该作者
    Servlet0 U  G$ ~; r  e3 G2 ^' |
    •     描述war包、jar包、ear包的结构
      " u: ]  O: x. h* R! X/ c

      & ]! K& l/ D% F4 i! m* ]3 Q5 k  U) I" m: j9 l5 _

    war-                            web文档压缩包

    —WEB-INF

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

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

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


    : t" |& b) j9 Z. i

    jar-                             java文件压缩包

    —META-INF

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


    4 F( R2 A  Q6 a8 _% @0 b

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

    –META-INF

    —Application.xml 配置文件

    –*.war

    –*.jar

    2 k  _. \1 F8 V
    • 什么是servlet?servlet主要做什么?% }! Z' S1 w9 z8 l3 h

      $ W# f( k' N- k6 d. [
      * U5 t- d" b3 L

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

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

    0 F3 S0 h' @' V/ ]
    • servlet 与cgi相比的优点?servlet的缺点
      , @5 s& V  O& x- @& E- l1 Z
      ' s6 D  F4 ?( L7 b$ c/ T; l$ ]

      ( u  B% L# n4 X" T

    优点:

    性能(线程比进程更快)

    可伸缩

    Java强健且面向对象

    Java平台独立

    缺点:

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

    ) H& b9 l" \6 z% w4 K1 o
    • 常用的servlet包的名称是?" j" w8 f, s0 ~3 S* G1 }' k( d6 O
      ! T" ~; w! k3 i9 U! p% U
      : D0 Z* Y) b; `* G% ?% S

    javax.servlet

    javax.servlet.http

    4 g+ h3 D& ?, q
    • 描述servlet接口的层次结构?
      & }9 G- f" P; k: t6 i9 `
      6 n- a' \+ R8 U1 M, j

      4 |  n" ~& o8 e8 m0 a

    Servlet

    –GenericServlet

    –HttpServlet

    –自己的servlet

    ServletRequest

    –HttpServletRequest

    ServletResponse

    –HttpServletResponse

    , i6 c* {" E( i: A- c% W, N* i
    • 对比get方法和post方法?0 [' W) N9 n7 K( V
      $ }7 w4 g. s# F) o

      ( V: b& a" D. v: u7 Q- g

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

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

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

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

    7 B! q) b3 V9 N% r+ m& H
    • 归类描述HttpServletRequest接口都完成那些功能
      # f& v, n+ V; _0 R; u% U+ _

      7 P) T9 K  u. C2 b) y5 l+ W
      7 U; ?- ]- `4 Q
      • 读取HTTP头标
        ' R& v, n4 B0 U7 y& v" W; Z
      • 读取cookie6 J( k1 ~: @6 N5 `/ V) }/ @
      • 读取路径信息3 w% m5 b) C( K2 o7 F% ^! ?# j
      • 标识HTTP会话。: M" w8 v5 G9 W0 \( ?3 r# F

        ' I1 a  I: D* A1 s$ k1 L

    * V, Q3 v* z5 c
    • 归类描述HttpServletResponse接口都完成那些功能* K" p% ]8 F2 s; ]; `

      # S# Y& _0 @9 d# G- O+ K, T- i3 y
      • 设置HTTP头标9 R+ @6 C' q' ]
      • 设置cookie
        6 i0 V, [9 s  E7 M8 y* K  d; j; M/ J
      • 设定响应的content类型: d5 t/ r/ ~6 x, ^
      • 输出返回数据# @, F9 ^" x! A, o' T( l; _4 V
        / h! \$ e) V0 B' P% t! c
    8 b1 a" [- I$ y! u& u
    • 描述service方法所完成的基本功能?默认是在那里实现的?
      / b- H3 L4 W: f6 A, t8 L$ g
      ( v. _; ~4 ]( y- Y2 j
      * Z6 l+ r* U1 v8 f2 N6 B

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

    实现:默认在HttpServlet类中实现

    8 _7 b' p/ b1 |6 j* f8 D) \
    • 如何开发自己的Servlet?描述应该做的步骤和每步需要完成的工作$ u% g! M! @/ W
      2 [3 j4 j* M' [4 O. h% m
      " w0 E* G$ `7 e' e

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


    $ p; h2 b4 m$ w. K' k/ O/ O
    • 为何servlet需要部署描述?# ]: B+ v  [; [

      7 f: e6 F+ b2 e4 U8 a. g* q" |" v4 W' C7 p, F

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


    ) y' F: @' A; m  m2 w+ m, R3 Q
    • Servlet基本的描述应该是?请写出来, B- Z& C3 r4 T6 n

        K4 U* Z7 d. D6 I+ t, c$ L
      " h5 M$ S' w7 R. A5 l1 p
    : ~7 i9 u4 i3 Q( I. V" ?& ^

    <servlet>

    <servlet-name>Hello</servlet-name>

    <servlet-class>com.javakc.web.action.MyServlet</servlet-class>

    </servlet>

    <servlet-mapping>

    <servlet-name>Hello</servlet-name>

    <url-pattern>/greeting</url-pattern>

    </servlet-mapping>


    0 O' ]0 e! E+ U1 m# T8 l8 O% @
    • 如何在html中使用servlet7 y6 D: |' w9 x( F
      & W2 N0 ?- x0 y. R

      " h: H, X) ^; F: h& A) s

    FORM标记

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

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

    语法:

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

    {HTML form tags and other HTML content}

    </FORM>

    3 P4 H8 N: T# a# m. @# ^
    • 如何接受request中的参数" f  l" N/ \) w, b* U

      ! _. {0 Y/ t! p+ a; HString userName = request.getParameter(“userName”)方法. b0 ~0 ^4 g8 t( h3 A

      5 U* F+ S# O8 y$ X

    $ V/ f- a' b+ V6 w
    • 如何接受request中header的值. d& ~$ A3 z' ~- A( U; y, H

      $ f% B% I/ }# _( ]+ X$ W
      * Q" {  E5 k# y+ j/ t

    request.getHeader(name);

    request.getIntHeader(name);

    request.getDateHeader(name);

    request.getHeaderNames();


    3 w6 q& A/ r7 w5 r. N  a
    • 如何输出html
      7 z! E+ a& X# \/ a0 y+ f

      . s$ W3 g0 o0 x, T  q  D+ J/ C
      4 i# x& K' n. _4 t5 I

    PrintWriter pw = response.getWriter();

    pw.write(“<html>”);

    pw.write(“Hello”);

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

      z5 {! T2 y% H# Z' r7 z$ g- ~/ _
    • 如何设置输出的contentType# m0 p% C4 V; Z! s% o

      $ ^* ]2 r% f: W) l  w8 R" b8 @6 S. B, k3 f8 ^

    response.setContentType(“text/html”)

    & q) U1 V, i. I0 s2 W, a  q
    • 描述servlet的生命周期?
      5 k( }$ t" f4 E" r2 }8 B& @; `

      * C9 T- }. ?  l9 Q4 F7 Q6 N: e& k$ b2 V& w

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

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


    6 @3 H2 T9 G7 t, B. N8 u; n
    • 描述init,service,destroy方法的功能和特点; w" F' h% [+ S8 q5 F: B8 o- o
      2 _! E4 `. {& C0 y; R
      - x' T8 a% ?  X7 K1 v

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

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

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

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

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

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

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


    , s: ]' A9 N" w1 C7 ^, b, J  q
    • 什么是回调方法?有什么特点?8 @! ^2 ]$ m, g! E, @- s1 s- C$ L

      . q/ q9 _  F7 A
      1 q/ X7 {+ c& s. Y+ J' J

    由容器来调用程序的方法

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


    : O8 S$ r" W, Y  {1 s9 ^
    • 如何设置初始化servlet的参数?
      $ ~% X( T( G8 i( d0 s  N
      & d( g! a$ r5 Q4 I) U5 q2 f. E6 |6 U
      在<servlet>中添加如下配置: n# M( ?7 ^( a' j9 ?
      # B) b3 b7 {/ [/ A

    <init-param>

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

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

    </init-param>

    4 M- A5 ^5 m8 }* W2 S# \& m
    • 如何获取servlet初始化的参数
      ' |, C% u  G: J. {& ~4 P

      & ~/ c+ g0 [, ~
      ) `# P0 a: {; C5 Q

    public void init() {

    greetingText = getInitParameter(“greetingText”);

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

    }


    , O8 b7 Z2 F) T7 D
    • ServletConfig接口默认实在那里实现的* A+ q8 m# f$ K' b( p

      $ N& m. r8 y2 }% x" R+ j' V' f8 _2 B" y& v* y# t9 m  g/ B

    GenericServlet类实现ServletConfig接口

    / V3 K4 E& C" Q  V( Q/ m9 ]5 L. a
    • 什么是ServletContext?有什么作用?/ W; F8 S% \8 }% ]8 K# B7 b; S, F
      0 g' \) q8 d' R5 q7 O+ T; I

      ( u  p( C4 e4 S+ x

    Servlet上下文

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


    6 Q  H& ^2 O/ \1 @( }- `
    • 如何访问ServletContext接口?是在那里实现的?
      " ?6 e2 `2 d8 i7 L: M" n: ?
      ' s! ?5 v, P3 X. D6 a/ N
      4 t: s% r; O$ C3 k

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

    GenericServlet类实现了ServletContext接口。

    " N* @6 b0 \: a1 m  G* P
    • ServletContext接口的功能包括?分别用代码示例
      9 q9 `0 \2 w& h  {  ~+ q
      2 K; f  J7 R; x& f6 k7 H: M

      0 H2 [" o$ j" s/ B2 r& B# a

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

    getInitParameterNames() : Enumeration

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

    setAttribute(name:String, value:Object)

    getAttributeNames() : Enumeration

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

    getResourceAsStream(path) : InputStream

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

    log(message:String, Throwable:excp)

    ! @$ U% N. P" C8 I
    • 如何设置ServletContext的参数?4 v. I2 t8 t1 V' U
      ) c/ D3 ]; Q7 _6 X! S

      7 k3 {  X  g+ z& P6 c# X  f9 y

    <context-param>

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

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

    </context-param>

      ]; X" W# Z. l: z+ y- B$ S+ Z
    • 如何获取ServletContext设置的参数值?! j, r# ?' w0 C! `. q% |6 ~
      1 |  c+ \5 `# H6 V5 q
      ( Y; @& o0 X' X( q2 f8 l' Z4 N

    ServletContext context = this.getServletContext();

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


    6 W+ ]- b+ |/ M& B1 t: U
    • 描述Web应用的生命周期?7 F# O0 U! W5 L# X$ W3 b( U# V
      / f: p; o8 k% S  A% J

      $ \' q# T1 r# R/ {2 w

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

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

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


    , O9 }/ U# I8 G5 U
    • 如何用代码实现监控Web应用的生命周期?* u$ @3 o$ [) ^  z- y9 j+ R; g
      7 d) V4 \4 q; h8 f. v! X

      + R6 W+ ^. Z. n! _
      / @" [. D8 G* O; }( j7 G

    public class Test implements ServletContextListener{

    public void contextDestroyed(ServletContextEvent arg0) {

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

    }

    public void contextInitialized(ServletContextEvent arg0) {

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

    }

    }


    0 t! ?4 k  n0 }2 Z+ Y4 J2 n

    web.xml文件中的配置:

    <listener>

    <listener-class>

    com.csy.Test

    </listener-class>

    </listener>

    + }: {& O% d; |+ |
    • web应用中如下错误码示什么意思:400,401,404,500, x; I- M; @* v7 c/ I$ O1 _9 r3 C

      ( s1 y4 m: t( M! J
      400 Bad Request//错误请求
      401 Unauthorized//未被认可
      404 Not Found//没有创建
      500 Internal Server Error//服务器内部错误
      ; t% }4 q$ d& u, y6 ]5 f
    5 d/ k0 G4 y$ Q% i7 f
    • 描述Web应用中用声明方式来进行错误处理的两种方法3 }  z* b9 E0 n

      - X" }% U9 A5 J, M8 O3 u
      - f6 ?/ I1 h8 P+ e7 U

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

    <error-page>

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

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

    </error-page>

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

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

    <error-page>

    <exception-type>

    java.lang.ArithmeticException

    </exception-type>

    <location>/error/ExceptionPage</location>

    </error-page>

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

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


      E) m' O3 X1 f- Z- }8 i: n
    • 描述记录异常日志的方法,都位于那些接口?
      % r1 ?. _* [" m  f
      6 G  w* o( A# {( b9 {4 U* q7 _

      7 G% \, p% l+ m* t1 t" K

    GenericServlet:

    log(message:String)

    log(message:String, Throwable:excp)

    ServletContext:

    log(message:String)

            log(message:String, excp:Throwable)


    / f# k. t$ @7 C( B- N% C
    • 什么是会话?' f6 O# E0 Z2 b& I* Y  D

      7 o# x  l1 O( n
      0 d( F2 ~) K& ?' w  O0 Z3 K

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

    ' M( h- q, _/ y
    • 如何获得会话?  j9 u8 Y' u9 y; ?. `) [0 J& o

      9 m( h) y) G6 R2 _
      HttpSession session = request.getSesseion( );
      & V# @+ x: ?3 h- r8 Y# b5 s
    6 a" W$ E. K8 S+ {  t3 _; K4 `
    • 会话Api的基本功能?+ r" g) y1 w4 f" G% i9 F

      1 _3 `8 C" _& m0 }) \  X! ~+ j4 T8 f/ b) H7 V! _7 i, [+ E) q5 g

    getID() :String( M8 n- ?2 [/ |

        isNew() :boolean" A8 ]1 k: a: ]

        getAttribute(name):Object1 M7 g& n2 h3 \6 W% f

        setAttribute(name,value)
    # u8 R0 s7 V- }! r. X/ ~

        removeAttribute(name)


    + Q, C5 k/ H# @; F% M1 b
    • 如何销毁会话?7 \' a3 Q- A2 L

      ; E+ S6 t% Y/ q2 [! o3 ?+ Y! x8 @5 G; o/ L2 k9 L2 V+ [6 [6 e

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

    <session-config>' v, O- P& y7 i

             <session-timeout>10</session-timeout>3 o' ]9 c- m5 d7 f

         </session-config>
    2 |3 V( Q+ r8 \- `: v

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

    invalidate()
    4 |8 N) d) E; T1 `. D/ A1 o: i

         getCreationTime() :long
    , l. n) e9 H5 t/ U, ^0 ~; l

        getLastAccessedTime() :long
      s1 {6 C" J2 w6 Z3 R

        getMaxInactiveInterval() :int  ~, x( r2 G0 e- X9 L- E9 I

         setMaxInactiveInterval(int)

    + ~9 V- |: l$ U6 j: f( a
    • 描述会话保持状态的基本原理
      0 P, z; ^; j2 M+ m! I+ Z  g; N  B: S
      ! x8 U, n+ I* u0 [2 a8 u; i

      - M. I, [& `" W) R' ]

    ' o3 L, c3 T: A; F4 Q

        client server! X* Y6 a: F; w7 s$ i


    * ~( l8 r0 W  F  Q

    request
    3 Q7 U: c, d, T& X. `+ K

    response (sessionid)
    1 G2 }* l- |3 r9 z1 |8 `2 k6 P

    request (cookies)
    - k  A; Z( R2 D* D

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

    ' Z) E# o( T* e& D
    • 请描述session和cookie的异同之处
      7 k+ @8 C4 ^. Y' M! k

      ! I, X7 R9 ^% F( z, y
      . b, j2 K; x- a2 N/ w6 t

    6 {/ t* r, ?. b+ ^, Q1 Y' p: Q. _* }% {: c* M. ~3 ^5 y; T
    • 如何读写cookie,代码示例& r& Q+ G6 [  N7 W' u5 x( n

      % A( e" m' v* {: c7 P" c' F
      7 [% b, G8 L5 r  Q

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

    response.addCookie(c);

    读:Cookie[] cookies = request.getCookies();
    ) i0 s: Z* @5 [1 t' b# V8 D/ G! `8 U

            for ( int i=0; i < cookies.length; i++ ) {
    & w; u( Q- m  V+ A: K

                String key =cookies.getName();" D1 j; f/ ]) ]* Z8 g

    String value = cookies.getValue(); " ^( [0 `' V3 d5 z4 l

    System.out.println(“cook”+i+“:key=”+key+“,value=”+value);
    - q- }" o. A1 x# Z4 I  R3 }

         }


    & G  {: A. \& x7 H
    • 什么是URL重写,如何实现,代码示例
      : M% b" L5 |  Z1 O
      6 C& a3 H* s- m" G* ^

      . A" Y: u" d4 N3 J

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

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

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

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

    : u" U: k& I5 ?( B
    , X! D5 F; j* y
    • 描述web应用的4种认证技术
      % j! j: ~2 ^/ Z6 S

      / w( `4 C: g" C2 L: V
      ' m% k8 g# U$ W8 q( Q8 ~3 n

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

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

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

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


    8 W4 O! M+ O( q4 k3 V
    • 什么是授权,什么是验证?
      $ B! Y, _7 \3 n0 N

      $ K; }. g$ G7 r: @
      % s1 c! \/ G: _, [3 `% {% z

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

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

    " {5 K1 T; |5 m" _) ^; T' F7 w" ~: A
    • 什么是HTTPS
      + B4 {$ x+ k" W; _# p/ j! r
      3 B/ v6 ?3 n0 C
      * u% `! F( u) ^

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


    7 u; V: ^% D+ W
    • 什么是审计?6 x* |6 c- y3 z, y
      ! V- Q* ?! r  u0 K. m

      ; n/ E8 ?4 u, i, j2 y1 `' Y

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


    . J4 U! S/ I' H- G
    • 如何实现声明性授权  ^! m3 x- @; u) ~8 E9 H
      5 F2 S& J2 s# \6 N4 h( u+ w

      ' F" r! p8 ^' V( _* s! j

    1、标识web资源集

    2、标识角色

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

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

    在 web.xml里配


    ) j' n4 a  t0 b
    • 描述servlet并发问题?
      4 w3 d+ S2 n* S3 \5 B8 R7 c

      + Z; I, f% t6 f5 d6 j7 D/ R
      & h' E5 i' n1 T; T$ Y: N* Y7 _4 s

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

    $ g" X+ c  W8 h9 E! i* p8 O
    • 描述Web应用中的六种属性范围; C0 i: m) `* M  e5 a  D
      . k3 h; w( O/ c/ z3 N
      1 K* Q9 p6 q( T( @

    局部变量(页面范围)

    实例变量

    类变量

    请求属性(请求范围)

    会话属性(会话范围)

    上下文属性(应用范围)

    ; [% H- z; X1 G. I, ~0 [- S
    • 指出上述六种哪些是线程安全的4 S9 F: o- `' G! G& T' N

      8 R# J" t9 j3 W: r/ r' z# \0 x  G$ D/ O, Z! y

    局部变量和请求属性


    ' U3 z$ e9 ^; }, u
    • 什么是STM?如何实现?
      8 S5 b2 h7 y8 ]  Z
      3 n/ v; G9 H6 ^7 m/ g8 e/ J

      ; U: T& a$ K  \

    SingleThreadModel接口

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


      ?6 V: g% I7 d0 c8 ]
    • 如何实现并发管理?
      - T- F& m+ e. l3 H7 f8 @9 O

      $ }, u' N/ D' ^( A" ?9 j! b# j  ?! S) I0 V8 T0 Z" E) |1 e

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

    使用synchronized语法控制并发

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

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


    8 v# I, M, q# A% {( _" t4 C
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    13#
    发表于 2014-12-03 12:45:45 |只看该作者
    Jsp7 {5 J1 W/ k3 L% \  D1 W3 ]
    什么是Jsp?! V4 C2 W( Z, @- n
    Java Server Page    结合java和html在服务端动态生成web页面的技术% k$ C- Q* v9 ?2 Q1 ^! C( M

    # {2 b+ ^0 R0 x , \! h9 {+ o' a( p7 A8 I
    1 ?+ x- l( u. H) e
    描述Jsp页面的运行过程?  D( C6 M6 C: H7 l- V
    第一步:) r- C& d$ o" e5 W- e$ Z, B
    9 L5 r2 T+ p1 @0 m$ w
    请求进入Web容器,将JSP页面翻译成Servlet代码; D0 G' y4 ~6 x- b5 J' L6 Z
    8 J; J. h/ `3 ~7 A
    第二步:
    $ d" K3 U, ]  n' |  U( B
    ) Y% a7 D5 I3 A+ |! z' f, L编译Servlet代码,并将编译过的类文件装入Web容器(JVM)环境
    8 O& \! g9 I: j' Z1 f9 l  G' R  F+ \0 Y3 `/ X
    第三步:
    " F' ?5 |( n) h. v
    - ^  J) O: Z% G3 S% v. U8 y& EWeb容器为JSP页面创建一个Servlet类实例,并执行jspInit方法
    0 s, c' c0 Z2 ^* E- T0 U# V
    5 I4 q6 G! Q; k" n5 I: m第四步:
    % y/ a' W3 h  q  Y. c/ w
    0 v6 z' K) G  h: x  kWeb容器为该JSP页面调用Servlet实例的_jspService方法;将结果发送给用户
    4 Y% F. m% Y" x& l# i, K& W1 y; D! `% R2 w+ z: Z8 I

    ' w$ {( ~. S0 V6 S3 H' b/ Z! F0 R  u! Z* G' W% u7 `5 ~
    描述Jsp页面的五类脚本元素的功能、写法、并示例0 U) z* g( o# `6 [  T
    注释 <%– –%>2 ~& x; b9 c7 c( {2 c* L) J
    ; {1 V! Q- `3 |4 f
    <HTML>
    5 N& ~2 Q. D- g2 e$ K, y5 q% c9 r6 a, P
    <%– scripting element –%>
    , w; x, w9 W" B. h& z+ E
    4 A' i) ~) o( f6 n" ^: L</HTML>5 y2 o) c3 L( p- ~( x
    % r" \: y2 b/ J8 m4 V% r) L
    指令标记 <%@ %> 指令标记影响JSP页面的翻译阶段
    # ~) M3 r' d( M2 a  i% T
    % P7 z. n. ^: x7 [' ~1 S<%@ page session=”false” %>: ]9 M0 i3 S/ k: W! V
    ; J, [# N' B) |% I( J
    声明标记 <%! %> 声明标记允许JSP页面开发人员包含类级声明8 e/ s2 m) X! R4 F7 {$ a8 s

    . g0 B- N  V! ~2 |9 N<%! public static final String DEFAULT_NAME = “World”; %>5 R/ A, ~0 g6 D" S- ]# k

    8 w  ?" |- T& _, @. E. ?' ?' J* K    脚本标记 <% %> 脚本标记允许JSP页面开发人员在_jspService方法中包含任意的Java代码4 f: f* q$ c1 `( i0 A7 w
    0 w7 N* U% O0 C( D/ p' `
        <% int i = 0; %>2 }* c$ A1 K" e3 B. x7 l; Z
    : ]8 O0 J' E$ L6 B9 }
    表达式标记 <%= %> 表达式标记封装Java运行时的表达式,其值被送至HTTP响应流 <B>Ten is <%= (2 * 5) %></B>6 \* N8 J& z6 b! p& y
    8 ?* h5 u; ?/ O$ H8 C# c4 o: }

    8 C7 c0 `& G8 ^% i% L% V' Y) ?# `' j$ z
    描述Jsp页面中的注释种类和写法1 Y6 p# Y! [2 g; d: Y: `+ A
    HTML注释
    / u# l. ^9 H* w# r
    9 Y% ]3 X2 M7 l- b( W7 L6 S3 m<!– HTML注释显示在响应中 –>
    # `0 G8 M+ p" B6 ~; W* M4 i6 D! U# ^& e9 z' e. I: O5 r
    JSP页面注释
    + E3 ^& B( b$ |2 J; y4 v4 P1 t4 P& f7 ~
    <%– JSP注释只在JSP代码中可见,不显示在servlet代码或响应中。–%>
    9 Z( W3 t8 K% S  l1 n7 \. u) h7 S% l1 R' P- L8 d4 V# `
    Java注释) N! i! ?7 b- x3 p; v; S' S( L' X; w, R
    " Y# u& x0 H% K; G
    <%/ N6 p* b5 H/ `# `5 o

    9 q; h. n/ {( ?" `3 g/* Java注释显示在servlet代码中,不显示在响应中
    ) f9 Q- @; i: E% n- c( F; I/ D7 `8 f7 H2 l0 U  r
    */4 L# ~* R$ t2 D2 Z; ~

    ! c2 r2 G( X; z% |%>! g" D* `, s8 k* P" O  E3 T9 G7 R! ^- ?
    : `3 U9 G7 ]4 R/ ]# u
    / w7 l" W! Z, v. K" c9 A3 `
    - s, i2 _0 z7 S, _" U3 J
    描述Jsp页面的指令标记的功能、写法、并示例- W. ~  M1 C+ R& C, p$ @, l% a
    指令标记影响JSP页面的翻译阶段4 y% M8 f" T( w4 a
      H. m. H. _' A. o2 r0 |
    <%@ page session=”false” %>" N: V& R2 ], {3 _8 }
    8 [& U2 ?* V, H
    <%@ include file=”incl/copyright.html” %>  `0 l* v8 O* ]9 p; K. D* w8 s
    ) F6 c$ J" q% z% Y2 @- F( e
    <%@ taglib %>
    7 P9 Y/ [  V9 L* }- b8 E- k
    $ n" T. A* P" P8 Y) x6 t " s; p! [' n/ H# e) t
    . T# m- i* S$ }' h8 p& _
    描述Jsp页面的声明标记的功能、写法、并示例
    ' S2 t& a) }/ H" j- P* p声明标记允许JSP页面开发人员包含类级声明3 V* B# ^: }; v( ^

    9 j. q0 G, u: E写法:
    . v9 G1 K' k7 z. v- q. k9 f$ `% i& u2 ^0 y) n8 `' ?9 ~
    <%! JavaClassDeclaration %>
    ( H( y+ t" s9 q: J
    ' s% U# Y* Q% Q" t, x& n% p例:( P% b% O  [/ h# J8 j9 W- I

    / z; ^* h9 H, u& F1 c<%! public static final String DEFAULT_NAME = “World”; %>  |* C$ }6 t! ^+ w$ ]; K- o* g
    6 B$ j: R: t% N. @% X) D) T& j# L* }
    <%! public String getName(HttpServletRequest request) {
    4 N5 C: s; x8 v$ ~) L/ H0 H: x8 O* [7 ]0 b$ n1 W: S" f' z& y* {
    return request.getParameter(“name”);: d5 b+ @& X: g* ]2 {5 c
    ) ?# T! u3 E, l
    }  ]+ h+ ~  l- O8 t4 m

    6 i: b, k' T  }& O; `* r6 [8 C%>0 D9 M' N+ r! @7 F

    % Z3 o  R- r* T& c  P<%! int counter = 0; %># g) Q' B. ]9 n& p

      d' ?. d. j$ t, X3 x! b, O" p
    * ]: k, I+ _* c. b
    ; `* ^% U0 w7 B& @) J描述Jsp页面翻译成Servlet的规则1 K. F/ P- n# n, u# k0 A
    jsp中的注释标记被翻译成Servlet类中的注释7 q. h- k9 b$ Z4 _: p( v* f& q; R
    ! c! ]' l) z/ r) D  T/ I1 G
    jsp中的指令标记被翻译成Servlet类中的import语句等
    3 {& A" e) o3 J! N3 p- E( N6 i6 V1 j; @/ J
    jsp中的声明标记被翻译成Servlet类中的属性
    1 _1 s, V, ]. ^% t' _; ^- @, B. w1 P6 I6 R6 |  c; U. j
    jsp中的脚本标记被转移到Servlet类中service方法中的代码" e) z, r, F- y. P/ K, p5 u+ ^
    , r1 A4 N+ r. S9 d9 K
    jsp中的表达式标记被翻译成Serlvet类中的write()或者print()方法括号中的代码# W, }+ r2 D# y$ m# w% e

    - Q& ~% W3 r1 s/ x# D1 T $ v/ C4 N* g! j' F" v
    , I) w: |* ]6 J. H
    描述Jsp页面的九个预定义变量的功能、用法、并示例" @$ Q( H: J8 Z5 R" _7 Z3 }
    request 与请求相关的HttpServletRequest对象
    - O% V1 Q( q0 o  D
    # @8 \4 |* X- D* i# Mresponse 与送回浏览器的响应相关的HttpServletResponse对象
    5 h3 B& G% k* L- ^5 |+ {/ j6 r! Y. I7 V: l* V( [# R
    out 与响应的输出流相关的JspWriter对象- I2 O8 Q* X9 @9 a

    ! v$ I" ^' L6 m* k/ X% a    session 与给定用户请求会话相关的HttpSession对象,该变量只在JSP页面参. w+ c. t% [+ f( J6 `
    $ L0 d- Y# e9 s
    与一个HTTP会话时有意义
    # Q$ B# g% V6 P4 C* ?% q! Z* R
    + J3 i. y  H: i  N" ?    application 用于Web应用的ServletContext对象
    1 {3 E- G% u# I& ]3 }
    " Z; c! G5 L" e. T: E0 l- Y4 k- w8 ?config 与该JSP页面的servlet相关的ServletConfig对象
    ) f' I1 Q) p$ e, z
    7 k' c9 {. j2 s, gpageContext 该对象封装了一个JSP页面请求的环境
    9 c) ~; z% X% p* K1 z9 t" E$ i5 m. }; b
    page 该变量与Java编程语言中的this变量等价
    / v+ I  t( [, W1 u9 T
    8 P& j/ g* r6 m% M* D3 y: T    exception 由其它JSP页面抛出的Throwable对象,该变量只在”JSP错误页面”中可用* N' p# Z9 x7 T. B
    2 v7 H) J) R1 h1 i( N

    9 T4 Y5 `7 @* O" f4 a4 L8 b& g' U7 q/ \& B# r
    page指令的功能,写法、并示例,并描述它的如下属性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding
    8 w1 T  _4 s1 Q, himport import 定义了一组servlet类定义必须导入的类和包,值是一个由# V. m; C9 ]+ R+ }. G) T
      a4 X  d2 F5 |3 K, w4 C( E
    逗号分隔的完全类名或包的列表。
    & ~) P4 O# B3 F1 p4 p+ {6 l/ T" D
    session session 定义JSP页面是否参与HTTP会话,值可以为true(缺省)
    & y8 T; K% _- l7 q! ?% n8 p8 a% j7 H' z7 A2 Y6 L$ X
    或false。
    + z' R9 _+ C4 C# D! k! w# _, b4 ?& E. @" X. [" ]& D
    buffer buffer 定义用于输出流(JspWriter对象)的缓冲区大小,值可以为
    / i$ c6 {# C4 h2 w8 j" P
    : p( e5 K0 T* E( [! Rnone或Nkb,缺省为8KB或更大。
    1 M! n6 C5 p% P: L- _- i" x; t1 W  ?# @2 _2 W1 e
    errorPage 用来指定由另一个jsp页面来处理所有该页面抛出的异常
    3 Z6 ~2 q! t  q/ Q! r$ }- z% S2 ?- b0 a! E
    isErrorPage 定义JSP页面为其它JSP页面errorPage属性的目标,值为true或
    & r* U; M% [: }! |; B
    + W% m3 n: e% g: |9 kfalse(缺省)。
    ; `  j4 \" T  L! [9 T/ T
    & ~9 ?0 R7 k0 O! L- ~9 t6 {ContentType 定义输出流的MIME类型,缺省为text/html。
    $ }- O3 v3 K1 B7 t  e( D# t
    4 ?" M  g4 B8 HpageEncoding 定义输出流的字符编码,缺省为ISO-8859-1
    # V; |1 w5 t, W9 n0 W  f. G
    " Z$ y! s7 i  X
      v$ p; z+ C/ {4 O$ ]& C
    4 D  [9 F3 S) T+ g" f0 v描述MVC各部分的功能?MVC的优点?MVC的缺点?
    . k9 G5 r6 U" E- f0 L7 o* GMVC各部分的功能:5 Y! d0 y# Z! L$ J9 Q

    # M. _( O4 |# f9 c  S- rModel(模型表示企业数据和业务逻辑)
    " V4 o. e! _/ t- z1 f. h& s9 f$ p: M$ ~) _, T' m3 o
    封装应用状态: N, w( Y9 I8 s1 N$ h/ o
    + ~/ j* @, L( {0 e+ h1 y7 R
    响应状态查询
    2 Q6 B; h/ z/ F8 G; o4 z, f4 }) f4 F3 `0 v3 O
    暴露应用的功能
    " f7 U" Z5 V/ V2 ^5 N" V6 a  ]; h$ v- j
    Controller(控制器接受用户的输入并调用模型和视图去完成用户的需求)- k2 _2 G( z5 ^5 T

    ' U+ m- I/ U4 W4 ^. q  `验证HTTP请求的数据( L/ C; o% U- \3 T% G
    . b6 I$ K7 ^! a# |4 O/ l9 b) o
    将用户数据与模型的更新相映射. F3 o9 n. b3 @& U  i

    ! [; z# H- k1 R8 g8 }' s+ p/ U选择用于响应的视图
    ; T' @+ P4 |. S5 a% `% d* a6 w% b+ N1 U9 Q& l/ l6 \8 I0 t7 d3 ~
    View(视图是用户看到并与之交互的界面)0 i$ l+ m$ @7 |* U

    + V& z: _9 i; b) O产生HTML响应1 ^$ ~# C  y% l4 i+ m7 g

    8 {8 l: y" V* r, t" }! ^* [/ k请求模型的更新
    ; k/ S6 f/ E) ]1 a( p" S: y/ z( l, R) L2 \& m  T  f4 m0 V2 g
    提供HTML form用于用户请求. F5 y) Q* T) K, \% o

    % e% t% i6 K( t+ IMVC的优点:
      {, C. E" k4 Q0 [8 z4 k) X  |& O5 d
            低耦合性:视图层和业务层分离
    4 L* ]& Q4 {9 ]+ p9 b* R" b1 e
    9 w7 S& V6 o. d' X' M( }' m% E高重用性和可适用性
    " T1 V' m* e1 t. u
    7 B+ s5 \8 ^) F, x& ~9 d$ k9 S& f较低的生命周期成本
    8 m' _* B- Z  Z- G% B1 A9 s9 U: R, k
    3 X% Z# V9 D* G3 }( P0 O快速的部署
    $ f' M+ }) I: g+ b0 T: a+ X7 e4 K
    可维护性
    2 ?7 n. B8 y# f; L1 m, S3 R0 _% ?2 u( x0 y: f+ P
    有利于软件工程化管理! B' d  ~8 V2 k9 a8 @
    $ \% T9 Y( c8 m: E4 ]
    提高软件的健壮性
      p9 S5 Q5 I" O; z. G& G
    7 i1 ]$ O4 i/ J% TMVC的缺点:
    2 _" T* S1 ^" n; o- f$ @9 t6 L' H5 ?1 l' w
            工作量大,增加工作的复杂性,MVC不适合小型甚至中等规模的应用程序
    3 A) x) b# n4 B8 t& i4 ~' e; D# \
    : ~) J& U9 C$ G 6 }8 ^2 B5 M& Z5 S& e5 n
    5 F1 X- D* f5 l4 k+ c; J
    什么是Model 1结构,以及结构中各部分的功能  W. `4 G. B2 X8 N6 ~, r. e* n# s
    结构:jsp+javabean
    1 H2 l! Y8 Y' T2 I8 t/ H& ?% E9 @, ?3 u" @# c; |
    Model1中使用jsp来处理web应用中的视图控制部分, A6 a$ z7 ?6 S7 I. p

    * ?* r4 N7 k: I8 YJavabean收集参数! ~1 w; ]) a( d& G  H: L

    3 }4 l1 k$ S7 k3 x; `, A
    # I+ P' F8 v: b
    - z7 R/ K$ l  Z! p& Q. P0 c什么是JavaBean?$ O2 i! h* x. f6 x! h4 }8 E
    用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。
    , i; z3 I; g1 u( f! E; `) e9 [. d, J# u8 y9 m0 E: z% r; b' H

    $ q) L$ A9 e) w. |$ X$ K! D  f" D3 L6 v. a
    JavaBean的规则?" p# M( p# q/ F7 h# ]
    使用get和set方法定义属性
    & b( ^% C9 x+ B* ^
    ; p: I6 ~" R- o+ c  M一个无参构造方法
    7 [; @. Y2 \8 s# N
    ; j1 K2 R  _# {9 F: i9 f" F无public实例变量( 所有属性私有化)  ]3 Q  C* i2 f4 V% w6 V) I
    ! N7 H" @7 z0 B; U2 H

    * N1 z* x/ ^4 D6 f$ a7 U- D2 M( g6 q' p4 z8 S% V
    什么是jsp标准动作?包含那些?分别都是什么功能?如何使用?9 i3 A8 i* l% ?8 c$ {5 S
    JSP页面中使用类似于XML的标记表示运行时的动作- ]' s& Y, M- G) w; X; \* W
    ; c  d1 j( b! `
    jsp:useBean1 a0 {7 u5 a' K% T4 ~

    " P8 T- g3 X! {8 Tjsp:setProperty& n( ]" h# M9 @  I5 n; T

    ( k0 u; r5 q& }0 J. K, @/ e0 m: Qjsp:getProperty
    8 e- j1 m; ^" w" l* F# }, T  o4 a5 k  B" i7 A
    jsp:param2 X" t+ W" B+ W* b

    , N  M, v( J% P  Hjsp:include
    + N* z/ w+ H" i" m1 M2 ]2 M9 L2 s2 D& p# r" U
    jsp:forward: r. V' ]" W2 t1 o) ]

    2 s- A; H+ i2 ^ : j4 p9 |+ C) m2 C; ?! y

    ) I" k  j% H5 C) [3 l& S' W& ^# H用代码示例如下标准动作的使用:useBean、getProperty、setProperty
    8 |9 k3 \: g7 ~<jsp:useBean
    ! P" A  |  _3 D6 c) p/ ~: M& C- J) y9 a% W  N) C! r
    id=”myForms”) z4 e: \- f2 R* r4 x/ E1 [/ V
    + ?; i5 o3 k; a1 n1 x
    class=”com.base.mystruts.forms.MyActionForm” scope=”session” />3 W: q6 V, }1 Z. p/ j& w

    * j: Z1 ~2 A3 m5 S( j    <jsp:setProperty name=”myForms” property=”name” />
    / u. J0 H# a/ J% Q" T6 p& K0 j- H5 |1 V+ N: h! E( J
    <jsp:getProperty name=”myForms” property=”id” />: M- W/ [( l; b$ e' s& B

    5 ~6 Y1 D/ x" Q# T' e1 F" x* l * v( {# y  \# P9 }8 l

    2 ^6 o" X9 d+ B3 `) }/ B& L描述说明Bean的四种scope4 ?2 Z/ k& U* X6 e, T
    page
    ) g3 o7 n' T' D& J3 h( U6 r1 [9 C
    request$ x' ^' Y+ H* ?' k3 l7 }' Y$ n
    ; L+ ^+ }  }4 N  K3 I7 M
    session- y9 c5 [8 A4 z5 W8 \
    8 E/ v, S5 i2 e( o9 T8 X' N( j
    application6 c( I/ t$ p* b& a% J0 x
    ; I+ q0 Y6 J. X0 [" d9 o; E# R

    7 O% \; x8 U; m* t1 ^0 K7 ]" d6 f/ [- q( d$ Q. D
    描述说明页面上的字段和Bean中属性的对应规则# K6 y* J" L/ c" S+ E6 f: }9 q7 k
    id 指javabean的变量名' R3 j( t! d& q2 d# B+ I6 z  ~& U1 T

    6 l8 d" P7 a+ e/ Gclass指javabean类的全路径5 e! e6 w- R3 n' M# Z) {8 K
    7 l+ A# T7 L' \( e- O
    scope指javabean的应用范围
    ; H/ i# o% Q0 u+ o' K
    . D. k1 `" e  D& `name指所用到的javabean的变量名
    # f# J# q* Y- @6 i4 d
      L: d& t& p, g0 O/ Z% V    property指javabean中的属性, J; T3 g1 i6 e0 l2 Q' x: h
    8 |$ m, l/ M- q* f# ~+ Y

    ! Y' l; N3 b! D# D7 s6 y/ d' c3 \( T5 D; [  n. q
    描述useBean动作的处理过程$ R1 X3 a) y2 B8 w. M3 y. M* d5 e6 b
    使用id声明变量
    : d7 y; O  e: s, m0 r" q' r- p
    # Z: O* H/ I# s6 O3 L8 \2 v试图在指定的范围内查找对象
    / g# [, o' Q+ U- Q
    ( X+ O1 n7 m, {如果没找到6 r! I3 O0 v6 D6 u) n/ G. U

    $ J0 u& k$ K' \- P0 v; H, v创建一个类的实例+ p  T) U4 ?' V$ W5 c2 C4 M

    5 |% r! j# O( j* e% z执行useBean标记体初始化对象: t4 B) F' h8 T; I7 U% ]
    / U3 d# P5 l! D% _# m
    如果找到: p$ R* d4 S2 @0 N& d: O" G  o
    6 B3 l/ L3 f: l$ y
         将对象转换为类指定的类型3 R4 O, w7 _5 A0 l. o
    * H7 w% ^$ u. Y. k- g3 H
    , @2 G1 u3 L! s( c1 D
    7 O7 F* s  z6 d* {) c6 n
    描述forward动作的功能
    7 j7 K: @1 ]+ \使用脚本代码处理请求时,可用jsp:forward 动作产生一个不同的视图,
    3 b4 k2 P7 ]! K8 j" q  i' G& a' I0 x  Q; ~( v6 \( H' F3 C
    使用同一个request:
    2 L" x8 S4 w1 _/ S; P
    . b+ N. U  A/ m % C. ?7 U6 O% Q5 H
    / F; @( _% ~0 a
    什么是Model 2结构,以及结构中各部分的功能
    % I8 V& u8 Q) X& Q. zjsp+model+servlet, s% G3 ]0 o' x6 m, s/ m

    4 @8 K! u' `, s* Z6 MModel 2架构使用MVC模式,JSP页面充当视图,Servlet充当控制器3 F. W4 Y" x$ @: }- R. \; k) A

    $ x3 Q/ S3 M4 x& s" xServlet控制器:
    6 X" Z  i5 ^+ V# A- F9 B" D+ {* K
    验证HTML form数据
    " u' ^+ K% @5 l9 Z4 A/ v6 t4 e) N6 H/ j% h
    调用模型中的业务服务
    6 T  W0 w3 Z3 q6 q3 g9 v
    9 F: Q( i; S) z/ I% X9 S存储请求(或会话)范围内的域对象
    . A! A2 `4 t/ o6 z: V7 a/ u0 W4 \4 l3 p" U
    选择下一个用户的视图
    " r2 f% n  @: K+ T3 t
    " `. @  F; [! h/ v" H) U" MJSP页面视图:$ p9 K, W9 C' E/ z- {/ W5 r
    8 t5 E' J1 d& h! n
    使用用户界面(在HTML中)
    ; v2 B) O" S  C/ v8 k5 q) a) a/ `. U; v
            访问域对象3 X) W8 [. f% `% k& b; m1 F

    # T' K3 {2 Y$ u2 \5 X
    % n6 {# v* G% M2 x. [8 P+ I7 {2 T4 V; G: o+ j
    如何获得分发器?分发器的功能?& M' p1 J9 ]2 g4 e: S' e0 |* `
    上下文对象中的分发器:
    8 @  S" e; u3 b' F) I" M4 k/ I$ L/ |/ ^/ V  \
    ServletContext context = this.getServletContext();
    ! n% r: ~' O6 }3 ?, f% e$ x
    7 |8 ]  q9 f4 `9 G3 J) @: gRequestDispatcher servlet = context.getNamedDispatcher(“MyServlet”);
    1 X9 k2 M1 M& I3 ]( p& Z8 N9 ^: c& c5 k! h0 l0 n: V
    servlet.forward(request, response);3 t( O8 Q' l7 [+ ]3 U- _6 n7 s

    0 Z* {1 H0 l$ [$ ]请求对象中的分发器:; |, ~. D* y& S# {  U% r9 j. `, w3 V
    ; _# d5 b, K  i: s; C
    RequestDispatcher view = request.getRequestDispatcher(“tools/nails.jsp”);- ^) x3 Z9 |% O$ p4 \, R' t- @

    ) n' T' N5 H/ ~- |! [3 l, ?) m) ^; Mview.forward(request, response);, L- S( G0 V, m% e8 p

    8 ^- [: M/ N  p8 E8 b/ j7 Z可以将请求转发到另一个jsp页面,并保持请求的传递性2 s- P) i5 t- \! e! G2 h* Q0 ?1 I
    % e# a+ d/ C# q5 t
    ; j, y8 G& U$ T' V
    1 _* c: B' O6 b6 K
    Jsp中页面跳转的两种方式?
    $ e/ E9 T$ G( t  q% y使用分发器跳转页面1 E9 |: |) S. ~. B4 Y
    RequestDispatcher dispatcher = request.getRequestDispatcher(“url”);
    9 g# y! g0 o3 `' p- h& n7 \3 D0 B6 n4 c
    dispatcher.forword(request);
    - b; \* S! `) o8 b# D3 q
    6 a* ]5 b: A5 i+ q) c3 N    特点:保持请求的传递(上一次请求中的数据,在下一个请求中仍然可以得到);
    + t: E4 t4 u: |0 f" _3 M5 ~. |( e& H
            转发的页面只能是同一个Web应用程序的其他Web组件
    " x# _4 y9 v1 ^5 u8 V! g* |5 s5 w. R. D# z; |" U+ o' b: @
    使用重定向跳转页面" d! B, [) T# l4 i* `. Z5 s9 l
    response.sendRedirect(“url”);
    1 X  i) L/ Y3 J, c4 M; `/ i8 |, P/ [6 ~& D
        特点:产生全新的请求,(上一次请求中的数据,在下一个请求中不能得到);
    % I, S% X  n3 P
    3 g6 Q0 U- F; r: h        重新定向的页面可以是任意的URL
    8 ~' Y, E) b8 F+ E* ?1 x' W* V7 ]5 l" k1 D3 C3 r$ g, g, Q/ O5 O. Q5 J

    , i& o) J/ W+ T7 |+ H* [) z; z0 ?# [0 t6 s
    描述Jsp中引入另外页面的两种方法,并比较两种方法的特点?& D* Z3 ]9 i+ [0 \7 T8 i8 @6 M
    <%@ include file=””%> 在编译期间把另一个页面完全嵌入这个页面,可以说是一个页面! c! n6 j! o& n1 n8 T8 \- V. Z

    0 ?4 g: t% j& o: I. _8 @在这里可以共享变量: Q( {6 _( d+ E  s7 B4 U$ J

    8 c  t4 B5 \; Q* W! e<jsp:include page=””> 动态的再运行期间把另一个页面加入这个页面,可以说是两个( S5 A( D. v. b5 B4 w" r) y0 `8 t9 H0 i
    2 p; [. J/ n# ]9 J5 j; d
    页面,不可以共享变量
    - y; k8 s0 x; [- x& @9 p" o9 ~1 x3 U2 X
      u+ i( G9 _3 Z; ]
    ) V; J/ ]" @% t% U% E3 v- V
    什么是自定义标记# q0 r9 O  }: F0 H: T0 g1 d
    自定义标记库是一个Web组件,
    , s4 U' R1 a8 P& k
    9 ^7 k, z" A: z5 E( I包括:
    * _) e' ~1 G" K- m/ T% _; L8 O9 m/ h4 w" d$ x9 n0 ~  d9 I5 x
    一个标记库描述符文件(*.tld)
    $ y. h8 P# Z' z5 o' M& w3 y: Q
    6 u3 |( L, N9 o) Z- p) H  U所有相关的标记处理器类(*.jar)) B' L# Z$ Z6 A7 g. _9 d: p8 m

    + o1 K! w! |, w' F! b/ S
    " S* q# @' O4 f0 g( C* Z, X% k
    2 x( Q8 {  H* m% h描述使用自定义标记的步骤,以及每步详细的工作4 Z3 }2 {+ Q9 ~3 ]# s$ o2 w
    使用自定义标记前,要拿到.tld和.jar两类文件
    , ^" }  `/ x0 L  ^& G7 |) }2 C& d" j/ l9 D2 \1 g
    把.jar文件放到WEB-INF的lib里面。+ M* c) x  n1 {9 [7 n4 o1 W
    把.tld文件放到WEB-INF根目录下。
    . y) g* Q7 X& _7 @1 J+ o5 D: U9 p在web.xml中配置。
    ! L( k2 h, D# P  ]0 @8 Z& ~! b<taglib>0 ?4 y2 B0 ~5 ~/ B, B

    6 Q* b0 z- l6 ^' _3 J<taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
      c, x+ Y( J+ W6 j2 G5 S6 `# {2 S  C9 `9 C7 e1 Z
         <taglib-location>/WEB-INF/c.tld</taglib-location>* W6 y+ C9 I2 B& ?0 Y% z1 F
    9 x) A( [9 Q+ W0 J& w8 I
    </taglib>
    - P5 {: ]1 s" T! ^8 \3 G% H5 i
    ) v; l' _- V: A/ {9 s" G! D+ u在页面中引用。1 g0 [7 [) z$ F9 L" A
    <%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“s”%>
    2 Q1 r0 }8 O+ Q1 b! L8 }
    1 k- O' I+ x9 L4 S' ]7 Puri必须与web.xml中的uri对应7 s7 Q$ p- w6 _, a0 ?

    : Y) X4 N6 _, M3 S; |prefix是前缀,用来区分是哪一个taglib
    6 m$ ?/ p2 d! }
      ^( M* f% f" B( I3 \0 D  T使用标记
    5 S6 ?. C6 R* J0 t* \8 |" I格式:<prefix:tag名称 属性>0 R& Y7 v3 a* h8 m# ]  B$ \
    8 h2 n# z1 c, l, _  x4 {
    <s:forEach >
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    14#
    发表于 2014-12-03 12:45:59 |只看该作者
    在tomcat下配置数据源
    : s( j+ {+ B( B# Y: L) t1、服务器与数据库的连接% d/ C4 ^' B8 y9 j! B

    + X/ V0 q& ^1 I6 Q# s$ H: O* L0 e2 o配置server.xml文件
    ' L* |; l+ V* r; D0 N! T* h6 a
    - N: Q! c) [# _6 n1 j2 h1.oracle5 {$ _2 w% v5 X& w5 v8 |  o

    " K; F+ `; n! i/ Y5 ?<Resource name=”jdbc/company” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
    + z$ \% G" _( ?% S/ G( ^( w2 {& J* l; C
                            factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”
    $ Q9 n# r: u; p/ B  u% ~% W5 K" _+ d- I
    url=”jdbcracle:thin127.0.0.1:1521rcl”6 Y' Y$ E9 K5 z% W+ Q
    & p: |2 T8 L" t1 u+ y- H( V- Q2 m+ h
    driverClassName=”oracle.jdbc.driver.OracleDriver”  ^% J. o$ I3 O  D1 Y
    " P2 U. u: G0 ?7 I5 j; W
    username=”aa”& G, N  }( o. n5 m

    : s! n- _* S: P. ~) U- ^2 o  opassword=”aa”
    5 e9 l0 r3 \$ u2 L3 Q- c6 @/ E  f2 t
    maxActive=”50″
    / B8 ~' k3 [. v9 d6 H2 {/ f  y: {& n8 U
    maxIdle=”10″
    4 `$ l+ s0 Q7 l+ X$ N6 B# O; q
    - {$ j& ^8 \# B: u) r. Z' `maxWait=”-1″
    0 c, \* K! e/ }5 J6 A7 n/ J' A  a5 p& g0 H0 @  r/ p! r" D# W. K
    />
    : R+ X" F+ Y2 f1 p1 C9 g" b  w) Y
    5 I  c& ~& D! ~7 `, o( w. H4 D1 j2.sqlserver
    " i% N( ~6 T- w, d/ x
    . [2 a( J9 |# t! l<Resource name=”jdbc/webpage” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”: ?. R5 g% R$ z2 A$ Q2 X  O
    ) h  A  C9 g! J; E$ U9 \
            factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”
    0 F8 }- S3 J- r: R4 L9 B) d8 m2 F. V, {5 B9 y
    url=”jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;/ u! W& g" m% \* M9 `% |
    # y% S9 W8 B$ j* y) I$ W
    DatabaseName=webpagetest”
    6 V- w! X  f6 }. y% Z- r& [
    % H% G; @! J9 a9 R8 edriverClassName=”net.sourceforge.jtds.jdbc.Driver”; E: k( c! N' r; n
    ! Z' R" b( i$ s# D2 Q7 r
    username=”aa”1 O) a% X! B* ]( m
    1 K( Z1 H& U7 O# R: E- c5 E
    password=”aa”
    - N8 S5 X* X5 q8 v3 V' S3 j  M4 r0 u* q1 h: }2 s1 n) T
    maxActive=”50″
    $ f% z" m* H6 X* @
      g* a2 H! u$ ~9 X% ^: ^maxIdle=”10″9 f  h: Z( L* M% e* x

    ; F8 d! M5 t; x, q4 P4 n, e: |maxWait=”-1″
    9 G  j) l9 x1 D% j/ V
    $ [- U& u5 b2 T/ l/>( j2 X: \3 `2 Q, D* E* W

    0 a# d7 y8 m% V  {" ~  U2、配置自己的web应用的xml文件0 w) P0 `+ z0 t9 ~& f

    ; a. S, C# I0 [& W4 [0 J! o
    & j- @) ^% }# O4 G& J2 w/ y" @( N" [2 s1 ^
    <Context path=”/eb03web” docBase=”F:/workweb/eb03web”
    8 c( l! w' k# V+ T1 ^9 t
    ! k1 k& x# i' a2 {privileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>0 W/ y4 e# T: C6 t2 W
    1 O8 |& p* s2 c! J, J
    <ResourceLink global=”jdbc/company” name=”jdbc/company” type=”javax.sql.DataSource”/>
    / p! J7 n0 C) p8 K8 Y( z. O$ c4 _* _* m0 o/ M0 E0 N
    </Context>1 b9 k; W* x; m1 E
    / G* k* B' ^9 D1 t" n6 _; o
    $ f5 ]# ]* R. y2 d
    6 W4 x" i2 {, G7 p1 l. K
    3、配置web.xml文件) c5 Y( s; a2 R5 f" J
    , C9 R( l, P+ X% E' [
    与服务器建立连接
    % ^/ T5 {* f% B3 G( c) M
    : I0 I( x* K( K9 w8 T% F5 E. m<resource-ref>0 a1 B$ u! V& o/ i3 `+ j- `2 R! l
    1 \) Q, j* O& |7 T' t3 [
    <res-ref-name>jdbc/company</res-ref-name>
    7 F$ j! t$ J, ^3 }  v
    " b4 G$ Z) D0 M% v+ ~% k( g9 `<res-type>javax.sql.DataSource</res-type>
    ( F. s( L6 T/ w# m# ^% @7 g; D9 _
    9 Q; ~5 H  d: m/ z7 H7 Q8 H<res-auth>Container</res-auth>
    0 ~8 t2 ?7 X2 R! C, d$ T, o3 |
    0 U/ |, e7 H. U8 @( u# ^</resource-ref>
    : j; g* I/ B/ P5 b# ]  N$ H5 C8 g& k
    4、在应用程序中不直接与数据库连接,通过DataSource连接池建立连接
    7 p- V9 H; ^4 y. o7 G0 F: v5 Z; k, C& Z
    //1.在程序单独用时设置系统的属性,在tomcat下可以不用配置,
    & f: I* a' B3 f2 m
    4 `1 a: ^4 u3 w, ZSystem.setProperty(Context.PROVIDER_URL,””);
    % e' ]( R: n8 P: r' F8 N6 ?9 X8 K
    . H0 c% x' ]" w$ uSystem.setProperty(Context.INITIAL_CONTEXT_FACTORY,””);# a# g; y1 h6 D  L

    2 G8 h: e( Q& g5 j. M% C//2.创建一个上下文对象
    8 m' @1 y+ S( m" ^6 X' |7 J: h3 N6 L: y9 A  e8 ~1 R2 @. O; n
    InitialContext context = new InitialContext();/ z0 O/ B/ p& H

    1 h/ D4 Y  R% g) x//3.通过上下文对象在连接池中查找DataSource
    2 r& l; }' I1 U, U. [8 P' L$ I3 M
    & q2 {2 b/ O5 \DataSource ds = (DataSource)context.lookUp(“java:comp/env/jdbc/company”);# O; [3 {. i/ y3 D0 j+ E

    # s3 a; Z6 e5 J//4.通过数据源建立连接6 x, S  f. C5 w) X6 c
    3 O" s0 M0 e2 K
    ds.getConnection();
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    15#
    发表于 2014-12-03 12:46:30 |只看该作者
    ORM对象关系型数据库映射- R; `2 r# |4 N$ f5 }
    (Object Relation Mapping)
    1 P* d  c' X; B8 s) B+ t
      ]+ U+ l& h* j+ h1 L4 S0 \9 t% r一、映射的特点
    " G4 M) l: \+ [, S
    * x) S& p9 j8 `1.一个对象可以对应多个表1 L* Z" U* c2 i5 M: u3 L! N2 |
    $ ^( l, Y  T; z1 H+ A/ X; n. K
    2.一个表可以对应多个对象* S7 Q: j2 A+ H' j% G. f! i1 [

    . N) E8 U& C' g/ T' w, k3.对象和表的关系不用完全对应
    $ a; w1 L" H: a4 O. X& Y. i( m5 |; V* F; N& \; ?& T- ]% K; _9 c: n
    4.对象的属性的名称和表字段的名称可以不同. T& j# m" |. ]# R8 j% C
    ; Z# v& o/ i* @% X: {
    5.类型可以不同,但数据类型之间可以转换
    4 L* ~$ y' w0 l2 b
    * H7 Q, s* A. p! U$ J$ a; J! ]6.对象中必须有主键,数据库的表对主键无所谓6 d3 T( u, @, i

    $ q5 \0 Z2 U: G0 R5 b9 v; i7.数据库中有主外键关系时,对象中可以有,也可以没有
    # G0 h' {4 D2 }# e: S7 `! s4 w+ o7 x& [8 k- I; q
    ' N3 P- ~+ L7 m) ]/ d- U: I+ p
    & i$ e. d. \, R2 T8 {/ [4 y4 C; Q
    二 、有一个映射的描述文件————>xml! j3 y5 U' p* x2 ]2 J
    ' I4 Q# P; C( s  B" c+ y
    三 、怎样实现描述文件————>一段程序, W7 S7 \) ^" t/ L+ ]2 b

    8 c& Z1 W& I  a* [  o对象 映射(mapping) 数据库6 m# k8 U( D6 F# q( h2 ~
    - Z) g0 a5 F  {
    user
    9 Q9 a2 J' K* Z
    % d" M9 Z& i$ W2 X% J9 Wid=11
    ( X& G, k# O* I' W* C. I/ X
    2 I7 \- `+ d$ I* x6 P1 ^$ z6 Aname=”张三”———— > (1) —————> tbl_user(id,name,age,tel,address)
    ! k! V. c& D% W* n3 F; a$ H& X& N; r; p  u
    age=25 <————(2) <————
    # w- N: {! @; W3 o( v8 ]2 c* j: ]3 e/ s" ^" y3 d; |, j
    . |* j' u# Y) U- A

    & x8 n4 o" E* y5 u(1)从对象映射到数据库& k5 x( n! `, e$ i$ \. p( o

    - }. `5 ]3 W+ h, y/ M$ M1.JDBC% W6 Z! i& r$ E7 \, K! z
      S4 Q/ |- [( B( {8 x  `
    2.根据描述文件来动态拼接sql
    8 W, j" L- Y* e$ v1 L/ d! y3 R! _1 y' h
    3.执行,添加到数据库中
    & e" |7 A2 W( ]# \
    7 k& {7 Q0 R( b* w2 ?  t ) H" l. k0 x: d. w; J

    ) l/ J7 l' ~8 ?( _2 d( c8 c(2)从数据库中映射到对象2 }5 o/ B5 ]2 m! Q$ p: e
    & t/ F: k; c: d" B  X3 N# l3 I
    1.JDBC$ f+ \8 V5 x% }# P( r- |

    " b' ^7 d. Z+ g$ F. e2.拼接查询sql
    - Q7 ]% {8 h, W9 E2 v. u% R8 d. P7 y+ B" y* ?4 q
    3.ResultSet
    1 F- a. `3 ^2 ]7 ?0 L8 a* T. z4 l: ^8 k- X
    4.Model
    , G6 W- J4 {  y; e- }  ]$ v$ W* m# @: H6 @5 Q/ v9 N
    5 k% l$ g0 y9 A5 o) r/ \  C, b( }
    0 Q8 X+ O5 {/ ^8 T. F; q- _; M
    hibernate" Z. a/ s  y& i$ S) j) x
    开发流程:
    ' j2 n. M7 d2 T5 u( w. I/ D* F7 L' r8 c8 A+ c1 U
    是什么?
    , Y" ]0 j% |& W! R  x  P2 chibernate是一种基于orm 的轻量级的框架; E0 ]& i7 j- q7 x3 }

    ) h. H8 X- q+ o  x! q6 _
    7 q4 |$ D9 e( L0 b& P3 N6 J
    , p/ `( P) A2 _! l有什么?
    / t+ c6 i1 ]2 w% P1. session 保持连接状态(依赖事务和连接池)
    0 e" p( y: ?3 h$ T7 b
      ?. e  s* z; X0 @2. Transaction事务
    ; `: D4 [5 f6 ?- e% E( h. F( ]3 |  C
    3.) f" h: M% Q# N
    Connection Provider 连接池
    . v" F) _: C* m! u' j- J
    1 j% \1 a* F8 C* ~5 i1 w : _2 _: b' \+ z  A; X* c. ~

    , O$ J8 v& V) F7 j. G' o$ b5 q能干什么?, H3 a, r* j0 s
    1.orm2 ]3 `& w3 l2 i* w

    & x: I  H3 s. a5 `* @- P2.提供操作数据库的接口,简化数据持久化的编程任务5 a5 t0 `) o& e# |

    0 {3 X4 O8 U3 {' U8 M ; i- \1 K2 l) k$ c* ?! Q

    ' N+ R3 u5 t) T. ~7 i1 i0 M8 a怎么做?! {6 A; }( Z, i
    1.搭建hibernate的运行环境,将hibernate的包和hibernate所需要的包拷贝到lib 文件夹下
    2 q- |" W; x6 j
    6 O3 [  t0 P9 M5 N# T, N; Z2.O(vo)' h& f, f, f) w* f! Z" f$ p
    + `4 W( H$ R# Y7 c
    3.R (关系型数据库中的表)
    2 a+ \% i" f8 Q5 w( v# R% k" z( Z9 G; t
    4.配置文件
    $ ?+ g- |9 |' s! \. T9 g3 A
    : t5 J, |) f0 `4.1 cfg.xml 放在classes根目录下,默认名字为hibernate.cfg.xml) K% o& d! p8 q$ ]! Y; f8 H2 B+ C) O# |
    % R9 X8 d) h* a4 A* @3 t+ M! [4 d
    a.与数据库的连接9 O+ ?$ I) n+ F- j

    2 s1 t* N& _2 _" z! Qb.可选配置
    : @( F0 L/ a3 n# r# V
    " c* v; N/ Q& r1 H- x& t% Lc.映射资源的注册
    2 r9 n2 o! H6 w2 S# b8 m& E4 W8 m$ _% N: R5 \& g7 L8 l
    4.2 hbm.xml文件 名字与类名相同 并且与类放在一起
    ( P! t9 r- Y2 W0 t
    2 F. t+ ~7 `' B# z6 p% `/ V: M, Aa. 对象与数据库表之间的映射% ^. U: P7 X/ z9 b

    4 X8 c1 B- ~( j1 Hb. 对象的属性与数据库表的字段之间的映射+ Z8 @# `/ O' F5 \

    : j* e$ V1 v/ _4 a. d) ac.组件之间的映射: c# A( j  N- u% K

    7 a& M. Z# O& S) }5 A/ K, T7 xd.对象与对象之间的关系映射+ ?) j. _6 F" @% \+ D; [
    , }' S- H4 Y% }# `9 Z
    5、客户端; z# f& t, f' }1 j0 |
    . R/ t% w+ G% |7 D( B0 e& \
    1.得到SessionFactory( v* L2 t, ]$ P7 _3 B9 v% \
      I0 d, h& e8 D% p1 G2 _
    2.通过SessionFactory 工厂来创建Session实例0 J. T5 @% M, Q% ?% r: y
      [8 a8 H7 G9 r' R
    3.打开事务
    3 E0 l; @2 j+ J+ O+ \2 c
    , I5 `: i  w: j4 s* r; W$ v' F4.操作数据库5 u5 `5 G$ ]  e5 G

    ' c9 Z2 y3 E3 J$ ?& B$ n5 R% z# K5.事务提交
    ! e% s, Q+ I; w* l. X! h* R: i8 i4 Q2 D& I7 F2 a, F: w* I7 S8 h
    6.关闭连接
    - K/ ^5 n" M% Z( S+ z
    3 X! ~1 l6 ?& Z$ w& H4 m运行流程:5 j- J( b. `& Q; i9 c# @
    5 q! V) M, \; K8 |; N' M% i' A
    整体流程1 J8 w7 \. `. L! ]) L1 x: r3 L
    1.通过configuration来读cfg.xml文件
    6 U: h6 ~7 h; G& ]! r; [
    0 g7 t/ k: `$ G" e/ s' j" m9 H2.得到SessionFactory 工厂(根据数据库的连接来创建sessionfactory); ?- c$ i/ P: [9 }, P1 n% v

    : |. a) w* @4 o4 R3.通过SessionFactory 工厂来创建Session实例5 e+ [5 @! p, ?# ?' q
    ' `$ D1 l* }8 ]0 p# S: l1 t, {, Z
    4.打开事务7 J( h5 n8 w) T6 Y( G. O# Y

    $ a( g4 j/ \  S( I  |5 P# {; }% `# s" v5.通过session的api操作数据库
    ' m) C/ C$ P" w7 b/ j+ J, ]+ o  H, B1 t1 t4 A
    6.事务提交, a+ \9 o8 ]. M) U4 B& R$ i
    8 T7 K: @/ L7 w8 H! |: w
    7.关闭连接
    6 U2 k8 T& T( y( B  B, r3 d# s
    $ _9 x  n) ~# v9 @ * a+ L/ E& T' _! J( a1 m- Z

    9 J& Y9 U1 V" ]; Y+ l/ zsave
    ! s5 m* [1 L) e1.to—>po) h+ l9 b! `' c3 }1 i& {, P# V4 u
      K+ J0 L9 W8 ^+ H! n
    2.根据model和cfg.xml中映射文件的注册来找到hbm.xml文件) v! X7 ~( p$ A0 O

    1 {$ M, P, P% r+ _; \$ M' X3.根据hbm.xml文件和model来动态的拼sql
    . Z) ~, n2 ?9 u. J
    4 T. N- z0 ~& W; l4.客户端提交或者刷新内存9 P3 ^# K4 G0 d6 E' \2 T

    2 A$ W. \- h0 m1 Z5.执行sql,值放到数据库
    8 }/ _* b2 d! H
    % s" g8 b* s2 J2 l5 J  F# g; \
    . T; c0 ~' H: J7 O) \+ w# g+ g0 b) c
    update、delete
    $ d6 ?; A( a! y1.根据model 的id在内存hibernate的缓存中查找该对象
    ) Q5 s( T$ W2 t1 @3 C, V- [) w; E5 i9 X+ U+ j# |7 h1 Z
    如果内存中没有就到数据库中查找来保证对象的存在4 V8 W1 t4 o# p4 j
    ( ~; j" p0 h) m0 \4 c
    2.根据model和cfg.xml文件中映射文件的注册来找到hbm.xml文件
    5 Z1 e0 f6 c$ |' P( p9 F4 y% i/ C5 @) O, R4 ]2 g& ]  g1 j
    3.根据model和hbm.xml 文件来动态拼sql
    ! [. a, U# E+ \% d- Z8 \1 m
    . [7 [/ \5 ?$ M+ m4.客户端提交或者刷新内存
    $ p# L0 G1 a8 C0 Z* |5 Z
    + l. H  _" T( l9 i8 a: P5.执行sql
    * c; ]& c3 W/ ?' z: [; T0 T$ \
    ) V2 E$ {/ R9 _7 a7 Q8 I( {7 T + k/ y$ o4 ^8 J* ^0 d: c1 Y: c

    $ ~4 M2 q  F# UQuery% L+ J# y" [6 Y
    load( \; R3 H1 I4 l. |
    ; X9 J+ R0 x8 h$ r4 F: E* W
    1.根据model的类型来找到hbm.xml文件
    9 }/ W4 Y* H4 b1 l- N' F: `/ C1 u- j4 k
    2.判断id对应的对象在缓存中是否存在,如果存在,就直接使用,如果不存在就进行下一步。1 |, a$ r+ h6 z/ n- `" \
    . H( M# I& K. E4 r" \4 O0 C) i
    3.用id做为查询条件来动态拼sql
    ) h" j+ H/ t( a/ J( I6 J7 G* M2 q1 {
    ( ~3 m+ F" ~/ J! Y0 b2 F4.执行sql 查询(先在内存中查找,如果没有找到(会抛出例外),就去数据库中查找)% Z# L, j4 @% i

    & s, g4 n  l3 g" E5.返回一个model类型的对象- B+ T* |8 }+ w8 E; o1 e. s
    ( z+ u2 z; U* j/ B$ l9 |) U
    get
    " M& G, }# Q4 H* v( y  n& B
    1 b) A3 s; u, c/ Q( T' w    1.根据model的类型来找到hbm.xml文件$ g$ @/ m0 c" A0 @) M: k
    & i% s# b7 M' Z0 v
    2.用id做为查询条件来动态拼sql) f$ C. Q  j1 n5 K

    $ ]0 \2 k5 T) u$ l% h4 G3.执行sql 直接在数据库中查找,如果没有查到就会返回null
    9 ?( Y' d" ^2 d" s6 [
    2 Q) @5 U9 d0 H- j* r& r( wquery
    * X8 b. C5 |& F* J6 q
    7 d. K, {3 R/ V: B$ N  Z' G+ l( `1.分析hql语句,得到model的类型5 I; n& c; P& d3 K) o9 m# p

    1 x. R* h( Z/ }2 ^2.根据moedel和cfg.xml文件中映射文件的注册找到hbm.xml文件
    % E$ f" i5 [+ ?/ e( e! b3 `* V! X4 o, {
    3.根据model和hbm.xml文件来动态拼sql
    : _0 B* L2 \, V( h% S# L& E$ s7 Y" A% j; ~5 B) c8 j! L! \
    4.执行sql查询数据库1 ?4 l" E+ _& Q# g

      M. R% {/ G0 Z" U- J! ?/ K. U5.返回一个resultset; g8 k" W2 \+ U  Y' p' l, l

    # i# s: z4 \$ L; X2 l, S6.循环resultset的值,放到model中在放到集合(List)中- v! H9 _0 }! L5 y4 z
      {4 f3 J' g4 @: g. ^  m

    % n& s8 D& |4 L& [3 ]! R" _/ _$ m$ d0 T3 m  ?" F% K
    谈谈hibernate缓存机制# h4 ?2 R6 t' i5 }) Q& J

    " ~; I/ L7 P8 g0 Y7 k缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了。打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去数据库中取,也省了很多事。) `1 ?1 T  K. D9 c6 Z) K* }* m: S
    6 u& e/ T) D9 |5 y8 R5 b2 s! L
    ; S$ w5 |: ?4 M
    " F; f9 A* ^# f5 q/ L, A9 Y
    hibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。/ E1 W& v% w( }5 v
    $ r: u$ o* Y6 C' Z8 q
      @. Q2 V) Z9 J: t. B3 f; C
    ! ?* s; |; Y& j& M* R1 c; `. D
    对一级缓存中的session事务进行数据的预存取,数据在各个session的上下文中存在(单例),当session关闭时,就是session.close( ),整个所有session范围内的数据全部清空;二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二级缓存只有一个区域 ,画个图比较容易理解。, `1 ^: E' {( F- k9 o. k7 N- w

    & ]5 T- B7 l, {9 u3 p* _1 { ! x2 g) }% a2 ], `9 [/ R
    ; k  X( U' W; O* N% i) M
    | 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|
    4 n& m0 r% |# ~+ b, r# v- d+ B! g6 Q, t8 G0 k6 W3 S: ]5 e* V
    | | | |: A9 U! J# ^; v8 Y  ?

    ) j/ `4 {, r7 p! N; w5 f0 A+ {* ]| | | |
    / }  Q6 I. o) o9 v5 M
      @  m8 M& [* l$ F1 e/ d—————————————————————————————————
    ' N# b4 H3 D2 S7 W& C: W1 V  V/ }- x5 K8 X* Z5 W
    sessionFactroy级别的二级缓存5 n: e7 `1 A- [8 P& E) m
    1 T, D2 Q: ~& I, o
    ——————————————————————————————————————-
    + d7 M6 S/ t; ?2 |0 n- T: \- w1 b% V
    |
    ) P& G  M. u( M( U) I, R, F6 G, p
    |
    5 L  [" M2 ^: P+ X: v
    9 }$ K! @# g" ]2 n|3 a$ [! R% A6 X! \5 k

    ' \8 v/ R  ]/ d% ~% L+ {——————————————————————————————————————' B0 F! `' Z/ |% k
    2 d' `. n, a% m7 n7 P
    DB
    , Z; J2 f$ ?9 w" ]. \4 |# n# z9 m) J0 F! p3 s
    —————————————————————————————————————–
    6 N/ z: O" S7 E% F; Z, j4 {  {+ @7 w* j* Y+ x% W3 U; W  H
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    16#
    发表于 2014-12-03 12:48:12 |只看该作者
    Spring  D, T  H. A; Z" Q5 O, X; X7 ^7 e
    • 是什么?0 h$ Y' r1 f4 U2 P5 ]! Z
      ( z; b7 {4 V4 P  d

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

    0 m. b5 ]+ O# e$ }8 N
    • 有什么?
      / l* _1 ^- U3 k8 H4 Q$ V* G
      6 h: ], V* v) L' [
      Q& V3 I) y& v. X

    每个包的功能:

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

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

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

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

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

    AOP :面向切面编成

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

    2 v; d" }4 p) E0 J" @# T9 K0 _
    • 能干什么?
      ! a2 D; F1 R6 f! {+ C1 d+ d

      3 g  k. @2 _9 F6 Q& P

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

    3 ?# `) P$ I: A+ F1 P6 w
    • 怎么用?/ ]2 r/ V4 J) Y# f5 r% ?
      6 t; n& W' q* V% o- ?* s4 T* Z
      • 搭建web工程,引入spring的jar包
        : S8 N1 S, [& h3 I2 h
      • 在web.xml中添加如下配置% L& _( \' N9 X2 W0 g
        3 |0 ^/ u: h8 }/ V+ `
      - m* k  A, ^. k/ z7 N0 t! H  S
      ' ^5 B  U9 |! T( [7 q" ?* s

                contextConfigLocation9 ~* ^4 P$ x" a5 I. J/ e; d$ G

                classpath*:applicationContext*.xml
    6 b" E5 ~: Q0 |; q$ l

       
    # C0 j! B9 ]$ j) H0 N0 }

            / b- p# W9 U# x6 ?3 ], C2 `

                struts2% U: ~$ d/ X8 i5 u: W

                
    ; V+ t, W2 d, ?; T) T9 e

                    org.apache.struts2.dispatcher.FilterDispatcher
    % q9 u0 r$ m3 r

                  l5 e- [1 M; _% a  L" I

            
    ! P4 Q$ R% d7 i# ?2 g: P. ]

            
    $ _' v. u5 c; B: O8 M- l! D

                struts25 D9 T9 [" T5 d- o" v

                /*
    # D' h/ [$ D3 Q) K7 l  g


    ) c+ b. B% r+ ^' D. \


    : X" @* @8 B9 I3 J; s/ H! J+ J

                
    ' V4 }4 c+ a0 i0 W( P% L9 R

                    org.springframework.web.context.ContextLoaderListener' w/ ^# R5 ?  X( y

                / x' e% U8 F/ A$ a1 e( P

            

    • 部署
        E% {. `/ \2 d& B* ?6 U

      ( {+ k! I8 R, `6 b3 E4 c0 f
    0 R; n# b+ [. m

    % K  ^. A& T) l* s
    ' f# x! C: q. S  O+ |
    • 容器和bean5 ~" s# G& |9 K4 S

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

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

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

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


    . v# r8 u* e! @
    • IOC控制反转
      , u$ r' c. O7 ], h3 a
      4 J8 `7 M  p& H$ f/ Q- u8 E
      " b" R7 O( b. K9 n8 t; D0 ^

      . H+ W4 s6 L7 z2 A3 d  X; @
      从前的应用程序想要得到A的实例他会直接主动的去拿,当用了sping后,应用程序由主动的去取变成被动的等待,由spring来控制应用程序所需要的对象

      % ~8 X' t" O9 T
      • IOC的优点8 m$ T$ C6 @( y& ]9 [
      1.可以通过IOC来获得实例
      2.可以通过DI来获取注入的资源
      • 配置IOC的原则9 J1 t: ^# b. O5 L( `. J' p
        • 一定是可变的资源才采用依赖注入
        • 一定是层间的接口或者是模块之间的相互调用才采用依赖注入' G  F/ Q" C# V

    ' D. I9 s7 |. v( f" b0 i# I  {8 X
    • DI依赖注入* S( V3 `* X& `5 Y# K7 F. t

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

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

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

    例如:

    在配置文件中

    . \1 P. k7 @" V9 Y
    ( R8 y; }0 V  C6 ]/ q. v
    + C! n, ?5 Z+ J* {; W' q6 t) ^+ T$ _

    在应用程序中

    Public DBDAO dao ;

    Public void setDao(DBDAO dao){

    This.dao = dao;

    }

    3.构造器注入


    . |2 d8 q- K& X+ i0 O# Z& i( H

    4.ref 表示参照其它的bean

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

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

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

    6.lookup注入

    7.singleton

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

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

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

    8.DI的优点:

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

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


    ) z  p: ~3 H3 {: ?& z( |9 s
    • Aop面向切面编程
      * g" R8 r3 c8 s$ A* ]

      . C  l. ]6 j! L+ z8 v! P; W5 o) _

    1.AOP面向切面编程 一些较好的模式或者是示例—-范式
    " a7 ~  k9 }! g& B7 W6 K1 x

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

    2.AOP的思想: 主动—->被动(追加功能)+ U- [8 s, @% [; b4 ?1 C

    3.AOP 的概念
    * y5 [+ o, f0 z) M, B& N

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

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

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

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

    5.引入 :扩展的功能

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

    7.aop代理 :实现机制

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

    4.AOP的事件机制
    " S! M$ r7 P& Q7 E

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

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

    3.找到切入点

    4.确定连接点

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

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


    7 h" E$ B+ s$ _- a+ c& q
    / P6 ?0 K4 y# A& `/ E5 I) l+ O, O9 \  s2 n  ~6 Y4 H0 R

    8 Z( W3 _3 N9 K7 [3 w: G; t( ]1 Q) o0 L3 t$ u  [0 H+ P
    4 k4 h; A8 C/ s+ Z3 u

    , ~) d: B* n4 d- U5 z0 ^3 w. o* }

    5. AspectJ& ~) d  |0 h+ l( e2 f

    5.1.在xml中配置比较烦琐
    4 Q& g7 G' Q  W/ X: n- _6 ^

    所有的入口必须从一个代理(ProxyFactoryBean)开始
    6 x' X/ R! _4 X' E2 g+ M: m

    5 {. q; l2 D3 l: |, r" {9 h1 }6 j
    1 D2 d1 Q; r' k+ A8 |5 `

             
    3 P- b. q4 s+ N" Q5 k6 P3 V+ U  K% G6 s

    " n9 H% c- b3 N/ N3 i2 k( A9 P         * c4 v0 A2 x4 Y$ n$ b0 l

            3 ~3 i" }( g( t" H/ P& W

            

    8 ^1 Z$ a7 W4 X/ S9 W" R1 I
    expression=“execution(* com.javakc.aop.MyTarget.t*())”/>9 a6 }- e3 L% S9 ]

            
    " |. ~; K3 P6 L1 ?  p; s

            
    ; U* [' B3 u4 T6 P1 ]2 p( }! L; k

       
    ; v! K) s: o4 m

    ! y+ R4 H  {( W2 O$ R: P( p

    - z! x3 s4 l1 l

    5.3.使用注解的方法相对简单
    ( S" v" t8 z! [) p0 O0 r% P

    @AspectJ的基本语法
    # i8 B- z! E0 V& X% l* p2 {. b/ U

    1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面
    9 {' K! ~% z3 j4 \" A+ _9 }

    直接在类上定义@Aspect8 E8 k5 E& @7 ]/ X* e

    2.@Pointcut声明切入点
    / K7 W+ _  s+ O8 t) |, O% U) W

    2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字
    . o% i' ?2 ]6 Y' D

    2.2、可以使用匿名的pointcut
    ' s6 x, C% I7 T: I% C" `! i

    2.3、执行切点的几种方法, I" n5 Z0 ?9 J! z

    2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法
    ; n: y' N4 E3 ]/ M8 N$ a( |

    2.3.2 within 指定到包,不能指定到类
      h# h$ Y/ b( p3 o$ r

    within(”com.javakc.spring..*”)
    2 C% S' T/ r2 P# w0 O0 y( W1 n

    2.3.3 this 指定到实现接口的所有的实现类) d5 y- z+ W+ d$ h+ _) z+ I

    2.3.4 target 指定具体的实现类* U& m/ `) p* Q  T* P* ?3 I

    5.4.advice的五种类型的示例
    ) W; Z5 M0 r6 M0 L( x3 E: X

        客户端必须从接口走才能得到监控,实现想要追加的功能2 ^7 R- u$ ?& _5 h5 b

    5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)' s0 s3 W0 G' K; i8 ~) d+ l

    追加的方法的参数名字一定要与retrning的名字相同# G0 J* B: j% X/ V

    在注解@AfterReturning中必须加上pointcut和returning两个参数
    ) M/ s9 ?) G/ h2 r  z! D# U

    pointcut指所要监控的目标对象的方法
    % r/ {% Q8 c* I

    得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配- D- |. Z1 m" o; L! g! X

    完成追加的功能
      \! E% x! T9 Y3 l" X

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用
    2 a; l5 A+ H, t  ?' }0 J  G( P  J

    (1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)
    ( y3 _# Y6 _  E; `: |" m2 c

    (2).8 g9 [1 q2 X! j+ j1 r$ t0 J

         2.直接引用匿名的pointcut9 D( D7 o; J0 T2 y& R2 o3 e

         (1).@AfterReturning(“execution(/ v2 l: h2 B9 v  j% Z

    * com.javakc.spring.schemaaop.Api.test4())”)& i7 t6 g! i' V6 d7 k5 O: W4 r

         (2).@AfterReturning(pointcut=
    ' ^) @3 D: r; \- B/ P

    “com.javakc.spring.schemaaop.TestPointcut.t4() &&
    0 i2 I( y' Y  H* z! J

    args(str)”, returning=”retVal”)- H& @" Y. Y; f' E

    @AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)6 y* F" G6 U  n

    public void testAfterReturning(String str,Object retVal){
    " N: r0 M& g4 T& P1 [& k+ A; y

        System.out.println(“afterReturning1=>”+retVal+”=>”+str);0 P& d* ?8 ], a0 r

        }! k0 C# A" t6 z! Q

    5.4.2.@Aronud: S+ ?" {- N( |# w& ?

         注解@Around环绕追加功能;2 B# R* T# \! T# \3 U+ b% M( \

         在执行目标对象的方法的前、后追加功能;
    8 f( }2 {. U# D

         必须有参数;第一个参数的类型必须为ProceedingJoinPoint;& I3 _# }+ Y. {; A

         通过ProceedingJoinPoint的实例的proceed来调用所监控的
    ) z$ H& J) c, w1 \% @0 W2 d* m5 w

    目标对象的方法5 B5 O, L9 O# U0 q! h  B' O

         1 定义一个pointcut,通过方法名来作为pointcut的名称来引用% W- e6 Y7 P0 A7 L0 F

         (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    4 n0 n: C3 E. ]

         (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()4 ]  G# f+ y7 C2 g. ~

    && args(str)”)8 D! e, U6 T$ Y/ m1 V7 g

    2.直接引用匿名的pointcut2 ?  V/ x* w! ?

         (1).@Around(“execution(; O& i1 Q! q; ^/ W  M" k

    * com.javakc.spring.schemaaop.Api.test1())”)$ o% o, c2 m8 B" W4 B

         (2).@Around(“execution(
    ! I5 C. R+ J2 U9 {  R) G

    * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)6 W2 ~7 o, n/ U6 \/ g/ c0 |0 [! X

    // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    , t$ b1 `, ~% [+ g

         @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)4 n7 Z% F1 K# W* P8 ^! B

    public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{, h' V) F; g+ C' e4 p  g

        System.out.println(“around1==========before1pointcut==>”+str)
      p& A! r! N6 K5 V7 U

            Object obj = prj.proceed();* ]6 N; L/ u6 P4 t6 K3 h

            System.out.println(“around1==========after1pointcut==>”+str);
    5 i6 B( y3 E- Q' f. J- E

        }
    # V: }8 Z8 [/ E

    5.4.3.@Before
    6 V! x& C3 I7 V  m5 w# z* K

    注解@Before在执行目标对象的方法前追加相应的功能
    0 z7 d& q) u8 J9 g

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用6 c% h' Y5 \% \0 @; l4 C1 F* p

    (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    6 i: t# D) U, S5 v  D+ ~

    (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”): G$ W; ?) a% Z: P6 ^# d4 n

    注意args后的名称与参数名相同
    0 s; f9 |5 c7 g3 S+ f% k

    2.直接引用匿名的pointcut
    ) i3 z. U. J! ?8 r4 V3 h

    (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)6 f. L4 m  A( B0 q7 I

    (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)' o' d/ `& Y4 ~, q- h& Z

    注意args后的名称与参数名相同9 Q' m7 x/ T  s% f

    // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    - B9 ?! ~3 f9 t& ?

    @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    1 U+ {: x4 W4 J9 N; P( M

    public void testBeforeParam(String str){! w- R9 ]& r, S$ c5 o

        System.out.println(“before1=param=>”+str);
    % Z$ A' ^  c+ l- y. G6 \6 r

    }
    ; O4 G0 t0 g3 Z3 V. \5 b

    ! \- o9 j1 A0 M! l' j

    5.4.4.@After
    ' n( @" G" N+ a" B2 E

    注解@After在执行目标对象的方法后追加相应的功能
    , b4 V8 t$ \6 u7 c, A

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用$ X) U$ O( T7 z0 m

         (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    , N; \6 t8 x7 ]$ V0 w9 q4 @

         2.直接引用匿名的pointcut
    # |4 f6 s' k1 A, r9 J

         (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)# N4 R6 m( G! O7 p2 k

    @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    7 C. @/ h% ^+ q" Q0 d

        public void testAfter(){
      r) h& _) ^$ K: @2 @

        System.out.println(“after1== >pointcut”);2 z6 s& B& c- @; q3 D; T! H

        }
    , y- V# G" ^+ _2 `4 S% F, a

    5.4.5.@AfterThorwing6 o3 q4 s2 P3 U  u4 V3 I* I

    - x5 d& |+ ^$ }4 i4 @- L/ u
      C# c" j1 y# S8 `: L3 Z
    • 描述一下spring中BeanFactory和ApplicationContext的差别: g+ `4 |0 f! V* y) Y# r% q# \9 ?
      - k4 x' S/ x( ~; u

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

    - v; a1 W' j; U/ I3 _* V$ r! D
    • 谈谈spring对DAO的支持$ V! E6 M: B6 _3 q9 j9 w  c, O
      8 l4 B% A1 s* _5 P

    Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。9 p! b& b0 v8 o$ R# A5 Q- e' I7 D, j

    简化 DAO 组件的开发。) v# ^; b1 u9 J3 Q( }4 p6 r& h0 Z
    Spring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。8 @  E4 R& p  t* Y4 J/ M

    IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。
    + Z. `0 z6 b" m2 ?' `

    面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。" o, q  g. P! q7 K

    方便的事务管理: Spring的声明式事务管理力度是方法级。* j/ n' ~/ {7 Q* z

    异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。9 k  ^6 a5 A  d' ?8 \& g4 f5 |

    - x! Q/ K5 `  @* n! M8 v$ x, b

    ; H3 b% b2 J% b2 {+ C. @
    • 谈谈spring对hibernate的支持
      . I  [/ A  L' c- B& V
      3 H, V  A. J, s8 x5 y' y+ U

    在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。5 }  x0 u: Q# D/ ?3 E6 p

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

    1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:
    0 L8 K+ v' n- v7 R


    * W7 e8 Y" e! s7 F( r6 D

            class=“org.apache.commons.dbcp.BasicDataSource”>
    # r" i* Z1 N! R- e& k

            4 ~# _  X/ F: ~& h, x

                oracle.jdbc.driver.OracleDriver# T. k: u2 |- v; O$ r! r

            ! h3 D4 E- W# l

            
    5 p. t" E# {3 O  d- g

                jdbcracle:thinlocalhost:1521rcl" X; X3 K4 [- J3 I( K. ^3 F! Y

            
    9 L* D' ^9 Y) e! e9 F

            
    ! K2 Q% }7 W9 |% y$ n! }' w

                javakc2  J5 Q& z2 {1 L( a3 g

            
    ' ^) i6 b' y- I6 T4 G5 F* S$ S

            
    $ ]) f3 l' _+ t$ ]5 y4 W' v

                javakc2
    5 [; i  o1 V6 }; v2 E2 i

            
      h8 E' w4 Z9 T6 g

       
    7 o, u0 E. g. c


    9 Q6 Q3 P; J3 g- `) F  V; d- ^

       

            class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>& D$ Q* r8 H0 h: S- \0 J  ?# h

            
    3 a4 |% b7 `& U* Q, b4 D

            # [6 y4 K4 T2 k% e3 d

                - x* E  s% _. q; `! U

                    com/javakc/spring/h3/UserModel.hbm.xml
    5 n* Z# s* P' E

                
    9 D& O" R: D! z2 f; |! T* Z  y+ }9 b2 J

              T7 m% |% G5 ?8 M" A

            
    : O2 S' }8 b5 v% v

                0 E. L/ E- v3 S; b. ^& L( ]$ _

                    hibernate.dialect=org.hibernate.dialect.OracleDialect' f& U) o/ n; J$ W; D2 A/ i

                
    1 I9 ]) V/ h  n/ y1 u/ l* W

            5 J* y* m2 O# ]6 z. ~

          @5 q. f! y' U5 e- {" l

       
    % Y' B5 h) t% D- b$ V

            
    ; w- ~- [- A' r) n3 J2 N

        ) m1 H' n" a+ S3 F. r% }' }7 m" g6 ?

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

       

            class=“org.springframework.jndi.JndiObjectFactoryBean”>! Y; O! \, H$ W% Z5 m4 P; B4 h/ s

            7 L4 @+ h/ q$ _# O' x9 L

                java:comp/env/jdbc/myds
    $ X: C$ @3 V) X8 V2 ?

            
    3 {- W, G2 s; X6 P. Q: m/ i

       

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

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

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

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

       
    * G6 u; U+ j6 i9 z4 s

            % v: }# I8 I& ]5 [3 z

        ) C4 Y& I( M) l2 n6 D, b1 W

    9 H0 `& s# Y* g- ]+ [/ q$ D

        " R: @+ B* D1 t% m3 g4 m2 D* f

            
    9 _4 U& ]. X/ Y! M' L- D7 P

                * E+ i; A6 u5 K( S5 q' B- _3 A

            
    % ?" [$ g# v" _. T4 V

       
    ) \# z& V+ W0 P: j  |& x5 t


    $ }- o* ?9 U+ B/ R7 t- [

        2 G( ?% `/ F* y' z' i2 ?

            + l/ p, a" g* f' y+ r3 ]

            $ E' b  b/ F' A& W- f, @

       
    7 Y) Z$ `& ^# k7 s5 A

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

    " m# s7 U" [! P. z
    Spring2.0之前事务的写法
    5 `' c  i' U5 [2 n- D; y

    4 m3 G# F+ x( |% |6 f% c( l- d7 ]- R& B( ?# R% o* T7 r
            class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”4 p# b& [' u6 `5 t! W' @& }( E

    6 {' {7 R5 @7 r7 @' P% X& Z        abstract=”true”>
    6 Z; |% [/ L0 C

    3 Q. T7 b. ~, N$ Y9 g3 F
    ! W* K/ V3 x7 ?* G, X; ]* O- D& z& F; r4 ?5 |+ x& c
    7 e$ `% H2 v- W- [) k- h
                    PROPAGATION_REQUIRED,readOnly" E) R0 h! D% F( J$ l1 t

    8 I; [4 d" o  j  W  d                PROPAGATION_REQUIRED
    : H. W+ D8 n" [) s# O0 e2 L
    ' ?  S. O2 [* n( v+ p7 x

    $ X( E" E8 M" Y$ K2 N% }7 r& V7 W
    0 F1 p6 s2 F+ j2 H5 \! F; n& R0 [/ z. c  z

    2 _4 `/ s/ |5 h1 E
    ' t1 t- v3 `- P6 i2 Z- L# a2 q
    • 谈谈Spring对事务的支持1 m* I5 ~6 z2 k2 l* _8 C

      7 c4 k  v/ R* J. ^; {$ w8 M


    , R; ?4 p, |  m7 l/ A1、声明式事务管理:

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

    2.做法:

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

    2.2

    2.3 注入数据源


    ) l2 M3 Z" S! [1 F: G( a
    0 i* u: Z4 w2 p2 I+ m  J
    % C3 X5 ]6 c+ w( g) K2 @7 H# g% O' E# {9 r. |/ ?' g8 e: J
    ' w+ z7 m+ f. _; A+ f
    2 |# D5 C. z0 q3 C" r  y# v

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


    $ t, M+ d7 Z$ ?) B1 y
    - F) B8 X( [8 v& P( ?2 h% X/ U) f  b! H! O

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


    7 _5 U6 N( [- i) S  G% V7 N
    / {# N! q7 y( x+ z
    % R7 \, O: [6 p! J7 K- {* P! x) ^* N- @- [! X; ?

    " W7 _4 z- {2 c" B

    2.6 定义切入点

    ) M0 l4 ^1 n2 C+ p: P
    ( Z( P# r' ]  O) m& z1 F! s0 j
    4 u+ h; J9 i& ]
    % n) Q' E3 X7 c* D6 M

    $ Z7 A$ P# D7 e' g" T

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

    1.注解@Transcational

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

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

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


    1 N, p% ?* n- @# G7 |$ |% [. n. F* A6 [3 A6 x) u8 E

    如何在Spring中使用Hibernate的事务:- r, }/ W; A, J; y4 h

    4 [; y- d) K2 J; [# ^* y

    1 W+ W% l/ @  I

    & w- d5 q- ?# |) R0 Q0 v  d

    如何在Spring中使用JTA的事务:& g; ?; N. o% x8 j6 ~

    / w. R2 z( H6 B6 X; ?6 c5 d7 h+ {% `
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    17#
    发表于 2014-12-03 12:48:32 |只看该作者
    事务
    6 p- T' {* ^  E- d5 dACID
    ' w# S" m0 e3 \0 I" p(1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失败
    5 @9 ]6 \4 s. B" @! ?$ a
    + u1 J# q# I! B(2)一致性 :操作的前后满足同样的规则,保持平衡。4 e7 w, U; k) T3 g7 {

    % j, A8 F- A8 B" N(3)隔离性 :在事务运行的过程中。事务内的数据对外的可见性和可操作性(必需由数据库的支持)& t- e3 n" T5 c% p
    ; J% ]8 v& ]+ a
    (4)稳定性 :保证数据在事务的操作的过程中不会遭到破坏,而且是永久性存储的
    " E7 A) {! e1 V7 X* g; P% f" A. E
    : n2 O6 U+ P1 ]# }! P* @2 E " o: J2 v6 c7 ~+ v2 n
    ' J: J& n# i% Z
    事务模型
    ; B' T; }' w7 C% t(1)经典事务模型又叫平面事务模型(JDBC) 事务不允许嵌套+ ^0 V9 t0 d0 B, W6 x4 n, x# w
    - K3 k5 l. |9 A4 K
    (2)嵌套事务模型( D2 O. |1 I: `9 m- V7 e

    7 Z$ e4 q4 O3 r  f! P! @0 W" H+ A8 q$ D 5 X% k$ `' B- G0 I2 ~

    9 K+ L8 m  d6 H1 J事务的两种方式5 f+ u; i& \2 J; Q0 r% b  ^2 D
    (1)声明式! Y/ C: A$ f3 ?7 M$ I
    - G! C% N& u$ |2 |$ g8 H6 B
    在配置文件中设置以下6项
    : W$ ~0 T0 ]0 T2 y* \& a6 Q' D3 p
    , ^2 z! u% z! Y# _# w(1).required' @- y* C6 |+ t# |6 |6 Z
    # T0 L' x7 f8 R/ j9 {4 N
    如果客户端没有事务 在bean中新起一个事务
    1 c) m7 f% ^% f5 w
    9 J0 w8 h$ z  {如果客户端有事务bean 中就加进去$ I7 ^4 W, _' Y" {9 t
    ) P5 Z. k, Q0 c8 v% d$ M5 k0 p
    (2)、 requiresNew
    4 f4 ^6 j( R' N9 ]6 l4 H- b: i# P4 H  Z; A7 i' s
    不管客户端有没有事务服务器段都新起一个事务" }5 g0 [5 V  V2 z) b# l' r

    ( C1 {2 j: b5 C$ _9 ~2 N+ ?如果客户端有事务就将事务挂起' ]8 u3 W& T4 _: b; S: g) t

    5 W, F# \+ J/ y- |  B9 y5 V. |! l(3)、supports2 r; p. G0 ?, ^  D5 `* p( ~

    ' M! D2 r3 W6 j# L8 Q; W6 ?5 q- N1 c4 A如果客户端没有事务服务端也没有事务5 e+ [+ |4 C& f

    : |; D' N4 i* ?9 |* i$ T. ~如果客户端有事务服务端就加一个事务" c9 p7 O% `: z& f% K

    , x: j$ ~' g- j' i: x- X/ c2 D(4)、mandatcry# p: J# e% T9 p2 \6 ~) w- _6 W* i
    % d% e; e) K9 o5 n; \7 B( d5 \
    如果客户端没有事务服务端就会报错
    ' z8 t# T' M9 b" [! P
    5 d- f$ ]1 m6 {/ s% P& R# b0 X如果客户端有事务服务端就加事务! l( g0 B; F2 t
    . Q% B9 ^8 ~+ H' B
    (5)、notSupported
    3 i, d& ?# v; A8 G+ d9 F- o7 `/ v" N- |4 p3 D* m
    不管客户端有没有事务服务端都没有事务3 l! g: D' @6 `+ s" \/ f
    ' z/ V, E( q7 q
    如果客户端有事务服务端就挂起9 s0 n" e' C5 r0 H. V+ [' W
    : O. Y3 T) m7 q2 X( q" V4 _7 ?& k2 D
    (6)、never
    $ R( Y' ]4 r1 g2 n+ R1 _% F' ^
    % B0 H8 f( T; ]7 ~. b3 G7 S不管客户端有没有事务服务端都没有事务
    ( [6 `' {; h6 R
    ' l) j* Z6 u, M8 U1 S如果客户端有事务就报错
    9 x& N' K% h0 \% f* _. t
    ' L( k; e9 n& Y% Z1 [(2)编程式事务& ^  F, ^: I( l7 W9 z  H7 ~
    ; D7 ^, q  X+ J7 c: ?2 n
    Javax.transaction.UserTranscation% @8 L  K/ K: P* z- j2 F) K# N

    ' H( K. O8 s5 ^( HJTA 事务可以精确到事务的开始和结束
    3 e1 b+ M2 `" i5 P1 U$ f/ C" e! D% h7 B5 u. T' H7 x

    4 [  G2 F- v' ]) I: R
    , L6 i/ h" E' ]- p事务的隔离性. }2 s: G' Q# U# ~6 p  Y
    Read-uncommited
    6 k" `) {% v# r# H: W- g7 |* S3 w* }5 y
    读取未提交的数据(基本上没有锁)脏读,存在不当读取的问题。- p- d  N" X' w% n5 z! r
    * V* d2 D1 b9 u* ~8 S3 f9 g4 B
    Read-commited
    6 x+ {6 T5 z! M. E2 [1 }' m2 f+ d  l
    读取已提交的数据(行级锁)- d4 h5 ?7 ]* k$ w2 B' G/ p
    : ~2 v7 l- z1 B* d" k
    无法读取已经写入,但没有被提交的数据。
    $ }1 a0 v1 L7 N: N# K3 G
    : N4 w0 Q$ j. N6 M5 M+ CRepeatable_read" y5 A7 `& o4 H4 U1 M
      ~6 B  E% g; m, k* M+ n
    读取的数据不允许修改或删除
    $ n+ ~7 N* r6 G, N5 d( @9 g0 C/ M. G
    不可重复读(行级锁+不允许修改/删除)
    , N. L0 N5 i" [3 F1 r$ E, o: w9 O7 [( f7 \
    Serializable/ Y) |: D1 W' W

    2 i1 x7 v/ D8 Y- ~幻影读(表级锁)
    & x. s$ t8 u1 a, F' k1 R2 y1 ~2 k1 U: I& D0 `

    3 x  s  W2 U9 w8 v( e5 A
    & H( t6 I' O# L0 b" [: kstruts
      G$ w# W$ o9 o. j1 H2 `% j  W开发流程% v) Y+ }% C1 H4 b3 d+ j+ Z* x0 f

    : W4 ^3 `4 X! h* }/ K) I* U$ |: \( E1、创建表单
    5 e7 u/ C& B" p8 C6 A$ @6 ~1 L
    2、从表单中获得输入
      c% ^) z; S3 S5 S# x+ D# ~/ [1 ^8 r# ?& g2 |
    3、处理输入(业务逻辑), M) Z  m3 Z1 J1 e* P
    : B! O! S3 G( u( B& E# P
    4、根据动态输入改变输入流
    ) c. \9 r; k# W( M3 T
    8 X/ r+ g( f% C0 H% A要完成上述四步,我们需要创建
    4 n4 h4 F; e% V* ]% D! L1 {& N" @" F
    1、一个ActionForm. H+ \. h, V! P$ x/ Y8 P: ^2 w

    9 ~1 e- x( o  T* O  W2 p) k% C2、一个action" ]2 p# x, j1 s7 ~
    5 f7 Z5 f  Y/ p3 a( A" e
    3、一个配置文件struts-config.xml$ s- T; M9 c! y/ D# R1 ]
    / _% Y3 |, [# T8 _: `
    4、创建页面
    . S( S  }8 S2 l7 u7 N4 k* h' t3 J: t6 C  ]/ @% K
    创建ActionForm
    + |3 l! N2 }& J! @  d9 Y1 N1 Z5 {
    / I+ m  N, i) t5 T6 G% m1、写一个类继承ActionForm
    4 e' T# y( e% K6 ^2 s) k: h3 Q0 L
    2、私有的属性
    & S1 g; g2 G2 c, C8 \/ n
    - F$ x2 s  u  m& |8 D3、相应的get、set方法4 `# a! j+ \0 D/ c. C
    7 ?0 \( S# c- g; ^9 _2 m
    4、重写tostring、equals、hashcode三个方法
    . g* g- M" w5 s% a6 _  _2 F% B7 A, q2 W
    创建action
    7 Q6 ?6 H. `% {
    " V1 O- |& X8 L! B. J: K- n1、写一个类继承Action  Q0 Z: X4 ~) N- i  Q

    9 U( W2 h1 s: S0 G: y2、实现一个公有的方法(回调方法)+ V# H3 k/ i/ [! ?- ^" ^- X

    4 [( Q; R2 L$ u) V1 e+ f( Jpublic ActionForward execute(ActionMapping mapping,$ u( a+ `# [" [: }
    0 B7 x: `& a6 s6 W' z# }% E+ K
    ActionForm form,
    " G! C# a% R0 T+ r
    3 A& y: S! n# R( c% R" kHttpServletRequest request,
    ; n4 S1 J! U  k) V
    . Y2 @6 p- O  b8 P8 R* uHttpServletResponse response)
    + N8 a) D* X0 o, N( ^( j) e4 ^/ f; l
    {' ~0 g' C$ \6 l- ]
    . [' v4 n2 `& B& y* Z
    //1.收集参数
    3 N# Z; x8 w6 E! T7 Y! ]* P; n2 w2 @; Q& x, f; o/ G: i' j" H$ {6 o
    MyActionForm myForm = (MyActionForm)form;0 t, @6 R) k; z) K

    2 ]; L% }! ~5 B+ M7 s& L//2.组织参数$ D7 d8 F! s9 Z% B# _
    $ Y. U0 i4 p8 ~5 I2 p; P
    . c, I" W, a* j% y3 [  e% ~  G7 e0 z
    / r* S& b- j1 T9 M; [5 s5 B! J  b
    //3.调用逻辑层
    4 ]. n/ |/ s: F
    : }6 W4 z+ H% `* |2 Iboolean flag = true;
    6 x+ }8 P, t* e' r$ V0 |+ G5 W* i, [0 \( @! ]+ ]$ v
    //4.根据返回值来跳转到相应的页面
    ' J1 {* ]; J7 \2 b3 k8 b1 y" Y1 G
    + M) y. j2 f9 u4 l0 E$ WActionForward af = new ActionForward();  o4 ^' f9 B% C

    % s% a2 s" |/ \( t0 u  t  b) ?if(flag){9 d4 L* K9 y% ?) ~& D

    5 ^+ [. P2 F! M% L) F+ {af = mapping.findForward(“1″);' M3 o) S% Q5 d$ p0 K
    # A) X* B: c) B1 X( P: O
    }else{
    7 z, ?! D! X$ [% \; v
    7 V0 k) z5 x1 K1 ]af = mapping.findForward(“2″);( ^* C6 x7 L9 b! n& t% }

    2 p  E# B% r" c+ L* R. O- e}# O6 ?- F- j; O" ?

    9 V8 a, \4 k" S# N' C- g- b+ _% Lreturn af;
    - O# A- o1 l0 ^+ }  o  {" m. t; b: b% P6 j
    }
    & v0 t) }- G3 F$ |' f+ u7 Q& l5 e6 R4 S+ C/ t: Q2 S: y
    配置struts-config.xml文件! P+ D/ ^8 d* E  ]5 ?
    ) I/ P# C* m' S% m* z* R0 |( F
    1.<form-beans>1 q6 v. `4 Y+ B5 X" U- P* C: C

    # [! n- T) v0 e+ o3 H) D( ]<form-bean name=”myActionForm” type=”全路径.MyActionForm”/>; U8 m# f5 B3 Y0 g9 {3 }3 ]0 q8 W
    0 i7 h) x8 K3 h* B7 k" ^" W
    <form-bean />2 i( r. g7 r! z; k

    5 u  z( r/ o2 P" x2 N! H; U( g</form-beans># `5 y2 Q$ ~# G0 I) l* f

    3 p  Q5 g( U- \* B( J$ {7 ~2.<action-mappings>
    2 Z0 i/ p2 N+ c5 ^# C" Z* ?& q9 U$ ?8 s; L3 y, F. G! i: ~7 V
    <action path=”/sll”; t) o$ {- [- x. w

    2 t4 K9 h' o+ u5 d. E0 g# O" Jname=”myActionForm”3 y: F- X& Z8 g* a' Q) r/ A% @
    ! X3 {1 y4 p. _/ [
    type=”全路径.MyAction”) V! N6 m- d  R4 Z, V8 \. x

    # X4 T  M7 {+ P3 G5 ^. m( Vscope=”session”" e' P6 ?& C& z( ?/ K
    4 I4 M4 N: V7 S
    input=”错误返回的页面”>
    * W9 x7 C, a8 [: T6 N, o( d! Y' C. P& \6 E# E8 L) M  d
    <forward name=”1″ path=”/1.jsp”>
    # O" ?' ^" r. K1 g$ T+ F/ Q
    + b: U9 {" D8 g( W- b" M: T$ b  t; U5 L<forward name=”2″ path=”/2.jsp”>
    ! Y9 u% h( M# _6 j- j: H8 G$ Y- d4 ~4 L( c4 O8 A
    </action>
    7 k; A$ S+ J8 c0 [  A
    . }  G2 ]8 D) G/ O% I+ F" L</action-mappings>7 S! b6 B# i& E% m7 Y

      ]& U4 j3 p# R" L1 F. O( i. j步骤:" t5 [* t6 P' K+ ]$ `
    8 X# _& `- Y, u  c: N
    1.创建一个空的web应用. Z  D+ C& J3 J" N/ F  u
    , r0 w9 D1 ]& G* h0 b; U
    2.将struts的包放到lib文件夹下
    & z+ w9 ]6 a' z3 S) k6 X
      e! E# Z# B; f$ t  T2 y3.将.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目录下
    7 S3 |" ?+ i( M" \# g) D- \% p& {) C# f$ `) p  q( K0 U
    4.配置struts-config.xml文件和web.xml文件
    : G5 u2 J8 B) ]  n! Q* F9 d4 e  L3 e6 S& r' X0 @
    5.在页面引入tag文件uri
    $ j" u/ l3 m: I( L* T: s! B  g7 t6 i3 t1 Q/ U& d  a3 v
    STRUTS运行机制
    8 w8 k+ a0 o* U) |5 p# I
    - A+ ~& L- v# f- H9 A6 r; K1、界面点击产生请求
    7 H2 ?- s) |' [4 H" b: T+ C" ~$ E  }# Z6 \" A! Z" J
    2、容器接到请求/ @3 @/ ^$ B$ z! Q; p7 w

    ' W# n7 k: K) C% e* v) ]* p4 L3、匹配web.xml文件中的*.do来调用ActionServlet' i4 k- d# W% ]8 v" l! M% {/ |/ D( O

    * i+ v2 y$ B( v9 m( t4、ActionServlet的处理
    & |. ^- A* m0 {8 |, z, ]1 z- E( w7 f' l, W& w
    4.1 读struts-congfig.xml文件形成ActionMapping- [" W! S& B4 z  ?
    ) ^- U8 L  A$ k  P( X; d- w' I! Q
    4.2 通过path 来匹配Action类,通过Action的name属性来匹配ActionForm类
    1 e( d# c# c* W# W2 R- k0 z  T* {9 m1 s
    4.3 通过反射机制来给Form添数据
    0 o4 O5 r: c) e% r/ ~
    : R5 s, R) P6 D+ n7 k& o5 c4 u4.4 由ActionServlet转调Action的execute方法
    . {; P8 R3 r' c+ T, R; B) a3 p( G) Z  ^3 w4 N+ \* f- S/ O) r: `) }; D: z
    4.5 得到execute方法的返回值,跳转页面
    ( ~7 }" z. m* d( W* J) y7 {# b  U1 P8 G* R
    4.5.1 RequestDispatcher( [2 {6 L" j8 e. S
    4 F2 e! A! Y. x9 ?# ]/ V
    4.5.2 response.sendRedirect(“list.jsp”);
    . y9 T+ i4 G4 m  y7 @' q8 h, o% W  L
    ' _6 E4 x1 n7 ^" Z" A, C
    ' h( @' K, V3 }  F. L+ |" j
    进入execute方法' N9 q- G* R1 V; f

    . Y/ G; c$ r+ P( Y) B- p) d1 收集参数
    " G: T0 n/ Q# b# Q: @
    7 t" k: F% ^5 V4 A7 k! L$ M2 组织参数4 P2 J: B# s- @# G$ i& z8 z+ H
    * G6 z+ z  o( d  p
    3 调用,逻辑层
    ' O  `5 o* p. V) Z! \
    " R! t1 a! t' _* j# j: m- c$ M0 V* @4 返回值
    6 t# j) F% q  u$ S  B  J) N1 s" D
    4.1 选择下一个页面 (ActionForward)& }) H" `) _, _* w3 i' H
    . p8 U' c; e' z* i$ D2 j& p
    4.2 把值传给下一个页面1 `0 b7 ?4 P+ e  l0 Z5 h( }, t; H, \  J
    ) I5 B( q( ~7 _$ C! y

    ) m' F3 _  h; S- N( Z
    . K. T  Q2 n4 ?, `7 t/ k# {比较struts和struts2的不同
    & B! @( l4 a% |8 e1 E; v7 J
    . h( `! g2 Y4 e0 @  CStruts; n5 R3 S7 b7 R1 U; R
    * ^( O4 K& @5 U2 o9 g" W$ J
    Struts28 C7 Z, V% V6 d
    ! f5 Z# n, s- g* t0 z
    组成        五个部分:ActionServlet,ActionMapping,AtcionForward,ActionForm,Action        十个部分:AcionContext,FilterDispatcher,ActionMapper,ActionProxy,Configuration Manager,Action Invocation,Interceptot,Action,Result,Taglib
    , C% ?- j+ p/ }! \/ burl        .do        .action
    * h# a- C$ b# y9 @+ c分发控制        AtcionServlet        FilterDispatcher  ^* q& D# o9 Z3 n) r3 G. P4 W: ?  E
    收集参数        利用JavaBean技术,将数据封装到ActionForm的子类中;5 {7 X" t, [( a. e
    一个Action对应一个ActionForm的子类" t9 _7 J& {  `6 H4 H0 I% D1 T
    % v5 n0 `( M/ o1 _( v
    使用拦截器将数据封装到值栈中。' K6 Y* Z! ?3 M: ]7 t3 l0 L" c: C7 I- G
    使用域模型,一个Action对应多个值栈中的Model
    5 A$ {& m: ~: \2 R0 o; g! D" k: @0 j7 T- A+ ~+ x& ^# l
    读取配置文件        ActionMapping        Configuration Manager
    9 D1 |/ Q" x1 R拦截器        无拦截器        执行Action前后有拦截器$ O7 r8 \% ]4 W1 C8 [/ `9 W" G
    返回页面        将字符串封装到AtcionForward,进行跳转页面        Action中直接返回字符串,通过Result跳转页面$ ]  q" ~3 p# [* \  x* i9 t
    页面跳转方式        两种:dispatch,redirect        三种:dispatch,redirect,chain
    + K0 w% [' \  K& z; n" Z7 E, Q7 E值栈        无值栈,Action通过在request范围内设置属性,向jsp页面传递数据        有值栈,Action和jsp页面通过值栈传递数据,jsp页面通过OGNL取得值栈中的数据3 t: l7 _/ f) |; U6 J
    配置文件        struts-config.xml        struts.xml$ E0 \8 O2 i' U3 `9 p( e
    中文问题        不能解决(需要使用filter)        可以解决中文问题:, M! k! S# y" g. L, c; j
    1、在jsp页面添加Meta;
    # A+ k$ D2 s: `0 {3 }/ i& A
    5 ]+ H( K2 V5 S" `& p2 z7 s$ {2、修改struts.properties中的设置。
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    18#
    发表于 2014-12-03 12:49:03 |只看该作者
    其他开发工具和技术
    . s3 @0 i3 a: V9 |' g+ aAnt
    * F2 I! O+ Q- \, Y8 QAnt是基于java的批处理工具
    3 p, z+ e, z7 C3 J+ K8 q
    . D9 j' C4 e2 c一、配置ant的运行环境
    " |6 c2 T3 I" X# r3 N0 n  m7 b( c) t- t# ^1 X4 X
    1.将ant的bin目录添加到path中7 Z- z5 ~% C/ c8 T
    ( i1 k0 A% W: m3 ?# Q8 }
    2.配置JAVA_HOME
    8 h# Z7 `0 S! B) I0 S
    ; V, N  O7 p3 f5 y) k% @8 J3 W3.配置ANT_HOME
    ! [- l2 v9 h# \/ ~& |9 D4 d+ T1 g$ x$ c) E3 l
    二、配制build.xml文件,该文件放在应用程序的根目录下
    ' o' J" @6 a* c, m0 _- _
    " Q# E) K1 z" m( C+ N5 t/ o+ I编译java文件
    ) G5 t+ X1 ]- a3 _' A' s2 |1 `0 w! E- t$ F# @
    执行java文件4 X7 x4 d6 K! W8 c9 T. G- H! Q
    / _  U+ b  B% T  \
    copy( ?# |8 P# d- }7 P- p- |7 y% s( `2 _1 c
    7 \* A' U+ ?  d$ @2 A$ N9 s
    删除
    . i0 I+ y- d. X* O0 c" q" {9 |
    ) D" ~: L- s' A" [9 O3 F- _3 w打jar包  t! ?& z6 M0 j. V- G) r. ~; ?3 i& K

    ; {$ _  [! h& P4 f根据注解生成配置文件: Z! o2 \7 f& W4 U+ `7 {- e& B; v
    ; H4 l( @9 b0 R7 ^2 n
    Xdoclet" X5 o) x! X2 R/ ]8 r
    通过注释生成一系列文件的工具(txt、xml、java、html等)* s  S; r  f8 t
    & @4 l- }% w6 s& ^6 J( y+ _
    xdoclet本质是摸板技术+字符串的替换
    $ u, Q* i; R) ?8 ~/ D. g* E" c5 P4 a& k
    1.在java文件中写符合要求的注释(将hbm.xml文件的内容搬到java文件中去写)# l; ^) b- H9 N

    9 g5 M8 U6 i: B( Z1 v- a1.1 在类的上面 写与表的对应
    : X" k* F9 k4 _# A$ |) @
    : @! T6 l1 b; \$ a6 g8 T& p; C1.2 将每一个属性的注释都写到get方法的上面4 X" R* p7 M2 P- o& W  @! W& |

    ) X6 m7 a( [) R4 f2.在ant中引入相应的task来驱动xdoclet
    6 ?, _% D% Y2 d7 \2 U7 b6 i, p  E0 g( T7 ^8 N
    8 a2 [5 L9 @$ D" A& D  {# j

    . j2 g/ A! r9 m$ E4 e. }log4j日志管理
    . R  k  A( z6 W1、是什么?; X) v# q" Y0 e/ o
    ) ~7 r! P6 Q) L& J: M
    在开发期间用来测试、对整个日志信息进行管理的工具
    ( l* s& R( n; Q  s& B" |
    8 h) v! B  V! `2、功能+ t6 ]8 x( w0 M+ q
    * I8 e. F% v4 O* }* v/ Z
    1.控制输出的目的地
    # [7 \2 O1 Q6 b7 K7 N3 _
    0 L$ E; @& z& v6 ~2. 控制输出的格式+ X( \! a+ k; X! j' M6 V+ F  Q
    1 D; `. b8 S6 q+ v; [. G1 _7 Z
    3. 控制输出的级别
    0 {+ [) i8 x- M% J; D7 F5 L2 n- c  G- v9 O' P! U& I$ X
    3、日志的级别9 v( T/ q* ?  `# k
    . m+ ?2 b4 r+ }( j
    1. debug 调试
    / Q! b/ y1 X2 p8 c/ T9 e& u
    - b0 _) \' |& h2 P' k) e/ N2. info 给用户的提示信息
    6 S3 C0 `- J' B) p
    ! f% e% h( k, n' `3. warn 给用户的警告信息9 {* d; \! Y7 w) l8 D' P

    / M8 ?. F8 y1 j8 q4.error 给程序员用来调试0 g# c, F" l# _! c3 ?
    # L  F1 n( b/ g! ]( E% L& m
    Debug—-〉info—-〉warn——–〉error+ _! n& U/ J0 {  ~" {  k- t

    # \: [  _/ t7 ^2 y7 x4、配置; r8 _9 H2 \- N" r

    3 M4 ?. k- D" O6 y0 K/ X1.配置级别! j( J9 q7 v4 x
    5 E0 O  ?) B7 O1 h: ?$ w2 L* O, n
    2.输入源 (控制台和文件)9 `) r8 m& y1 d! l
    & M, e+ I* p& Q3 k3 a9 d7 W- U# ]
    3.可以进行分包控制
    2 y/ K, p( i/ B) p# D0 I' ^7 X- r9 ^: D; C4 R2 @4 T
    Log4f.logger.包结构 = 级别
    : r8 }9 c9 s- l- \% r% C% S4 K# m3 H; g
    5、使用
    / B4 ]% p7 b& e8 n7 U0 n, \/ H* I  B& I. a" U' E% c5 }
    Logger log=Logger.getLogger(Test.class);
    ; V7 S  A$ \" `8 X$ J- o( @' ?+ Q. {
        public
    8 @4 b  L# j  V# }void t3(){
    + c5 S4 L/ C6 t8 [. a: n# M) C# r' s1 v; ?7 {' o; `1 _4 h
            log.debug(“this is debug”);
    % B4 a2 [, I. n/ Q- H
    . f* F  k+ r; P" n. n$ {        log.info(“this is info”);! v' ~4 l4 o7 [/ S

    6 x$ u  s. e( |* X- @        log.warn(“this is warn “);
    # K, \, e7 r2 G) c+ Q* J  a
    . g5 S8 t# y9 b  W  f        log.error(“this is error”);+ N/ n! t% `) s2 B; h+ ?9 i/ \% u

    ( N9 T5 Y3 Z1 J$ E, Z5 E9 o    }  A# [6 T7 f  y9 k# J
    1 A- I* }9 s1 b3 X" x
    Junit
    , W$ D0 J2 ]/ @4 H* @0 h: H1.是什么?; L: K! N8 |5 s3 i
    2 R; t0 n+ z6 \: u
    单元测试的框架+ I& j" ~: I( {6 {& n

    ) |; L; M3 O7 K: s$ w2 l2.怎么做?
    & M# ^$ J4 V$ @) u/ ]
    8 q: s) E' \5 N2 k7 |; _7 C写一个类继承TestCase
    7 L2 \' O+ i: C' r0 v( q) c  d  N! A# ~' A! H8 A
    测试的方法一般都以test开头并且没有参数9 o% \; T) X+ B
    ' E. d5 T; G6 O( A
    在测试方法前执行的方法public void setUp( )! d8 T& W3 l/ z9 o6 T* l7 j

    ; E( g) _" y' J1 V% {4 m在测试方法后执行的方法public void tearDown( ): j/ T2 ]) h1 H9 Q* W
    7 w7 {# I) c2 O. D* n2 M5 i1 i
    error和故障的区别: G* F+ u7 [# I4 }: {. B

    4 F1 y) n* P) U' u, R) u9 V0 werror :代码有问题
    1 [; m& t8 I2 h
    ! Z$ s1 R  \+ b- a( G/ n* y) W故障 :逻辑有问题与祈望的值不相符合4 Z0 i, h1 m" w

    . e$ X! z) a$ ]' T7 [+ t+ L生命周期% ]3 s; \# v6 l
    3 m5 P) {* C& s
    测试—〉SetUp()—〉testXX()—〉tearDown()—〉结束;
    4 w. i. t- A1 {) o1 Z% D7 i8 {. x6 Z# S9 T7 i7 d
    TestCase套件/ @/ w+ ^. ?; s9 n
    / M5 [9 P" u% h- ^- j9 v
    public class MyTest{
    % j' X$ r' m- g) y' {! q$ K0 U& l- }2 I
            Public static Test suite(){' v# X! [* \. l: D. [) f5 U

    - P3 A- ]% B+ v: `/ ^& F4 ETestSuite suite = new TestSuite();
    ) ]. ~, \. Z6 p3 P8 G& R9 }
    ' l+ W0 {7 ?7 S' {; _; wsuite.addTestCase(Test1.class);0 \1 w/ Y9 q& w: C

    $ U& J% F9 `! ]suite.addTestCase(Test2.class);  G' m$ y5 D7 x5 j1 J# F  U6 _) U
    5 D9 V. L( u/ D
    }6 C0 f( S. S0 f# L5 L

    3 H+ @; ]3 C- b}
    / @' D: r" u1 K5 ]4 Z% |5 R6 r3 V, Q6 \

    8 j9 P4 Q2 Y" t) _$ ^) f7 h& g& ~  a4 Q! \) S( L( g! O
    Ajax
    ' \/ w6 ~+ q" F1 S- |3 b& w是什么?& V! R0 T3 t5 d5 E2 S) |, X
    AJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。是一种创建交互式网页应用的网页开发技术。+ Y# j1 M3 l9 v9 K

    7 Z! @2 {' I. i/ ~( ?无刷新页面。$ n$ H8 ]& J" m% `* p4 m2 V- _
    0 T8 q' A0 r: I* [/ w6 w
    有什么?
    2 Y. y; T* t" @& |AJAX是多种技术的综合,包括JavaScript、XHTML和CSS、DOM、XML 和 XSLT、XMLHttpRequest。
    # Z  F" c! m6 o1 k. d1 A2 x+ o5 y8 A3 l% K% E# g; l+ B
    能干什么?
    ( B3 ]9 X3 m; d+ u- t使用XHTML+CSS标准化呈现;
    3 u. N3 e1 H1 N: X  L使用DOM进行动态显示及交互;
    1 W% ^# l4 V. n8 q7 T- z使用 XML 和 XSLT 进行数据交换及相关操作;: a0 Z1 s+ v- a7 @* U3 D
    使用 XMLHttpRequest 进行异步数据查询、检索;
      g# e( S( R. T; E使用JavaScript绑定和处理有所得数据;
    3 x1 A! O% L( A& a) b, v6 g: b5 m3 s# B. P% d4 \
    传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。: y) B& ]" ]( r1 E, L" v0 F" Q

    " A7 @# K# L2 o+ n( q: j# N/ w! W" r与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。
      ~$ h/ R% u' n
    ; Z4 A: u0 v+ A- i使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。
    ( U% Y/ f# R& a! ^0 Z' L3 O
    9 M  U) D$ e6 N  s  h2 e- |: Z6 D对应用Ajax最主要的批评就是:
    - V  T# }& t# F) W- a$ Z8 y; I1 它破坏了浏览器后退按钮的正常行为,就是用户点击后退按钮后不能看到之前的数据;& v8 e/ u) p5 H) S) B
    2 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;& Z( h. T3 v8 w% G9 u
    3 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;
    , x& Q$ O2 `* s# G4 Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;# Y/ C" y9 z( l& }

    0 o* d) g5 p* N7 z  ^. A  v怎么做?
    5 h8 V2 x9 C9 x<script language=”javascript”>. A% x/ ?& s& ~) a* Z

    " u. G& m: A9 `* L4 x  k; o( [+ Avar req;3 v- V2 I/ q% G8 G% Z# x( @
    & j5 B$ h0 U5 h4 Z6 b* O6 D
    function add(){/ N) t( q, v( K
    * L% l1 ^9 P, \6 H1 \
    //1:创建用于传输的对象
    7 ^) r5 X: g5 s, z6 q# `+ ~% V: }4 M+ {
    req=new ActiveXObject(“Microsoft.XMLHTTP”);
    " @5 e2 G& C! i; K: Y
    5 X3 _8 u* ]1 U. G// 声明返回后,处理数据的方法6 u: d& J( Y6 R! b1 u
    # P3 c, a& @! [" d3 f: C9 X
    req.onreadystatechange=manage;8 {0 v" B2 d. M- }# O4 d& h

    ' n4 n5 w7 i6 c8 g//2:准备传输的内容
    0 X) W6 I! S* b# _, _  c
    ) f: `4 I9 s1 f9 Kvar str=”test1111″;
    8 L! m! \& a# ?( X6 N: h) U, E5 V
    ! A1 g2 Z( c4 \: t//3:发出请求, u& I! C4 b' E, M' n% s. _& @
      A! \, U4 K" m  f! E
    req.open(“GET” ,”/others/ajax/test/t2.jsp?str=”+str);% p  b8 u8 ~# ^1 ?

    * S# o, f5 R$ e0 w" A8 M6 y0 creq.send(null);4 R# i5 A: m( z. g$ m
    4 A% {# {$ R3 E
    }
    ; A( E7 d% Z1 X' O% z% N/ m% R" `) a) u; m6 S: ~# z7 G" y
    //4:接受返回并处理
    7 B! _. ?- z( A! d( V' y3 {  d% f; J# i) s2 y8 U- j! |; f
    function manage(){! ]' t  E' A: l

    # F* n, b: B6 |* Y/ L$ ^! jif(req.readyState==4){
    % |( |2 g' P6 Y) W
    " S3 P# W$ C0 i9 kalert(“r==”+req.responseText);
    0 p  C. q6 {: H& q  q6 t& w8 d; B+ v+ o. c9 U6 e; G; k/ p$ p8 }
    }
    & l1 y+ o$ D$ a3 j3 e" P% W$ m: K
    ) P/ v" z7 B4 g: [, k- A3 [}
    5 x& d, B# b/ C4 c, I( ~4 C; A4 ?" J8 R; B% e/ B: X
    </script># |  s. S8 ?8 w- e/ l& r, X
    2 C% P3 j( Y. k0 N* p8 [" ^% i
    readyState的取值如下:
    7 Q- t  \3 D$ A4 U- v- x' K3 b; i$ p* I1 Z& C" U2 u
      0 (未初始化)$ t8 ]4 U; u$ x3 q, B1 X8 w+ Y5 a
    # ?5 H; Y7 l/ O" E  A) s" L2 E+ t
      1 (正在装载)
    $ V; X4 u: }/ j, y6 B* n# @
    + a/ ]: ]) e+ f! B6 ~1 O: x  2 (装载完毕)8 k2 V$ s0 q( x* L* y! }

    # ^& r" L, V5 {) H' f8 H  3 (交互中)
    9 o6 N( f8 g" ^4 E' {
    5 X2 N0 a: j- `8 n8 K9 W  4 (完成)) Z" S$ r% I' \" k2 T

    # X2 O7 E4 ]$ c8 ~
    ! Z" a6 S9 r4 D, n- X9 y5 z" v: h( c0 `3 y' w
    原理2 z* b. _8 K# Q' z
    Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,可以是xml格式,也可以是一个字符串,然后用javascript来操作DOM而更新页面。
    ' e0 N* \7 w. o6 r# n( t
    . s' o# q8 y" e) uDwr8 p1 K% ]7 k2 Z9 B' ~  ~6 R1 ]
    是什么?
    2 g+ M5 z& u' M* KDWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的页面。它可以允许在页面中使用运行在WEB服务器上的JAVA函数,被调用的JAVA函数就像是在页面中JavaScript方法一样。
    8 f. s8 N$ b5 O% T
      \8 D, e( W5 q有什么?( T# v7 y6 Z7 Q4 |# ]( s9 Z& ?7 A+ K
    它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据;另外一方面提供了一个JavaScript库可以帮助web开发人员轻松地利用获取的数据来动态改变网页的内容。0 o/ o, L, L1 l( a) v$ f
    / C% E1 b( d% q) N7 G5 j% u

    $ Q# c# B2 T. _/ e
    ) [9 y; w4 A+ M& @! i5 a, t能干什么?1 v+ q- D! O0 l
    动态地把java类生成为JavaScript,感觉调用就像发生在浏览器端,实际上代码调用发生在服务器端,Dwr负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制。$ X4 T( S" ~, A7 i
      n8 ]3 ~+ V3 [4 b9 e+ o

    ; d" @, x/ R: H+ l! `9 F" b  I- G1 R* b. X# Y( m  Y
    怎么做?
    ! l' O3 _" B' y① 编写配置文件! a6 n1 t" ?: Z# p- f

    ! C6 I+ E5 H, A) ]web.xml
    " B1 c- c9 Q* q* N7 w9 b& v( t* z& x5 T3 H) u/ @
    <servlet>
    1 D5 t. V4 S1 V  X) j0 Y# e6 }7 w& S- w
    <servlet-name>dwr-invoker</servlet-name>% z& e' [" V/ e/ Z: }3 E% h. i+ U
    0 ?1 M# G0 T  P" n
    <servlet-class>
    " U& d7 w2 _' y5 R' j8 _
    : L' H. ]8 {9 ]) Borg.directwebremoting.servlet.DwrServlet* A, B2 k2 {; p! \4 Z

    $ ~& [5 N" X  ]+ N/ s% s" {  q</servlet-class>- p6 Q' {( @* X* D  Q

    . V2 F2 B1 |, ^6 z<init-param>, W7 X' b1 j* f0 F
    5 Q: N5 ~% ^5 M
    <param-name>debug</param-name>. V) M+ a' X2 k. M+ R

    ( c9 O) H3 ?: b  _- X3 ]! D<param-value>true</param-value>8 a; g8 l3 e  Q7 [$ S( [& p( n+ {

    ) Y5 h+ U+ b8 ?* Z</init-param>
    1 _0 X- I2 J  Z& l. M4 N$ p3 B6 ~- {9 [; U2 J, V0 _. S
    </servlet>9 N. [; A% I" @. I0 @" A- Q

    * C: w3 T8 n9 d+ l% Z2 M) X" A- @% P9 t<servlet-mapping>
    # i& z; J! K! _: q7 l/ p" h* R; w7 N) z+ _
    <servlet-name>dwr-invoker</servlet-name>6 q/ p0 O. x$ z. ^( }5 ^

    ' E0 b8 B9 t! `* L& ~+ u<url-pattern>/dwr/*</url-pattern>
    ! P% Y7 a: p0 x$ A) J( H; X
    $ [' Q+ p4 s7 B</servlet-mapping>- d4 N2 s1 b& r6 e

      \& g- e; x" j" B3 |% }$ [dwr.xml
    ( f( c8 k  x' i- r0 |  o! l" N; E1 z. I7 _, V/ J  `; U
    <allow>
    % ]. F: p* d$ M/ ]8 |: L" a+ u% l8 [# h" P& C1 V# G* @
    <create creator=”new” javascript=”kc2″>2 O) D- G! O8 }. \7 c9 J9 o
    & }+ H# B; e: R4 K( t* j5 X
    <param name=”class” value=”dwr.Service” />
    $ x5 y/ R6 ]& m: W0 O" @& t9 T+ S; Y6 o
    </create>
    $ c+ w; ]9 u; S0 r2 @" U
    ' {0 N& P- f+ l: R</allow>8 m! L) F* P- ^# r) @3 _

    + N) x; l8 g7 c" |" b  i②编写service
    0 G2 h/ I/ [# V8 R  U
    " H. v1 N/ h( L8 p; jpublic class Service {
    4 X$ ]8 ~$ u" s$ a* _9 t7 t0 ]
    3 W* i7 `8 H, x* Q/ f7 W7 H6 Z+ mpublic String sayHello(String yourName) {, h' o! C5 k2 f8 [, R% r% u* @( J

    % V- x$ I. X* O2 m  m  T//可以是访问数据库的复杂代码
    4 u. I$ Z; M; V; `" _% W4 e" @' A* D6 D6 ?9 R; U9 H7 x2 S  x+ C
    return “Hello World ” + yourName;
    5 D: ]6 T) ]9 i9 Y% L! j1 I# {& L( X7 c& Q
    }  }7 V! l, w2 J: k
      r* B( ]. {! z7 q/ p9 _
    }8 U/ {* [, m# i# |$ z
    " l1 p4 {  g( M' w  }
    ③测试DWR. c, j! [$ F5 I: u
    1 s8 H' b) g, ?# n
    将代码放入应用服务器(比如Tomcat),启动。
    7 n) B- Q, C# M% ]+ ^- ]" v  k4 a+ L
    然后在地址栏输入http://localhost:8080/你的工程/dwr
    1 h6 B, \4 z- j' ~2 q8 p5 b1 w) A0 W* Z/ l
    ④编写jsp页面4 Z2 |6 d! T9 b7 u. M" N0 b# b& C

    * \8 w% u/ C9 d5 I* u2 ]& L1) 要引用3个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js& b& Z% ~7 J8 t! t5 |6 n5 v

    * X$ Q( U0 r+ Z2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样
    & @. m! l+ U/ h2 |- n8 ~$ b! U- b' R: ]
    3) js里的service.sayHello和java类的那个有一点区别,多了一个参数,用来得到返回的数据
    回复

    使用道具 举报

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

       

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