第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容器才创建一个新的实例。
的常用属性说明见表51。表51的常用属性说明属性说明id指定JavaBean实例名class指定JavaBean实例所属类的全限定名,即包名.类名scope指定JavaBean属性范围(page|request|session|application)2.
的语法格式如下: 表示读取并显示一个JavaBean实例beanName的propertyName属性值。
属性说明见表52。表52属性说明属性说明name指定JavaBean实例名property指定待读取的JavaBean属性3.
的语法格式有如下4种: |
|
|
表示设置一个JavaBean实例的属性值,name指定的JavaBean实例的名字,property属性指定JavaBean实例的属性。
属性说明见表53。表53属性说明属性说明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项目ch051;配置该项目构建路径添加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/ch052/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();