JSTL 简介

JSTL(Java Standard Tag Library) –Java标准标签库。

SUN公司制定的一套标准标签库的规范。JSTL标签库,是由一些Java类组成的。

 

JSTL组成:

JSTL –Core 核心标签库。 - 这是本部分的重点

JSTL – I18N - 国际化标签库。Internationalization-    I18N

JSTL - Functions – 函数库。

在jstl-1.2.jar包的META-INF目录中,保存着各种tld文件的版本。请查看。

 

JSTL核心标签库:

使用JSTL核心标签:

如果你的Web项目是基于JavaEE2.5或以上的。可以在你项目的任意页面上通过<%@ taglib 指令使用JSTL的核心标签库。

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

uri是引用标签库的资源定位符,并不代表一个实际的地址。Prefix是自定义的前缀。

如果你的项目是JavaEE2.5以下的项目,必须在在你项目中的lib目录下,存在以下两个jar文件为:jstl.jar、standard.jar

在上面的包中,存在着jstl的tld文件,用于描述jstl标签的属性、名称、资源等信息。程序就是通过这个tld文件找到相关java类以

供运行的。然后再在任意的JSP页面通过指令导入jstl.

Jar文件的说明:

Jstl-1.2.jar – 包含在jstl规范中定义的接口和类的class文件,在META-INF目录下包含了所有可用的tld文件。

可以通过以下步骤修改引用jstl的方式:找到META-INF目录中的c.tld文件,将c.tld放到WEB-INF/tld/目录下。

在web.xml中配置以下信息:

  <jsp-config>
  <taglib>
  <taglib-uri>/c.tld</taglib-uri>
  <taglib-location>/WEB-INF/tld/c.tld</taglib-location>
  </taglib>
  </jsp-config>

然后在页面上如下使用:<%@ taglib uri=“/c.tld” prefix=“c”%>

 

jstl_标签库

jstl_标签库_02

jstl_java_03

jstl_标签库_04

jstl_标签库_05

jstl_java_06

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ page import="cn.hncu.domain.User"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>JSTL技术演示1</title>
</head>

<body>
<h1>JSTL技术演示1</h1>
<%
pageContext.setAttribute("name", "hncuJack");
%>
${fn:startsWith(name,"hncu")},${fn:length(name)+10}
<br /> 0. 通过c.tld文件了解forEach标签的一个用法
<br>
<c:forEach begin="1" end="20" step="2" var="i">
${i}  
</c:forEach>

<br> 1. c:out标签
<br>
<%
pageContext.setAttribute("age", "15");
pageContext.setAttribute("str", "<font color='red'>湖南城市</font>");
%>
<c:out value="abc123"></c:out>
,
<c:out value="${name}"></c:out>
, ${name}
<br>

<!-- c:out与el表达式输出 不同之处 -->
<c:out value="${age}" default="20"></c:out>
   ${age}
<br>
<c:out value="${str}" escapeXml="true"></c:out>
   ${str}
<br>

<br> 2. c:set标签
<br>
<!-- 2.1 给String类型的变量设置值 -->

<c:set var="sum" value="200" scope="page"></c:set>
${sum},
<br>
<c:out value="${sum+100}" default="-1"></c:out>
<br>

<!-- 2.2 给JavaBean类型的变量设置值 -->
<jsp:useBean id="u" class="cn.hncu.domain.User"></jsp:useBean>
<c:set property="name" value="jack111" target="${u}"></c:set>
<c:set property="age" value="23" target="${u}"></c:set>
<c:out escapeXml="true" value="${u}"></c:out>
<br>

<br> 3. c:remove标签
<br>
<c:remove var="sum" scope="page"></c:remove>
<c:out value="${sum}" default="-1"></c:out>

<br> 4. c:if标签
<br>
<%
User user = new User();
user.setName("Jack");
pageContext.setAttribute("user", user, pageContext.SESSION_SCOPE);
%>
<c:if test="${empty sessionScope.user}" scope="session" var="boo">
<form action="">
Name:<input type="text" name="name"> <br> Pwd:<input
type="password" name="pwd"> <br> <input type="submit"
value="登录">
</form>
</c:if>
<c:if test="${!empty sessionScope.user}">
欢迎你,${user.name}<br>
</c:if>

<c:set var="str" value="欢迎你2,${user.name}"></c:set>
${!empty user ? str : "" }
<br> ${!empty user ? user.name : "" }
<br>

<br> 5. c:choose, c:when, c:otherwise 标签,, 相当于java中的if,else if,
else
<br>
<c:set var="score" value="95" scope="session"></c:set>
<c:choose>
<c:when test="${score>=90}"> 优秀 </c:when>
<c:when test="${score>=80}"> 良好 </c:when>
<c:when test="${score>=70}"> 中等 </c:when>
<c:when test="${score>=60}"> 及格 </c:when>
<c:otherwise> 不及格 </c:otherwise>
</c:choose>

</body>
</html>
<%@ page language="java" import="java.util.*,cn.hncu.domain.*"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page import="cn.hncu.domain.USER2"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>JSTL技术演示2</title>
</head>

