jsp技術:day4--JSTL

JSTL—Core核心標籤庫(重點掌握)

用之前先要導入標籤庫:<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

重寫url:

<c:url value="/jsps/jstl.jsp" />

c:out 標籤

注意:用c:out標籤輸出可以自己設置escapexml屬性,是否讓瀏覽器翻譯輸出,默認是true不翻譯。如圖:
這裏寫圖片描述

<%
        pageContext.setAttribute("name", "思琪");
        pageContext.setAttribute("name2", "<font color='red'>小雪</font>");
         %>
        <hr/>
        ${name },${name2 }<br>
        <c:out value="${ name}"></c:out>,<c:out value="${ name2}"></c:out>
        <!-- 上面兩個輸出是有區別的,第一個是瀏覽器翻譯輸出,第二行的輸出是原樣輸出-->
        <br/>
        <!-- 如果想第二種輸出也讓瀏覽器翻譯要設置escapexml屬性  默認是true不翻譯-->
        <c:out value="${name }" escapeXml="false"  ></c:out>,
        <c:out value="${name2 }" escapeXml="false"></c:out>

c:if標籤

test屬性是條件,var聲明的boo只有後面用的時候纔有意義。
如圖:
條件滿足時:
條件滿足
條件不滿足時:
條件不滿足

        <c:if test="${list[2].age>30 }" var="boo" scope="session">
            這正是我要的if結果
        </c:if>
        <!-- 聲明的boo只有當下面要用的時候纔有意義 -->
        <c:if test="${!boo }">
            這是當上面boo條件不滿足的時候才輸出
        </c:if>

c:forEach遍歷

list集合遍歷:

<%
            List list2 = new ArrayList();
            list2.add("aaaaaa");
            list2.add("bbbbbb");
            list2.add(1111111);
            list2.add(33333333);
            request.setAttribute("list2", list2);
%>
            <br/>
            <br/>
            <c:forEach items="${list2 }" var="im">
            ${im },
            </c:forEach>

map集合遍歷

<%
        Map<String,Object> map= new HashMap<String,Object>();
        map.put("name", "利兒");
        map.put("age", 24);
        map.put("b-f", "軍街");
        request.setAttribute("map", map);
%>
        <br/>
        <c:forEach items="${map }" var="im">
            ${im.key }=${im.value }<br/>
        </c:forEach>
        <br/>

數組遍歷

<%
        String strs ="aa,bb,cc,oo,kk";
        request.setAttribute("strs", strs);
 %>
        <c:forEach items="${strs }" var="im">
            ${im },,
        </c:forEach>

forEach中的varStatus屬性:index:元素下標 count:統計個數

<c:forEach items="${strs }" var="im" varStatus="idx">
            ${im },index:${idx.index },count:${idx.count }<br/>
</c:forEach>

forEach中的普通循環功能,主要用來控制次數 begin-end step:間隔數

<c:forEach begin="10"   end="18"    var="i" step="2" >
                ${i },,
</c:forEach>

c:set 用於設置屬性

默認作用域pageScope
也可以指定作用域:pageScope、requestScope、sessionScope、applicationScope

<c:set var="aa" value="123456"  ></c:set>
<c:set var="aa" value="456456" scope="request" ></c:set>
aa:${aa }<br/>
aa:${requestScope.aa }

c:remove 刪除屬性

默認作用域:pageScope,request等4個容器中的都會被刪除
如果下面的沒有設置屬性,則所有的aa屬性都會被刪除

        <c:remove var="aa" scope="request"/>
        aa:${aa }
        <br/>
        aa:${requestScope.aa }

c:choose,c:when,c:otherwise

類似Java中的switch-case-default且每項自動帶break

        <c:set var="score" value="85" >
        </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:otherwise>
            不行
            </c:otherwise>
        </c:choose>

        <br/>

結果輸出如圖:
這裏寫圖片描述

c:forTokens

用分隔符去拆分字符串

        <c:forTokens items="aa,bb,cc,dd,ff" delims="," var="im">
            ${im },,
        </c:forTokens>

結果如圖:
這裏寫圖片描述

c:import 導入資源

相當於動態包含,共享同一個request

c:redirect重定向

相當於response.sendRedirect(…)

I18N標籤庫

配置文件寫多套,由系統去讀,如果匹配到相關國家,則用相應的properties,如果匹配不到,還會根據系統的國家語種再找,如果還沒有,則用我們默認的properties。

