Java内部类详解

1:Struts2表单数据校验:

 

  (1)前台校验,也称之为客户端校验,主假使因此Javascript编程的法门展开数据的表达。

Java内部类详解

  说起内部类这几个词,想必很四个人都不不熟悉,可是又会以为不熟悉。原因是常常编写制定代码时或然用到的面貌不多,用得最多的是在有事件监听的图景下,并且即接纳到也很少去总计内部类的用法。后天大家就来一探终归。上面是本文的目录大纲:

  一.内项目基础

  二.深切通晓里面类

  三.内项目标利用境况和好处

  四.广泛的与其间类相关的笔试面试题

  (2)后台校验,也叫做服务器校验,那里指的是利用Struts2经过xml配置的法子开始展览表单数据的校验。

一.内类型基础

  在Java中,能够将贰个类定义在另1个类里面只怕二个措施里面,那样的类称为在这之中类。广泛意义上的里边类一般的话包蕴那二种:成员内部类、局地内部类、匿名内部类和静态内部类。上面就先来打探一下那两种内部类的用法。

  1.成员内部类

  成员内部类是最平凡的个中类,它的定义为身处另贰个类的中间,形如上边包车型大巴样式:

class Circle {
    double radius = 0;

    public Circle(double radius) {
        this.radius = radius;
    }

    class Draw {     //内部类
        public void drawSahpe() {
            System.out.println("drawshape");
        }
    }
}

  那样看起来,类Draw像是类Circle的三个分子,Circle称为外部类。成员内部类能够无条件访问外部类的具有成员属性和成员方法(包含private成员和静态成员)。

class Circle {
    private double radius = 0;
    public static int count =1;
    public Circle(double radius) {
        this.radius = radius;
    }

    class Draw {     //内部类
        public void drawSahpe() {
            System.out.println(radius);  //外部类的private成员
            System.out.println(count);   //外部类的静态成员
        }
    }
}

  可是要小心的是,当成员内部类具有和表面类同名的积极分子变量或许措施时,会时有发生隐藏现象,即默许情状下访问的是成员内部类的分子。要是要拜访外部类的同名成员,须求以上边包车型大巴花样展开访问:

外部类.this.成员变量
外部类.this.成员方法

  纵然成员内部类能够无偿地走访外部类的成员,而外部类想拜会成员内部类的分子却不是如此随便了。在外表类中假设要拜访成员内部类的积极分子,必须先创设3个成员内部类的指标,再经过指向这一个指标的引用来做客:

class Circle {
    private double radius = 0;

    public Circle(double radius) {
        this.radius = radius;
        getDrawInstance().drawSahpe();   //必须先创建成员内部类的对象,再进行访问
    }

    private Draw getDrawInstance() {
        return new Draw();
    }

    class Draw {     //内部类
        public void drawSahpe() {
            System.out.println(radius);  //外部类的private成员
        }
    }
}

  成员内部类是隶属外部类而存在的,也正是说,如若要成立成员内部类的靶子,前提是必须存在多少个外部类的对象。创立成员内部类对象的貌似方法如下:

public class Test {
    public static void main(String[] args)  {
        //第一种方式:
        Outter outter = new Outter();
        Outter.Inner inner = outter.new Inner();  //必须通过Outter对象来创建

        //第二种方式:
        Outter.Inner inner1 = outter.getInnerInstance();
    }
}

class Outter {
    private Inner inner = null;
    public Outter() {

    }

    public Inner getInnerInstance() {
        if(inner == null)
            inner = new Inner();
        return inner;
    }

    class Inner {
        public Inner() {

        }
    }
}

  内部类能够拥有private访问权限、protected访问权限、public访问权限及包访问权限。比如上边包车型地铁例证,假设成员内部类Inner用private修饰,则不得不在外部类的中间访问,假设用public修饰,则其余地点都能访问;若是用protected修饰,则不得不在同2个包下或然三番五次外部类的事态下访问;假设是暗中认可访问权限,则不得不在同1个包下访问。那或多或少和表面类有有个别不一致,外部类只可以被public和包访问二种权限修饰。小编个人是那样精通的,由于成员内部类看起来像是外项目标贰个分子,所以可以像类的成员一致拥有三种权力修饰。

  2.有些内部类

  局部内部类是概念在2个主意如故一个功效域里面的类,它和分子内部类的区分在于有些内部类的拜会仅限于方法内照旧该意义域内。

class People{
    public People() {

    }
}

class Man{
    public Man(){

    }

    public People getWoman(){
        class Woman extends People{   //局部内部类
            int age =0;
        }
        return new Woman();
    }
}

  注意,局地内部类就像方法里面包车型的士一个有的变量一样,是不能够有public、protected、private以及static修饰符的。

  3.匿名内部类

  匿名内部类应该是日常大家编辑代码时用得最多的,在编写事件监听的代码时利用匿名内部类不但方便,而且使代码特别便于保险。上面那段代码是一段Android事件监听代码:

scan_bt.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

            }
        });

        history_bt.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

            }
        });

  那段代码为四个按钮设置监听器,那在这之中就使用了匿名内部类。那段代码中的:

new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub

            }
        }

  正是匿名内部类的利用。代码中须要给按钮设置监听器对象,使用匿名内部类能够在促成父类也许接口中的方法意况下同时发出1个应和的对象,但是前提是这些父类也许接口必须先存在才能那样使用。当然像上边那种写法也是足以的,跟上面运用匿名内部类达到效果同样。

private void setListener()
{
    scan_bt.setOnClickListener(new Listener1());        
    history_bt.setOnClickListener(new Listener2());
}

class Listener1 implements View.OnClickListener{
    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub

    }
}

class Listener2 implements View.OnClickListener{
    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub

    }
}

  这种写法纵然能完结平等的意义,不过既冗长又难以保证,所以一般选用匿名内部类的章程来编排事件监听代码。同样的,匿名内部类也是无法有访问修饰符和static修饰符的。

  匿名内部类是唯一一种没有构造器的类。正因为其尚无构造器,所以匿名内部类的使用限制十二分有限,超过一半匿名内部类用于接口回调。匿名内部类在编译的时候由系统自动起名为Outter$1.class。一般的话,匿名内部类用于后续其余类大概达成接口,并不需求扩展额外的艺术,只是对持续方法的兑现或是重写。

  4.静态内部类

  静态内部类也是概念在另2个类里面包车型大巴类,只可是在类的前方多了2个首要字static。静态内部类是不须求依靠于外部类的,那点和类的静态成员属性有点类似,并且它不可能采纳外部类的非static成员变量也许措施,那一点很好理解,因为在没有外部类的目的的情状下,能够创建静态内部类的靶子,假如允许访问外部类的非static成员就会产生龃龉,因为表面类的非static成员必须依附于现实的指标。

