编写Java无脚本的jsp页面
一、JSP表达式语言EL
1、EL 表达式和 JSP 脚本表达式
1> EL表达式总是放在大括号里,而且前面有一个美元符前缀
例如:${person.name}
2> 与JSP脚本表达式比较
例如:室外温度是 <%= temp %> 度。
如果使用EL,则是:
室外温度是${temp}度。
3> EL表达式以“${”开始,以“}”结尾,而JSP脚本表达式是以“<%”开始,以“%>”结尾 。EL表达式不能在脚本中定义变量 。目标是从JSP页面中消除Java代码
2、EL 表达式中使用隐式变量
1>
3、EL 运算符
1> EL运算符可以分为四类
a、属性和集合访问运算符
b、算术运算符
c、关系运算符
d、逻辑运算符
2> 用于访问属性和集合的EL运算符
a、 a.b:返回a的属性b的值。
b、 a[b]:返回a的键或索引为b的值。
注:如果b是一个字符串的话,这两个运算符在EL中的操作方式是可以互换的。
${header["host"]}
${header['host']}
${header.host}
3> EL 算术、关系、逻辑运算符
类型 | 操作 | 运算符 | 示例 | 示例结果 |
算术运算符 | 加 | + | ${2+3} | 5 |
减 | - | |||
乘 | * | ${9-8} | 1 | |
除 | / 或 div | ${9/3} | 3 | |
取模 | % 或 mod | ${24%5} | 4 | |
关系运算符 | 等于 | == 或 = | ||
不等于 | != | |||
小于 | < 或 lt | |||
大于 | > 或 gt | |||
小于等于 | <= 或 le | |||
大于等于 | >= 或 ge | |||
逻辑运算符 | 逻辑与 | && 或 and | ||
逻辑或 | || 或 or | |||
逻辑非 | ! 或 not | |||
其它 | 是否为空 | empty | ||
条件运算 | a?b:c |
4、EL 函数(暂时未完成,待续)
二、JSP 自定义标记库与标准标记库 JSTL
1、标准标记库JSTL
1> 需要两个JAR文件。第一个文件是jstl.jar,它为JSTL标记库提供API类。第二个文件是standard.jar,它提供了标记库的实现类 。复制到WEB-INF目录下的lib子目录下。 通过<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>引入到JSP
2>
2、通用标记
1> 使不使用JSP脚本执行Java程序成为可能
例如:<c:catch var="e">
会抛出异常的代码
</c:catch>
<c:out value="${number}" />
2> 支持变量
例如:<c:set var="num" value="${4*4}" />
<c:set var="num">
${8*2}
</c:set>
<c:set var="num">
<c:out value="${8+8}" />
</c:set>
3> 设置对象属性
例如:<c:set target="customer1" property="zipcode">
55501
</c:set>
或者
<c:set target="customer1" property="zipcode" value="55501" />
3、变量支持标记
1> <c:set>标记
a、标记<c:set>用于设置变量和对象的值,变量和对象的值可以在标记内或标记体内设置。使用value属性或标记体的内容来设置变量的值。
<c:set var="num" value="${4*4}">
或
<c:set var="num">
${8*2}
</c:set>
注:第二种,允许我们在<c:set>标记内插入标记操作。
例如:<c:set var="num">
<c:out value="${8+8}" />
</c:set>
2> <c:remove>标记
a、标记<c:remove>用于将一个变量从作用域中删除。
b、在标记中用var属性指定变量的名称,用scope属性来指定其作用域。
c、如果不指定其作用域,那么容器会首先查找page作用域,然后是request,再然后是session,最后是application作用域。
例如:<c:remove var="num" scope="作用域" />
注:与<c:set>不同的是,<c:remove>标记不能用于JavaBean和Map对象。
4、流程控制
1> JSTL 条件处理
a、<c:if> 与java的if语句一样,只有当满足条件时,才显示x的值。
例如:<c:if test="${x == '9'}">
${x}
</c:if>
注:变量的测试值必须用单引号括起来,容器根据这个单引号来识别比较。
b、<c:choose> 与java的switch语句一样,在JSTL的<c:choose>标记中,当没有条件满足时,我们使用可选的<c:otherwise>标记作为默认选项。
例如:<c:choose>
<c:when test="${color == 'white'}">
Hight!
</c:when>
<c:when test="${color == 'black'}">
Dark!
</c:when>
<c:otherwise>
Colors!
</c:otherwise>
</c:choose>
2> 循环
a、<c:forEach>
例如1:创建一个由var属性指定的变量,并将变量初始化为begin属性的值,然后开始处理循环体体内的内容,直到变量等于end属性的值。step:每隔3次显示x的当前值。
<c:forEach var="x" begin="0" end="30" step="3">
${x}
</c:forEach>
例如2:遍历numArray的元素,将这些元素的值都赋值为100。
<c:forEach var="num" items="${numArray}">
<c:set var="num" value="100" />
</c:forEach>
b、<c:forTokens> 标记用于循环处理字符串中由分隔符分割的各成员。
例如: <c:forTokens items=".." delims="..">
//内容体
</c:forTokens>
注:items属性是要处理的用分割符分割的字符串对象,delims指定的分隔符。
5、用 JSTL 访问 URL 信息
1> <c:url>,重写URL并对其参数编码
a、如果客户端浏览器不接受Cookies,我们需要重写URL以维护回话状态,<c:url>就是用于重写URL的。
例如:<c:url value="/page.html" var="pagename">
b、如果客户端浏览器接受Cookies,但是容器不能在当前会话中找到一个cookie,那么容器就会用session ID 数字重写URL。
c、如果value属性的值不是以斜杠开始,那么上下文的名称不会添加到var中。
d、在<c:url>标记的内容体中使用<c:param>标记,可以为URL添加参数。
例如:<c:url value="/page.html" var="pagename">
<c:param name="param1" value="${2*2}"/>
<c:param name="param2" value="${3*3}"/>
</c:url>
2> <c:import>,访问Web应用程序之外的内容
a、 在<c:import>标记的内容体中使用<c:param>标记,将参数添加到URL中。
例如:<c:import value="/page.html" var="newstuff" scope="session">
<c:param name="par1" value="val1"/>
<c:param name="par2" value="val2"/>
</c:import>
3> <c:redirect>,重定向到不同的URL
a、<c:redirect>标记的功能与HttpServletResponse的sendRedirect()方法相同,它发送一个重定向响应到客户端,并且告诉客户端去访问由其url属性指定的URL。
b、和前面两个URL标记一样,我们可以在<c:redirect>标记中使用context属性指定URL的上下文,使用<c:param>标记添加参数。
例如:<c:redirect url="/content.html">
<c:param name="par1" value="val1"/>
<c:param name="par2" value="val2"/>
</c:redirect>