JavaBean

来源:互联网 发布:更改路由器mac 编辑:程序博客网 时间:2024/06/12 01:38

JavaBean

在JSP中如果要应用JSP提供的JavaBean的标签来操作简单类,则此类必须满足如下条件:
条件

如果一个类没有明确地定义一个构造方法,会自动生成一个无参的什么都不做的构造方法。

如果一个类中只包含了属性、setter、getter方法,那么这种类就称为简单JavaBean,还可以称为POJO、VO、TO。

Web开发的标准目录结构
Web开发的标准目录结构
Web项目中各个目录的作用
Web项目中各个目录的作用

JavaBean的保存范围

  • page:保存在一页的范围中,跳转后此Javabean无效
  • request:一个JavaBean对象可以保存在一次服务器跳转的范围中
  • session:在一个用户的操作范围中保存,重新打开浏览器时才会声明新的JavaBean
  • application:在整个服务器上保存,服务器关闭时才会消失

使用removeAttribute()删除JavaBean。

设置属性<jsp:setProperty>

设置属性

DAO设计模式

DAO(Data Access Object,数据访问对象)。
DAO设计模式

客户层:一般指浏览器
显示层:使用JSP/Servlet进行页面效果的显示
业务层(Business Object,业务对象):会将多个原子性的DAO操作进行组合,组合成一个完整的业务逻辑
数据层(DAO):提供多个原子性的DAO操作,如增加、修改、删除等,都属于原子性的操作。

DAO组成部分

例子:
VO类,包含了属性、getter、setter方法

package com.wz.lxh.vo;import java.util.Date;public class Emp {    private int empno;    private String ename;    private String job;    private Date hiredate;    private float sal;    public int getEmpno() {        return empno;    }    public void setEmpno(int empno) {        this.empno = empno;    }    public String getEname() {        return ename;    }    public void setEname(String ename) {        this.ename = ename;    }    public String getJob() {        return job;    }    public void setJob(String job) {        this.job = job;    }    public Date getHiredate() {        return hiredate;    }    public void setHiredate(Date hiredate) {        this.hiredate = hiredate;    }    public float getSal() {        return sal;    }    public void setSal(float sal) {        this.sal = sal;    }}

DatabaseConnection.java类,此类主要完成数据库的打开及关闭操作。

