JSTL

来源:互联网 发布:2017酒店行业市场数据 编辑:程序博客网 时间:2024/06/06 01:58

JSTL组成:

JSTL –Core 核心标签库。 - 这是本部分的重点
JSTL – I18N - 国际化标签库。Internationalization-    I18N
JSTL – SQL – 数据库操作标签(有悖于MVC设计模式,不学)。
JSTL - Functions – 函数库。
JSTL - XML ,对XML的操作(同SQL标签)。

上面讲的SQL和XML部分都是可以不学的,因为都是不会去用的


如果你的Web项目是基于JavaEE2.5或以上的。可以在你项目的任意页面上通过<%@ taglib 指令使用JSTL的核心标签库。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c"%>,这个标签必须打上次才能使用c标签


JSTL-Core一共包含以下几个子标签:

<c:out>  ${name}  输出标签

示例:

<!-- c:out -->    <%    pageContext.setAttribute("name", "Tom");    pageContext.setAttribute("name2", "<font color='green'>Tom</font>");    %>    <c:out value="${name }"/><br/>    ${name}<br/>        <c:out value="${name2}" escapeXml="false"/><br/>    <!-- 上面这一句里面的escapeXml="false"如果不加那么就是将字符串原样输出(默认是true),加了就是按HTML格式输出 -->    ${name2}<br/>

<c:set>   pageContext.setAttirbute(key,value,scope);  声明标签

<!-- c:set 设置属性,默认作用域:pageScope-->    <c:set var="a" value="dcba"/><!-- 这一个会存放在pageScope中,不会被下面一句冲掉 -->    <c:set var="a" value="abcd" scope="request"/>    ${pageScope.a},${requestScope.a}<br/>    ${a}<!-- 这一个选的是默认的pageScope中的a -->

c:remove  删除某个范畴内的数据

<!-- c:remove 删除属性,默认作用域:pageScope,request等4个容器中的都会被删除-->    <!-- 下面这一句,若没有scope属性,则前面的所有c:set设置的"a"都会被清除。写了下面的scope,则只清除指定的request中的那个"a"属性 -->    <c:remove var="a" scope="request"/>    ${pageScope.a},${requestScope.a}<br/>

<c:if>  判断c:else,c:else if

    <!-- c:if -->    <c:if test="${list[0].age>10}" var="boo" scope="session">    <table border=1px>    <c:forEach items="${list }" var="a">    <tr> <td>${a}</td> </tr>    </c:forEach>    </table>    </c:if>    <c:if test="${!boo }"><!-- 这里相当于else -->    <h3>Else</h3>    </c:if>

<c:choose><c:when><c:otherwise>  判断分枝c:if,c:else if c:(其实就相当于switch-case-default语句)

    <!-- c:choose,c:when,c:otherwise  类似Java中的switch-case-default且每项自动带break -->    <c:set var="score" value="98"/>    <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>

<c:forEach>  遍历

    <!-- forEach -->    <!-- forEach的遍历功能 -->    <%    List list2 = new ArrayList();    list2.add("aa1111" );    list2.add("bb2222");    list2.add(200);    list2.add(100);    request.setAttribute("list2", list2);    %>    <c:forEach items="${list2}" var="a2">    ${a2},    </c:forEach>        <%    Map<String,Object> map = new HashMap<String,Object>();    map.put("name", "Rose");    map.put("age",55);    map.put("tel", "13566668888");    pageContext.setAttribute("map", map);    %>    <br/>    <c:forEach items="${map}" var="m">    ${m.key}=${m.value}<br/>    </c:forEach>        <%    String strs[] ={"aaa","bbb","111","2222"};        pageContext.setAttribute("strs", strs);    %>    <c:forEach items="${strs}" var="str">    ${str},    </c:forEach>        <h3>看看ForEach标签中的varStatus属性---idx.index是元素的下标(从0开始),idx.count是元素的序号(从1开始计数)</h3>    <c:forEach items="${strs}" var="str" varStatus="idx">    ${str}---index=${idx.index} count=${idx.count}<br/>    </c:forEach>        <!-- forEach的普通循环功能 -->    <c:forEach begin="20" end="39" var="i" step="2" varStatus="idx">    ${i} ${idx.count}<br/>    </c:forEach>