public class Test {
    public static void main(String[] args)  {
        Outter.Inner inner = new Outter.Inner();
    }
}

class Outter {
    public Outter() {

    }

    static class Inner {
        public Inner() {

        }
    }
}

  图片 1

  (3)代码格局验证Action中兼有的方法;代码格局验证Action中钦命的法子;xml格局验证Action中保有的办法;xml情势验证Action中钦命的办法;

二.中肯驾驭在那之中类

  1.为什么成员内部类能够无条件访问外部类的积极分子?

  在此以前,大家早已研讨过了成员内部类能够无条件访问外部类的积极分子,那现实毕竟是怎样促成的吗?下边通过反编译字节码文件看看到底。事实上,编写翻译器在进展编译的时候,会将成员内部类单独编写翻译成1个字节码文件,上边是Outter.java的代码:

public class Outter {
    private Inner inner = null;
    public Outter() {

    }

    public Inner getInnerInstance() {
        if(inner == null)
            inner = new Inner();
        return inner;
    }

    protected class Inner {
        public Inner() {

        }
    }
}

  编译之后,出现了多少个字节码文件:

图片 2

  反编译Outter$Inner.class文件得到下边音信:

E:\Workspace\Test\bin\com\cxh\test2>javap -v Outter$Inner
Compiled from "Outter.java"
public class com.cxh.test2.Outter$Inner extends java.lang.Object
  SourceFile: "Outter.java"
  InnerClass:
   #24= #1 of #22; //Inner=class com/cxh/test2/Outter$Inner of class com/cxh/tes
t2/Outter
  minor version: 0
  major version: 50
  Constant pool:
const #1 = class        #2;     //  com/cxh/test2/Outter$Inner
const #2 = Asciz        com/cxh/test2/Outter$Inner;
const #3 = class        #4;     //  java/lang/Object
const #4 = Asciz        java/lang/Object;
const #5 = Asciz        this$0;
const #6 = Asciz        Lcom/cxh/test2/Outter;;
const #7 = Asciz        <init>;
const #8 = Asciz        (Lcom/cxh/test2/Outter;)V;
const #9 = Asciz        Code;
const #10 = Field       #1.#11; //  com/cxh/test2/Outter$Inner.this$0:Lcom/cxh/t
est2/Outter;
const #11 = NameAndType #5:#6;//  this$0:Lcom/cxh/test2/Outter;
const #12 = Method      #3.#13; //  java/lang/Object."<init>":()V
const #13 = NameAndType #7:#14;//  "<init>":()V
const #14 = Asciz       ()V;
const #15 = Asciz       LineNumberTable;
const #16 = Asciz       LocalVariableTable;
const #17 = Asciz       this;
const #18 = Asciz       Lcom/cxh/test2/Outter$Inner;;
const #19 = Asciz       SourceFile;
const #20 = Asciz       Outter.java;
const #21 = Asciz       InnerClasses;
const #22 = class       #23;    //  com/cxh/test2/Outter
const #23 = Asciz       com/cxh/test2/Outter;
const #24 = Asciz       Inner;

{
final com.cxh.test2.Outter this$0;

public com.cxh.test2.Outter$Inner(com.cxh.test2.Outter);
  Code:
   Stack=2, Locals=2, Args_size=2
   0:   aload_0
   1:   aload_1
   2:   putfield        #10; //Field this$0:Lcom/cxh/test2/Outter;
   5:   aload_0
   6:   invokespecial   #12; //Method java/lang/Object."<init>":()V
   9:   return
  LineNumberTable:
   line 16: 0
   line 18: 9

  LocalVariableTable:
   Start  Length  Slot  Name   Signature
   0      10      0    this       Lcom/cxh/test2/Outter$Inner;


}

  第叁1行到35行是常量池的内容,上边逐一第③8行的情节:

final com.cxh.test2.Outter this$0;

  这行是三个针对性外部类对象的指针,看到那里或然我们出现转机了。也正是说编写翻译器会私下认可为成员内部类添加了贰个针对性外部类对象的引用,那么这么些引用是如何赋初值的呢?下边接着看中间类的构造器:

public com.cxh.test2.Outter$Inner(com.cxh.test2.Outter);

  从那边能够见到,即便大家在概念的里边类的构造器是无参构造器,编写翻译器依旧会暗许添加三个参数,该参数的品类为指向外部类对象的2个引用,所以成员内部类中的Outter
this&0
指针便指向了表面类对象,由此能够在成员内部类中任意走访外部类的成员。从这里也直接表达了成员内部类是正视于外部类的,假设没有开创外部类的靶子,则不恐怕对Outter
this&0引用举行先河化赋值,也就无法制造成员内部类的目的了。

  2.怎么有个别内部类和匿名内部类只好访问一些final变量?

  想必这几个题材也早已苦恼过很五个人,在商讨那几个标题在此以前,先看上边那段代码:

public class Test {
    public static void main(String[] args)  {

    }

    public void test(final int b) {
        final int a = 10;
        new Thread(){
            public void run() {
                System.out.println(a);
                System.out.println(b);
            };
        }.start();
    }
}

  那段代码会被编写翻译成五个class文件:Test.class和Test$1.class。暗中认可情况下,编写翻译器会为匿名内部类和一些内部类起名为Outter$x.class(x为正整数)。

  图片 3

  根据上海体育场面可以,test方法中的匿名内部类的名字被起为 Test$1。

  上段代码中,尽管把变量a和b前边的任多少个final去掉,那段代码都编译但是。大家先考虑这么七个难点:

  当test方法执行实现之后,变量a的生命周期就终止了,而那时Thread对象的生命周期很恐怕还并未实现,那么在Thread的run方法中继承访问变量a就改成不容许了,但是又要促成如此的机能,如何是好吧?Java采取了
