第3.70课 上课 JSP深入介绍, 标签
3_70

JSP深入介绍
标签
EL表达式
EL语法
EL语法
EL的语法很简单,他最大的特点就是使用上很方便
所有EL表达式都是以${ 为起始、以} 为结尾的。
语法结构
${expression}
例:
${sessionScope.user.name} ${userName}
上述EL范例的意思是:从Session取得用户的名称。
如果使用之前JSP代码的写法如下:
<%
User user = (User)session.getAttribute("user");
String name = user.getName( );
%>
两者相比较之下,可以发现EL的语法比传统JSP代码更为方便、简洁。
EL提供 . 和 [ ] 两种运算符来存取数据,[ ]可以访问集合或者是数组的元素、对象属性。
下列两者所代表的意思是一样的,但是需要保证要取得对象的那个属性有相应的setXxx()和getXxx()方法才行。
例:
${sessionScope.user.name}
等同于
${sessionScope.user["name"]}
. 和[ ] 也可以同时混合使用,如下:
${sessionScope.shopCart[0].price}
返回结果为shoppingCart中第一项物品的价格。
在EL中,字符串既可以使用"abc",可以使用 'abc'。
注意:如果要用EL输出常量,字符串要加双引号,不然的话EL会默认把常量当做一个变量来处理,这时如果这个变量在4个声明范围不存在的话会输出空,如果存在则输出该变量的值。
EL运算符
EL运算符
EL的算术运算符和Java中的运算符的大致相同,优先级也相同。
注意:'+' 运算符不会连接字符串了,他只用于加法运算。
EL关系运算符有以下六个运算符

如果需要在支持表达式语言的页面中正常输出“$”符号,则在“$”符号前加转义字符“\”,否则系统以为“$”是表达式语言的特殊标记。
注意:
在使用EL关系运算符时,不能写成如下:
${user.password1} == ${user.password2} 错误
或者
${ ${user.password1 } == ${ user.password2 } } 错误
而应写成
${ user.password1 == user.password2 } 正确
EL逻辑运算符

empty运算符
empty运算符主要用来判断值是否为null或空的,例如:
${ empty sessionScope.user.name }
接下来说明empty运算符的规则:
{empty} name
如果name为null时,返回true
如果name不存在时,返回true
如果name为空字符串时,返回true
如果name为空数组时,返回true
如果name为空的Map时,返回true
如果name为空的Collection时,返回true
否则,返回false
运算符表

