JSTL入门

基本概述

    JSTLJSP Standard Tag LibraryJSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apachejakarta小组来维护的。JSTL只能运行在支持JSP1.2Servlet2.3规范的容器上,如tomcat 4.x。在JSP 2.0中也是作为标准支持的。

    JSTL 1.0 发布于 2002 年 月,由四个定制标记库(coreformatxml 和 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.2JAR包:JSTL1.2 JAR

2、将JAR包配置到classpath

3JSP中引入需要的标签库。

    <%@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>这种形式使用。

 

 

使用实例

PSUser.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(){
	}
}

c:out案例

<%@ 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>

c:set案例

<%@ 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>

c:remove案例

<%@ 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>

c:catch案例

<%@ 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>

c:if案例

<%@ 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>

c:choose案例

<%@ 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>

c:forEach案例

<%@ 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>

        <p>varStatus的使用</p>
        <%
            String[] city ={"北京","上海","广州","深圳"};
            pageContext.setAttribute("city", city);
        %>
        <table border="1px" align="center" width="700px">
            <tr>
                <th>编号</th>
                <th>索引</th>
                <th>是否第一个</th>
                <th>是否最后一个</th>
                <th>元素内容</th>
            </tr>
            <!-- var:被遍历后的元素,items:被遍历的对象;begin:开始遍历的位置;step:步长;end:结束遍历的位置  varStatus:被遍历后的元素存放的位置page域 -->
            <c:forEach var="citys" items="${city }" begin="0" step="1" end="3" varStatus="status">
                <tr>
                    <td>${ status.count}</td>
                    <td>${ status.index}</td>
                    <td>${ status.first}</td>
                    <td>${ status.last}</td>
                    <td>${ citys}</td>
                </tr>
            </c:forEach>
        </table>
</body>
</html>

c:forTokens案例

<%@ 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>

c:redirect案例

<%@ 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案例

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”/>    // 字面值

2JSP之间获取数据可以用EL,格式:${param.参数名}

例如:

    JSP1中:<a href=”jsp2.jsp?name=zs”>姓名</a>

    JSP2中:${param.name} // 取出值为zs

同时,c:import中的c:param标签也是通过该中方法获取值的。 

3TLD文件叫做标签描述符(Tag Library Descriptor)


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