复制 
的一手来消除那几个难点。将那段代码的字节码反编译能够获得上边包车型大巴内容:

图片 4

  我们看到在run方法中有一条指令:

bipush 10

  那条指令表示将操作数10压栈,表示使用的是二个地点局地变量。那个历程是在编译时期由编译器暗许实行,若是那一个变量的值在编写翻译期间能够显著,则编写翻译器默许会在匿名内部类(局地内部类)的常量池中添加三个情节13分的字面量或直接将相应的字节码嵌入到实施字节码中。那样一来,匿名内部类应用的变量是另三个片段变量,只可是值和方法中部分变量的值卓殊,由此和办法中的局地变量完全部独用立开。

  下边再看三个例证:

public class Test {
    public static void main(String[] args)  {

    }

    public void test(final int a) {
        new Thread(){
            public void run() {
                System.out.println(a);
            };
        }.start();
    }
}

  反编写翻译获得:

图片 5

  我们看看匿名内部类Test$1的构造器含有三个参数,一个是指向外部类对象的引用,3个是int型变量,很分明,那里是将变量test方法中的形参a以参数的款型传进来对匿名内部类中的拷贝(变量a的正片)举行赋值开首化。

  也就说只要部分变量的值在编写翻译时期就足以鲜明,则直接在匿名内部里面创立1个拷贝。假使局地变量的值无法在编写翻译时期明确,则通过构造器传参的点子来对拷贝进行初叶化赋值。

  从下边能够观望,在run方法中走访的变量a根本就不是test方法中的局地变量a。那样一来就解决了前方所说的
生命周期分裂等的题材。可是新的题材又来了,既然在run方法中走访的变量a和test方法中的变量a不是同叁个变量,当在run方法中改变变量a的值的话,会油不过生什么情况?

  对,会促成数据差别性,那样就达不到原来的企图和供给。为了缓解这一个难题,java编译器就限制必须将变量a限制为final变量,不允许对变量a举办转移(对于引用类型的变量,是不容许指向新的靶子),这样数据不一样性的难点就能够化解了。

  到此处,想必大家应该精通为何方法中的局地变量和形参都不可能不用final举行界定了。

  3.静态内部类有例外的地点吗?

  在此以前方能够领略,静态内部类是不借助于表面类的,也就说能够在不创设外部类对象的处境下创办内部类的指标。其余,静态内部类是不持有指向外部类对象的引用的,这些读者能够团结尝试反编写翻译class文件看一下就知晓了,是绝非Outter
this&0引用的。

2:代码格局验证Action中兼有的章程(本人记得导jar包和自身安排web.xml文件,本人脑补吧):

三.内部类的选用情状和利益

  为啥在Java中供给中间类?总计一下重点有以下四点:

  1.每一种内部类都能独立的持续二个接口的完毕,所以无论外部类是或不是曾经几次三番了有些(接口的)达成,对于内部类都未曾影响。内部类使得多一连的消除方案变得完全,

  2.有益将设有一定逻辑关系的类协会在协同,又有什么不可对外界隐藏。

  3.便利编写事件驱动程序

  4.便宜编写线程代码

  个人认为第贰点是最注重的缘故之一,内部类的留存使得Java的多继承机制变得尤其完美。

四.宽广的与中间类相关的笔试面试题

 1.依据注释填写(1),(2),(3)处的代码

public class Test{
    public static void main(String[] args){
           // 初始化Bean1
           (1)
           bean1.I++;
           // 初始化Bean2
           (2)
           bean2.J++;
           //初始化Bean3
           (3)
           bean3.k++;
    }
    class Bean1{
           public int I = 0;
    }

    static class Bean2{
           public int J = 0;
    }
}

class Bean{
    class Bean3{
           public int k = 0;
    }
}

  从眼下可见,对于成员内部类,必须先爆发外部类的实例化对象,才能发生内部类的实例化对象。而静态内部类不用发生外部类的实例化对象即可发生内部类的实例化对象。

  创立静态内部类对象的一般情势为: 
外部类类名.内部类类名 xxx = new 外部类类名.内部类类名()

  创立成员内部类对象的相似格局为: 
外部类类名.内部类类名 xxx = 外部类对象名.new 内部类类名()

  由此,(1),(2),(3)处的代码分别为:

图片 6图片 7

Test test = new Test();    

  Test.Bean1 bean1 = test.new Bean1();   

View Code

 

图片 8图片 9

Test.Bean2 b2 = new Test.Bean2();    

View Code

 

图片 10图片 11

Bean bean = new Bean();     

Bean.Bean3 bean3 =  bean.new Bean3();   

View Code

2.底下那段代码的输出结果是何许?

public class Test {
    public static void main(String[] args)  {
        Outter outter = new Outter();
        outter.new Inner().print();
    }
}


class Outter
{
    private int a = 1;
    class Inner {
        private int a = 2;
        public void print() {
            int a = 3;
            System.out.println("局部变量:" + a);
            System.out.println("内部类变量:" + this.a);
            System.out.println("外部类变量:" + Outter.this.a);
        }
    }
}

图片 12图片 13

3
2
1

View Code

 

  最终补充有些文化:关于成员内部类的继续难点。一般的话,内部类是很少用来作为接二连三用的。可是当用来继承的话,要专注两点:

  1)成员内部类的引用格局必须为 Outter.Inner.

  2)构造器中务必有指向外部类对象的引用,并透过这几个引用调用super()。那段代码摘自《Java编制程序思想》

class WithInner {
    class Inner{

    }
}
class InheritInner extends WithInner.Inner { 

    // InheritInner() 是不能通过编译的,一定要加上形参 
    InheritInner(WithInner wi) { 
        wi.super(); //必须有这句调用
    } 

    public static void main(String[] args) { 
        WithInner wi = new WithInner(); 
        InheritInner obj = new InheritInner(wi); 
    } 
} 

 

 参考资料:

  《java编制程序思想》

  http://www.cnblogs.com/chenssy/p/3388487.html

  http://blog.csdn.net/zhangjg_blog/article/details/20000769

  http://blog.csdn.net/zhangjg_blog/article/details/19996629

  http://blog.csdn.net/zhaoqianjava/article/details/6849812

  http://www.cnblogs.com/nerxious/archive/2013/01/24/2875649.html

