在Java程序或JSP程序中,其实有很多的代码段是可以重复使用的,比如对数据库的操作、用户的有效性检查及某些项特定功能的实现等。为了很好的解决这个问题,提高开发效率,Sun公司推出了JavaBean,简言之,JavaBean这是一个实现了某个功能且供重复使用的Java类。 在JSP中使用JavaBean后,可实现HTML与Java代码的分离,使JSP更易于开发和维护。因此JavaBean成了JSP程序员的必备利器之一。另外,javaBean与javaBeans是同一个概念。
JavaBean定义:是Java中一种特殊的类,可以将多个对象封装到一个对象(bean)中。特点是可序列化,提供无参构造器,提供getter方法和setter方法访问对象的属性。名称中的“Bean”是用于Java的可重用软件组件的惯用叫法。
JavaBean规范:
(a)有一个公有的无参构造器
(b)属性可以通过get、set、is(可以替代get,用在布尔型属性上)方法或遵循特定命名规范的其他方法访问
(c)可序列化
JavaBean代码:
1 package player; 2 3 public class PersonBean implements java.io.Serializable { 4 5 /** 6 * name 属性(注意大小写) 7 */ 8 private String name = null; 9 10 private boolean deceased = false; 11 12 /** 无参构造器(没有参数) */ 13 public PersonBean() { 14 } 15 16 /** 17 * name 属性的Getter方法 18 */ 19 public String getName() { 20 return name; 21 } 22 23 /** 24 * name 属性的Setter方法 25 * @param value 26 */ 27 public void setName(final String value) { 28 name = value; 29 } 30 31 /** 32 * deceased 属性的Getter方法 33 * 布尔型属性的Getter方法的不同形式(这里使用了is而非get) 34 */ 35 public boolean isDeceased() { 36 return deceased; 37 } 38 39 /** 40 * deceased 属性的Setter方法 41 * @param value 42 */ 43 public void setDeceased(final boolean value) { 44 deceased = value; 45 } 46 }
在Java类中使用JavaBean的代码:
1 import player.PersonBean; 2 3 /** 4 * <code>TestPersonBean</code>类 5 */ 6 public class TestPersonBean { 7 /** 8 * PersonBean 类测试方法的main函数 9 * @param ARGS 10 */ 11 public static void main(String[] args) { 12 PersonBean person = new PersonBean(); 13 14 person.setName("张三"); 15 person.setDeceased(false); 16 17 // 输出: "张三[活着]" 18 System.out.print(person.getName()); 19 System.out.println(person.isDeceased() ? " [已故]" : " [活着]"); 20 } 21 }
在Jsp中使用JavaBean的两种使用方式:
(a) jsp 中嵌入 java 代码方式访问 javabean
<%@ page import="player.PersonBean" %> <% TestPersonBean testBean=new TestPersonBean(); %> <% String name=req.getParameter(“name”);%> <% testBean.setName(name)%> <%=testBean.getName()%>
(b) jsp 中使用 <jsp:useBean> 标记符访问 javabean
<jsp:useBean id="person" class="player.PersonBean" scope="page"/> <jsp:setProperty name="person" property="*"/> <html> <body> 姓名:<jsp:getProperty name="person" property="name"/><br/> 已故与否?<jsp:getProperty name="person" property="deceased"/><br/> <br/> <form name="beanTest" method="POST" action="testPersonBean.jsp"> 输入姓名:<input type="text" name="name" size="50"><br/> 选择选项: <select name="deceased"> <option value="false">活着</option> <option value="true">已故</option> </select> <input type="submit" value="测试这个JavaBean"> </form> </body> </html>
<jsp:useBean>标签可以在JSP中声明一个JavaBean,然后使用。声明后,JavaBean对象就成了脚本变量,可以通过脚本元素或其他自定义标签来访问。<jsp:useBean>标签的语法格式如下:
<jsp:useBean id="bean‘s name" scope="bean‘s scope" typeSpec/>
在<jsp:useBean>标签主体中使用<jsp:getProperty/>标签来调用getter方法,使用<jsp:setProperty/>标签来调用setter方法,语法格式如下:
<jsp:useBean id="id" class="bean‘s class" scope="bean‘s scope"> <jsp:setProperty name="bean‘s id" property="property name" value="value"/> <jsp:getProperty name="bean‘s id" property="property name"/> ........... </jsp:useBean>
name属性指的是Bean的id属性。property属性指的是想要调用的getter或setter方法。
Jsp程序中使用JavaBean的scope属性:
(a)当scope=application时,我们浏览date.jsp,这时显示出了系统时间。可是不管我们怎么刷新,重新打开一次浏览器,甚至换台机器,它显示的时间始终不变,都是当初的时间(即bean刚创建时得到的系统时间),因为scope=application,所以Bean的实例在内存中只有一份,此时只要不重新启动WEB服务,输出不会变化。
(b)当scope=session时,浏览date.jsp,刷新时显示也不会变化。可是当我们重新打开一浏览器,即一个新的session,系统便再次创建Bean的实例,取得当前系统时间,这时将得到正确的时间。同样,再次刷新新打开的页面(新的session),显示也不会变化。
(c)当scope=page/request(它们的区别只在于包含静态文件时,此处无区别)时,不断刷新页面将不断得到当前系统时间。