EL&JSTL

末鹿安然 提交于 2019-12-25 23:43:20

EL&JSTL

1、EL表达式

EL(Expression Language)目的:为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在JSP中简化表达式的方法,让JSP的代码更加简化。

禁用 EL 计算的语法为(页面中):<%@ page isELIgnored =“true|false” %>

或者web.xml(全局)

<jsp-config>
	<jsp-property-group>
	<url-pattern>*.jsp</url-pattern>
	<el-ignored>true</el-ignored>
	</jsp-property-group>
</jsp-config>

2、EL中的11个隐式对象

隐式对象 类型 说明
PageContext javax.servlet.ServletContext 表示此JSP的PageContext
PageScope java.util.Map 取得Page范围的属性名称所对应的值
RequestScope java.util.Map 取得Request范围的属性名称所对应的值
sessionScope java.util.Map 取得Session范围的属性名称所对应的值
applicationScope java.util.Map 取得Application范围的属性名称所对应的值
param java.util.Map 如同ServletRequest.getParameter(String name)
paramValues java.util.Map 如同ServletRequest.getParameterValues(String name)
header java.util.Map 如同ServletRequest.getHeader(String name)
headerValues java.util.Map 如同ServletRequest.getHeaders(String name)
cookie java.util.Map 如同HttpServletRequest.getCookies()
initParam java.util.Map 如同ServletContext.getInitParameter(String name)

3、EL表达式的作用

1. 运算符

​ + - * / div 加减乘除

操作符 描述 操作符 描述
+ > gt 测试是否大于
- <= le 测试是否小于等于
* >= ge 测试是否大于等于
/ div && and 测试逻辑与
% mod 取模 || or 测试逻辑或
== eq 测试是否相等 ! not 测试取反
!= ne 测试是否不等 empty 测试是否空值
< lt 测试是否小于 . [] 取值

2. 参数中取值

​ 可以访问参数中取值(上一页面的表单或查询字符串的参数)。用法如下:

${param . name} 相当于request.getParameter (name)

${paramValues. name} 相当于 request.getParamterValues(name)

3. 四个作用域中的存储数据

${pageScope .objectName. attributeName} 或者 pageScope.objectName[attributeName]<spanstyle="color:blue;fontweight:bold;">eg:{pageScope .objectName[attributeName]} <span style="color:blue;font-weight:bold;">eg:{requestScope.name1}

${requestScope. objectName. attributeName} 或者 ${requestScope.objectName[attributeName]}

${sessionScope. objectName. attributeName} 或者 ${sessionScope.objectName[attributeName]}

${applicationScope. objectName. attributeName} 或者 ${applicationScope.objectName[attributeName]}

其中4个作用域对象pageScope 、requestScope、sessionScope、applicationScope可以省略,会依次从前往后获取。

取值既可以用.号也可以用[]取值,如果要取的属性值中有特殊符号如.或者-,则一定要使用[]的方式。

user.MyName{ user. My-Name}应当改为{user[“My-Name”]}

request.setAttribute("name1", "王舞");
session.setAttribute("name2", "王舞");
application.setAttribute("name3", "王舞");
	
ShopEntity shop=new ShopEntity();

shop.setShopPrice(22);
shop.setShopName("哇哈哈");
request.setAttribute("bean", shop);
<!-- request拿数据 ,可以省略-->
${requestScope.name1}<br/><br/>
<!-- session拿数据,可以省略 -->
${sessionScope.name2}<br/><br/>
<!-- application拿数据,可以省略 -->
${applicationScope.name3}<br/><br/>
<!-- 对象拿值 -->
${ bean.shopPrice }<br/><br/>
${ bean["shopName"] }<br/><br/>
<!-- 取多个值 -->
${paramValues.stu_hobby[1]}

4. 获取请求头中属性值

​ 将请求头名称映射到单个字符串头值,其中header为EL中的隐式对象。如:
​ ${header.host} 相当于request.getHeader(“host”)
​ ${header[“cache-control”]} 相当于request.getHeader(“cache-control”)

将请求头名称映射到一个数值数组,其中的headerValues为EL中的隐式对象。如:

${headerValues. name} 相当于 request.getHeaderValues(name)

5.获取cookie中的属性值

${cookie. name .value} 返回带有特定名称的第一个 cookie 值。如果请求包含多个同名的 cookie,则应该使 用 ${headerValues. name} 表达式。如:

​ ${cookie.JSESSIONID.value}

