1,什么是JavaBean?
JavaBean是使用java语言开发的一个可重用的组件,在JSP开发中使用javaBean可减少重复代码,使用整个JSP会更加简洁,逻辑清晰;jsp和JavaBean联合使用有以下好处:
- 可将页面(html,jsp等等)和java代码分离,这样日后的维护比较方便;
- 可利用JavaBean的有点,将常用的程序写成JavaBean组建,当JSP使用时,只要调用JavaBean组件来执行用户所需要的功能即可;
在jsp中如果要应用jsp提供的JavaBean的标签来操作简单类,则此类必须要满足一下条件:
- 所以的类必须放在一个包(package)中,在WEB中没有包的类是不存在的;
- 所有的类必须声明为一个public 的class,这样才能被外部访问;
- 类中所有的属性都必须进行封装,即使用private声明;
- 封装的属性如果需要被外部所操作,则必须编写对应的setter,getter方法;
- 一个javaBean中至少要存在一个无参构造方法,此方法为jsp中的标签所使用;
例如有这样一个JavaBean:
package com.keith.bean;
public class TUser {
private String name;
private int age;
public TUser() {
}
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;
}
}
这就是一个Bean,其实他就是一个普通的java类而已,还有以下几种称呼:
- POJO(Plain Ordinary Java Objects):简单java对象;
- VO(Value Object):用于传递值的操作上;
- TO(Transfers Object):传输对象,进行远程传输时,对象所在的类必须实现java.io.Serializable接口;
他们并没有什么本质上的不同,都是表示同一种类型的Java;
2,使用JSP的page指令导入所需要的JavaBean:
一个开发完后的JavaBean,可以用<%@ page %>指令导入;
使用刚刚定义的JavaBean,看实例:
<%@ page import="com.keith.bean.*" %>
<%
//实例化TUser
TUser user = new TUser();
//通过setter()方法给其赋值
user.setName("keith");
user.setAge(21);
%>
<%-- 通过getter()取值 --%>
姓名:<%=user.getName() %><br />
年龄:<%=user.getAge() %><br />
看下页面的输出:
姓名:keith
年龄:21
3,使用<jsp:userBean />指令
除了使用
<%@ page import="com.keith.bean.*" %>
来找到Bean,还可以使用<jsp:userBean>指令;其语法是:<jsp:useBean id="" scope="" class=""></jsp:useBean>
- id:表示实例化对象的名称;
- scope:表示此对象的保存范围;
- class:表示对象对应的包,类名称;
所有引入:
<jsp:useBean id="user" scope="page" class="com.keith.bean.TUser"></jsp:useBean>
和
<%@ page import="com.keith.bean.TUser" %>
效果是一样的;每次修改Bean以后,需要重新启动服务器,Bean才能被刷新加载进来;
为什么<jsp:userBean>指令可以直接进行对象实例化?依靠的是反射机制完成;
特点!JavaBean的特点在于与表单的交互上,可以直接通过request.getParameter()完成对对象的设置!
4,JavaBean的保存范围
<jsp:useBean>指令上存在一个scope属性,表示一个JavaBean的保存范围,一共有4中:
- page:保存在一页的范围中,跳转后此JavaBean无效;
- request:一个JavaBean对象可以保存在一次服务器跳转的范围中;
- session:在一个用户的操作范围中保存,重新打开浏览器时才会声明新的JavaBean;
- application:在整个服务器上保存,在服务器关闭时才会消失;
测试:有一个count的类:
package com.keith.bean;
public class Conut {
private int count = 0;
public Conut() {
System.out.println("----------一个新的Count对象产生-------------");
}
/**
* 每次自增后返回
* @return
*/
public int getCount() {
return ++ this.count;
}
public void setCount(int count) {
this.count = count;
}
}
测试page范围(只在本页有效,跳转后无效)的JavaBean:
count.jsp:
<jsp:useBean id="ct" class="com.keith.bean.CountBean" scope="page"/>
<body>
第:<jsp:getProperty property="count" name="ct"/>次访问!
<a href="count1.jsp">跳转到另一个JSP</a>
</body>
count1.jsp:
<jsp:useBean id="ct" class="com.keith.bean.CountBean" scope="page"/>
<body>
第:<jsp:getProperty property="count" name="ct"/>次访问!
</body>
当我们分别访问count和count1时候,在控制台会输出2次:----------一个新的Count对象产生-------------;
测试request范围的JavaBean:
<jsp:useBean id="ct" class="com.keith.bean.CountBean" scope="request"/>
测试session范围的JavaBean:
<jsp:useBean id="ct" class="com.keith.bean.CountBean" scope="session"/>
测试application范围的JavaBean:
<jsp:useBean id="ct" class="com.keith.bean.CountBean" scope="application"/>
4,删除JavaBean!
对于不同范围的JavaBean;则根据不同而删除:
session.removeAttribute("count");
request.removeAttribute("count");
response.removeAttribute("count");
application.removeAttribute("count");