注册的jsp页面:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 7 <title>数据校验</title>
 8 </head>
 9 <body>
10 
11 <form action="${pageContext.request.contextPath}/data_checkData.action" method="post">
12     账号:<input type="text" name="user.name"/><br/>
13     密码:<input type="password" name="user.password"/><br/>
14     邮箱:<input type="text" name="user.email"/><br/>
15     生日:<input type="text" name="user.birthday"/><br/>
16     
17          <input type="submit" value="注册"/>
18          <input type="reset" value="重置"/>
19 </form>
20 
21 </body>
22 </html>

 数据校验的Action类的兑现:

 1 package com.bie.lesson10;
 2 
 3 import com.opensymphony.xwork2.ActionSupport;
 4 
 5 /** 
 6 * @author  Author:别先生 
 7 * @date Date:2017年9月24日 下午3:28:25 
 8 *
 9 * 1:注意,如果想要用struts的数据校验功能,必须继承ActionSupport或者实现相关接口;
10 */
11 public class CheckAction extends ActionSupport{
12 
13     /**
14      * 
15      */
16     private static final long serialVersionUID = 1L;
17     
18     //封装请求数据
19     private User user;
20     public void setUser(User user) {
21         this.user = user;
22     }
23     public User getUser() {
24         return user;
25     }
26     
27     //重写数据校验的功能
28     @Override
29     public void validate() {
30         //用户名非空校验
31         if(user.getName() == null || "".equals(user.getName())){
32             //保存错误信息
33             super.addFieldError("name", "用户的账号不能为空。");
34         }
35         //密码非空校验
36         if(user.getPassword() == null || "".equals(user.getPassword())){
37             //保存错误信息
38             super.addFieldError("password", "用户的密码不能为空");
39         }
40         //用户的邮箱校验
41         /*if(user.getEmail() == null || "".equals(user.getEmail())){
42             //保存错误信息
43             super.addFieldError("email", "用户的邮箱不能为空");
44         }*/
45         //用户的生日不能为空
46         /*if(user.getBirthday() == null || "".equals(user.getBirthday())){
47             //保存错误信息
48             super.addFieldError("birthday" , "用户的生日不能为空");
49         }*/
50         
51     }
52 
53     //业务方法
54     public String checkData(){
55         
56         System.out.println(user);
57         return SUCCESS;
58     }
59     
60 }

struts2的配置xml文件:

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
 4     "http://struts.apache.org/dtds/struts-2.0.dtd">
 5 
 6 <struts>
 7     <package name="checkPackage" extends="struts-default">
 8         <action name="data_*" class="com.bie.lesson10.CheckAction" method="{1}">
 9             <result name="success">success2.jsp</result>
10             <result name="input">error.jsp</result>
11         </action>        
12         
13     </package>
14 
15 </struts>
16     

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
 4     "http://struts.apache.org/dtds/struts-2.0.dtd">
 5 
 6 <struts>
 7     <!-- struts在允许的时候会加载这个总配置文件:src/struts.xml -->
 8     
 9     <!-- 全局配置 -->
10     <!-- 修改Struts的默认访问后缀 -->
11     <!-- <constant name="struts.action.extension" value="action,do,struts,"></constant> -->
12     <include file="constant.xml"></include>
13     
14     <!-- 在总配置文件中引入其他所有的配置文件 -->
15     
16     <!-- <include file="com/bie/lesson/helloStruts.xml"></include> -->
17     
18     <!-- <include file="com/bie/lesson02/strutsAction.xml"></include> -->
19     
20     <!-- <include file="com/bie/lesson03/strutsConfig.xml"></include> -->
21     
22     <!-- <include file="com/bie/lesson04/strutsData.xml"></include> -->
23     
24     <!-- <include file="com/bie/lesson05/strutsType.xml"></include> -->
25     
26     <!-- <include file="com/bie/lesson06/strutsUpload.xml"></include> -->
27     
28     <!-- <include file="com/bie/lesson07/strutsInterceptor.xml"></include> -->
29     
30     <!-- <include file="com/bie/lesson08/action/strutsAdmin.xml"></include> -->
31     
32     <!-- <include file="com/bie/lesson09/strutsOgnl.xml"></include> -->
33     
34     <include file="com/bie/lesson10/strutsCheck.xml"></include>
35     
36     
37     
38     
39 </struts>

用户的实体类的内容:

 1 package com.bie.lesson10;
 2 
 3 import java.util.Date;
 4 
 5 /** 
 6 * @author  Author:别先生 
 7 * @date Date:2017年9月24日 下午3:59:21 
 8 *
 9 *
10 */
11 public class User {
12 
13     private String name;
14     private String password;
15     private String email;
16     private Date birthday;
17     public String getName() {
18         return name;
19     }
20     public void setName(String name) {
21         this.name = name;
22     }
23     public String getPassword() {
24         return password;
25     }
26     public void setPassword(String password) {
27         this.password = password;
28     }
29     public String getEmail() {
30         return email;
31     }
32     public void setEmail(String email) {
33         this.email = email;
34     }
35     public Date getBirthday() {
36         return birthday;
37     }
38     public void setBirthday(Date birthday) {
39         this.birthday = birthday;
40     }
41     public User(String name, String password, String email, Date birthday) {
42         super();
43         this.name = name;
44         this.password = password;
45         this.email = email;
46         this.birthday = birthday;
47     }
48     public User() {
49         super();
50     }
51     
52     
53 }

中标的页面和挫败的页面:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@ taglib prefix="s" uri="/struts-tags"%>    
 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 5 <html>
 6 <head>
 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 8 <title>struts2 hello </title>
 9 </head>
10 <body>
11 
12 <h1>成功注册</h1>
13 
14 
15 
16 <!-- struts的调试标签:可以观测值栈数据 -->
17 <s:debug></s:debug>
18 </body>
19 </html>

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@ taglib uri="/struts-tags" prefix="s"%>    
 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 5 <html>
 6 <head>
 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 8 <title>Insert title here</title>
 9 </head>