//參數是:baseName-- 本例指的是資源文件名是: msg**.properties
        //ResourceBundle rd = ResourceBundle.getBundle("msg");//讀取的是:msg_zh_CN.properties
//      ResourceBundle rd = ResourceBundle.getBundle("msg");
        ResourceBundle rd = ResourceBundle.getBundle("msg",Locale.FRANCE); //讀取的是:msg_en_US.properties
        String str1 = rd.getString("welcome");
        String str2= rd.getString("time");
        System.out.println(str1+","+str2);

Functions標籤庫

真正搞國際,應該要把設置Locale和Bundle的代碼放在head標籤中,頁面只負責顯示。
可以寫一個默認的,如果讀取不到該國家參數就採用默認的properties。

<fmt:setLocale value="zh_CN"/>
<fmt:setBundle basename="msg"/>
        張三,<fmt:message key="welcome"/><br/>
        <fmt:message key="time"/>
        , 2:30 ,are you want to have a sleep<br/>

相比上一版本,把國家語種用參數進行傳遞

        <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"/>
        , 2:49 ,are you want to have a sleep<br/>

再演示一下多個資源的情況,第二個資源及以後都必須取別名(變量名)。前面(第一個)沒取變量名的那個叫默認資源

<fmt:setBundle basename="a" var="aaa" scope="session" />
<fmt:message key="address" bundle="${aaa }" ></fmt:message>

如果是從非默認資源中讀取,那麼得指定資源名稱即aaa。如果沒有指定名稱,那麼就是從默認的讀取
如果多個頁面都要使用,那麼得把作用域設成session

 <a href="<c:url value='/jsps/c.jsp' />">去別的網頁看一看</a>

在c.jsp頁面中:

<fmt:message key="address" bundle="${aaa }"></fmt:message>

本文完整代碼如下:

index.jsp

<%@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>
  </head>

  <body>
  <h2>JSTL技術演示</h2>
        <a href="<c:url value='/jsps/jstl.jsp'></c:url>">JSTL技術演示頁面</a>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>

  </body>
</html>

i18n.jsp

<%@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>
  </head>

  <body>
        <h2>jstl.jsp頁面</h2>
        <br/>
        <!-- jstl很強大 -->
        <%
            List list = new ArrayList();
            list.add("aaaa");
            list.add("bbbbb");
            list.add(new User("小米",26));
            request.setAttribute("list", list);

         %>
        <table border="1px">
            <c:forEach items="${ list}" var="im">
                <tr><td>list-item:${im }</td></tr>
            </c:forEach>
        </table>
        <!-- c:out -->
        <%
            pageContext.setAttribute("name", "思琪");
            pageContext.setAttribute("name2", "<font color='red'>小雪</font>");
         %>
        <hr/>
        ${name },${name2 }<br>
        <c:out value="${ name}"></c:out>,<c:out value="${ name2}"></c:out>
        <!-- 上面兩個輸出是有區別的,第一個是瀏覽器翻譯輸出,第二行的輸出是原樣輸出-->
        <br/>
        <!-- 如果想第二種輸出也讓瀏覽器翻譯要設置escapexml屬性  默認是true不翻譯-->
        <c:out value="${name }" escapeXml="false"  ></c:out>,
        <c:out value="${name2 }" escapeXml="false"></c:out>
        <br/>
        <!-- c:if -->
        <c:if test="${list[2].age>20 }" var="boo" scope="session">
            這正是我要的if結果
        </c:if>
        <!-- 聲明的boo只有當下面要用的時候纔有意義 -->
        <c:if test="${!boo }">
            這是當上面boo條件不滿足的時候才輸出
        </c:if>
        <!-- c:forEach遍歷 -->
        <%
            List list2 = new ArrayList();
            list2.add("aaaaaa");
            list2.add("bbbbbb");
            list2.add(1111111);
            list2.add(33333333);
            request.setAttribute("list2", list2);
        %>
        <br/>
        <br/>
        <c:forEach items="${list2 }" var="im">
        ${im },
        </c:forEach>
        <%
            Map<String,Object> map= new HashMap<String,Object>();
            map.put("name", "利兒");
            map.put("age", 24);
            map.put("b-f", "軍街");
            request.setAttribute("map", map);
         %>
        <br/>
        <c:forEach items="${map }" var="im">
            ${im.key }=${im.value }<br/>
        </c:forEach>
        <br/>
        <%
            String strs ="aa,bb,cc,oo,kk";
            request.setAttribute("strs", strs);
         %>
        <c:forEach items="${strs }" var="im">
            ${im },,
        </c:forEach>    
        <br/>   
        <h3>forEach中的varStatus屬性:index:元素下標  count:統計個數</h3>
        <c:forEach items="${strs }" var="im" varStatus="idx">
            ${im },index:${idx.index },count:${idx.count }<br/>
        </c:forEach>
        <br/>
        <h3>forEach中的普通循環功能,主要用來控制次數 begin-end  step:間隔數</h3>       
            <c:forEach begin="10"   end="18"    var="i" step="2" >
                ${i },,
            </c:forEach>
        <br/>
        <!-- c:set 用於設置屬性,默認作用域pageScope -->        
        <c:set var="aa" value="123456"  >
        </c:set>
        aa:${aa }
        <br/>
        <c:set var="aa" value="456456" scope="request" >
        </c:set>
        aa:${requestScope.aa }
        <br/>
        <!-- c:remove 刪除屬性,默認作用域:pageScope,request等4個容器中的都會被刪除 -->
        <%--  如果下面的沒有設置屬性,則所有的aa屬性都會被刪除--%>
        <c:remove var="aa" scope="request"/>
        aa:${aa }
        <br/>
        aa:${requestScope.aa }
        <br/>
        <br/>
        <!-- c:choose,c:when,c:otherwise  類似Java中的switch-case-default且每項自動帶break -->
        <c:set var="score" value="85" >
        </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:otherwise>
            不行
            </c:otherwise>
        </c:choose>

        <br/>

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

        <!-- c:import 導入資源,相當於動態包含,共享同一個request-->
        <br/>
        導入資源:
        <c:import url="/jsps/b.jsp"></c:import>

        <br/>
        <br/>
        <!-- c:redirect 重定向,相當於response.sendRedirect(...) -->       
        <%--
        <c:redirect url="/jsps/aa.jsp">
        </c:redirect>
         --%>
        <br/>
        <br/>
        <h2>以下演示JSTL中的國際化--I18N </h2>
        <a href="<c:url value='/jsps/i18n.jsp'/>">演示JSTL中的國際化--I18N </a>        
        <br/>
        <br/>

  </body>
