第5章〓JSP与JavaBean


学习目的与要求

本章主要介绍在JSP程序中如何使用JavaBean组件。通过本章的学习,要求读者熟练掌握<jsp:useBean><jsp:setProperty><jsp:getProperty>等JSP的操作指令。



本章主要内容

 JavaBean的含义

 在JSP中使用JavaBean



一个JSP页面通过使用HTML标记为用户显示数据(静态部分),页面中变量的声明、程序片以及表达式为动态部分,对数据进行处理。如果Java程序片和HTML标记大量掺杂在一起使用,将不利于JSP页面的扩展和维护。JSP和JavaBean技术结合不仅可以实现数据的表示和处理分离,而且可以提高JSP程序代码重用的程度,是JSP编程中常用的技术。

本章涉及的Java源文件保存在ch5项目的src/main/java目录中,涉及的JSP页面保存在ch5项目的src/main/webapp目录中。

5.1编写JavaBean

JavaBean是一个可重复使用的软件组件,是遵循一定标准、用Java语言编写的一个类,该类的一个实例称为一个JavaBean,简称bean。JavaBean具有可重用、升级方便、不依赖于平台等特点。JavaBean又可以分为业务bean和数据bean。业务bean用于封装业务逻辑、数据库操作等; 数据bean用于封装数据。

编写一个JavaBean就是编写一个Java类(该类必须带有包名),这个类创建的一个对象称为一个bean,为了让JSP引擎(比如Tomcat)知道这个bean的属性和方法,JavaBean类必须遵守以下规则: 

(1) 如果类的成员变量的名字是name,那么为了获取或更改成员变量的值,类中必须提供以下两个方法。

getName()用来获取name属性。

setName()用来修改name属性。

方法的名字用get或set作为前缀,后缀是首字母大写的成员变量的名字。

(2) 对于boolean类型的成员变量,允许使用“is”代替上面的“get”和“set”。

(3) 类中方法的访问权限必须是public。

(4) 如果有构造方法,必须提供一个无参数的构造方法。

【例51】创建bean的源文件Rectangle.java(在com.bean包中)。该bean的作用是封装矩形的长和宽,并计算矩形的面积和周长。

Rectangle.java的代码如下: 


package com.bean;

public class Rectangle {

private double length;

private double width;

public Rectangle(){        

length = 20;

width = 10;

}

public double getLength(){       

return length;

}

public void setLength(double length){        

this.length = length;

}

public double getWidth() {

return width;

}

public void setWidth(double width) {

this.width = width;

}

public double computerArea(){

return length*width;

}

public double computerLength(){

return (length+width)*2;

}

}


JavaBean可以在任何Java程序编写环境下完成编写,再通过编译成为一个字节码文件,为了让JSP引擎(比如Tomcat)找到这个字节码文件,必须把字节码文件放在特定的位置。本书使用Eclipse集成环境开发JSP程序,Java类的字节码文件由Eclipse自动保存到Web项目的build\classes(Navigator视图)中。例如,例51中的Rectangle.class文件保存在ch5\build\classes\com\bean目录中。

5.2在JSP中使用JavaBean


当在JSP页面中使用bean时,首先使用page指令的import属性导入创建bean的类,例如: 


%@ page import="com.bean.*"%





扫一扫



视频讲解

 5.2.1动作标记useBean

useBean动作标记用来查找或者实例化一个JavaBean。useBean动作标记的语法格式如下: 


jsp:useBean id="bean的名字" class="创建bean的类" scope="bean的有效范围"/


或


jsp:useBean id="bean的名字" type="创建bean的类" scope="bean的有效范围"/


例如: 


jsp:useBean id= "rectangle" class= "com.bean.Rectangle" scope= "page"/


useBean动作标记中各属性的含义如表5.1所示。


表5.1useBean动作标记中各属性的含义





属性名描述


id指定该JavaBean实例的变量名,通过id可以访问这个实例
class指定JavaBean的类名。如果需要创建一个新的实例,Web容器会使用class指定的类,并调用无参数的构造方法来完成实例化
scope指定JavaBean的作用范围,包括page、request、session和application。其默认值为page,表明此JavaBean只能应用于当前页; 值为request表明此JavaBean只能应用于当前的请求; 值为session表明此JavaBean能应用于当前会话; 值为application表明此JavaBean能应用于整个应用程序
type指定JavaBean对象的类型,通常在查找已存在的JavaBean时使用,这时使用type不会产生新的对象。如果是查找已存在的JavaBean对象,type属性的值可以是此对象的准确类名、其父类或者其实现的接口; 如果是新建实例,则只能是准确类名或者父类。另外,如果能够确定此JavaBean的对象肯定存在,则指定type属性后可以省略class属性


