第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) 如果有构造方法,必须提供一个无参数的构造方法。 【例51】创建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视图)中。例如,例51中的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动作标记的执行流程 【例52】编写一个JSP页面example5_2.jsp,在JSP页面中使用useBean动作标记获取一个bean,负责创建bean的类是例51中的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的属性值,比如例52中的语句“<%=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()方法。 【例53】创建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属性名相同。 【例54】用表达式或字符串修改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 【例55】通过HTTP表单的参数值设置bean的属性值。具体要求如下: (1) 编写JSP页面inputCar.jsp和showCar.jsp。 (2) 在inputCar.jsp页面中输入信息后提交给showCar.jsp页面显示信息。 (3) JSP页面中用到的bean是例54中的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