一。JavaBean是一种可重复使用的且跨平台的软件组织。



JavaBean可分为两种:一种是有用户界面的JavaBean,还有一种是没有用户界面,主要负责表示业务数据或者处理事务的JavaBean。


JSP通常访问的是后一种JavaBean。



二。JSP和JavaBean搭配使用,有三个好处。



1.使得HTML和Java程序分离,便于维护。


2.可以降低开发JSP网页人员的Java编程能力。


3.JSP侧重于生成动态网页,事务处理由JavaBean来完成,这样可以利用JavaBean组件的可重用性特点,提高开发网站的效率。




三。一个标准的JavaBean有以下几个特性。



1.JavaBean是一个公共的类。


2.JavaBean有一个不带参数的构方法。


3.JavaBean通过set方法设置属性,通过get方法获取属性。


4.属性名和get方法名之间存在固定的对应关系:如果属性名为“count”,那么get方法名为“getCount”,属性名中的第一个字母在方法名中改为大写。


5.属性名和set方法名之间存在固定的对应关系:如果属性名为“count”,那么get方法名为“setCount”,属性名中的第一个字母在方法名中改为大写。


6.如果希望JavaBean能被持久化,那么可以使它实现java.io.Serializable接口。



以下是一个JavaBean,类的名字为CounterBean。



package mypackage; 
 
 
 
 
  
 
 

   public class CounterBean { 
 
 
 

       private int count = 0; 
 
 
 
 
  
 
 

       public CounterBean() {} 
 
 
 
 
  
 
 

       public int getCount() { 
 
 
 

            return count; 
 
 
 

       } 
 
 
 
 
  
 
 

       public void setCount(int count) { 
 
 
 

            this.count = count; 
 
 
 

       } 
 
 
 

   }




其中定义了一个count属性,用来统计数字。有一个不带参数的构造方法,一个getCount和setCount方法。




四。JSP访问JavaBean。



1.首先导入JavaBena这个类。



<%@ page import="mypackage.CounterBean" %>


导入这个JavaBean类。



2.声明JavaBean对象。



<jsp:useBean id="counterBean" class="mypackage.CounterBean" scope="session" />


id:代表JavaBean对象的ID,实际上表示引用JavaBean对象的局部变量名,以及存放在特定范围内的属性名。JSP规范要求存放在所有范围内的每个JavaBean对象都有唯一的ID。


class:用来指定JavaBean的雷鸣。


scope:指定JavaBean对象的存放范围,可选值为page、request、session、application。



执行这段代码时,


1》定义一个名为counterBean的局部变量。


2》尝试从scope指定的会话范围内读取名为“counterBean”的属性,并且使得counterBean局部变量的引用具体属性值,即CounterBean对象。


3》如果在scope指定的会话范围内,名为“counterBean”属性不存在,会通过CounterBean类的默认构造方法创建一个CounterBean对象,并把它存放在会话范围内,令其属性名为“counterBean”,并且counter局部变量也引用这个CounterBean对象。



所以以上的<jsp:useBean>和以下Java代码作用等价:



mypackage.CounterBean counterBean = null; 
 
 
 

   counterBean = (mypackage.CounterBean) session.getAttribute("counterBean"); 
 
 
 

   if(counterBean == null) { 
 
 
 

        counterBean = new mypackage.CounterBean(); 
 
 
 

        session.setAttribute("counterBean",counterBean); 
 
 
 

   }



3.访问JavaBean属性。



1》get。



<jsp:getProperty name="counterBean" property="count" />


格式固定,name是上边声明的id,也就是此时需要使用的对象名字,property是你想要得到类中的属性名(这里类中就只有count,但是类中可以存放多个属性名,只要设置get和set方法就好),这里的代码相当于JSP中的:



<%=counterBean.getCount()%>



2》set。




<jsp:setProperty name="counterBean" property="count" value="2" />


相当于JSP中的:



<%counterBean.setCounter(2)%>

注意:必须先声明才能访问,否则抛出异常。




五。JavaBean的范围。



scope属性决定了JavaBean对象存在的范围,可选值包括以下几种。



page:表示页面范围,它是scope属性的默认值。



request:表示请求范围,从客户端想服务器发出请求到服务器返回响应这一阶段。



session:表示会话范围,从浏览器第一次访问一个Web应用中的支持会话的任意一个网页开始,Servlet容器创建HttpSession对象,到会话结束。会话结束指的是:会话过期、浏览器终止、服务器调用HttpSession对象的invalidate()方法等。



application:表示Web应用范围,该范围就是Web应用开启到终止的范围。


例子:


index.jsp 

 
 
 
 

   <%@ page language="java" contentType="text/html; charset=UTF-8" 
 
 
 

       pageEncoding="UTF-8"%> 
 
 
 

   <%@ page import="mypackage.CounterBean" %> 
 
 
 

   <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
 
 
 

   <html> 
 
 
 

   <head> 
 
 
 

   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
 
 
 

   <title>Insert title here</title> 
 
 
 

   </head> 
 
 
 

   <body> 
 
 
 
 
  
 
 

       <jsp:useBean id="counterBean" class="mypackage.CounterBean" scope="page" /> 
 
 
 

       <jsp:setProperty name="counterBean" property="count" value="<%=counterBean.getCount() + 1%>" />  
 
 
 

       <jsp:forward page="forward.jsp" /> 
 
 
 

   </body> 
 
 
 

   </html> 
 
 
 
 
 

  forward.jsp 

 
 
 
 

   <%@ page language="java" contentType="text/html; charset=UTF-8" 
 
 
 

       pageEncoding="UTF-8"%> 
 
 
 

   <%@ page import="mypackage.CounterBean" %> 
 
 
 

   <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
 
 
 

   <html> 
 
 
 

   <head> 
 
 
 

   <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
 
 
 

   <title>Insert title here</title> 
 
 
 

   </head> 
 
 
 

   <body> 
 
 
 

       <jsp:useBean id="counterBean" class="mypackage.CounterBean" scope="page" /> 
 
 
 

       <jsp:getProperty name="counterBean" property="count" /> 
 
 
 

   </body> 
 
 
 

   </html>



如果scope设置为page:


打开index界面,虽然在index中通过value设置为count+1,然是,然后请求转发给forward界面,发现无论打开刷新多少次都是输出0,这是因为在index对象创建的counterBean对象只在index界面内有效。



如果scope设置为request:


打开index界面,发现每次刷新数值都是1,因为request请求index,然后index将请求转发到forward界面,此时执行完forward界面返回响应,请求结束。



如果scope设置为session:


打开index,发现每次刷新数值都会加1,但是打开另一个浏览器却会从1重新开始。



如果scope设置为application:


打开index,刷新每次数值都会加1,,然后再打开另一个浏览器数值会接着上一个浏览器的数值增加。



注意:每次forward.jsp都会从对应的scope范围中获取属性,如果是request、session、application,那么对应的Java代码应该如下:



CounterBean obj = (CounterBean) request.getAttribute("counterBean"); 
 
 
 

   CounterBean obj = (CounterBean) session.getAttribute("counterBean"); 
 
 
 

   CounterBean obj = (CounterBean) application.getAttribute("counterBean");




总的来说,JavaBean对象的生存范围从大到小排列为:application>session>request>page。