前面爲JSTL中的經常使用EL函數,後面的爲具體演示實例!html
JSTL(Java Standard Tag Library) –Java標準標籤庫。
SUN公司制定的一套標準標籤庫的規範。
JSTL標籤庫,是由一些Java類組成的。java
JSTL –Core 核心標籤庫。 重點
JSTL – I18N - 國際化標籤庫。Internationalization- I18N
JSTL – SQL – 數據庫操做標籤(有悖於MVC設計模式),如今都不用這個。
JSTL - Functions – 函數庫。
JSTL - XML ,對XML的操做(同SQL標籤-有悖於MVC設計模式),如今都不用這個。數據庫
使用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(‘’..)
JSTL標籤-out:markdown
屬性名 可選值 說明
value EL表達式、java表達式、或直接字符串 須要輸出的內容
escapeXml true | false 是否將html轉成<>&quat;等輸出。
default 默認值 若是value內容不存在時則輸出默認值
<c:out value=…/>用於在頁面上輸出結果。
<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等標籤轉換成<等轉換元素,示例:
<%
String name="<font color='red'>Red</font>";
pageContext.setAttribute("name",name);
%>
<c:out value=「${name}」 escapeXml=「false」></c:out> 不對xml或html進行轉換,直接輸出,這樣就會在頁面上看到紅色的Red字符,由於瀏覽器會解析html數據。
<%@ 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>
<h1>JSTL技術演示</h1>
<!-- c:out -->
<% pageContext.setAttribute("name", "Tom"); pageContext.setAttribute("name2", "<font color='red'>Tom</font>"); %>
<c:out value="${name}"></c:out><br/>
${name}<br/>
<c:out value="${name2}" escapeXml="true" /><br/>
${name2}<br/>
<!-- c:if -->
<c:if test="${20>10}" var="boo" scope="session">
OKOK<br/>
</c:if>
<!-- 想要用if-else 就這樣再用一句 -->
<c:if test="${!boo}">
NONO<br/>
</c:if>
<br/><!-- 用El中的問號表達式能輸出簡單的if-else -->
${ 20>10?"yes":"no" }<br/>
<hr/>
<!-- forEach -->
<% List list = new ArrayList(); list.add("aaaaa111"); list.add("bbbbb222"); list.add(200); list.add(100); request.setAttribute("list", list); %>
<table border="1px">
<c:forEach items="${list}" var="li">
<tr> <td>:: ${li}</td> </tr>
</c:forEach>
</table>
<% Map<String,Object> map = new HashMap<String,Object>(); map.put("name", "Pose"); map.put("age", 55); map.put("tel", "12345678911"); pageContext.setAttribute("map", map); %>
<br/>
<c:forEach items="${map}" var="m">
${m.key} = ${m.value}<br/>
</c:forEach>
<% String strs[] = {"aaa","bbb","ccc","ddd"}; pageContext.setAttribute("strs", strs); %>
<br/>
<c:forEach items="${strs}" var="str">
${str},
</c:forEach>
<br/>
<h3>看看forEach標籤中的varStatus屬性---idx.index是輸出元素的下標(從begin開始的),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="40" var="i" step="2" varStatus="idx">
${i} -- ${idx.index} -- ${idx.count}<br/>
</c:forEach>
<br/>
<!-- c:set設置屬性,默認做用域:pageScope -->
<c:set var="aa" value="abc123" />
<c:set var="aa" value="cccc222" scope="request"/>
${aa},${requestScope.aa}<br/>
<br/>
<!-- c:remove 刪除屬性,默認做用域:pageScope,request等4個容器! -->
<!-- 也就是,若是不設置做用域(scope屬性),則那4個容器中的屬性都會被清除,若是寫了,則只清除指定做用域的屬性 -->
<c:remove var="aa" scope="request"/>
${aa},${requestScope.aa}<br/>
<!-- c:choose,c:when,c:otherwise -->
<!-- 相似Java中的switch-case-default並且每項自動帶break -->
<c:set var="score" value="98"></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,ds,sdf,df,dddd,sss" delims="," var="str">
${str}
</c:forTokens>
<br/>
<!-- c:import 導入資源,至關於動態包含,共享同一個request,可是在不一樣的類 -->
<c:import url="/jsps/b.jsp"></c:import>
<br/>
<!-- c:redirect 重定向,至關於response.sendRedirect(...) -->
<%-- <c:redirect url="/jsps/a.jsp"></c:redirect> --%>
<br/><br/><br/><br/>
</body>
</html>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<h3>這是被動態導入的頁面內容...b.jsp...</h3>
</body>
</html>
a.jsp就不寫出來了,那個只是爲了演示一些JSTL的重定向。a.jsp的源碼沒意義。session
在演示JSTL的國際化以前,咱們先用java的國際化過渡下~架構
首先在src目錄下配好這3個文件:app
依次設置值:(空行表示是另一個文件中了,一共3文件)
welcome=welcome you---US
time=this time is:---US
welcome=\u6B22\u8FCE\u4F60---CN
time=\u73B0\u5728\u65F6\u95F4\u662F\uFF1A---CN
welcome=welcome
time=this time is:
package cn.hncu.i18n;
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");//輸出:歡迎你---CN:::如今時間是:---CN //讀取的是:msg_zh_CN.properties
//ResourceBundle rd = ResourceBundle.getBundle("msg",Locale.US);//輸出:welcome you---US:::this time is:---US //讀取的是:msg_en_US.properties
ResourceBundle rd = ResourceBundle.getBundle("msg",Locale.CANADA);////輸出:歡迎你---CN:::如今時間是:---CN //讀取的是:msg_zh_CN.properties
//由於咱們的是中文系統.若是沒找到對應語種的資源文件(若是不存在時,會根據系統的國家語種再找一遍,若是尚未),則是讀取默認的:msg.properties
System.out.println(rd.getString("welcome")+":::"+rd.getString("time"));
}
}
經過上面Java的演示咱們應該猜獲得,SJTL的國際化應該和這個其實差不了多少的,畢竟jsp最後是翻譯成Java的。
I18N是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();
而後能夠經過如下方法輸出語言和國家:
getLanguage
getCountry
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
再準備2個資源文件:
裏面分別只設:
address=beijing
address=\u5317\u4EAC
<%@ 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"></fmt:message>
<fmt:message key="time" /> 2016-**-**
<br/><hr/>
<!-- 相比上面的版本,把國家語種用參數來進行傳遞了 -->
<a href="?loc=en_US">English</a><!-- 這裏href="?***" 直接加問號,就表示當前頁面 -->
<a href="?loc=zh_CN">中文</a>
<fmt:setLocale value="${param.loc}"/>
<fmt:setBundle basename="msg"/>
張三,<fmt:message key="welcome"></fmt:message>
<fmt:message key="time" /> 2016-**-**
<br/><hr/>
<!-- 再演示一下多個資源的狀況,第二個資源及之後都必須取別名(變量名)。前面沒取變量名的那個叫默認資源 -->
<fmt:setBundle basename="a" var="aaa" scope="session"/>
<!-- 若是有多個頁面須要使用這個,那麼把做用域設置成session就能夠了 -->
張三,<fmt:message key="welcome"></fmt:message>
<fmt:message key="time" /> 2016-**-**
<br/><br/>
<%-- 若是從非默認的資源中讀取,那麼得指定資源的別名這裏是:aaa,得設置成:bundle="${aaa}"。若是沒有指定名稱,那麼就是從默認的資源讀取 --%>
<fmt:message key="address" bundle="${aaa}"></fmt:message>
<br/><br/>
<a href='<c:url value="/jsps/c.jsp"></c:url>'>到網站的其餘頁面去看看~</a>
</body>
</html>
<%@ 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的資源中讀取 -->
<fmt:message key="address" bundle="${aaa}"></fmt:message>
<!-- i18n中aaa設的loc是什麼這裏就顯示那個國家語言的資源文件 -->
</body>
</html>
選擇中文:
選擇中文:
固然,如今不少網站都不是這樣來作國際化的,而是準備多套版本的網站,你點什麼語言,我就給你跳到對應語言的網站去。
這樣有一個很明顯的很差,若是語種不少呢?難道準備那麼多套網站,顯然是不合理的,而用I18N只須要咱們有一個網站模板,讀取屬性,配置對應的語種資源文件就能夠了。在語種不少的狀況下方便不少,架構固然不管是什麼狀況下,都是這個好些的。
因爲在JSP頁面中顯示數據時,常常須要對顯示的字符串進行處理,SUN公司針對於一些常見處理定義了一套EL函數庫供開發者使用。
這些EL函數在JSTL開發包中進行描述,所以在JSP頁面中使用SUN公司的EL函數庫,須要導入JSTL開發包,並在頁面中導入EL函數庫,
以下所示:(咱們徹底能夠將JSTLl理解成EL函數庫)
在頁面中使用JSTL定義的EL函數:
<%@taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
fn:toLowerCase函數將一個字符串中包含的全部字符轉換爲小寫形式,並返回轉換後的字符串,它接收一個字符串類型的參數,例如
fn:toLowerCase(「Www.IT315.org」) 的返回值爲字符串「www.it315.org」
fn:toLowerCase(「」)的返回值爲空字符串
fn:toUpperCase函數將一個字符串中包含的全部字符轉換爲大寫形式,並返回轉換後的字符串,它接收一個字符串類型的參數。例如:
fn:toUpperCase(「Www.IT315.org」) 的返回值爲字符串「WWW.IT315.ORG」
fn:toUpperCase(「」)的返回值爲空字符串
fn:trim函數刪除一個字符串的首尾的空格,並返回刪除空格後的結果字符串,它接收一個字符串類型的參數。須要注意的是,fn:trim函數不能刪除字符串中間位置的空格。
例如,fn:trim(」 www.it 315.org 「) 的返回值爲字符串「www.it 315.org」。
fn:length函數返回一個集合或數組對象中包含的元素的個數,或返回一個字符串中包含的字符的個數,返回值爲int類型。
fn:length函數接收一個參數,這個參數能夠是<c:forEach>
標籤的items屬性支持的任何類型,包括任意類型的數組、java.util.Collection、java.util.Iterator、java.util.Enumeration、java.util.Map等類的實例對象和字符串。
若是fn:length函數的參數爲null或者是元素個數爲0的集合或數組對象,則函數返回0;若是參數是空字符串,則函數返回0。
fn:split函數以指定字符串做爲分隔符,將一個字符串分割成字符串數組並返回這個字符串數組。
fn:split函數接收兩個字符串類型的參數,第一個參數表示要分割的字符串,第二個參數表示做爲分隔符的字符串。
例如,fn:split(「www.it315.org」, 「.」)[1]的返回值爲字符串「it315」。
fn:join函數以一個字符串做爲分隔符,將一個字符串數組中的全部元素合併爲一個字符串並返回合併後的結果字符串。fn:join函數接收兩個參數,第一個參數是要操做的字符串數組,第二個參數是做爲分隔符的字符串。
若是fn:join函數的第二個參數是空字符串,則fn:join函數的返回值直接將元素鏈接起來。
例如:
假設stringArray是保存在Web域中的一個屬性,它表示一個值爲{「www」,」it315」,」org」}的字符串數組,則fn:join(stringArray, 「.」)返回字符串「www.it315.org」
fn:join(fn:split(「www,it315,org」, 「,」), 「.」) 的返回值爲字符串「www.it315.org」
fn:indexOf函數返回指定字符串在一個字符串中第一次出現的索引值,返回值爲int類型。
fn:indexOf函數接收兩個字符串類型的參數,若是第一個參數字符串中包含第二個參數字符串,那麼,無論第二個參數字符串在第一個參數字符串中出現幾回,fn:indexOf函數老是返回第一次出現的索引值;
若是第一個參數中不包含第二個參數,則fn:indexOf函數返回-1。
若是第二個參數爲空字符串,則fn:indexOf函數老是返回0。
例如:
fn:indexOf(「www.it315.org」,」t3」) 的返回值爲5
fn:contains函數檢測一個字符串中是否包含指定的字符串,返回值爲布爾類型。
fn:contains函數在比較兩個字符串是否相等時是大小寫敏感的。
fn:contains函數接收兩個字符串類型的參數,若是第一個參數字符串中包含第二個參數字符串,則fn:contains函數返回true,不然返回false。
若是第二個參數的值爲空字符串,則fn:contains函數老是返回true。實際上,fn:contains(string, substring)等價於fn:indexOf(string, substring) != -1。
若是想用忽略大小的EL函數:
那麼就用:fn:containsIgnoreCase –參數和fn:contains函數同樣
fn:startsWith函數用於檢測一個字符串是不是以指定字符串開始的,返回值爲布爾類型。
fn:startsWith函數接收兩個字符串類型的參數,若是第一個參數字符串以第二個參數字符串開始,則函數返回true,不然函數返回false。若是第二個參數爲空字符串,則fn:startsWith函數老是返回true。例如:
fn:startsWith(「www.it315.org」,」it315」)的返回值爲false
與之對應的EL函數:fn:endsWith
fn:replace函數將一個字符串中包含的指定子字符串替換爲其它的指定字符串,並返回替換後的結果字符串。fn:replace方法接收三個字符串類型的參數,第一個參數表示要操做的源字符串,第二個參數表示源字符串中要被替換的子字符串,第三個參數表示要被替換成的字符串。例如:
fn:replace(「www it315 org」, 」 「, 「.」)的返回值爲字符串「www.it315.org」
fn:substring函數用於截取一個字符串的子字符串並返回截取到的子字符串。fn:substring函數接收三個參數,
第一個參數是用於指定要操做的源字符串,
第二個參數是用於指定截取子字符串開始的索引值,
第三個參數是用於指定截取子字符串結束的索引值,第二個參數和第三個參數都是int類型,其值都從0開始。例如:
fn:substring(「www.it315.org」, 4, 9) 的返回值爲字符串「it315」
fn:substringAfter函數用於截取並返回一個字符串中的指定子字符串第一次出現以後的子字符串。fn:substringAfter函數接收兩個字符串類型的參數,第一個參數表示要操做的源字符串,第二個參數表示指定的子字符串,例如:
fn:substringAfter(「www.it315.org」, 「.」)的返回值爲字符串「it315.org」。
與之對應的EL函數爲:fn:substringBefore
這裏我只演示幾個經常使用的函數:
<%@ 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/functions" prefix="fn" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
<c:set value="hello word function" var="str"></c:set>
${fn:indexOf(str,"wor")}<br/><br/>
${fn:contains(str,"Func")}<br/><br/>
${fn:containsIgnoreCase(str,"Func")}<br/><br/>
${fn:trim(str).length()}<br/>
</body>
</html>
${fn:indexOf(str,"wor")} //從0開始第6個開始匹配上了wor,因此輸出是:6 ${fn:contains(str,"Func")} //區別大小寫,str中不包含字符串"Func" ,輸出爲:false ${fn:containsIgnoreCase(str,"Func")}//不區分大小寫,str中包含字符串"func",輸出位:true ${fn:trim(str).length()} //trim()返回去掉字符串首尾的空格length()返回字符串的長度"hello word function"---19