10 <body>
11 
12 <h1>错误的视图</h1>
13 <h1>错误的error</h1>
14 
15 <!-- 查看struts框架在运行时期产生的所有错误信息 -->
16 <s:fielderror></s:fielderror>
17 </body>
18 </html>

 3:代码格局验证Action中钦定的点子(写验证方式命名规则,validate+要证实的主意名称,举例如下所示:);

 1 package com.bie.lesson10;
 2 
 3 import com.opensymphony.xwork2.ActionSupport;
 4 
 5 /** 
 6 * @author  Author:别先生 
 7 * @date Date:2017年9月24日 下午3:28:25 
 8 *
 9 * 1:注意,如果想要用struts的数据校验功能,必须继承ActionSupport或者实现相关接口;
10 */
11 public class CheckAction extends ActionSupport{
12 
13     /**
14      * 
15      */
16     private static final long serialVersionUID = 1L;
17     
18     //封装请求数据
19     private User user;
20     public void setUser(User user) {
21         this.user = user;
22     }
23     public User getUser() {
24         return user;
25     }
26     
27     //重写数据校验的功能
28     /*@Override
29     public void validate() {
30         //用户名非空校验
31         if(user.getName() == null || "".equals(user.getName())){
32             //保存错误信息
33             super.addFieldError("name", "用户的账号不能为空。");
34         }
35         //密码非空校验
36         if(user.getPassword() == null || "".equals(user.getPassword())){
37             //保存错误信息
38             super.addFieldError("password", "用户的密码不能为空");
39         }
40         //用户的邮箱校验
41         if(user.getEmail() == null || "".equals(user.getEmail())){
42             //保存错误信息
43             super.addFieldError("email", "用户的邮箱不能为空");
44         }
45         //用户的生日不能为空
46         if(user.getBirthday() == null || "".equals(user.getBirthday())){
47             //保存错误信息
48             super.addFieldError("birthday" , "用户的生日不能为空");
49         }
50         
51     }*/
52     
53     
54     public void validatecheckData() {
55         //用户名非空校验
56         if(user.getName() == null || "".equals(user.getName())){
57             //保存错误信息
58             super.addFieldError("name", "用户的账号不能为空。");
59         }
60         //密码非空校验
61         if(user.getPassword() == null || "".equals(user.getPassword())){
62             //保存错误信息
63             super.addFieldError("password", "用户的密码不能为空");
64         }
65         //用户的邮箱校验
66         /*if(user.getEmail() == null || "".equals(user.getEmail())){
67             //保存错误信息
68             super.addFieldError("email", "用户的邮箱不能为空");
69         }*/
70         //用户的生日不能为空
71         /*if(user.getBirthday() == null || "".equals(user.getBirthday())){
72             //保存错误信息
73             super.addFieldError("birthday" , "用户的生日不能为空");
74         }*/
75         
76     }
77 
78     //业务方法
79     public String checkData(){
80         
81         System.out.println(user);
82         return SUCCESS;
83     }
84     
85     //用户列表的展示
86     public String list(){
87         
88         System.out.println("模拟是否验证");
89         return "list";
90     }
91     
92 }

4:xml格局验证Action中有所的不二法门(代码验证相比较繁琐,设计很多重新的表达逻辑,例如,非空验证,数值验证,email,日期等等,struts2对此常用的辨证,进行了包装,即提供了验证器,验证钦赐额常用业务逻辑;);

  4.1:Struts提供的验证器:xwork-core-2.3.16.3.jar   
—》com.opensymphony.xwork2.validator.validators
—》default.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
        "-//Apache Struts//XWork Validator Definition 1.0//EN"
        "http://struts.apache.org/dtds/xwork-validator-definition-1.0.dtd">

<!-- START SNIPPET: validators-default -->
<validators>
    <validator name="required" class="com.opensymphony.xwork2.validator.validators.RequiredFieldValidator"/>
    <validator name="requiredstring" class="com.opensymphony.xwork2.validator.validators.RequiredStringValidator"/>
    <validator name="int" class="com.opensymphony.xwork2.validator.validators.IntRangeFieldValidator"/>
    <validator name="long" class="com.opensymphony.xwork2.validator.validators.LongRangeFieldValidator"/>
    <validator name="short" class="com.opensymphony.xwork2.validator.validators.ShortRangeFieldValidator"/>
    <validator name="double" class="com.opensymphony.xwork2.validator.validators.DoubleRangeFieldValidator"/>
    <validator name="date" class="com.opensymphony.xwork2.validator.validators.DateRangeFieldValidator"/>
    <validator name="expression" class="com.opensymphony.xwork2.validator.validators.ExpressionValidator"/>
    <validator name="fieldexpression" class="com.opensymphony.xwork2.validator.validators.FieldExpressionValidator"/>
    <validator name="email" class="com.opensymphony.xwork2.validator.validators.EmailValidator"/>
    <validator name="url" class="com.opensymphony.xwork2.validator.validators.URLValidator"/>
    <validator name="visitor" class="com.opensymphony.xwork2.validator.validators.VisitorFieldValidator"/>
    <validator name="conversion" class="com.opensymphony.xwork2.validator.validators.ConversionErrorFieldValidator"/>
    <validator name="stringlength" class="com.opensymphony.xwork2.validator.validators.StringLengthFieldValidator"/>
    <validator name="regex" class="com.opensymphony.xwork2.validator.validators.RegexFieldValidator"/>
    <validator name="conditionalvisitor" class="com.opensymphony.xwork2.validator.validators.ConditionalVisitorFieldValidator"/>
</validators>
<!--  END SNIPPET: validators-default -->

  4.2:怎样写xml,从而定义表明规则:

    (a)xml文件名称语法:ActionClassName-validation.xml,注意,此xml要求与眼下要证实的action在同叁个目录;
    (b)举例:CheckXmlAction-validation.xml,找到xwork-core-2.3.16.3.jar/xwork-validator-1.0.3.dtd复制一下dtd的头文件:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE validators PUBLIC
          "-//Apache Struts//XWork Validator 1.0.3//EN"
          "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">

 1 package com.bie.lesson11;
 2 
 3 import com.opensymphony.xwork2.ActionSupport;
 4 
 5 /** 
 6 * @author  Author:别先生 
 7 * @date Date:2017年9月24日 下午3:28:25 
 8 *
 9 * 1:注意,如果想要用struts的数据校验功能,必须继承ActionSupport或者实现相关接口;
10 */
11 public class CheckXmlAction extends ActionSupport{
12 
13     /**
14      * 
15      */
16     private static final long serialVersionUID = 1L;
17     
18     //封装请求数据
19     private User user;
20     public void setUser(User user) {
21         this.user = user;
22     }
23     public User getUser() {
24         return user;
25     }
26     
27     
28     //业务方法
29     public String checkData(){
30         
31         System.out.println(user);
32         return SUCCESS;
33     }
34     
35     /*//用户列表的展示
36     public String list(){
37         
38         System.out.println("模拟是否验证");
39         return "list";
40     }*/
41     
42 }