<c:forTokens>  分隔

    <!-- c:forTokens 用分隔符去拆分字符串-->    <c:forTokens items="aa,bb,cc,dd" delims="," var="i">    ${i}     </c:forTokens>

<c:import>  导入其他资源,相当于动态包含共享同一个request
    <!-- c:import 导入资源,相当于动态包含,共享同一个request-->    <c:import url="b.jsp"></c:import>
这里再提一下动态导入,如下:

    <jsp:include page="jsps/b.jsp"></jsp:include>


<c:url>  -   重写url

<a href="<c:url value='a.jsp'/>">


<c:redirect>  重定向  response.sendRedirect(‘’..)

    <!-- c:redirect 重定向,相当于response.sendRedirect(...) -->    <%--     <c:redirect url="aa.jsp"></c:redirect>     --%>
这里我将重定向的代码注释掉了,而且这里还必须使用<%--  --%>注释,使用<--  -->不起作用

使用varStatus属性:
varStatus属性,用于设置一个javax.servlet.jsp.jstl.core.LoopTagStatus类型的命名变量:
它包含以下信息:
count – 当前元素在集合中的序号,从1开始。
index - 记录当前元素的下标,从0开始。
first - 判断是否是第一个元素。
Last - 判断是否是最后一个元素。

URL相关的标签:

<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>


fmt格式化标签:

这个一般用在国际化里面( I18N ),在下面 I18N 的代码中有讲到


I18N

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示例:

步骤如下:
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、这是因为它使用本地语言查找相关的资源文件,如果找不到就使用默认的,如果找到就使用本地的资源文件。


示例:

首先我写了几个配置文件如下:


代码如下:

i18n.jsp

<%@ 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"/>time        <hr/>    <!-- 相比上一版本,把国家语种用参数进行传递 -->    <a href="?loc=zh_CN">中文</a>    <a href="?loc=en_US">English</a>    <fmt:setLocale value="${param.loc}"/>    <fmt:setBundle basename="msg"/>    张三,<fmt:message key="welcome"/><br/>    <fmt:message key="time"/>time        <hr/>    <!-- 再演示一下多个资源的情况,第二个资源及以后都必须取别名(变量名)。前面(第一个)没取变量名的那个叫默认资源  -->    <fmt:setBundle basename="a" var="aaa" scope="session"/>    <!-- 如果多个页面都要使用,那么得把作用域设成session -->    张三,<fmt:message key="welcome"/><br/>    <fmt:message key="time"/>time:88888888        <br/>    <!-- 如果是从非默认资源中读取,那么得指定资源名称即aaa。如果没有指定名称,那么就是从默认的读取 -->    <fmt:message key="address" bundle="${aaa}"></fmt:message>    <br/>    <a href="<c:url value='c.jsp'/>">去其他页面</a>  </body></html>

c.jsp

<%@ 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>  </head>    <body>    <!-- 从作用域是session的资源aaa中读取 -->    <fmt:message key="address" bundle="${aaa}"/>  </body></html>

JSTL-Functions标签

更确切的说,它应该算是函数库。
它的使用方法与之前的jstl标签不同,它的语法如下:
${fn:contains(“Tomcat”,”cat”)} -判断前面的字符串中是否包含后面的字符串。

介绍几个经常使用的函数如下:

fn:contains – 是否包含,和fn:containsIgnoreCase.
fn:startsWith和fn:endsWidth
fn:indexOf,示例:${fn:indexOf(“Tomcat”,”o”)}将输出1。
fn:substring(source,begin,end);
fn:split
示例:
<c:forEach items=“${fn:split(‘www.baidu.com’,’.’)}” var=“str”>
      ${str}<br/>将输出换行的www、baidu、com
</c:forEach>
fn:toLowerCase和fn:toUpperCase
fn:trim
fn:length



0 0
原创粉丝点击