JSTL简介:
JSTL(Java Standard Tag Library) –Java标准标签库。
SUN公司制定的一套标准标签库的规范。
lSTL标签库,是由一些Java类组成的。
JSTL组成:
JSTL –Core 核心标签库。 - 这是本部分的重点
JSTL – I18N - 国际化标签库。Internationalization- I18N
JSTL – SQL – 数据库操作标签(有悖于MVC设计模式不用不讲)。
JSTL -Functions – 函数库。
JSTL -XML ,对XML的操作(同SQL标签)。
在jstl-1.2.jar包的META-INF目录中,保存着各种tld文件的版本。请查看。
JSTL核心标签库:
使用JSTL核心标签:
•如果你的Web项目是基于JavaEE2.5或以上的。可以在你项目的任意页面上通过<%@ taglib 指令使用JSTL的核心标签库。
<span style="font-size:18px;color:#000000;">•<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%></span>
•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的方式:
<span style="font-size:18px;color:#000000;"> </span>
<span style="font-size:18px;color:#000000;">找到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”%></span>
JSTL-Core一共包含以下几个子标签:
JSTL标签-out:
<span style="font-size:18px;color:#000000;"><c:out value=…/>用于在页面上输出结果。
<c:out value=“${requestScope.name}”/> -将request中的name值输出
<c:out value=“${param.username}”/> - 用于将参数输出到页面上。
<c:out value=“${name}” default=“hello”/>从page到application开始查找,如果没有找到,就显示默认值hello.
另一种设置默认值的方式:
<c:out value=“${name}”>
Default-value-默认值。
</c:out>
只有当要求的信息为null或不存在时才会输出默认值。
excapeXml属性:默认值为true,用于将html等标签转换成<等转换元素,示例:
<%
String name="<font color='red'>Red</font>";
pageContext.setAttribute("name",name);
%>
<c:out value=“${name}” escapeXml=“false”></c:out> 不对xml或html进行转换,直接输出,这样就会在页面上看到红色的Red字符,因为浏览器会解析html数据。
</span>
demo1.jsp中的out标签部分代码
<span style="font-size:18px;color:#000000;"> <%
request.setAttribute("name", "jack");
%>
<p>c:out标签------输出表达式或标识符的值(功能和${标识符}类似,差别在default和escapeXml两个属性上)</p>
<c:out value="${ name}" ></c:out><br/>◎注意:value="里面要放EL表达式(${标识符})"
${name}<br/>
<!--default属性的功能:当“变量值aaaa”为空时,输出输出该属性的值 -->
<c:out value="${aaaa}" default="此值为空"></c:out><br/>
<%
pageContext.setAttribute("str", "<font color='red'>湖南城市学院</font>");
%>
<!-- escapeXml="true"会把信息中的"<" 编码成"<"输出,若该属性值为false 则编码-->
${str},<c:out value="${ str }" escapeXml="true"></c:out>
<br/>
<!-- 此点为自加 .前台?号传参,在这里要用EL表达式的param获参,但要注意参数值如果为中文会出现乱码-->
<c:out value="${ param.nm }"></c:out>,${param.nm }.
<br/><br/><br/></span>
<c:set/>-声明一个变量
<span style="font-size:18px;color:#000000;"><c:set/>标签的作用如下:
为String类型的命名变量设置值。
<c:set var=“变量名” value=“变量的值” scope=“page|request|session|application”/>
<c:set var=“name” value=“${param.name}”/>直接从参数中取出数据给name赋值。
如果变量为JavaBean则为这个JavaBean的属性设置值。
<c:set target=“JavaBean的变量名” property=“设置的属性” value=“值”/>
示例:
<jsp:useBean id="person" class="cn.itcast.Person"></jsp:useBean>
<c:set target="${pageScope.person}" property="name" value="Jack"/>
<c:set target="${pageScope.person}" property="age" value="99"/>
如果变量为Map则,给Map中的key设置值。
<c:set target=“代表Map的变量” property=“key” value=“value”/>,示例:
<jsp:useBean id="map" class="java.util.HashMap" scope="request"></jsp:useBean>
<c:set target="${requestScope.map}" property="name" value="Jack"/>
<c:out value="${requestScope.map.name}"/>
</span>
demo1.jsp中set标签部分代码
<span style="font-size:18px;color:#000000;"> <p>c:set标签</p>
<!-- 给JavaBean设置属性 -->
<jsp:useBean id="user" class="cn.hncu.domain.UserModel" ></jsp:useBean>
<c:set target="${user}" property="name" value="Rose"></c:set>
<c:set target="${user}" property="age" value="22" ></c:set>
<c:out value="${user}"></c:out>
<br/>
<!-- 给String类型变量设置值 -->
<c:set var="sum" value="2000"></c:set>
<c:out value="${sum}"></c:out></span>
<c:if>- 判断标签
<span style="font-size:18px;color:#000000;"><c:if/>用于实现Java语言中的if语句。它的语法如下:
<c:if test=“逻辑表达式” var=“代表逻辑表达式值的命名变量” scope=../>
示例:
<c:if test=“${name!=‘Jack’}”>
当name的值为Jack时输出此行信息
</c:if>
上面的判断等价于下面的代码片段:
if(pageContext.getAttribute(“name”)!=null && !..equals(“Jack”)){
out.println(“…..”);
}
此标签经常使用,要掌握。
</span>
demo1.jsp中if标签部分代码
<span style="font-size:18px;color:#000000;"><p>c:if标签-----用于控制判断</p>
${user.age>20? "yes!":"no!" }<br/>
<!-- 实现 if-else功能 -->
<c:if test="${user.age>20 }" var="boo" scope="request" >
YES!
</c:if>
<c:if test="${!boo}">
NO!
</c:if>
<br/>
<%
pageContext.setAttribute("age", "18");
%>
<c:if test="${age>20 }" var="boo" scope="request" >
YES!
</c:if>
<c:if test="${!boo}">
NO!
</c:if></span>
续-迭代标签(重要内容):
<span style="font-size:18px;color:#000000;"><c:forEach/>用于遍历集合中的对像。
<c:forTokens/>用于遍历字符串中用特定分隔符分隔的字符串。--String.split(“#”);
</span>
forEach:
<span style="font-size:18px;color:#000000;">forEach用于遍历集合中的对像。
基本语法:
<c:forEach var=“迭代变量” item=“${集合名称}” varStatus=“迭代下标变量”>
迭代部分
</c:forEach>
forEach的begin(开始索引)、end(结束索引)、step(步长)属性:
<c:forEach begin=0 end=10 step=“2”>…</c:forEach>将输出0,2,4,6,810
</span>
使用forEach来遍历List:
<span style="font-size:18px;color:#000000;"><%
List<String> list = new ArrayList<String>();
list.add("Hello");
list.add("大家好");
pageContext.setAttribute("list",list);
%>
<c:forEach var="str" items="${list}">
${str}<br/>
</c:forEach>
</span>
用forEach来遍历Map:
<span style="font-size:18px;color:#000000;"><%
Map<String,Object> map = new HashMap<String,Object>();
map.put("name","Jack");
map.put("age","99");
pageContext.setAttribute("map",map);
%>
<c:forEach var="map" items="${map}">
${map.key} = ${map.value}<br/>
</c:forEach>
</span>
使用varStatus属性:
<span style="font-size:18px;color:#000000;">varStatus属性,用于设置一个javax.servlet.jsp.jstl.core.LoopTagStatus类型的命名变量:
它包含以下信息:
count – 当前元素在集合中的序号,从1开始。
index - 记录当前元素的下标,从0开始。
first - 判断是否是第一个元素。
Last - 判断是否是最后一个元素。
</span>
demo2.jsp中forEach和varStatus标签代码
<span style="font-size:18px;color:#000000;"><p>c:forEach标签</p>
一.普通for循环功能<br/>
<!-- 类似for(i=0;i<=10;i+2){} -->
<c:forEach begin="0" end="10" var="i" step="2">
${i},
</c:forEach>
二.增强for循环功能<br/>
1.遍历数组<br/>
<%
String[] str={"aa","bb","cc"};
request.setAttribute("str", str);
%>
<c:forEach items="${str}" var="s">
${ s },
</c:forEach>
<br/>
2.遍历List<br/>
<%
List<String> list=new ArrayList<String>();
list.add( "11");
list.add( "22");
list.add( "33");
request.setAttribute("list", list);
%>
<c:forEach items="${list}" var="l" varStatus="idx">
${idx.count},${l}<br>
</c:forEach>
<br/>
3.遍历Map<br/>
<%
Map map=new HashMap();
map.put("name", "Ming");
map.put("age", "20");
map.put("tel", "11223344");
map.put("addr", "城院");
session.setAttribute("user1", map);
%>
<c:forEach items="${user1}" var="u1">
${u1} ==> ${u1.key},${u1.value}<br/>
</c:forEach>
<br/>
4.遍历元素为值对象的集合<br/>
<%
Map map2=new HashMap();
map2.put("u1001", new UserModel("jack","11",20));
map2.put("u1002", new UserModel("jack2","22",22));
map2.put("u1003", new UserModel("jack3","33",33));
map2.put("u1004", new UserModel("jack4","44",44));
request.setAttribute("map2", map2);
%>
<c:forEach items="${map2}" var="m2">
${m2.key},${m2.value.name},${m2.value.age},${m2.value.pwd}<br/>
</c:forEach>
<hr/>
<!-- index为下标的序号(索引) ,count为计数 -->
<c:forEach items="${map2}" var="m2" varStatus="id">
${id.count } ${id.index }
<c:out value="${m2.value.name }"></c:out>
<c:out value="${m2.value.age }"></c:out>
<c:out value="${m2.value.pwd }"></c:out><br/>
</c:forEach>
<br/><br/></span>
用forTokens遍历一个字符串:
<span style="font-size:18px;color:#000000;"><c:forTokens var="v" items="a,b,c,d,e,f" delims=",">
<c:out value="${v}"></c:out><br/>
</c:forTokens>
按,(逗号)对字符串”a,b,c,d,e,f”进行分隔。
</span>
demo2.jsp中forTokens标签部分代码
<span style="font-size:18px;color:#000000;"><p>c:forTokens标签</p>
<!-- 类似字符串拆分.str.split(",") -->
<c:forTokens items="a,c,d,awe,53fa" delims="," var="x">
${x}<br/>
</c:forTokens>
<br/></span>
choose,when,otherwise:
<span style="font-size:18px;color:#000000;">这几个标签共同使用可以实现Java中的if…else语句的功能。
<c:choose>
<c:when test="${empty param.name}">
用户没有输入name参数
</c:when>
<c:when test="${param.name=='Admin'}">
${param.name}是管理员
</c:when>
<c:otherwise>
用户是:${param.name}
</c:otherwise>
</c:choose>
使用c:when必须遵循以下语法规则:
<c:when/>和<c:otherwise/>不能单独使用,它必须位于<c:choose内。
<c:otherwise/>必须位于c:when之后。
</span>
URL相关的标签:
<span style="font-size:18px;color:#000000;"><c:import/>包含其他web资源,功能类似与<jsp:include/>(动态包含)。
<c:import url=“web资源”/>
<c:url/>按特定的方式重写URL。
<c:url value=“/aaa.jsp”/>总是以/开头,如果只使用value属性为直接使用或输出。
<c:url value=“/…” var=“someVar” scope=“…”/>也可以通过这样的方式将重写的url放到某个范围中,然后再取出来使用。
<c:redirect/>负责重定向。
<c:redirect url=“重定向到的资源”/>
在使用<c:redirect时可以带更多的参数:
<c:redirect url=“/…”>
<c:param name=“someName” value=“someValue”/>
</c:redirect>
</span>
<c:url>
demo2.jsp中url标签部分代码:
<span style="font-size:18px;color:#000000;"><p>url相关的标签:url,import,redirect</p>
<!-- 重写url技术 ,路径中的"/"就是项目根目录-->
<a href='<c:url value="/ShowServlet"></c:url>'>显示所有用户信息</a>
<br/>
<!-- 动态包含 -->
<c:import url='/jsps/foot.jsp'></c:import>
<br/>
<%--
<!--注意:页面中写了c:redirect,就会立即重定向到其他页面。不会再停留在当前页面 -->
<c:redirect url="/jsps/foot.jsp"></c:redirect>
<%
response.sendRedirect(request.getContextPath()+"/jsps/show.jsp");
%>
--%>
<br/>
<c:set var="score" value="75"></c:set>
remove前: ${score}<br/>
<!-- c:remove标签:移除属性变量,和set相反 -->
<c:remove var="score"/>
remove后:${score}.
<br/><br/><br/></span>
与demo2.jsp相关联的ShowServlet.java代码:
<pre class="java" name="code"><span style="font-size:18px;color:#000000;">package cn.hncu.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.hncu.domain.UserModel;
public class ShowServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
List<UserModel> list=new ArrayList<UserModel>();
for(int i=0;i<10;i++){
list.add(new UserModel("Long"+i,"1234"+i,20+i));
}
request.setAttribute("list", list);
request.getRequestDispatcher("jsps/show.jsp").forward(request, response);
}
}
</span>
与demo2.jsp相关联的show.jsp代码:
<span style="font-size:18px;color:#000000;"><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>用户信息显示</title>
</head>
<body>
<h2>用户信息显示</h2>
<c:if test="${empty list }" var="boo">
用户信息为空
</c:if>
<c:if test="${!boo }">
<table>
<tr><th>姓名</th><th>年龄</th><th>密码</th></tr>
<c:forEach items="${list }" var="u">
<tr>
<td>${u.name }</td><td>${u.age }</td><td>${u.pwd }</td>
</tr>
</c:forEach>
</table>
</c:if>
</body>
</html>
</span>
与demo2.jsp相关联的foot.jsp很简单就是一张图片的代码,这里不再贴了。
I18N标签简介:
<span style="font-size:18px;color:#000000;">I18N是Internationalization的简称,因为I到N之间有18个字符所以叫i18n。
在java的核心库当中,提供了对i18n的支持,java.util.Locale类是最重要的i18n相关类。
首先介绍一下Locale类:
获取Locale类的实例,有以下几种方式:
Locale ch = new Locale(“zh”,”CN”);
Locale ch = Locale.CHINA;
或获取默认值:
Locale zh = Locale.getDefault();
然后可以通过以下方法输出语言和国家:
getLanguage
getCountry
</span>
I18N-ResourceBundle类:
<span style="font-size:18px;color:#000000;">Java.util.ResourceBundle类,用于管理和Locale相关的资源的功能。
ResourceBundle类提供了两个方法,用于创建ResourceBundle对像的静态工厂方法:
getBundle(String baseName)—通过此方法获取资源文件的名称
getBundle(String baseName,Locale locale);
参数中的baseName是资源文件的名称,资源文件通常以properties为扩展名。
资源文件的命名规则如下:
默认资源文件:resources.properties
英文资源文件:resources_en_US.properties
中文资源文件:resources_zh_CN.properties
</span>
ResourceBundle示例:
<span style="font-size:18px;color:#000000;">步骤如下:
1、在classpath目录下建立一个资源文件为message.properties。
2、内容如下:name=Jack
3、书写一个main方法的类,并输入以下代码:
4、ResourceBundle b = ResourceBundle.getBundle("message");
String name = b.getString("name");
System.err.println(name);
此时你看到的输出是Jack.
5、在classpath目录下,再建立一个文件message_zh_CN.properties
并输入以下内容:name=杰克 (注意转码)
6、重新执行第4步的代码,你将会看到输出的结果变成了:杰克。
7、这是因为它使用本地语言查找相关的资源文件,如果找不到就使用默认的,如果找到就使用本地的资源文件。
</span>
JSTL的国际化标签:
<span style="font-size:18px;color:#000000;"><fmt:setLocale/> - 设置Locale关将它保存在某个范围内,默认为page范围。
如:<fmt:setLocale value=“zh_CN” scope=“session”/>它的作用相当于:
Locale locale = new Locale(“zh”,”CN”);
Session.setAttribute(“javax.servlet.jsp.jstl.fmt.locale.session”,locale);
<fmt:setBundle/>
用于设置要使用的资源文件。如:
<fmt:setBundle basename=“message” var=“变量名” scope=“session”/>
<fmt:bundle/>
用于设置主体使用的资源。即setBundle设置的资源。
<fmt:message/>
读取资源文件中key所对应的值。
<fmt:param/>
嵌套在message中,用户动态的传递参数。
<fmt:requestEncoding/>
用于设置请求的编码字符。<fmt:requestEncoding value=“GBK”/>等同于
Request.setCharacterEncoding(“GBK”);
</span>
设置支持国际化的网页:
<span style="font-size:18px;color:#000000;">第一步:建立两个资源文件为:
message.properties
message_zh_CN.properties
第二步:使用jstl标签。
<fmt:setLocale value=“${param.locale}” scope=“session”/>
<fmt:setBundle basename=“message” scope=“session”/>
第三步:切换。
<a href="index.jsp?locale=zh_CN">中文</a><br/>
<a href="index.jsp?locale=en_US">English</a>
</span>
版本一:写死了
demo3.jsp
<span style="font-size:18px;color:#000000;"><%@ 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>
<title>I18N技术</title>
</head>
<body>
<h2>I18N技术----国际化技术</h2>
<!--1 设置本地信息----(看是哪国语言) -->
<fmt:setLocale value="zh_cn"/>
<!--2 指定资源文件名 -->
<fmt:setBundle basename="msg" scope="session"/>
<!--3 显示信息 -->
<fmt:message key="welcome"></fmt:message> Hong<br/>
<fmt:message key="time" />2016.10.20 19:19
</body>
</html>
</span>
版本二:更灵活
demo4.jsp
<span style="font-size:18px;color:#000000;"><%@ 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/fmt" prefix="fmt"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>I18N技术</title>
</head>
<body>
<h2>I18N技术----国际化技术</h2>
<a href="?bd=zh_CN">中文</a>
<a href="?bd=en_US">English</a><br/>
<!--1 设置本地信息----(看是哪国语言) 相对于上一个版本做活了 -->
<fmt:setLocale value="${param.bd }"/>
<!--2 指定资源文件名 -->
<fmt:setBundle basename="msg" scope="session"/>
<!-- ◎指定第二个及之后的资源文件,含路径的资源名,第二个及以后的资源一定要取别名 -->
<fmt:setBundle basename="cn.resources.a" var="bb" scope="session"/>
<!--3 显示信息 -->
<fmt:message key="welcome"></fmt:message> Hong<br/>
<fmt:message key="time" />2016.10.20 19:19
<!-- 第二个及以后的资源,要指定别名 -->
<fmt:message key="addr" bundle="${bb }"></fmt:message>
<br/>
<a href="<c:url value='/jsps/a.jsp'></c:url>">转到另外一个界面</a>
</body>
</html>
</span>
与demo4.jsp相关联的a.jsp代码与demo4.jsp中的显示信息代码一致,这里不再贴了。
主页index.jsp代码
<span style="font-size:18px;color:#000000;"><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>JSTL技术</title>
</head>
<body>
<h2>JSTL技术必须依赖于EL表达式</h2>
<a href="jsps/demo1.jsp">JSTL用法1</a><br/>
<a href="jsps/demo1.jsp?nm=jack&age=20">JSTL用法1---可以从这里传参</a>
<br/> <br/>
<a href="jsps/demo2.jsp">JSTL用法2</a><br/>
<br/>
<a href="jsps/demo3.jsp">I18N----国际化技术</a> <br/>
<a href="jsps/demo4.jsp">I18N----国际化技术2</a>
</body>
</html>
</span>