评释的xml配置,注意起名规则:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!DOCTYPE validators PUBLIC
 3           "-//Apache Struts//XWork Validator 1.0.3//EN"
 4           "http://struts.apache.org/dtds/xwork-validator-1.0.3.dtd">
 5 <validators>
 6     
 7     <!-- 验证的每一字段用field表示 -->
 8     <field name="user.name">
 9         <!-- 指定使用的验证器 -->
10         <field-validator type="requiredstring">
11             <!-- 验证失败的错误提示信息 -->
12             <message>用户名不能为空</message>
13         </field-validator>
14     </field>
15     
16     <!-- 验证的每一字段用field表示 -->
17     <field name="user.password">
18         <!-- 指定使用的验证器 -->
19         <field-validator type="requiredstring">
20             <!-- 验证失败的错误提示信息 -->
21             <message>密码不能为空</message>
22         </field-validator>
23         
24         <!-- 密码的长度校验 -->
25         <field-validator type="stringlength">
26             <param name="minLength">6</param>    
27             <param name="maxLength">10</param>    
28             <message>密码长度必须6-10位</message>
29         </field-validator>
30     </field>
31     
32     <!-- 验证日期和验证邮箱 -->
33     <field name="user.email">
34         <field-validator type="email">
35             <message>邮箱格式不正确</message>
36         </field-validator>
37     </field>
38     <field name="user.birthday">
39         <field-validator type="date">
40             <message>日期格式不正确</message>
41         </field-validator>
42     </field>
43     
44 </validators>          
45           
46           

5:xml格局验证Action中内定的法子(与地点xml验证措施大约相同,验证xml文件内容不变);

  5.1:命名规则:语法,ActionClassName-ActionName-validation.xml,举例:CheckXmlAction-data_checkData-validation.xml即验证CheckXmlAction的checkData方法;

 验证计算

style=”font-size: 18px;”>代码验证:

重写validate()   ,  验证 style=”font-family: Calibri;”>action全部办法

Validate方法名 style=”font-family: Calibri;”>(),
 验证钦定“方法名”的法门

 

Xml:

表明全部办法:
ActionClassName-validation.xml

style=”font-size: 18px;”>验证钦赐方法: ActionClassName-actionName-validation.xml

代码验证:

比较灵活,能够知足全体的须求.

style=”font-size: 18px;”>相比麻烦,要写重复的求证判断逻辑!

符合: 表单字段较少的景况用!

XML验证:

通用,但不够利索;
能够表明特定不难的事务。

切合:
验证表单字段较多,能够大大简化代码!

  (配置文件过多 style=”font-family: Calibri;”>)

 6:验证错误处理的三种办法,若是数量输入错误就依然跳转到输入数据的界面,那一点在struts.xml里面控制:

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
 4     "http://struts.apache.org/dtds/struts-2.0.dtd">
 5 
 6 <struts>
 7     <package name="checkXmlPackage" extends="struts-default">
 8         <!-- 注册失败跳转到注册页面,显示失败信息 -->
 9         <global-results>
10             <result name="input">/dataXmlCheck.jsp</result>
11         </global-results>
12         
13         <action name="data_*" class="com.bie.lesson11.CheckXmlAction" method="{1}">
14             <result name="success">/success2.jsp</result>
15             <!-- <result name="input">/error.jsp</result> -->
16             <!-- <result name="list">success2.jsp</result> -->
17         </action>        
18         
19     </package>
20 
21 </struts>
22     

接下来在输入数据的页面进行不当提示:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8"%>
 3 <%@ taglib prefix="s" uri="/struts-tags"%>    
 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 5 <html>
 6 <head>
 7 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 8 <title>数据校验</title>
 9 
10 <!-- 修改struts标签默认的样式: 不让换行 --> 
11 <style type="text/css">
12     ul{display: inline;}
13     ul li{display: inline;color: red;}
14 </style>
15 
16 </head>
17 <body>
18 
19 <!-- 显示的是Struts2在运行时期产生的所有错误 -->
20 <!-- 方式一 -->
21 <%-- <s:fielderror></s:fielderror> --%>
22 
23 <%-- <s:fielderror fieldName="user.name"></s:fielderror>
24 <s:fielderror fieldName="user.password"></s:fielderror>
25 <s:fielderror fieldName="user.email"></s:fielderror>
26 <s:fielderror fieldName="user.birthday"></s:fielderror> --%>
27 
28 <form action="${pageContext.request.contextPath}/data_checkXmlData.action" method="post">
29     账号:<input type="text" name="user.name"/>
30         <!-- 方式二 -->    
31         <s:fielderror fieldName="user.name"></s:fielderror><br/>
32     密码:<input type="password" name="user.password"/>
33         <s:fielderror fieldName="user.password"></s:fielderror><br/>
34     邮箱:<input type="text" name="user.email"/><br/>
35         <%-- <s:fielderror fieldName="user.email"></s:fielderror> --%>
36     生日:<input type="text" name="user.birthday"/><br/>
37         <%-- <s:fielderror fieldName="user.birthday"></s:fielderror> --%>
38          <input type="submit" value="注册"/>
39          <input type="reset" value="重置"/>
40 </form>
41 
42 </body>
43 </html>

方式三(fielderror.ftl文件):

措施3:
修改标签定义的沙盘

style=”font-size: 18px;”>找到田野error标签定义的沙盘文件:

style=”font-size: 18px;”>Struts-core.jar\template\simple\ fielderror.ftl

