【11】EL & JSTL

1. EL表达式

1.1 EL (Expression Language)

  • Expression Language, 是为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。
  • 作用:作用域中获得属性 – 只有作用域能把Servlet中的值回传给JSP
		String admin_name = "王晓霞";
		String[] names = { "张三", "李四", "王五" };
		request.setAttribute("admin_name", admin_name);
		request.setAttribute("names", names);
		request.getRequestDispatcher("EL.jsp").forward(request, response);
  		<body>
  			<h1>EL 表达式</h1>
  			${admin_name}<br/>
  			${requestScope.names[0]}
		</body>

1.2 EL 表达式执行运算

  • EL提供.和[]两种运算符来获取数据

1.3 EL 隐式对象(11个)

隐含对象名称 描 述
pageContext 对应于JSP页面中的pageContext(页面上下文)对象(注意:取的是pageContext对象。)
${pageContext.request.localAddr }
${pageContext.request.contextPath } ==引用css、js、img==
${pageContext.request.localName }
${pageContext.request.localPort }
${pageContext.session.id }
${pageContext.response.bufferSize }
pageScope pageScope 代表page域中用于保存属性的Map对象
requestScope 代表request域中用于保存属性的Map对象
sessionScope 代表session域中用于保存属性的Map对象
applicationScope 代表application域中用于保存属性的Map对象
cookie 表示一个保存了所有cookie的Map对象
param 表示一个保存了所有请求参数的Map对象
http://localhost:8088/JSPDemo01/EL.jsp?id=7 ${param.id }
paramValues 表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个string[]
http://localhost:8088/JSPDemo01/EL.jsp?id=7&city=jinan&city=shanghai&city=jiangxi
${paramValues.city }
header 表示一个保存了所有http请求头字段的Map对象
headerValues 同上,返回string[]数组。注意:如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”]
initParam 表示一个保存了所有web应用初始化参数的map对象

1.4 运算符

  1. 算术运算符
    + 、-、 *、 /(div)、 %(mod)

     ${8/3}   2.6666666666666665
    
  2. 关系运算符
    == 或 eq
    != 或 ne
    < 或 lt
    <= 或 le
    > 或 gt
    >= 或 ge

  3. 逻辑运算符
    && 或 and
    || 或 or
    ! 或 not

  4. empty 运算符

	<c:if test="${empty list }">没有数据</c:if>
	<c:if test="${not empty list }"></c:if>

1.5 EL 函数库(Sun)

Sun公司的标准函数库

	<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

在这里插入图片描述

		${fn:length(requestScope.list)}
	  	${fn:replace("sadasqeqw","a","A") }
	  	${fn:substring("abcdefg",2,3) }
	  	${fn:startsWith("abc21321","abc") }
	  	${fn:toLowerCase("AABBddc") }
	  	${fn:toUpperCase("AABBddc") }
		${fn:trim("  abc21321  ") }

2. JSTL

2.1 JSTL

  • JavaServer Pages Standard Tag Library , JSP标准标签库
  • 标准通用的标签函数库

2.2 JSTL需要导入的包(Eclipse)

在这里插入图片描述

  • Maven 依赖
	<dependency>
	    <groupId>javax.servlet.jsp.jstl</groupId>
	    <artifactId>jstl-api</artifactId>
	    <version>1.2</version>
	</dependency>
	<dependency>
	    <groupId>taglibs</groupId>
	    <artifactId>standard</artifactId>
	    <version>1.1.2</version>
	</dependency>

2.3 JSTL标签库分类

在这里插入图片描述

2.4 使用<%@ taglib %> 指令引用JSTL标签库

	<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
	<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

