JavaBean技术
1、JavaBean介绍
JavaBean的产生,使JSP页面中的业务逻辑变得更加清晰。程序中的实体对象和业务逻辑可以单独封装到Java类中,JSP页面通过自身操作JavaBean的动作标识对其进行操作,改变了HTML网页代码与Java代码混乱的编写方式,不仅提高了程序的可读性、易维护性,而且还提高了代码的重用性。
1.1 JavaBean概述
在JSP网页开发的初级阶段,并没有框架与逻辑分层概念的产生,需要将Java代码嵌入到网页中对JSP页面中的一些业务逻辑进行处理,如字符串处理、数据库操作等。其开发流程如下图所示。
此种开发方式虽然看似流程简单,但如果将大量的Java代码嵌入到JSP页面中,必定会给修改及维护带来一定的困难,因为在JSP页面中包含HTML代码、CSS代码、Java代码等,同时再加入业务逻辑处理代码,既不利于页面编程人员的设计,也不利于Java程序员对程序的开发,而且将Java代码写入到JSP页面中,不能体现面向对象的开发模式,达不到代码的重用。
如果使HTML代码与Java代码相分离,将Java代码单独封装成为一个处理某种业务逻辑的类,然后在JSP页面中调用此类,则可以降低HTML代码与Java代码之间的耦合度,简化JSP页面,提高Java程序代码的重用性及灵活性。这种与HTML代码相分离,而使用Java代码封装的类,就是一个JavaBean组件。在Java Web开发中,可以使用JavaBean组件来完成业务逻辑的处理。应用 JavaBean与SP整合的开发模式如下图所示。
1.2 JavaBean种类
起初,JavaBean的目的是为了将可以重复使用的代码进行打包,在传统的应用中,JavaBean主要用于实现一些可视化界面,如一个窗体、按钮、文本框等,这样的JavaBean称之可视化的JavaBean。随着技术的不断发展与项目的需求,目前JavaBean主要用于实现一此业务逻辑或封装一些业务对象,由于这样的JavaBean并没有可视化的界面,所以又称之为非可视化的JavaBean。
可视化的JavaBean一般应用于Swing的程序中,在Java Web开发中并不会采用,而是使用非可视化的JavaBean,实现一些业务逻辑或封装一些业务对象。
2、JavaBean的应用
在JSP页面中应用JavaBean非常简单,主要通过JSP动作标签<jsp:useBean>、<jsp:setProperty>、<jsp:getProperty>来实现对JavaBean对象的操作,但所编写的JavaBean对象要遵循JavaBean规范,只在严格遵循JavaBean规范,在JSP页面才能够方便的调用及操作JavaBean。
将JavaBean对象应用到JSP页面中,JavaBean的生命周期可以自行进行设置,它存在于4种范围之内,分别为:page、request、session、application,默认的情况下,JavaBean作用于page范围之内。
2.1 <jsp:useBean>动作标签
<jsp:useBean>动作标签用来装载一个将在JSP页面中使用的JavaBean对象。其语法格式如下:
<jsp:useBean id="beanName" class="package.class" scope="page" />
参数说明:
id:用于创建JavaBean对象的引用名。
class:用于指定JavaBean的类。
scope:用于指定JavaBean对象的范围,默认情况下,scope被设置为page。
2.2 <jsp:setProperty>动作标签
<jsp:setProperty>动作标签用于设置<jsp:useBean>动作标签中指定的JavaBean对象的属性值。<jsp:setProperty>动作标签指定名称、属性、值和参数,用于赋给JavaBean对象的属性。其语法格式如下:
<jsp:setProperty name="beanName" property="propertyName" value="value" param="parameter" />
参数说明:
name:用于对应 <jsp:useBean>动作标签中的id属性。
property:指定要为之设置值的JavaBean的属性名称。
value:指定要为属性设置的值。
param:指定用于输入数据的表单元素名称,并给属性赋值。
注意:value属性不能与param属性一起使用。
2.3 <jsp:getProperty>动作标签
<jsp:getProperty>动作标签用于获取<jsp:useBean>动作标签中指定的JavaBean对象的属性值。其语法格式如下:
<jsp:getProperty name="beanName" property="propertyName" />
参数说明:
name:用于对应 <jsp:useBean>动作标签中的id属性。
property:指定要获取JavaBean对象的属性名称。
示例:实现人员档案管理系统,在其中录入人员信息功能,主要通过在JSP页面中应用JavaBean进行实现。
(1)创建名称为Person的类,将其放置于com.pjb.bean包中,实现对人员信息的封装。
package com.pjb.bean;
public class Person {
private String name; // 姓名
private int age; // 年龄
private String sex; // 性别
private String[] interests; // 兴趣
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String[] getInterests() {
return interests;
}
public void setInterests(String[] interests) {
this.interests = interests;
}
}
(2)创建将数组转换成字符串的JavaBean对象,它的名称为Convert。在该类中编写arrToStr()方法,将数组对象转换成指定格式的字符串。
package com.pjb.bean;
/**
* 转换数组的JavaBean
*/
public class Convert {
/**
* 将数组转换成为字符串
*
* @param arr 数组
* @return 字符串
*/
public String arrToStr(String[] arr) {
// 实例化StringBuffer
StringBuffer sb = new StringBuffer();
// 判断arr是否为有效数组
if (arr != null && arr.length > 0) {
// 遍历数组
for (String s : arr) {
// 将字符串追加到StringBuffer中
sb.append(s);
// 将字符串追加到StringBuffer中
sb.append(",");
}
// 判断字符串长度是否有效
if (sb.length() > 0) {
// 截取字符
sb = sb.deleteCharAt(sb.length() - 1);
}
}
// 返回字符串
return sb.toString();
}
}
(3)创建注册页面 reginput.jsp,在该页面中放置录入人员信息所需的表单。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>人员注册</title>
</head>
<body>
<div align="center">请输入注册信息
<form name="form1" method="post" action="reginfo.jsp">
<table border="0" align="center">
<tr>
<td>姓名:</td>
<td><input type="text" name="name"/></td>
</tr>
<tr>
<td>年龄:</td>
<td><input type=text name="age"/></td>
</tr>
<tr>
<td>性别:</td>
<td>
<select name = "sex">
<option value="男" selected="selected">男</option>
<option value="女">女</option>
</select>
</td>
</tr>
<tr>
<td>兴趣:</td>
<td>
<input type="checkbox" name="interests" value="足球" />足球
<input type="checkbox" name="interests" value="篮球" />篮球
<input type="checkbox" name="interests" value="羽毛球" />羽毛球
<input type="checkbox" name="interests" value="乒乓球" />乒乓球
</td>
</tr>
<!-- 以下是提交、取消按钮 -->
<tr>
<td>
<input type="submit" value="提交" />
</td>
<td>
<input type="reset" value="取消" />
</td>
</tr>
</table>
</form>
</div>
</body>
</html>
(4)创建注册提交页面 reginfo.jsp,用于对reginput.jsp页面中表单提交请求进行处理。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<% request.setCharacterEncoding("UTF-8"); //字符串编码格式 %>
<jsp:useBean id="person" class="com.pjb.bean.Person">
<jsp:setProperty name="person" property="*" />
</jsp:useBean>
<jsp:useBean id="convert" class="com.pjb.bean.Convert"></jsp:useBean>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册信息</title>
</head>
<body>
<table align="center">
<tr>
<td>姓名:</td>
<td>
<jsp:getProperty property="name" name="person"/>
</td>
</tr>
<tr>
<td>年龄:</td>
<td>
<jsp:getProperty property="age" name="person"/>
</td>
</tr>
<tr>
<td>性别:</td>
<td>
<jsp:getProperty property="sex" name="person"/>
</td>
</tr>
<tr>
<td>兴趣:</td>
<td>
<%= convert.arrToStr(person.getInterests()) %>
</td>
</tr>
</table>
</body>
</html>
执行结果:
(1)注册页面 reginput.jsp。
(2)注册提交页面 reginfo.jsp。
说明:
(1)如果所处理的表单信息中包含中文,通过JSP内置对象的 request.setCharacterEncoding("UTF-8")方法指定字符编码格式进行解决。
(2)表单信息中的属性名称最好设置成为JavaBean中的属性名称,这样就可以通过“<jsp:setProperty name="person" property="*" />”的形式来接收所有参数,这种方式可以减少程序中的代码量。如将用户年龄文本框的name属性设置为age,它对应的Person类中的age字段。
(3)表单中的属性名称与JavaBean中的属性名称不一致,可以通过<jsp:setProperty>标签中的param属性来指定表单中的属性。如表单中的用户名为username,可以使用“<jsp:setProperty name="person" property="name" param="username"/>”对其赋值。例如,上述注册提交页面 reginfo.jsp中的代码可以修改为:
<jsp:useBean id="person" class="com.pjb.bean.Person" />
<jsp:setProperty name="person" property="name" param="name"/>
<jsp:setProperty name="person" property="age" param="age"/>
<jsp:setProperty name="person" property="sex" param="sex"/>
<jsp:setProperty name="person" property="interests" param="interests"/>
(4)通过<jsp:useBean>标签实例化的JavaBean对象,如果在JSP页面中使用Java代码调用JavaBean对象中的属性或方法,所使用的JavaBean对象的名称为<jsp:useBean>标签中的id属性,例如上述代码中的:
<jsp:useBean id="person" class="com.pjb.bean.Person" />
<jsp:useBean id="convert" class="com.pjb.bean.Convert" />
<%= convert.arrToStr(person.getInterests()) %>