style=”font-size: 18px;”>把修改后的田野(field)error.ftl文件,放到src/ template/ simple/ 田野先生error.ftl

那样标签呈现的样式就修改了!

<#--
/*
 * $Id: fielderror.ftl 805635 2009-08-19 00:18:54Z musachy $
 *
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *  http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
-->
<#if fieldErrors??><#t/>
<#assign eKeys = fieldErrors.keySet()><#t/>
<#assign eKeysSize = eKeys.size()><#t/>
<#assign doneStartUlTag=false><#t/>
<#assign doneEndUlTag=false><#t/>
<#assign haveMatchedErrorField=false><#t/>
<#if (fieldErrorFieldNames?size > 0) ><#t/>
    <#list fieldErrorFieldNames as fieldErrorFieldName><#t/>
        <#list eKeys as eKey><#t/>
        <#if (eKey = fieldErrorFieldName)><#t/>
            <#assign haveMatchedErrorField=true><#t/>
            <#assign eValue = fieldErrors[fieldErrorFieldName]><#t/>
            <#if (haveMatchedErrorField && (!doneStartUlTag))><#t/>
                   <#assign doneStartUlTag=true><#t/>
            </#if><#t/>
            <#list eValue as eEachValue><#t/>
                ${eEachValue}
            </#list><#t/>            
        </#if><#t/>
        </#list><#t/>
    </#list><#t/>
    <#if (haveMatchedErrorField && (!doneEndUlTag))><#t/>
        <#assign doneEndUlTag=true><#t/>
    </#if><#t/>
<#else><#t/>    
    <#if (eKeysSize > 0)><#t/>
        <ul<#rt/>
<#if parameters.cssClass??>
 class="${parameters.cssClass?html}"<#rt/>
<#else>
 class="errorMessage"<#rt/>
</#if>
<#if parameters.cssStyle??>
 style="${parameters.cssStyle?html}"<#rt/>
</#if>
>
            <#list eKeys as eKey><#t/>
                <#assign eValue = fieldErrors[eKey]><#t/>
                <#list eValue as eEachValue><#t/>
                    <li><#if parameters.escape>${eEachValue!?html}<#else>${eEachValue!}</#if></li>
                </#list><#t/>
            </#list><#t/>
        </ul>
    </#if><#t/>
</#if><#t/>
</#if><#t/>

 7:staruts的表单核心样式修改(default学习.properties搜索theme,找到struts.ui.theme=xhtml暗中同意样式,修改一下):

<!--对于struts标签默认的主题样式:default.xml/struts.ui.theme=xhtml
可以通过常量修改, 改为简单主题:-->
<constant name="struts.ui.theme" value="simple"></constant>

 8:Struts第22中学常用的多少个技术:数据回显,模型驱动,制止表单重复提交的运用。

style=”font-size: 18px;”>(1):Struts2的多少回显技术必须利用Struts2的价签。

style=”font-size: 18px;”>《手动通过value设置展现的值value=”%{#request.user.name}”那些格式是因而ognl表明式举办显示数据的》。

style=”font-size: 18px;”>(2):数据回显技术,通过值栈存放,然后径直通过页面的name属性举行取值<s:text田野name=”userName”></text田野(field)>,如:

  ActionContext ac =
ActionContext.getContext();
  ValueStack vs =
ac.getValueStack();
  //vs.pop();//移除栈顶元素

  vs.push(“user”);//将user对象存放到值栈里面

 9:综合运用:

首先步:创制数据库和数据表,那里运用mysql私下认可的数据库test,创立数据表如下所示:

-- 创建数据表
CREATE TABLE employee(
    employeeId INT PRIMARY KEY AUTO_INCREMENT,
    employeeName VARCHAR(20),
    employeeTime DATE 
)

 第二步:搭建Struts的环境(导包,配置web.xml和c3p0的配置,):

style=”font-size: 18px;”> 导包,包涵struts的包和mysql的包还有c3p0的包:

c3p0-0.9.1.2.jar
commons-dbutils-1.6.jar
commons-fileupload-1.3.1.jar
commons-io-2.2.jar
commons-lang3-3.1.jar
freemarker-2.3.19.jar
javassist-3.11.0.GA.jar
jstl-1.2.jar
style=”font-size: 18px;”>mysql-connector-java-5.1.12-bin.jar
ognl-3.0.6.jar
struts2-core-2.3.16.3.jar
xwork-core-2.3.16.3.jar

<c3p0-config>

    <!-- c3p0默认配置,下面还可以配置多个数据库 -->
    <default-config>
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
        <property name="user">root</property>
        <property name="password">123456</property>
        <property name="initialPoolSize">6</property>
        <property name="maxPoolSize">50</property>
        <property name="maxIdleTime">1000</property>
    </default-config>

</c3p0-config>

布局一下web.xml文件:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
 3   <display-name>struts</display-name>
 4   <welcome-file-list>
 5     <welcome-file>index.html</welcome-file>
 6     <welcome-file>index.htm</welcome-file>
 7     <welcome-file>index.jsp</welcome-file>
 8     <welcome-file>default.html</welcome-file>
 9     <welcome-file>default.htm</welcome-file>
10     <welcome-file>default.jsp</welcome-file>
11   </welcome-file-list>
12   
13   <!-- struts2的核心过滤器 -->
14   <filter>
15       <filter-name>struts</filter-name>
16       <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
17   </filter>
18   <filter-mapping>
19       <filter-name>struts</filter-name>
20       <url-pattern>/*</url-pattern>
21   </filter-mapping>
22 </web-app>

配置一下Struts的总铺排文件struts.xml文件:

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE struts PUBLIC
 3     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
 4     "http://struts.apache.org/dtds/struts-2.0.dtd">
 5 
 6 <struts>
 7     <!-- struts在允许的时候会加载这个总配置文件:src/struts.xml -->
 8     
 9     <!-- 全局配置 -->
10     <!-- 修改Struts的默认访问后缀 -->
11     <!-- <constant name="struts.action.extension" value="action,do,struts,"></constant> -->
12     <!-- <include file="constant.xml"></include> -->
13     
14     <!-- 在总配置文件中引入其他所有的配置文件 -->
15     
16     <!-- <include file="com/bie/lesson01/helloStruts.xml"></include> -->
17     
18     <include file="com/bie/lesson02/strutsTest.xml"></include>
19     
20 </struts>

其三步:弄一下总是数据库的操作:

 1 package com.bie.lesson02.utils;
 2 
 3 import java.sql.Connection;
 4 import java.sql.SQLException;
 5 
 6 import javax.sql.DataSource;
 7 
 8 import org.apache.commons.dbutils.QueryRunner;
 9 
10 import com.mchange.v2.c3p0.ComboPooledDataSource;
11 
12 /***
13  * 数据库连接工具类
14  * @author 别先生
15  *
16  */
17 public class BaseUtils {
18 
19     //初始化c3p0
20     private static DataSource dataSource = null;
21     
22     //自动加载src目录下面的c3p0配置文件。c3p0-config.xml
23     static{
24         dataSource = new ComboPooledDataSource();
25     }
26     
27     public static QueryRunner getQueryRunner(){
28         //第一步:创建QueryRunner对象,传入连接池对象
29         //在创建QueryRunner对象的时候,如果传入数据对象dataSource,
30         //那么在使用QueryRunner对象的方法时候,就不需要传入连接对象
31         QueryRunner query=new QueryRunner(dataSource);
32         //第二步:会自动从数据源中获取连接(不用关闭连接)
33         return query;
34     }
35     
36     //测试一下是否连接通数据库
37     /*public static void main(String[] args) {
38         QueryRunner qr = getQueryRunner();
39         DataSource ds = qr.getDataSource();
40         try {
41             Connection conn = ds.getConnection();
42             System.out.println("连接数据库成功");
43         } catch (SQLException e) {
44             // TODO Auto-generated catch block
45             e.printStackTrace();
46         }
47         
48     }*/
49 }

第4步:初步开发dao层,那里运用接口和促成接口的方法来支付:

 1 package com.bie.lesson02.dao;
 2 
 3 import java.util.List;
 4 
 5 import com.bie.lesson02.po.Employee;
 6 
 7 public interface EmployeeDao {
 8 
 9     //查询所有的员工信息
10     List<Employee> getALL();
11     
12     //根据员工编号进行查询操作
13     Employee getById(int employeeId);
14     
15     //添加员工信息
16     void save(Employee employee);
17     
18     //修改员工信息
19     void update(Employee employee);
20 }

 1 package com.bie.lesson02.dao.impl;
 2 
 3 import java.sql.SQLException;
 4 import java.util.List;
 5 
 6 import org.apache.commons.dbutils.handlers.BeanHandler;
 7 import org.apache.commons.dbutils.handlers.BeanListHandler;
 8 
 9 import com.bie.lesson02.dao.EmployeeDao;
10 import com.bie.lesson02.po.Employee;
11 import com.bie.lesson02.utils.BaseUtils;
12 
13 public class EmployeeDaoImpl implements EmployeeDao{
14 
15     @Override
16     public List<Employee> getALL() {
17         
18         //查询的sql语句
19         String sql = " select * from employee ";
20         try {
21             return BaseUtils.getQueryRunner().query(sql, new BeanListHandler<Employee>(Employee.class));
22         } catch (SQLException e) {
23             throw new RuntimeException();
24         }
25     }
26 
27     @Override
28     public Employee getById(int employeeId) {
29         //根据员工的编号进行查询
30         String sql ="select * from employee where employeeId = ? ";
31         //问号?这个参数传到后面,切记传参数
32         try {
33             return BaseUtils.getQueryRunner().query(sql, new BeanHandler<Employee>(Employee.class),employeeId);
34         } catch (SQLException e) {
35             throw new RuntimeException();
36         }
37     }
38 
39     @Override
40     public void save(Employee employee) {
41         //保存员工的信息,即插入操作
42         String sql = " insert into employee(employeeName,employeeTime) values(?,?)";
43         
44         //使用c3p0的插入操作
45         try {
46             BaseUtils.getQueryRunner().update(sql, employee.getEmployeeName(),employee.getEmployeeTime());
47         } catch (SQLException e) {
48             throw new RuntimeException();
49         }
50     }
51 
52     @Override
53     public void update(Employee employee) {
54         //修改操作
55         String sql = "update employee set employeeName =?,employeeTime=? where employeeId =? ";
56         
57         try {
58             BaseUtils.getQueryRunner().update(sql, employee.getEmployeeName(),employee.getEmployeeTime(),employee.getEmployeeId());
59         } catch (SQLException e) {
60             throw new RuntimeException();
61         }
62     }
63 
64     
65 }

第4步:发轫开发service层,那里运用接口和落实接口的主意来支付:

 1 package com.bie.lesson02.service;
 2 
 3 import java.util.List;
 4 
 5 import com.bie.lesson02.po.Employee;
 6 
 7 public interface EmployeeService {
 8 
 9     //查询所有的员工信息
10     List<Employee> getALL();
11     
12     //根据员工编号进行查询操作
13     Employee getById(int employeeId);
14     
15     //添加员工信息
16     void save(Employee employee);
17     
18     //修改员工信息
19     void update(Employee employee);
20 }

 1 package com.bie.lesson02.service.impl;
 2 
 3 import java.util.List;
 4 
 5 import com.bie.lesson02.dao.EmployeeDao;
 6 import com.bie.lesson02.dao.impl.EmployeeDaoImpl;
 7 import com.bie.lesson02.po.Employee;
 8 import com.bie.lesson02.service.EmployeeService;
 9 
10 public class EmployeeServiceImpl implements EmployeeService{
11 
12     private EmployeeDao dao = new EmployeeDaoImpl();
13     
14     @Override
15     public List<Employee> getALL() {
16         
17         return dao.getALL();
18     }
19 
20     @Override
21     public Employee getById(int employeeId) {
22         if(employeeId != 0){            
23             return dao.getById(employeeId);
24         }
25         
26         return null;
27     }
28 
29     @Override
30     public void save(Employee employee) {
31         if(employee != null){
32             dao.save(employee);
33         }
34         
35     }
36 
37     @Override
38     public void update(Employee employee) {
39         if(employee != null){
40             dao.update(employee);
41         }
42         
43     }
44 
45     
46 }

第五步:以上全数搞完,基本只剩余使用Struts进行Action的支付,以及页面包车型大巴书写:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图