zoukankan      html  css  js  c++  java
  • 03.javabean

    一、javabean简介

    1,  作用:一个可重用组件,在jsp开发中可减少重复代码,使HTML与JAVA代码分离便于日后维护。

    2,  javabean类要求:

    1. 所有类必须放在包中,且为public类型,包放在web项目的WEB-INF/classes
    2. 所有属性必须使用private封装,且必须有对应的setter和getter方法
    3. 一个javabean中至少有一个无参构造函数,此为jsp标签<jsp:useBean>所使 

    3,  web开发的标准目录结构与javabean的使用

    实际上WEB-INF中的lib和classes文件夹相当于一个默认的 classpath,classpath是类执行时所需的环境属性,当tomcat启动的时候,WEB-INF/lib和WEB-INF/classes都会自动配置到classpath之中。所以,既然WEB-INF/classes是一个classpath路径,则可以在jsp中直接import 导入classes中的javabean,也可以用jsp标签<jsp:sueBean>使用javabean

    方法一:在WEB-INF/classes中编译javabean类

     

    此时,WEB-INF/classes文件夹中已经有com.chen.ying包了,然后就可以在同一web应用的其他jsp中导入com.chen.ying包,并使用其中的Person.class

    除了通过import使用javabean之外,还可以用jsp标签<jsp:useBean>使用javabean

     

    实际上,在使用<jsp:useBean>标签创建javabean对象时,必须调用javabean的无参构造函数,这也是为什么要求javabean必须有无参构造函数的原因

    注意,当一个javabean修改以后,服务器需要重新自动,修改后的javabean才会生效。当然,也可以通过配置server.xml文件,将reloadable设置成true,当一个javabean被修改了,tomcat会自动进行检测,并重新加载,相当于重启了一次。

     

    但需要注意两点,

    一是reloadable为true时服务器会一直处于监听状态,在真正用于运行项目的时候,一定要设置为false

            二是tomcat检测到javabean被修改后,会重新加载,则之前设置的所有session属性将全部消失

    4,  javabean的删除

    同属性范围的javabean用对应的内置对象删除

    二、javabean与表单

    1,  javabean可以自动完成属性的设置,完成的原理是反射机制

    2,  下面通过表单提交数据完成一个javabean对象的初始化

    首先表单提交Person对象的属性值

    利用<jsp:useBean>自动设置

     

    <jsp:useBean>可以完成请求参数的自动设置,并且自动将输入的String型转换成int型(String型全为数字)

    执行<jsp:uesBean>时候,程序会new一个Person类的对象per01,属性范围为page,同时调用Person的无参构造函数

    执行<jsp:setProperty>时,程序会为名字为per01 的对象,自动匹配表单传来的参数,匹配原则是同名匹配,所以参数名必须与属性名一致。实际上是调用Person中的setter方法,实现机制当然是反射!

    三、javabean属性设置和取得

    1,  设置属性

     

    自动匹配,即将页面接收到的参数自动赋给javabean对象的同名属性,并且可以自动将String转int,最常用的属性设置

    指定属性,只为property指定的属性自动设置参数,设置方法当然是同名匹配

    指定参数,为property指定的属性设置param指定的参数的值

    指定内容,为property指定的属性,设置指定的内容。

    共同点,只要设置属性,都需要调用javabean的setter方法

    2,  取得属性

     

    调用javabean的getter方法,取得指定对象指定属性的值

    3,  小结

    设置和取得属性的标签依靠的是反射机制。以后在标签中出现了id则一定表示一个实例化对象,出现了name则肯定是要找属性范围内的内容,如实例化对象,出现了property则是表示类中的一个属性

     

    重点:<jsp:useBean>得到的实例对象其实是保存在名为id的域范围中,所以javabean的删除与一般域属性的删除一样,不同域范围的javabean用不同域对象删除

    四、DAO设计模式

    1,  简介:DAO,数据访问对象,主要用于数据访问操作的,在程序的标准开发架构中属于数据层的操作

    2,  标准开发架构

     

    3,  DAO的组成

    在整个DAO中实际上都是以接口为操作标准的,即客户端依靠DAO实现的接口进行操作,服务器端要将接口进行具体实现,DAO由以下几部分组成

    1. DataBaseConnection: 专门负责数据库的打开与关闭操作的类
    2. VO: 即javabean,由属性和对应setter,getter组成,VO类中的属性与表中字段相对应,每个VO对象代表一条表记录
    3. DAO,定义操作数据库的接口,如增删改查
    4. Impl,DAO接口的实现类,但不负责数据的打开与关闭
    5. Proxy,代理实现类,利用Impl对象完成数据的操作并负责数据库的打开与关闭
    6. Factory,通过工厂类取得一个DAO实例化对象

    4,  代码实现

    person

    package com.chen.ying;
    
    import java.sql.Date;
    
    public class Person {
    
        private int id;
    
        private int age;
    
        private String name;
    
        private Date birthday;
    
        private float salary;
    
        public int getAge() {
    
            return age;
    
        }
    
        public void setAge(int age) {
    
            this.age = age;
    
        }
    
        public String getName() {
    
            return name;
    
        }
    
        public void setName(String name) {
    
            this.name = name;
    
        }
    
        public Date getBirthday() {
    
            return birthday;
    
        }
    
        public void setBirthday(Date birthday) {
    
            this.birthday = birthday;
    
        }
    
        public float getSalary() {
    
            return salary;
    
        }
    
        public void setSalary(float salary) {
    
            this.salary = salary;
    
        }
    
        public int getId() {
    
            return id;
    
        }
    
        public void setId(int id) {
    
            this.id = id;
    
        }
    
    }

      DatabaseConnection

    package com.chen.ying;
    
    import java.sql.Connection;
    
    import java.sql.DriverManager;
    
    import java.sql.SQLException;
    
    public class DataBaseConnection {
    
        private static final String DBDRIVER="com.mysql.jdbc.Driver";
    
        private static final String DBURL="jdbc:mysql://localhost:3306/person";
    
        private static final String DBUSER="root";
    
        private static final String DBPASSWORD="1995228";
    
        private Connection conn=null;
    
        public DataBaseConnection() throws Exception {
    
            Class.forName(DBDRIVER);//加载数据库驱动程序
    
            this.conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);//连接数据库
    
        }
    
       
    
        public Connection getConnection(){//得到数据库连接
    
            return this.conn;
    
        }
    
        public void closeConnection() throws SQLException{//关闭数据库
    
            if(this.conn!=null){
    
                this.conn.close();
    
            }
    
        }
    
    }

         DAO

    package com.chen.ying;
    
    import java.util.List;
    
    public interface DAO {
    
        public boolean doInsert(Person person)throws Exception;//向表中添加纪录
    
        public List<Person> findAll()throws Exception;//查询表中所有记录
    
        public Person findById(int id)throws Exception;//根据主键id查询表中记录
    
    }

    ImplDAO

    package com.chen.ying;
    
    import java.sql.Connection;
    
    import java.sql.Date;
    
    import java.sql.PreparedStatement;
    
    import java.sql.ResultSet;
    
    import java.text.SimpleDateFormat;
    
    import java.util.ArrayList;
    
    import java.util.List;
    
     
    
    public class ImplDAO implements DAO {
    
        private Connection conn=null;
    
        private PreparedStatement pstmt=null;
    
        public ImplDAO(Connection conn) {
    
            this.conn=conn;//注意Impl类只负责实现接口方法,并不连接或关闭数据库
    
        }
    
        @Override
    
        public boolean doInsert(Person person) throws Exception {
    
            boolean flag=false;
    
            String sql="insert into person values(?,?,?,?,?)";
    
            pstmt=conn.prepareStatement(sql);//得到预处理状态字
    
            pstmt.setInt(1, person.getId());//设置参数
    
            pstmt.setInt(2, person.getAge());
    
            pstmt.setString(3, person.getName());
    
            pstmt.setDate(4,new Date(person.getBirthday().getTime()));
    
            pstmt.setFloat(5, person.getSalary());
    
            flag=pstmt.execute();
    
            return flag;
    
        }
    
        @Override
    
        public List<Person> findAll() throws Exception {
    
            List<Person> all=new ArrayList<Person>();
    
            String sql="select id,age,name,birthday,salary from person";
    
            pstmt=conn.prepareStatement(sql);
    
            ResultSet rs=pstmt.executeQuery();
    
            while(rs.next()){
    
                Person person=new Person();
    
                person.setId(rs.getInt(1));
    
                person.setAge(rs.getInt(2));
    
                person.setName(rs.getString(3));
    
                person.setBirthday(rs.getDate(4));
    
                person.setSalary(rs.getFloat(5));
    
                all.add(person);
    
            }
    
            return all;
    
        }
    
        @Override
    
        public Person findById(int id) throws Exception {
    
            String sql="select id,age,name,birthday,salary from person where id=?";
    
            pstmt=conn.prepareStatement(sql);
    
            pstmt.setInt(1, id);
    
            ResultSet rs=pstmt.executeQuery();
    
            Person person=new Person();
    
            if(rs.next()){
    
                person.setId(rs.getInt(1));
    
                person.setAge(rs.getInt(2));
    
                person.setName(rs.getString(3));
    
                person.setBirthday(rs.getDate(4));
    
                person.setSalary(rs.getFloat(5));
    
            }
    
            return person;
    
        }
    
    }

         ProxyDAO

    package com.chen.ying;
    
     
    
    import java.sql.Connection;
    
    import java.util.List;
    
     
    
    public class ProxyDAO implements DAO {
    
        private DataBaseConnection dbc=null;
    
        private ImplDAO dao=null;
    
        public ProxyDAO() throws Exception {
    
            this.dbc=new DataBaseConnection();
    
            this.dao=new ImplDAO(this.dbc.getConnection());
    
        }
    
        @Override
    
        public boolean doInsert(Person person) throws Exception {
    
            return this.dao.doInsert(person);
    
        }
    
        @Override
    
        public List<Person> findAll() throws Exception {
    
            return this.dao.findAll();
    
        }
    
        @Override
    
        public Person findById(int id) throws Exception {
    
            return this.dao.findById(id);
    
        }
    
     
    
    }

    Factroy

    package com.chen.ying;
    
     
    
    public class Factory {
    
        public static ProxyDAO getImplDAOInstance() throws Exception{
    
            return new ProxyDAO();
    
        }
    
    }

    创建测试类

    package com.chen.ying;
    
     
    
    import java.sql.Date;
    
    import java.text.SimpleDateFormat;
    
    import java.util.List;
    
     
    
    public class DAOTest {
    
     
    
        public static void main(String[] args) throws Exception {
    
            ProxyDAO dao=Factory.getImplDAOInstance();
    
              Person person=new Person();
    
            person=dao.findById(3);
    
            System.out.println(person.getName());
    
            List<Person> list=dao.findAll();
    
            System.out.println("识别号    年龄   姓名  出生年月          工资");
    
            for(Person per:list){
    
                System.out.println(per.getId()+"       "+per.getAge()+"  "+per.getName()+
    
                        "  "+per.getBirthday()+" "+per.getSalary());
    
            }
    
        }
    
     
    
    }

    需要注意的是日期数据的操作,因为有关SQL的日期操作如pstmt.setDate()或rs.getDate()参数或类型都是java.sql.Date类,所以VO类的日期应该为java.sql.Date类型且对于插入的日期数据应该转换成java.sql.Date类型

     

  • 相关阅读:
    面向对象 委托
    面向对象 继承 接口
    C# 面向对象 , 类与对象
    C# 知识点回顾
    SQL 数据库知识点回顾
    C# 10 总复习
    spring boot jpa 表关联查询分组 group by 去重
    钉钉新增考勤组 设置考勤规则
    elasticsearch 学习之父子关联查询 parent/child
    Elasticsearch 查询学习
  • 原文地址:https://www.cnblogs.com/chenxd/p/7802388.html
Copyright © 2011-2022 走看看