当含有useBean动作标记的JSP页面被Web容器加载执行时,Web容器首先在pageContext内置对象中查看是否含有名字为id、作用域为scope的对象,如果该对象存在,Web容器就将这个对象的副本(bean)分配给JSP页面使用; 如果没有找到,就根据class指定的类创建一个名字是id的bean,并添加到pageContext对象中,同时将这个bean分配给JSP页面使用。useBean动作标记的执行流程如图5.1所示。




图5.1useBean动作标记的执行流程



【例52】编写一个JSP页面example5_2.jsp,在JSP页面中使用useBean动作标记获取一个bean,负责创建bean的类是例51中的Rectangle类,bean的名字是rectangle,rectangle的scope值为page。JSP页面的运行效果如图5.2所示。



图5.2使用bean的JSP页面


example5_2.jsp的代码如下: 


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

!DOCTYPE html

html

head

meta charset="UTF-8"

titleexample5_2.jsp/title

/head

body

jsp:useBean id="rectangle" class="com.bean.Rectangle" scope="page"/

p矩形的长是: %=rectangle.getLength()%

p矩形的宽是: %=rectangle.getWidth()%

p矩形的面积是: %=rectangle.computerArea()%

p矩形的周长是: %=rectangle.computerLength()%

/body

/html





扫一扫



视频讲解

 5.2.2动作标记getProperty

JavaBean的实质是遵守一定规范的类所创建的对象,用户可以通过以下两种方式获取bean的属性: 

(1) 在Java程序片或表达式中使用bean对象调用getXxx()方法获取bean的属性值,比如例52中的语句“<%=rectangle.getLength()%>;”。

(2) 先通过<jsp:useBean>标记获取一个bean,再通过<jsp:getProperty>标记获取bean的属性值。

使用getProperty动作标记可以获取bean的属性值。在使用该动作标记之前,必须先使用useBean动作标记获取一个相应的bean。getProperty动作标记的语法格式如下: 


jsp:getProperty name= "bean的名字" property= "bean的属性"/ 


或 


jsp:getProperty name= "bean的名字" property= "bean的属性"/ /jsp:getProperty


其中,name的取值是bean的名字,和useBean动作标记中的id对应; property的取值是bean的一个属性名,和创建该bean的类的成员变量名对应。这条指令相当于在Java表达式中使用bean的名字调用getXxx()方法。

【例53】创建bean的源文件NewRectangle.java,该bean的作用是计算矩形的面积和周长。编写一个JSP页面useGetProperty.jsp,在该JSP页面中使用useBean动作标记创建一个名字是pig的bean,并使用getProperty动作标记获取pig的属性值。负责创建pig的类是NewRectangle类。JSP页面的运行效果如图5.3所示。



图5.3使用getProperty动作标记获取pig的属性值


NewRectangle.java的代码如下: 


package com.bean;

public class NewRectangle {

double length;

double width;

double rectangleArea;

double rectangleLength;

public NewRectangle() {

length = 20;

width = 10;

}

public double getLength() {

return length;

}

public void setLength(double length) {

this.length = length;

}

public double getWidth() {

return width;

}

public void setWidth(double width) {

this.width = width;

}

public double getRectangleArea() {

return length * width;

}

public double getRectangleLength() {

return 2 * (width + length);

}

}


useGetProperty.jsp的代码如下: 


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

!DOCTYPE html

html

head

meta charset="UTF-8"

titleuseGetProperty.jsp/title

/head

body

jsp:useBean id="pig" class="com.bean.NewRectangle" scope="page"/

%pig.setLength(30);%

%pig.setWidth(20);%

p矩形的长是: jsp:getProperty property="length" name="pig"/

p矩形的宽是: jsp:getProperty property="width" name="pig"/

p矩形的面积是: jsp:getProperty property="rectangleArea" name="pig"/




p矩形的周长是: jsp:getProperty property="rectangleLength" name="pig"/

/body

/html





扫一扫



视频讲解

 5.2.3动作标记setProperty

用户除了可以在Java程序片中使用bean对象调用setXxx()方法修改bean的属性值以外,还可以使用setProperty动作标记修改bean的属性值。在使用该动作标记之前,必须先使用useBean动作标记获取一个相应的bean。使用setProperty动作标记设置bean的属性值有以下3种方式。

 用表达式或字符串设置bean的属性值

(1) 用表达式设置bean的属性值: 


jsp:setProperty name="bean的名字" property= "bean的属性" value= "%=expression%"/


