标签:选择 foo ant 发布 而且 property 计算 lin href
标准动作jsp:useBean详解
scope默认是page作用域,那么在上述示例代码中可能出现问题:找不到person对象!
考虑更全面一些:jsp:useBean有条件地创建一个bean——useBean体
如果找不到bean属性,那么才会创建一个bean:
普通的非企业JavaBean规范定义了一个类怎么才能算是JavaBean。这个规范很复杂,不过,结果JSP和servlet使用bean时,只需要知道以下规则:
如上,使用Person类型,但是要建立一个Employee对象:
为jsp:userBean增加type属性
type:可以是class类型、抽象类型或者是一个接口。
class:必须是type的一个子类或具体实现。
若只用type,没有class
这时要求必须在page作用域中存在person属性,否则会报出java.lang.InstantiationException异常。
type vs class
type==引用类型,即要声明的类型,可以是抽象类
class==对象类型,即要实例化的类,必须是具体类
既然jsp动作可以生成bean,那么可以不用通过servlet来new一个对象了,而直接到jsp页面中完成对象生成、赋值。
若是让html和javaBean有一样的属性名字,那么param可以省略,property可以更清爽
bean标记会自动转换基本类型:
以上name类型是String,empID类型是int,bean标记会自动转换类型。
${person.name}
上述代码中,person没有声明就能使用,为什么?
在EL表达式中第一个命名变量可以是一个隐式对象(EL隐式对象不同于JSP也是对象)、也可以是一个属性。后文将详述EL隐式对象。
访问性质:对JavaBean属性而言(bean有性质);
访问映射值:对Map等映射而言(Map有键);
除了访问性质和映射值,还可以访问数组、List、非Java规范的属性名等
EL中的请求参数
若特定参数名只有一个参数值,那可以用param隐式对象;
${param.属性名}
若给定参数名有多个参数值,就使用paramValues。
${paramValues.属性名[n]},n是索引
从请求中获取信息
EL的header隐式对象保证了所有首部的一个Map,如获取host:
${header["host"]}或者${header.host}
这等同于脚本:
<%= request.getHeader("host") %>
如果要获取HTTP请求方法呢?——使用pageContext来得到其他一切
使用脚本是这样的:
<%= request.getMethod() %>
但是不能这样使用EL隐式对象:${requestScope.method},这是不对的,requestScope不是request对象本身
而是需要这样:
${pageContext.request.method}
即pageContext有一个request性质,request有一个method性质。
隐式作用域的作用
既然requestScope不是request对象,获取不到request请中的参数,那么有什么作用?
考虑这样的情况:
request.setAttribute("foo.person",p);
要获取“foo.person”属性,EL表达式就不能做到了,因为”foo.person”是一个完整的属性名.
${foo.person.name}
根本不行,因为容器认为foo是某个作用域中的属性,但是永远找不到。
隐式对象requestScope就可以发挥作用:
${requestScope["foo.person"].name}
得到cookie更简单
如要获得userName属性的cookie值,使用隐式对象cookie很方便:
${cookie.userName.value}
相比使用脚本就要麻烦很多,因为request没有getCookie(cookieName)方法,只能如此:
获取上下文参数,不要和servlet初始化参数混淆
若在DD配置有参数mainEmail:
使用EL表达式获取mainEmail:
${initParam.mainEmail}
使用EL函数有如下步骤:
若希望每个JSP都显示某个页眉或页脚:
标准页眉文件Header.jsp:
使用include指令
Web应用中的一个JSP Contact.jsp:
使用include标准动作
看似代码、效果相似,但是原理并不同
include指令在转换时发生,虽然只转换一次,但是生成的servlet类会大一些,发布产品时采用;
include标准动作在运行时发生,虽每次都是最新的页眉内容,但每次请求都会有一点性能开销。
为使用include指令的JSP生成的servlet:
为使用include标准动作的JSP生成的servlet:
不要把开始和结束HTML和BODY标记放在可重用部件中!设计和编写布局模板部件时(如页眉、导航条等),要假设它们会包含在其他页面中。
若希望页眉上有一个与上下文相关的子标题,它要依页面而定。
修改后的页眉Header.jspf:
而引用它的JSP页面只能用include标准动作,而不是include指令了(指令不是动态的调用):
请求转发到的目标JSP(HandleIt.jsp)
为什么第一次请求没有打印出“Welcome to out page!”这句在跳转判断之前的文本呢?
因为,利用jsp:forward标准动作,缓冲区会在转发之前清空,即转发前写到响应的所有内容都会清掉。
若有好事者,在““Welcome to out page!”这句话后使用脚本强制输出:
<% out.flush(); %>
那么的确输出了,并出现IIlegalStateException异常,且不会有跳转发生。故千万不要先刷新输出再转发。
《Head First Servlets & JSP》-8-无脚本的JSP
标签:选择 foo ant 发布 而且 property 计算 lin href
原文地址:http://www.cnblogs.com/myitroad/p/6192530.html