第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 &lt; 2}</td>

<td>${2 < 5}</td>

</tr>

<tr>

<td>大于:\${1 &gt; 2}</td>

<td>${1 > 2}</td>

</tr>

<tr>

<td>小于等于:\${3 &lt;= 2}</td>

<td>${3 <= 2}</td>

</tr>

<tr>

<td>大于等于:\${3 &gt;= 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

posted on 2018-01-31 23:19  東風★破  阅读(120)  评论(0)    收藏  举报

导航