6.获取初始化参数值
​ 将上下文初始化参数名称映射到单个值,其中initParam为EL中的隐式对象。如:

${initParam.encoding}

前提是在web中配置初始化参数

<context-param>

 	<param-name>encoding</param-name >

	<param-value>utf-8</param-value >

</context-param>

7.JSP隐式对象

JSP 页的上下文,它可以用于访问 JSP 隐式对象。通过pageContext可以访问除自身以外的其它8个JSP隐式对象。

${pageContext.request}

${pageContext.response }

${pageContext.session }

${pageContext.exception}

${pageContext.page}

${pageContext.out}

${pageContext.servletConfig}

${pageContext.servletContext}

4、JSTL

JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上,如tomcat4.x及以上的版本。在JSP 2.0中也是作为标准支持的。它可为用户提供一个无脚本环境。

JSTL作为一个标准的已制定好的标签库,可以应用于各种领域,例如基本输入输出、流程控制、循环、XML文件解析、数据库查询及国际化和格式化的应用等。JSTL所提供的标签函数库主要分为五大类:核心标签库(Core tag library)、I18N格式化标签库、SQL标签库、XML标签库、函数标签库。

5、JSTL的使用

核心标签库

核心标签库由通用标签、条件标签和迭代标签三部分组成,其中通用标签用于操作JSP页面范围的变量,条件标签是对JSP页面中的代码进行条件判断和处理,迭代标签用于循环遍历对象集合。在JSP页面中使用使用核心标签库,首先需要使用taglib指令导入核心标签库的uri,如下:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  • 通用标签

    <c:set > 标签分为var版本,由var跟scope属性定义。还有target版本,由target跟property属性定义。var跟target互相冲突,只能选择一个。

    ”var版本“: 用于在某个作用域(page默认、request、session、application)中设置某个变量。如果在这个指定的作用域里,变量不存在,则创建它,并给这个变量赋初值,如果变量已经存在,则把新值赋给这个变量。

<%-- 从request作用域取出name变量,如果没有则创建并放入request中,设置值为zhangsan    --%>
<c:set var="name"  value="zhangsan" scope="request"  />  

<c:set var="name"   scope="request"  >
zhangsan
</c:set> 

​ ”target版本“:

​ 如果“target”是一个Map,“property”指定的是该Map的一个键,表示设置这个Map集合中字段值,如果value为null则表示删除。

​ 如果“target”是一个bean,“property”指定的是该bean的一个成员字段,表示把这个bean中的property的字段设置值,默认依次从page、request、session、application作用查找。如果value为null则表示把此property字段值清空。

​ 使用前提是4大作用域中已经有bean或者map。

<jsp:useBean id="hellobean"   class="com.seven.MyBean"  scope="request"  />
<%-- 表示把id为hellobean的bean的name属性值修改为wangwu  --%>
 <c:set target="${hellobean}"  property="name"  >
six
</c:set> 

<%-- 表示把4大作用域中的helloMap对应集合中的key对应为name的值修改为seven  --%>
 <c:set target="${helloMap}"  property="name"  >
seven
</c:set>
 

<c:out >把结果输出到页面中。

<%-- 把字符串hello world输出到页面上  --%>
	<c:out value="hello world" />

<%-- 从4大作用域中的name的值取出输出  --%>
	<c:out value="${name}" />

<%-- 从4大作用域中把名为helloBean的bean的name属性值取出,如果没有这个属性则默认seven  --%>
	<c:out value="${helloBean.name}" default="seven" />

<%-- 从4大作用域中把名为hellMap的Map的key为name属性值取出,如果没有这个属性则默认seven  --%>
	<c:out value="${hellMap.name}" default="seven" />

<c:remove >用于删除某个变量或者属性。可以指定这个变量的作用域,若未指定,则默认为变量第一次出现的作用域。

 <%-- 把page范围内name属性删掉  --%>
  <c:remove var="name"  scope="page" /> 
  
  • 条件标签
    条件标签用于支持JSP页面中的各种条件。常用的标签有2个,分别是<c:if >和<c:choose >。标签体除了能放纯文本,还可以放任何JSP程序代码、JSP标签或者HTML代码。

<c:if > 用于进行条件判断,如果它的test属性为true,那么就计算标签体的内容。如果为false,就忽略标签体的内容。var表示把test的结果(必须是boolean类型)存储到4大作用域中。scope表示存储的作用域范围,默认为page,scope属性必须跟var属性一起使用。

 
<c:set var="age" value="27" />
<%-- 如果作用域中取出的age属性>18则显示成年人,小于18显示未成年人  --%>
<c:if test="${age>=18}"    >
	成年人
