JSTL入门
JSTL入门基本概述 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 月
JSTL入门
基本概述
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(){
}
}
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”/> // 字面值
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)
更多推荐
所有评论(0)