7.1.1什么是JavaBean
JavaBean是Java开发语言中一个可以重复使用的软件组件,它本质上就是一个 Java类。为了规范JavaBean的开发,Sun 公司发布了JavaBean的规范,它要求一一个标准的JavaBean组件需要遵循一定的编码规范,具体如下。
(1)它必须具有一 个公共的、无参的构造方法,这个方法可以是编译器自动产生的默认构造方法。(2)它提供公共的setter方法和getter方法,让外部程序设置和获取JavaBean的属性。为了让读者对JavaBean有一个直观上的认识,接下来编写一个简单的JavaBean。首先在Eclipse中创建一个名为chapter09 的Web项目,然后在项目的src目录下创建名为cn.itcast.chapter09 javabean的包,再在该包下创建Book类,代码如文件7-1所示。
book.java
在文件7-1中,定义了一个Book类,该类就是一个JavaBean,它没有定义构造方法,Java编译器在编译时,会自动为这个类提供一个默认的构造方法。 Book 类中定义了一个price属性,并提供了公共的setPrice()和getPrice()方 法供外界访问这个属性。
7.1.2访问 JavaBean的属性
在讲解面向对象时,经常会使用类的属性,类的属性指的是类的成员变量。在JavaBean中同样也有属性,但是它和成员变量不是一一个概念,它是以方法定义的形式出现的,这些方法必须遵循一定的命名规范。例如,在JavaBean中包含-一个String类型的属性name,那么在JavaBean中必须至少包含getName()和setName()方法中的一个,这两个方法的声明如下所示。
public String getName(){…}
public void setName (String name) { . . . }
需要注意的是, 对于JavaBean属性的命名方式有一个例外情况。如果属性的类型为boolean,它的命名方式应该使用is/set,而不是get/set。 例如,有-一个boolean类型的属性maried,该属性所对应的方法声明如下所示。
public boolean isMarried(){…}
public void setMarried (boolean married){…}
从上面的代码可以看出,married 属性的setter方法命名方式没有变化,而getter方法变成了isMarried()方法。当然,如果一定要写成getMarried()也是可以的,只不过isarried()更符合命名规范。
通过上面的学习,读者对JavaBean 组件有了一个初步的了解,为了更加深刻地理解JavaBean 属性的定义,接下来通过具体的案例来实现一个JavaBean程序。
在c.itcaist .chapter09 javabean包下创建Student类。
Student .java
7.1.3 BeanUtils 工具
表7-1中列举了BeanUtils 类的常用方法及其功能的描述,掌握这些方法对灵活运用BeanUtis工具尤为重要。为了让读者熟悉BeanUtils 类的常用方法,接下来通过一个案例来演示使用setProperty()、getProperty()和 populate()方法访问JavaBean的属性。
(1)在chapter09项目的lib 目录中添加已下载的commons-beanutils- 1.9.2.jar 和Logging的JAR包commons-logging-1.2.jar,并将这两个JAR包发布到类路径中。
(2)在项目的src 目录下创建一个名为cn.itcast.chapter09.beanutils 的包,在包下创建Person类,Person 类中定义了name和age两个属性,并提供了对应的getter方法和setter方法供外界访问这两个属性。
Person.java
(3) 在cn.itcast.chapter09. beanutils 包下创建一个BeanUtilsDemo 类, 该类中使用了BeanUtils类的常用方法,具体代码如文件7-4所示。
BeanUtilsDemo.java
7.2.1初识EL
由于EL可以简化JSP页面的书写,因此,在JSP的学习中,掌握EL是相当重要的。要使用EL表达式,首先要学习它的语法。EL表达式的语法非常简单,都是以“$("开始,以“]”结束的,具体格式如下。
${表达式}
需要注意的是,“${表达式}”中的表达式必须符合EL语法要求。关于EL语法的相关知识,将在下面的小节进行详细讲解。
为了证明EL表达式可以简化JSP页面,接下来通过一个案例来对比使用Java代码与EL表达式获取信息的不同。
首先,
在项目的src目录下创建包cn.itcast chapter09.servlet,在包中创建一个用于 存储用户名和密码的类MyServlet,代码如文件7-5所示。
文件7-5 MySerlet.java
然后,在WebContent目录下编写一个名为myjisp的JSP文件,使用该文件来输出MyServlet所存储的信息,代码如文件7-6所示。
文件7-6 myjsp.jsp
从文件7-6可以看出,如果不使用EL表达式,在JSP页面获取Servlet中存储的数据时,需要书写大量的Java代码。
接下来,将文件7-6进行修改,在myjsp.jsp 文件中,通过EL表达式来获取MyServlet中所存储的信息,修改后的页面代码如文件7-7所示。
文件7-7 myjsp.jsp
最后,部署Web项目chapter09,启动Tomcat服务器,在浏览器的地址栏中输入地址http:/localhost:9999/chapter09myservlet"访问MyServlet页面,浏览器窗口中显示的结果如图7-3所示。
1. pageContext对象
为了获取JSP页面的隐式对象,可以使用EL表达式中的pageContext 隐式对象。pageContext 隐式对象的示例代码如下。
${pageContext . response . characterEncoding}
在上述示例中,pageContext对象用于获取response对象中的characterEncoding属性。接下来,通过一个案例来演示pageContext隐式对象的具体用法。
在项目的WebContent目录下创建- 个名为pageContext.jsp的文件,代码如文件7-8
pageContext.jsp
从图7- 4可以看出,使用EL表达式中的pageContext对象成功地获取到了request.responsesenvlerContext和servetConfig对象中的属性。需要注意的是,不要将EL表达式中的隐式对象与JSP中的隐式对象混淆,只有pageContext对象是它们所共有的,其他隐式对象则毫不相关。
2. Web域相关对象
在Web开发中,PageContext、 HttpServletRequest、 HttpSession 和ServletContext这4个对象之所以可以存储数据,是因为它们内部都定义了一个Map集合,这些Map集合是有一定作用范围的,例如,HttpServletRequest 对象存储的数据只在当前请求中可以获取到。我们习惯把这些Map集合称为域,这些Map集合所在的对象称为域对象。在EL表达式中,为了获取指定域中的数据,提供了pageScope、 requestScope、sessionScope 和applicationScope4个隐式对象,示例代码如下。
${pageScope.userName)
${ request Scope .userName )
${sesslon. cope. use rName )
${applicationScope. userName)
需要注意的是,EL 表达式只能在这4个作用域中获取数据。为了让读者更好地学习这4个隐式对象,接下来通过一个案例来演示这4个隐式对象如何访问JSP域对象中的属性。
在项目的WebContent目录下,新建一一个名为scopes.jisp的文件。
scopes.jsp
启动Tomcat 服务器,在浏览器地址栏中输入地址http://localhost:9999/chapter09/scopes.jsp”访问 scopes.jsp页面,浏览器窗口中显示的结果如图所示。
## 3. param和paramValues对象
param对象用于获取请求参数的某个值,它是Map类型,与request getParameter()方法相同,在使用EL获取参数时,如果参数不存在,返回的是空字符串,而不是null。param对象的语法格式比较简单,具体示例如下。
$ {param. num }
如果一个请求参数有多个值, 可以使用paramValues对象来获取请求参数的所有值,该对象用于返回请求参数所有值组成的数组。如果要获取某个请求参数的第1个值,可以使用如下代码。
${paramValues .nums[0]}
在项目的WebContent目录下,新建一个名为param.jsp的文件。
param.jsp
启动Tomcat 服务器,在浏览器地址栏中输入地址“http:/localhost:9999/chapter09/param.jsp"访问param.jsp页面,浏览器窗口中会显示一个表单,在这个表单中输入3个数字,分别为10、20、30,然后单击[提交]按钮,浏览器窗口中显示的结果如图。
4. cookie 对象
在JSP开发中,经常需要获取客户端的cookie信息,为此,在EL表达式中,提供了cookie隐式对象.该对象是一个代表所有cookie信息的Map集合,Map集合中元素的键为各个cookie的名称,值则为对应的cookie对象,具体示例如下。
获取cookie对象的信息: sicookie.userName)
获取cookie对象的名称: Slcookie.userName. name}
获取cookie对象的值: $lcookie. userName . value}
为了让读者更好地学习Cokie隐式对象,接下来通过一个案例来演示如何获取Coile对象中的信息。
在项目的WbComen目录下,新建一个cookie.jsp的文件.
cookie.jsp
启动Tomcat 服务器,在浏览器地址栏中输入地址http:/localhost:.9999/chapter09/cookie.jsp”访问cookie.jsp页面,由于是浏览器第1次访问cookie.jsp页面,此时,服务器还没有接收到名为userName的cookie信息,因此,浏览器窗口中不会显示。接下来刷新浏览器,第2次访问cookie.jsp页面,此时浏览器窗口中显示的结果如图7-7所示。



