一.简介:
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 的核心标签库。• <%@ 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 .
<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: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 等标签转换成 & lt ; 等转换元素,示例:<%String name="<font color='red'>Red</font>";pageContext.setAttribute (" name",name );%>< c:out value=“${name}” escapeXml = “ false ” ></ c:out > 不对 xml 或 html 进行转换,直接输出,这样就会在页面上看到红色的 Red 字符,因为浏览器会解析 html 数据。
3.JSTL if 标签
l < 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}"/>
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="${ 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 之后。
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
varStatus 属性,用于设置一个 javax.servlet.jsp.jstl.core.LoopTagStatus 类型的命名变量:它包含以下信息:count– 当前元素在集合中的序号,从 1 开始。index - 记录当前元素的下标,从 0 开始。first - 判断是否是第一个元素。Last -判断是否是最后一个元素。
6.
forTokens
遍历一个字符串:
下面通过jsp页面来演示JSTL核心标签库
< c:forTokens var = "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: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 >
属性
类型
说明
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标签:
- 简介:
l 18N 是 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 (String baseName )— 通过此方法获取资源文件的名称getBundle (String baseName,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>