</html>

b.jsp

<%@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>
  </head>

  <body>
        <c:forEach items="${list2 }" var="im">
            im:${im }<br>
        </c:forEach>
  </body>
</html>

aa.jsp

<%@page import="cn.hncu.elWeb.domain.User"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  </head>

  <body>
        <h2>aa.jsp頁面</h2>
        <a href = "${pageContext.request.contextPath }/index.jsp">返回主頁</a>
        <!--上面的index.jsp加不加無所謂,因爲都是主頁,在xml中設置了歡迎頁面就是index.jsp -->
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>
        <br/>

  </body>
</html>

i18n.jsp

<%@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>
  </head>

  <body>
        <h2>jstl.jsp頁面</h2>
        <br/>
        <!-- jstl很強大 -->
        <%
            List list = new ArrayList();
            list.add("aaaa");
            list.add("bbbbb");
            list.add(new User("小米",26));
            request.setAttribute("list", list);

         %>
        <table border="1px">
            <c:forEach items="${ list}" var="im">
                <tr><td>list-item:${im }</td></tr>
            </c:forEach>
        </table>
        <!-- c:out -->
        <%
            pageContext.setAttribute("name", "思琪");
            pageContext.setAttribute("name2", "<font color='red'>小雪</font>");
         %>
        <hr/>
        ${name },${name2 }<br>
        <c:out value="${ name}"></c:out>,<c:out value="${ name2}"></c:out>
        <!-- 上面兩個輸出是有區別的,第一個是瀏覽器翻譯輸出,第二行的輸出是原樣輸出-->
        <br/>
        <!-- 如果想第二種輸出也讓瀏覽器翻譯要設置escapexml屬性  默認是true不翻譯-->
        <c:out value="${name }" escapeXml="false"  ></c:out>,
        <c:out value="${name2 }" escapeXml="false"></c:out>
        <br/>
        <!-- c:if -->
        <c:if test="${list[2].age>20 }" var="boo" scope="session">
            這正是我要的if結果
        </c:if>
        <!-- 聲明的boo只有當下面要用的時候纔有意義 -->
        <c:if test="${!boo }">
            這是當上面boo條件不滿足的時候才輸出
        </c:if>
        <!-- c:forEach遍歷 -->
        <%
            List list2 = new ArrayList();
            list2.add("aaaaaa");
            list2.add("bbbbbb");
            list2.add(1111111);
            list2.add(33333333);
            request.setAttribute("list2", list2);
        %>
        <br/>
        <br/>
        <c:forEach items="${list2 }" var="im">
        ${im },
        </c:forEach>
        <%
            Map<String,Object> map= new HashMap<String,Object>();
            map.put("name", "利兒");
            map.put("age", 24);
            map.put("b-f", "軍街");
            request.setAttribute("map", map);
         %>
        <br/>
        <c:forEach items="${map }" var="im">
            ${im.key }=${im.value }<br/>
        </c:forEach>
        <br/>
        <%
            String strs ="aa,bb,cc,oo,kk";
            request.setAttribute("strs", strs);
         %>
        <c:forEach items="${strs }" var="im">
            ${im },,
        </c:forEach>    
        <br/>   
        <h3>forEach中的varStatus屬性:index:元素下標  count:統計個數</h3>
        <c:forEach items="${strs }" var="im" varStatus="idx">
            ${im },index:${idx.index },count:${idx.count }<br/>
        </c:forEach>
        <br/>
        <h3>forEach中的普通循環功能,主要用來控制次數 begin-end  step:間隔數</h3>       
            <c:forEach begin="10"   end="18"    var="i" step="2" >
                ${i },,
            </c:forEach>
        <br/>
        <!-- c:set 用於設置屬性,默認作用域pageScope -->        
        <c:set var="aa" value="123456"  >
        </c:set>
        aa:${aa }
        <br/>
        <c:set var="aa" value="456456" scope="request" >
        </c:set>
        aa:${requestScope.aa }
        <br/>
        <!-- c:remove 刪除屬性,默認作用域:pageScope,request等4個容器中的都會被刪除 -->
        <%--  如果下面的沒有設置屬性,則所有的aa屬性都會被刪除--%>
        <c:remove var="aa" scope="request"/>
        aa:${aa }
        <br/>
        aa:${requestScope.aa }
        <br/>
        <br/>
        <!-- c:choose,c:when,c:otherwise  類似Java中的switch-case-default且每項自動帶break -->
        <c:set var="score" value="85" >
        </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:otherwise>
            不行
            </c:otherwise>
        </c:choose>

        <br/>

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

        <!-- c:import 導入資源,相當於動態包含,共享同一個request-->
        <br/>
        導入資源:
        <c:import url="/jsps/b.jsp"></c:import>

        <br/>
        <br/>
        <!-- c:redirect 重定向,相當於response.sendRedirect(...) -->       
        <%--
        <c:redirect url="/jsps/aa.jsp">
        </c:redirect>
         --%>
        <br/>
        <br/>
        <h2>以下演示JSTL中的國際化--I18N </h2>
        <a href="<c:url value='/jsps/i18n.jsp'/>">演示JSTL中的國際化--I18N </a>        
        <br/>
        <br/>

  </body>
