JavaBean
基本
如果在请求域中设置一个属性request.setAttribute("name", name);
,转发到JSP视图,JSP从请求作用域得到这个属性:
<%= request.getAttribute("name") %>
但是,这里是一个字符串,如果是一个对象Person
呢?要得到其name
属性对应的值,只能使用如下的形式:
String name = request.getParameter("userName");
Person person = new Person();
person.setName(name);
request.setAttribute("person", person);
<%
Person p = (Person)request.getAttribute("person");
%>
Person is:<%= p.getName() %>
上面的形式可以使用JavaBean
来实现:
<jsp:useBean id="person" class="com.model.Person" scope="request"></jsp:useBean>
Person is:<jsp:getProperty property="name" name="person"/>
1.<jsp:useBean>
声明和初始化一个bean
属性
id
声明bean对象的标识符。这对应于servlet代码所用的名:request.setAttribute("person", person);
class
声明bean对象的类类型scope
标识这个bean对象的属性作用域,默认为page
如果<jsp:useBean>
根据标记中id
好scope
的值查找一个bean
,如果找不到,就会为class
中指定的类创建一个实例,把这个对象赋给id
变量,然后把它设置为指定作用域的域的一个属性
2.<jsp:getProperty>
获取bean
属性的性质值
name
标识具体的bean对象。这个与<jsp:useBean>
标记的id
值匹配property
标识属性中的性质名
3.<jsp:setProperty>
设置性质的值
<jsp:setProperty property="name" name="person" value="paul"/>
<jsp:useBean>
可以有体,利用<jsp:useBean>
体,只有找不到bean属性,而且创建一个新的bean时才会运行体中的代码:
<jsp:useBean id="person" class="com.model.Person" scope="request">
<jsp:setProperty name="person" property="name" value="Fred"/>
</jsp:useBean>
创建多态的bean
引用
使用type
属性
<jsp:useBean id="person" type="com.model.Person" class="com.model.Employee" scope="result">
</jsp:useBean>
4.param
属性,可以把bean
的性质值设置为一个请求参数的值,只需指定请求参数
<form action="testbean.jsp">
name:<input type="text" name="userName">
<input type="submit">
</form>
<jsp:useBean id="person" class="com.model.Person">
<jsp:setProperty name="person" property="name" param="userName"/>
</jsp:useBean>
userName is:<jsp:getProperty property="name" name="person"/>
a.如果指定了property
,但是没有指定value
或param
,就是在告诉容器,要从有匹配名的请求参数得到值
b.如果请求参数与bean性质名匹配,就不需要在<jsp:setProperty>
标记中为该性质指定值
c.如果所有的请求参数名都与bean值性质名匹配,课使用如下的形式:
<jsp:setProperty name="person" param="*"/>
原文
在JSP中如果要应用JSP提供的JavaBean的标签来操作简单类,则此类必须满足如下条件:
如果一个类没有明确地定义一个构造方法,会自动生成一个无参的什么都不做的构造方法。
如果一个类中只包含了属性、setter、getter方法,那么这种类就称为简单JavaBean,还可以称为POJO、VO、TO。
Web开发的标准目录结构
Web项目中各个目录的作用
JavaBean的保存范围
- page:保存在一页的范围中,跳转后此Javabean无效
- request:一个JavaBean对象可以保存在一次服务器跳转的范围中
- session:在一个用户的操作范围中保存,重新打开浏览器时才会声明新的JavaBean
- application:在整个服务器上保存,服务器关闭时才会消失
使用removeAttribute()
删除JavaBean。
设置属性<jsp:setProperty>
DAO设计模式
DAO(Data Access Object,数据访问对象)。
客户层:一般指浏览器
显示层:使用JSP/Servlet进行页面效果的显示
业务层(Business Object,业务对象):会将多个原子性的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();
}
}