(2) 用字符串设置bean的属性值: 


jsp:setProperty name="bean的名字" property= "bean的属性" value="字符串"/


在用表达式修改bean的属性值时,表达式值的类型必须和bean的属性类型一致。在用字符串修改bean的属性值时,字符串会自动转化为bean的属性类型,不能成功转化的可能会抛出NumberFormatException异常。

  通过HTTP表单的参数值设置bean的属性值

其语法格式如下: 


jsp:setProperty name="bean的名字" property="*"/


在通过HTTP表单的参数值设置bean的属性值时,表单参数的名字必须和bean属性的名字相同,服务器会根据名字自动匹配,类型自动转换。

 任意指定请求参数设置bean的属性值


jsp:setProperty name="bean的名字" property="属性名" param="参数名"/


用户可以根据自己的需要任意选择传递的参数,请求参数名无须和bean属性名相同。

【例54】用表达式或字符串修改bean的属性值。具体要求如下: 

(1) 创建bean的源文件Car.java,该bean的作用是描述汽车的一些属性。



图5.4用表达式或字符串修改bean的属性值

(2) 编写JSP页面car.jsp,在该JSP页面中使用useBean动作标记创建一个名字是smallCar的bean,其有效范围是page,并使用setProperty动作标记修改、获取该bean的属性值。负责创建smallCar的类是Car。JSP页面的运行效果如图5.4所示。

Car.java的代码如下: 


package com.bean;

public class Car {

String tradeMark;

String number;

public String getTradeMark() {




return tradeMark;

}

public void setTradeMark(String tradeMark) {

this.tradeMark = tradeMark;

}

public String getNumber() {

return number;

}

public void setNumber(String number) {

this.number = number;

}

}


car.jsp的代码如下: 


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

!DOCTYPE html

html

head

meta charset="UTF-8"

titlecar.jsp/title

/head

body

jsp:useBean id="smallCar" class="com.bean.Car" scope="page"/

%

String carNo = "京A8888";

%

%--使用setProperty动作标记设置smallCar的tradeMark属性值为宝马X6--%

jsp:setProperty property="tradeMark" name="smallCar" value="宝马X6"/

%--使用setProperty动作标记设置smallCar的number属性值为carNo--%

jsp:setProperty property="number" name="smallCar" value="%=carNo%"/

汽车的品牌是: jsp:getProperty property="tradeMark" name="smallCar"/

br汽车的牌号是: jsp:getProperty property="number" name="smallCar"/

/body

/html


【例55】通过HTTP表单的参数值设置bean的属性值。具体要求如下: 

(1) 编写JSP页面inputCar.jsp和showCar.jsp。

(2) 在inputCar.jsp页面中输入信息后提交给showCar.jsp页面显示信息。

(3) JSP页面中用到的bean是例54中的Car类创建的。JSP页面的运行效果如图5.5所示。



图5.5通过HTTP表单的参数值设置bean的属性值


inputCar.jsp的代码如下: 


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

!DOCTYPE html

html

head




meta charset="UTF-8"

titleinputCar.jsp/title

/head

body

form action="showCar.jsp" method="post" 

请输入汽车品牌: 

input type="text" name="tradeMark"/

br

请输入汽车牌号: 

input type="text" name="number"/

br

input type="submit" value="提交"/

/form

/body

/html


showCar.jsp的代码如下: 


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

!DOCTYPE html

html

head

meta charset="UTF-8"

titleshowCar.jsp/title

/head

body

%

request.setCharacterEncoding("UTF-8"); 

%

jsp:useBean id="smallCar" class="com.bean.Car" scope="page"/

%--通过HTTP表单的参数值设置bean的属性值(表单参数和属性自动匹配)--%

jsp:setProperty property="*" name="smallCar"/

汽车的品牌是: jsp:getProperty property="tradeMark" name="smallCar"/

br汽车的牌号是: jsp:getProperty property="number" name="smallCar"/

/body

/html



 5.2.4实践环节——使用JavaBean计算三角形的面积和周长

编写两个JSP页面inputTriangle.jsp和showTriangle.jsp。inputTriangle.jsp提供一个表单,用户可以通过表单输入三角形的3条边提交给showTriangle.jsp。用户提交表单后,JSP页面将计算三角形的面积和周长的任务交给一个bean去完成,创建bean的源文件是Triangle.java。页面的运行效果如图5.6所示。



图5.6使用JavaBean计算三角形的面积和周长


本章小结

本章重点介绍了在JSP中如何使用动作标记useBean、getProperty和setProperty。

习 题 5