</html>

c.jsp

<%@page import="cn.hncu.elWeb.domain.User"%>
<%@ 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>
        <h2>c.jsp頁面</h2>
        <h3>演示從session中拿資源aaa</h3>
        <fmt:message key="address" bundle="${aaa }"></fmt:message>


  </body>
</html>

cn.hncu.elWeb.domain.user

package cn.hncu.elWeb.domain;

public class User {
    private String name;
    private Integer age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }

    public User() {
    }
    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return "User [name=" + name + ", age=" + age + "]";
    }

}

i18nDemo

package cn.hncu.i18b;

import java.util.Locale;
import java.util.ResourceBundle;

public class i18nDemo {

    public static void main(String[] args) {
        //參數是:baseName-- 本例指的是資源文件名是: msg**.properties
        //ResourceBundle rd = ResourceBundle.getBundle("msg");//讀取的是:msg_zh_CN.properties
//      ResourceBundle rd = ResourceBundle.getBundle("msg");
        ResourceBundle rd = ResourceBundle.getBundle("msg",Locale.FRANCE); //讀取的是:msg_en_US.properties
        String str1 = rd.getString("welcome");
        String str2= rd.getString("time");
        System.out.println(str1+","+str2);
    }

}

a_en_US.properties

address=beijing

a_zh_CN.properties

address=\u5317\u4EAC

msg_en_US.properties

welcome=welcome
time=this time is 

msg_zh_CN.properties

welcome=\u6B22\u8FCE\u8FDB\u5165\u6B64\u9875\u9762
time=\u73B0\u5728\u65F6\u95F4\u662F

msg.properties

welcome=welcome
time=this time is 
發佈了104 篇原創文章 · 獲贊 29 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章