`

servlet和jsp核心编程(第2版)第十四章 JavaBean组件在JSP文档中的应用 学习笔记

阅读更多
第十四章 JavaBean组件在JSP文档中的应用
一、bean是什么
1.bean类拥有一个零参数的( 默认)构造函数。
2.bean类不应该有公开的实例变量(字段)。
3.持续性的值应该通过get和set方法来访问。
二、bean的应用
jsp页面中可以使用三种构造函数来构建和操作javabean组件。
(一).jsp:useBean,构建一个新的bean
<jsp:useBean id = "beanName" class = "package.Class"/>
这句的意思就是实例化由class指定的类,并将实例化后的对象绑定到_jspService中的变量。变量的名字由id指定。但要注意,<警
告>一定要使用完全的类限定名。即使我们已经import了相应的包。

2.我们可以把
<jsp:useBean id = "book1" class = "coreservlets.Book">
看做
<%coreservlets.Book book1 = new coreservlets.Book();%>


3.将所有的bean都放在包中,安装在通常用来存放java的代码目录中,单个的类放在WEB-
INF/classes/subdirectoryMatchingPackageName中,JAR放在WEB-INF/lib中。

4.jsp:useBean选项的使用:scope,beanName,type。scope指定指定bean的应用范围,仅当不存在相同的id和scope时,才实例化新的对象。beanName既可以指向类,也可以指定含有序列化bean对象的文件。beanName属性的值被传递给java.beans.Bean的instantiate。type可以实现我们要声明的变量的类型是实际bean类型的超类,或是bean实现的接口。比如
<jsp:useBean id = "thread1" class = "mypackage.MyClass" type ="java.lang.Runnable"> 
实际为
java.lang.Runnable thread1 = new myPackage.MyClass()
;如果实际的类与type不兼容,则会产生ClassCastException异常。如果bean已存在,我们可以不使用class属性,而只使用type属性指定其类型。

(二).jsp:getProperty
,<jsp:getProperty name = "beanName" property = "propertyName"/>

1.获得bean之后,就可以使用jsp:getProperty输出他的属性。<重点提示>在jsp:useBean中,bean的名字由id指出,而在jsp:setProperty和jsp:getProperty中由name属性指出。

2.我们可以把
<jsp:getProperty name = "book1" property = "title">看做<%= book1.getTitle()%>


(三).jsp:setProperty
<jsp:setProperty name = "beanName" property = "propertyName" value = "propertyValue"/>


1.我们可以把
<jsp:setProperty name = "book1" property = "title" value = "Core Servlets and JavaServer page">
视为
<%book1.setTitle("Core Servlets and JavaServer page");%>
后者为显式java语法,前者为XML语法。

三、设置bean的属性:高级技术

1.jsp:setProperty的value属性允许给出的值为请求期间的表达式,如
<jsp :setProperty name = "entry" property = "itemID" value = '<%=request.getParameter("itemID")%>'/>.


2.如果我们的bean的属性不是String类型的那么把属性传给bean就会很复杂,因为我的理解是,由于表单提交的属性值都为String,而bean类中所对应的属性不一定为String,这就遇到了一个类型转换的问题。我们可以在
<jsp:setProperty name ="entry" property = "numItems" param ="numItems"/>
中不使用value属性,而使用param属性指定一个输入参数,然后自动完成类型转换,这个param就对应表单中的name属性的值,并且要注意如果param和property的值相同,那么可以省略param属性。我们倾向于不省略param。

3.将所有属性和同名的请求参数关联起来,注意是同名的请求参数,也就是可以理解为表单中和name属性的值相同的那些bean属性。我们使用
<jsp:setProperty name = "entry" property = "*"/>


四、共享bean
1.使用scope时,系统首先检查指定的位置是否存在指定名称的bean,如果找不到现有的bean时,才会创建新的bean。
2.<jsp:useBean scope = "page"/>省略scope也可以得到该效果,page作用域表示,在处理当前请求期间,除了要将bean对象绑定到局部变量外,还应该将他放在PageContext对象中,将此对象存储在此表示,servlet可以通过调用预定义变量pageContext的getAttribute方法访问它。由于每个页面和每个请求都有不同的pageContext对象,所以scope ="page"(或省略scope)就表示不共享bean,也就是针对每个请求都创建新的bean。

3.scope="request"除了要将bean对象绑定到局部变量外,还应该将他放在HttpServletRequest对象中,看似好像也是非共享bean,但是由于<jsp:include>是在请求该页面时调用此页面,我们可以把其视其为,同一个请求,主次页面都会得到调用,所以主次或jsp页面和servlet页面将会共享请求对象。而<jsp:forward>也会自动转到新的页面,所以jsp:forward的主次页面也会共享请求对象。同理,和这两者作用相同的RequestDispatcher的include或forward方法也共享请求对象。

4.scope="session":除了要将bean对象绑定到局部变量外,还应该将他放在HttpSession对象中。

5.scope="application":除了要将bean对象绑定到局部变量外,还应该将他放在ServletContext对象中。ServletContext可以通过application.getServletContext()。ServletContext由Web应用中多个servlet和jsp共享。ServletContext中的值可以用getAttribute()方法取得。

6.我们可以使用<jsp:useBean...>statements</jsp:useBean>来完成类的初始化,其中的statements只有当创建新的bean时执行。如果使用已有的bean,则不执行。

五共享bean的四种方式
1.<警告>不要为存储在不同位置的bean取相同的名字,服务器可能会发生错误,并取回错误的bean,jsp:useBean中的id都应该使用唯一的值,这就是为什么它用id,而不用name的原因吧。这里不再赘述
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics