JSTL与EL表达式

1.E L(Expression Language)  目的:为了使JSP写起来更加简单。

JSP的用途应该是单纯的,只为显示而生,如果在JSP中掺杂过多的java代码,不仅会影响程序的可读性,还会增加影响程序耦合度。

所以,为了使JSP简化,不再JSP中掺杂JAVA代码,出现了EL表达式


EL表达式的语法和内置对象

${hello} 等同于 <%=request.getAttribute("hello") %>
EL表达式的内置对象pageScope,requestScope,sessionScope,applicationScope
指定EL表达式的范围:${requestScope.hello}
如果不指定el表达式的范围,它的搜索顺序为pageScope>appliactionScope>requestScope>sessionScope
指定范围能够提高效率


JSTL的使用

JSTL标签的配置和使用:
配置:
将jstl.jar和standard.jar拷贝到WEB-INF/lib下
使用:
采用taglib指令引入标签库
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>    
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>


.EL示例

Servlet:
public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		request.setAttribute("hello", "Hello World!!!");
		
		Group group = new Group();
		group.setGroupName("三年二班");
		User user = new User();
		user.setPassword("abc");
		user.setUserName("sunhuimig");
		user.setGroup(group);
		request.setAttribute("user", user);
		
		String[] obj = new String[]{"a","b","c"};
		request.setAttribute("obj", obj);
		
		Map map = new HashMap();
		map.put("k", "key");
		map.put("y", "yes");
		
		List<User> list = new ArrayList<User>();
		list.add(user);
		
		request.setAttribute("map", map);
		request.setAttribute("list", list);
		
		request.getRequestDispatcher("/WEB-INF/test/el.jsp").forward(request, response);
	}



JSP:
	<li>字符:</li>
  	${hello }<br>
  	
  	<li>对象:</li>
  	用户名:${user.userName }<br>
  	密码:${user.password }<br>
  	组名:${user.group.groupName }<br>
  	
  	<li>数组:</li>
  	${obj[0] }<br>
  	
  	<li>MAP:</li>
  	${map.k }<br>
  	
  	<li>list中的对象</li>
  	${list[0].userName }<br>


运算符:
<!-- 
==/eq
!=/ne
</lt
>/gt
&&/and
||/or
!/not
//div
%/mod
--> 


<li>测试empty</li><br>
v1:${empty v1}<br>
v2:${empty v2}<br>
v3:${empty v3}<br>
v4:${empty v4}<br>
v5:${empty v5}<br>

页面:
  • 字符: Hello World!!!
  • 对象: 用户名:sunhuimig
    密码:abc
    组名:三年二班
  • 数组: a
  • MAP: key
  • list中的对象 sunhuimig


4.JSTL常用标签示例

·JSTL核心标签

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

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>EL DEMO</title>

  </head>
  
  <body>
  	<li>采用c:out标签</li><br>
  	hello(使用标签123):<c:out value="123"/><br>
	hello(使用标签):<c:out value="hello"/><br>
	hello(使用标签):<c:out value="${hello}"/><br>
	使用缺省值:<c:out value="${sksk}" default="没有值"/><br>
  	使用EL表达式:${html }<br>
  	使用escapeXml="true"直接显示HTML: <c:out value="${html }" escapeXml="true"></c:out>
  	
  	<li>测试c:set,c:remove</li><br>
  	<c:set value="AV内衣" var="av"></c:set><br>
	EL表达式:  ${av }	<br>
	<c:remove var="av"/><br>
	EL表达式:  ${av }<br>
	
	<li>条件控制标签:c:if</li><br>
	<c:if test="${ten > one }">
		10大于1
	</c:if>
	
	<li>条件控制标签:c:choose,c:when,c:otherwise</li><br>
	<c:choose>
		<c:when test="">
		</c:when>
		<c:otherwise>
		</c:otherwise>
	</c:choose>
	
	<li>循环标签:c:forEach</li><br>
		
	<table border="1">
		<tr>
			<td>用户名</td>
			<td>密码</td>
			<td>组</td>
		</tr>
		<c:choose>
			<c:when test="${list==null }">
				<tr>
					<td colspan="${size }">
						未查到记录
					</td>
				</tr>
			</c:when>
			<c:otherwise>
				<c:forEach items="${list }" var="user" varStatus="var" >
					<tr <c:if test="${var.count % 2 == 0 }">bgcolor='red'</c:if> >
						<td>${user.userName }</td>
						<td>${user.password }</td>
						<td>${user.group.groupName }</td>
					</tr>
				</c:forEach>
			</c:otherwise>
		</c:choose>
	</table>
	
	<br>
	<li>c:forTokens  delims:分隔符  var:变量</li><br>
	<c:forTokens items="${str }" delims="," var="str">
		${str } <br>
	</c:forTokens>
	
	<li>c:import 标签,引入jsp或html</li><br>
	<c:import url="http://localhost:8080/my-drp/login.jsp" />
	
  </body>
