第5章JavaBeanJavaBean是一种可重用的、跨平台的软件组件模型。在Java应用中的JavaBean有两种: 第一种是用在用户界面如AWT或Swing中的JavaBean;第二种是用在非用户界面的JavaBean。在JSP中使用的是第二种。 5.1JavaBean规范 (1) JavaBean是一个public的类。即该类具有public的访问权限。 (2) JavaBean必须有一个无参数的构造方法。一个JavaBean可以有一个或有多个构造方法,但是必须有一个无参数的构造方法。 (3) JavaBean的属性一般是非public的,访问属性应该通过public的setter和getter方法。 (4) JavaBean中可以封装业务逻辑方法,包括进行数据库访问操作等。 例如,如下的User类满足JavaBean规范,因此可以称User类是一个JavaBean。public class User { private int id; private String name; private String password; private int age; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name;} public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public void addAge(){ this.age++; } } 〖1〗〖3〗Java Web应用开发基础教程第5章JavaBean〖3〗〖3〗5.2访问JavaBean〖1〗5.2.1使用脚本段代码访问JavaBean〖4/5〗1. 使用page指令导入JavaBean使用page指令的import属性导入JavaBean。例如<%@ page import="ch05.User" %>2. 使用脚本段代码访问JavaBean <% User user = new User(); user.setName("Mike") ; user.setPassword("123"); %> 用户名:<%=user.getName() %>
密码:<%=user.getPassword() %> 以上代码首先创建JavaBean对象user,接着调用setName()方法和setPassword()方法为其属性赋值,分别是Mike和123;最后使用JSP表达式在页面显示用户名和密码。 5.2.2使用动作元素访问JavaBean〖4/5〗1. 语法格式如下: 表示创建package.className类的实例beanName,并将该实例置于scope属性指定的某个作用域。实际上,Servlet容器首先在scope指定的作用域中查找beanName实例。如果找到,就可以在JSP页面使用该实例;如果找不到,Servlet容器才创建一个新的实例。 的常用属性说明见表51。表51的常用属性说明属性说明id指定JavaBean实例名class指定JavaBean实例所属类的全限定名,即包名.类名scope指定JavaBean属性范围(page|request|session|application)2. 的语法格式如下: 表示读取并显示一个JavaBean实例beanName的propertyName属性值。 属性说明见表52。表52属性说明属性说明name指定JavaBean实例名property指定待读取的JavaBean属性3. 的语法格式有如下4种: | | | 表示设置一个JavaBean实例的属性值,name指定的JavaBean实例的名字,property属性指定JavaBean实例的属性。 属性说明见表53。表53属性说明属性说明name指定JavaBean实例名property指定JavaBean属性param指定使用请求参数设置JavaBean的属性value指定使用一个表达式设置JavaBean属性。该表达式可以是某个请求参数,或是某个固定值等(1) 设置与请求参数中同名的JavaBean对象属性值并自动将请求参数转成JavaBean对应属性的类型;如果某个请求参数名与JavaBean的属性不同,那么不会设置该JavaBean的属性。 例如,用户注册时将请求参数用户名和年龄分别设置到user对象的属性name和age中。用户注册页面register.html的关键代码如下: 用户注册
用户名:
年龄:
另一个页面register_do.jsp使用实例化一个JavaBean user,使用将请求参数用户名和年龄设置到user的对应属性中,并显示用户名和密码,其关键代码如下: 显示用户注册信息
您的用户名:
您的年龄: 第一个页面中的两个文本框的name和age与第二个页面中使用的JavaBean对象user的属性完全一致。public class User { private int id; private String name; private String password; private int age; … }第二个页面使用实例化一个JavaBean user,并使用将请求参数用户名name和年龄age来设置JavaBean user同名的name和age属性,最后使用分别读取和显示JavaBean user的name和age属性。 User类的属性age是int类型,而页面传来的请求参数均为字符串。会将接收到的请求参数转换成int类型再设置为user的age属性。 (2) 将请求参数自动转换类型并设置到JavaBean的同名属性;每次设置一个JavaBean属性,如果需要设置多个属性,就需要使用多次。 用户注册页面register.html的关键代码如下: 用户注册
用户名:
电子邮箱:
页面register_do.jsp的关键代码如下: 显示用户注册信息
您的用户名:
您的年龄: register_do.jsp首先实例化JavaBean user,接着使用两次分别将接收到的请求参数name和age设置为user的同名属性,最后使用分别读取和显示JavaBean user的name和age属性。 (3) 用于当请求参数名与JavaBean的属性名不一致时,把请求参数自动进行类型转换并设置到JavaBean的属性;每次设置一个JavaBean属性,如果需要设置多个属性,就需要使用多次。 注册页面register.html的关键代码如下: 用户注册
用户名:
年龄:
第二个页面register_do.jsp的关键代码如下: 显示用户注册信息
您的用户名:
您的年龄: 第二个页面register_do.jsp首先实例化JavaBean user,接着使用如下语句: 分别将接收到的请求参数username和userage设置为user对象的name和age属性。 (4) 使用value指定的表达式设置JavaBean的属性propertyName;每次设置一个JavaBean属性,如果需要设置多个属性,就需要使用多次。 第一个页面register.html的关键代码如下: 用户注册
用户名:
电子邮箱:
第二个页面register_do.jsp的关键代码如下: 显示用户注册信息
您的用户名:
您的年龄: 第二个页面register_do.jsp首先实例化JavaBean user,接着使用将user的name属性设置为固定值Mike,使用表达式语言将接收到的请求参数age设置为user的age属性,最后使用分别读取和显示user的name和age属性。 5.3JSP+JavaBean开发模式 在早期JSP编程中,JSP页面包含了业务逻辑、流程控制逻辑和表示逻辑。这使得JSP页面维护和扩展困难。后来出现的JSP+JavaBean开发模式,JSP负责显示逻辑和流程控制逻辑,JavaBean负责封装业务逻辑。 本节使用JSP+JavaBean开发模式来实现用户注册功能。进行应用程序开发,需要进行需求分析、系统设计、详细设计和实现(编码)、测试等过程。注册案例比较简单,此处简化了相关过程。 1. 创建数据库和user表 在MySQL中创建数据库testDB和表user。表user的字段包括id、name、password、age,分别是int、varchar、varchar、int类型。 2. 创建Eclipse的Web项目、添加JDBC驱动程序、创建数据库帮助类 创建Eclipse Java Web项目ch051;配置该项目构建路径添加MySQL JDBC驱动程序;数据库帮助类使用第2章的DBConnection。 3. 创建JavaBean User并增加业务逻辑方法register() User类的关键代码如下:package ch05; … public class User { private int id; private String name; private String password; private int age; … // 返回注册成功的记录的id public int register() { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { conn = DBConnection.getConnection(); String sql = "insert into user(name,password,age)values(?,?,?)"; ps = conn.preparedStatement(sql, Statement.RETURN_GENERATED_KEYS); ps.setString(1, this.name); ps.setString(2, this.password); ps.setInt(3, this.age); ps.executeUpdate(); rs = ps.getGeneratedKeys(); int id = -1; if (rs != null && rs.next()) { id = rs.getInt(1); } } catch (SQLException e) { e.printStackTrace(); } return id; } // 根据id获得User对象 public User getUserById(int id) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; User user = null; try { conn = DBConnection.getConnection(); String sql = "select  from user where id = ?"; ps = conn.preparedStatement(sql); ps.setInt(1, id); rs = ps.executeQuery(); if (rs.next()) { user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); user.setPassword(rs.getString("password")); user.setAge(rs.getInt("age")); } } catch (SQLException e) { e.printStackTrace(); } return user; } }4. 创建有关JSP页面 分别创建页面register.html、register_do.jsp、registerSuccess.jsp、registerFail.jsp。  register.html: 用于提供用户填写注册信息。  register_do.jsp: 处理register.html提交的注册信息,实现流程控制和业务逻辑调用。  registerSuccess.jsp: 在注册成功后显示注册成功的用户信息。  registerFail.jsp: 在注册失败后显示注册失败的提示。 register.html页面的关键代码如下:用户注册
用户名:
密码:
年龄:
register_do.jsp页面的关键代码如下: <% int id = user.register(); if(id > 0){ // user=user.get(1); request.getRequestDispatcher("registerSuccess.jsp").forward( request,response); }else{ request.getRequestDispatcher("registerFail.jsp").forward( request,response); } %> registerSuccess.jsp页面的关键代码如下: 显示用户注册信息
用户名:
密码:
年龄:
在register_do.jsp中,以下代码:创建的user是session范围,所以在registerSuccess.jsp中,以下代码:并不会创建新的JavaBean User的实例user,而是会继续使用session范围已经存在的user。 registerFail.jsp页面的关键代码如下: 注册失败!请联系管理员。 5.4JSP+Servlet+JavaBean开发模式 JSP+Servlet+JavaBean是对JSP+JavaBean开发模式的改进。该模式中,JSP负责显示逻辑,Servlet负责流程控制逻辑,JavaBean负责封装业务逻辑。该模式适合大型应用程序开发,便于应用程序的可维护性和可扩展性。 下面使用JSP+Servlet+JavaBean开发模式来实现用户列表功能。用户通过地址栏输入http://localhost:8080/ch052/listAll后,ListAllServlet负责调用JavaBean user的listAll()方法,获取数据库testDB中表user的全部记录并跳转listAll.jsp页面显示全部用户记录。 ListAllServlet的关键代码如下:package servlet; … @WebServlet("/listAll") public class UserServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { User user = new User();