<body>
<h1>JSTL技术演示2</h1>
<br> 6. c:forEach标签
<br> 一、普通for循环的功能
<br>
<c:forEach begin="1" end="10" var="i" step="1">
${i}:节日快乐!<br>s
</c:forEach>
<br> 二、增强for循环的功能
<br> 1)遍历数组
<br>
<%
String strs[] = { "aa", "中语言", "bb", "cc" };
pageContext.setAttribute("strs", strs);
%>
<c:forEach items="${strs}" var="str" varStatus="idx">
序号${idx.index}: ${str} , 计数${idx.count} <br>
</c:forEach>

2)遍历List
<br>
<%
List<String> list = new ArrayList<String>();
list.add("aaaa");
list.add("bbbb");
list.add("cccc");
list.add("dddd");
pageContext.setAttribute("list", list);
%>
<c:forEach items="${list}" var="s">
${s}   
</c:forEach>

3)遍历Map
<br>
<%
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "张三");
map.put("age", "23");
map.put("addr", "安置小区");
pageContext.setAttribute("map", map);
%>
<c:forEach items="${map}" var="en">
${en} ==> ${en.key} : ${en.value} <br>
</c:forEach>

4)遍历元素值为JavaBean的集合,如List <User>
<br>
<%
List<USER2> users = new ArrayList<USER2>();
users.add(new USER2("Alice", 21));
users.add(new USER2("Bob", 22));
users.add(new USER2("张三", 20));
users.add(new USER2("小李", 11));
pageContext.setAttribute("users", users);
%>
<c:forEach items="${users}" var="user">
<c:out value="${user}"></c:out>
<c:out value="${user.name}"></c:out> , ${user.age} <br>
</c:forEach>

<hr>
<br> 7. c:forTokens标签: 字符串拆分
<br>
<c:set var="info" value="a,b,c,d,1,w2,q,pp" />
<c:forTokens items="${info}" delims="," var="x">
${x}  
</c:forTokens>

<br>
<br> 8. c:import标签: 动态导入
<br>
<c:import url="/jsps/foot.jsp"></c:import>

<br> 9. c:url标签: 重写url, 以后开发时的后台地址都用这种方式写,非常保险,也简单(斜杠代表项目根目录)!
<br>
<form action=" <c:url value='/LoginServlet'/> ">
Name:<input type="text" name="name"> <br> Pwd:<input
type="password" name="pwd"> <br> <input type="submit"
value="登录">
</form>
<br>

<br> 10. c:redirect标签: 重定向。 该标签有一个坑: url地址不能用c:url
<br>
<%-- 下面这一句如果放开,则演示时当前页面停不住,直接重定向走了!
<c:redirect url="/jsps/jstl1.jsp" />

反模式:
<c:redirect url="<c:url value='/jsps/jstl1.jsp' /> " />
--%>

<br>

</body>
</html>

jstl_HTML_07

jstl_java_08

jstl_标签库_09

jstl_java_10

jstl_标签库_11

jstl_java_12

jstl_标签库_13

jstl_标签库_14

<%@ page language="java" import="java.util.*,cn.hncu.domain.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>JSTL技术演示3</title>
</head>

<body>
<h1>国际化演示1: 写死的--过渡版</h1>
<!-- 1 设置本地信息(指定哪个国家的什么语言) -->
<%--
<fmt:setLocale value="en-US"/>
<fmt:setLocale value="zh-CN"/>
--%>
<fmt:setLocale value="jp-JP"/>
<!-- 2 指定资源文件名 -->
<fmt:setBundle basename="msg" scope="session"/>

<!-- 3 显示信息 -->
<fmt:message key="welcome"></fmt:message>,Jack<br>
<fmt:message key="time" /> 2018.9.10 20:34 <br>
<br>
</body>
</html>
<%@ page language="java" import="java.util.*,cn.hncu.domain.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>JSTL技术演示4</title>
</head>

<body>
<h1>国际化演示2: 写活的--正式版</h1>
<a href="?bd=en_US">English</a>
<a href="?bd=zh_CN">中文</a> <br>

<!-- 1 设置本地信息(指定哪个国家的什么语言) -->
<fmt:setLocale value="${param.bd}"/>

<!-- 2 指定资源文件名, 设置session后其它页面才能访问该bundle -->
<fmt:setBundle basename="msg" scope="session"/>
<!-- ※※指定第2个及之后的资源文件名,含路径的资源名。第2个及之后的资源一定要指定别名 -->
<fmt:setBundle basename="cn.resources.a" var="bbb" scope="session"/>

<!-- 3 显示信息 -->
<fmt:message key="welcome"></fmt:message>,Jack<br>
<fmt:message key="time" /> 2018.9.10 20:34 <br>
<!-- ※※指定第2个及之后资源时,读取信息, 也要指定别名 -->
<fmt:message key="address" bundle="${bbb}"></fmt:message>

<br>
<a href="a.jsp">访问另一个页面</a>

</body>
</html>