一、JavaBean的概述
1、什么是JavaBean
(1)组件是独立的模块,在外界不了解其内部实现的情况下,可以通过其提供的接口对组件进行访问,组件可以重用, 目前有代表性的组件技术有COM、COM+、JavaBeans、EJB等
(2)JavaBean是Java的可重用组件技术,实质是一种符合某些命名和设计规范的Java类, 应用JavaBean的主要目的是实现代码重用,便于维护和管理。在JSP的Web应用中集成JavaBean组建,由JavaBean中处理业务逻辑,然后在JSP中调用,而JSP页面着重网页界面的设计,可以实现业务逻辑和前台显示的部分分离
2、好处
(1)可以使得JSP页面变得清晰(业务逻辑和前台显示分离)
(2)节省软件开发时间(可以直接使用已经测试和可信的已有组件,避免了重复开发)
(3)降低系统维护的难度
(4)为JSP应用带来了更多的可伸缩性,使系统变得健壮和灵活
3、分类
(1)可视:即传统的JavaBean应用于可视化界面(如java图形界面中使用的按钮、文本框或列表框等等)
(2)非可视化:封装逻辑、封装数据,与JSP搭配使用
二、规范
1、技术上
任何java类,如果实现了java.io.Serializable接口,且提供默认的构造方法(没有参数的构造方法),都可以称为JavaBean
2、应用上
(1)该类是一个公有类,并用package语句声明属于某个包
(2)该类实现了java.io.Serializable接口(系列化接口作用,接口与类区别)
(3)该类如果有构造方法,那么这个构造方法是公有(用public修饰)并且无参数的
(4)该类的属性一般是私有(用private修饰)的
(5)私有属性有公有(用public修饰)的访问器方法;例如:私有属性xxx的读取方法为getXxx() ,设置方法为setXxx() ,如果属性类型为boolean,它的读取方法为isXxx()
(6)该类的方法一般是共有的
注意: 如果在JSP中使用JavaBean组件,创建的JavaBean不必实现java.io.Serializable接口仍然可以运行)
3、个人信息表(代码例子)
(1)显示个人信息文件
<%@ page contentType="text/html;charset=UTF-8"%>
<%@ page language="java" import="com.ch4.*"%><!-- 小伙伴们注意import的自己是在src下建的文件夹路径 -->
<html>
<head>
<title>显示个人信息</title>
</head>
<body>
<jsp:useBean id="student" class="com.ch4.Person" scope="application"></jsp:useBean>
<!-- 等同于<%-- <% Person p = new Person(); %> --%> -->
<h3>显示人的信息</h3>
<table border="1">
<tr>
<td>人名</td>
<td><jsp:getProperty name="student" property="name" />
<!-- 等同于 <%-- <%=p.getName();%> --%> --></td>
</tr>
<tr>
<td>性别</td>
<td><jsp:getProperty name="student" property="sex" /></td>
</tr>
<tr>
<td>年龄</td>
<td><jsp:getProperty name="student" property="age" /></td>
</tr>
<tr>
<td>班级</td>
<td><jsp:getProperty name="student" property="classNo" /></td>
</tr>
</table>
</body>
</html>
(2)个人信息数据存储文件
<%@ page contentType="text/html;charset=UTF-8"%>
<%@ page language="java" import="com.ch4.*"%>
<html>
<head>
<title>JSP中使用JavaBean</title>
</head>
<body>
<jsp:useBean id="student" class="com.ch4.Person" scope="application"></jsp:useBean>
<jsp:setProperty name="student" property="name" value="申小兮" />
<jsp:setProperty name="student" property="sex" value="true" />
<jsp:setProperty name="student" property="age" value="18" />
<jsp:setProperty name="student" property="classNo" value="1" />
<%//上述6行代码,等同于下述5行代码
/* Person p = new Person();
p.setName("申小兮");
p.setSex("true");
p.setAge(18);
p.setClassNo(1);
*/
%>
<a href="4_1_listBeanData.jsp">显示信息</a>
</body>
</html>
(3)Person.java文件对数据进行封装
package com.ch4;
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = 1L;
private String name;
private int age;
private boolean sex;
private int classNo;
public boolean isSex() {
return sex;
}
public void setSex(boolean sex) {
this.sex = sex;
}
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 int getClassNo() {
return classNo;
}
public void setClassNo(int classNo) {
this.classNo = classNo;
}
public Person() {
}
}
三、应用
1、两种方法
(1)JSP页面中使用JavaBean时,可以使用JSP脚本元素调用JavaBean
(2)也可以使用JSP提供的3个标准动作元素来访问
2、useBean
用于在网页中创建JavaBean实例
<jsp:useBean id="beanname" class="package.class"
[scope="page|request|session|application"] />
(1)id: 名称
(2)class: 类名全称(含包名)
(3)scope: 有效范围,可能的取值由4个:page、request、session、application
3、getProperty
用于读取JavaBean的属性值,实际调用的是JavaBean的getXxx()方法
<jsp:getProperty name="name" property="propertyName" />
(1)name: 名称,与jsp:useBean标签中属性id的值相匹配
(2)property: 私有属性名
4、setProperty
用于为JavaBean的属性赋值,其语法有多种
(1)
<jsp:setProperty name="beanName" property="propertyName" value="propertyValue" />
(2)
<jsp:setProperty name="beanName" property="propertyName"/>
<!-- 等价于 -->
<jsp:setProperty name="beanName" property="propertyName" param="paramName" />
(3)一次为多个属性赋值
<jsp:setProperty name="beanName" property="*" />
5、显示时间
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>电子时钟</title>
<style type="text/css">
#clock{
width:500px;
height:100px;
padding-top: 20px;
border:solid 5px black;
}
#week{
padding-top: 20px;
}
</style>
<meta http-equiv="Refresh" content="1">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<jsp:useBean id="date" class="com.ch4.DateTimeBean"></jsp:useBean>
<div id="clock">
<div id="time">
<jsp:getProperty property="dateTime" name="date"/>
</div>
<div id="week">
<jsp:getProperty property="week" name="date"/>
</div>
</div>
</body>
</html>
四、作用域
1、page作用域
范围是最小,客户端每次请求访问时都会创建一个JavaBean对象,JavaBean对象的有效范围是客户请求访问的当前页面文件,当客户执行当前的页面文件完毕后JavaBean对象结束生命
2、request作用域
request对象是一个内建对象,使用getParameter方法可以获取表单中的数据信息
3、session作用域
在同一个浏览器内,JavaBean对象就存在于一个session中,当重新打开新的浏览器时,就会开始一个新的session,每个session中拥有各自的JavaBean对象
4、application作用域
存在于整个主机或虚拟主机的生命周期内,application范围是JavaBean的生命周期最长的
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page language="java" import="com.ch4.Person" %>
<html>
<head><title>测试JavaBean的作用域</title>
</head>
<body>
<%-- <jsp:useBean id="person" class="com.ch4.person" scope="application"></jsp:useBean> --%>
<jsp:useBean id="person" class="com.ch4.Person" scope="session"></jsp:useBean>
<%-- <jsp:useBean id="person" class="com.ch4.Person" scope="request"></jsp:useBean> --%>
<%-- <jsp:useBean id="person" class="com.ch4.Person" scope="page"></jsp:useBean> --%>
<jsp:setProperty name="person" property="name" value="申小兮"/>
<jsp:setProperty name="person" property="sex" value="女"/>
<jsp:setProperty name="person" property="age" value="18"/>
<br><a href="4_4.jsp">测试JavaBean的四个作用域</a>
</body>
</html>
文件4_4.jsp
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ page language="java" import="com.ch4.Person" %>
<html>
<head><title>测试JavaBean的作用域</title>
</head>
<body>
使用内置对象获取姓名和年龄
<hr>
<%-- application作用域:<br>
姓名:<%= ((Person)application.getAttribute("person")).getName() %><br>
年龄:<%= ((Person)application.getAttribute("person")).getAge() %> <br> --%>
session作用域:<br>
姓名:<%= ((Person)session.getAttribute("person")).getName() %><br>
年龄:<%= ((Person)session.getAttribute("person")).getAge() %> <br>
<%-- request作用域:<br>
姓名:<%= ((Person)request.getAttribute("person")).getName() %><br>
年龄:<%= ((Person)request.getAttribute("person")).getAge() %> <br> --%>
<%-- page作用域:<br>
姓名:<%= ((Person)pageContext.getAttribute("person")).getName() %><br>
年龄:<%= ((Person)pageContext.getAttribute("person")).getAge() %> <br> --%>
</body>
</html>