03.javabean
一、javabean简介
1, 作用:一个可重用组件,在jsp开发中可减少重复代码,使HTML与JAVA代码分离便于日后维护。
2, javabean类要求:
- 所有类必须放在包中,且为public类型,包放在web项目的WEB-INF/classes
- 所有属性必须使用private封装,且必须有对应的setter和getter方法
- 一个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由以下几部分组成
- DataBaseConnection: 专门负责数据库的打开与关闭操作的类
- VO: 即javabean,由属性和对应setter,getter组成,VO类中的属性与表中字段相对应,每个VO对象代表一条表记录
- DAO,定义操作数据库的接口,如增删改查
- Impl,DAO接口的实现类,但不负责数据的打开与关闭
- Proxy,代理实现类,利用Impl对象完成数据的操作并负责数据库的打开与关闭
- 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类型

03.javabean的更多相关文章
- 在JasperReport中填充JavaBean(4)
使用Parameters参数对象传递字符串的示例,本节将演示打印List接口中Userinfo.java实体类的示例,打印的数据源不是来自于Parameters对象,而是JRBeanCollectio ...
- JSP简明教程(四):EL表达式语言、JavaBean、Cookie、Session
EL表达式语言 EL这是Expression Language.的目的是为了简化JSP句法.来看几个例子来清除. ${test} 它会被翻译成<%=test%> ${test.name} ...
- springmvc 项目完整示例03 小结
利用spring 创建一个web项目 大致原理 利用spring的ioc 原理,例子中也就是体现在了配置文件中 设置了自动扫描注解 配置了数据库信息等 一般一个项目,主要有domain,dao,ser ...
- 由内省引出JavaBean的讲解
IntroSpector--内部检查,了解更多细节--内省---JavaBean 一.JavaBean JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用户访问 ...
- javaBean的相关知识和应用
javaBean JavaBean 简介 JavaBean 是一种JAVA语言写成的可重用组件.为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器.JavaBean 通过提供符合一 ...
- JavaBean和List<JavaBean>
2018-11-04 23:04:03开始写 返回泛型为User是列表 public List<User> getUserInfo() { conn = getConn();//获取数据库 ...
- Jaxb2实现JavaBean与xml互转的方法详解
本文实例讲述了Jaxb2实现JavaBean与xml互转的方法.分享给大家供大家参考,具体如下: 一.简介 JAXB(Java Architecture for XML Binding) 是一个业界的 ...
- Jaxb2 实现JavaBean与xml互转
一.简介 JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实 ...
- 解决JSP调用JavaBean出现乱码问题
解决JSP调用JavaBean出现乱码问题 话不多说放代码 144 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style D ...
随机推荐
- 初识Hibernate之理解持久化类
上一篇文章我们简单介绍了Hibernate相关的一些最基本的文件及其作用,并在最后完整的搭建了Hibernate的运行环境,成功的完成了与数据库的映射.但是至于其中的一些更加细节的地方并没有 ...
- php中常用的字符串大小写转换函数实例解释
PHP字符串处理函数中,最为简单的几个函数,相关解释就不上了,直接看例子. PHP字符串处理函数中,最为简单的几个函数,相关解释就不上了,直接看例子. strtolower函数.strtoupper函 ...
- VBA 中窗体模式切换,一次设计2种表现
Sub ModelChange() Then DoCmd.RunCommand acCmdSubformFormView ''''就这句 Me.Form.AllowEdits = True ' Mod ...
- vim 环境设定(通用)
有没有发现,如果我们以 vim 软件来搜寻一个档案内部的某个字符串时,这个字符串会被反白,而下次我们再次以 vim 编辑这个档案时,该搜寻的字符串反白情况还是存在呢!甚至于在编辑其他档案时,如果其他档 ...
- Java面向对象 IO (四)
Java面向对象 IO (四) 知识概要: (1)打印流 (2)序列流 SequenceInputStream (3)ObjectInputStream与Ob ...
- Java面向对象 继承(上)
Java面向对象 继承 知识概要: (1)继承的概述 (2)继承的特点 (3)super关键字 (4)函数覆盖 (5) 子类的实例化过程 (6) final关键字 (1)继承 ...
- thrift例子:python客户端/java服务端
java服务端的代码请看上文. 1.说明: 这两篇文章其实解决的问题是,当使用python去访问大数据线上集群的时候,遇到两个问题: 1)python-hadoop和python-hive相关包链接不 ...
- 图片与字符串(base64编码)的转化
package com.demo; import java.util.*; import java.io.*; import sun.misc.BASE64Decoder; import sun.mi ...
- java 线程(1)
Java线程:概念与原理 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程 ...
- Hadoop(十三)分析MapReduce程序
前言 刚才发生了悲伤的一幕,本来这篇博客马上就要写好的,花了我一晚上的时间.但是刚才电脑没有插电源就没有了.很难受!想哭,但是没有办法继续站起来. 前面的一篇博文中介绍了什么是MapReduce,这一 ...