</c:if>
 <c:if test="${age<18}"    >
	未成年人
</c:if>
 
 <%-- 把test中的表达式(boolean)存储到request范围,存储的变量名为result  --%>
 <c:if test="${5<3}" var="result"  scope="request"  />
 <c:out value="${result}" />
 

<c:choose >标签作用类似于java中的switch语句,它用于执行多个条件语句块。<c:choose >标签处理<c:when >标签的标签体,可以将多个<c:when >标签嵌入一个<c:choose >中。如果条件的值都为false,则将处理<c:otherwise >的标签体。<c:choose >标签没有属性,<c:when >标签只有一个test属性,<c:otherwise >标签没有属性。

 
<c:set var="score" scope="request" value="48" />
<c:choose>
	<c:when test="${score>=90 && score<=100}">
		优秀
	</c:when>
	<c:when test="${score>=80 && score<90}">
		良好
	</c:when>
	<c:when test="${score>=60 && score<80}">
		一般
	</c:when>
	<c:otherwise>
		没及格
	</c:otherwise>
</c:choose>
  • 迭代标签

迭代标签用于重复计算标签的标签体。迭代标签有两种,分别是<c:forEach >跟<c:forTokens >

<c:forEach >标签可以用于重复做标签体内指定的事情,相当于for或者while循环,此时不需要指定items属性。如果不指定step步长属性那么默认为1。

<%-- 从1到10进行迭代,每次步长为2    --%>
<c:forEach var="i" begin="1" end="10" step="2" >

	<c:out value="${i}" />&nbsp;

</c:forEach>

<c:forEach >标签还可以用来依据集合中对象的个数来决定迭代的次数,来循环执行标签体内的内容。迭代集合常有Collection、Map、Iterator、Enumeration、数组(基本数据类型跟引用数据类型)等。

var属性表示指定迭代的参数的名字,items将要迭代的items集合,varStatus表示迭代的状态,可以访问迭代自身的信息。假设 varStatus=“status”,则status.index表示当前这次迭代从0开始的迭代索引,status.count当前这次迭代从1开始的迭代计数。status.first用来表明当前这轮迭代是否为第一次迭代,该属性为boolean类型。 status.last 用来表明当前这轮迭代是否为最后一次迭代,该属性为boolean类型。

<%
	List<MyBean> list = new ArrayList<MyBean>();
	MyBean b1 = new MyBean();
	b1.setName("zhangsan");
	MyBean b2 = new MyBean();
	b2.setName("lisi");
	MyBean b3 = new MyBean();
	b3.setName("wangwu");
	list.add(b1);
	list.add(b2);
	list.add(b3);
	request.setAttribute("user_list", list);
%>

<c:forEach var="user" items="${user_list}" varStatus="status" begin="0">
<%--  
	status.index表示当前这次迭代从0开始的迭代索引
	status.count当前这次迭代从1开始的迭代计数
	status.first用来表明当前这轮迭代是否为第一次迭代,该属性为boolean类型
	status.last 用来表明当前这轮迭代是否为最后一次迭代,该属性为boolean类型
--%>
${status.index}   ${status.count}  ${status.first}  ${status.last}
<c:if test="${status.count%2==0}"> <font color="red">${user.name}</font><br/> </c:if> 
<c:if test="${status.count%2!=0}"> <font color="blue">${user.name}</font><br/> </c:if>
</c:forEach>

<c:forTokens >标签专门用于处理字符串的迭代,可以指定一个或者多个分隔符。var属性表示要迭代的参数的名字;items表示要迭代的String;varStatus表示要迭代的状态;可以访问迭代自身的信息;delims表示分隔符。

<%--  使用分隔符分隔字符串  --%>
<c:forTokens var="color_token" items="blue,red,green|yellow|pink,black|white" delims="|">
	<c:out value="${color_token}" /> &nbsp;
</c:forTokens>

<br/>

<c:forTokens var="color_token" items="blue,red,green|yellow|pink,black|white" delims=",|">
	<c:out value="${color_token}" /> &nbsp;
</c:forTokens>
  • 重定向标签
    <c:redirect >用来重定向某个jsp页面,可以传递参数。
<c:redirect url="e.jsp"  >
	<c:param name="name">zhangsan</c:param>
	<c:param name="pwd" value="123" /> 
</c:redirect>

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!