一.简介:
JSTL(Java Standard Tag Library) –Java标准标签库。SUN公司制定的一套标准标签库的规范。JSTL标签库,是由一些Java类组成的。
二.JSTL组成:
三、JSTL核心标签库:c标签JSTL –Core 核心标签库。 - 这是本部分的重点JSTL – I18N - 国际化标签库。Internationalization- I18NJSTL – SQL – 数据库操作标签(有悖于MVC设计模式不用不讲)。JSTL -Functions – 函数库。lJSTL- XML ,对XML的操作(同SQL标签)。
l使用JSTL核心标签:•如果你的Web项目是基于JavaEE2.5或以上的。可以在你项目的任意页面上通过<%@taglib指令使用JSTL的核心标签库。•<%@ tagliburi="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.
<c:out> ${name} |
输出标签 |
<c:set> pageContext.setAttirbute(key,value,scope); |
声明标签 |
C:remove |
删除某个范畴内的数据 |
<c:if> |
判断c:else,c:elsfif |
<c:choose><c:when><c:otherwise> |
判断分枝c:if,c:else if c: |
<c:forEach> |
遍历 |
<c:forTokens> |
分隔 |
<c:import> |
导入其他资源,相当于动态包含共享同一个request |
<c:url> - |
重写url |
<c:redirect> |
重定向 response.sendRedirect(‘’..) |
1.JSTL标签-out:
<c:out value=…/>用于在页面上输出结果。
2.<c:set/>-声明一个变量<c:outvalue=“${requestScope.name}”/> -将request中的name值输出<c:outvalue=“${param.username}”/> - 用于将参数输出到页面上。<c:outvalue=“${name}”default=“hello”/>从page到application开始查找,如果没有找到,就显示默认值hello.另一种设置默认值的方式:•<c:outvalue=“${name}”>•Default-value-默认值。•</c:out>•只有当要求的信息为null或不存在时才会输出默认值。excapeXml属性:默认值为true,用于将html等标签转换成<等转换元素,示例:<%String name="<font color='red'>Red</font>";pageContext.setAttribute("name",name);%><c:outvalue=“${name}”escapeXml=“false”></c:out>不对xml或html进行转换,直接输出,这样就会在页面上看到红色的Red字符,因为浏览器会解析html数据。
3.JSTL if 标签
l<c:set/>标签的作用如下:•为String类型的命名变量设置值。•<c:setvar=“变量名”value=“变量的值”scope=“page|request|session|application”/>•<c:setvar=“name”value=“${param.name}”/>直接从参数中取出数据给name赋值。•如果变量为JavaBean则为这个JavaBean的属性设置值。•<c:settarget=“JavaBean的变量名”property=“设置的属性”value=“值”/>•示例:•<jsp:useBeanid="person"class="cn.itcast.Person"></jsp:useBean>• <c:settarget="${pageScope.person}" property="name"value="Jack"/>• <c:settarget="${pageScope.person}" property="age"value="99"/>•如果变量为Map则,给Map中的key设置值。•<c:settarget=“代表Map的变量”property=“key”value=“value”/>,示例:•<jsp:useBeanid="map"class="java.util.HashMap"scope="request"></jsp:useBean>• <c:settarget="${requestScope.map}"property="name"value="Jack"/>• <c:outvalue="${requestScope.map.name}"/>
4.choose,when,otherwise:<c:if/>用于实现Java语言中的if语句。它的语法如下:<c:if test=“逻辑表达式” var=“代表逻辑表达式值的命名变量” scope=../>示例:<c:if test=“${name!=‘Jack’}”>当name的值为Jack时输出此行信息l</c:if>上面的判断等价于下面的代码片段:if(pageContext.getAttribute(“name”)!=null &&!..equals(“Jack”)){•out.println(“…..”);}此标签经常使用,要掌握。
5.forEach:
这几个标签共同使用可以实现Java中的if…else语句的功能。<c:choose><c:when test="${emptyparam.name}">用户没有输入name参数</c:when><c:whentest="${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之后。
forEach用于遍历集合中的对像。基本语法:<c:forEachvar=“迭代变量”item=“${集合名称}”varStatus=“迭代下标变量”>迭代部分</c:forEach>forEach的begin(开始索引)、end(结束索引)、step(步长)属性:<c:forEachbegin=0 end=10 step=“2”>…</c:forEach>将输出0,2,4,6,810
varStatus属性,用于设置一个javax.servlet.jsp.jstl.core.LoopTagStatus类型的命名变量:它包含以下信息:count– 当前元素在集合中的序号,从1开始。index- 记录当前元素的下标,从0开始。first- 判断是否是第一个元素。Last -判断是否是最后一个元素。
6.forTokens遍历一个字符串:
下面通过jsp页面来演示JSTL核心标签库<c:forTokensvar="v" items="a,b,c,d,e,f"delims=",">7.URL相关的标签:<c:out value="${v}"></c:out><br/></c:forTokens>按,(逗号)对字符串”a,b,c,d,e,f”进行分隔。
<c:import/>包含其他web资源,功能类似与<jsp:include/>(动态包含)。<c:importurl=“web资源”/><c:url/>按特定的方式重写URL。<c:urlvalue=“/aaa.jsp”/>总是以/开头,如果只使用value属性为直接使用或输出。<c:urlvalue=“/…”var=“someVar”scope=“…”/>也可以通过这样的方式将重写的url放到某个范围中,然后再取出来使用。<c:redirect/>负责重定向。<c:redirecturl=“重定向到的资源”/>在使用<c:redirect时可以带更多的参数:<c:redirecturl=“/…”><c:param name=“someName” value=“someValue”/></c:redirect>
属性
类型
说明
value
Striing
资源地址信息
var
String
变量名
context
String
可以指定上下文根,默认为本项目的上下方根,也可以指定为其他项目的项目名。
scope
同上
…
使用c:url时,如果只使用value属性,则是直接将信息输出。如果声明了var属性,将不会输出结果而是将url地址信息的结果保存到此变量中。
<span style="font-size:12px;"><%@page import="cn.hncu.elWeb.domain.User"%>
<%@ 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>演示JSTL技术</title>
</head>
<body>
<h1>JSTL技术演示</h1>
<%
request.setAttribute("aa", "goggo");
List<Object> list=new ArrayList<Object>();
list.add(new User("wja",20));
list.add("aaaaaaa");
list.add(2000);
list.add(-300.9);
request.setAttribute("list", list);
%>
${list}
<table border="1px"">
<c:forEach items="${list}" var="la">
<tr><td>${la}</td></tr>
</c:forEach>
</table>
<br/>
<!-- c:out -->
<%
pageContext.setAttribute("name", "Jack");
pageContext.setAttribute("name2", "<font color='red'>JACK</font>");
%>
${name }<br/>
<c:out value="${name}" ></c:out> <br/>
${name2}<br/>
<c:out value="${name2}" escapeXml="false" ></c:out><!-- escapeXml参数是看是否解析c:out -->
<br/>
<!-- c:if -->
<c:if test="${list[0].age>20}" var="boo" scope="session">
<table border="1px">
<c:forEach items="${list }" var="l">
<tr/><td/>${l }
</c:forEach>
</table>
</c:if>
<c:if test="${!boo}">
<h2>输出表格错误</h2>
</c:if>
相当于${list[0].age>20?"yes":"no" }<br/>
<!-- forEach -->
<!-- forEach的遍历功能 -->
<%
HashMap<String,Object> map=new HashMap<String,Object>();
map.put("name", "Rose");
map.put("age",55);
map.put("tel", "13566668888");
pageContext.setAttribute("m", map);
String str[]={"aaa","bbb","cccc","dddddddd"};
pageContext.setAttribute("str", str);
%>
<c:forEach items="${m }" var="im">
${im.key}=${im.value }
</c:forEach><br/>
<c:forEach items="${str}" var="s">
${s}
</c:forEach><br/>
<h3>看看ForEach标签中的varStatus属性---idx.index是元素的下标(从0开始),idx.count是元素的序号(从1开始计数)</h3>
<c:forEach items="${str }" var="s" varStatus="index">
${s }------index=${index.index} count=${index.count }<br/>
</c:forEach>
<!-- forEach的普通循环功能 -->
<c:forEach begin="20" end="40" step="2" varStatus="idx" var="x" ><!-- 只能是递增,而且step不能为负数 -->
${x } index=${idx.index} --${idx.count} <br/>
</c:forEach>
${str[0]}<br/>
<!-- c:set 设置属性,默认作用域:pageScope-->
<c:set var="aa" value="abc123"></c:set>
<c:set var="aa" value="bbbbbbb23123" scope="session"> </c:set>
<%-- <c:set var="${requestScope.aa }" value="bbbbbbb23123" scope="request"> </c:set>var的值不能用EL表达式<br/> --%>
${aa },,,${sessionScope.aa }<br/>
<!-- c:remove 删除属性,默认作用域:pageScope,request等4个容器中的都会被删除-->
<!-- 下面这一句,若没有scope属性,则前面的所有"aa"都会被清除。写了下面的scope,则只清除指定的request中的那个"aa"属性 -->
<%-- <c:remove var="aa" scope="request"/> --%>
${aa },,${requestScope.aa },,${sessionScope.aa }<br/>
<br/>
<!-- c:choose,c:when,c:otherwise 类似Java中的switch-case-default且每项自动带break -->
<c:set var="score" value="8"></c:set>
<c:choose >
<c:when test="${score>90}">优秀</c:when>
<c:when test="${score>80}">良好</c:when>
<c:when test="${score>60}">及格</c:when>
<c:otherwise>不及格</c:otherwise>
</c:choose>
<br/>
<!-- c:forTokens 用分隔符去拆分字符串-->
<c:forTokens items="aa,vv,sdasd,sfasfafggd,eeeee" delims="," var="str">
${str}
</c:forTokens><hr/>
${str[0]}<br/><!-- >被覆盖了,读不出去 -->
<!-- c:import 导入资源,相当于动态包含,共享同一个request-->
<c:import url="/jsps/aa.jsp"></c:import>
<!-- c:redirect 重定向,相当于response.sendRedirect(...) -->
<%--
<c:redirect url="/jsps/aa.jsp"></c:redirect>
--%>
<!-- c:redirect 重定向,相当于response.sendRedirect(...) -->
<h2>以下演示JSTL中的国际化--I18N </h2>
<a href="<c:url value='/jsps/i18n.jsp'/>">I18N演示</a>
</body>
</html>
</span>
四、I18N标签:
- 简介:
l18N是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();然后可以通过以下方法输出语言和国家:getLanguagegetCountry
- I18N-ResourceBundle类:
Java.util.ResourceBundle类,用于管理和Locale相关的资源的功能。ResourceBundle类提供了两个方法,用于创建ResourceBundle对像的静态工厂方法:getBundle(StringbaseName)—通过此方法获取资源文件的名称getBundle(StringbaseName,Locale locale);参数中的baseName是资源文件的名称,资源文件通常以properties为扩展名。资源文件的命名规则如下:默认资源文件:resources.properties英文资源文件:resources_en_US.properties中文资源文件:resources_zh_CN.properties
-
ResourceBundle示例:
在网页上的使用(要导入<%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>标签)步骤如下:1、在classpath目录下建立一个资源文件为message.properties。2、内容如下:name=Jack3、书写一个main方法的类,并输入以下代码:4、ResourceBundle b =ResourceBundle.getBundle("message");Stringname = b.getString("name");System.err.println(name);此时你看到的输出是Jack.5、在classpath目录下,再建立一个文件message_zh_CN.properties并输入以下内容:name=杰克(注意转码)6、重新执行第4步的代码,你将会看到输出的结果变成了:杰克。7、这是因为它使用本地语言查找相关的资源文件,如果找不到就使用默认的,如果找到就使用本地的资源文件。
<%@page import="cn.hncu.elWeb.domain.User"%>
<%@ 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>
<fmt:setLocale value="zh_CN"/>
<fmt:setBundle basename="msg"/>
<!-- 真正搞国际,应该要把设置Locale和Bundle的代码放在head标签中,页面只负责显示。 -->
</head>
<body>
张三,<fmt:message key="welcome"/><br/>
<fmt:message key="time"/>fddfdfdfdfdfdf
<hr/>
<!-- 相比上一版本,把国家语种用参数进行传递 -->
<a href="?loc=en_US">English</a>
<a href="?loc=zh_CN">中文</a>
<fmt:setLocale value="${param.loc}"/>
<fmt:setBundle basename="msg"/>
张三,<fmt:message key="welcome"/><br/>
<fmt:message key="time"/>fddfdfdfdfdfdf
<hr/>
<!-- 再演示一下多个资源的情况,第二个资源及以后都必须取别名(变量名)。前面(第一个)没取变量名的那个叫默认资源 -->
<fmt:setBundle basename="a" var="aaa" scope="session"/>
<!-- 如果多个页面都要使用,那么得把作用域设成session -->
张三,<fmt:message key="welcome"/><br/>
<fmt:message key="time"/>fd8888dfdf
<br/>
<!-- 如果是从非默认资源中读取,那么得指定资源名称即aaa。如果没有指定名称,那么就是从默认的读取 -->
<fmt:message key="address" bundle="${aaa}"></fmt:message>
<br/>
<a href="<c:url value='/jsps/c.jsp'/>">到网站的其它页面去看看</a>
</body>
</html>