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"%>
配置:
将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
-->
==/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>
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表达式中采用前缀+冒号+函数名的方式进行调用
* 提供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>