一、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类型

03.javabean的更多相关文章

  1. 在JasperReport中填充JavaBean(4)

    使用Parameters参数对象传递字符串的示例,本节将演示打印List接口中Userinfo.java实体类的示例,打印的数据源不是来自于Parameters对象,而是JRBeanCollectio ...

  2. JSP简明教程(四):EL表达式语言、JavaBean、Cookie、Session

    EL表达式语言 EL这是Expression Language.的目的是为了简化JSP句法.来看几个例子来清除. ${test} 它会被翻译成<%=test%> ${test.name} ...

  3. springmvc 项目完整示例03 小结

    利用spring 创建一个web项目 大致原理 利用spring的ioc 原理,例子中也就是体现在了配置文件中 设置了自动扫描注解 配置了数据库信息等 一般一个项目,主要有domain,dao,ser ...

  4. 由内省引出JavaBean的讲解

    IntroSpector--内部检查,了解更多细节--内省---JavaBean 一.JavaBean JavaBean是一种特殊的Java类,主要用于传递数据信息,这种java类中的方法主要用户访问 ...

  5. javaBean的相关知识和应用

    javaBean JavaBean 简介 JavaBean 是一种JAVA语言写成的可重用组件.为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器.JavaBean 通过提供符合一 ...

  6. JavaBean和List<JavaBean>

    2018-11-04 23:04:03开始写 返回泛型为User是列表 public List<User> getUserInfo() { conn = getConn();//获取数据库 ...

  7. Jaxb2实现JavaBean与xml互转的方法详解

    本文实例讲述了Jaxb2实现JavaBean与xml互转的方法.分享给大家供大家参考,具体如下: 一.简介 JAXB(Java Architecture for XML Binding) 是一个业界的 ...

  8. Jaxb2 实现JavaBean与xml互转

    一.简介 JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实 ...

  9. 解决JSP调用JavaBean出现乱码问题

    解决JSP调用JavaBean出现乱码问题 话不多说放代码 144 Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style D ...

随机推荐

  1. httpd网页身份认证

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  2. Angular学习笔记(一)

    本文为原创文章,转载请标明出处 目录 架构 模块 组件 模板 元数据 数据绑定 指令 服务 依赖注入 模板与数据绑定 1. 架构 模块 Angular 应用是模块化的,并且 Angular 有自己的模 ...

  3. python之路第五篇之装饰器:(进阶篇)

    装饰器: 学前必备知识: def f1(): print "f1" f1() #表示函数执行 f1 #表示函数,指向内存地址 f1 = lambda x: x + 1 f1() # ...

  4. 和团队齐头并进——敏捷软件开发的Scrum的学习

    敏捷开发的介绍 概念 更强调程序员团队与业务专家之间的紧密协作.面对面的沟通(认为比书面的文档更有效).频繁交付新的软件版本.紧凑而自我组织型的团队.能够很好地适应需求变化的代码编写和团队组织方法,也 ...

  5. zoj 1874 水题,输出格式大坑

    Primary Arithmetic Time Limit: 2 Seconds      Memory Limit: 65536 KB Children are taught to add mult ...

  6. 深入浅出WPF——附加事件(Attached Event)

    3.3 事件也附加——深入浅出附加事件 WPF事件系统中还有一种事件被称为附加事件(Attached Event),简言之,它就是路由事件.“那为什么还要起个新名字呢?”你可能会问. “身无彩凤双飞翼 ...

  7. WPF 中模拟键盘和鼠标操作

    转载:http://www.cnblogs.com/sixty/archive/2009/08/09/1542210.html 更多经典文章:http://www.qqpjzb.cn/65015.ht ...

  8. 详解面向对象编程——JavaScriptOOP

        前  言 絮叨絮叨 学习了JS之后,不知道大家觉得怎们样呢? 今天我们就来讲一下JS中最重要的一个环节,JavaScript中的面向对象编程OOP,这里的东西有点难,也有点绕. 可是! 不要灰 ...

  9. JavaScript设计模式--桥梁模式--XHR连接队列

    针对该模式的例子现在不是很理解,写下来慢慢熟悉. 们要构建一个队列,队列里存放了很多ajax请求,使用队列(queue)主要是因为要确保先加入的请求先被处理.任何时候,我们可以暂停请求.删除请求.重试 ...

  10. 深入浅出:JavaScript作用域链

    1. 什么是作用域 任何程序设计语言都有作用域的概念,简单的说,作用域就是变量的作用范围. 2. 变量的分类和变量作用域的分类 在JavaScript中,变量分为全局变量和局部变量,与此相对应的,变量 ...