</html>

页面:



·JSTL格式化标签

引入标签 
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>    

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>    

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>
  
  <body>
  <li>fmt:formatDate 日期格式化标签</li> <br>
   	 没有格式化的日期:${today }<br>
  	使用fmt:formatDate格式化的日期(默认):<fmt:formatDate value="${today }" /> <br> <!-- 2013-12-1  -->
         使用fmt:formatDate格式化的日期(pattern="yyyy-MM-dd HH:mm:ss"):<fmt:formatDate value="${today }" pattern="yyyy-MM-dd HH:mm:ss"/> <br> <!-- 2013-12-01 15:07:07  -->
         使用fmt:formatDate格式化的日期(pattern="yyyy/MM/dd HH:mm:ss"):<fmt:formatDate value="${today }" pattern="yyyy/MM/dd HH:mm:ss"/> <br> <!-- 2013/12/01 15:07:07  -->
  <li>测试格式化数字标签</li> 
  	<fmt:formatNumber value="${n }"  /> <br> 														<!--123,456,789.7 --> 
  	n(pattern="###,###,###.####"):<fmt:formatNumber value="${n}" pattern="###,###,###.####"/><br>	<!----123,456,789.7--> 
	n(pattern="###,###,###.0000"):<fmt:formatNumber value="${n}" pattern="#######.0000"/><br>		<!----123456789.7000--> 
	n(groupingUsed="false" 去掉数字中的千分位符号):<fmt:formatNumber value="${n}" groupingUsed="false"/><br>  	<!----123456789.7--> 
	n(type="currency" 货币 ):<fmt:formatNumber value="${n}" type="currency"/><br>  						<!----¥123,456,789.70--> 
	n(type="currency" currencySymbol="$"):<fmt:formatNumber value="${n}" type="currency" currencySymbol="$"/><br><!----$123,456,789.70--> 
	n(type="percent" 百分比):<fmt:formatNumber value="0.1234" type="percent" /><br><!-- 12% -->
	n(type="percent" 百分比):<fmt:formatNumber value="0.12345678" minFractionDigits="2" maxIntegerDigits="2" type="percent" /><br>
  </body>
</html>



JSTL函数库与自定义函数

在EL表达式中采用前缀+冒号+函数名的方式进行函数调用: ${fn:length("1234") }

关于自定义函数:
* 定义类MyFunctions,方法必须为静态全局的
* 提供tld描述文件,将tld放到WEB-INF或WEB-INF下的任意目录中
* 在jsp中采用taglib进行引入
* 在EL表达式中采用前缀+冒号+函数名的方式进行调用

1.首先新建MyFuntion.java
package com.bjpowernode.drp.test.web;

/**
 * 自定义JSTL函数库
 * @author shm
 *
 */
public class MyFunction {
	
	/**
	 * 必须为静态全局方法
	 * @param name
	 * @return
	 */
	public static String sayHello(String name){
		return "Hello "+ name;
	}
}
2.在WEB-INF下或WEB-INF下的文件夹新建myFunction.tld描述文件:
<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
  version="2.0">
  <description>my functions library</description>
  <display-name>my functions</display-name>
  <tlib-version>1.0</tlib-version>
  <short-name>my</short-name>
  <uri>http://www.shm.com/myfunction/</uri> <!-- uri 需自行定义 -->
  
  <function>
    <name>sayHello</name>
    <function-class>com.bjpowernode.drp.test.web.MyFunction</function-class> <!-- 引入自定义类 -->
    <function-signature>java.lang.String sayHello(java.lang.String)</function-signature> <!-- 方法的参数与返回值,String由于是包装类,需要写全路径 -->
  </function> 
    
</taglib>

3.在jsp中引入自定义函数库,并使用${my:sayHello("傻萱在睡觉")}:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>    
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>    
<%@ taglib uri="http://www.shm.com/myfunction" prefix="my"%>    

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'el_function.jsp' starting page</title>
  </head>
  
  <body>
    长度:${fn:length("1234") }<br> <!-- 4 -->
   split切分:<br>
   <c:forEach items="${fn:split('1,2,3,4,5', ',') }" var="v">
		${v }<br>
	</c:forEach>
	${my:sayHello("傻萱在睡觉") }
  </body>
</html>





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值