package com.wz.lxh.dbc;import java.sql.Connection;import java.sql.DriverManager;public class DatabaseConnection {    private static final String DBDRIVER = "com.mysql.jdbc.Driver";    private static final String DBURL = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8";    private static final String DBUSER = "root";    private static final String DBPASS = "";    private Connection conn = null;    public DatabaseConnection() throws Exception {        try {            Class.forName(DBDRIVER);            this.conn  =DriverManager.getConnection(DBURL,DBUSER, DBPASS);        } catch (Exception e) {            throw e;        }    }    public Connection getConnection() {        return this.conn;    }    public void close() throws Exception{        if(this.conn != null){            try {                this.conn.close();            } catch (Exception e) {                throw e;            }        }    }}

定义DAO**接口**,在定义DAO接口之前必须对业务进行详细的分析,要清楚地知道一张表在整个系统中应该具备何种功能。

package com.wz.lxh.dao;import java.util.List;import com.wz.lxh.vo.Emp;//定义DAO操纵接口public interface IEmpDAO {    /**     * 数据的增加操作,一般以doXxx的方式命名     * @param emp 要增加的数据对象     * @return 是否增加成功的标记     * @throws Exception 有异常交给被调用处处理     */    public boolean doCreate(Emp emp) throws Exception;    /**     * 查询全部的数据,一般以findXxx的方式命名     * @param keyWord 查询的关键字     * @return 返回全部的查询结构,每一个Emp对象表示表的一行记录     * @throws Exception 有异常交给被调用处处理     */    public List<Emp> findAll(String keyWord) throws Exception;    /**     * 根据雇员编号查询雇员信息     * @param empno 雇员编号     * @return 雇员的VO对象     * @throws Exception 有异常交给被调用处处理     */    public Emp findById(int empno) throws Exception;}

DAO接口定义完成后需要做具体的实现类,但是这里的DAO实现类有两种,一种是真实主题实现类,另外一种是代理操作类。
真实主题类主要负责具体的数据库操作,在操作时为了性能及安全将使用PreparedStatement接口完成。
真实主题实现类——EmpDAOImpl.java

package com.wz.lxh.dao.impl;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.util.ArrayList;import java.util.List;import com.wz.lxh.dao.IEmpDAO;import com.wz.lxh.vo.Emp;public class EmpDAOImpl implements IEmpDAO {    private Connection conn = null;//数据库连接对象    private PreparedStatement pstmt = null;//数据库操作对象    public EmpDAOImpl(Connection conn) {        this.conn = conn;    }    @Override    public boolean doCreate(Emp emp) throws Exception {        boolean flag = false;        String sql = "INSERT INTO emp (empno, ename, job, hiredate ,sal) "                            +"VALUES (?,?,?,?,?)";        this.pstmt = this.conn.prepareStatement(sql);        this.pstmt.setInt(1, emp.getEmpno());        this.pstmt.setString(2, emp.getEname());        this.pstmt.setString(3, emp.getJob());        this.pstmt.setDate(4, new java.sql.Date(emp.getHiredate().getTime()));        this.pstmt.setFloat(5, emp.getSal());        if(this.pstmt.executeUpdate() > 0){//更新记录的行数大于0            flag = true;        }        this.pstmt.close();        return flag;    }    @Override    public List<Emp> findAll(String keyWord) throws Exception {        List<Emp> all = new ArrayList<Emp>();        String sql = "SELECT empno, ename, job, hiredate, sal FROM "                        +"emp WHERE ename LIKE ? OR job LIKE ?";        this.pstmt = this.conn.prepareStatement(sql);        this.pstmt.setString(1, "%"+keyWord+"%");//设置查询关键字        this.pstmt.setString(2, "%"+keyWord+"%");        ResultSet rs  = this.pstmt.executeQuery();        Emp emp = null;        while(rs.next()){            emp = new Emp();            emp.setEmpno(rs.getInt(1));            emp.setEname(rs.getString(2));            emp.setJob(rs.getString(3));            emp.setHiredate(rs.getDate(4));            emp.setSal(rs.getFloat(5));            all.add(emp);        }        this.pstmt.close();        return all;    }    @Override    public Emp findById(int empno) throws Exception {        Emp emp = null;        String sql = "SELECT empno, ename, job, hiredate, sal " +                             "FROM emp WHERE empno=?";        this.pstmt = this.conn.prepareStatement(sql);        this.pstmt.setInt(1, empno);        ResultSet rs = this.pstmt.executeQuery();        while (rs.next()) {            emp = new Emp();            emp.setEmpno(rs.getInt(1));            emp.setEname(rs.getString(2));            emp.setJob(rs.getString(3));            emp.setHiredate(rs.getDate(4));            emp.setSal(rs.getFloat(5));        }        this.pstmt.close();        return emp;    }}

在真实主题的实现类中,根本没有处理数据库的打开和连接操作,只是通过构造方法取得了数据库的连接,而真正负责打开和关闭的操作将由代理类完成。
代理主题实现类——IEmpDAOProxy.java

package com.wz.lxh.dao.proxy;import java.util.List;import com.wz.lxh.dao.IEmpDAO;import com.wz.lxh.dao.impl.EmpDAOImpl;import com.wz.lxh.dbc.DatabaseConnection;import com.wz.lxh.vo.Emp;public class EmpDAOProxy implements IEmpDAO {    private DatabaseConnection dbc = null;//定义数据库连接类    private IEmpDAO dao = null;//声明DAO对象    public EmpDAOProxy() throws Exception {        this.dbc = new DatabaseConnection();        this.dao = new EmpDAOImpl(this.dbc.getConnection());    }    @Override    public boolean doCreate(Emp emp) throws Exception {        boolean flag = false;        try {            if(this.dao.findById(emp.getEmpno()) == null){//如果雇员的编号不存在                flag = this.dao.doCreate(emp);//调用真实主题操作            }        } catch (Exception e) {            throw e;        }finally {            this.dbc.close();//关闭数据库连接        }        return flag;    }    @Override    public List<Emp> findAll(String keyWord) throws Exception {        List<Emp> all = null;        try {            all = this.dao.findAll(keyWord);        } catch (Exception e) {            throw e;        }finally {            this.dbc.close();        }        return all;    }    @Override    public Emp findById(int empno) throws Exception {        Emp emp = null;        try {            emp = this.dao.findById(empno);        } catch (Exception e) {            throw e;        }finally {            this.dbc.close();        }        return emp;    }}

编写DAO工厂类,DAOFactory

package com.wz.lxh.factory;import com.wz.lxh.dao.IEmpDAO;import com.wz.lxh.dao.proxy.EmpDAOProxy;public class DAOFactory {    public static IEmpDAO getIEmpDAOInstance() throws Exception{        return new EmpDAOProxy();    }}
1 0