代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>EL运算符</title>
<style>
td {
width: 200px;
}
</style>
</head>
<body>
<center>
<font color="red" size="24">EL表达式</font>
<table border="1">
<tr>
<th>算术运算符</th>
<th>结果</th>
</tr>
<tr>
<td>加法运算:\${1 + 2}</td>
<td>${1 + 2}</td>
</tr>
<tr>
<td>减法运算:\${2 - 1}</td>
<td>${2 - 1}</td>
</tr>
<tr>
<td>乘法运算:\${2 * 5}</td>
<td>${2 * 5}</td>
</tr>
<tr>
<td>除法运算:\${10 / 5}</td>
<td>${10 / 5}</td>
</tr>
<tr>
<td>求余运算:\${3 % 2}</td>
<td>${3 % 2}</td>
</tr>
</table>
<br />
<table border="1">
<tr>
<th>关系运算符</th>
<th>结果</th>
</tr>
<tr>
<td>等于:\${1 == 1}</td>
<td>${1 == 1}</td>
</tr>
<tr>
<td>不等于:\${1 != 1}</td>
<td>${1 != 1}</td>
</tr>
<tr>
<td>小于:\${1 < 2}</td>
<td>${2 < 5}</td>
</tr>
<tr>
<td>大于:\${1 > 2}</td>
<td>${1 > 2}</td>
</tr>
<tr>
<td>小于等于:\${3 <= 2}</td>
<td>${3 <= 2}</td>
</tr>
<tr>
<td>大于等于:\${3 >= 2}</td>
<td>${3 >= 2}</td>
</tr>
</table>
<br />
<table border="1">
<tr>
<th>逻辑运算符</th>
<th>结果</th>
</tr>
<tr>
<td>逻辑与:\${true && false}</td>
<td>${true && false}</td>
</tr>
<tr>
<td>逻辑或:\${true || false}</td>
<td>${true || false}</td>
</tr>
<tr>
<td>逻辑非:\${!true}</td>
<td>${!true}</td>
</tr>
</table>
<br />
<table border="1">
<tr>
<th>条件运算符</th>
<th>结果</th>
</tr>
<tr>
<td>\${2 > 1 ? "true" : "false"}</td>
<td>${2 > 1 ? "true" : "false"}</td>
</tr>
</table>
<br />
<table border="1">
<tr>
<th>空运算符</th>
<th>结果</th>
</tr>
<tr>
<td>\${empty param.username}</td>
<td>${empty param.username}</td>
</tr>
</table>
测试URL:http://localhost:8080/3.70/?username=admin&hobbys=a&hobbys=b&hobbys=c<br>
<table border="1">
<tr>
<th>通过param获取表单提交的单值参数</th>
<th>结果</th>
</tr>
<tr>
<td>\${param.username}</td>
<td>${param.username}</td>
</tr>
<tr>
<th>通过paramValues获取表单提交的同名多值参数</th>
<th>结果</th>
</tr>
<tr>
<td>\${paramValues.hobbys}</td>
<td>${paramValues.hobbys}</td>
</tr>
</table>
<br>
<a href="http://localhost:8080/3.70/index2.jsp?name=lisi&colors=red&colors=yellow">EL表达式内置对象</a><br>
</center>
</body>
</html>
使用EL从表单中取得数据
使用EL从表单中取得数据
与输入有关的隐含对象有两个:param和paramValues,它们是EL中比较特别的隐含对象。
一般而言,我们在取得用户的请求参数时,可以利用下列方法:
request.getParameter(String name)
request.getParameterValues(String name)
在EL中则可以使用param和paramValues两者来取得数据。
${param.name}
${paramValues.hobbys}可以取得所有同名参数的值
${paramValues.hobbys[0]}可以通过指定下标来访问特定的参数的值
这里 param 等同于 request.getParameter(String name)。
这里 paramValues 等同于 request.getParameterValues(String name)。
如果用户填了一个form,form中有一个名称为 userName的文本输入框,则我们就可以使用${param.userName}来取得用户填入文本框的值。
EL内置对象的使用
EL的隐含对象
EL也可以使用内置对象中设置的属性,需要使用特定的EL内置对象
属性范围 | 在EL中的对象
pageContext | pageScope
request | requestScope
session | sessionScope
application | applicationScope
EL中使用内置对象的属性
${requestScope.user} 等价于 <%request.getAttribute("user")%>
如果不写出特定的范围 ,那就会在不同的范围间进行搜索( pageContext ->request -> session -> application)
例: ${user}(user是在request范围request.setAttribute("user",user))
也就等于
${requestScope.user}
<%request.getAttribute("user")%>

配置Web应用参数

