jsp进一步学习2


EL表达式:
EL(Expression Language)表达式语言是JSP 2.0中新增加的一种可简化JSP开发的技术,它可以非常方便地访问JSP页面相关的数据和支持基本的算术、关系和逻辑运算。
EL表达式的基本语法格式为“${表达式}” 。
可以出现在JSP自定义标签和标准标签的属性值中,其计算结果将作为标签的属性值或属性值的一部分。
EL表达式也可以出现在模版元素中,其计算结果将插入进当前的输出流中。

EL表达式与JSP脚本表达式的比较(1 
使用EL表达式可以非常方便地访问JSP页面相关的数据。
 访问请求参数
JSP表达式:<%= reqeust.getParameter("user") %>
EL表达式:${param.user}
访问JavaBean及其中的嵌套属性
JSP表达式:<%CustomerBean custormBean =
(CustomerBean)pageContext.findAttribute(
"customerBean");%>
<%= customerBean.getAddress().getCountry()%>
EL表达式:${customerBean.address.country}
在EL表达式中还可以直接使用${cookie.user}来访问名称为user的Cookie信息,在JSP脚本表达式中却无法实现这样的功能,虽然使用JSP脚本片断也可以 实现这个功能,但是其程序代码却比较复杂。

EL表达式与JSP脚本表达式的比较(2
如果表达式的计算结果为null,JSP脚本表达式将输出内容为“null”的字符文本,而EL表达式会将它强制转换成空字符串("")后再输出,而不是显示为“null”,这样的处理结果非常有用。
EL 表达式与 JSP 脚本表达式的比较( 3
在EL表达式中还可以使用empty操作符来判断一个参数是否为null、某个集合或字符串中的内容是否为空。
EL表达式还具有JavaScript等脚本语言的优点,能够对字符串、数字等各种类型的数据进行自动转换,摆脱了Java语言严格的数据类型限制,使得应用起来更加简单。
EL表达式仅仅是专门为网页作者量身定做的一种数据访问语言,可以方便地访问和处理应用程序数据,但是它并不一种程序设计语言,不能替代Java语言的强大功能。
JSP 注释
JSP注释的格式:
<%-- 注释信息 --%>
JSP引擎在将JSP页面翻译成Servlet程序时,忽略JSP页面中被注释的内容。
•EL是为了便于存取数据而定义的一种语言,JSP 2.0之后才成为一种标准。下面的示例就是一个简单的EL表达式:
–<%@ page contentType="text/html; charset=UTF-8"%>
–<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
–<html>
–<body>
–${stuno + 1} <br>
–</body>
–</html>
语法结构:
•JSTL语法结构为${expression},它必须以“${”开始,以“}”结束。其中间的expression部分就是具体表达式的内容。
•EL表达式可以作为元素属性的值,也可以在自定义或者标准动作元素的内容中使用,但是不可以在脚本元素中使用。
•EL表达式可适用于所有的HTML和JSP标签。
[]与.运算符:
•EL提供(.)和([])两种运算符来存取数据,即使用点运算符(.)和方括号运算符([])。
–点运算符和方括号运算符可以实现某种程度的互换,如${student.name}等价于${student [“name”]}。
•当要存取的属性名称中包含一些特殊字符,如.或?等并非字母或数字的符号时,就一定要使用[]。例如${student.name }应当改为${student[“name”] }。
•如果要动态取值,就可以用[]来做,而.无法做到动态取值。
–例如${sessionScope.student[data]}中data是一个变量。
变量:
•EL存取变量数据的方法很简单,例如${username}。它的意思是取出某一范围中名称为username的变量。
•属性范围在EL中的名称如表6.1所示。
属性范围
EL中的名称
备  注
page
pageScope

 

request
requestScope

 

session
sessionScope

 

application
applicationScope

 

文字常量:
•一个EL表达式包含变量、文字常量、操作符。文字常量主要包括字符串、数字和布尔值,还有NULL。
•其中字符串是由任何由单引号或双引号引起来的一串字符。
•数字常量包括整型、浮点型,整型表示十进制、十六进制和八进制类型的值,浮点型与Java类似,可以包含任何正的或者负的浮点数。
•布尔型包括true和false。
操作符:
•EL表达式的操作符主要有
–算术运算符
–关系运算符
–逻辑运算符
–验证运算符empty
–条件运算符
•1. 算术运算符
–算术运算符主要有平时常用的“+”、“-”、“*”、“/”、“%”,如表6.2所示
运算符类型
运算符
功  能
算术运算符
+
执行加法操作
-
执行减法操作
*
执行乘法操作
/或div
执行除法操作
%或mod
执行取模操作
•2. 关系运算符
–关系运算符主要有“==”、“!=”、“<”、“>”、“<=”、“>=”,如表6.3所示。
•3. 逻辑运算符
–逻辑运算符主要有“&&”、“||”、“!”,如表6.4所示。
•4. 验证运算符“empty”与条件运算符“?:”
–验证运算符与条件运算符如表6.5所示。
 
与范围有关的隐含对象
•与范围有关的EL隐含对象包含以下4个:
–pageScope、requestScope、sessionScope和applicationScope
•它们基本上就和JSP的pageContext、request、session和application一样;  在EL中,这4个隐含对象只能用来取得范围属性值,即getAttribute(String name),却不能取得其他相关信息。
•例如,要取得session中储存的一个username属性的值,可以利用下面的方法:
–session.getAttribute("username")
•在EL中则使用下面的方法:
–${sessionScope.username}
与输入有关的隐含对象
•与输入有关的隐含对象有两个,即param和paramValues,它们是EL中比较特别的隐含对象。例如要取得用户的请求参数时,可以利用下列方法:
–request.getParameter(String name)
–request.getParameterValues(String name)
•在EL中则可以使用param和paramValues两者来取得数据:
–${param.name}
–${paramValues.name}
其他隐含对象
•1. cookie
–例如,要取得cookie中的一个名称为userCountry的值,可使用${cookie.userCountry}。
•2. header和headerValues
–header储存用户浏览器和服务端用来沟通的数据。
–在极少的情况下,有可能同一标头名称拥有不同的值,此时必须改为使用headerValues 来取得这些值。
•3. initParam
–initParam用于取得设定Web站点的环境参数(Context)。
–例如,一般的方法String userid = (String)application.getInitParameter(“userid”);
–可以使用${initParam.userid}来取得名称userid。
•4. pageContext
–pageContext用于取得其他有关用户要求或页面的详细信息:
 
禁 用 EL
•在JSP 2.0中默认是启用EL表达式的,如果需要禁用表达式的话,需要在JSP页面中使用page指令的isELIgnored属性来指定,语法如下:
–<%@page isELIgnored="true|false"%>
•true:表示忽略对EL表达式进行计算。
•false:表示计算EL表达式。
•isELIgnored默认为false。
 
总结:
在JSP引擎看来,出现在JSP脚本元素中的Java注释属于Java代码的一部分,它们将被原封不动地插入进Servlet源文件中,但在Servlet源文件被编译成class文件时由Java编译程序忽略。
在JSP引擎看来,JSP页面中的HTML注释就是一段文本,其处理方式与普通的文本内容完全一样,都被转换成out.write语句输出到客户端。
由于HTML注释相当于一段普通文本,其中当然可以嵌入JSP的其他各种元素,JSP引擎依然会对这些嵌套的JSP元素进行解释处理,例如:
 <!--This page was loaded on <%=(new java.util.Date()).toLocaleString()%>-->
特殊字符序列的转义处理( 1
由于三种JSP脚本元素的分界符都使用到了“<%”和“%>”,如果要在JSP模版元素和JSP脚本元素内部表示字面意义的“<%”和“%>”,需要进行转义处理。
由于EL表达式使用“${”和“}”作为分界符,在一些应用中,也需要对它们进行转义处理。
EL表达式内的转义
EL表达式内的任何字符序列都不需要进行转义处理,${‘${’}和${“${”}都可直接输出 ${,${‘}’}和${“}”}都可直接输出 },这就好像${‘xyz’}和${“xyz”}的输出结果都是 xyz 一样的道理。 
脚本元素内的转义
要在脚本元素内表达字面意义上的“%>”,必须用“%\>”进行转义。JSP引擎在生成servlet源文件时,将把脚本元素内部的“%\>”转换成“%>”。因为“%\>”在脚本元素内要被转义处理,如果要表达字面意义上的“%\>”,应该使用“%\\>”。
特殊字符序列的转义处理( 2
J SP模版元素内的转义
要在JSP模版元素内表达字面意义上的“<%”,必须用“<\%” 进行转义。要表达字面意义上的“<\%”,应该使用“<\\%”。为了让JSP引擎不要把JSP模版元素内的字符序列“${”当作EL表达式的开始,在支持EL表达式的JSP页面中,“$”可以使用“\$”来表示,但这不是必须的。如果要表达字面意义上的“${”,这时候就必须使用“\${”。如果要达字面意义上的“\$”,必须使用“\\$”。 
JSP标签的属性内的转义
如果使用单引号(‘)将属性值部分引起来,那么属性值中的单引号要用“\’”表示。
如果使用双引号(“)将属性值部分引起来,那么属性值中的双引号要用“\””表示。
反斜杠(\)要用“\\”表示。
在支持EL表达式的JSP页面中,“$”可以使用“\$”来表示。
“<%”要用“<\%” 表示。
“%>”要用“%\>” 表示。
JSP 指令
JSP指令简介
page指令
include指令
JSP 指令简介
JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分。
JSP指令的基本语法格式:
<%@ 指令 属性名="值" %>
举例:<%@ page contentType="text/html;charset=gb2312"%>
注意:属性名部分是大小写敏感的
在目前的JSP 2.0中,定义了page、include和taglib这三种指令,每种指令中又都定义了一些各自的属性。
如果要在一个JSP页面中设置同一条指令的多个属性,可以使用多条指令语句单独设置每个属性,也可以使用同一条指令语句设置该指令的多个属性。
第一种方式:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.util.Date"%>
第二种方式:
<%@ page contentType="text/html;charset=gb2312" import="java.util.Date"%>
Page 指令
page指令用于定义JSP页面的各种属性,无论page指令出现在JSP页面中的什么地方,它作用的都是整个JSP页面,为了保持程序的可读性和遵循良好的编程习惯,page指令最好是放在整个JSP页面的起始位置。
JSP 2.0规范中定义的page指令的完整语法:
<%@ page
[ language=" java" ]
[ extends=" package. class" ]
[ import="{ package. class | package. *}, ..." ]
[ session=" true | false" ]
[ buffer="none | 8kb | sizekb" ]
[ autoFlush=" true | false" ]
[ isThreadSafe=" true | false" ]
[ info=" text" ]
[ errorPage="relative_url" ]
[ isErrorPage="true | false" ]
[ contentType=" mimeType [ ;charset= characterSet ]" | " text/html ; charset=ISO-8859-1" ]
[ pageEncoding=" characterSet| ISO-8859-1" ]
[ isELIgnored=" true | false" ]
%>
include 指令
include指令用于通知JSP引擎在翻译当前JSP页面时将其他文件中的内容合并进当前JSP页面转换成的Servlet源文件中,这种在源文件级别进行引入的方式称之为静态引入,当前JSP页面与静态引入的页面紧密结合为一个Servlet。
语法:
<%@ include file="relativeURL"%>
其中的file属性用于指定被引入文件的相对路径。  
细节:
被引入的文件必须遵循JSP语法,其中的内容可以包含静态HTML、JSP脚本元素、JSP指令和JSP行为元素等普通JSP页面所具有的一切内容。 
被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见明知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。
在将JSP文件翻译成Servlet源文件时,JSP引擎将合并被引入的文件与当前JSP页面中的指令元素(设置pageEncoding属性的page指令除外),所以,除了import和pageEncoding属性之外,page指令的其他属性不能在这两个页面中有不同的设置值。
 
 
include 指令(续)
细节:
除了指令元素之外,被引入的文件中的其他元素都被转换成相应的Java源代码,然后插入进当前JSP页面所翻译成的Servlet源文件中,插入位置与include指令在当前JSP页面中的位置保持一致。 
引入文件与被引入文件是在被JSP引擎翻译成Servlet的过程中进行合并,而不是先合并源文件后再对合并的结果进行翻译。当前JSP页面的源文件与被引入文件的源文件可以采用不同的字符集编码,即使在一个页面中使用page指令的pageEncoding或contentType属性指定了其源文件的字符集编码,在另外一个页面中还需要用page指令的pageEncoding或contentType属性指定其源文件所使用的字符集 。
Tomcat 5.x在访问JSP页面时,可以检测它所引入的其他文件是否发生了修改,如果发生了修改,则重新编译当前JSP页面
file属性的设置值必须使用相对路径,如果以“/”开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前文件。
假设myweb应用程序的根目录下有一个a.jsp文件,其一般的访问路径形式为:
http://localhost:8080/myweb/a.jsp
在a.jsp页面中使用了如下语句引入b.jspf文件:
<%@ include file=“b.jspf”%>
请问:这时候JSP引擎调用的b.jspf文件的完整URL路径为什么?
如果将a.jsp页面映射为如下地址:
http://localhost:8080/myweb/dir1/a.html
请问:这时候JSP引擎调用的b.jspf文件的完整URL路径为:
http://localhost:8080/myweb/b.jspf
http://localhost:8080/myweb/dir1/b.jspf
out 隐式对象
在JSP页面中应使用out隐式对象来向客户端发送文本形式的实体内容。
out对象是通过调用pageContext对象的getOut方法返回的,其作用和用法与ServletResponse.getWriter方法返回的PrintWriter对象非常相似。
JSP页面中的out隐式对象的类型为JspWriter,JspWriter相当于一种带缓存功能的PrintWriter,设置JSP页面的page指令的buffer属性可以调整它的缓存大小,甚至关闭它的缓存。
JSP页面中的out隐式对象相当于插入到ServletResponse.getWriter方法返回的PrintWriter对象前面的缓冲包装类对象。
只有向out对象中写入了内容,且满足如下任何一个条件时,out对象才去调用ServletResponse.getWriter方法,并通过该方法返回的PrintWriter对象将out对象的缓冲区中的内容真正写入到Servlet引擎提供的缓冲区中:
设置page指令的buffer属性关闭了out对象的缓存功能
写入到out对象中的内容充满了out对象的缓冲区
pageContext 对象
pageContext对象简介
获得其他隐式对象
引入和跳转到其他资源
访问各个域范围中的属性
pushBody与popBody方法
pageContext 对象简介
pageContext对象是javax.servlet.jsp.PageContext类的实例对象,javax.servlet.jsp.PageContext类是javax.servlet.jsp.JspContext的子类。
pageContext对象封装了当前JSP页面的运行信息,它提供了返回JSP页面的其他隐式对象的方法。
pageContext对象是通过调用JspFactory.getPageContext方法返回的,getPageContext方法的完整语法如下:
public PageContext getPageContext(
javax.servlet.Servlet servlet,
javax.servlet.ServletRequest request,
javax.servlet.ServletResponse response,
java.lang.String errorPageURL, boolean needsSession,
int buffer, boolean autoflush)
在JSP页面中只需将pageContext对象传递给某个Java类的实例对象,在该Java对象中就可以访问和调用其他隐式对象的功能了。
PageContext类中定义了一个setAttribute方法来将对象存储进pageContext对象内部的一个HashMap对象中,同时也定义了一个getAttribute方法来检索存储在该HashMap对象中的对象。
PageContext类除了可以存储和检索自身中的属性对象外,还定义了可以存储和检索其他域范围内的属性对象的方法。  
 
获得其他隐式对象
getException方法返回exception隐式对象
getPage方法返回page隐式对象
getRequest方法返回request隐式对象
getResponse方法返回response隐式对象
getServletConfig方法返回config隐式对象
getServletContext方法返回application隐式对象
getSession方法返回session隐式对象
getOut方法返回out隐式对象 

 

你可能感兴趣的:(jsp进一步学习2)