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