JSP访问JavaBean-《Tomcat与Java Web开发技术详解(第2版)》

Published: by Creative Commons Licence (Last updated: )

JSP访问JavaBean

《Tomcat与Java Web开发技术详解(第2版)》.(孙卫琴)

把Java程序代码放到JavaBean中,然后在JSP文件中通过简洁的JSP标签来访问JavaBean,这是简化JSP代码的重要手段。

JavaBean简介

  • 有用户界面(UI)的JavaBean
  • 没有用户界面的,主要负责表示业务数据或处理事务的JavaBean

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

  • JavaBean是一个公共(public)的类
  • 有一个不带参数的构造方法
  • 通过set/get方法设置/获取属性;且这两个方法的名称为get属性名()set属性名()这种形式
  • 如果希望JavaBean被持久化,那么可以使它实现java.io.Serializable接口

JavaBean中除了get、set方法,也可有其他方法。

JSP访问JavaBean的语法

JSP网页中,既可通过程序代码来访问JavaBean,也可通过特定的JSP标签来访问JavaBean。 采用JSP标签,可以减少JSP网页中的程序代码,使它更接近于HTML页面

下面介绍访问JavaBean的JSP标签:

  • 1.导入JavaBean类:<%@ page import>
  • 2.声明JavaBean对象:<jsp:useBean id='局部变量名,且必须在所有范围内唯一' class='' scope='' />,它表示声明一个局部变量,并尝试通过设置属性的方式将其添加到某范围内。(必须先声明才能进行后续操作)
  • 3.访问JavaBean属性:<jsp:getProperty name='' property='' />调用该bean的get方法获取该属性(无需指定范围,因为id是唯一的),再打印。
  • 4.给JavaBean的某个属性赋值,可以使用<jsp:setProperty name='' property='' value='' />

开发人员创建的JavaBean类严格遵守JavaBean的规范,才能保证JSP中的访问JavaBean的标签能正确运行。 另使用EL语言能够更加简洁的完成上面的功能。

JavaBean的范围

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

  • page:表示页面范围,默认值
  • request:表示请求范围。
  • session:表示会话范围
  • application:表示Web应用范围

隐含对象PageContext的使用

JavaBean在页面(page)范围内

页面(page)范围对应的时间段: 从客户请求访问一个JSP文件开始,到这个JSP文件执行结束。

看起来就像是仅在本页面中创建的变量

页面范围内的一个请求转发示例:(后面几个示例仍使用此示例)

pageCounter1.jsp和pageCounter2.jsp都使用了

<jsp:useBean id="myPageBean" scope="page" class="mypack.CounterBean" />

在pageCounter1.jsp的最后使用<jsp:forward page="pageCounter2.jsp" />进行转发,两边的类CounterBean的对象都是独立的。

JavaBean在请求(request)范围内

请求范围对应的时间段为:从客户请求访问一个JSP文件开始,到这个JSP文件返回响应结果结束;如果这个JSP文件把请求转发给其他Web组件,那么直到其他Web组件返回响应结果结束。

<jsp:useBean id="myPageBean" scope="request" class="mypack.CounterBean" />

requestCounter1.jsp文件中声明的CounterBean对象,它可以被以下Web组件共享:

  • requestCounter1.jsp文件本身
  • 和requestCounter1.jsp文件共享同一个客户请求(即HttpServletRequest对象)的Web组件,包括requestCounter1.jsp文件通过<%@ include>指令或<jsp:include>标记包含的其他Web组件,以及通过<jsp:forward>标记转发的其他目标Web组件。

请求范围内的JavaBean对象实际上是作为属性保存在HttpServletRequest对象中的,其属性名为 JavaBean的ID,属性值为JavaBean对象,因此也可通过HttpServletRequest.getAttribute()方法读取请求范围内的JavaBean对象。

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

JavaBean在会话(session)范围内

会话范围对应整个会话的生存周期,处于同一个会话中的Web组件共享这个会话范围内的JavaBean对象。

会话范围内的JavaBean对象实际上是作为属性保存在HttpSession对象中的,其属性名为JavaBean的ID,属性值为JavaBean对象,因此也可使用 HttpSession.getAttribute()方法读取会话范围内的JavaBean对象。

CounterBean obj = (CounterBean) session.getAttributer("mySessionBean");

JavaBean在Web应用(application)范围内

Web应用范围内的JavaBean对象实际上是作为属性保存在ServletContext对象中,其属性名为JavaBean的ID,属性值为JavaBean对象,因此也可通过ServletContext.getAttribute()方法读取Web应用范围内的JavaBean对象。

再打开一个新的浏览器,多次访问applicationCounter.jsp,会看到count属性的值在第一个浏览器显示的数值的基础上递增。