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

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

动态微博

查看: 5548|回复: 17

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

[复制链接]
admin    

1244

主题

544

听众

1万

金钱

管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    跳转到指定楼层
    楼主
    发表于 2014-12-03 12:38:53 |只看该作者 |正序浏览
    java基础
    ) t4 c' t0 @1 \% I) D: y
    • 简述Java的基本历史
      / ], z3 Q# K- P/ {

    java起源于SUN公司的一个GREEN的项目,其原先目的是:为家用消费电子产品发送一个信息的分布式代码系统,通过发送信息控制电视机、冰箱等


    ; N3 p, }% b$ W
    • 简单写出Java特点,写出5个以上,越多越好: v9 @7 a- Q. C* r/ r1 T% O! l0 S

    简单的、面向对象的、分布式的、安全的、稳定的、与平台无关的、可解释的、多线的、动态的语言。


    " W& I6 w: g* r; D0 O7 g
    • 什么是Java?
      $ j: k4 B6 s# S( I

    JAVA:一种编程语言

    一种开发环境

    一种应用环境

    一种部署环境

    5 S. U# ~  j' f* ^6 v) e: F
    • 请写出Java的版本分类,以及每种版本的应用方向3 K, K# v8 O2 N0 C7 A4 L/ m. k" K

    三种版本:

    JME:是面向内存有限的移动终端. 为消费性产品设计的;

    JSE: 是SUN公司针对桌面开发和低端商务计算方案开发的版本。为笔记本电脑、PC机设计的;

    JEE: 是一种利用JAVA 2平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构。 为企业级的、服务器端的高端应用而设计的;


    8 s. Q, ?4 M- G2 O
    • 描述Java技术的主要特性: M" H6 X' n1 i% ~7 f. B- D

    java虚拟机

    垃圾回收

    代码安全性


    ; Y) `. m+ V' t1 ]% N3 O
    • 描述 Java虚拟机的功能
      : T6 F3 }+ Z! T/ I' m1 {

    (1)通过 ClassLoader 寻找和装载 class 文件

    (2)解释字节码成为指令并执行,提供 class 文件的运行环境

    (3)进行运行期间垃圾回收

    (4)提供与硬件交互的平台

    9 b# m4 Q- x% l
    • 简述Java代码安全性& R, t1 B. H: c0 t8 g

    (1)编译时的错误检验

    (2)类装载检查,把本机上的类和网络资源类相分离,在调入类的时候进行检查,因而可以限制任何“特洛伊木马“的应用$ ^" _* ^+ p) t2 R6 e7 d

    (3)字节码校验

    (4)沙箱机制,限定访问权限


    ( V4 j9 T; c1 W( x
    • 描述Java垃圾回收机制
      * ]' h7 v4 N- |/ Q

    Java 编程语言解除了程序员释放内存的责任。它可提供一种系统级线程以跟踪每一次内存的分配情况。在 Java 虚拟机的空闲周期,垃圾收集线程检查并释放那些可被释放的内存。垃圾收集在 Java 技术程序的生命周期中自动进行,它解除了释放内存的要求,这样能够有效避免内存漏洞和内存泄露(内存泄露就是程序运行期间,所占用的内存一直往上涨, 很容易造成系统资源耗尽而降低性能或崩溃 。; e  E0 l. N' F% o$ m  p

    垃圾回收有以下特点:
    0 @& _: P: j7 i5 ]* {3 x

    (1)垃圾回收是一个自动的系统行为,程序员不能控制垃圾回收的功能和行为。! t1 k8 m1 n; |- `4 e8 h& i

    (2)有一些跟垃圾回收相关的方法,比如:System.gc( ) ,调用这些方法,仅仅是在通知垃圾回收程序,至于垃圾回收程序运不运行,什么时候运行,都是无法控制的。6 `2 X$ R3 ]; M+ X% x: E

    (3)程序员可以通过设置对象为 null,来标示某个对象不再被需要了, 这只是表示这个对象可以被回收了,并不是马上被回收。3 C* o/ x) G  H! m! H) f$ H

    5 ]$ E& ?2 L, [: A) c% G" y
    • 简述Java代码的运行过程
      ; l( J3 [! O4 o4 k' k+ p& t, J

    (1)加载代码 通过类装载器装载CLASS文件

    (2)校验代码 由字节码校验

    (3)执行代码 由解释器将字节码转换成机器码

    $ {; I1 V. s2 F1 K6 O1 @! D

    $ U2 s2 r; j+ _; M" `( R
    • 简述如何搭建Java开发环境5 \! q# f4 a, |7 u8 B6 E

    首先下载安装JDK 然后配置环境

    (1)配置PATH,

    (2)配置CLASSPATH

    (3)配置JAVA_HOME

    5 }3 j$ T3 H$ l: P% c  V
    • 简述classpath,path,JAVA_HOME的意义和配置方法5 }( ~$ ?; M! f, S$ b

    path 操作系统运行环境的路径

    classpath JAVA运行应用程序时所需要的类包的路径

    JAVA_HOME 供需要运行JAVA的程序使用

    & q- j8 C( `( y0 U  d0 A
    • 请描述:一个完整的Java文件的代码分几个部分,每部分都起什么作用,大致的写法
      * W8 J( I$ O9 t% Q! B

    package 当前类所在位置

    import 当前类运行时所需要的包或类

    public class 类名 {

    属性定义;

    方法定义:

    构造方法定义;

    public static void main(String args []) 例外{ 程序入口

    语句;

    }

    }

    //注释

    % G" o5 e  J7 Q, v6 V& E3 M
    • Java代码的注释有几种?分别举例说明) v! h" l5 D8 H1 A

    (1) // 单行注解

    (2) /* */ 块注释

    (3) /* *

    * 文档注释

    */


    + Q& W& }( m" Z5 y- P% @
    • 什么是Java代码的语句,什么是Java代码的块,举例说明
      * ^0 [5 x9 Q. V* k

    语句 是一行以分号终止的代码,例:int a;

    块 是以{ }为边界的一些语句的集合 例:public void tt( ){}

    4 ?; W3 X) O+ p$ ^
    • 什么是标示符?+ J8 c2 q# q/ t& M( z
      标识符:是赋予变量、类、方法的名称。
      9 e! }/ A( [4 H( w2 g

    3 o7 H5 _# R6 y5 y7 X
    • 标示符定义的规则?
      1 O$ k4 c5 X) p. C
      • 首字母只能以字母、下划线、$开头,其后可以跟字母’下划线、$和数字配置CLASSPATH
      • 首字母小写中间用大写字母隔开
      • 标识符具有一定的含义
        ( c' o5 ~8 {# F/ p% X% E
    • 什么是关键字?9 {3 i$ P1 D8 K9 ~4 Y5 e: z
      关键字就是编程语言与机器语言的编码约定4 s) v: q4 I% A5 j9 ~# X4 v' f
    5 k# H  e1 l( s2 |
    • true、false、null、sizeof、goto、const那些是Java关键字
      & m6 w( V7 k4 strue 、false 、null 为JAVA的关键字
    • Java的基本数据类型有几种?分别是?
      5 ^' F) ?1 D0 b1 P8 Vshort int long boolean float double char byte1 W+ Y$ E* @0 t9 a" g; E
    " u6 e" i  C; l; l8 @' O
    • 请写出每种基本类型的默认值?取值范围?分别给出一个定义的例子; |6 |, l  ~) `
      默认值         取值范围 示例
      0 ?& L8 T0 y- J+ Z- I

    字节型 : 0 -2^7—-2^7-1 byte b=10;

    字符型 : ‘ ′ 0—-2^16-1         char c=’c’ ;

    short : 0 -2^15—-2^15-1 short s=10;

    int : 0 -2^31—-2^31-1 int i=10;

    long : 0 -2^63—-2^63-1     long o=10L;

    float : 0.0f -2^31—-2^31-1 float f=10.0F

    double : 0.0d -2^63—-2^63-1 double d=10.0;

    boolean: false true alse boolean flag=true;

    3 T) [0 z7 F+ E; N) b. V2 l+ }
    • 在基本类型中,如果不明确指定,整数型的默认是什么类型?带小数的默认是什么类型?
      1 R: n* D- V) M! U3 X

    整数类型 默认为 int

    带小数的默认为 double


    & ~( e% y% W5 Z) e$ w
    • 如何定义float类型和long型# w6 ^2 l3 ^- Y. K6 K# c

    float f = 1.2f

    long l = 1.2L


    . I6 R/ [8 q* z: y! m# H& ?; l
    • 什么是变量?
        ?- @) o0 W/ O$ ~

    变量是用来引用一块内存区域或一个值,用标识符来表示,可以通过操作变量来操作变量所对应的内存区域或值块的值。

    ) S1 U# I; C( c
    • 变量的定义规则?7 D8 g$ F- u4 W1 J! [" J$ n
      • 以字母、$、下划线开头,其后可以跟字母、下划线、$和数字;
      • 首字母小写,中间单词用大写字母隔开;
      • 名称具有一定含义;
        ) l' W5 H# M+ ~8 Q

    , G& C. ^6 l- U9 x) K+ `
    • 请写出Java编码约定中对下列部分的要求:类、属性、方法、包、文件名、变量、常量、控制结构、语句行、注释5 u  K% h  i* Z: r- a: o3 s! r

    类: 一个类文件中类名要和文件名相同,类名一定要以大写字母开头,单词之间用大写字母分隔

    属性: 属性名首字母小写,中间用大写字母隔开。

    方法: 方法名首字母小写,中间用大写字母隔开。

    包: 引用包必须写在类文件的开头,有且只能有一个包,全部用小写字母。

    控制结构:当语句是控制结构的一部分时,即使是单个语句,也应使用大括号将语句封闭。

    语句行:每行只写一个语句,并使用四个缩进的空格,使代码更易读,注意用分号结束。

    注释: 用注释来说明那些不明显代码的段落。

    常量: 常量名一般用大写字母,单词之间用下划线分隔,一旦赋值不允许修改。


    8 {# n, b8 J( C1 n
    • 什么是Javadoc?
      ) |0 u& s! d' O2 N

    按照一定格式生成程序的文档的工具。


    5 [' Z$ Y' X7 ]3 w
    • 什么是引用类型?
      * l7 _' E3 l' G, L2 O# ?3 q; }/ Y用户定义类型, 它可引用类和数组。
      % ]: a* N7 o  x2 E5 F

    除去基本数据类型的其他类型都是引用数据类型。

    • 什么是按值传递?什么是按引用传递?9 ?3 e9 U) i0 a

    按值传递:就是将该值的副本传过去(基本数据类型+String类型的传递,就是按值传递)

    按引用传递:就是将值的内存地址传过去(除基本数据类型+String以外类型的传递,就是引用传递)


    ! q, O; F2 w! J- s( t
    • 如何创建一个新对象?如何使用对象中的属性和方法?& a! m9 M1 n! Y4 X; \8 ^

    使用new 关键字来创建一个新的对象;

    通过对象的实例用”.“(点)来调用对象中的属性和方法;

    静态的方法和属性,也可以直接用类名”.“(点)来调用;

    , R6 N% m: J# ]  K3 O' _
    • 简述new关键字所做的工作
      ) g& N2 e9 w3 l8 @' L- A( n' J- F+ knew 创建一个对象,并为对象分配一块内存。8 t- a9 a; q& E! v' ?2 ^+ o; N7 f
    + U5 t) A. h" C" ~- f$ z
    • 简述”=” 和”= =”的功能和区别
      7 v; Z6 v- _7 C: e1 M$ i) K7 r/ j

    “=” 赋值,

    “= =”当比较基本数据类型的时候,判断前后两个值是否相等;

    当比较引用数据类型的时候,判断= =前后两个值的内存地址是否相等;

    区别:

    = :为赋值表达式

    = = :为逻辑表达式


    ' ]  U! {" N3 g* }' m+ Y9 S
    • 什么是实例变量?什么是局部变量?什么是类变量?什么是final变量?
      1 F8 o; T( g9 S

    实例变量:     类中定义的变量,即类成员变量,如果没有初始化,会有默认值;

    局部变量:     在方法中定义的变量,必须初始化;

    类变量:     用static修饰的属性;

    final变量:     用final 修饰的变量,


    8 ?6 ]: |( N' J* u4 e/ A
    • 简述上述各种变量的定义规则和使用规则?( U0 l8 j. b; }5 J  D# @8 p

    实例变量:    不需要static关键字来声明,需要类的实例(对象)调用(用”.“);

    类变量:        用static修饰,可以用类名调用,也可以用类的实例调用;

    局部变量:    在方法内任意定义变量即为局部变量;

    final变量:    一旦赋值,不可以再修改的变量;

    final属性只允许赋值一次,且只能通过构造方法赋值,定义后也就是一个常量;

    final修饰的变量,只允许赋值一次

    * B: e7 u2 v/ ]
    • a++和++a的区别?/ c" }0 A$ Y" z5 {

    a++ : 先使用,后加1

    ++a : 先加1,后使用


    3 s% T8 \3 H8 C3 ^  M3 c: s7 P+ Z
    • 请描述instanceof、?:、&、&&各自的功能
      " W. X1 g9 V9 e' U* A6 q
      instanceof :用来判断某个实例变量是否属于某种类的类型。
      4 z# n) U0 t7 p: J0 L& G

    ? : 三目运算符:

    表达式1?表达式2:表达式3

    如果表达式1为true,执行表达式2,否则执行表达式3

    &: 位运算:按位与 |

    &&: 逻辑运算:逻辑与

    & q4 ?+ A% q5 t" [1 r' k8 V: d
    • 请描述>>、<<、>>>的功能
      7 f3 M" Y! d8 j9 y7 l+ q& E# L5 X

    10>>4 :算术或符号右移位运算符

    << :算术或符号左移位运算符

    >>> :逻辑或无符号右移位运算符


    1 O2 L( d6 O* b5 ]
    • 请描述什么是强制类型转换?什么是自动类型转换?什么是向上造型?并分别举例说明
      8 u; M7 ^' ]( o* \6 C2 E8 C
      强制类型转换:在一个类型前面加( ),来强制转换

      $ m3 d, t0 Y6 N% b8 Y

    long l = 9L;

    int i = (int)l;

    自动类型转换:

    int i = 5;

    String str = “”+i;

    向上造型:把范围小的造型为范围大的类型:

    int i = 2;

    long l = i;

    $ _8 K& D5 s& _% U# D
    • 请写出完整的if条件控制语句的结构1 X8 U$ l. e. H# W# r! T

    if(布尔表达式){

    语句

    }else{

    语句

    }

    ' N1 O6 W5 J5 V6 ^2 R
    • 请写出完整的switch语句的结构1 W' Q5 Z& c! Z1 y$ {8 S, f
      switch(字符){
      3 e3 y* N; t+ h8 E

    case 字符: 语句

    break;

    case 字符: 语句

    break;

    default:语句

    }


    5 l  C! l/ c' |# ?' H3 D
    • 请写出完整的for语句的结构4 z7 c4 J# u$ W6 L. ]1 ?

    for(初始语句;条件语句;步长){

    }

    & n! F& S  i6 e# w; I
    • 请写出完整的while语句的结构
      ! m0 q- p7 Q  S$ o$ `5 k5 s$ s

    while(boolean语句){

    }

    / ]8 |9 O4 {3 Y4 A
    • 请写出完整的do while语句的结构1 {0 F# D* {4 r1 m) {4 F

    do{

    }while(boolean语句);

    / p. b8 h, {! Q
    • 请描述break 和 continue的功能和用法
      & p6 t& Y$ K/ h) K  s

    break:终止(跳出)最近的循环

    continue:跳出本次循环,执行下一次循环

    & G+ e& }! [4 E: `' ]$ L
    • 定义一个一维的int数组,先创建它,并初始化它,给它赋值,然后输出其中的一个值
      2 Y) |, `: {/ V' J6 C! Y( }5 J+ J

    public class Arr{

    public static void main(String args[]){

    int a[] = new int[5];

    a={1,2,3,4,5};//错误 , 只能在初始化时这样做

    a[0]=1;

    a[1]=2;

    System.out.println(a[0]);

    }

    }


    8 t4 z8 i% k1 g
    • 定义一个一维的A类型数组,直接定义并赋值,然后输出其中的一个值
      ) r; O: M7 c! U+ x4 Y1 G

    public class A{

    public static int i;

    public static void main(String args[]){

    A aa = new A( );

    A bb = new A( );

    A a[] = {aa,bb};

    a[0].i=2;

    System.out.println(a[0]);

    }

    }

    # c7 c9 ^8 L7 z4 P9 E- H! l
    • 把上面的数组改成2维的数组- c  N+ C, Q5 D+ T! `4 b! r

    public class A{

    public static int i;

    public static void main(String args[]){

    A a[ ][ ] = new A[5][5];

    a[0][0].i=2;

    System.out.println(a[0][0]);

    }

    }

    . ?0 l% e3 h& Y9 @; E
    • 举例说明数组拷贝方法的使用:arraycopy方法' b/ ?: b  n7 J
      public class A{
        \7 k/ X* M) w; _3 X* F

    public static void main(String args[]){

    int a[] = new int[5];

    int b[] = new int[5];

    System.arraycopy(a[5],0,b[5],0,a.length)

    System.out.println(b[0][0]);

    }

    }


    . p$ ]% h# l! R; ~
    • 什么是构造和析构方法?功能是?$ s% J' Z, w1 J; p0 s: J; l

    构造方法:每个类至少有一个构造方法,类初始化时调用的方法

    1.方法名和类名相同

    2.无返回值类型

    格式:访问权限 类名(参数列表) {};

    1.自己定义构造后,就没有默认的构造方法

    2.无构造方法时,默认为空参的构造方法(无参数,方法体为空)
    4 `  ^6 g' q$ e/ ~1 o. b0 t析构方法:finalize

    类销毁时,自动调用方法

    当对象在内存中被删除时,自动调用该方法

    在此方法中可以写回收对象内部的动态空间的代码

    # G) E! L. P8 W' E2 [5 r# _
    • 简述Java的访问修饰符类型?分别有什么功能?
        O, o; D/ E5 `; l# E

    public 公开的,任何一个类都有可以访问

    protected 同包同类,只可被它的子类访问

    default 只能被同一个包中类访问

    private 私有的,只能在本类中被访问


    * }# }  o% C8 @6 C- k: ?) m# {+ r+ n+ b7 @% y4 z4 C
    6 d, F- m" v  k# m# T9 Y0 Q' `
    : G4 T7 e, D$ |" n

    ' N9 r( [$ y: V6 O7 f
    3 P" o3 E, T5 H! e# K" j% \  e6 `! B

    5 i1 Q' g4 o$ @, ]* L: Y$ t* a$ j  E% U! b  ^2 H

    ( v' ?# f/ `" r
    • 分别说明:在类上、在属性上、在方法上能使用哪些访问修饰符
      + n2 X9 ^+ _( g9 y' b

    在类上:public default final

    在方法上: 访问权限:public protected private default

    方法修饰符:static

    final

    返回类型:void

    在属性上:public protected private default

    static

    final


    ' O9 F& L) V% P7 X
    • 简述什么是包?包的功能% \2 N9 D2 T) D8 `

    包:对所定义的多个JAVA类进行分组,将多个功能相关的类定义到一个包(文件)中。

    功能:1.易于查找和使用适当的类

    2.包不止包含类和接口,还可以包含其它包,形成层次的包空间

    3.有助于避免命名冲突

    & ^& ^, k! [7 U9 S/ D+ o
    • 请写出5个以上的JDK中的包,以及他们的基本功能
      " u* M. e+ q& A3 Q3 z/ k3 w: U

    java.awt: 包含构成抽象窗口工具集的多个类,用来构建和管理应用程序的图形用户界面

    java.lang: 提供java编成语言的程序设计的基础类

    java.io:  包含提供多种输出输入功能的类,

    java.net:  包含执行与网络有关的类,如URL,SCOKET,SEVERSOCKET,

    java.applet: 包含java小应用程序的类

    java.util:  包含一些实用性的类

    7 i- a  L$ u, I* x" J+ d5 U
    • 什么是包装类?Java中都有哪些包装类
      : ?# l% g9 D3 Z在JDK中针对各种基本类型分别定义相应的引用类型 ————–称为封装类
      7 d% ~9 o% f6 j0 V# H

    Boolean Byte Short Integer Long Float Double Character


    $ C  R  D( X2 k
    • OOP(面向对象)语言的三大特征是?
      9 K# w9 [" W' D; C4 h! }9 M( t+ j封装性,继承性,多态性( o% o/ G# m( s" W6 Q) b1 k

    ; L$ Q" O0 O! L+ w. J- t
    • 分别表述类的三大特性及其他们的功能
      . _5 Q+ X2 c+ i4 p

    封装:隐藏类的实现细节、迫使用户去使用一个接口去访问数据、使代码更好维护

    继承:子类可以直接继承使用父类的方法,程序员只需要做的是定义额外特征或规定将适用的变化

    多态性:同一个行为具有多个不同表现形式或形态的能力

    3 j1 [9 J1 w1 }' _. h3 k" ^% C
    • 如何实现继承?继承的规则?
      ' k5 D1 m- N  ~0 ~4 s

    public class A extends B{

    }

    • 单继承性
    • 构造方法不能继承
    • super引用父类,调用父类的属性,方法
    • 当子类中出现与父类的方法名,返回类型,参数列表相同的方法时要覆盖此方法- I5 s4 r: {# y; e" p
    • 简述this和super的功能和用法
      + l3 _) |0 _+ H- W* ?" J' ^, `

    this :

    • 能访问除构造方法以外所有的属性、方法,通过this. 来调用方法和属性
    • 不可以在静态方法中使用,
    • 在调用其它构造方法时,必须放在该构造方法的第一行
    • 在构造方法中使用this(参数列表),相当于调用本类的其它构造方法,它必须作为构造方法的第一句
      $ o( p. I+ H+ B

    3 o  Z) b" y! ~; N% Y% j9 [

    super :访问父类

    • super. 点取父类中被子类隐藏的方法和属性,
    • 通过 super(参数列表) 来调用父类的属性和方法,在调用父类的构造方法时必须放在子类构造方法里的第一行;6 j7 b; L+ U4 b
    3 y$ Q6 D" x. u
    • 如何确定在多态的调用中,究竟是调用的那个方法?
      9 }0 v. {: N: enew的是哪一个类就是调用的哪个类的方法。9 [+ w* |# R+ [/ y# s1 l
    9 ?- v0 X+ K/ M
    • 请描述方法定义的完整的语法结构; G, g/ ?0 N+ w  e

    权限修饰符 修饰符 返回类型 方法名(参数) 例外{

    方法体;

    }

    % \, Z: U7 I: |* e3 I/ [8 `4 e! A
    • 什么是重载?) R& R! m1 P+ m. g% ?3 n# u
      在一个类中出现方法名相同,但参数列表不同时,这种情况就是重载。2 C+ w" E: {0 \" y
    3 j: Q$ N7 s  ~3 e
    • 简述重载的规则% F/ L2 _& o0 i+ @# X
      • 方法名称必须相同;
      • 参数列表必须不同(个数不同,或类型不同,或参数排列顺序不同);
      • 与返回类型无关;
        & U7 ]  L7 c% C5 l8 A8 S6 G2 @! [
    • 什么是方法的覆盖?什么情况下出现?
      + C2 i( |% p' ~/ \

    方法覆盖:

    子类可以修改从父类继承过来的行为,也就是说子类可以创建一个与父类方法有不同功能的方法,但具有相同的:名称、返回类型名和参数列表。

    在父子类的情况下出现时。

    0 e- Z9 F. D3 u( v- r8 |) K$ i! ~
    • 方法覆盖的规则?& h3 v1 ]9 t( y
      • 方法名要和父类中被覆盖的方法名相同,返回类型相同,参数列表相同。
      • 访问权限要大于等于被覆盖方法的权限。
      • 例外列表要小于等于被覆盖方法的例外列表。
        - Y) X# |& I8 K. p) o$ n

    ' @$ R$ l) ^  ]. i+ ?  z
    • static修饰符的功能是?可以用在什么地方?怎么访问?
      8 y! g! T0 Z% _# O* X% w( I
      static 修饰符功能:

      - I+ P6 C% ?# S# Y' Z' @
      • 共用一块内存区域,也就是用static修饰的变量或成员方法对所有类的实例都是相同的
      • 静态成员方法和静态变量的优点在于他们能在没有创建类的任何一个实例的情况下被引用。
      • 可以用在方法或属性上
        1 O* [% d! C5 k9 V6 v0 t

    访问方式:

    • 直接使用类名调用
    • new 一个实例,用实例调用
      7 F; A$ B( Y& k

    : U: q' l, K: q) B- q* x" c
    • static的基本规则1 E) P( Z2 d1 t+ g' R4 _
      • 类中的静态方法只可以调用静态的属性和方法,不允许调用非静态的属性和方法。
      • 静态变量为类变量,可以用类名直接调用静态的属性和方法。
      • 静态方法中不允许出现this和super
      • 构造方法不允许声明static
      • 非静态变量为实例变量,通过实例调用
      • 静态方法不能被非静态方法覆盖
        % x/ \; ^6 O( V+ l0 j
    ; C- |  p# C- i9 d$ M7 q

    1 h1 F& L2 o+ C( O+ F/ f0 H& L
    • final修饰符的功能是?可以用在什么地方?
      4 D2 {# ~$ w8 h6 q7 A3 C

    功能:final标记所有通用的功能,不能随意更改

    可以用在类、属性和方法上


    5 t2 Y1 S& X' l6 i# _
    • final的基本规则
      / `6 L4 J1 R2 @1 Y( B9 P+ Y9 m7 w
      • final修饰的类不能被继承
      • final修饰的成员变量只允许赋值一次,且只能通过构造方法里赋值。
      • final修饰的局部变量即为常量,只能赋值一次。
      • final修饰的方法不允许被子类覆盖。  v. m- _+ g- T+ x% i' C

    ' s- r0 N9 R0 p( i6 z- ?
    3 P$ W8 A* v5 s5 ~  I# t( j6 V- X5 H( t4 W. P$ j( z0 T  t* q
    • 什么是抽象方法,什么是抽象类: |0 i+ W/ i" q" v; d- f6 _

    用abstract修饰的方法,只有方法的声明,而没有方法的实现,就叫抽象方法。

    用abstract修饰的类,就叫抽象类。


    6 J* S9 s+ Z; T9 x
    • 抽象类的规则) B. e) l8 C& q: a
      • 抽象类内部可以没有抽象方法
      • 必须用abstract修饰
      • 不能够直接使用抽象类,必须通过子类继承并且实现
      • 抽象方法不允许被private修饰
        ) ?" Z. l: V& D6 |$ c% |, L0 m

    ! ^9 s# `0 a4 t; M2 d6 ~8 ]9 c) \
    • 什么情况下使用抽象类0 O/ Z! b1 M+ f& S
      • 当一个类的一个或多个方法是抽象方法时;
      • 当类是一个抽象类的子类,并且不能为任何抽象方法提供任何实现细节或方法体时;
      • 当一个类实现一个接口,并且不能为任何抽象方法提供实现细节或方法体时;
        7 j! `. D: @; I, t

    1 u. o" Q. U$ w) S
    • equals方法和”= =”的功能和区别
      8 e# [* @% d0 @; d+ k

    功能:判断对象是否相等

    区别:

    equals方法比较的是对象的值

    = =:比较的是对象值的内存地址,对基本数据类型来说= =比较的是数值

    / T0 G; r* v8 [1 ^) a$ a
    • toString方法的功能和基本写法$ j" A4 j# Z/ _, b

    返回一个String类型

    public String toString(){

    return “”;

    }

    0 S" [. x- s" n# Q3 i* O" n
    • String的方法的功能和基本使用方法,请描述5个以上. Z1 I7 q6 r7 }6 u

    substring(参数1,参数2); 功能:取字符串中参数1到参数2的的所有字符; “String”.subString(0,1);

    replace(参数1,参数2); 功能:用参数1中的值替换字符串中所有参数2的值 “String”.replace(ing,tt);

    equals( ); 功能:判断两个字符串是否相等 “String”.equals(“tt”);

    trim( );   功能:去掉字符串两边的空格 “String”.trim();

    indexof( ); 功能:查找字符串中参数所在位置,并返回字符串第一个出该参数的下标

    “String”.indexOf(“ing”);

    split( ); 功能:根据参数分割该字符串 “String”.split(“-”);


    ) ?4 b. z* i3 _" M9 f4 E
    • 为什么使用StringBuffer类?有什么功能和优点?5 e( ~7 M* k1 i3 w4 L- @
      –只创建一个对象
      - u$ |0 ]% B% j" N8 Z

    –StringBuffer 对象的内容是可以被修改的

    –除了字符的长度之外,还有容量的概念

    –通过动态改变容量的大小,加速字符管理


    3 W+ _0 j( Y3 a% Y& W( _7 }* M& v9 K- ^1 y
    • 举例说明如何使用StringBuffer5 R; H; Q6 Q3 R6 k

    StringBuffer sb = new StringBuffer();

    sb.append(“aaa”);


    " F5 y' [9 L9 h' K( x
    • 如何使用Java读写系统属性?: P, p! P5 i4 T( W2 c
      读:" o7 N5 @4 l/ y' H- ~. U4 W/ N
      ( C$ `# P- i% y0 B

    Properties props = System.getProperties();
    2 C. V9 ?& H) j: U/ Y* f4 n) e

    Enumeration prop_names = props.propertyNames();
    & X+ S" b0 n: R# O  h0 Q

    while (prop_names.hasMoreElements()) {
      ~/ J) Y! a3 F7 M

    String prop_name = (String) prop_names.nextElement();# \1 V/ F, P7 B0 r1 w( w: ?+ T

    String property = props.getProperty(prop_name);
    + h' P  }+ `" R6 A

    System.out.println(“Property ‘” + prop_name + “‘ is ‘”+ property + “‘”);
    ( D+ x& y3 h* n7 I: _

    }

        写:+ m3 Z5 e& x% p3 o! L

    System.setProperties(props);# u# ?+ W2 G  i! ~2 n" g0 N

    6 W+ E! I9 T4 E6 ?& }
    • 简述properties文件的结构和基本用法
      ' c7 h1 M* T2 r0 k
      结构:扩展名为properties的文件,内容为key、value的映射,例如”a=2″
      ( x! H- w+ H& O' \

    用法:

    public class Test {
    4 @4 t  ?  V/ w& `+ V, w5 {7 R7 D

    public static void main(String args[]) {: G2 e2 B# N. b. l4 T* q3 Z4 w/ ~

    try {1 U1 p$ Y; h* C! Q6 b

    String name = “test.properties”;9 s+ x' ^) m5 O1 y; e" M- O

    InputStream in = new BufferedInputStream(new FileInputStream(name));
    $ E/ y  f% T" ^0 }

    Properties p = new Properties();
    ( T. y7 ?( U' D0 M' O0 ^

    p.load(in);
    ! p9 O! A+ ~) s" p% B% c- _

    System.out.println(“a的值==” + p.getProperty(“a”));
    $ V, ^2 P( g8 `

    } catch (Exception err) {
    , j5 I# `1 v  h3 s6 K

    err.printStackTrace();
    ! d8 n% ]  P8 n' C; ]! V" @7 d3 ?

    }6 K! f7 L' ^3 z/ j# `/ ~- r

    }) a* v  y! s( T9 Z

    }

    4 r; ^. `9 b9 ]& N- [
    6 V$ ~+ h, a  o
    • 什么是接口?接口的定义规则?- }1 w/ M( O( K" N; w

    接口是抽象方法和常量值的定义的集合。从本质上讲,接口是一种特殊的抽象类,这种抽象类中只包含常量和方法的定义,而没有变量和方法的实现。
    4 N1 p2 R/ J/ M

    public interface Tt {

    public void outPut( );

    public int tt( );

    }


    . r" K3 X. `9 j
    • 接口的作用?为什么使用接口?
      + [7 t/ U9 s2 @4 c. v( f
      多重继承
      5 r6 i. d3 _9 j" Y

    封装、隔离

    功能,实现的分离

    多态

    便于后期维护

    接口是可插入性的保证。

    1 ^" n6 e7 F5 E! [
    • 什么是多重接口
      ' n7 T0 Q0 @# L+ M就是一个类实现多个接口7 t, m# u6 I$ C& f$ s. V
    2 d$ ^$ [' e4 r) R. |
    • 描述接口的基本思想?# K9 ?6 A4 Q. E. T: F/ h

    封装 隔离

    接口及相关机制的最基本作用在于:通过接口可以实现不相关类的相同行为,

    而不需考虑这些类之间的层次关系。

        根据接口可以了解对象的交互界面,而不需了解对象所属的类。

    面向对象程序设计讲究”提高内聚,降低耦合”。


    0 w1 Y1 @/ X3 A. p/ _/ Q
    • 如何在代码中使用接口?2 H' Z5 C, K: a" y4 A& x

    public class MyCast implements Tt{

    public void outPut( ){}

    public int tt( ){

    return 0;

    }

    }

    ' P$ K. `/ l; X  Q0 L) s8 V1 i- c
    • 举例说明如何把接口当作类型使用
      . F& ^" o1 U1 l0 t  E& u9 s

    public interface Animal(){

    public void tt( );

    }

    public class Dog implements Animal{

    public void tt ( ){}

    }


    ) t0 E3 y  l& L$ z

    Animal ani = new Dog();


    ) |, T/ ~* l3 _; F
    • 如何选择接口和抽象类?为什么?; ?$ o0 b0 u/ i- I2 d
      优先选用接口,尽量少用抽象类
      / P" o0 S! v: h( `+ x

    在下列情况下选择抽象类:需要定义子类的行为,又要为子类提供共性的功能。' \" V, F0 K/ J% }4 e2 H4 A


    ' @7 y3 M- ~( F
    • 什么是异常,异常的分类?
      3 r" ?/ _) Z! g* n5 [程序中导致程序中断的一些情况叫做异常,一般程序员可以处理。! O$ I5 t9 x8 U3 t) `7 q5 z& k2 e
      异常分为运行时异常和非运行时异常(一般异常)
      2 @+ s  o; W- K" X0 W& B运行时异常是指因设计或实现方式不当导致的问题。也可以说,是程序员的原因导致的,本来可以避免发生的情况。例如:BufferOverflowException, ClassCastException,IndexOutOfBoundsException,ArithmeticException。出现这些异常的代码不需要try块包围。
      % P2 K6 V) ?- g8 b$ u非运行时异常是指除运行时异常以外所有的异常,出现这些异常的代码必须用try块包围。例如:FileNotFoundException,EOFException,
      ' k# Z4 \7 S  _8 Y- G& R! w

    6 y: N( C5 ?5 x5 x8 h5 w
    • 简述处理异常的两种方式?1 s  S( s7 Q9 H
      抛出(throws)和catch语句处理0 q4 X5 @' O$ O5 K* z' v
    * u& A( i, g" s4 m5 n
    • 简述try块的功能和规则
        i& U( S( T) c: D, @7 ~

    try块内部一般写一些编程人员认为可能会出现异常的代码,使程序运行时不会因为出现异常而中断。


    " i" ?7 i. l0 T2 G0 ]- T
    • 简述catch块的功能和规则
      ( z& V2 |7 |) Y; f: R3 B3 j

    功能:可以截获所声明的异常,并在语句块内对其进行处理

    规则:catch(Exeption e){

    e.printStackTrace( );

         }


    + Y) X/ o& Q  {/ s
    • 简述finally块的功能和规则6 C" I( q" {% E  H8 W8 f* k, c

    finally块一般写一些不论是否发生异常都必须执行一次的代码

    例如关闭与数据库的连接等


    , O% \' \  b* Z
    • 简述throw和throws的功能和使用方法
      7 e7 Z! q+ Z: c0 x: S" k/ ]

    throw 指编程人员主动抛出一个异常

    throw new NullPointerExeption( );

    throws指程序遇到异常情况自动的被动抛出一个异常

        public void test( ) throws Exeption{}


    : X, r7 K& K- Q- Z* z2 ]6 U+ Q
    • 异常的分类?/ h" Y9 C1 _2 H  {$ j; a9 \# ?

    错误(Error): JVM 系统内部错误、资源耗尽等严重情况,程序员不可控制

    例外(Exception):其它因编程错误或偶然的外在因素导致的一般性问题,程序可以控制


    # U" a* j- ?4 _' |  d3 h
    • 什么是预定义异常/ d( I* D5 g7 [. H

    java程序中预先定义好的异常叫做预定义异常


    0 p4 v1 P5 f- @- J! ~
    • 简述自定义异常的规则9 z' X+ _5 M1 F- o! Y7 Z; A

    写一个类继承Exception

    用户自定义异常通常属Exception范畴,依据惯例,应以Exception结尾,应该由人工创建并抛出。


    6 D+ g2 d8 }9 f9 @8 B5 A
    • 什么是断言?
      8 _9 G7 t! d, G" T4 h6 g, }# B

    用来证明和测试程序的假设。


    ; x, Z5 H) b& B9 \4 s& t
    • 如何使用断言?举例说明! S3 w8 u. D8 F

    一种是assert<<布尔表达式>>;另一种是assert<<布尔表达式>>:<<细节描述>>。

    assert a= =10 : “这里a等于10″;

    % @% w5 ^# o) P& z

    科帮网-Java论坛、Java社区、JavaWeb毕业设计 1、本主题所有言论和图片纯属会员个人意见,与本社区立场无关
    2、本站所有主题由该帖子作者发表,该帖子作者与科帮网-Java论坛、Java社区、JavaWeb毕业设计享有帖子相关版权
    3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和科帮网-Java论坛、Java社区、JavaWeb毕业设计的同意
    4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
    5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
    6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
    7、科帮网-Java论坛、Java社区、JavaWeb毕业设计管理员和版主有权不事先通知发贴者而删除本文


    JAVA爱好者①群:JAVA爱好者① JAVA爱好者②群:JAVA爱好者② JAVA爱好者③ : JAVA爱好者③

    红红火火恍恍惚惚
    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    18#
    发表于 2014-12-03 12:49:03 |只看该作者
    其他开发工具和技术' i4 x5 _8 F8 N8 C
    Ant& v1 {) P3 t. h$ E, z
    Ant是基于java的批处理工具5 @% j/ Q* _  `+ |% [& C( x
    + j: ^7 H$ B2 w9 H: ]
    一、配置ant的运行环境
    * r9 h1 u9 l2 J4 L
    . D; c: Y) }2 f4 i7 K; [* }, `/ ?- u1.将ant的bin目录添加到path中) X5 Y, M1 L# t

    ) H8 n9 D9 j7 R1 S/ X2.配置JAVA_HOME
      Q/ I( B, |3 I, ]: K; {% G, Z
    3.配置ANT_HOME
    % I- h) |( n: @# D" ]' }1 d+ P' w8 W  l; Q  G6 I, V' ]5 O
    二、配制build.xml文件,该文件放在应用程序的根目录下3 X* Y2 T. B( q% W! f
    * I: N. N6 P; T
    编译java文件
    + s6 e: z7 A  F" E: _( o: D* L" [2 j& g6 }/ B
    执行java文件# z9 `( I% i( C3 P1 Y3 H( i# ^

    5 g) r( I1 {9 E! Icopy) T, U* H8 @& U' N1 R% j

    8 F4 Y) ?! A$ M4 `8 Q删除3 W. W. ^, N& Y, h. e: p
    $ a, q2 j3 F% r6 D- ?
    打jar包! e6 f2 \1 _3 d
    . C4 A+ J* W* u  T/ A! J
    根据注解生成配置文件
    : F- W3 o5 S7 \' ~/ g- U9 e! a$ ]" z2 `/ N$ X' {" `3 z$ d
    Xdoclet
    ( i6 S  Y7 y' \4 @通过注释生成一系列文件的工具(txt、xml、java、html等)' C3 g7 V7 K* m

    7 X# C; o, j8 R+ ]: p9 w- Dxdoclet本质是摸板技术+字符串的替换6 ?. A7 U7 V& ~4 y' h! p

    & _- Y. H! k& L+ A- C% Z1.在java文件中写符合要求的注释(将hbm.xml文件的内容搬到java文件中去写)
    ) T% |: K7 H# B2 Z" |& [" H1 K" n. \
    1.1 在类的上面 写与表的对应
    3 |) |5 d% D% ]+ K# a$ L- n( L( [+ d1 ~' p- Z, b( ?
    1.2 将每一个属性的注释都写到get方法的上面4 [" v& U9 F+ {  |4 v, ~

    - M0 ?: E' R: {; g) l( A+ [! {2.在ant中引入相应的task来驱动xdoclet- [  L1 K# w& s6 S9 @" ]
    - ?4 ^- e. Y9 N1 v5 Z$ y

    9 ?; j( ?& i6 y: @0 o  {. R
      q; z3 l; ]% V+ flog4j日志管理# g8 U& q( i& H" y/ G
    1、是什么?
    , x, p% a6 {7 l+ Q" F
    3 W6 ]# e$ c4 h" F, V3 T+ S在开发期间用来测试、对整个日志信息进行管理的工具
    # [, M$ n+ a; m( ]! i* ^4 C6 O, o7 Q5 g# ^) O! H; G
    2、功能$ R/ L' H- O+ K; G  k! B
    $ k) U$ m+ A+ X8 y1 k. I
    1.控制输出的目的地  X5 p, y; Z. l( N& m' h9 d7 p/ i% \
      Q- E( j* t7 K8 b1 h
    2. 控制输出的格式: a0 @9 d. P  J, X' Q1 p. f
    8 Y$ O; H8 C1 z. H
    3. 控制输出的级别( c' [& T4 L( U. {0 k4 M
    * A; o( f7 n/ K! J' [/ ]9 W1 h
    3、日志的级别
    + r8 J+ i- `/ T( a4 [8 F8 a4 s( g; ]- ]0 |
    1. debug 调试) b. w: B3 u0 S0 j
    - r2 v* C3 E+ X, h( B  H
    2. info 给用户的提示信息
    # _% C  l2 X' w: c6 a& d- `" t, y3 F  G( r; a/ W7 M3 [
    3. warn 给用户的警告信息+ i/ Q4 R) r4 X8 Z  o; J" J

    ! L+ m$ N% n/ K1 S9 G) H4.error 给程序员用来调试3 E5 ?* M( e' p' O' P+ _

      j8 ^5 n) f8 v4 U5 |Debug—-〉info—-〉warn——–〉error+ p/ w* R. |( B. Q: m# S$ n

    * V0 S$ G8 n' S/ x4、配置- o. c& V# R) t; {

    5 r3 C7 n3 c, ]+ J  d# L1.配置级别
    3 _  I4 a! P3 `; \
    ( X) }+ _+ U5 ?2 T3 A; i2 z' p( R2.输入源 (控制台和文件)
    0 K3 G& C5 c7 w: v# h. M
    , F* z! p, R$ q% F6 l$ f3.可以进行分包控制
    * t( [. F4 d* S8 v1 m) V
    . j6 p* O. d: ?# U) MLog4f.logger.包结构 = 级别8 c, t( X( R/ p) V5 d

    . j; f& @" v; q9 t4 m( K9 Y5、使用5 [' t$ G0 h& b2 J- S+ r) E
    ) q- O2 q$ E5 t% z
    Logger log=Logger.getLogger(Test.class);8 V) f9 C- S9 z+ E

    - f2 a# I/ L% F- |    public2 j$ q/ P9 K/ j' ~' T+ ^% L
    void t3(){# H, x2 J  K, S. T% b
    , Z' P& y) h1 Z8 E1 z7 S1 J+ @4 ]
            log.debug(“this is debug”);9 }/ @/ ?. o* s( L; R5 B2 r0 G

    ! b& t& ]8 J$ C, y7 j/ l2 Q        log.info(“this is info”);
    9 g1 E; ~2 }1 A; Z  N! \* M& `( O
            log.warn(“this is warn “);# R, t% s, I1 y1 T1 f& B& S1 W

    6 Z! e8 j1 P! F' l- d        log.error(“this is error”);9 }2 E  D& w6 M( _: V
    6 M/ H' d0 _. p* R/ Y& Y8 Y
        }2 x: O$ {+ z4 N  E) |

    ; y  P2 w1 ^' R. _; r( T" d7 KJunit
    ' [6 |2 `! I" R  |0 W1.是什么?
    ' m& T4 Z0 h% y
    - @+ D% p" F1 d  F, M# T4 p单元测试的框架- w% G) h9 G0 }& L8 Z" Q

    3 w; M- z6 \( i2.怎么做?3 K4 |& o1 q& X
    # A+ n& o+ p+ w+ ?1 M  x
    写一个类继承TestCase5 U* R; F! b& c1 z3 X- ^0 N) N

    , y* N+ g' x. N& K* g: L6 |0 a测试的方法一般都以test开头并且没有参数0 J9 z* a* w- l6 @" |9 _
    + r5 Q1 E' P, d1 y; F+ c3 O
    在测试方法前执行的方法public void setUp( )
    / k& E2 \* C9 _5 j- V7 W& J
    0 y, J0 Y2 G" S5 u) \在测试方法后执行的方法public void tearDown( )' y1 ^4 H$ R" P0 C* U+ o
    , c9 Q6 X* c, f( v& M! \
    error和故障的区别
    % @* W/ A6 B# e$ J# i. w# V. p, @# _+ p8 d: M+ ]! e, u
    error :代码有问题9 d" X+ `1 N6 ~5 Z4 K
    * o+ U/ K" r7 D! [
    故障 :逻辑有问题与祈望的值不相符合
    5 h* A+ @7 r. d
    1 ]4 K, \: \! }- ]; }生命周期
      V+ x7 ^) s0 a! X( L; |* Y
    3 i( E) k# r" w4 d: _测试—〉SetUp()—〉testXX()—〉tearDown()—〉结束;2 r2 w9 i: v0 F" t$ P
    1 \$ Y# _3 f! [% ~; N! I
    TestCase套件5 v& ]$ t) [& X4 A( f

    9 K  |# W* v2 @% apublic class MyTest{6 X2 [! p0 y# r9 E% a

    & q. E5 [. W6 _$ c9 r% A) s        Public static Test suite(){4 k) U1 ^# |! i" w
    ( Y+ e# M. \  Z+ h
    TestSuite suite = new TestSuite();
    # c  Q, G; O6 n0 N6 W5 z; s, U" L9 }/ s1 }$ C! l5 g* b
    suite.addTestCase(Test1.class);
    . g2 B- U6 p8 `6 E; ]" z, S1 q& j8 M8 ~' h
    suite.addTestCase(Test2.class);2 N8 j! j# C" T3 m6 M1 o

    # }0 o/ Z  [: H  f5 ]}2 p, w+ L( c/ P. F- y, o8 t) E
    3 q) C% n4 \/ a! f5 T% B: U
    }
    3 v3 H- j/ j1 a$ R7 p
    9 W" n4 N5 x1 f# y) r- J- c # p. w  _4 r, B1 W2 S5 \! G) y

      x3 f# \0 y: R& y! U& s0 hAjax9 _0 k9 c2 ?, {- w4 P0 l+ j3 _/ V5 {
    是什么?
    $ \" ~& b" t# dAJAX即“Asynchronous JavaScript and XML”(异步JavaScript和XML)。是一种创建交互式网页应用的网页开发技术。
    ' R) I+ l: O6 n2 G) r0 E% S9 \4 P$ z1 c$ g
    无刷新页面。; d9 y. W/ J  F( n  R
    5 L8 |. T. z8 H$ M% v$ V- j, i1 p
    有什么?) [7 ^& N, u$ a+ G, N$ D8 N; |7 q5 j
    AJAX是多种技术的综合,包括JavaScript、XHTML和CSS、DOM、XML 和 XSLT、XMLHttpRequest。& N* ~) i5 q( I: x' E8 F- a4 h1 U) ~

    . N- a0 a* l$ c+ K能干什么?
    ; _( n2 {7 s, j7 K, e5 W$ ]使用XHTML+CSS标准化呈现;7 o4 q$ R  d1 e2 d1 d
    使用DOM进行动态显示及交互;
    : Z+ x% X3 B5 F+ z5 m7 g使用 XML 和 XSLT 进行数据交换及相关操作;) N% r% l. j- @# X" x# I( C
    使用 XMLHttpRequest 进行异步数据查询、检索;, c& T8 {' t7 W
    使用JavaScript绑定和处理有所得数据;
    8 H1 l- k. ^( C
    1 o  `4 k/ x2 A4 ?, [0 V- }5 k+ [传统的web应用允许用户填写表单(form),当提交表单时就向web服务器发送一个请求。服务器接收并处理传来的表单,然後返回一个新的网页。这个做法浪费了许多带宽,因为在前後两个页面中的大部分HTML代码往往是相同的。由于每次应用的交互都需要向服务器发送请求,应用的响应时间就依赖于服务器的响应时间。这导致了用户界面的响应比本地应用慢得多。
    : x6 U: O% U( d7 A* O: @% p1 G6 |  _3 k% Z* k2 }! t
    与此不同,AJAX应用可以仅向服务器发送并取回必需的数据,它使用SOAP或其它一些基于XML的web service接口,并在客户端采用JavaScript处理来自服务器的响应。因为在服务器和浏览器之间交换的数据大量减少,结果我们就能看到响应更快的应用。同时很多的处理工作可以在发出请求的客户端机器上完成,所以Web服务器的处理时间也减少了。' B. N  [5 x* f3 s5 |" J( W
    + H+ i# f8 x0 K+ h: ~& u7 ^
    使用Ajax的最大优点,就是能在不更新整个页面的前提下维护数据。这使得Web应用程序更为迅捷地回应用户动作,并避免了在网络上发送那些没有改变过的信息。2 F3 ], s9 Q: f) M: U3 L2 l7 @

    4 [: T- }' A* o4 E4 J对应用Ajax最主要的批评就是:
    - H6 e0 [4 o: j4 y1 q1 它破坏了浏览器后退按钮的正常行为,就是用户点击后退按钮后不能看到之前的数据;1 z5 T1 Q9 @3 _4 p
    2 一些手持设备(如手机、PDA等)现在还不能很好的支持Ajax;% N' i) U( \" z2 V; _1 o& @  D0 }
    3 用JavaScript作的Ajax引擎,JavaScript的兼容性和DeBug都是让人头痛的事;
    $ \; @9 V% a* e; |4 Ajax的无刷新重载,由于页面的变化没有刷新重载那么明显,所以容易给用户带来困扰――用户不太清楚现在的数据是新的还是已经更新过的;现有的解决有:在相关位置提示、数据更新的区域设计得比较明显、数据更新后给用户提示等;
    # l# J& H# c& A3 y& ?; v& s9 N6 G0 `& B) F" O( ^9 j
    怎么做?
    + H  Z* I% F5 J<script language=”javascript”>, z! @( Q: X) A  j% t
    ! U. d$ c9 Y4 L/ w" b! [8 g( Y
    var req;
    " G8 ]8 h9 l) G' P. q
    1 G$ w" F. n8 R5 [function add(){, L/ Q8 O3 D" j! y

    / m3 s5 l, a: ^: ^- p! T0 F1 I- l//1:创建用于传输的对象
    $ B% c4 w; h9 {1 d  r* K
      U( q+ f! l' g. u( @4 preq=new ActiveXObject(“Microsoft.XMLHTTP”);: ~) `0 M8 L, ~( c. k  R

    & U3 `$ S: y' |( b% x9 h// 声明返回后,处理数据的方法6 o" O+ _5 U* o, Z! a) V0 h
    / s+ p/ o* ]) K
    req.onreadystatechange=manage;% Q! i8 S' u9 m4 z
    8 J- _5 w* t9 n, \
    //2:准备传输的内容1 G9 w' e- \$ O" n* c: e
    9 |( B/ M8 D. ^8 U+ o4 m
    var str=”test1111″;
    0 L# I) r  z0 C* R4 c1 k+ [" F" g. d
    //3:发出请求( A/ q2 d( [5 h' Y" j4 j* t+ a
    - e& e  X# t6 d. r' a4 J1 q
    req.open(“GET” ,”/others/ajax/test/t2.jsp?str=”+str);; ]& m$ U. p( h' v* a# j: O  p9 `4 e

    9 G0 o) j; C' |, h7 Creq.send(null);
    0 y1 I& `4 @* p% @  p( F! Y- L: Q# z: y% A$ B1 F$ @8 e% f! e. a
    }. e5 s+ c$ V* |; y& Y

    $ i8 N. N8 ~. H4 z8 T* j2 T//4:接受返回并处理
    4 L9 c7 w  G' u; Z! j$ B& D  Q# u- s+ m) u" C4 ?0 X6 a" j' j
    function manage(){
    ( O3 v) W. Z( a# {: P4 ^( Y. P& f7 ]3 K0 l9 q
    if(req.readyState==4){
    5 Y) S( D! T6 W9 I/ g' W4 w% F
    / t" }# f  b* R0 Y4 [) Balert(“r==”+req.responseText);
    # J4 |( L+ m* w* n1 ~' R8 w# h" i  [3 Q+ I  d, q1 N
    }. b: Q  \. w- C% d9 x0 A% m  g

    . L, t8 A7 G: a7 W$ a}6 S7 V1 B; I. Y/ b$ i
    , C; Z& M% P9 v& A
    </script>
    + d' k- T$ I5 U3 n$ q8 }) }
    ( X  y9 K, J2 b% N, L6 _, y4 c( \readyState的取值如下:
    # `! q' x+ `9 Q! w+ b1 J: R7 _; p  x& q4 R
      0 (未初始化)3 N5 d5 K; L  D; [% _
    ! \8 H- ^4 f: a) x, R) a
      1 (正在装载)* [0 T8 S: M+ \. J+ n6 ]+ ?

    , G$ C# F( x& S/ ^* A. S  ^/ K  2 (装载完毕)
    9 `2 `# c1 M2 u& k. X* D: j
      j: s2 `: y6 |  3 (交互中)
      h2 E7 X4 Y8 E
    + [: ?: a5 B1 O5 t& _& D  V  4 (完成)
    2 w0 i9 M1 I! x( e  V* ^  m) ^( }2 `- ^% F( J% y

    & a. k! p, d+ {" s* C0 t  Q( W6 w* X% a) D
    原理2 O, T4 A" n1 `% C" [! y
    Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,可以是xml格式,也可以是一个字符串,然后用javascript来操作DOM而更新页面。
    0 D+ Q4 Q# J( @, Y" R
    4 O  P* [+ D" i' a- u3 ^+ CDwr
    * b) z$ M- {0 N1 \是什么?
    : {5 t, z- W1 w$ g& ]DWR(Direct Web Remoting)是一个开源的类库,可以帮助开发人员开发包含AJAX技术的页面。它可以允许在页面中使用运行在WEB服务器上的JAVA函数,被调用的JAVA函数就像是在页面中JavaScript方法一样。
    2 Z& F' f8 T; Z1 C) |$ h9 \6 P' k7 t# Y! b/ n2 D
    有什么?
    5 I; S# N' I6 Q$ `6 f2 y它包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据;另外一方面提供了一个JavaScript库可以帮助web开发人员轻松地利用获取的数据来动态改变网页的内容。
    5 v& h  x  d8 v$ N/ f
    ) G1 L3 i5 i/ ^& A+ G7 w ' s( N8 g( u7 D8 R( N, r. _
    . ]8 e$ O9 ~6 @; l% x* J
    能干什么?
      v3 A0 t- x% A7 I# ]动态地把java类生成为JavaScript,感觉调用就像发生在浏览器端,实际上代码调用发生在服务器端,Dwr负责数据的传递和转换。这种从Java到JavaScript的远程调用功能的方式使DWR用起来有种非常像RMI或者SOAP的常规RPC机制。/ ~2 Y- C5 G. t, O! d1 O; f6 l' |
    2 o0 x' O, Z0 J2 O/ e4 h

    & a7 t" {) X8 A, W  M7 b; d5 ^+ C9 K( q/ p4 P" ~1 f$ L
    怎么做?; M4 m0 q  S/ q2 y
    ① 编写配置文件
    0 b/ I- D) v% A4 |8 Y
    7 Z3 j+ Q6 P+ ]9 Gweb.xml
    : h% N/ L+ |# Z1 V* U' ~. \) Z; y: ^" B
    <servlet>2 o( J, W# D4 |$ C2 G0 N6 f: h$ ~
      @* D" y  w0 M7 r1 Z
    <servlet-name>dwr-invoker</servlet-name>) O. v: O4 V' q7 U& v
    9 k, G6 m# _% u
    <servlet-class>
    0 W1 [* a* F1 }" K0 W* m* M  f0 `  f" E
    org.directwebremoting.servlet.DwrServlet; y$ s5 ?: U1 r7 h" s6 i+ o* I

    4 ]4 }& r/ J- \" p$ w4 J0 K5 V</servlet-class>7 Z9 b9 z- b  K3 {

    9 s3 i- i2 u" {9 A( X<init-param>
    % ^; ]$ @0 u* F; A5 [8 B# g& D1 {% r! @9 K2 ?0 }* L" P/ @
    <param-name>debug</param-name>- U  E' W6 r+ B* |9 Z9 G8 d) u0 X6 i
    + A; ]2 c! m* h9 V' O3 G1 Q6 \
    <param-value>true</param-value>
    - O9 x5 a1 d8 }3 D1 a
    ; ]: D3 W/ E7 q1 l8 ^* J) d</init-param>
    4 L" |% v) ~1 Q; p2 C+ v7 H/ t" G( Q- Y  b% A. J2 G
    </servlet>
    " {/ ?( b' \0 L& y$ }- B0 a3 q' n4 S4 \% |
    <servlet-mapping>
    2 j5 l7 r6 a) Y0 `- p
    7 T- v% u  d* N, A( Z, e6 ^<servlet-name>dwr-invoker</servlet-name>
    + N" F( E3 M6 C7 W- ?
    2 {( }& J3 B$ G' G<url-pattern>/dwr/*</url-pattern>; e$ T+ {, ~& w8 X
      S( ~" |& u  P  X# [: M( S  A
    </servlet-mapping>
    5 n% u6 e2 @# Z: _
    4 Z. n7 [$ j" pdwr.xml( {7 g5 X: B! b

    1 |* l* ?# B/ O0 t<allow>2 s2 k3 O+ ^& j0 c2 z

    : n! @' F$ x; C/ T! ~" n# m<create creator=”new” javascript=”kc2″>9 z5 X" Q9 X8 Y5 B' j
    9 N# L6 S; g& q) @) c7 f! Q9 D
    <param name=”class” value=”dwr.Service” />" p  {$ K. d% Q4 ]. I1 f
    5 @; F9 v3 k: c+ {- g! S1 q" D5 W0 h
    </create>
    1 N' o0 R/ b- w0 }8 P, u" Y; \* d4 d  f6 {& m, i' [+ ~
    </allow>
    / m/ r  b5 Z' i  z1 b& Z3 D/ L/ X
    ②编写service3 q; \. k! k5 }. c
    7 Y# L0 G0 t  g# W0 ?5 _! G
    public class Service {+ I9 Z4 _/ n' |3 A; w# e2 |& v

    8 H  t8 j. J% T) |7 opublic String sayHello(String yourName) {9 F- L8 ^0 S' K. k. C  ~' g6 P
    0 |0 r0 m" Z) ^; y0 w* t' b/ S
    //可以是访问数据库的复杂代码1 @; R0 [# M4 B. n  r2 |' S" Z
    7 J' z8 K' ?; R
    return “Hello World ” + yourName;
    % m$ S( I# ?' y( ^3 ?6 S. D) B6 k9 B& a  }
    }" z6 o  ]- Z  i

    3 m2 @& j& A/ g4 ~3 e2 f}5 y, O; u% Q3 o7 I+ Z
    6 g6 U1 |% O2 {* y# v8 P
    ③测试DWR$ j; A& R- K  n
    % o/ q8 G; x! L* o& T0 P  b( j
    将代码放入应用服务器(比如Tomcat),启动。
    ! A5 y9 `- ^2 u) r  x: ?' E  O6 R) b+ {$ J) M+ t3 e
    然后在地址栏输入http://localhost:8080/你的工程/dwr
    0 K; m8 D7 q( w& w1 c/ C) r  q& ~* M6 ]; O' r- |+ P; \% ?* {% \- b1 m2 d
    ④编写jsp页面- l1 i2 B' a% X8 K) S8 ~/ Z/ n6 ~
    + a1 }/ e5 \- V6 Y# A. ?% _" u  B
    1) 要引用3个dwr的js,其中engine.js必须要,如果需要用到dwr提供的一些方便的工具要引用util.js9 \! O5 ]* @% P
    & V+ G" Z) o  v  c1 ~0 a
    2) 然后还要引用dwr自动生成的js,dwr/interface/service.js,注意js名字要和dwr.xml配置的一样
    2 y& N7 E. z9 _4 V7 D
    0 z" k4 Q' u7 ?$ G- r3) js里的service.sayHello和java类的那个有一点区别,多了一个参数,用来得到返回的数据
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    17#
    发表于 2014-12-03 12:48:32 |只看该作者
    事务
    ! l5 T7 Q3 f8 x/ X" X: I2 bACID( D6 }& W$ T; J( q8 t- c
    (1)原子性(A):一系列的操作具有不可分割性,要么成功,要么失败2 s: @* y) C" q0 R- a9 k

    ' K# \) x  G9 Q8 t. `(2)一致性 :操作的前后满足同样的规则,保持平衡。
    ' s  k- x  C0 E& f7 e
    ) a2 g2 g) W) i7 y6 T5 a(3)隔离性 :在事务运行的过程中。事务内的数据对外的可见性和可操作性(必需由数据库的支持)
    & h, u, @- n7 r) O7 A
    : D6 L5 `. x. H(4)稳定性 :保证数据在事务的操作的过程中不会遭到破坏,而且是永久性存储的' ]% J; i( f9 a
    % i8 G4 }# I2 d: f

    " u( j# ]# N, C- O+ \8 z
    - X! O: t" b" B% _) Q2 e. }; t/ w事务模型
    ) ^6 O1 _$ n3 q/ _  Q8 Q. c(1)经典事务模型又叫平面事务模型(JDBC) 事务不允许嵌套
    , ]' F0 w: A( O5 Q7 j
    ( j+ M2 p% c- f(2)嵌套事务模型
    & T1 }5 D: w% S  E" P+ b. q7 |4 I. o# ], T% z

    / B# o3 Q% T" }% w3 w
    9 G; @' t) Y6 R事务的两种方式
    8 Y* ?3 G+ n2 L$ L4 H6 Y(1)声明式
    5 \/ ^9 `* \; d9 Y# L# U' E6 z1 [& W
    在配置文件中设置以下6项5 ]! M0 x1 W- W* P# g: O' j& P
    + ]% R* n; G' j$ {- _' I  u  W! p
    (1).required2 S  z  N* s7 n* M
    ) B% I0 I2 c2 t. Z6 A
    如果客户端没有事务 在bean中新起一个事务
    & }( b# w6 w; l8 G
    0 M- n& M7 e& w( a+ P如果客户端有事务bean 中就加进去
    % n7 U$ j; `5 \
    - j* b& R+ u0 ]. S9 W' k(2)、 requiresNew
    * P( o# ?" G/ O* ~# ~2 g( E3 B" k1 w" ~( S
    不管客户端有没有事务服务器段都新起一个事务
    $ `0 S9 ]3 @$ F+ y4 H( ~6 A" Z' x  j: O7 R: H) X
    如果客户端有事务就将事务挂起$ o1 u3 c  s$ K
    : V9 B9 D& S5 O" ^; E/ ]( v, u
    (3)、supports3 G1 f! |; \4 i+ T5 r/ [
    $ {6 ~% R* u: {6 |
    如果客户端没有事务服务端也没有事务+ `4 ?# `  R) B" A5 `% C2 Y3 W

    3 w  X* {$ i" O* y, j/ f1 w如果客户端有事务服务端就加一个事务
    . c# [+ R! j6 U; j  ^. a: I* P3 y, K8 l! e8 \: E
    (4)、mandatcry
    ' {' ?0 b, o6 s4 l, E  Y, @! w7 s/ W5 W1 a9 A+ H* T* R6 Z
    如果客户端没有事务服务端就会报错1 i7 I; o) F+ i- z" [2 n, N: I
    , ]- J1 ], g2 I; @
    如果客户端有事务服务端就加事务  g3 P3 [; R% F2 x6 {
    & c9 D8 Q) J& V
    (5)、notSupported( O8 M/ S: ?! h/ @0 V: E
    / V" x8 H$ a8 F( G" r
    不管客户端有没有事务服务端都没有事务+ a& v7 D# y7 K/ f
    0 V) X, y$ \4 b
    如果客户端有事务服务端就挂起
    2 r' `% I/ [+ [
    # Z+ ?; C' Q- ^8 k  A. _0 O(6)、never
    5 T# I2 i/ K7 }& S4 i) g
    / A4 D. l% J8 n8 W1 b% _; a. ^不管客户端有没有事务服务端都没有事务
    ) D/ d. L; ~3 X1 P* `
    8 n8 W8 v! l0 z! t7 B+ x% I; p1 V如果客户端有事务就报错
    # V9 f0 y1 M2 |3 Z- y* b* A1 O9 J+ C8 K! Z3 c
    (2)编程式事务  {* ~) u+ C& @' @% E' n5 h

    % H+ J& A: _" e4 M1 ~  ^  bJavax.transaction.UserTranscation0 _/ E& k* K, y' A& T/ B: L
    8 n9 {0 f+ R" x. S
    JTA 事务可以精确到事务的开始和结束( A. r% I  B+ h" t% d1 J  u

    , s( w' `; F+ m# F# k % v8 ]' ^; }0 ?9 |1 r, G# H

    4 J8 G1 k; l3 g# |) C. H7 l事务的隔离性
    1 g+ `8 b1 K3 n( y, d, D+ g; WRead-uncommited
    . i4 a, K$ Z# A* ]/ ~( F) r
    , w4 M1 r7 ~9 {7 z* ?读取未提交的数据(基本上没有锁)脏读,存在不当读取的问题。
    + K  [  I! Y+ t
    ' \  {, r! Y+ W; [  gRead-commited6 {. v: V" j1 {1 K7 X. Y

    3 T0 t3 j+ B' b2 W4 l* X; h读取已提交的数据(行级锁)/ y: n* G, n% M. Q: p" B
    : d; N* B1 G  d& ?& I
    无法读取已经写入,但没有被提交的数据。, E, V- g1 V1 o, @

    * D2 H& B+ d% k. P" \+ Q) E! S) sRepeatable_read
    9 H/ }4 n! C; r* M6 I# f* n1 L% ~
    % a* K* R8 S/ i1 ^0 p读取的数据不允许修改或删除
    * _! s' G5 F: j8 d8 t0 {; D5 W7 E  u& _7 j# T
    不可重复读(行级锁+不允许修改/删除)1 x2 M% l  J; E
    ) ^( T$ A: Z* |  }/ x
    Serializable
    9 n4 g6 P6 P- W  P3 ?0 \  d
    ; {. J0 r/ `) D+ }: F6 E幻影读(表级锁)3 z% X; n+ A$ N3 q

    : j/ K. y% h+ G$ b) @9 A
      P7 N9 ~) x8 W, g' j3 a& b- V
    ' |3 h7 l$ c& wstruts3 g: K8 `& W& \
    开发流程
    * g1 |4 C* a2 |# P' G; G) W* C5 s9 p1 p5 k$ S. V
    1、创建表单
    1 [1 T) B6 J3 L& D3 k+ n5 n
    8 d, b8 D$ H% e7 j  _7 c2、从表单中获得输入
    " y2 x  r8 B" u( j6 |
    3 U) i9 N) j2 [: C8 f/ g: @3、处理输入(业务逻辑)$ _% A9 D# U# w9 S' C
    . [" R. M3 o. b$ ^, [
    4、根据动态输入改变输入流- u/ J3 z0 k' D  V6 U- @. ?1 b
    1 r+ S8 c3 K, [( W
    要完成上述四步,我们需要创建2 a2 C# i( j7 B2 i) J" c) J8 W
    7 N4 K# p/ e8 Z; v& A
    1、一个ActionForm
    ! |& v1 t* Q, g% l. g4 I6 h9 O! E* }! m5 a& n) m3 [8 Q: v5 w; C2 M
    2、一个action! k( _6 A; l( P5 ]2 Q$ e

    ! P# y0 B& {- L6 s) h3、一个配置文件struts-config.xml! w% K; s6 z- u% v" X1 ~4 V! _
      C9 {2 a+ B' t# j! M8 t+ {
    4、创建页面
    9 ~. W: s9 Q6 R5 Y$ K" D( V8 _& J; ]+ v( ^
    创建ActionForm  J5 a# |; Z$ l  Y

    ! e& z0 }- _% B0 K& A1、写一个类继承ActionForm" `3 _, a0 q  b5 e
    + f! ]; M7 ]& }6 T
    2、私有的属性- c) ~8 X1 x0 ~- @% \6 L# g! G( l

    / k1 A; P. X3 d  l1 p3、相应的get、set方法, \4 ^! \$ T& ?4 e* K( u

    * |9 h% J/ P' h0 p! L7 M0 K/ U% @) \4、重写tostring、equals、hashcode三个方法
    ( ]0 C# |9 a; X( \: `( e% y
    6 U+ x, C: i, F, h* H6 q- G" u( w创建action
    ; ?  @% A0 g# K% c) }. j+ P
    3 Q6 H5 l2 d8 }  B1 K1、写一个类继承Action
    / R, o! k( }1 I: @$ V; {) u0 _' y0 G8 P. j( C: x
    2、实现一个公有的方法(回调方法)( v6 }, {" t3 q; b3 v

    $ B0 V& R9 R, k, U- k" spublic ActionForward execute(ActionMapping mapping,
    ( |) T& A6 ]8 `# u" Y; C$ Y; k
    1 |" }7 L. Q4 l  o3 c$ [ActionForm form,/ F; c# I! L  V. @

      O- x' E* Q/ r* O. AHttpServletRequest request,* q+ a* r+ ^- W" `

    ! w7 ^2 o, I+ u3 h! EHttpServletResponse response)
    4 x0 f7 y) Y4 e+ m/ }( W6 U: A5 T1 g  r/ i
    {
    , A2 h% d* r$ o9 u; U/ L
    4 N, Y) j  @2 ]1 d  s$ t//1.收集参数& Q; v' G* f% j3 y7 y
    / r6 y/ Q2 _1 |9 y8 k: R. p
    MyActionForm myForm = (MyActionForm)form;
    9 E" `( Z( Y, S( R* a  W+ x' _/ A- s
    //2.组织参数1 j% U& L! }/ \- Q
    , a0 p- v4 z9 \& Y7 ^- T+ h
    ; n" E7 A& ]5 K, m" v) ~1 b

    3 u* D! O9 u! Z8 C. X//3.调用逻辑层
    ; ^- a% b7 O& C( l! a2 Y4 Y& |1 i/ ^9 f$ l$ F
    boolean flag = true;. ?* c1 I  a3 U5 z; I: M! B# q4 e
    0 M# ?/ O& n+ m& J+ X' d
    //4.根据返回值来跳转到相应的页面
    : D0 R' g( @4 {: R8 E- H% i
    " E$ C6 r8 Z. i/ Y' L& q( MActionForward af = new ActionForward();8 B. @% v2 m" @, D0 r, T6 W- H
    3 L4 K; a5 L8 H; Q# S6 ]8 D
    if(flag){8 w6 K) O5 D: o: A$ O1 \
    . T/ `' n+ U6 C, t
    af = mapping.findForward(“1″);
    * T* ^$ o- f1 N! P4 o
    8 M# Q2 P0 P/ v- h& ]}else{: A0 Z8 N! \0 k- c- ^1 ]

    7 c3 Q$ i5 {7 i/ Gaf = mapping.findForward(“2″);
    : |) e) b7 P- ?
    0 t6 F4 l$ B. o) c0 G$ e8 c1 U}# N! a; |4 }& j) j% b$ K- m
    7 Q4 _# \4 `& x0 g1 ^
    return af;% k, j% p8 `: b! E, h6 y& o' h

    3 I* S. a! a" ]( h}+ D3 j1 V$ p7 D8 b+ ~# F& F& \

    - D8 w# r4 w4 p& |配置struts-config.xml文件6 z7 `/ H0 Q7 a5 o; V9 j
    $ X% |7 Q  _, l8 ]6 S% C
    1.<form-beans>
    # V  |5 O9 m% L5 G$ A$ C3 S" i& S' I; O% S! p, {) S1 D
    <form-bean name=”myActionForm” type=”全路径.MyActionForm”/>
    3 q, U: [8 K: {  _) l/ i
    & m( v( \) {% u/ {, O% D6 G7 B. U<form-bean />+ q% U0 c( d3 W; s+ O

    % k. w' Y# r7 z; F/ d. U</form-beans>% Y6 Z6 m+ F& c1 g* n

    4 g# ]9 H4 e) ^% k8 Q. W5 ~- K2.<action-mappings>
    + h! V8 M7 r! [" Z' ~0 O5 z9 x4 s' W7 z0 W
    <action path=”/sll”) r0 `: |% x/ y% [3 @
    4 i) n9 i2 W1 D8 J
    name=”myActionForm”. b8 T, K4 v" n- y

    & v' R4 H  O. b3 E2 {8 otype=”全路径.MyAction”
    9 S* q: Q1 c+ @+ q" G3 X, D/ S3 ~* Z0 W- j; y9 l
    scope=”session”0 G/ H2 E. q5 ~% \( P2 Y$ Y/ e9 `

    3 w" f& ], T7 n% e$ F& `& \- Rinput=”错误返回的页面”>/ x( b# N# G' \( r
    1 V; Y* F9 X8 h3 k  P
    <forward name=”1″ path=”/1.jsp”>
    ( `: y/ |% v( ~( D, ~- Z6 M- \2 s' A
    <forward name=”2″ path=”/2.jsp”>$ ]* H' s+ n0 e+ `% h
    1 ?: O# _8 g, d' q8 [& H
    </action>
    8 M( u2 x5 B: q$ F& l$ W
    3 d9 ^- Z6 m* @1 t: }" M/ n# I* i0 c</action-mappings>2 `( O, u6 d6 K. _

    5 t3 h# S9 m: Z8 ^. B步骤:
    " ~$ O1 i2 O7 j/ d
    8 B- p% x3 r; H1.创建一个空的web应用
    / B+ v" e. x& M# d$ t9 L# z( d; U3 `! |$ S7 a# Z( N+ {- R
    2.将struts的包放到lib文件夹下
    / e: E/ I! l: v' L0 u0 A1 v4 I
    2 q% t9 c8 {, Z0 m; V+ u6 N3.将.tld文件文件和struts-config.xml、web.xml放到WEB-INF的跟目录下
      f6 c+ `5 p- ]- S8 S
    - R: p( e7 S- y- @' ^, D/ l2 O4.配置struts-config.xml文件和web.xml文件
    ! _- A4 i8 `5 {2 N4 y- h/ j8 I+ z: P
    5.在页面引入tag文件uri+ K8 h$ m$ d5 ?% {

    $ d' y: f9 m7 F  S1 c9 v2 QSTRUTS运行机制7 p6 h) g- s7 ~* F3 Z

    - J* C8 H' T6 n  @4 [6 d1、界面点击产生请求# u, z0 w) c$ }# N: L8 T

    , A' N9 F# o3 d5 u! e  ]6 h2、容器接到请求7 d$ n, }+ V8 O+ c* M/ k

    / a2 a/ D6 q* g  x4 g' ]+ n, z+ o3 w3、匹配web.xml文件中的*.do来调用ActionServlet# h2 o: Q( q9 v7 O

    9 L3 Q4 r4 ]. e% j8 I% g' `4、ActionServlet的处理7 u; O0 N5 d& F, `8 v4 @8 m

    % L. H0 J( s2 q1 [, g9 h4.1 读struts-congfig.xml文件形成ActionMapping, J0 G# B/ e5 j$ W, b+ ?
    3 w2 B- M; c& @/ d7 x  H
    4.2 通过path 来匹配Action类,通过Action的name属性来匹配ActionForm类
    1 ^+ f& l0 ^' v+ y* m, N% m$ T/ J; A! q( ?
    4.3 通过反射机制来给Form添数据
    1 M. i, Q  R0 \0 ^
    6 j5 \9 e6 K; g% [, G) W- U4.4 由ActionServlet转调Action的execute方法4 G1 o3 V6 V: o

    : E" e+ L; ?* z9 N6 p3 c4.5 得到execute方法的返回值,跳转页面
    1 ]6 ?  H+ @, z1 S6 |
    . R; s0 @2 C% X4.5.1 RequestDispatcher6 w: Y2 ^3 F1 Z$ B8 x+ \
    2 c3 `3 N$ J, r
    4.5.2 response.sendRedirect(“list.jsp”);7 b$ B6 W6 ?0 L. S$ t4 X4 f* X

    2 i1 e  N) H2 g/ A2 V7 ~
    9 k9 |( v( B6 h5 j* m4 b. {/ ^4 t1 o+ t" h, M
    进入execute方法  M, M& c" w+ I6 F$ K7 ], H

    : r4 E- G/ A' F( m1 收集参数( F, Z5 X1 W/ S, A  [, @
    ! ~: w( t$ ~( `7 T' V9 Z
    2 组织参数
    $ c& ^5 Y8 m/ e( u& Y- }: M7 v1 j8 k' S% ]/ ~" J8 v
    3 调用,逻辑层
    # x* d  P  ^0 G6 q1 l
    , o, h$ b4 @" L4 返回值0 d6 s9 L  T5 z

    . c. n/ X  t' e# u8 a6 B5 b4.1 选择下一个页面 (ActionForward)
    & ^8 g+ B! H0 b8 U9 e: `) C( f2 M  F5 \; s* n+ u6 e
    4.2 把值传给下一个页面7 P! P/ S$ |9 A  [

    ! r+ Y7 w- \0 F' f. l! {
    0 n/ H; K4 v. k0 i2 `. m6 p5 q8 {
    比较struts和struts2的不同9 q0 K/ e4 O# w+ w) c  [/ T

    , Q# K& m( V: g  M' ?9 q/ T* e3 aStruts7 d* i! t# ^7 W" V% G- K9 L7 U; h( F

    / q% x2 R  S, G: `; x, ?Struts2  a9 S! H" h" N' j

    & F; k# ?2 B! w3 P+ o组成        五个部分:ActionServlet,ActionMapping,AtcionForward,ActionForm,Action        十个部分:AcionContext,FilterDispatcher,ActionMapper,ActionProxy,Configuration Manager,Action Invocation,Interceptot,Action,Result,Taglib; U- O( s5 W: c) E* ?) D
    url        .do        .action
    ' Q. ^/ E6 g/ H& n4 c& N分发控制        AtcionServlet        FilterDispatcher5 Y. E2 a! T7 a- `) l2 B
    收集参数        利用JavaBean技术,将数据封装到ActionForm的子类中;
    + R) N2 B$ a9 p. p4 ^% \4 W7 j! f一个Action对应一个ActionForm的子类
    / m; L! I% X2 f$ ^
    % J3 n( }6 h( J4 I7 Y8 o使用拦截器将数据封装到值栈中。
    ( \6 C" c4 [4 Z# j1 b5 X% k; z使用域模型,一个Action对应多个值栈中的Model
      _* g" Q2 ]7 m+ Q
    $ U% n% o4 A# u& i* v% t' \读取配置文件        ActionMapping        Configuration Manager
    + [& O! z5 E, B! q& x5 {拦截器        无拦截器        执行Action前后有拦截器& X5 Z2 L+ x. B6 m
    返回页面        将字符串封装到AtcionForward,进行跳转页面        Action中直接返回字符串,通过Result跳转页面
    3 {1 v5 L. j4 {! v页面跳转方式        两种:dispatch,redirect        三种:dispatch,redirect,chain* L4 a5 ?; J; y1 |' n0 e
    值栈        无值栈,Action通过在request范围内设置属性,向jsp页面传递数据        有值栈,Action和jsp页面通过值栈传递数据,jsp页面通过OGNL取得值栈中的数据
    # N% a, f' N2 r) o7 g  G: K! g' m配置文件        struts-config.xml        struts.xml7 m7 }* Z3 l! M, S( E# e* g
    中文问题        不能解决(需要使用filter)        可以解决中文问题:9 @1 ^4 U/ @/ o2 N# _
    1、在jsp页面添加Meta;
    6 [9 J9 A; d; R! Q+ b  w& z8 X2 T3 T  j) a
    2、修改struts.properties中的设置。
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    16#
    发表于 2014-12-03 12:48:12 |只看该作者
    Spring& H2 ^9 S0 F& c: o
    • 是什么?4 q3 w# R* M% A% m( Q
      $ q! H3 U; O( y& M4 y2 P- ^

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

    % `. S+ Y1 S/ G8 {* t
    • 有什么?
      8 e. N: V0 |4 @; B. f2 o
      , W4 ^! r8 H" s! p- {0 l
    ! [; c$ v2 P7 g9 h

    每个包的功能:

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

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

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

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

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

    AOP :面向切面编成

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

    0 `4 b* t  t! o# t$ c
    • 能干什么?
      ( t/ y8 S7 v4 X$ ]3 W) v$ A5 n

      # ?% {4 e3 q, W9 ^) y# ~  v: p

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

    ; f% r* J4 s! s1 K2 Q1 {; X
    • 怎么用?
      5 {2 g8 p3 v, o

      5 Z4 H! X  J5 b
      • 搭建web工程,引入spring的jar包
        $ z8 u- z2 ~8 F: }9 w9 @( K  W
      • 在web.xml中添加如下配置4 v) d' m7 T" x+ S' K; Y/ [

        4 i5 ~0 u' Z+ C" Y2 l
      3 r( V% J5 c1 |9 Q! O
      : d/ e: O- G. ^; }) j8 c% a

                contextConfigLocation3 ], v: k* f! |3 _( U5 a

                classpath*:applicationContext*.xml
    $ M4 [# O1 X6 T5 {7 i, c

       
    " F( V) n& Z  D

            9 I4 `1 N& _/ }4 e( j4 G

                struts2
    7 I$ y7 ^# `1 {( i0 K" m

                7 P8 e- K. R- T- y

                    org.apache.struts2.dispatcher.FilterDispatcher. s: n4 O4 ~" G0 Z, C$ Q$ p# G

                
    3 E* y3 u+ w) @8 p

            0 `1 Z! z: v$ n6 f' e

            
    ' P( W, K. Z" U3 \( g

                struts22 I; I9 @0 K0 x6 M

                /*% g. {7 k; D& `- K$ `

    . @  g# j) [4 [2 `3 L. A: R' E# K

    0 @- d& u7 x4 g( i8 A5 P( M

                ( g0 g2 r0 U: f, ?% c: C

                    org.springframework.web.context.ContextLoaderListener) |7 C! Z2 K' G* N! e9 r7 v

                4 e5 l+ U; z( ]% F. b

            

    • 部署" O4 s7 X( y- B9 q: Z9 w1 E: d
      ' f( i, }  U' F9 W$ J! c# a! x; q

    $ v4 y0 z- P, o+ z
    $ p, o7 G; Y0 P; @! o! ?$ {
    & c! O: r& g! @  J$ D
    • 容器和bean
      2 _! o) V' o  \, m* n9 I

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

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

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

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

    8 v0 C6 z4 x6 v
    • IOC控制反转
      $ p* u/ f" o$ b  O+ m% u/ r4 @& A" o" @& a: ^' \/ Z
      * z( F$ ?1 i5 P

      4 G) y9 ~) Y1 ^' |& Y& @
      从前的应用程序想要得到A的实例他会直接主动的去拿,当用了sping后,应用程序由主动的去取变成被动的等待,由spring来控制应用程序所需要的对象
      + o5 {! i9 H0 C1 ~2 c0 t
      • IOC的优点' S; ]" c1 a* k( j+ G- Q- d; Y
      1.可以通过IOC来获得实例
      2.可以通过DI来获取注入的资源
      • 配置IOC的原则3 c% F+ ]: X' L9 H5 m
        • 一定是可变的资源才采用依赖注入
        • 一定是层间的接口或者是模块之间的相互调用才采用依赖注入& [7 Z4 x8 M' b% M/ z

    9 z* x* r8 o) U$ Y4 _
    • DI依赖注入
      1 d+ @* K8 g- I  e0 Y3 Y, U: f

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

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

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

    例如:

    在配置文件中

    $ o8 w8 k2 P3 U/ A) Z  X0 ?/ O" Y0 _& h
    / u/ H& Y2 Z& }. W8 ?9 n
    4 Z3 o+ V% D/ K4 w4 _! y; T; h

    在应用程序中

    Public DBDAO dao ;

    Public void setDao(DBDAO dao){

    This.dao = dao;

    }

    3.构造器注入


    - {# ]) v# l" J3 d. o2 t! G$ u& }

    4.ref 表示参照其它的bean

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

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

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

    6.lookup注入

    7.singleton

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

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

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

    8.DI的优点:

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

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


    ( s4 L" ~7 ]6 R) y$ h
    • Aop面向切面编程
      * X+ _/ U% L8 Q* R$ e, U

      * }3 j: c5 b+ h# ~4 M/ J  R* I. ~

    1.AOP面向切面编程 一些较好的模式或者是示例—-范式. r& N8 u) r3 D; j; ], }4 @& a

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

    2.AOP的思想: 主动—->被动(追加功能)/ _' \5 `" z9 T1 P+ l6 w

    3.AOP 的概念9 [9 L- R) R) h& N1 O

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

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

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

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

    5.引入 :扩展的功能

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

    7.aop代理 :实现机制

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

    4.AOP的事件机制
    0 M. {, M" V% f$ O: F8 Z

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

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

    3.找到切入点

    4.确定连接点

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

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

    7 n4 N# Q' U2 O! e2 r7 K
    6 k+ M& r, z: @8 s5 @  j' l
    5 P$ d+ h/ S! w

    $ `4 \9 Y1 L. I1 g$ v
    * @" X' t3 }* Q) p0 P- q$ O9 F% h
    , l9 y; k; \" s5 h& G% N' w
    # H. D' \0 o% A+ v3 E" W

    5. AspectJ
      n1 O+ `( `: O4 F) d  p* ^

    5.1.在xml中配置比较烦琐( y7 P0 W; f5 `2 b

    所有的入口必须从一个代理(ProxyFactoryBean)开始
    9 ]+ n4 {3 L9 \8 B

    1 K$ i: e9 Y5 m0 b4 l+ ]

    , }$ Z* T2 P1 n7 _

             
    ! G) |: J: Y6 A% z9 P$ X
      g/ d  Z( x" b. F4 j$ G; i$ J
    / J! }" t3 ^  f# M8 l- ^8 A         
    $ W5 `& ^! d6 Z  c& g5 @3 B

            2 s) g7 W1 ?7 m0 k, _& M

            

    : B, Y* V, E; Y4 {9 ?
    expression=“execution(* com.javakc.aop.MyTarget.t*())”/>
    . h% x8 v9 c' F" P3 v

            : b; p% m, G3 g9 U; ~" O" ~: N

            , ^6 ]' v, E2 M  c7 U

       
    , V+ w' E# s3 q


    * D2 i2 a2 x2 A- I% n- r. L# f4 X' Y
    - r) r2 c. W/ o( q5 g. n& E

    5.3.使用注解的方法相对简单: E! p! h/ l6 `  [  D- x# L5 S

    @AspectJ的基本语法( G8 Z! ^- {* c1 G+ E! q% N9 r

    1.@Aspect声明一个切面,将一系列的共同的功能定义成一个切面: W0 c7 t7 Q5 _. h

    直接在类上定义@Aspect7 {% R  ~) u- _, i

    2.@Pointcut声明切入点
    2 A; V$ Q  ~$ u/ N! \

    2.1、用一个专门的类来定义pointcut,类中的方法名就是该pointcut的名字
    , l* c; K% {( |" R/ `" h: K! c

    2.2、可以使用匿名的pointcut
    , b1 s# ~5 S% a* t1 b0 k  ^

    2.3、执行切点的几种方法8 R. `1 m& [! o9 O

    2.3.1 execute(public * 包结构.*.*.(..)) 可以指定到具体的方法
    3 k7 M, W5 n+ O; Z

    2.3.2 within 指定到包,不能指定到类
    : n% d( u3 g" K  y! \9 H( L& ~( G( m5 I

    within(”com.javakc.spring..*”)6 L! K/ Y! b% |2 p2 C

    2.3.3 this 指定到实现接口的所有的实现类
    0 Z% ~: n+ l! R# W* E! A  M4 p

    2.3.4 target 指定具体的实现类
      @2 |: a4 M* {0 Z

    5.4.advice的五种类型的示例
    / {, P! N. \* J+ p3 J

        客户端必须从接口走才能得到监控,实现想要追加的功能' D1 w9 s0 Y* L5 C7 V( p

    5.4.1.@AfterReturning(pointcut=”” returning=”retVal”)
    ! r( k: x% }; h1 |

    追加的方法的参数名字一定要与retrning的名字相同
    ) ]- _1 M. G8 r. {9 A( X, z: F

    在注解@AfterReturning中必须加上pointcut和returning两个参数- Y, r8 r% h: a& Y: Q  }/ H

    pointcut指所要监控的目标对象的方法
    0 x7 m4 M! O, N  s  D3 ]

    得到目标对象的方法的返回值,来作为参数,进行下一步的处理,参数没有顺序,按参数的名字进行匹配; V; }& C; M) a5 t5 O# t

    完成追加的功能
    3 {( [( i# b0 ?! i9 J

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用0 d; n3 m3 l$ M( b, U" j- ]6 I9 O

    (1).@AfterReturning(“com.javakc.spring.schemaaop.TestPointcut.t4()”)
    & B1 V( P/ T1 v' L/ ^9 Z

    (2).
    3 f) H& w9 J$ M1 {9 d+ V

         2.直接引用匿名的pointcut
    0 t  j9 \) P  h+ g) m: |' Q

         (1).@AfterReturning(“execution(4 }& F& k4 t. f" J" i

    * com.javakc.spring.schemaaop.Api.test4())”)7 O  p5 |. H% r# \! K5 R

         (2).@AfterReturning(pointcut=
    ) I. {# d) s9 P; V4 H, A$ \8 D

    “com.javakc.spring.schemaaop.TestPointcut.t4() &&
    6 Y4 l* J. P; H9 ~  J6 a

    args(str)”, returning=”retVal”)/ B! j7 O4 ]. F+ Q0 S  j

    @AfterReturning (pointcut=”com.javakc.spring.schemaaop.TestPointcut.t4() && args(str)”,returning=”retVal”)+ U4 `& J$ N; k/ ^* S8 k8 V

    public void testAfterReturning(String str,Object retVal){
    8 V2 r2 `' V( \, Y! _

        System.out.println(“afterReturning1=>”+retVal+”=>”+str);/ V. A+ ~* J. w# b9 W2 R

        }
    8 }( k0 v4 P- N6 Z% T4 j( ?3 q) W

    5.4.2.@Aronud! k3 K& y2 _3 I

         注解@Around环绕追加功能;# X' k; S( t/ U3 V( a

         在执行目标对象的方法的前、后追加功能;7 h: b8 R! {  T- ^2 w# J

         必须有参数;第一个参数的类型必须为ProceedingJoinPoint;9 n: ]! U9 N6 H/ W( Y

         通过ProceedingJoinPoint的实例的proceed来调用所监控的
      a7 J; }) [7 u$ P  Q* }  H0 P

    目标对象的方法
    : ~+ d0 {% a! c

         1 定义一个pointcut,通过方法名来作为pointcut的名称来引用0 t  M- ~: c0 g# c4 g9 o; E

         (1).@Around(“com.javakc.spring.schemaaop.TestPointcut.t1()”)# I& K% }) f* s' ^9 c0 o

         (2).@Around(“com.javakc.spring.schemaaop.TestPointcut.t2()3 R9 x: n& D0 k% U* _# {; K

    && args(str)”)2 ]2 M$ l- o4 F- `/ F+ c

    2.直接引用匿名的pointcut6 Q! ~3 s+ D- v2 I

         (1).@Around(“execution(" G3 s. o% W  e( g  M; q

    * com.javakc.spring.schemaaop.Api.test1())”)
    : c/ a( F2 s4 S! k

         (2).@Around(“execution(
    9 P2 Z/ D/ Y* F; y+ h

    * com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    , V, b3 x% q+ R4 Z* x3 h

    // @Around(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)3 a6 a# g. ?2 U

         @Around(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)9 L) H: V/ q5 U6 P

    public void testAround(ProceedingJoinPoint prj,String str) throws Throwable{
    9 l4 s2 J4 u: V. c; n3 ]6 z

        System.out.println(“around1==========before1pointcut==>”+str). W: P) Y' {) H/ I- K/ \1 s

            Object obj = prj.proceed();" w' l* \8 q) d, q. ~. A1 e

            System.out.println(“around1==========after1pointcut==>”+str);
    ' X( r* {2 Q6 q

        }
    3 v8 Q# u8 A/ a

    5.4.3.@Before
    # z8 ^, W4 `1 X4 l

    注解@Before在执行目标对象的方法前追加相应的功能* ]8 R, p. I- t# B5 u6 T

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用9 G: }  A6 p; a' P

    (1).@Before(“com.javakc.spring.schemaaop.TestPointcut.t1()”)9 r* @! Q  h' ^$ ^1 q9 ]3 f$ }

    (2).@Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    0 h6 ~; `4 g+ i% k

    注意args后的名称与参数名相同; Y  h4 s/ Z3 t

    2.直接引用匿名的pointcut! R) Q8 x; F0 `

    (1).@Before(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
    0 C7 H, w& e; N4 {' d# W5 i

    (2).@Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)
    2 w) j4 A+ P2 i' p+ x

    注意args后的名称与参数名相同
    6 H' A2 ], m9 g0 i& `

    // @Before(“com.javakc.spring.schemaaop.TestPointcut.t2() && args(str)”)
    - ^  h, M5 f: V$ J& ]

    @Before(“execution(* com.javakc.spring.schemaaop.Api.test2(..)) && args(str)”)& u. Y' d7 t0 a- Q9 @

    public void testBeforeParam(String str){$ U( ]9 g9 o4 \0 L, o+ r. g- x

        System.out.println(“before1=param=>”+str);
    7 D; p7 L/ _9 E; _, Q/ [

    }7 W* [4 {  M. e# N5 k


      ?% {/ Y. z0 ~

    5.4.4.@After
    * x  P, f& I! K2 h% V! u

    注解@After在执行目标对象的方法后追加相应的功能4 u2 l0 E  Q; ?0 u: G+ X

    1 定义一个pointcut,通过方法名来作为pointcut的名称来引用8 \) S6 a* U: z; q  b; K$ \

         (1).@After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)
    3 r. _8 R, V& v; l, s8 F

         2.直接引用匿名的pointcut
    % Q1 o% H. |$ Y  X. p: N

         (1).@After(“execution(* com.javakc.spring.schemaaop.Api.test1())”)
    ! M! {7 j6 G1 `, W' y# i

    @After(“com.javakc.spring.schemaaop.TestPointcut.t1()”)4 }$ F4 s+ r( J, c

        public void testAfter(){3 Q! W/ Z$ o' a' ]* V# T- I* P" ?

        System.out.println(“after1== >pointcut”);$ H0 V0 k2 y- p  d

        }
    & u. N6 @1 Q  ]. C

    5.4.5.@AfterThorwing8 z7 s# F4 z9 E. i


    ) Q( r$ S$ ?, u# g8 b& V7 Y9 b
      J2 L% m; w) e- m9 a
    • 描述一下spring中BeanFactory和ApplicationContext的差别7 ~& W, b& U: k% a9 j
      8 m! i: t- i/ {  p. {

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

    9 Z. @* }! H; s% x
    • 谈谈spring对DAO的支持$ }0 u' {2 u6 i

      + ]! f  F' i" G( a) }! X; B% G" B2 M  }0 m

    Spring提供的DAO(数据访问对象)支持主要的目的是便于以标准的方式使用不同的数据访问技术。
    3 {: _! R& z0 V( i6 M& U. s

    简化 DAO 组件的开发。
    3 U. B8 l- q& E9 FSpring提供了一套抽象DAO类供你扩展。这些抽象类提供了一些方法,用来简化代码开发。/ K) x, c  e$ p+ J& V/ p% h4 T1 a

    IoC 容器的使用,提供了 DAO 组件与业务逻辑组件之间的解耦。所有的 DAO 组件,都由容器负责注入到业务逻辑组件中,其业务组件无须关心 DAO 组件的实现。0 Q+ o3 A5 Q" B2 E" S3 {- P

    面向接口编程及 DAO 模式的使用,提高了系统组件之间的解耦,降低了系统重构的成本。8 L4 m4 m* P8 U9 _! v

    方便的事务管理: Spring的声明式事务管理力度是方法级。8 N8 e* T& G3 ^, D+ {$ }0 K

    异常包装:Spring能够包装Hibernate异常,把它们从CheckedException变为RuntimeException; 开发者可选择在恰当的层处理数据中不可恢复的异常,从而避免烦琐的 catch/throw 及异常声明。) n3 {! L- v4 y8 Y3 C5 y% P* n. x

    : K) I5 K* t" I8 ?5 ]

    % A3 t8 y0 X9 g
    • 谈谈spring对hibernate的支持3 u. M" ]. Y6 }' j4 W
      " i: ^( R* I2 `3 X+ e

    在所有的 ORM 框架中, Sping 对 Hibernate 的支持最好。如 SessionFactory 的注入、HibernateTemplate 的简化操作及 DAO 支持等。另外, Spring 还提供了统一的异常体系及声明式事务管理等。
    ) V4 e8 N- l7 d2 C

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

    1、通用的资源管理: Spring 的 ApplicationContext 能管理 SessionFactory,使得配置值很容易被管理和修改,无须使用Hibernate 的配置文件。详细配置如下:" A: Q/ }$ h! g4 n8 g: ?2 h  \


    ' [' j2 k, o5 h  c0 C4 _$ B, g

            class=“org.apache.commons.dbcp.BasicDataSource”>6 o7 M8 H4 [, ^

            : B+ O6 G0 P' O, _1 {4 I. B

                oracle.jdbc.driver.OracleDriver1 z+ @* b7 _  B% E: ?& ^

            
    + r0 z$ c& F% |# `4 B

            
    . p: E5 o2 f% L  ]

                jdbcracle:thinlocalhost:1521rcl0 {2 [/ }$ b% J3 t8 f

            
    " i1 I8 C- G/ ^8 F! n

            
    , b/ ]4 U9 z: J+ Z- c1 h% D( w( R

                javakc2) a1 b7 r8 n0 V6 d4 m) a9 N8 l) J

            * P5 |1 ^# \# P

            
      q3 R: _5 z# j# ?6 Y/ o

                javakc2
    8 I/ g3 N7 F; b$ f1 F

            
    6 z" T4 q# f! \" i5 r  P3 M  U

       
      b( K: D. P8 j( E

    ! s* k. }1 \! k, u$ F7 O$ \

       

            class=“org.springframework.orm.hibernate3.LocalSessionFactoryBean”>% A. \8 R. d# F  y: d

              Y  V% H( C$ `

            
    2 h/ v! g% j" n6 t. T8 x7 q' S! U

                6 A* u; s5 J& [7 Y( d7 R

                    com/javakc/spring/h3/UserModel.hbm.xml
    . V, P. L5 I" X! x8 c

                
    . P' s' Q8 _; B

            2 G1 q+ M3 a  b8 V( {$ d

            7 n  H; N- K; t; _

                ; P5 e- `6 W: N/ W0 K

                    hibernate.dialect=org.hibernate.dialect.OracleDialect! g0 O2 t6 K+ Z! Q

                * x& B# U, w* u: D+ t1 j

            * x% C! [2 D. R: j: b) j# @% G

       
    / z3 y- K( |. P- ^9 T7 l

       
    # x! \# z) Z) s0 n) X  o

              B) p3 r. ~% o1 k' ?

       
    6 P8 Y" o. F1 k% L1 s; ?! m

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

       

            class=“org.springframework.jndi.JndiObjectFactoryBean”>% B! f. |- ~/ C# X9 X! N' g

            
    - g. W; r1 A8 Q

                java:comp/env/jdbc/myds
    3 y5 b1 j* P8 y) N. x* Q$ X) N

            
    5 B5 c5 ^' z( |; o

       

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

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

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

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

        - s; v' `; E% [) H+ J! n* L. g

            # k0 S9 _1 z6 \# T: W. b9 d+ F1 ^

       
    4 ]2 i% ?# Y, ^& J3 V3 k


    % s9 N% _: n5 I) J. m. P

       
    $ v! k9 ?$ M( h+ I' L2 m

            
    6 @. z, G6 j/ v; Q/ z! q

                0 k! R0 q' }) b% d& j

            : q" F" A, K( e  Y

          n4 m( y, [. L/ r! v0 r


    " J9 W4 v6 f' H8 c1 }( ~

       
    8 i2 q, m2 t+ A9 W- |1 s

            
    % z5 h& q# [( f$ y8 ?' J8 h

            * V4 S4 o, ~3 w' M

        ! @- z( n9 h+ Q

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

    8 s; {) i8 T. \' c
    Spring2.0之前事务的写法
    ; G* i- I& D( ?+ Z5 e9 S) q
    - h5 P' }0 j2 b
    * n7 s5 p, S9 K) z
            class=”org.springframework.transaction.interceptor.TransactionProxyFactoryBean”
    * \7 j# m8 A5 h9 U  ]/ x: g2 ?
    % a1 T  |+ r' ]- T5 z
            abstract=”true”>
    & ~7 U: B* C. s

    6 Y  [  ^& I8 d4 g! c1 E, a) k4 ~9 \- c
    % S4 q9 X) V4 @/ \8 Q/ Q
    # r  w& f# N; c& E
                    PROPAGATION_REQUIRED,readOnly0 R2 m+ n& e! d- F( A

    5 g0 V8 ~6 t2 n$ |( [                PROPAGATION_REQUIRED
    & a0 r+ R1 f: P7 J0 R0 E4 V

    * ]" \: J7 F+ v* @) F* z# n- G; \5 l) ]
    # X$ D. O  f! N! T
    # C( Q2 H5 S" d( R/ n2 o
    9 o$ h) J; [, `

    & E* F" U5 X9 ~+ `9 l& o, e, h, X5 B( O) k1 d, x; d0 h
    • 谈谈Spring对事务的支持9 e9 O5 [' b4 u- o/ S
      4 h' G4 T) h+ a3 }


    $ h2 ^; V) e, S; K1、声明式事务管理:

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

    2.做法:

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

    2.2

    2.3 注入数据源


    0 ~: |6 m) `/ m) L1 x( O* T
    # Z7 j5 o  d! b* b+ d- }) C8 D/ }: V; O# K2 x( q
    : f4 f7 k. K6 l4 @+ j" P

    # v5 j6 P" |% k% Y! _
    $ |$ x  J' W! _

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


    ' u* s; B, `2 W4 w. Y2 ?- _( V! U5 p
    * ~  v: v- c  p4 r/ S  r" i

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


    . {% E4 m+ r2 N/ B4 d7 h8 S
    & q9 N" b% i) R9 ?; C7 q9 \
    ' C# ~! X# S1 ^3 a0 \2 T- L6 y: N  {* ^0 B& R

    4 o# P) m2 F( q: G: `& P

    2.6 定义切入点


    0 C0 |5 W9 [0 ~
    : Y7 P( T6 h# }! v1 _
    ' B  t- _8 K$ `7 B" A6 Z6 Y  ?$ j- j+ W, A- P1 g
    3 W! r% h: b8 y; I4 [* K3 A

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

    1.注解@Transcational

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

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

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


    ' K! Z7 M  x8 X+ y
    0 r4 B/ b) t9 `5 M0 Q3 P1 h

    如何在Spring中使用Hibernate的事务:
    $ _( B2 b" C, \7 y+ ]/ G

    5 X) z3 ?; A& |- `' C0 K

    9 z3 m  P" [, @. Y6 ]


      x( ^6 {7 `! u6 A" A* d

    如何在Spring中使用JTA的事务:
    7 x6 g0 e! P: \5 r% u. _' \' b

    7 ~& K8 [) S# V+ H# D7 S* [4 Z
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    15#
    发表于 2014-12-03 12:46:30 |只看该作者
    ORM对象关系型数据库映射+ w' Z" e, R* v
    (Object Relation Mapping)
    , D7 c3 p" R8 I9 X/ O+ |% \9 C# C+ R4 V0 U/ U, T
    一、映射的特点/ A9 O+ b0 `: o0 `
    9 a% y* I" Q  n6 d$ I$ U
    1.一个对象可以对应多个表7 n! F1 h3 E; B& W& T1 w

    - ]8 g9 ^% r6 _2.一个表可以对应多个对象
    3 n, S5 v4 I& r
    . P- J, t, J1 e* B" o3 F3.对象和表的关系不用完全对应8 T9 h7 x. ^+ J$ x! b

    # W6 H5 h4 b) l6 T( ?- w1 f4.对象的属性的名称和表字段的名称可以不同; i. _+ x7 \8 j
    2 S) e! J- W$ {1 b4 }8 S* t+ O
    5.类型可以不同,但数据类型之间可以转换
    7 J4 |& u6 B- q$ p  u# |6 M7 B3 L7 i; I
    6.对象中必须有主键,数据库的表对主键无所谓0 h2 s. o, P  @( m
    6 E2 A& d0 t8 {6 m% _
    7.数据库中有主外键关系时,对象中可以有,也可以没有. v2 M3 T; t- p$ @4 m% {
    1 u/ u5 m) _. t

    ' E' j$ S$ H2 e4 G! m( [
    / W4 n, j) G- \1 a" h, o6 R二 、有一个映射的描述文件————>xml  c' Z% \/ g9 n2 |3 ^6 p5 _

    ( L7 f2 q) {/ J7 h5 y" Z  Q三 、怎样实现描述文件————>一段程序  |% R6 t% T5 i4 ]; x& Y* n

    : A, s, n9 {8 i- f# H+ Q对象 映射(mapping) 数据库' Z2 o; T( T- t3 M: r

    " y* I$ k! K, i+ {9 A9 l: A  z5 Buser
    " \& t2 b( V% Q0 D0 H
    ; ~( T. }3 l' Q% u! rid=11
    " Y0 ~/ r& v5 p1 P2 f( n9 b$ y
    ; }* m9 u3 w+ l  `- k0 j# t# I  @name=”张三”———— > (1) —————> tbl_user(id,name,age,tel,address)
    & y8 R& f% Z8 c8 g; f. Z9 G7 y8 t
    7 _) m1 ?) O9 uage=25 <————(2) <————
    , D  {6 ^, x) H" ]5 j2 S6 `( t3 V1 F9 L2 d6 _! ~( t  ~* f
    ' p/ |6 x9 h/ |) \: ~& t! `
      ?1 G$ N% J& k; l4 Y. g& r
    (1)从对象映射到数据库" k  y+ ]6 z0 U

    - ?) y" `# P- s; U7 `1.JDBC% z4 |- c$ ^7 w7 t3 ]

    ' {% y; [$ {0 \' z6 M6 a& {0 f+ F2.根据描述文件来动态拼接sql
    & K3 `9 C/ ]* g$ M1 A
    / A* o. d5 [  I% f; N, d  z& @3.执行,添加到数据库中  u+ H2 \# Q$ H1 t

    ; I" M, V. h( |' S' }7 T% c; B- w, ^ 6 O/ c( _* @  s3 B, M! k$ t

    ) _8 Z/ |; K% ^6 d6 u2 d# z# I. H: B(2)从数据库中映射到对象4 n3 m- I$ o$ U( p0 ~! V* {% D! A
    * t1 W  q; k, P5 |
    1.JDBC
    / T& K3 u) E$ u) A7 w/ k9 ]  F( E. q7 g- Z! ~( D) u
    2.拼接查询sql4 h; B  T5 ~+ H+ u
    0 O# c8 ~8 G# X" r
    3.ResultSet) _2 S5 ^' s' z' g: _
    / T5 U$ x3 E5 F, j7 F
    4.Model
    6 i9 E7 a3 ^/ a7 ?8 d  \. b; ?/ Q+ N. F% n1 D) Q

    + D- r, Y- E6 v$ ^8 Q- ^& ?5 K# U$ x
    , x6 F' [  N' H3 m9 ^hibernate
    6 ]4 X; K1 O! ~& O$ F! J" L. L& A开发流程:
    % S2 P7 {/ `+ \3 d! i: Y% L% G
    % y4 X& @! H0 p5 y3 I7 A" I+ R是什么?8 Q) c' T; y7 T
    hibernate是一种基于orm 的轻量级的框架
    ( k7 S, n3 \8 }2 S- t
    : n; T: u* ~, ?  U6 n! @3 C % h5 Y7 `7 N0 u/ x3 S. v/ U

    5 Y9 t$ t& H6 A+ o有什么?4 p7 `3 @1 V9 J' a) D$ B; Y
    1. session 保持连接状态(依赖事务和连接池)  X3 p2 q4 L( Q( b( U% r
    / G* B5 n( y  p, |6 _# G1 c
    2. Transaction事务
    / y- V; q( i6 Q  d  U! c  }' K9 e# H
    3.' \: Z& w) ?' S0 o
    Connection Provider 连接池; C, g- C3 x: p3 y- w1 K

    9 Z- B2 g$ `8 A0 p
    4 E% p8 C" m# G# f4 e/ S* S% R, }* D2 s6 h
    能干什么?
    ! `" B' @% n) M, ~1.orm; r: G& N% F2 c$ S8 L5 k$ N  y
      d% K! |$ e8 s1 ~4 w
    2.提供操作数据库的接口,简化数据持久化的编程任务: f) U8 P3 I/ i4 [* K2 r
    5 n4 {( Y9 ~& |
    3 f9 @7 @9 ~: g, K5 R* v1 s

    4 H+ }2 b' n+ ]' i" q& x; M( s. E2 l怎么做?
    6 C8 b- t) ~( y6 v1.搭建hibernate的运行环境,将hibernate的包和hibernate所需要的包拷贝到lib 文件夹下
    / ~: _+ ]5 |( ~- _$ n6 l$ {: k& [! K
    & w( ]# G7 r- [2.O(vo)( f% W, p# v9 N* Q9 u1 w7 r
    6 S- ]9 O7 `+ Q1 b
    3.R (关系型数据库中的表)9 B& c0 E8 F% `, t% Q

    & F& }% z6 e$ ^4.配置文件- G: S& {2 a* s( {) V
    7 z) Z' T6 \, J( P3 }
    4.1 cfg.xml 放在classes根目录下,默认名字为hibernate.cfg.xml. Y5 G. G- a0 r) \- D
    4 a+ A1 l' T: ~' P0 p
    a.与数据库的连接
      v) v* A+ X' |6 i$ a4 W. d- V& |  Y  f
    b.可选配置
    4 x+ x) \6 p* u' Y- }- N' P6 a
    : C$ \8 F1 e; R+ m. _$ u- J; [c.映射资源的注册9 k+ ~/ w2 o0 v. j" E1 j* k
    0 g5 O' E! h& u8 [1 K. C( R" ?, L
    4.2 hbm.xml文件 名字与类名相同 并且与类放在一起5 h! L1 [! t* G! z3 b% z" a
    9 Z) O8 \. k: m8 R- ]
    a. 对象与数据库表之间的映射2 L% Y0 s5 z5 w! z8 c

    ; @  @2 X8 C# l6 k- ^6 yb. 对象的属性与数据库表的字段之间的映射
    - C& G, T, S* E+ K+ b5 z1 }
    # l0 l7 H1 Z) m6 c" Vc.组件之间的映射; y* W# ^" U) W4 c
    8 }5 U* A- k9 D3 Y% S$ Y- ?: J
    d.对象与对象之间的关系映射
    $ C$ F+ H& h# R' g0 j3 c2 k/ k7 L( O0 b5 M- ?
    5、客户端
    + H; O. b6 O& }8 F% T; B( f
    , _3 B- v  o( E  v1.得到SessionFactory
    ) M  }6 O  B1 Q2 o& l! H* S. Z: d; c
    2.通过SessionFactory 工厂来创建Session实例
    # x$ p/ g/ W; ^9 J  Y) b/ t& z3 v9 f3 L; C: l# D
    3.打开事务
    9 i+ z/ h" _4 A  v7 @" O. \
    # A4 ]* {) [* L) w& T4.操作数据库- x% A4 O, E) z; I! }9 I9 |
    1 u  x; }* _3 A/ j. H9 J
    5.事务提交
    3 i3 f$ e3 |/ O. w+ C" q3 t3 ]' ?
    # R1 X( |& Q6 H1 r& N6.关闭连接( m& y! I' h) y7 O& U& D
    0 D  y7 M9 N8 B# ~" X/ d
    运行流程:% F- U: \4 V* ~( O) d

    2 t" r& b+ H2 o! M整体流程5 h* ?2 `3 b, s9 M/ [3 f* Q0 z
    1.通过configuration来读cfg.xml文件5 m8 a& \5 j, R0 P' Q* o9 C

    , v& s+ ^8 N- H: X1 `2.得到SessionFactory 工厂(根据数据库的连接来创建sessionfactory)
    4 b/ `) e- v7 l3 Z/ ~, y/ c% m$ Y$ p+ G% N( x9 ~& g+ v
    3.通过SessionFactory 工厂来创建Session实例  B& b* k- y/ {+ @, t4 u, N
    : `- f+ R$ E- Z9 Q. d9 `
    4.打开事务9 u- i( v# L% x" X

    ( d+ u+ |( F, ]" [7 X3 l; f0 S& w* H5.通过session的api操作数据库/ p* }7 y: M3 r
    : g* }; s2 y0 Y7 [
    6.事务提交
      t) d; E1 `9 W' G0 ~/ [  o: |" J4 C; W/ X' n3 `% o
    7.关闭连接
    & b$ O3 @: h3 G( m5 Y. H9 V  k. L% D/ H8 [
    * p  D# C2 n" R; l4 S. f
    6 J& ], f3 T/ M. |
    save
    $ Q; `, F1 N3 W. F* j% q6 l1.to—>po
    ) R" K0 X" V& S3 E
    0 r6 |; @9 S" @8 _/ V) N! f2.根据model和cfg.xml中映射文件的注册来找到hbm.xml文件1 |7 ^! f6 T! B. \3 F

    * i0 M* D: Q6 @5 E3.根据hbm.xml文件和model来动态的拼sql4 {  A+ V# C% m, H3 t' U% W! r  v

    8 b. f$ y3 ?8 V* S. e4.客户端提交或者刷新内存1 s/ F# e# B: J. r' O

    " M, P7 k9 c1 A( ^  z$ N8 V5.执行sql,值放到数据库# r2 q  q, J, Z+ ?) v$ }( w
    6 _' U' |+ C8 b- S, c" e' W8 G
    8 K/ o6 w  n* u% K
    3 S7 u% P* k% e) a8 C; G7 E# r
    update、delete
    . S: E' r" a2 Y5 H! e% P1 U1.根据model 的id在内存hibernate的缓存中查找该对象
    9 [% [/ M  h$ W4 Y" o. S4 `2 f; @: B
    如果内存中没有就到数据库中查找来保证对象的存在
    " f2 Y! Z6 U* G: c& C. d1 u
    + G! V& K! T' q8 i1 w6 H2.根据model和cfg.xml文件中映射文件的注册来找到hbm.xml文件
    ! }" C: E) V4 a7 \7 _4 P3 ]7 P# j% N: C# r$ g$ z8 B% [) }" |
    3.根据model和hbm.xml 文件来动态拼sql
    * Y3 H7 b8 _% h" @3 V6 |3 x$ n0 ?- w4 s
    2 }; C7 b& ?* c5 e& A6 h. x4.客户端提交或者刷新内存0 y4 M0 @8 t% V: W/ d- t& J' ?

    * C2 L8 Y" S5 y& l. v5.执行sql
    2 R+ I! e- t; H( v- C
    4 @1 l5 Q: ]. M" H: t0 g1 Q/ G5 [ 7 B' u! J  {1 ~

    3 J  g+ q3 K! {& hQuery
    # f6 w* T+ U& Jload
    - q$ i: z/ p4 a2 ?  f2 j  Z. J  K$ C: o7 T0 `- n: Y
    1.根据model的类型来找到hbm.xml文件; I1 Y! o8 i' D5 ^$ ~

    / C3 V* U* Z- z# D5 ?' S8 Y$ o2.判断id对应的对象在缓存中是否存在,如果存在,就直接使用,如果不存在就进行下一步。: X* j" o( I( P8 C/ p' x

    ! e& q6 @3 T8 S$ y  R3.用id做为查询条件来动态拼sql, n- O4 X; J8 R2 h

    , r1 E8 ^. s, S* X4.执行sql 查询(先在内存中查找,如果没有找到(会抛出例外),就去数据库中查找)! {/ }& \! i3 i" X" }
    1 c- e- W$ N9 O- \% |4 b$ M+ R
    5.返回一个model类型的对象8 X. C1 c2 U, H  e: \  C  [7 h4 G7 i
    ( L: G. C" t' F5 J
    get9 V+ ~5 U. j+ c, `) `

    ' o, j  J8 Y% B& A    1.根据model的类型来找到hbm.xml文件
    3 s7 m3 R7 }" f% H) P/ _( h/ Q7 i* \- Q. W6 c+ {2 i' j2 I9 R1 G1 D
    2.用id做为查询条件来动态拼sql
    : o7 j3 v  F* I& d# V
    - R8 J6 W9 n* |3.执行sql 直接在数据库中查找,如果没有查到就会返回null+ c. p6 {* k. Z4 u/ N) k7 Y6 z$ x

    ! \7 }1 G. X( w5 Z7 T* k  O5 Dquery" w* L) f& x) x, ?% N* l

    7 o$ W7 `2 L4 f  _1.分析hql语句,得到model的类型
    / O  Q2 H: a9 N7 \' k) _- i5 w( H3 x3 g7 C6 w4 e
    2.根据moedel和cfg.xml文件中映射文件的注册找到hbm.xml文件
    ! ~8 P, h; g5 m& b0 o6 M: W! h* F6 W. {" x4 x6 q. J
    3.根据model和hbm.xml文件来动态拼sql
    & K9 G2 }3 Y3 u* A$ s; k4 J
    * B- g; }9 @! f, U$ N) j8 \- D3 T4.执行sql查询数据库7 v( U4 G4 b$ {* N

    8 n; E- L3 m, b5.返回一个resultset
    & S  w( @7 r* r8 ?) ]6 P2 |2 f
    ) D* I% \3 v, e( C0 Y3 ~. ?/ d  o  S6.循环resultset的值,放到model中在放到集合(List)中* z& j7 {5 x( y
    & v/ W/ x, ~: t
    , z6 d8 {4 Y$ O9 z

    , y, y  K1 _7 p. f* [谈谈hibernate缓存机制; ]2 p+ O: x! J+ _% X

    # B$ f/ w5 J2 [缓存其实很直观的理解为放到内存或者硬盘上的一块区域,缓存就是一个缓冲的作用,有很多时候,我们的数据需要经常访问,如果放到数据库中,不是不可,只是效率上低,如果有了中间产物来代替数据库,就省很多事情了。打个比方,去买酱油,不一定一定要去酱油的生产工厂去买。代码中需要数据的时候,可以先到缓存中查找,如果存在,就直接拿数据,不存在就去数据库中取,也省了很多事。& R8 l  E7 j& C, c5 D
    ! B; |+ d4 q% K

    ) S4 z" R: n3 v1 h3 x) B4 j$ h( X  T
    hibernate使用的是二级缓存,有两个级别,分别是Session,SessionFactroy级别,一级缓存是Session级别的缓存,Hiberante来管理的,这个我们一般不用管,二级缓存是SessionFactory级别的,可以进行配置和更改,加载卸载,就是我们平时用的hibernate配置文件中的配置SessionFactory的属性。
    8 B4 a* o1 a# u& R. L' ~: f/ B2 ^- T/ B: w: x) B
    ) U! U; D7 P1 n9 k: @' g* [+ v

    * J# E1 k  T! A# ~3 k6 X对一级缓存中的session事务进行数据的预存取,数据在各个session的上下文中存在(单例),当session关闭时,就是session.close( ),整个所有session范围内的数据全部清空;二级缓存默认的情况下是不开启的,如果开启,数据库汇总的所有数据都先copy到二级缓存中,这里要注意的是,一级缓存是每个线程下创建的session缓存区域,可以是多个,二级缓存只有一个区域 ,画个图比较容易理解。
    7 x# j/ L# c- ?9 v' U
    ! ]( W  l* o3 c5 f
      k+ f5 e2 G! b( }5 f3 V& \4 }4 f! ~% x- I2 z1 G
    | 一级session缓存| | 一级session缓存| |一级session缓存| |一级session缓存|
    0 }' A" E. A6 {. W$ h) Y6 ?5 c' o6 A7 A
    | | | |, F# A9 i; C3 w' M* |" a
    : I: \! i0 R9 y7 ]
    | | | |3 ?- w( b4 I1 e9 o) E5 b

    5 {" r! u& L( b0 P# f—————————————————————————————————
    2 a/ V/ s, l8 f( C$ W/ T+ e: s# B8 l# b3 F
    sessionFactroy级别的二级缓存
    : X+ V$ S7 m% N! x4 J& q# j$ }) H
    ——————————————————————————————————————-1 b- X8 R' m  O* s4 `. h

    # M& h; F; k% p|
    2 P3 x- v5 X' a  O4 I2 c3 T: V; j% v; @8 y$ t. n: y9 Q, L
    |- V: J9 B& C( H& r

    ( X) |+ |% a7 O+ d|
    ) s" H  r; j  [1 n/ @/ F3 x; }& O; B
    ——————————————————————————————————————, H9 Y& s* x( \/ t

    : G3 T( z" G9 H4 o- h* X; ^% o1 ADB
    - }, ^. {5 P% z
      `" H: X9 w( Z0 Y: k- R" j% _2 L- R; K—————————————————————————————————————–
    - y2 S8 e& x; c6 i# O7 ?4 f. @9 o2 d9 z% y3 s1 _/ {
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    14#
    发表于 2014-12-03 12:45:59 |只看该作者
    在tomcat下配置数据源
    . z1 C9 s5 R# H' B' R, y+ f1、服务器与数据库的连接% s& h: ]/ l  ^2 W+ m. T! `
    0 Y1 ~: q) O2 h5 W1 T& z
    配置server.xml文件
    4 t, \& s  M6 y& ~  ?( h$ Q) A" X' U6 b5 {9 E+ B( Q  z  r: f
    1.oracle, P) j7 y: g0 M, d2 w4 g$ x4 H
    * C& u1 @4 @' G
    <Resource name=”jdbc/company” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”; O4 _& y' J( K
    7 p9 q' w2 L% N. j3 O
                            factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”" N2 T, }5 K  s/ _( I
    & h+ G% _! d- k
    url=”jdbcracle:thin127.0.0.1:1521rcl”4 X5 m4 U, X. B% A6 x
    4 ~$ V8 t7 D5 H& T1 \. P1 G+ d
    driverClassName=”oracle.jdbc.driver.OracleDriver”7 u$ w& L$ [9 t4 ?1 W/ Y. u3 F+ `
    1 t: G* |( G: J* B7 X2 N2 k
    username=”aa”) ~, \$ {$ I) y/ I6 Y
    ; I: V3 D2 n; F* c; S% d
    password=”aa”
    * D0 U/ j( ^' Z! J* L4 A) t- x' u' k# N: C
    maxActive=”50″7 h- j! }  Z% @) B; p7 O& |

    2 E/ x8 [  z) E0 r/ g* U* RmaxIdle=”10″
    7 s2 u) u0 d7 w5 y- \
    9 e. n0 ?* |3 u1 ZmaxWait=”-1″
    5 i- y" m/ v' u* \6 E. k  K& X, R- w; C
    />2 J1 V7 S- s4 H" W, E

    ; r- C  {, u6 l7 o  R5 g: g2.sqlserver
    1 L, P, i% }4 A3 h
    8 e/ L3 {. L* Z" L. z<Resource name=”jdbc/webpage” scope=”Shareable” auth=”Container” type=”javax.sql.DataSource”
    ; s$ \% v' ]- p" @1 Q5 U
      g% l0 B; x" E0 r4 C) c4 ~        factory=”org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory”! g9 y: _4 |3 [! \2 p3 j
    5 h  L# u1 @6 }; u7 w
    url=”jdbc:jtds:sqlserver://localhost:1433;SelectMethod=cursor;
    7 f6 E& u/ |2 F' v: e) R2 z
    & L/ y& R1 [5 B3 z4 ^0 T! G" dDatabaseName=webpagetest”
    ( ]" l0 J, n1 [; X" x7 w# F6 F! B; e0 y  p8 O3 Y
    driverClassName=”net.sourceforge.jtds.jdbc.Driver”3 B' Y1 L+ V9 c

    ; b# n9 h+ B" V" ?/ u% Q- z6 zusername=”aa”
      x) y( i4 w. T; P2 i. G4 t7 R
    + n! ?; A" f' d% G7 bpassword=”aa”
    5 X# B5 [  u7 D8 a; l7 o- V! t  k" j+ ?' Z( q6 S% Q
    maxActive=”50″
    ! G7 Z+ D) u0 V4 H% h0 h
    + }3 {  m! _$ }! {0 _; R3 amaxIdle=”10″
    ! Z- s* Y; a' h5 N* x- T! v1 x! F- W% D" H
    maxWait=”-1″9 E, V) g# @# x

    , U) c* b2 x2 K% m/>0 w1 i" @$ b; {3 \% O! d( }7 c

    2 A3 L# e/ [, S' H! o) ^3 p2、配置自己的web应用的xml文件9 x* G2 _! p8 N: U9 G3 i
    # f% J1 g( W( y! [- w
    ( U; F2 \$ x! o0 {- F/ D$ n$ E

      {2 Y0 j1 I1 V- {  R" G0 l<Context path=”/eb03web” docBase=”F:/workweb/eb03web”
    ( [' e- z. w" z1 K, h& ^& Z6 I) d5 T& s7 H
    privileged=”true” antiResourceLocking=”false” antiJARLocking=”false”>
    ' O6 B0 q/ b/ _% l$ T
    ( {5 w) M1 ?$ ?7 e<ResourceLink global=”jdbc/company” name=”jdbc/company” type=”javax.sql.DataSource”/>% E1 ~+ R4 w. n
    ' y% K' M! t: I0 u/ w2 d
    </Context>9 O/ k* `6 x0 j- b

    $ M3 d. z1 X/ ~6 I5 V# D3 q & j# q. D2 C$ o2 u4 f" u; k
    4 v5 K: R7 y! C  g& G# S8 U$ [8 E
    3、配置web.xml文件  D0 X/ @: Z  u) ]4 p* A
    : g% ~, {3 z+ n
    与服务器建立连接, S5 {8 i: @' i( t8 [' Q" ?1 G
    : G5 k- A* ^/ K" h9 g3 s- j; F
    <resource-ref>7 e+ @' D7 _% H) G
    ; F+ c* h# Y- z! y" C
    <res-ref-name>jdbc/company</res-ref-name>
    , ~' h$ R+ U6 H" J) H' ?; A* q
    5 o1 P( C$ U4 F/ h<res-type>javax.sql.DataSource</res-type>. D7 ]& Z3 V2 X- |3 U' V

    + \' i+ e, x# ^<res-auth>Container</res-auth>
    , v0 y4 D3 _3 y$ e+ D! [, _
    / L3 w7 W' G9 s( V  |9 u  g) J7 E</resource-ref>
    6 Q6 O) T' f1 ~1 p- G
    ) S" t& |& ?( b+ u  m4、在应用程序中不直接与数据库连接,通过DataSource连接池建立连接
    ! S" F+ |+ W) @! ~8 ^. Q, }2 k
    ( ^. z, o" J0 C/ E  G. J. ]//1.在程序单独用时设置系统的属性,在tomcat下可以不用配置,
    : w; T* L* G9 ?( d7 `; O* k( [' V3 }6 P. K6 S& G# F* w; a/ x' D
    System.setProperty(Context.PROVIDER_URL,””);5 {) A6 ]1 E& I7 t) a+ l
    " U: i- D1 [, w, G3 _9 Q7 b
    System.setProperty(Context.INITIAL_CONTEXT_FACTORY,””);
    + Z: s3 |( |- o
    : \8 n7 R2 g. y3 i" ~//2.创建一个上下文对象
      q1 i9 d$ g" G" g( i* v( m
    $ E' h/ l) h( q  W  ^InitialContext context = new InitialContext();* Q0 N9 x4 q0 F; b. G; ^

    ) \  }# s  O$ C+ ~//3.通过上下文对象在连接池中查找DataSource* x# J& d$ \6 B" D7 `
    $ x$ U; M2 D* t$ V
    DataSource ds = (DataSource)context.lookUp(“java:comp/env/jdbc/company”);; w' I% V0 ^" g+ G, Z% `2 B, A
    8 `- v, m7 j( U' }* W( n' U
    //4.通过数据源建立连接6 E' S1 d( y7 a. R
    + G* T) L3 j4 A' |4 Y
    ds.getConnection();
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    13#
    发表于 2014-12-03 12:45:45 |只看该作者
    Jsp
    & p+ m1 Z3 l2 _1 C$ C什么是Jsp?8 Z5 U9 [0 f/ q9 [
    Java Server Page    结合java和html在服务端动态生成web页面的技术
    0 b4 O; K" A( r' I3 Q" V8 ?! R) G) L" L7 f. e/ G7 I% y: J  }0 Q
    6 [8 V1 y  w8 x; u5 r! C
    7 A5 ^7 Y9 z' B4 h4 `
    描述Jsp页面的运行过程?* S( I" ?6 p! O9 p) U2 o
    第一步:9 i6 ]( t8 _( s9 s/ Z# `

    # g/ N& m+ K% l1 E, Z6 D请求进入Web容器,将JSP页面翻译成Servlet代码
    " P/ j( r6 Z. l2 S0 b+ S7 d
    # ?4 f9 P# y7 Q2 t第二步:
    - G2 ~' k" t/ W8 k! d% O0 h
    7 |' e' h- V- u2 ]5 @  p编译Servlet代码,并将编译过的类文件装入Web容器(JVM)环境
    " o$ g5 S7 R5 q& u1 e3 z; j
    3 y; R$ p7 H& ?' H: V  N  Q第三步:
    , A6 L* R! ~# {: L8 ]' n6 `6 y' p
    Web容器为JSP页面创建一个Servlet类实例,并执行jspInit方法* s) l% }" Q# M: b) t; u

    & X! T) E. h# v5 O, ]1 N, Z0 r第四步:
    5 J# [/ s" C& N
    . B$ V' E' w0 vWeb容器为该JSP页面调用Servlet实例的_jspService方法;将结果发送给用户
    $ D/ J6 u# K6 j: R. ^9 V% U$ o! D2 b. X

    - A  n/ x1 I) |3 r* U: Y8 w; ^  A  m5 I) {
    描述Jsp页面的五类脚本元素的功能、写法、并示例! u# @& @3 x: q" i
    注释 <%– –%>
    * x0 L0 I4 p, O$ r
    1 N1 {) p8 Y: B: o1 r* U" R/ `- J5 g<HTML>: _1 {% B. H* X
    4 \* x! \1 D: F# Q2 E: Y3 t/ L
    <%– scripting element –%>
    " A4 _# G# K& ~& j& U4 Q) b: Z7 R5 d$ V- h  V
    </HTML>
    * G" A/ g& b% m1 i+ s) D
    ; p1 ]: K. S, i8 w( [/ J2 G$ ~指令标记 <%@ %> 指令标记影响JSP页面的翻译阶段* U1 q$ \3 l* _+ E. c9 }" C- h
    6 x; O2 [: R" P
    <%@ page session=”false” %>$ y2 M& }- f) S. e( A
    + j/ J4 b7 P7 ~) D/ K: W3 d
    声明标记 <%! %> 声明标记允许JSP页面开发人员包含类级声明
    . ~5 U" b: t! e& U) h- y; p6 u% j5 n* e0 [! p( J" Q9 z% d9 h
    <%! public static final String DEFAULT_NAME = “World”; %>, }0 [- T4 m. d8 G

    1 b7 ]7 u# }$ T4 J, ?6 b; Z    脚本标记 <% %> 脚本标记允许JSP页面开发人员在_jspService方法中包含任意的Java代码- H: [) h0 d1 c- p% b0 p) M. a
    0 U6 o( L7 M2 a
        <% int i = 0; %>% S2 G! b$ w* m6 @' o

    $ Z, y( I( T6 o! ]( \表达式标记 <%= %> 表达式标记封装Java运行时的表达式,其值被送至HTTP响应流 <B>Ten is <%= (2 * 5) %></B>' Z/ `; p0 _& ^' C. d2 x1 _

    - h; q8 x* M% u( O; A- K1 [ 0 Z+ F  p& Z' h5 c9 |0 ~1 [1 `  G

    ! R) i0 o! Y1 a0 T# `4 U9 F6 {2 n描述Jsp页面中的注释种类和写法
    ( z8 _' d4 X5 P. z9 DHTML注释) Y4 L( n* E' {: O2 Z
      g' }- i% H5 F1 R
    <!– HTML注释显示在响应中 –>
    + [  y/ C: `& k( x, e0 X: X% R4 m. P1 c7 A2 d) x
    JSP页面注释
    1 \, R7 C& \0 w- l2 G" Y# b$ j9 j9 q9 O
    <%– JSP注释只在JSP代码中可见,不显示在servlet代码或响应中。–%>
    ' H" j2 a9 N0 W7 |: Z6 l; ]
    7 l8 N( O/ `3 Y2 DJava注释/ k% f0 e/ L( q' J( i7 |# k8 H

      q6 S- u- ]: L! E<%
    " J  B7 U5 X6 v7 d2 z
    7 f2 X" S6 x0 G* m; C/* Java注释显示在servlet代码中,不显示在响应中: A# H9 g2 F2 c  A% [( W
    7 ]. a% Z' y! P$ n" J( f, T  j. M
    */$ l* V% C8 r; l4 q
    ( N# c# ?2 m' \* U. \) c
    %>, ^' d1 S/ B5 z

    3 r* @$ q3 R% D( X* `6 a3 G* C8 P * F( l2 m! V- E0 @7 i8 @
    2 B" r$ R2 L; \, i- Z6 M# ?
    描述Jsp页面的指令标记的功能、写法、并示例1 r  M3 D& z+ ]) Z7 W$ C
    指令标记影响JSP页面的翻译阶段5 P" N8 A4 {/ `3 D. t

    9 N' X2 j$ q" X<%@ page session=”false” %>
    4 z/ m6 d) O+ |4 V# s) f! @! ?! ]& K! q5 X6 e+ t
    <%@ include file=”incl/copyright.html” %>$ E0 G% a9 ]: M0 N4 H' s

    ) n; K* h! T. {* Y<%@ taglib %>: v' a: I  I" s: ~# q  b
    ! g, Y7 F( s0 f; t! J$ o% ~5 m7 M0 a
    1 e$ [; H' |, d
    " ~8 x2 B( K5 v: [( ?( c# ^
    描述Jsp页面的声明标记的功能、写法、并示例
    & c" A2 D2 X" y0 b+ F9 t' ^; b& [9 a声明标记允许JSP页面开发人员包含类级声明5 a! T- O/ `( n2 W3 H1 t1 H

    7 s! i" X: R$ {9 R2 i* E. [6 m写法:
    * L* I3 \1 f( H2 h1 G  O" x' _" s1 \0 L. }
    <%! JavaClassDeclaration %>9 H5 V$ i, K5 }1 S
    , k  w2 G$ r, I  S+ O8 w* o
    例:
    0 T0 g2 o, r1 Q* ]" P/ [  I  i$ T3 @' ~1 Z
    <%! public static final String DEFAULT_NAME = “World”; %>
    + f, g5 _$ Y! b  h) m6 D" h& d' I! [  s
    <%! public String getName(HttpServletRequest request) {
    ! o7 w1 H6 ?* o. N. c6 {: B
    8 [) x% v0 X. g# ]! xreturn request.getParameter(“name”);! U, L8 @6 j1 W8 G. w

    9 S+ j4 q# P$ g! _: ]" _}& D/ C: [' p# V* R
    ' `- @, C( m4 F- q  f' T
    %>$ O0 X1 i) |4 M$ ~% T) _6 [

    * }- c" x2 V; S) Q% j! z<%! int counter = 0; %>
    % C) O+ g, T( C$ ]2 `
    5 y5 N( O0 K' A. E- r& ?. H
    2 N  D+ _$ ~+ G4 s3 B
    # s% \( G. `; A/ G8 `1 b4 h) k描述Jsp页面翻译成Servlet的规则
    ( a7 {# [1 u/ yjsp中的注释标记被翻译成Servlet类中的注释8 T; a2 y2 z) X

    5 p& s0 H# ^9 X; gjsp中的指令标记被翻译成Servlet类中的import语句等
      K5 c, \* o5 a: Z7 R( M- _# }0 B2 G. Y* m/ k7 s# q% J
    jsp中的声明标记被翻译成Servlet类中的属性! O- M7 Y& P3 n3 `. m( X7 \

    0 w7 `8 [7 C& o* I' e0 T& njsp中的脚本标记被转移到Servlet类中service方法中的代码
    - M1 E7 i& [" d! f2 K* D! o' C+ t# B4 U! J/ |6 t( c
    jsp中的表达式标记被翻译成Serlvet类中的write()或者print()方法括号中的代码! m3 p. y4 x& T; b+ d2 `
    - {! K9 m- O+ ]) Z/ @# o8 E$ L
    " g4 J$ R+ }3 a8 n. O2 p- `- ^/ Y
    7 I- C$ R& z1 b2 k* Z2 i. l) b
    描述Jsp页面的九个预定义变量的功能、用法、并示例
    + H" [* a1 q( `3 @; trequest 与请求相关的HttpServletRequest对象
    0 N# j3 B% _' O, ]; \% `! t
    * n  a7 W& W8 {; R# A  Qresponse 与送回浏览器的响应相关的HttpServletResponse对象
    ! I/ ?" j, i& Z- o1 W: l3 J- }
    6 E) U# N/ a' p9 z0 P) n# ?, Kout 与响应的输出流相关的JspWriter对象
    ; {) w" y+ v; g3 z+ Y% ?' U% ]1 T2 p: o1 R5 G2 C
        session 与给定用户请求会话相关的HttpSession对象,该变量只在JSP页面参
    0 R& j$ }3 c- Y+ v0 j' P$ I, S% E+ j
    与一个HTTP会话时有意义
    ; @: O3 p/ j, b- r* C; X* r" o4 r/ m. N. T
        application 用于Web应用的ServletContext对象
    - l+ ^/ L; }, ]3 X* ?6 z8 {
    1 r. @1 f; N9 y% V5 I, q0 Lconfig 与该JSP页面的servlet相关的ServletConfig对象! \6 y0 V0 ]$ Y8 R8 A4 c, }, {( @
    * A2 l2 l* u" Z! c5 B% R+ Z$ H* W
    pageContext 该对象封装了一个JSP页面请求的环境- p8 `1 M8 ~8 j0 G, z2 H$ H
    / c) H5 }# [6 r( K! y/ f- I) v
    page 该变量与Java编程语言中的this变量等价, [: z# N! ]$ D! N
    4 d  Z6 t5 I2 M: h/ g
        exception 由其它JSP页面抛出的Throwable对象,该变量只在”JSP错误页面”中可用. S1 N# W( r& b- A4 f7 V5 Z

    5 C$ ?+ i  H! ^# C7 ~5 R 4 V1 G; U( i8 ~1 n( }7 b

    ) d- Q- r: K0 a; }page指令的功能,写法、并示例,并描述它的如下属性的功能和用法:import、session、buffer、errorPage、isErrorPage、ContentType、pageEncoding
    # L3 h) {" y# v# I' n0 |! b# Dimport import 定义了一组servlet类定义必须导入的类和包,值是一个由7 u) z6 s: B% y& l9 O: Q

    4 R8 G& X2 V) q& K$ y% \* ]逗号分隔的完全类名或包的列表。  r7 O6 H% U0 _

    ( J( _+ a& k$ `9 \: J) rsession session 定义JSP页面是否参与HTTP会话,值可以为true(缺省)4 g1 O& K5 F, j% E+ i* M( b7 ~& p1 c* Z
    ) G: Z; h$ |; n( j5 A0 q2 l5 ~+ I
    或false。3 K" c9 H; J7 \9 I
    ! s( M+ o8 m' `8 A$ E- Y
    buffer buffer 定义用于输出流(JspWriter对象)的缓冲区大小,值可以为
    8 ]7 k% Q8 z! o: v7 g" Z0 {2 U, @# C4 S# @7 B" |5 D: R! a
    none或Nkb,缺省为8KB或更大。
    0 [) `' A- r+ R2 }! U( _5 F6 u
    : x% j/ V$ ?* L3 D( R9 \errorPage 用来指定由另一个jsp页面来处理所有该页面抛出的异常
    % {% O* @  O5 Q% U( H# U& _+ I% r  i3 ~
    isErrorPage 定义JSP页面为其它JSP页面errorPage属性的目标,值为true或
    1 [$ x- B! p# P0 B7 ^1 \7 `% V& ^: ~* F8 H! v# L. o' W7 c- E
    false(缺省)。
    ' Q$ k& c  B, J; b4 j% j9 G: F, Z( P( S$ j" U; s3 c
    ContentType 定义输出流的MIME类型,缺省为text/html。
    " g- q4 ~4 q" e( o5 ^+ j5 }/ p1 d8 ?+ N. j, |% T0 W
    pageEncoding 定义输出流的字符编码,缺省为ISO-8859-1
    ' w3 p; F/ s0 ^+ K' x2 `1 m% {8 X. j/ I- U
    ! M) A" Z1 s3 k$ G1 {

    + j% L+ ^7 b+ Q. F( `* ]# x描述MVC各部分的功能?MVC的优点?MVC的缺点?5 v: t) I3 b) d& D" H4 }
    MVC各部分的功能:
    : m; Z$ k6 I) }$ O5 E1 [) K3 @3 H) x3 R" Z! V6 \8 w
    Model(模型表示企业数据和业务逻辑)' [2 W+ G8 d: t# U7 P9 q1 U

    " Y7 j8 p7 n( N# _/ V% g1 c' ?封装应用状态
    2 N3 R3 G8 t3 B$ M( c$ }
    4 K# J/ H& i' }3 d响应状态查询" C( d+ J) q0 a

      c( B# ~3 A$ G+ m* o4 [& {) f暴露应用的功能- ^2 m; z0 @. \6 x: U( p
    * c& m* E: ~# s
    Controller(控制器接受用户的输入并调用模型和视图去完成用户的需求)  v3 r9 U; h2 R' I. T) W

    ) c* L3 f% K( g0 N验证HTTP请求的数据
    ! B# V  K% Z4 @/ P% F$ z, e
    2 d7 e9 x; S/ i" k: y% ]+ w+ Y将用户数据与模型的更新相映射& _1 f9 y& J/ H, C2 V% `! E% d- d, W
    ( J) ]8 s6 ]* q3 c
    选择用于响应的视图( L5 N/ D0 \. i) F
    . l7 D7 a. W# e6 }) }* B
    View(视图是用户看到并与之交互的界面)+ M' s8 a3 [& P% T% O

    8 X% E$ G) G& w+ M" S- `产生HTML响应$ v+ A5 N8 d; {4 n

    + ^! W- d1 r" L' V7 S( E请求模型的更新
    $ p& K4 o! f) _' [5 W. c
    0 ?% }& y# v# X/ o; v; @3 ]提供HTML form用于用户请求
    ' f- y# R2 v- v3 h; D1 Y# H3 e2 ]% O! K" Q" Y4 r- ]: }' G
    MVC的优点:
    & n, `0 y& W' p. ]  q7 ~7 f1 Q4 l9 t7 q/ O/ m- [7 T# N) e
            低耦合性:视图层和业务层分离8 ^/ x: S! M8 F( E# i" X
    * u# o: k% p1 Y( u+ P( \
    高重用性和可适用性
    0 E; S+ l# B9 V- D6 Y  R( M
    " \" U+ i9 p% t! D较低的生命周期成本7 g0 b! J' H( k& w- K9 u! d( }6 r  j

    4 X5 G. H0 z9 i9 Q- e4 j1 J* y: B0 @4 @快速的部署5 I9 ?! r4 U& t9 W- f  X
    - f' c3 w4 M5 s8 |8 }1 D& b
    可维护性/ w- W- l: _& g' I

    / b( X' S" D) C; F' D/ T9 E2 g2 q1 ]有利于软件工程化管理
    4 A3 t% t' ?; [/ W3 [8 {
    , x" {4 R- R" u: a# \提高软件的健壮性$ I  r  F! O& T4 j; O+ `8 ?
    7 }" q  R' Y% o. p4 z
    MVC的缺点:7 ?# m; w$ |1 W$ ?2 d" |! s
    ; k  A: ]  ^: e3 z
            工作量大,增加工作的复杂性,MVC不适合小型甚至中等规模的应用程序7 N: T" E& Z. E/ B6 s3 U

    + @! F) X" ?5 X2 F; d$ k5 A5 I. ? , }& Z" I( }$ S, ~! ~: o; X3 V

    * J7 J! l% V, e- Y1 O: k9 F什么是Model 1结构,以及结构中各部分的功能1 O0 [6 C. r0 B
    结构:jsp+javabean
    ( l2 ^  i8 g3 e6 q( z0 E' |# y# `; ?2 p, U* U! Y! K3 [* Y
    Model1中使用jsp来处理web应用中的视图控制部分) k/ o; s: L3 B, g1 {; }' y

    ; Q' Q: |! _$ h* I0 H; JJavabean收集参数
    ! t! N2 f+ U4 P6 J, Q- l' t  W8 P4 j
    & U8 j/ p, `9 ^4 B# G  A0 b
    " K# h8 g4 p8 W& P: k8 |
    什么是JavaBean?
    9 o  A. z2 b8 h0 t用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。
    + l4 v( |/ B6 T: N5 E9 z. K7 P
    # ]; O# |- h$ Z
      n$ d/ b- a" M  T0 r7 @7 c
    & j8 L. \# M; j; ^JavaBean的规则?) A# e& l& t4 d
    使用get和set方法定义属性
    ) a' z. S  v1 o
    2 a0 C" l, @/ w- h8 b3 Z一个无参构造方法. K, j) W% W  \

    . K# }/ d) W2 V8 I无public实例变量( 所有属性私有化)
      `! c. C% l; S' N; M( j
    " m2 B% {( ?6 k3 w( S
    ( ~  K2 J9 Y7 R; X' s0 p
    & ~- k8 ]0 Q+ l, z% k1 ?+ Z什么是jsp标准动作?包含那些?分别都是什么功能?如何使用?; X1 p  N5 c& T+ p( l) @
    JSP页面中使用类似于XML的标记表示运行时的动作: d) q9 m* s. O. b% S! c
    & b1 {. t6 ]* c" I8 H
    jsp:useBean7 S1 O5 q9 h# X: ~) t$ q
    ' \- F! q/ j8 y* m/ d: Y
    jsp:setProperty
    8 g3 x7 ?( R7 V0 h9 S! a: r' C2 d3 _* z7 W% H$ n, \
    jsp:getProperty. K) a; B. C. F4 q! f
    . X3 P4 M5 M  Q: E2 C" p/ i9 F' r
    jsp:param* j8 Q& l' F, F  e3 g/ }

    2 ]; r& s6 [' j( ~; C5 ]+ qjsp:include
    * t* ?" M8 q& `
    : W# S: r  B  H1 Tjsp:forward$ L7 u/ d& v& X$ n7 I' R* O: C- \( W) ^1 W
    0 |0 {8 i9 N7 J6 n& `
    & y3 X/ z# Z6 O4 h6 ]1 N
    7 |' P/ h2 ^9 N8 x
    用代码示例如下标准动作的使用:useBean、getProperty、setProperty
    + s, Y6 ^8 M0 Z" C6 P5 u" b0 f<jsp:useBean
    / e- i1 e, Z( w) h) `/ f( Z
    + k  j9 g4 b, [& H0 t4 @) p0 [5 Eid=”myForms”
    5 T/ A) k% m0 o8 q5 Y# t
    ) i* d1 I0 ^; z( b; Q( sclass=”com.base.mystruts.forms.MyActionForm” scope=”session” />+ Y. S9 g; U5 N2 V! X
    , ?1 Z2 c3 P$ _
        <jsp:setProperty name=”myForms” property=”name” />7 G# D5 {2 A/ x+ x- h) j# a0 r& X& V9 d

      x' ]0 h( }! Z' p& t1 F8 `. z<jsp:getProperty name=”myForms” property=”id” />( R: q) I% x/ m* u- a( O: t/ E
    1 U! \0 i% m1 n

      K$ J1 j$ n$ A# Z( W0 N1 X! q7 W/ L; W2 c1 N1 Y# ?4 b
    描述说明Bean的四种scope
    , i4 q- Z2 }' G& ~, a$ C6 C9 qpage
    . R" x; n1 l  p, B, p: `& o$ }
    6 r) ^, {% r# ?! w8 P1 p1 w$ y3 q. }. srequest0 I# V: w1 ^2 i  J0 I7 \

    1 u! ^! {$ u- u0 C! l1 Jsession2 {7 W; V: a/ ?4 a: W. g( O) e

    $ J1 g+ g8 r. @5 }: a) n# rapplication
    6 |8 W+ I  e, d! _1 q& l. T( ?) Y! U2 k/ z4 k6 \

    9 T7 R6 B% p& V) A$ @
      W* W1 ]; k+ `$ m描述说明页面上的字段和Bean中属性的对应规则/ g* U' J$ D$ y% W- @9 T; T
    id 指javabean的变量名
    4 X2 g( z( D2 E5 w- ]
    7 ^" i* g  T5 Z7 X' mclass指javabean类的全路径
    ; Z) P9 n& d* Y: N# H  x/ V# [7 g' F
    : @4 k, ^* O' E1 q- U' n6 T1 Pscope指javabean的应用范围
    ' x' b% Q, Q! \- o  ^, B1 H5 J! m& E% L9 s
    name指所用到的javabean的变量名" z" g0 M/ L; t& O$ M

    ; H8 ~- w" J& S2 E1 e    property指javabean中的属性# R3 G) ~' A9 d" P( t
    8 `) ~) z' y3 B  m) r
    - a$ e6 n6 R& M  y) [
    1 {  T/ R& J' D  e0 n6 l
    描述useBean动作的处理过程$ P* \, r$ r$ l5 U" Y8 `4 k
    使用id声明变量
    2 G9 e- z# J' ]- b8 v
    4 @1 N0 M9 D6 Y3 D试图在指定的范围内查找对象8 ], c5 M6 B2 s, o. l; h: o$ B/ W" Q+ N4 v

    # v9 Z$ K  f' `, y% \如果没找到7 F( u, H$ i. p. D- {6 u

    : Q+ O; _* u6 j. e! R- h  u创建一个类的实例% k% R% Y( R; E

    * t# l6 k9 b) l3 M执行useBean标记体初始化对象
    ) y% t" h8 [! A: H, n" o3 Z
    " i. y6 C( l3 i+ r, [# e如果找到
    / K$ b& D5 k% x( t$ W( ~, ^4 j2 B/ E$ ?# Q, X5 t
         将对象转换为类指定的类型
    0 S. H: \8 o& I7 `' {
    & ?( N' ]! R' B
    3 Q5 `) }: p) K- {5 u; C8 ]- |3 f) O; k
    描述forward动作的功能; }( f7 Q6 X0 r, K+ P) O/ E7 |* X; c
    使用脚本代码处理请求时,可用jsp:forward 动作产生一个不同的视图,
    ' H& i8 U3 J5 A5 d# i8 m- i! P" m) ?/ D
    使用同一个request:
    1 A+ X% w: i% A* w, u4 S% H9 @
    $ W1 i6 G. K, f+ ~( l" S! C! Z- G 9 @% ~% r0 v# }; g7 h% N

    2 g' u" l/ K% }- P4 p4 y; g$ n什么是Model 2结构,以及结构中各部分的功能3 r! U. m( Y6 Z4 M$ K
    jsp+model+servlet
    . B+ X( t& N( r+ K7 e$ F( e; B9 l5 f
    Model 2架构使用MVC模式,JSP页面充当视图,Servlet充当控制器
      }# \4 d: X6 `5 T+ Z
    7 h% O- o. ~) {/ F, a, C/ D% ^Servlet控制器:; l. t( O% u: h: g0 _  _  ]

    8 @' I0 T* }" p7 E# d5 E# L$ X验证HTML form数据) M0 v7 [( j% @( {2 q# D! z( I2 U
    , M, {7 M' z2 T
    调用模型中的业务服务: G9 @( b" Y  C5 {8 a7 K  ~3 ?4 y' B; w
    2 n+ p1 }- f8 E/ m( Q+ D
    存储请求(或会话)范围内的域对象
    . \1 `8 T) d- L7 h, v# d/ s! h
    选择下一个用户的视图/ O1 D$ G# Z& ~) ~  B6 W$ r

    , l' n- v0 g# j- ^3 ?. u9 UJSP页面视图:1 b4 w" L" |  I4 D" P% j6 r
    : c! N- j4 J$ [) U! m3 T: w- V
    使用用户界面(在HTML中)
    5 h" D- g7 l" ~3 }7 H# v+ z( G: L
    5 W7 e  K5 v% a! F        访问域对象
    / z2 Q% Z( @5 T2 c( t5 r( B/ z
    & f& |2 n: r! a' o
    : k; q8 H& J; ]$ R' t/ B% ]$ l& r" @9 j8 G( G
    如何获得分发器?分发器的功能?! G" u$ l7 i$ a1 R7 D2 ^
    上下文对象中的分发器:- U9 S4 {+ k4 Q# S
    ; k7 X2 c* f: Q& a* @+ y% c8 F
    ServletContext context = this.getServletContext();
    " Y7 a. a7 r  ]/ Z# S4 v& X0 |! A' C. n/ v& g+ }+ C
    RequestDispatcher servlet = context.getNamedDispatcher(“MyServlet”);. y& W: ~) F: f' \$ p

    ) X5 H% ^* N# z4 l9 `servlet.forward(request, response);
    ; n) @! f5 x/ z4 c4 t* P5 l0 Y- s* N# n; Y
    请求对象中的分发器:/ _8 M- R) S3 X/ W! f' X- _
    ; J% y6 e! s8 M) ^* x
    RequestDispatcher view = request.getRequestDispatcher(“tools/nails.jsp”);' X% Y, N  _' u5 N, l
    ' w% j4 [! t+ f- x! F$ V
    view.forward(request, response);  \/ x9 b; w7 S- H/ t: q4 g$ k: H
    $ d+ d1 r! w3 N) N# E
    可以将请求转发到另一个jsp页面,并保持请求的传递性% `# A3 V6 E  L8 u: |& L
      A6 M" X! v8 L5 F0 Z7 O3 A

    4 D/ s5 a& i# [+ j$ X. j7 \
    % c$ J3 g; q, V% n1 e  [$ rJsp中页面跳转的两种方式?+ `7 E1 V$ j% }& s" }/ q1 j
    使用分发器跳转页面: v8 M% d! N& o3 r9 Z4 E9 V* r
    RequestDispatcher dispatcher = request.getRequestDispatcher(“url”);
    . i- L% f& [0 ^2 a9 [
    ) @" \5 F5 T! E- Ddispatcher.forword(request);7 o. P6 P# ?- w& ?0 B0 L, |8 P

    5 y2 q; X: t5 X7 Q- d& A+ I    特点:保持请求的传递(上一次请求中的数据,在下一个请求中仍然可以得到);
    - Y4 u3 \! s2 {; p+ O* W) f5 A, P1 a4 C# e" b
            转发的页面只能是同一个Web应用程序的其他Web组件- F. i: Y7 d, K! x8 b
    6 o% a: `& ]$ {% S8 H+ G
    使用重定向跳转页面
    + g  o& `& D+ {7 U; K- yresponse.sendRedirect(“url”);5 y) ~3 W: j7 B- `* M$ N; i1 n
    ( M# g, |7 O8 A6 c, k8 d' f: i; _
        特点:产生全新的请求,(上一次请求中的数据,在下一个请求中不能得到);
    7 h: H0 y4 G6 w; s
    . u0 s$ ?0 V! I$ g        重新定向的页面可以是任意的URL
    ( W  F' U3 U1 }8 C
    ( {+ u, D3 E( M2 |0 G/ w" w
    9 d5 S1 G" ^: r/ l
    4 J$ O$ b  B$ a1 ]; k, o, \; m描述Jsp中引入另外页面的两种方法,并比较两种方法的特点?
    . Z# Z" }. a1 K6 N/ {0 m; c, j( D<%@ include file=””%> 在编译期间把另一个页面完全嵌入这个页面,可以说是一个页面% J3 H( v+ _& J- o0 A0 n6 L( e+ l
    : m) {/ E1 f  K6 O' i
    在这里可以共享变量
    ) A7 Q/ K' v$ @$ S" q- p# ?9 ~7 f$ C) I& e9 u4 {
    <jsp:include page=””> 动态的再运行期间把另一个页面加入这个页面,可以说是两个
    0 y! t4 Z( m) q6 _- }6 ~8 \
    / a& y% b. E( z( ?. D  b) M页面,不可以共享变量8 h" k4 M" B. U/ q4 P1 v

      n" a$ P. |: Q, `& ]$ g; G
    ' v0 }: b6 I: d% l! L6 I1 ~: z+ O' B& b2 n3 H% R
    什么是自定义标记; _' j6 Z% s& x
    自定义标记库是一个Web组件,7 }: S5 c% r2 N# G9 y7 j
    4 {. b. W3 i" k) ^; i  i* [2 k
    包括:, {" n$ n& q7 q- S5 j* ^

    $ J+ h+ Q; J* ?1 U1 `$ D9 {0 h: v一个标记库描述符文件(*.tld)& @, {, ^/ S1 x. Y( R8 n% _' j

    * R* P0 f% f; z/ i! N* L* W0 e所有相关的标记处理器类(*.jar)
    / E5 d  E/ I4 S  ~1 S, i) ]5 l7 j  d/ k/ C: J) H

    ) s2 N4 J5 O9 s$ {
    " l' _  T1 z) E描述使用自定义标记的步骤,以及每步详细的工作
    ; {5 |3 B7 q( J/ W# `# f使用自定义标记前,要拿到.tld和.jar两类文件# l, @  k* V+ G7 o1 T# H1 A1 r
    2 I; b2 k, |$ N9 `! q: _: }
    把.jar文件放到WEB-INF的lib里面。
    2 L7 o5 [" ]+ J" n- y* ^- I: F- c% D把.tld文件放到WEB-INF根目录下。/ ?& j7 t* v# p! L6 ^
    在web.xml中配置。
    + u5 t" Q" T0 v4 N- s! p6 k- q<taglib>
    6 k" D( A! Q( v6 j. O, @8 k* ?7 `, n8 n6 j! P, q
    <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
    3 x) A- s6 K6 b- @0 n
    2 N$ y3 k9 a0 A  A% v     <taglib-location>/WEB-INF/c.tld</taglib-location>
    4 }/ Z; p& P- ^( D0 H1 y
    * W7 K$ b. d8 ]# @' a0 b8 Y</taglib>
    , D6 |$ b2 D4 ]8 C7 |& x% T; L7 ]6 P$ K  @# k9 o/ a$ G! H
    在页面中引用。7 s7 H0 I' D7 a# D; F- k7 e8 W2 y8 {
    <%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“s”%>; [) A, z2 `5 J" `
    : \3 P7 B; m4 B& E
    uri必须与web.xml中的uri对应
    . N0 }$ r/ r9 n. }! N0 f  B1 k9 M0 b9 V9 |3 c* K& m
    prefix是前缀,用来区分是哪一个taglib
    # L* a0 X5 V5 _" q& [: N
    ) M6 r" j0 T) \: p5 Y+ O3 x使用标记3 c2 B. A: M+ q! {3 j# c) w
    格式:<prefix:tag名称 属性>3 ^$ x' \" Q* O: v, G7 ]3 O+ @
    + h, {4 y5 k) A4 n% l$ |& r. j* D
    <s:forEach >
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    12#
    发表于 2014-12-03 12:45:29 |只看该作者
    Servlet
    * G+ u! X" f# z
    •     描述war包、jar包、ear包的结构
      1 o1 ]2 C1 Z) n" i. }

      3 T7 G+ D8 B" `# w2 T  a8 a5 R: M. ~+ c5 m& x8 k; w; Z

    war-                            web文档压缩包

    —WEB-INF

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

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

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


    4 c; d" c% C# ]; K

    jar-                             java文件压缩包

    —META-INF

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

    0 q; b! F3 N! Y& {% c; k

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

    –META-INF

    —Application.xml 配置文件

    –*.war

    –*.jar


    2 U6 T% I4 Z6 N3 f
    • 什么是servlet?servlet主要做什么?
      # @" e  f) G8 o/ d! c  ~) s; N
      $ ?1 j  q1 t  q9 v1 ^

      * B+ K& p5 |9 b

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

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


    " |2 ~& y7 \: O1 F' d
    • servlet 与cgi相比的优点?servlet的缺点
      + K  H' S" G% O
      6 \3 l3 R) {; ^, e- E

      % i& H8 u3 S$ ]9 T# [: s& S

    优点:

    性能(线程比进程更快)

    可伸缩

    Java强健且面向对象

    Java平台独立

    缺点:

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


    3 v8 u. G  B  f& n. @, i. }
    • 常用的servlet包的名称是?7 V+ S) y9 ~: @4 t

      $ }" l) m$ i8 [7 o& F! u: ]/ u% U) c2 [0 K+ T5 K; Q

    javax.servlet

    javax.servlet.http

    . U/ g0 d0 h5 o9 F0 {' J! y, t
    • 描述servlet接口的层次结构?7 _) B8 C3 _9 ^5 q

      : @- W3 {$ N8 S# [" ]/ }
      : m# e0 ^) Z- w1 P

    Servlet

    –GenericServlet

    –HttpServlet

    –自己的servlet

    ServletRequest

    –HttpServletRequest

    ServletResponse

    –HttpServletResponse

    4 [7 f, f# B6 }/ A& l5 ?
    • 对比get方法和post方法?& K- Y' H3 i+ }& n1 o

      # S4 r. Q8 z7 q$ c, O& X( S" V
      ) R, P# Z& D% O* u

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

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

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

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

    , A' v1 \8 T+ m9 t
    • 归类描述HttpServletRequest接口都完成那些功能
      * P- @3 @% q0 B3 a5 G' Z. J" Y
      : W' F+ n' Z* D
      6 D- g3 E7 Y7 Y) ~& t" r. i% g$ I& M
      • 读取HTTP头标
        ) w6 U4 b# p  [+ i1 P1 ~3 B) \
      • 读取cookie( O8 H. d" C' s% z0 R
      • 读取路径信息2 e1 [9 q2 V$ p$ v7 M! _9 @4 z
      • 标识HTTP会话。& @% F" ?. a. [5 j
        ) U; i$ V# o! ^' `* b* l- F
    ; k) E( m0 j5 E3 k: i9 i3 t) q
    • 归类描述HttpServletResponse接口都完成那些功能# _% {; r$ o5 D2 c9 q3 s" z
      ' `1 J  b8 I2 j. _9 \' t! j

      + o  [9 ~) C4 l# X
      • 设置HTTP头标1 a" ^- o9 U; e! ~, F  K. y! ~% e
      • 设置cookie+ p" o+ {) _" o4 J6 r
      • 设定响应的content类型* i& L( b2 x( p/ g( m
      • 输出返回数据
        # _; @- \; X# a6 M2 u- \+ q* ]- C% k# q
    ; [6 _" `* ^" G; E0 h9 Z
    • 描述service方法所完成的基本功能?默认是在那里实现的?6 ]# p3 u& D* A/ ^

        j/ W2 d" _. \+ B3 ~# Y
      + F1 g- S% M& w9 E

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

    实现:默认在HttpServlet类中实现

    4 u- v& d( F+ w* u$ A% w
    • 如何开发自己的Servlet?描述应该做的步骤和每步需要完成的工作7 c; b6 Q4 D1 r5 T
      / W0 M  Q' D# ~4 w" U, E

      4 V# U, H3 }& A0 O

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

    $ x9 p2 j1 X/ B1 L" G" t
    • 为何servlet需要部署描述?
      & e( N* X2 |' I. B/ v, A! g9 h
      ) l' L7 K( _/ R& y$ E
      - ~( b: r( n1 W8 E% T( X! e

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

    ; @0 Q7 j- X& W* M2 _
    • Servlet基本的描述应该是?请写出来$ j( y: [3 O3 L8 i: x7 }  e

      . {2 f0 Z5 ~) D# I- R
      # D3 O1 D0 c! X: a- ^5 k& k# k
    1 s4 ?4 h" e. _

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

    ' j# ]- N# d' `3 n
    • 如何在html中使用servlet
      / H& Y0 C/ J! }8 M3 e% L
      ) ~! E' y  e% u) I- C$ Z
      4 Q; Q$ c  _8 u  Q$ h. }

    FORM标记

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

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

    语法:

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

    {HTML form tags and other HTML content}

    </FORM>

    6 e) ^1 l4 T, |8 Z
    • 如何接受request中的参数
      , G( r" B" s! g% a+ |: i1 G
      % D/ b( |, f: @8 z# v
      String userName = request.getParameter(“userName”)方法
      8 {3 X) R# L" z9 c0 P4 S( [  h& S, O, |
    # r. U1 f# B6 k* N
    • 如何接受request中header的值
      7 G& a% |8 ~( m$ z% Z. b

      + G- W8 z7 z. P7 i8 T8 a. v) Y& b/ U7 a: a: z1 n% t0 ]

    request.getHeader(name);

    request.getIntHeader(name);

    request.getDateHeader(name);

    request.getHeaderNames();

    0 q& h+ a* e3 j& f* ~% \
    • 如何输出html
      : t1 T. A: K9 R% j5 z& Q

      7 W+ e# @8 d  K5 [7 i4 N+ B: |' `( Y. m. c9 o$ B

    PrintWriter pw = response.getWriter();

    pw.write(“<html>”);

    pw.write(“Hello”);

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

    5 o2 h  d8 j) h' c7 t& @1 W
    • 如何设置输出的contentType/ W. J. J' L# V( F$ T( {' a4 a
      + _7 G1 n' K; v/ C; A0 m2 v- Y
      % S, V! ]+ K8 D

    response.setContentType(“text/html”)


    6 q  t9 S6 z5 g* A  p' P
    • 描述servlet的生命周期?2 j7 f9 n$ k6 O" U3 g0 i7 O

      5 ?. m- E1 D4 e; b; t! s( k1 l8 j' V7 x- ^% H

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

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

    ; p. @2 R+ C" V: {- m$ X: Y6 e
    • 描述init,service,destroy方法的功能和特点
      , [8 c9 n' Y; k3 b. S
      % P+ t- x) @$ g: h
      $ T  g5 J+ O( H( M3 h( W* M8 D

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

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

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

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

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

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

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


    ' Z+ W9 p0 m4 {$ P: A2 g* q; b
    • 什么是回调方法?有什么特点?
      / s2 ^6 y$ b5 l; m6 Q( `$ E

      $ u! K0 O* G3 Y7 H/ q9 F( o! t8 T! G" T

    由容器来调用程序的方法

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

    % V" G( p  l3 Z
    • 如何设置初始化servlet的参数?3 w; a7 }  u" k4 D& y

        P7 d& `% g: S6 o- e  r3 {) C2 \在<servlet>中添加如下配置
        _- f! y4 Y6 l7 a" d8 t! y& m- f3 [3 o) ^) y

    <init-param>

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

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

    </init-param>

    $ ]  B. `+ ]6 _% ~9 s/ \
    • 如何获取servlet初始化的参数
      . `* C3 x; A! @- i4 Y$ z

      3 \7 w, ]; P6 a
      3 \" |- A; e+ Z4 Z8 \6 b- c

    public void init() {

    greetingText = getInitParameter(“greetingText”);

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

    }

    ' N2 s4 W& P# |: L2 y8 y
    • ServletConfig接口默认实在那里实现的  _. r* `- |; n
      " k6 s8 a3 H6 n7 `$ T. e; I  x# e

      % i$ y( I# u6 C7 G, K

    GenericServlet类实现ServletConfig接口


    3 Y1 F  D- h" Z5 s0 _) b
    • 什么是ServletContext?有什么作用?
      4 }* n7 S1 S3 v
      8 Q( w0 }+ M# X1 I1 ^9 M
      ! h- F6 x7 e0 w3 `- [) o! h; v

    Servlet上下文

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

    : ?7 O0 @" C( l$ P: Z
    • 如何访问ServletContext接口?是在那里实现的?
      ' O# h. k- y1 b6 o
      : e% `. h& A+ `# K& r6 n( M5 M

      " O+ {. q: P( y5 j. a

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

    GenericServlet类实现了ServletContext接口。

    " X1 }  W! `& [# I: p
    • ServletContext接口的功能包括?分别用代码示例
      & y' F6 ^6 h2 A
      8 _. |' k* c6 {! D
      / M/ I4 M  _2 e! E% B  z+ 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)

    # ]. H# q  x# M4 }
    • 如何设置ServletContext的参数?2 ~. |0 T- j* l( o

      . _6 F! m$ d' n/ L6 h# R) g' D) L5 c0 D

    <context-param>

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

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

    </context-param>


    ! T% \. d7 X, x3 s* {( u5 \
    • 如何获取ServletContext设置的参数值?
      ; ~0 ]( c( {) k2 q1 R; x% {& |
      9 B( _0 r! j2 E; F- _

      & [; H3 d- Z. J/ w0 J- x

    ServletContext context = this.getServletContext();

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


    4 }9 Z  K8 M( }
    • 描述Web应用的生命周期?& f) K  }5 N4 H8 p' M$ [3 a( {
      6 V5 Z7 O. h+ J8 T& K) j" e
      , X; t/ A# l9 R5 d% {

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

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

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


    ) V. v! s. w* Y7 A
    • 如何用代码实现监控Web应用的生命周期?
      1 s4 z) N7 s- Z/ J4 T

      ) p/ o, G3 V& W3 L. p' o
      / m* _' u: s9 U" V: w1 M# z) `  z# ^, D

    public class Test implements ServletContextListener{

    public void contextDestroyed(ServletContextEvent arg0) {

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

    }

    public void contextInitialized(ServletContextEvent arg0) {

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

    }

    }

      }3 s- l7 W: L. R8 _

    web.xml文件中的配置:

    <listener>

    <listener-class>

    com.csy.Test

    </listener-class>

    </listener>

    ; |# Y% _, a" e1 V! O0 a$ s
    • web应用中如下错误码示什么意思:400,401,404,500* `; _9 a7 I9 x2 e+ L) X7 p+ N5 C' w$ t
      " p% T8 L0 {+ _
      400 Bad Request//错误请求
      401 Unauthorized//未被认可
      404 Not Found//没有创建
      500 Internal Server Error//服务器内部错误
      $ r9 o/ ~  V+ A" b

    . n3 e/ h, R) }+ M- R
    • 描述Web应用中用声明方式来进行错误处理的两种方法
      / |/ `5 Y9 r/ E; F6 @

      2 B8 a4 S3 E5 h: Z" P, {( L. m1 o. [, i" ^# P9 Q& Q+ I

    使用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& v/ V0 L( d  C2 O
    • 描述记录异常日志的方法,都位于那些接口?+ i$ M1 c9 F% A

      ) ?( P' r5 h+ ]0 U, L- `4 h! m3 f) K3 K" Y9 @$ A9 H# F

    GenericServlet:

    log(message:String)

    log(message:String, Throwable:excp)

    ServletContext:

    log(message:String)

            log(message:String, excp:Throwable)

    . @* f5 p7 f2 S1 u' |& c3 N
    • 什么是会话?
      ' J# {; R. G; r1 r0 f7 k( I3 j

      1 R5 p+ Y# N2 l7 i) {4 }5 i3 W# ^2 O. ^3 M3 H4 X, N

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

    # }5 }% U3 Z# U4 Q6 v: w
    • 如何获得会话?
      # M, L- E; j  ~1 g$ `6 X, O
        v( M$ I+ I" X+ u  F9 ~
      HttpSession session = request.getSesseion( );
      ! ~  {* a  U, y6 P' ~: g
    & P% K( X2 _+ U
    • 会话Api的基本功能?
      4 I& _+ I8 q5 t4 d/ `$ a; s
      ' Z* s4 {6 W. w! A& ?- F+ m) {/ k
      ) T! Q7 v0 _8 J

    getID() :String
    ! @; a1 o; H/ L

        isNew() :boolean
    3 c- I2 V* j) O

        getAttribute(name):Object
    , R+ z% |" ~5 a/ X# L

        setAttribute(name,value)8 q& |7 ^: E  b2 ]+ V2 v, T* ?

        removeAttribute(name)

    9 D- z0 O- }* F1 [+ I9 L
    • 如何销毁会话?7 C( Q+ d$ |; |0 w; ^
      $ Z7 ]: b- w9 s! [; `: }7 I! m  s

      8 H7 N1 {& m9 o" B' m; u

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

    <session-config>
    " ]+ |& D3 f2 A, V

             <session-timeout>10</session-timeout>, t' L" q4 V- k4 C: q: x

         </session-config>; l. T  }, A- E5 Y# k2 G! X+ h

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

    invalidate()
    - H6 ]% c3 h8 }4 d% H/ B: E$ K7 \

         getCreationTime() :long
    : {9 q3 ^% y) E9 f6 C

        getLastAccessedTime() :long
    6 ~7 G  P. |- K# V1 R) V( ]* S, g

        getMaxInactiveInterval() :int
    # \; m0 u: Q2 x5 s7 q0 b3 Z

         setMaxInactiveInterval(int)

    : y$ G$ [" R: f4 v& J
    • 描述会话保持状态的基本原理
      5 y! ]5 N; B) Q
      / T4 V- o( Q$ X( m6 E

      + @) Q, R9 [& I
    * [+ d8 y9 w' o( z

        client server
    ( e: }; d- h1 |


    & o5 a( L; f" x5 c& I1 w8 w

    request- R- @. o( _, ~- q

    response (sessionid)) P! c; q% q7 c; d/ e

    request (cookies)' j7 V3 K- ^' `8 I7 I8 y9 K

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

    9 c% K  @2 d; q- M0 ^& B8 q
    • 请描述session和cookie的异同之处+ y- ?/ Q3 [% l# Z' ^# Q2 m
      , k5 n7 |) n& {

      4 n- U2 |: I( \/ i  h" v  P

    7 M& K- E" I# M( K9 k% l. R, \* V* g* `. k
    • 如何读写cookie,代码示例% L  V$ E8 z) _* x4 q
      4 @& c& e- B, Z. i1 ]
      & j9 J( k, `# h& }. j; _

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

    response.addCookie(c);

    读:Cookie[] cookies = request.getCookies();
      i5 \4 t, d- w

            for ( int i=0; i < cookies.length; i++ ) {( c* M9 ^: n4 X" [/ o! J* K

                String key =cookies.getName();
      c9 g' t4 A# `7 Q$ `: T, L

    String value = cookies.getValue(); % u; E, p3 N# J- \# s. O

    System.out.println(“cook”+i+“:key=”+key+“,value=”+value);
    0 h/ q+ C/ v! e8 p& G

         }


    0 O/ C8 b, T& N
    • 什么是URL重写,如何实现,代码示例% u1 }! w) E- ^) [  V* T+ }
      ' ?% [; y5 `. n% I
      . Z1 k, }7 l  A4 U1 k

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

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

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

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


    $ B$ \6 |3 N& V2 e* r, |7 k9 Y$ P6 _+ F0 z! L& q
    • 描述web应用的4种认证技术7 e( s% a/ i. E) g" ^

      ; P, [" ]# F1 t% z; M1 z9 B4 k' U

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

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

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

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

    7 `% B1 _3 z( U' A( @
    • 什么是授权,什么是验证?! j9 O" Z$ z& E* w8 r

      ! s: S; [( _( H, T1 d" e
      1 |; d1 c" ?! {4 L. z+ m

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

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


    , d+ a' c# H0 b5 O& y. j+ X
    • 什么是HTTPS
      ! n* w- l0 D/ l( D+ y  b5 L

      # a! \6 R( p5 h+ X8 e! p3 c  z0 W) M1 s( v

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

    " ?4 H5 S! V& [8 _! m  ^' p
    • 什么是审计?
      7 d% b" X! Q+ i
      ! {7 S: i9 p( A! v

      ! m8 Q6 L- I9 }

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


    , {4 N& v, S; G" o
    • 如何实现声明性授权  E) z- b- C6 {  l' f* y" u$ O( a
      ' H0 l, J8 B3 D0 R1 G/ b  y" G
      % c! y( u" b1 S! Z5 d

    1、标识web资源集

    2、标识角色

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

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

    在 web.xml里配


    6 B8 d  Q. O) |6 I) w- k6 \
    • 描述servlet并发问题?
        ?3 G, B! Q5 r& P

      1 o% p5 k& d7 ]% O0 ]! [" u/ d9 ~" |0 D+ S/ ?4 X" Q; ~

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

    4 V7 t5 ^; g( T" U) H$ v/ W# U
    • 描述Web应用中的六种属性范围. b$ Y0 h- e9 {4 S- S% C
      ' J, V, ]8 r# L) g4 h; k

      + O2 ^/ G% {, K* w( q: I: [5 P

    局部变量(页面范围)

    实例变量

    类变量

    请求属性(请求范围)

    会话属性(会话范围)

    上下文属性(应用范围)

      U6 q, n, \& z; ~1 O( S; Y! g
    • 指出上述六种哪些是线程安全的
      3 N% Z* n. c- L% n8 S

      ( v8 F: J. a, P" K0 g
      7 J/ Z! Q* B; f! P" T6 T( T

    局部变量和请求属性


    3 _2 O' V. l3 t% ]" P
    • 什么是STM?如何实现?) ~2 A6 I' T3 Y- J5 ^
      2 r+ Q* `1 \2 H" I

      + I& Q6 m9 k% O+ Y

    SingleThreadModel接口

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

    1 ]8 M+ G7 f, {$ I% V! c2 `
    • 如何实现并发管理?
      * w9 }, @0 r0 o' n: ?0 K
      8 M9 h9 v' l7 L
      : H3 U  l+ U8 x' ^+ |) K3 e% |2 n

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

    使用synchronized语法控制并发

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

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


    8 \$ x; ?2 \! ~- H1 f6 O' \* a9 k
    红红火火恍恍惚惚
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    11#
    发表于 2014-12-03 12:43:50 |只看该作者
    JEE3 O# ?, f% F: R$ f+ v; N& o6 U
    简述JEE
    5 B& z' T1 w6 d, b% y) mJEE : JAVA  PLATFORM  ENTERPRISE  EDITION5 i' s4 g. `% F; V: I2 N
    * n2 Y( L! s, j% B
    JEE是一个规范集;
    ( J! j5 @! d! h# U5 Z+ {
    4 N, m' g& m; I0 i9 c# HJEE是一个框架集;
    4 E& _. P( s2 w' e. ~+ R( h2 O* O* G) t, N
    JEE是一个技术集或API集;3 U5 _+ R! {* d4 S* z8 z* Y9 x

    ! }5 x3 D  Y, |: B% q0 k适用于创建服务器端的大型的软件服务系统' [) L" U# |" O$ @; {2 W1 u
    8 R% x9 ]. S$ }, n& c
    ! w0 F  q$ L6 \; t2 U2 b0 Z: u8 ^
    4 T) C1 u8 J/ s$ z2 h- _
    C/S B/S 模式
    " h: X! T) x* V/ _) XC/S client/server即客户机/服务器模式,客户端也参与程序的运行与计算(富客户端、胖客户端)- S5 t. P; C4 T" B* K# @! ^
    7 a& A4 O4 s( Z& @0 M
    B/S border/server即浏览器/服务器模式,又称为瘦客户端,客户端不参与程序的运行与计算& x* n0 b5 Q& x& u9 m6 X+ ^
    5 `3 z# Y3 ~0 l- Z2 ?; k7 v7 }3 }+ B
    8 Z5 A) v  }, l! x9 i/ N

    % I- \' [* X: \1 t3 x- r3 s企业级应用(大规模的应用)的特点0 }; G( M& o/ j, K0 f0 S) k
    1.生命周期长、稳定、可靠
    4 a9 o6 @) J  K' e$ R- c2 u( l
    ' ?' L4 m, n0 H- H4 e2.组件往往分布在异构的环境中,能够跨平台
    # d5 W) Z1 c& i% v% c; k- b; A1 u/ d9 ~4 i  C9 q( C# G7 a+ w
    3.维护性、扩展性、重用性- }) j, H7 [; l7 |$ I

    $ z0 i4 |( T0 i3 |7 x+ i4.有事务、安全、线程
    * u9 `' b# h; r' g/ W  S5 \
    ! d/ }" z$ [: n5 H7 C6 s 0 s: o* z+ R2 z9 N0 s2 G

    # e' C) o) o; @7 Q什么是业务逻辑?
    # u' Q% u% J/ a; B! V7 _依照业务逻辑划分模块,
    & m+ z, S$ F- w, f0 B7 u% k. E3 j1 ?: M! i1 p0 |: H. U1 {6 i
    所谓判定业务 就是具有以下特征:
    7 d( B/ E! q4 |& ^6 [
    ( W) K- L. v& C* J1.业务流程
    9 Z8 H8 O& g& j: s$ @1 V- D2 N1 ]) X/ \# g
    2.业务判断0 Z6 v  H/ @+ r/ a& f$ a
    / x4 ~* k" K1 Y) j
    3.功能组合  g$ O* {4 Y8 Q& i6 i& ^" {6 h" v

    ) C5 t/ R1 q% l* I; n+ S) ?
    0 b' N8 h* C0 l. \- ]3 B) H& Z/ O: y, n
    平台(角色)的划分! p1 R# K3 G, R* t: o& O/ s8 F
    1.平台供应商。提供满足API集实现的厂商(BEA weblogic IBM webshphere)  k4 u5 P% Z* a* C  r  F% E" P

    6 _# z2 M. Q" W9 y- t' g2.组件供应商
    2 b% I  k1 X. M4 f; K' D" d/ h6 e! Q% w6 b2 b/ f7 S& d5 \) p
    3.组件装配人员8 \; {: C# ]" c; q6 L) A
    / z3 U! ?- D. |
    4.部署人员/ H5 ^" |' R1 |
    7 u4 i+ f+ q* g8 o) w
    5.系统管理人员
    8 o4 s+ c+ w# e0 p  o/ S# U, Q; {1 {. z- f5 e
    6.工具供应商 提供开发组件所使用的工具(Jbuilder、eclipse)
    / A2 S  z! `1 \* |8 T6 L0 n+ ?2 `8 P) i: b

    9 C% `4 N$ \( p+ P- \6 d( s" j2 Q8 `' E# `: ?, b* D! F! E
    java技术分布(设计架构 模块内部设计)
    ' J! @' E. i/ e7 F1.表现层 Servlet、 Jsp、 JavaBean、 Taglib
    0 U3 D; G) \; F6 h
    2 |) b9 O" ~/ V2.逻辑层 EJB(SessionBean)
    9 E  c, S! ]/ T9 ?1 C4 |: k  ?' s0 b# \
    3.数据层 ( JDBC  EJB(EntityBean))) u% y" }7 T5 Z
    ; n) M- w, q  x  @; l* |5 `
    4.服务 JTA(JAVA事务架构) JTS(JAVA事务服务) JAAS(JAVA授权与验证服务)9 E% v. _0 Z& U: @0 n7 C7 h
    , _/ r. |0 N6 t' f0 b
    5.分布式通讯 RMI(IIOP)+JNDI 、JAXP(JAVA 的 XML 架构)3 z) O2 F' G$ ^8 e# s

    & h5 R( c% _" e/ F, T7 p# ^JAVAMAIL(邮件服务)、JMS(消息服务)、IDLC、JCA(JAVA连接器框架 (成))
    2 l5 |* h8 B  @
    4 ]; M: ]5 K" F: i- \ 3 N! N1 E: i* Q6 t% M& a9 M

    0 i1 V. u$ k  D9 RJEE的体系结构: 是一种组件的体系结构
    2 C$ `5 @7 j/ @& W/ ^1.组件 : 能够完成一定功能的封状体(独立的功能的集合)
    4 r2 n  }& H) W! l% @6 e) E
    : q3 u" ]3 ^, Y1 G/ r4 b不能单独运行,必须运行在容器上
    ' N" P& ~2 {! Q! t" V8 t6 @
    * F5 s% H& r7 ?9 [" u( ^分为两类:web组件、ejb组件
    4 C+ s, ?' I0 V2 F5 [# V
    2 J  ?+ ^% ~2 ~! K: }" L2.容器 : 提供组件的运行环境,并对组件进行管理(一段程序)
    ) y9 @) u5 q& }* u
    3 a6 W  h! g: y2 h# u/ W! w# {管理组件的生命周期
    / k' u: f: [% H9 h  D$ b3 U3 J3 O2 T5 I8 i) P) w2 m7 ]
    不能单独运行,必须运行在服务器上, I# I- N+ S! K+ S3 E

    8 A' H$ m- l) N5 P1 X程序(组件)通过上下文来调用容器(context), {& G, a3 w4 C* I) L

    ( h8 i- ^8 W2 z% J组件通过web.xml向容器描述自己,使容器能够认识组件
    ! l0 H" A5 z; `$ p9 [' z, k
    9 \$ g. t& s0 x7 y9 ~# \6 Y容器通过回调方法来调用组件2 T. C0 d0 U# F4 V' s1 ?5 p

    * l; r1 t- d) e( d* d# t. \分为两类:web容器、ejb容器
    1 K( i) i, p! h
    . A0 m' v3 U. a) G3 a3.服务器 : 提供容器的运行环境,提供大量的JEE基础服务
    ) z, Z& N0 r, A2 Y
    ( f# i  ~" C: _web服务器(只提供web服务)& x3 U& m: c$ Q/ X3 U
    7 R1 y$ `! u# s, V/ E' H  e
    jee服务器(提供web、jee服务)
    3 X3 @6 z4 Q+ [# H3 V; m9 z
    8 p' e( w, H/ u, T8 Y0 a  f ! k. u. a4 x; u9 u# u4 U
    & W+ r" D9 t: g
    什么是回调方法; T2 s, ?  v7 s% F
    由容器自动调用的方法,就叫回调方法。
    0 J& Z5 C6 y( R( b$ _4 f8 C* m& W' C; s+ `( ^0 n# V
    5 _7 Z8 b! J$ E3 o% D3 S
    + `' L8 O- c: @5 @$ w6 E% z, p
    RMI远程方法的调用机制
    4 Y* y0 D# c/ E/ g$ ^: ?' ]  J例如:A主机有B()方法,C主机有D()方法,A 想调用C主机的D方法
    7 `7 \% B2 F( O2 y2 y% J, C( f1 Z' x
    ! J5 U" r; }" e4 J0 ?. Q9 c* T) c

    5 G5 r- n% [, ?5 |9 {
    - h* `) U; f1 ]
    - P4 f! k- c6 o% ^" B/ e, [, G* f学习方法
    ! P, v, z- [+ G& [: a( S1.规范(熟记) 2.熟悉API 3.多练 4.多想
    回复

    使用道具 举报

    admin    

    1244

    主题

    544

    听众

    1万

    金钱

    管理员

  • TA的每日心情

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

    [LV.5]常住居民I

    管理员

    10#
    发表于 2014-12-03 12:43:23 |只看该作者
    Xml6 t5 ]! |0 l0 F9 e+ d
    ' [0 X: o9 r- E
    9 w* _+ |$ }% D! \8 [5 i
    XML有几种解析方法,有什么区别?
    " }2 {, S* D8 V' m9 K有XML DOM解析、SAX解析、StAX解析+ ?: k' z/ F9 P) n
    . @+ E$ r* f7 p# M8 i" g
    XML DOM:(XML Document Object Model)处理大型文件时其性能下降的非常厉害。这个问题是由DOM的树结构所造成的,这种结构占用的内存较多,而且DOM必须在解析文件之前把整个文档装入内存,适合对XML的随机访问;
    ' F9 j" u# v0 p0 i" _% u- o1 s0 G$ k0 X7 Y
    SAX:(Simple API for XML)不同于DOM,SAX是事件驱动型的XML解析方式。它顺序读取XML文件,不需要一次全部装载整个文件。当遇到像文件开头,文档结束,或者标签开头与标签结束时,它会触发一个事件,用户通过在其回调事件中写入处理代码来处理XML文件,适合对XML的顺序访问;
    5 X% I( V- [9 w; k5 U" g- m) |
    ' @$ x9 X. ~$ t/ [8 z% FStAX:(Streaming API for XML)与其他方法的区别就在于应用程序能够把 XML 作为一个事件流来处理,无论从性能还是可用性上都优于其他方法;
    9 [3 h$ W% Q: G
    , f' I3 n# b0 b  y; T. H! y- c
    . c( j! X$ X) l) q9 o' ]; T1 I5 B1 o. [" a9 E: S- ?2 H
    DOM解析代码如下:
    4 @. h5 K. G& C0 F4 W6 F
    5 b5 K1 F  z: J- n1 Jimport java.io.*;
    ; U: K" A' M! j  s* Y; i7 \' ]0 J8 x& z5 r8 [' x3 t
    import java.util.*;
    & E4 I' X( T4 j0 k/ C( Q0 x4 P9 d) e$ t; q
    import javax.xml.parsers.*;
    0 d2 j4 n' |2 [/ i, ^5 Y
    * U* g4 J! S$ G6 O3 Mimport javax.xml.transform.*;! b  u9 ?1 k5 W5 `; |9 f

    . b+ P! ?8 W( y+ [/ o  S( Rimport javax.xml.transform.dom.*;
    8 b8 P2 T  R7 g, N; |5 _( Z2 O) h) I
    0 `! f- Z" _4 v& \import javax.xml.transform.stream.*;& L2 v! X1 n4 }6 S' z' n
    0 \  J7 w& s: V: |
    import org.w3c.dom.*;
    " C0 h  p8 f6 D: B2 S" ]
    ' X1 ^. B) D. h$ Gpublic class Fuxi{
    * n2 N# h- Y7 r; q1 H$ b' Z% g1 K# S! y! y. n) T6 {4 t$ B
    public Fuxi(){}0 }- l" l" u: e+ p

    9 N$ Q* i% S2 }" Fpublic void runXml(){7 {3 C8 X6 ]$ @9 V$ x5 ]6 q& \8 Y

    9 A2 u/ o" _6 k. r/ t, w2 S7 \& L% OFile f = new File(“f:/test/xmltest/student.xml”);7 E! S& o1 v# F3 n0 n% e# u) i
    + k: k9 e" O' ?
    try{
    ! n+ h, O' c8 I9 U& l; f' [/ N( f" f: P. _+ e
    //首先创建一个documentbuilderfoctory的工厂  S& C" n% F  g2 L% Z

    8 p3 B) z2 N# K$ ?  C+ C# u+ L2 yDocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();, E+ b7 M; e- f6 F  O4 n$ D" N
    ! @. }. c: I& B% k
    , u# o4 x# J- R' `+ o9 m. R
    ! k- X' y. X/ H( P" C! ]4 c
    //利用工厂来创建documengbuilder
    & f' e8 ~. I4 ^4 E6 g1 w- w$ O  @( u- E3 U2 ~7 i% G: y
    DocumentBuilder db = dbf.newDocumentBuilder();1 U9 Q) H7 v$ f8 o" Q

    5 N. \9 z: Z8 i5 r, g5 R//利用db的parse方法来解析xml文件. V2 F) e& G4 s  v& e* n* `/ ^

    " ^: g( H* G" kDocument doc = db.parse(f);7 a- a# ^1 C1 Q/ F9 B# m8 k# g
    / e' |& A/ V+ d
    //将读出来的文件格式化- e4 c* ]% O. P0 x2 N! r

    4 p) a# F: e6 C1 Udoc.normalize();& w2 \, A; E6 Q7 N
    9 U' e. T+ c+ _0 a4 B+ E, t. B- [
    //定义一个nodelist数组来存放xml文件中的节点(标签)
      s- F7 t6 g% h2 p' m4 @
    - ?7 K6 d8 l# a# D; K7 kNodeList students = doc.getElementsByTagName(“student”);! e( a2 @% Z. C+ f* ?( D

    ! B' t, H* N7 y0 s! b4 K+ R1 ^//从xml文件中读取数据& x% a5 s3 I0 R

    * p/ ]; ~9 H; K  B2 jfor(int i=0;i<students.getLength();i++){: d. \9 s3 {# e. T+ |0 x

    3 H: w: x' Z6 }& V& Z+ c! N//定义一个元素
    0 k- W4 m* u2 C+ V* s) w: z; }$ D! {7 x6 D) z  H/ y
    Element student = (Element)students.item(i);" D' H6 a0 `% p0 }: D9 S

    0 N& X& B" C* _) PSystem.out.println(“stu_id :”+student.getElementsByTagName(“stu_id”).item(0).getFirstChild().getNodeValue());
    / z: u! R, e- G" I7 `
    2 `0 j; g: r/ o6 PSystem.out.println(“name :”+student.getElementsByTagName(“name”).item(0).getFirstChild().getNodeValue());9 k  N0 l# o) a8 w. r4 _+ q  D

    9 [8 h& j0 N. B* u6 ]3 ~3 zSystem.out.println(“age :”+student.getElementsByTagName(“age”).item(0).getFirstChild().getNodeValue());  l) M2 l2 Y5 S, k, M, H$ [

    / U# @. G6 s0 F- I1 g9 O* Q}3 s) x8 p% C2 Q& i' T3 ~

    ( }" \# x" x3 W3 F2 |2 x//向文件中写数据2 h7 f" y" W5 v. c% m9 G
    7 v. f2 O0 @, z: l
    String stu_id = “001″;; r) U* [! U. k0 g: c( x- N! R
    5 A  U3 a! R  }8 a
    String name = “xingxing”;
    % Q$ |% E+ Q, A) ?; x) m9 U- O3 {- w9 d  u  |/ `# ?. r
    String age = “22″;) |3 U' x) T. M
    0 D+ {. p! h1 Z3 U
    Text msg;" k$ w( f* b/ R. T9 S5 k
    6 a/ Q5 B2 B9 h. d1 A, L" L
    //创建元素
    5 v; A" Z8 [- g
      Y" `& z, b9 I0 z( r) mElement studentNew = doc.createElement(“student”);8 G1 U2 W! U, a' H# G9 ^: f, f* ?
    5 X6 O7 z* J" L
    //创建子元素
    2 }  B. K) L& Y* R$ @- q' ]5 Z& C. y  d% C5 K1 ~
    Element stuid = doc.createElement(“stu_id”);
    9 _7 G* a" [+ }1 p! G7 d# V5 L; V! |+ I, d3 F; [- P( |
    //设置元素的值
    / g6 a7 r! A7 ~, h: i1 _9 s/ Y3 M+ V" V* L9 E% G
    msg = doc.createTextNode(stu_id);  g, r% J; ]$ F0 }& K  j: n

    0 k( W. H$ w0 O! A# d//将值添加 给元素" X! H# m9 z# Y8 h

    , a( z) X2 W+ e0 m" S2 R0 Mstuid.appendChild(msg);; g/ N4 s/ L3 D1 Q, e( h

    8 n4 {! G0 O# K/ w: j* o, b* [//将元素添加到节点数组中' m- R6 M$ U% {! q; a' L

    # p5 P7 b' J) ~; j( H$ [  c3 Y8 QstudentNew.appendChild(stuid);
    % t' |) X) j9 ]3 c$ n0 `8 ?: N+ ?
    % C, Y$ w! ]) a0 \Element name1 = doc.createElement(“name”);
    + {5 X' V! a( v/ \+ S. c
    ' i# W' L3 P$ f" k# W- ymsg = doc.createTextNode(name);, {  E4 o* i/ h$ A

    6 j! b! R" @3 P/ P" X7 ?name1.appendChild(msg);
    3 Q0 S( j7 X+ b* I1 z+ `& o9 C$ m  N$ y# r, J1 f4 Z/ F
    studentNew.appendChild(name1);
    % M' h! s* ?  ?4 Q* K, f6 }' o# v6 n' p! K! W9 K
    Element age1 = doc.createElement(“age”);+ N, s5 }3 p% ?1 m9 N$ D  [& ~% h& V
    - A# E5 ]" r3 @" M) R. [
    msg = doc.createTextNode(age);
    % M% c: Q/ s* K% q' ~) s3 _) S- e) b% N# v) l' c
    age1.appendChild(msg);1 i+ t6 }, Q( N! M7 S4 {
    , p, U( a" J$ @: C6 G2 @5 X/ Z& i
    studentNew.appendChild(age1);
    & ~) G  @$ @+ O. w% t' J; p. a; U
    # y1 C: z3 y( q% T//将元素studentnew添加到document树中7 d( V1 E, s3 `* i7 }/ U" l) k. ~, m
    ; {$ ~6 t2 |1 _9 _% e

    8 B6 g2 _  L: E# Q( @3 i
    4 ^9 {5 F+ q$ j+ R& mdoc.getDocumentElement().appendChild(studentNew);& {  G7 _" q+ C7 _$ G

    4 h/ t% O4 Q! w' ~$ s# T7 }//进行写操作
    4 ^6 ]4 d/ h0 x
    ; \$ Y$ Z7 G. e- `0 a4 [TransformerFactory tff = TransformerFactory.newInstance();
    4 E0 R3 n6 @1 @$ U0 b' O0 g+ D- y
    . x+ K$ n  m, y6 z3 _4 g9 LTransformer tfor = tff.newTransformer();( h3 ?9 q. W$ X. {" c- l( Y
    4 w! E+ h# f3 C2 z0 t
    DOMSource dos = new DOMSource(doc);
    ' S4 X+ F* s7 m; A+ O& m2 R" V
    8 q1 t/ y5 y2 _+ }: z; Y" ~9 xStreamResult result = new StreamResult(f);
    2 p0 Q* x2 V( v3 W# |, o" m, y) v4 r' b/ q5 S2 E8 f
    tfor.transform(dos,result);
    " `! R7 ^3 {: ~7 Q: a. I: |& d( k- E3 T8 k9 I' }/ x
    }catch(Exception e){, [% \  L. }* u5 }- U8 \
    1 a& Z1 t: ?* m& i0 X% Y( E
    System.out.println(e.toString());) C+ ]/ E  h; B" \

    7 A: Z8 o4 k4 Q}
    * y  J9 u, d. k" G  R; L5 [$ P' u" _+ b7 o
    }
    4 r1 @* [- j5 X0 Y- w$ F( T
    3 @3 [3 ^4 z0 L$ b* Q6 ^, ipublic static void main(String[] args){( d. D/ Z& P3 m5 I9 f

    / M1 }$ G6 F2 R7 xFuxi ff = new Fuxi();
    / e# R# C! z- G  v% t
    ; R6 T& _+ k0 @8 P7 xff.runXml();! z! u" d4 k( X5 m; k

    : h+ M0 T0 Q4 \1 D) d' `: |8 s}/ W; Q0 L% ^8 K+ g

    9 p" b! F* N$ ?# ^}
    回复

    使用道具 举报

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

       

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