代码
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 局部禁用EL表达式(本页有效)
局部的优先级大于 web.xml文件中配置的全局
-->
<%@ page isELIgnored="false"%>
<%
//设置Cookie
Cookie cookie = new Cookie("loginName", "admin");
cookie.setMaxAge(24 * 60 * 60);
response.addCookie(cookie);
//设置pageContext、request、session、application属性
pageContext.setAttribute("name", "page_name");
request.setAttribute("name", "request_name");
session.setAttribute("name", "session_name");
application.setAttribute("name", "application_name");
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>内置对象</title>
<style>
td {
width: 200px;
}
</style>
</head>
<body>
<center>
<font color="red" size="24">EL表达式</font>
<h3>cookie内置对象</h3>
<table border="1">
<tr>
<td>获取cookie对象的属性:</td>
<td>${cookie.loginName.name} : ${cookie.loginName.value}</td>
</tr>
</table>
<br />
<h3>与存储相关的内置对象</h3>
<table border="1">
<tr>
<td>获取pageContext对象范围的属性:</td>
<td>${pageScope.name}</td>
</tr>
<tr>
<td>获取request对象范围的属性:</td>
<td>${requestScope.name}</td>
</tr>
<tr>
<td>获取session对象范围的属性:</td>
<td>${sessionScope.name}</td>
</tr>
<tr>
<td>获取application对象范围的属性:</td>
<td>${applicationScope.name}</td>
</tr>
</table>
<br />
<h3>与输入相关的内置对象:http://localhost:8080?name=lisi&colors=red&colors=yellow</h3>
<table border="1">
<tr>
<td>param获取请求参数:</td>
<td>${param.name}</td>
</tr>
<tr>
<td>paramValues获取请求参数:</td>
<td>${paramValues.colors[0]}、${paramValues.colors[1]}</td>
</tr>
</table>
<br />
<h3>header内置对象</h3>
<table border="1">
<tr>
<td>获取header对象的属性:</td>
<td>${header["user-agent"]}</td>
</tr>
</table>
<br />
<h3>initParam内置对象:获取在web.xml中设置的context-param参数</h3>
<table border="1">
<tr>
<td>获取应用参数:</td>
<td>${initParam.encode}</td>
</tr>
</table>
<br />
<h3>pageContext内置对象</h3>
<table border="1">
<tr>
<td>取得请求参数的字符串</td>
<td>${pageContext.request.queryString}</td>
</tr>
<tr>
<td>取得请求URL</td>
<td>${pageContext.request.requestURL}</td>
</tr>
<tr>
<td>取得web应用名称</td>
<td>${pageContext.request.contextPath}</td>
</tr>
<tr>
<td>取得HTTP请求方式(POST/GET)</td>
<td>${pageContext.request.method}</td>
</tr>
<tr>
<td>取得使用的协议</td>
<td>${pageContext.request.protocol}</td>
</tr>
<tr>
<td>取得用户IP地址</td>
<td>${pageContext.request.remoteAddr}</td>
</tr>
<tr>
<td>取得session的id</td>
<td>${pageContext.session.id}</td>
</tr>
</table>
</center>
</body>
</html>
禁用EL
局部禁用
局部禁用 EL 计算的语法为:
<%@ page isELIgnored ="true|false" %>
说明:
true:代表禁用EL表达式;
false:默认方式,表示不禁用EL表达式;
注意:
局部禁用的优先级大于 web.xml文件中配置的全局禁用
全局禁用
通过修改web.xml来决定当前的web应用的所有JSP页面不使用EL表达式。
<!-- EL表达式的全局配置 -->
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
JSTL标签库
导入标签库
使用标签库的时候,需要导入jstl-2.1.jar 包
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
c:if / c:elseif
标签判断表达式的值,如果表达式的值为真则执行其主体内容。
<c:if test="${4>3}">
</c:if>
实例:
<%
pageContext.setAttribute("name", "user");
%>
if<br>
<c:if test="${name == 'admin'}">
<font color="blue">管理员</font>
</c:if>
<c:if test="${name == 'user'}">
<font color="red">普通用户</font>
</c:if>
<hr color="red">
相当于java if else if<br>
<c:choose>
<c:when test="${name == 'admin'}">
<font color="blue">管理员</font>
</c:when>
<c:when test="${name == 'user'}">
<font color="red">普通用户</font>
</c:when>
</c:choose>
<hr color="red">
c:set / c:out / c:remove
设置c:set 的scope属性指定的变量存储到指定作用域中,等效于session.setAttribute("number", 10+8);
我们可以通过设置scope 来指定数据的存储作用域(pageContext , request , session , application)
<c:set var="number" value="${10+8}" scope="session" />
输出某个变量值,等效于session.getAttribute("number");
注意out标签搜索数据的顺序是先 pageContext ->request -> session -> application,找到就不再继续搜索。
<c:out value="${number}"/>
删除某个作用域中存储的变量
<c:remove var="number" scope="session" />
c:foreach
实例代码:
<%! String [] num = { "1", "2", "3", "4" }; %>
<c:forEach var="n" items="<%= num %>">
<c:out value="${n}" />
</c:forEach>
c:redirect
<c:redirect>标签通过自动重写URL来将客户端(浏览器)重定向至一个新的URL,
它提供内容相关的URL,并且支持c:param标签。
属性介绍:
url : 目标URL 必须有
context: 紧接着一个本地网络应用程序的名称 可选
实例:
<c:redirect url="http://www.yayadou.com"/>
带参数:
<c:redirect url="http://www.yayadou.com">
<c:param name="name">admin</c:param>
</c:redirect>
c:url
<c:url>标记格式的URL转换为字符串,并将其存储到一个变量。
var属性指定将包含格式化的URL中的变量。
<c:url var="myUrl" value="/index.jsp" >
<c:param name="id" value="168"/>
</c:url>
获取
${myUrl}
输出效果:
http://www.yayadou.com/index.jsp?id=168
浙公网安备 33010602011771号