JSTL(JSP Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上,如tomcat 4.x。在JSP 2.0中也是作为标准支持的。
JSTL 1.0 发布于 2002 年 6 月,由四个定制标记库(core、format、xml 和 sql)和一对通用标记库验证器(ScriptFreeTLV 和 PermittedTaglibsTLV)组成。core 标记库提供了定制操作,通过限制了作用域的变量管理数据,以及执行页面内容的迭代和条件操作。它还提供了用来生成和操作 URL 的标记。顾名思义,format 标记库定义了用来格式化数据(尤其是数字和日期)的操作。它还支持使用本地化资源束进行 JSP 页面的国际化。xml 库包含一些标记,这些标记用来操作通过 XML 表示的数据,而 sql 库定义了用来查询关系数据库的操作。
如果要使用JSTL,则必须将相应的JAR包配置到classpath路径中去,在MyEclipse里面就是添加外部应用JAR包。
PS:常用的只有core里面的几个标签,比如forEach,if,choose-when-otherwise等。个人觉得JSTL应该是属于JSP的内容,老韩将他放到Struts来讲,我也就放在Struts里了。
参考文档:JSTL使用手册
1、获取相应JAR包,这里提供1.2的JAR包:JSTL1.2 JAR包
2、将JAR包配置到classpath中
3、JSP中引入需要的标签库。
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> // 引入core标签库
uri可以在JAR包里面的META-INF目录下相应的TLD(Tag Library Descriptor标签库描述符)文件里找到。
4、通过 <c:out value="hello,world"></c:out>这种形式使用。
PS:User.java这个文件在测试标签对对象的操作时需要,故先行列出。
package com.pc.domain; /** * * @author Switch * @function JSTL测试类 * @description 用于JSTL标签对对象的操作测试 * */ public class User { private String username; private String password; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public User(String username, String password) { super(); this.username = username; this.password = password; } public User(){ } }
<%@ page language="java" import="java.util.*,com.pc.domain.*" pageEncoding="UTF-8"%> <%-- 引入JSTL标签库 --%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>My JSP 'c_out.jsp' starting page</title> </head> <body> <p>c:out的使用</p> <% /* 不推荐在JSP中Java语句,为了方便故写在这 ,这些语句应该在控制器中 */ /* 如果域对象中有相同属性名, c:out的优先级 :pageContext > request > session > application */ request.setAttribute("name","zs<a href='#'>链接</a>"); session.setAttribute("name","ls<a href='#'>链接</a>"); application.setAttribute("name","ww<a href='#'>链接</a>"); pageContext.setAttribute("name","zl<a href='#'>链接</a>"); User user = new User(); user.setUsername("zs"); user.setPassword("123456"); request.setAttribute("user", user); %> <p>输出</p> <c:out value="hello,world"></c:out> <p>输出request/session/application/pageContext域对象的数据</p> <%-- 等价于request.getAttribute("name").toString() --%> <%-- 输出zl 证明c:out的优先级 --%> <%-- default在没有找到的情况下会调用显示 --%> <%-- escapeXml默认为true,则html,xml将显示为文本,如果希望像超链接这种标记不以文本显示,则可以设置为false --%> <c:out value="${name}" default="null" escapeXml="true"></c:out> <p>输出对象</p> <%-- 等价于((User)request.getAttribute("user")).getUsername() --%> <c:out value="用户名:${user.username } 密码:${user.password }"></c:out> </body> </html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%-- 引入jstl标签库 --%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>My JSP 'c_set.jsp' starting page</title> </head> <body> <p>c:set的使用</p> <%-- 等价于request.setAttribute("name", "zs");--%> <c:set var="name" value="zs" scope="request"></c:set> <c:out value="${name }"></c:out> </body> </html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>My JSP 'c_remove.jsp' starting page</title> </head> <body> <p>c:remove的使用</p> <% /* 不推荐这么做 */ request.setAttribute("name", "zs"); %> <p>删除前</p> <c:out value="${name }" default="null"></c:out> <%-- var代表变量,scope代表范围 --%> <%-- 等价于request.removeAttribute("name"); --%> <c:remove var="name" scope="request"/> <p>删除后</p> <c:out value="${name }" default="null"></c:out> </body> </html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>My JSP 'c_catch.jsp' starting page</title> </head> <body> <p>c:catch的使用</p> <%-- 将catch标签里面的异常信息捕获,放到var中 --%> <c:catch var="myexception"> <%-- 不推荐这么使用1 1--%> <% int i = 8 / 0; %> </c:catch> <c:out value="${myexception }"></c:out> </body> </html>
<%@ page language="java" import="java.util.*,com.pc.domain.*" pageEncoding="UTF-8"%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>My JSP 'c_if.jsp' starting page</title> </head> <body> <p>c:if的使用</p> <% /* 不推荐这么使用 */ request.setAttribute("name", "zs"); request.setAttribute("age", "20"); // 放入一个User对象 User user = new User(); user.setUsername("zs"); user.setPassword("123456"); request.setAttribute("user", user); %> <p>判断字符串</p> <c:if test="${name == 'zs' }" > <c:out value="${name }"></c:out> </c:if> <c:if test="${name != 'zs' }"> <c:out value="error"></c:out> </c:if> <p>判断数值</p> <c:if test="${age == 20 }"> <c:out value="${age }"></c:out> </c:if> <c:if test="${age > 10 }"> <c:out value="大于10"></c:out> </c:if> <c:if test="${age > 10 and age < 25 }"> <c:out value="大于10小于25"></c:out> </c:if> <p>判断对象属性</p> <c:if test="${user.password == '123456' }"> <c:out value="用户名:${user.username } "></c:out> <c:out value="密码:${user.password }"></c:out> </c:if> <p>判断是否为空</p> <c:if test="${empty user }"> <c:out value="无用户"></c:out> </c:if> <c:if test="${!empty user }"> <c:out value="有用户"></c:out> </c:if> </body> </html>
<%@ page language="java" import="java.util.*,com.pc.domain.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>My JSP 'c_choose.jsp' starting page</title> </head> <body> <p>c_choose的使用</p> <% /* 不推荐使用 */ User user = new User(); user.setUsername("zs"); user.setPassword("123456"); request.setAttribute("user", user); %> <%-- 与Switch-case语句很像 --%> <c:choose> <c:when test="${user.username != 'zs' }"> <c:out value="用户不是zs"></c:out> </c:when> <c:when test="${user.password != '123456' }"> <c:out value="密码不是123456"></c:out> </c:when> <c:otherwise> <c:out value="用户名:${user.username } "></c:out> <c:out value="密码:${user.password }"></c:out> </c:otherwise> </c:choose> </body> </html>
<%@ page language="java" import="java.util.*,com.pc.domain.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>My JSP 'c_foreach.jsp' starting page</title> </head> <body> <p>迭代标签的使用</p> <% /* 不推荐这么使用 */ List<User> users = new ArrayList<User>(); User user1 = new User("zs", "123456"); User user2 = new User("ls", "234567"); User user3 = new User("ww", "345678"); users.add(user1); users.add(user2); users.add(user3); request.setAttribute("users", users); %> <p>foreach用法</p> <%-- users表示域对象的相应属性,一般是一个集合 --%> <%-- user表示取出的一个具体对象 --%> <c:forEach items="${users }" var="user"> <c:out value="用户名:${user.username } 密码:${user.password }" /> <br /> </c:forEach> <p>for用法</p> <p>1 to 10</p> <c:forEach var="i" begin="1" end="10"> <c:out value="${i }" /> </c:forEach> <p>1 to 10 step:3</p> <c:forEach var="i" begin="1" end="10" step="3"> <c:out value="${i }" /> </c:forEach> <p>对map的迭代</p> <p>基本类型的迭代</p> <% /* 不推荐这么使用 */ Map names = new HashMap(); names.put("name1", "zs"); names.put("name2", "ls"); request.setAttribute("names", names); %> <c:forEach items="${names }" var="name"> <c:out value="key:${name.key } value:${name.value }" /> <br /> </c:forEach> <p>对象的迭代</p> <% /* 不推荐这么使用 */ Map usersMap = new HashMap(); usersMap.put("user1", user1); usersMap.put("user2", user2); usersMap.put("user3", user3); request.setAttribute("usersMap", usersMap); %> <c:forEach items="${usersMap }" var="userMap"> <c:out value="key:${userMap.key } value:${userMap.value } username:${userMap.value.username }" /> <br /> </c:forEach> <p>对set的迭代</p> <% Set usersSet = new HashSet(); usersSet.add(user1); usersSet.add(user2); usersSet.add(user3); request.setAttribute("usersSet", usersSet); %> <c:forEach items="${usersSet }" var="user"> <c:out value="username:${user.username } password:${user.password }" /> <br /> </c:forEach> </body> </html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>My JSP 'c_fortokens.jsp' starting page</title> </head> <body> <p>fortokes</p> <%-- c:forToken用于按模式拆分字符串 --%> <c:forTokens items="123;456;789;012" delims=";" var="temp"> ${temp } </c:forTokens> <% int i = 1; request.setAttribute("i", i); %> <c:out value="${i }"></c:out> </body> </html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>My JSP 'c_redirect.jsp' starting page</title> </head> <body> <p>重定向的使用</p> <c:redirect url="http://www.baidu.com" /> </body> </html>
c_import_page.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>My JSP 'c_import_page.jsp' starting page</title> </head> <body> <%-- 通过${param.参数名}可以得到c:import传过来的c:param中的参数 --%> 姓名是:${param.name } </body> </html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>My JSP 'c_import.jsp' starting page</title> </head> <body> <c:import url="c_import_page.jsp"> <%-- 通过c:param可以将参数传入到所引用的文件中去 --%> <c:param name="name" value="zs"></c:param> </c:import> </body> </html>
1、在需要取一个域对象中的值的时候需要用${属性名},对字面型的值就不需要用$。
例如:
控制器中:request.setAttribute(“name”, ”zs”);
<c:out value=”${name }”/> // 域对象属性
<c:out value=”age”/> // 字面值
2、JSP之间获取数据可以用EL,格式:${param.参数名}
例如:
JSP1中:<a href=”jsp2.jsp?name=zs”>姓名</a>
JSP2中:${param.name} // 取出值为zs
同时,c:import中的c:param标签也是通过该中方法获取值的。
3、TLD文件叫做标签描述符(Tag Library Descriptor)