2.5 JSTL标签库 – 核心标签库 C

  1. <c:set> – 作用域中设置变量

    <c:set var="uname" value="lisi" scope="request"></c:set>
    scope :表示作用范围
    
  2. <c:out> – 输出变量值

    <c:out value="${requestScope.uname}"></c:out>
    
  3. <c:remove> – 作用域中移除变量

    <c:remove var="uname" scope="request"/>
    
  4. <c:catch> 异常处理

  5. <c:if> : 条件判断

    <c:if test="${uname=='admin'}">管理员</c:if>
    <c:if test="${uname=='lisi'}">保洁员</c:if>
    
  6. <c:choose>

  7. <c:when>

  8. <c:otherwise>

    <c:set var="number" value="500"></c:set>
    <c:choose>
    	<c:when test="${number < 0 }"> 小于 0 </c:when>
    	<c:when test="${number >= 0 and number < 70 }"> 0 ~ 69 </c:when>
    	<c:when test="${number >= 70 and number < 100 }"> 70 ~ 99 </c:when>
    	<c:when test="${number >= 100 and number < 180 }"> 100 ~ 179 </c:when>
    	<c:otherwise>大于180</c:otherwise>
    </c:choose>
    
  9. <c:forEach> : 标签用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容。
    在这里插入图片描述

	<%
		List<Student> list = new ArrayList<>();
		list.add(new Student(11, "张三", "123456", 19));
		list.add(new Student(2, "李四", "666666", 20));
		list.add(new Student(53, "王五", "123456", 21));
		request.setAttribute("list", list);
	%>
	<c:if test="${empty list }">没有数据</c:if>
	<c:if test="${not empty list }">
		<table border="1">
			<tr>
				<td>编号</td>
				<td>用户名</td>
				<td>密码</td>
				<td>年龄</td>
				<td>操作</td>
			</tr>
			<c:forEach items="${list}" var="stu" varStatus="status">
				<tr>
					<td>${status.count}</td>
					<%-- <td>${stu.id}</td> --%>
					<td>${stu.username}</td>
					<td>${stu.password}</td>
					<td>${stu.age}</td>
					<td><a href="">编辑</a>&nbsp;<a
						href="javascript:delStu(${stu.id})">删除</a></td>
				</tr>
			</c:forEach>
		</table>
	</c:if>

  • varStatus属性
    在这里插入图片描述
  1. <c:forTokens> : 用来浏览一字符串中所有的成员,其成员是由定义符号所分隔的。
	<c:set var="word" value="This is a cat."></c:set>
	<c:forTokens items="${word }" var="w" delims=" ">
		${w } <br/>
	</c:forTokens>
  1. <c:param>:
    <c:param>标签在为一个URL地址附加参数时,将自动对参数值进行URL编码,例如,如果传递的参数值为“中国”,则将其转换为“%d6%d0%b9%fa”后再附加到URL地址后面,这也就是使用<c:param>标签的最大好处。

  2. <c:url>标签用于在JSP页面中构造一个URL地址,其主要目的是实现URL重写。

	<c:url var="myURl" value="demo2.jsp">
		<c:param name="stuName">张三</c:param>
		<c:param name="stuAge">20</c:param>
	</c:url>
	<a href=${myURl}>我的链接</a>
	
	http://localhost:8088/JSPDemo01/demo2.jsp?stuName=%E5%BC%A0%E4%B8%89&stuAge=20
  1. <c:redirect> 重定向
  2. <c:import> 导入其他页面资源

2.6 国际化标签 i18n

    <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
  • 示例
	<fmt:formatNumber value="2131241234.5234231" pattern="#,###.####"></fmt:formatNumber>
	<fmt:formatDate value="<%=new Date() %>" pattern="yyyy-MM-dd HH:mm:ss"/>

3. 自定义标签

3.1 标签实现类

	package com.jstltest;
	
	import java.io.IOException;
	
	import javax.servlet.jsp.JspException;
	import javax.servlet.jsp.tagext.JspFragment;
	import javax.servlet.jsp.tagext.SimpleTagSupport;
	
	/**
	 * 自定义标签
	 * @author Administrator
	 */
	public class Zidingyijstl extends SimpleTagSupport {
		private String mytag = "p";
		private int count;
	
		public void setMytag(String mytag) {
			this.mytag = mytag;
		}
	
		public void setCount(int count) {
			this.count = count;
		}
	
		public void doTag() throws JspException, IOException { // 重写doTage()方法
			JspFragment frag = this.getJspBody();
			this.getJspContext().getOut().write("<" + mytag + ">");
			for (int i = 0; i < count; i++) {
				frag.invoke(null);
			}
			this.getJspContext().getOut().write("</" + mytag + ">");
		}
	}

3.2 标签部署描述文件 tld

  • tld文件放在webapp中的WEB-INF下
  • 和web.xml文件同级

messageTag.tld

    <?xml version="1.0" encoding="UTF-8"?>
    
    <taglib xmlns="http://java.sun.com/xml/ns/javaee"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-jsptaglibrary_2_1.xsd"
    	version="2.1">
    	<description>自定义的一些标签</description>
    	<display-name>自定义标签</display-name>
    	<tlib-version>1.0</tlib-version>
    	<short-name>m</short-name>
    	<uri>/myjstl</uri>
    
    	<tag>
    		<description>描述</description>
    		<name>show</name>   <!-- 标签名 -->
    		<tag-class>com.jstltest.Zidingyijstl</tag-class>  <!-- 唯一标识 -->
    		<body-content>scriptless</body-content> <!-- 标签里不可写脚本<%%> -->
    
    		<!-- 添加属性 -->
    		<attribute>
    		   <description>
   					 这是自定义标签的描述信息,可以在MyEclipse中有提示
    		   </description>
    		   <name>mytag</name> <!-- 属性的名字,要跟方法名要对应的 -->
    		   <required>true</required>  <!--是否必填 -->
    	       <rtexprvalue>false</rtexprvalue>  <!--标签里可不可以用EL表达式 -->
    		</attribute>
    
    		<!--再写一个属性 -->
    		<attribute>
    		   <description>
    				这是自定义标签的描述信息,可以在MyEclipse中有提示.
    		   </description>
    		   <name>count</name>  <!-- 属性的名字,要跟方法名要对应的 -->
    		   <required>true</required> <!--是否必填 -->
    		   <rtexprvalue>false</rtexprvalue><!--标签里可不可以用EL表达式 -->
    		</attribute>
    	</tag>
    </taglib>

3.3 JSP页面中引用自定义标签

	<%@ taglib prefix="m" uri="/myjstl" %> 

3.4 JSP页面中使用自定义标签

	<m:show mytag="h3" count="5">
		HaoHao
	</m:show>

猜你喜欢

转载自blog.csdn.net/Spectre_win/article/details/89086874