一很钓、jsp介紹
jsp作用
jsp全稱java server pages(java服務(wù)器頁面),本質(zhì)是一個servlet纸淮。
它是在傳統(tǒng)的網(wǎng)頁HTML文件(*.htm,*.html)中插入Java程序段(Scriptlet)和JSP標記(tag),從而形成JSP文件,后綴名為(*.jsp)袱院。
jsp作用:將內(nèi)容的生成和顯示進行分離 屎慢。
用JSP技術(shù),Web頁面開發(fā)人員可以使用HTML或者XML標識來設(shè)計和格式化最終頁面忽洛,并使用JSP標識或者小腳本來生成頁面上的動態(tài)內(nèi)容
jsp原理
jsp腳本
有三個基本的腳本元素腻惠,作用是使JAVA代碼可以直接插入到HTML代碼中。
聲明標簽
格式:<%! int a = 1; %>
作用:聲明的變量在類的成員位置上
腳本片斷
格式:<% int a = 1; out.println(a); %>
作用:內(nèi)容會生成在_jspService()方法中
腳本表達式
格式:<%= "hello " + a %>
作用:它就相當于是out.println()將內(nèi)容直接輸出到頁面中欲虚,注意表達式不能以分號結(jié)尾
jsp注釋
在jsp頁面中可以使用三種注釋
可以使用html中注釋
<!-- html的注釋 -->
可以對jsp腳本內(nèi)容使用java注釋
//單行注釋 /* 多行注釋 */ /**文檔注釋*/
可以使用jsp注釋(推薦)
<%-- jsp注釋 --%>
二集灌、 jsp指令
jsp指令介紹
當我們創(chuàng)建一個jsp頁面時,在頁面第一行有一段代碼如下:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
這個就是指令复哆,對于指令它有以下作用
a. 用于指示JSP執(zhí)行某些步驟
b. 用于指示JSP表現(xiàn)特定行為
jsp指令格式
格式:
<%@指令名 attr1=”” attr2=””%>
注意:
其中attr1和attr2表示指令中的屬性欣喧,通常我們將JSP指令寫在JSP文件的的最上方,但是這不是必須的梯找。
jsp指令分類
JSP中有三大指令续誉,分別是以下三個:
page
include
taglib
其中這三個指令中,page是最復雜的,我們會詳細講解(導入類,編碼的設(shè)置等等)初肉;include指令表示靜態(tài)包含酷鸦,我們之前學習的請求包含屬于動態(tài)包含;taglib指令是用來導入標簽庫。
3. jsp指令-page
重點屬性:
import
作用:在jsp頁面上導包操作.
這個屬性可以有多個.
pageEncoding
作用:指定當前jsp頁面的編碼臼隔。這個編碼是給服務(wù)器看的嘹裂,服務(wù)器需要知道當前頁面的編碼,否則服務(wù)器無法正確的把jsp翻譯成Java文件摔握。
contentType
在jsp文件中有如下指令:
<%@page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
其中contentType屬性的作用等同于response.setContentType(“text/html;charset=utf-8”)
的作用寄狼。response的setContentType()方法這里我們就不再多說,當我們在jsp文件中提供了contentType屬性氨淌,那么jsp對應(yīng)的java文件中就會存在response.setContentType(“text/html;charset=utf-8”)
這句代碼泊愧。contentType屬性的默認值是“text/html; charset=ISO-8859-1”,但是我們知道iso-8859-1并不支持中文盛正,所以我們需要將charset的值修改為“utf-8“删咱。
pageEncoding與contentType的區(qū)別與聯(lián)系
pageEncoding與contentType都是page指令的屬性,它們都是用來設(shè)置編碼豪筝,有如下聯(lián)系:
如果這兩個屬性只提供了其中一個痰滋,那么沒有提供的那個屬性的編碼值就是提供的這個屬性的編碼值,例如:在jsp頁面中設(shè)置了contentType=”text/html;charset=utf-8”续崖,那么沒有設(shè)置的pageEncoding的值就為utf-8敲街,反之亦然;
如果兩個屬性都沒有提供严望,那么兩者的默認編碼就是ISO-8859-1多艇。
根據(jù)對這兩個屬性的講解,它們有如下區(qū)別:
pageEncoding是設(shè)置當前頁面的編碼像吻,該編碼是給服務(wù)器看的墩蔓,可以讓服務(wù)器正確的將jsp文件翻譯成Java文件;
contentType有兩個作用:一是設(shè)置響應(yīng)字符流的編碼萧豆,二是設(shè)置Content-Type響應(yīng)頭奸披,即通知瀏覽器使用什么編碼方式解碼響應(yīng)信息。
其他屬性
language
代表在jsp腳本中可以寫的語言, 只有一個值 java
extends
它用于設(shè)置jsp翻譯后的java類的父類. 要求必須是HttpServlet或其子類.
session
面上是否禁用session涮雷≌竺妫可取值為true/false 如果值為false,在頁面上不能使用session。
isELIgnored
用是否忽略el表達式.可取值為true/false 如果值為true,那么頁面上的el表達式就不會被解析.
autoFlush與buffer
用于設(shè)置jsp中out流的默認緩沖區(qū)大小以及是否自動刷新.
errorPage
設(shè)置錯誤頁面洪鸭,當jsp中如果出現(xiàn)了異常样刷,會自動跳轉(zhuǎn)到指定的錯誤頁面
isErrorPage
指示當前頁面是一個錯誤頁面,這時就可以使用一個內(nèi)置對象 exception
通過這個內(nèi)置對象就可以獲取異常信息.
4. jsp指令-include和taglib
include
作用
include指令的作用是在JSP頁面中靜態(tài)包含一個文件览爵,同時由JSP解析包含的文件內(nèi)容
格式
<%@ include file=“filename” %>
功能分析
包含的是目標文件的源碼置鼻;包含過來,一起翻譯
main.jsp中的代碼
<%
String s = “abc”;
%>
<%include file=“part.jsp” %>
part.jsp中的代碼
<%=s %> 沒有定義變量s
盡管part.jsp本身沒有錯誤但是運行main.jsp就可以正確引入part.jsp
taglib
作用
作用:是用于導入標簽庫.
格式
<%@taglib prefix="" uri="" %>
uri 標簽文件的URI地址
prefix 標簽組的命名空間前綴
5. jsp內(nèi)置對象
jsp九個內(nèi)置對象及其類型
內(nèi)置對象 | 類型 |
---|---|
request | HttpServletRequest |
response | HttpServletResponse |
session | HttpSession |
application | ServletContext |
config | ServletConfig |
page | this(Servlet) |
pageContext | PageContext |
exception | Throwable |
out | JspWriter |
jsp九個內(nèi)置對象的創(chuàng)建過程
我們可以創(chuàng)建一個demo1.jsp頁面蜓竹,啟動服務(wù)器箕母,在瀏覽器中訪問 demo1.jsp頁面储藐,在tomcat下的work目錄中查找到它翻譯后的demo1_jsp.java文件,在java文件中我們可以查找到每一個內(nèi)置對象的創(chuàng)建嘶是。
request,response這兩個對象是jspService的參數(shù)
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
java.lang.Throwable exception = org.apache.jasper.runtime.JspRuntimeLibrary.getThrowable(request);
if (exception != null) {
response.setStatus(javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
}
注意:exception對象只有在jsp頁面上設(shè)置了page指令的isErrorPage才會有exception對象钙勃。
jsp中的四個域?qū)ο?/strong>
jsp有四個域?qū)ο螅謩e是:
application:域范圍是整個應(yīng)用聂喇;
session:域范圍是整個會話辖源,注意一個會話中只有一個用戶,如果要統(tǒng)計站點的訪問次數(shù),使用的域是ServletContext希太,因為這個時候統(tǒng)計的是多個用戶克饶,而非一個用戶;
request:域范圍是整個請求鏈誊辉;
pageContext:域范圍是一個jsp頁面矾湃,在一個頁面中存數(shù)據(jù)再取數(shù)據(jù)沒有任何意義,所以這里所說的域指的是在當前jsp頁面和當前jsp頁面中使用的標簽之間共享數(shù)據(jù)芥映。
6. jsp內(nèi)置對象pageContext的作用
獲取其他內(nèi)置對象
可以通過pageContext對象獲取jsp中其他的內(nèi)置對象. PageContext類中定義了如下八個方法:getPage()洲尊、getRequest()远豺、getResponse()奈偏、getServletConfig()、getServletContext()躯护、getException()惊来、getSession()等方法,其中g(shù)etOut()放是在其父類中定義的棺滞,有了這些方法裁蚁,pageContext對象自然能夠獲取其他八個內(nèi)置對象了。
操作四個域?qū)ο?/strong>
pageContext也是一個域?qū)ο?所以他有以下方法:
void setAttribute(String name,Object value)
Object getAttribute(String name);
Void removeAttribute(String name);
我們還可以利用以下方法操作其他域中的對象:
Object getAttribute(String name, int scope);
該方法的第一個參數(shù)是域?qū)傩缘拿Q继准,第二個參數(shù)指定是從那個域中取出域?qū)傩裕?br>
在PageContext中已經(jīng)定義了如下幾個靜態(tài)常量作為scope的可選值:
int APPLICATION_SCOPE
:表示從application域中獲取數(shù)據(jù)枉证;
int PAGE_SCOPE
:表示從pageContext域中獲取數(shù)據(jù);
int REQUEST_SCOPE
:表示從request域中獲取數(shù)據(jù)移必;
int SESSION_SCOPE
:表示從session域中獲取數(shù)據(jù)室谚。
void setAttribute(String name,Object value,int scope);
該方法的第一個參數(shù)指的是域?qū)傩缘拿Q,第二參數(shù)指的是域?qū)傩缘闹荡薇茫谌齻€參數(shù)指定域?qū)傩员4娴挠蛎氤啵瑂cope的取值同上;
void removeAttribute(String name,int scope);
該方法的第一個參數(shù)指的是域?qū)傩缘拿Q憎瘸,第二個參數(shù)指的是將指定域?qū)傩詮哪膫€域中移出入篮,scope的取值同上兜畸;
便捷查詢域中數(shù)據(jù)
PageContext類的父類中定義了如下方法:
Object findAttribute(String name)
:該方法是從jsp的四個域pageContext盹沈、request、session动壤、application依次查找指定名稱的域?qū)傩裕绻业骄屯V顾亲觯@說明如果這四個域中存在同名的屬性线婚,那么返回的數(shù)據(jù)是從page范圍中獲取的。即表示誰的域范圍越小盆均,誰的優(yōu)先級越高塞弊。
7. jsp動作標簽
JSP標簽也稱之為Jsp Action(JSP動作)元素,它用于在Jsp頁面中提供業(yè)務(wù)邏輯功能泪姨,避免在JSP頁面中直接編寫java代碼游沿,造成jsp頁面難以維護。
常用的jsp標簽
jsp:forward
<jsp:forward>標簽是用來做請求轉(zhuǎn)發(fā)肮砾,它與RequestDispatcher接口的forward()方法一樣诀黍,唯一不同的是它是在jsp頁面中使用。
jsp:include
<jsp:include>標簽的作用使用來包含其他jsp頁面仗处,之前學習的include指令屬于靜態(tài)包含眯勾,而include動作標簽是動態(tài)包含,它和RequestDispatcher接口的include()方法一樣婆誓,是運行級別的包含
jsp:param
<jsp:param>標簽作為<jsp:forward>標簽和<jsp:include>標簽的子標簽吃环,用來給轉(zhuǎn)發(fā)或包含的頁面?zhèn)鬟f數(shù)據(jù)。
靜態(tài)包含與動態(tài)包含的區(qū)別
include標簽與inclue指令區(qū)別:
include指令是靜態(tài)包含洋幻,包含文件中包含了被包含文件的內(nèi)容.
include標簽是動態(tài)包含郁轻,它包含的是被包含文件執(zhí)行后的結(jié)果.include指令不能帶參數(shù)
include標簽是可以帶參數(shù)的
三、EL表達式
EL是Expression Language的縮寫文留,它是jsp內(nèi)置的表達式語言好唯,從jsp2.0開始,就不讓再使用java腳本燥翅,而是使用el表達式或動態(tài)標簽來代替java腳本骑篙。EL表達式的格式如下:
${表達式}
EL表達式代替的是java腳本中的<%= …%>,也就是說EL表達式也是向瀏覽器端輸出數(shù)據(jù)森书。例如${1+2}會向瀏覽器端輸出3靶端。
EL表達式的作用
為了使JSP寫起來更加簡單,更加安全,可以通過EL表達式來替換我們jsp頁面上的腳本
EL主要作用:
- 獲取數(shù)據(jù):
EL表達式主要用于替換JSP頁面中的腳本表達式拄氯,以從各種類型的web域 中檢索java對象躲查、獲取數(shù)據(jù)。(某個web域 中的對象译柏,訪問javabean的屬性镣煮、訪問list集合、訪問map集合鄙麦、訪問數(shù)組) - 執(zhí)行運算:
利用EL表達式可以在JSP頁面中執(zhí)行一些基本的關(guān)系運算典唇、邏輯運算和算術(shù)運算镊折,以在JSP頁面中完成一些簡單的邏輯運算。${user==null} - 獲取web開發(fā)常用對象
EL 表達式定義了一些隱式對象介衔,利用這些隱式對象恨胚,web開發(fā)人員可以很輕松獲得對web常用對象的引用,從而獲得這些對象中的數(shù)據(jù)炎咖。 - 調(diào)用Java方法
EL表達式允許用戶開發(fā)自定義EL函數(shù)赃泡,以在JSP頁面中通過EL表達式調(diào)用Java類的方法。
EL表達式使用時注意事項
EL表達式是JSP 2.0(JavaEE1.4)規(guī)范中的一門技術(shù) 乘盼。因此升熊,若想正確解析EL表達式,需使用支持Servlet2.4/JSP2.0技術(shù)的WEB服務(wù)器绸栅。
注意:有些Tomcat服務(wù)器如不能使用EL表達式
(1)升級成tomcat6
(2)在JSP中加入<%@ page isELIgnored="false" %>
以下為jsp,servlet,javaee,jdk版本之間的對應(yīng)關(guān)系
jsp | javaee | servlet | tomcat | jdk |
---|---|---|---|---|
Jsp2.0 | javaee1.4 | servlet2.4 | tomcat5.x | jdk1.4 |
Jsp.2.0/2.1 | javaee5.0 | servlet2.5 | tomcat6.0 | jdk1.5 |
Jsp2.1 | javaee6.0 | servlet3.0 | tomcat7.x | jdk1.6 |
1. EL表達式獲取數(shù)據(jù)
表達式之域查找
- pageContext--------------------${pageScope.xxx}
- request--------------------------${requestScope.xxx}
- session--------------------------${sessionScope.xxx}
- application---------------------${applicationScope.xxx}
通過el獲取時级野,如果沒有查找到,會返回"".除了上面的獲取方式外還有一種,例如
${requestScope[“xxx”]}
關(guān)于.與[ ]區(qū)別
[ ]與.在使用方式上是一樣的.但是如果名稱中包含了"."等特殊字符粹胯,就必須使用[ ]來獲取.
例如
request.setAttribute("login.message", "登錄失敗");
${requestScope.login.message} 錯誤的
${requestScope["login.message"] }正確的
如果沒有寫范圍蓖柔,會默認從page,request,session.application依次查找
EL表達式獲取復雜數(shù)據(jù)
獲取數(shù)組中數(shù)據(jù)
例如:${數(shù)組名稱[索引] }
獲取List中數(shù)據(jù)
例如:${集合名稱[索引]}
獲取Map中數(shù)據(jù)
例如:${集合名稱.key名稱}
EL表達式之javabean導航
如果在域中保存的是javaBean對象,那么也可以使用EL表達式來訪問javaBean的屬性风纠,因為EL表達式只做讀操作况鸣,所以javaBean一定要為屬性提供get方法,而對set方法沒有要求议忽。使用EL表達式獲取javaBean屬性就是javaBean導航懒闷。
3. EL表達式執(zhí)行運算
常見的運算符
empty我們在開發(fā)中檢查對象是否為null或“空”或判斷容器size是否為0
注意事項:
1 .EL表達式支持三元運算符
- EL表達式不可以嵌套
${a+$十减}這種是不允許的栈幸。 - EL中的加號問題:
EL表達式中加號兩邊必須是數(shù)字或者字符串形式的數(shù)字
4. EL表達式內(nèi)置對象
EL表達式的11個內(nèi)置對象。11個內(nèi)置對象如下所示:
pageScope
requestScope
sessionScope
applicationScope
param
paramValues
header
headerValues
initParam
cookie
pageContext
其中帮辟,pageScope速址,requestScope,sessionScope由驹,applicationScope是域相關(guān)的內(nèi)置對象芍锚,這里我們就不再多說。這11個內(nèi)置對象中蔓榄,有10個內(nèi)置對象的類型是Map類型并炮,只有pageContext的類型不是Map類型,它的類型是PageContext甥郑。
pageContext
EL表達式的11個內(nèi)置對象中逃魄,有10個內(nèi)置對象的類型是Map類型,只有pageContext的類型是PageContext澜搅。它的使用類似于我們jsp的內(nèi)置對象pageContext,. 通過pageContext對象可以獲取其他內(nèi)置對象的任意的屬性值伍俘。
常用操作:${pageContext.request.contextPath}
關(guān)于請求參數(shù)相關(guān)內(nèi)置對象的介紹
請求參數(shù)相關(guān)的內(nèi)置對象是:
param:該內(nèi)置對象的類型是Map<String,String>邪锌,可以用來獲取值為單值的請求參數(shù),其中key指的是請求參數(shù)的名稱癌瘾,value指的是請求參數(shù)的值觅丰,使用param獲取請求參數(shù)與request.getParameter()方法一樣。
paramValues:該內(nèi)置對象的類型是Map<String,String[]>妨退,可以用來獲取值為多值的請求參數(shù)妇萄,其中key是參數(shù)名,value是多個參數(shù)值組成的字符串數(shù)組咬荷。
注意嚣伐,在使用EL獲取參數(shù)時,如果參數(shù)不存在萍丐,返回的是空字符串轩端,而不是null。這一點與使用request.getParameter()方法是不同的逝变。
關(guān)于請求頭相關(guān)內(nèi)置對象的介紹
與請求頭相關(guān)的內(nèi)置對象是:
header:該內(nèi)置對象的類型是Map<String,String>基茵,用來獲取值為單值的請求頭信息,其中key代表的是請求頭名稱壳影,value代表的是請求頭的值拱层;
headerValues:該內(nèi)置對象的類型是Map<String,String[]>,用來獲取值為多值的請求頭信息宴咧,key代表的是請求頭名稱根灯,value代表的是請求頭的多個值。
關(guān)于全局初始化參數(shù)的內(nèi)置對象的介紹
我們再學習Servlet時掺栅,講過在web.xml文件中配置全局初始化參數(shù)烙肺,并且全局初始化參數(shù)可以使用ServletContext對象獲取,現(xiàn)在在EL表達式中內(nèi)置了一個與初始化參數(shù)相關(guān)的對象:
initParam:該內(nèi)置對象的類型是Map<String,String>氧卧,用來獲取web.xml文件中<context-param>標簽的參數(shù)值桃笙,其中key代表的是參數(shù)名,value代表的是參數(shù)值沙绝。
關(guān)于cookie相關(guān)內(nèi)置對象的介紹
EL表達式也內(nèi)置一個名為cookie的對象搏明,該內(nèi)置對象與cookie相關(guān),如下:
cookie:該內(nèi)置對象的類型為Map<String,Cookie>闪檬,其中key是Cookie的名字星著,value是Cookie對象本身。
5. EL函數(shù)使用
EL函數(shù)庫是由第三方對EL的擴展粗悯,我們現(xiàn)在學習的EL函數(shù)庫是有JSTL提供的虚循,JSTL我們會在后面的課程中詳解。EL函數(shù)庫就是定義了一些有返回值的靜態(tài)方法,然后通過EL表達式來調(diào)用它們
在jsp頁面中使用taglib指令導入EL函數(shù)庫邮丰,就可以在頁面中使用函數(shù)庫中的方法行您。另外,導入的函數(shù)庫可以使用的前提是剪廉,我們的項目中有相關(guān)的jar包
EL函數(shù)庫使用
要使用EL函數(shù)庫娃循,首先要在jsp文件的上面使用taglib指令導入函數(shù)庫:
<%@ taglib prefix=”fn” uri=”http://java.sun.com/jsp/jstl/functions”%>
其中,uri的值并不是一個網(wǎng)絡(luò)路徑斗蒋,只是在定義函數(shù)庫時捌斧,擬定的一個位置。
下面我們來了解EL函數(shù)庫中的相關(guān)方法泉沾,具體如下:
String toUpperCase(String input)
:把字符串參數(shù)轉(zhuǎn)換成大寫捞蚂,并返回;
String toLowerCase(String input)
:把字符串參數(shù)轉(zhuǎn)換成小寫跷究,并返回姓迅;
int indexOf(String input, String substring)
:返回input中substring出現(xiàn)的索引位置;
boolean contains(String input, String substring)
:查看input中是否包含substring俊马,包含返回true丁存,否則返回false;
boolean containsIgnoreCase(String input, String substring)
:在忽略大小寫的情況下柴我,查看input中是否包含substring解寝,包含返回true,否則返回false艘儒;
boolean startsWith(String input, String substring)
:判斷input是否是以substring為前綴聋伦,如果是就返回true,否則就返回false界睁;
boolean endsWith(String input, String substring)
:判斷input是否是以substring為后綴觉增,如果是就返回true,否則就返回false晕窑;
String substring(String input, int beginIndex, int endIndex)
:以beginIndex為開始值抑片,endIndex為結(jié)束值卵佛,在input上截取子串杨赤;
String substringAfter(String input, String substring)
:獲取input中,substring所在位置后面的字符串截汪;
substringBefore(String input, String substring)
:獲取input中疾牲,substring所在位置前面的字符串;
String escapeXml(String input)
:把input中“<”衙解、“>“阳柔、”&“、”'“蚓峦、“"”進行轉(zhuǎn)義舌剂;
String trim(String input)
:去除input中的前后空格济锄;
String replace(String input, String substringBefore, String substringAfter)
:將input中的substringBefore替換成substringAfter;
String[] split(String input, String delimiters)
:以delimiters為標識分割input霍转,返回一個字符串數(shù)組荐绝;
int length(Object obj)
:可以獲取字符串、數(shù)組避消、各種集合的長度低滩!
String join(String array[], String separator)
:將array數(shù)組中的元素以separator連接起來,返回一個字符串岩喷。
示例代碼
<!-- 導入函數(shù)庫 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!-- 以下為body內(nèi)容,頭部自行添加 -->
<body>
<%
String[] strs = {"a", "b","c"};//定義一個字符數(shù)組
List list = new ArrayList();//定義一個list集合
list.add("a");//向集合中添加一個字符
pageContext.setAttribute("arr", strs);//將字符數(shù)據(jù)以arr的名字保存在page域中
pageContext.setAttribute("list", list);//將list集合以list的名字保存在page域中
%>
${fn:length(arr) }<br/><!--返回arr的長度-->
${fn:length(list) }<br/><!--返回list的長度-->
${fn:toLowerCase("Hello") }<br/> <!-- 將Hello變成小寫 -->
${fn:toUpperCase("Hello") }<br/> <!-- 將Hello變成大寫 -->
${fn:contains("abc", "a")}<br/><!-- 判斷abc中是否包含a -->
${fn:containsIgnoreCase("abc", "Ab")}<br/><!-- 在忽略大小寫的情況下恕沫,判斷abc中是否包含Ab -->
${fn:contains(arr, "a")}<br/><!-- 判斷arr數(shù)組中是否包含a -->
${fn:containsIgnoreCase(list, "A")}<br/><!-- 在忽略大小寫的情況下,判斷l(xiāng)ist集合中是否包含A -->
${fn:endsWith("Hello.java", ".java")}<br/><!-- 判斷Hello.java是否以.java結(jié)束 -->
${fn:startsWith("Hello.java", "Hell")}<br/><!-- 判斷Hello.java是否以Hell開始 -->
${fn:indexOf("Hello-World", "-")}<br/><!-- 返回“-”在Hello-World中出現(xiàn)的位置 -->
${fn:join(arr, "-")}<br/><!-- 將arr數(shù)組中的元素以“-”連接纱意,并返回 -->
${fn:replace("Hello-World", "-", "+")}<br/><!-- 將Hello-World中的“-”替換成“+” -->
${fn:join(fn:split("a;b;c;", ";"), "-")}<br/><!--最終是將數(shù)組的元素以“-”連接婶溯,并返回 -->
${fn:substring("0123456789", 6, 9)}<br/><!-- 返回0123456789中索引值為6到索引值為9之間的元素 -->
${fn:substring("0123456789", 5, -1)}<br/><!-- 返回0123456789中索引值為6到結(jié)束的元素 -->
${fn:substringAfter("Hello-World", "-")}<br/><!-- 返回Hello-World中“-”后面的字符串 -->
${fn:substringBefore("Hello-World", "-")}<br/><!-- 返回Hello-World中“-”前面的字符串 -->
${fn:trim(" a b c ")}<br/><!-- 去掉 a b c 前后的空格 -->
${fn:escapeXml("<html></html>")}<br/> <!-- 將“<html></html>”中的“<”,“>”轉(zhuǎn)義偷霉,即原樣輸出 -->
</body>
四爬虱、 JSTL
1. JSTL標簽介紹
jstl標簽庫介紹
JSTL(JSP Standard Tag Library,jsp標準標簽庫)是Apache對EL表達式的擴展腾它,也就是說JSTL依賴EL表達式跑筝。JSTL是標簽語言,使用起來非常方便瞒滴。但是它不是jsp內(nèi)置的標簽曲梗,所以用的時候需要我們自己導包,以及指定標簽庫妓忍。
如果你使用Myeclipse開發(fā)javaweb虏两,那么把項目發(fā)布到Tomcat時,你會發(fā)現(xiàn)世剖,Myeclipse會在當前工程的lib目錄下存放jstl的jar包定罢,如果沒有使用Myeclipse開發(fā),那么就需要自己導入這個jstl的jar包:jstl-1.2.jar旁瘫。
jstl標簽庫功能介紹
Jstl標簽庫一共包含了四大標簽庫:
core:核心標簽庫祖凫,這是我們學習的重點;
fmt:格式化標簽庫,用的很少酬凳;
sql:數(shù)據(jù)庫標簽庫惠况,這個標簽庫已經(jīng)過時,本文檔不再對其進行介紹宁仔;
xml:xml標簽庫稠屠,這個標簽庫已經(jīng)過時,本文檔不再對其進行介紹。
另外Jstl標簽庫中還包含了jstl函數(shù)权埠。
如何使用jstl標簽庫
除了jsp動作標簽外榨了,使用其他第三方的標簽都需要做以下兩件事:
a. 導入jar包;
b. 在使用標簽的jsp頁面中使用taglib指令導入標簽庫攘蔽。
例如:
在jsp頁面導入jstl的核心標簽庫:
<%@ taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core”%>
其中:
prefix="c":指定標簽庫的前綴阻逮,這個前綴可以賦任意的值,但大家都會在使用core標簽庫時指定前綴為c秩彤;
uri="http://java.sun.com/jsp/jstl/core":指定標簽庫的uri叔扼,它不一定是真實存在的網(wǎng)址,但它可以讓JSP找到標簽庫的描述文件漫雷。
jstl核心標簽庫標簽介紹
JSTL core標簽庫中 12個標簽
- c:out 輸出內(nèi)容到瀏覽器端
- c:set 設(shè)置值到四種數(shù)據(jù)范圍瓜富,設(shè)置四個范圍中java對象的一個屬性值
- c:remove 用來刪除四個數(shù)據(jù)范圍的數(shù)據(jù)
- c:catch 捕獲程序異常
- c:if 取代頁面中if條件語句,記住沒有c:else
<c:if test="${m>5}" > </c:if> - c:choose c:when c:otherwise 一起使用 降盹,取代if elseif else 結(jié)構(gòu) 与柑、switch-case 結(jié)構(gòu)
- c:forEach 取代頁面中for循環(huán)
- c:forTokens 切割字符串
- c:import 效果和include類似
- c:url 完成URL重寫 (禁用cookie的session追蹤 ) ---- 結(jié)合c:param完成 中文URL編碼
- c:redirect 完成請求重定向
- c:param 設(shè)置參數(shù) 一般和c:url,c:redirect或者c:import一起使用.
重點: c:if c:foreach c:set
2. JSTL核心標簽
c:set
格式1:設(shè)置域中屬性的值
<c:set var=’域中屬性名稱’ value=’屬性的值’ [scope=’page(默認)|request|session|application’]></c:set>
例如:
<c:set var="password" value="tom" scope="request"></c:set>
格式2:設(shè)置域中對象屬性的值
<c:set property=’對象的屬性’ value=’屬性的值’ target=’域中對象’></c:set>
例如:
<c:set property="id" value="10" target="${user }"></c:set>
c:if
作用:頁面上的邏輯判斷
格式:
<c:if test="判斷的內(nèi)容(一般是el表達式)" var="給前面表達式的結(jié)果起個名稱" [scope="page|request|session|application"] />
注意:
scope 用來表達式結(jié)果存放的域
若指定了標簽的scope屬性,則必須指定var屬性
例如:
<c:if test="${3>4 }" var="flag">
三大于四
</c:if>
<c:if test="${3<=4}" var='flag1'>
三不大于四
</c:if>
c:choose與c:when c:otherwise
作用:用于指定多個條件選擇的組合邊界蓄坏,它必須與<c:when>和<c:otherwise>標簽一起使用价捧。使用<c:choose>,<c:when>和<c:otherwise>三個標簽涡戳,可以構(gòu)造類似 “if-else if-else” 的復雜條件判斷結(jié)構(gòu)结蟋。
格式:
<c:choose>
<c:when test=”el表達式”>
語句
</c:when>
<c:otherwise>
語句
</c:otherwise>
</c:choose>
例如:
<c:set var="day" value="17"/>
<c:choose>
<c:when test="${day ==1 }">
周1
</c:when>
<c:when test="${day ==2 }">
周2
</c:when>
<c:when test="${day ==3 }">
周3
</c:when>
<c:when test="${day ==4 }">
周4
</c:when>
<c:when test="${day ==5 }">
周5
</c:when>
<c:when test="${day ==6 }">
周6
</c:when>
<c:when test="${day ==7 }">
周7
</c:when>
<c:otherwise>
你估計來自火星
</c:otherwise>
</c:choose>
c:forEach
begin屬性
設(shè)置循環(huán)變量從幾開始end屬性
設(shè)置循環(huán)變量到幾結(jié)束;step屬性
設(shè)置循環(huán)變量的步長var屬性
定義一個變量渔彰,用于接收循環(huán)或把數(shù)組或集合中遍歷的每一個元素賦值給var指定的變量varStatus屬性
varStatus屬性就是用來記錄循環(huán)狀態(tài)的嵌屎,它可以創(chuàng)建一個循環(huán)變量vs,該循環(huán)變量有如下屬性:
count:用來記錄循環(huán)元素的個數(shù)恍涂;
index:用來記錄所循環(huán)元素的下標宝惰;
first:判斷當前循環(huán)的元素是否是第一個元素;
last:判斷當前循環(huán)的元素是否是最后一個元素再沧;
current:代表當前循環(huán)的元素尼夺。items:屬性
指定要循環(huán)的變量,可以是一個數(shù)組也可以是一個集合炒瘸,默認是支持EL表達式c:out
格式:
<c:out value=’要輸出的值’ default=’默認值’ escapeXml=’是否不解析為xml’></c:out>
例如:
在域中有
username=”<a href='#'>jack</a>”
<c:out value="${username }" default="ok" escapeXml="false" ></c:out>
顯示的效果為 超鏈接的jack
c:remove
作用:移除域中的屬性
格式:
<c:remove var=’屬性的名稱’ [scope=’page|request|session|application’]></c:remove>
例如:
<c:set var="password" value="123" scope='request'></c:set>
<c:remove var="password" scope=’request’></c:remove>
注意:
scope不寫的時候,會把所有域中的同名的屬性刪除掉.c:catch
作用:
用于捕獲嵌套在標簽體中的內(nèi)容拋出的異常
格式:
<c:catch var='異常對象名稱'>
...
</c:catch>
例如:
<c:catch var="e">
<%
int i=0;
int j=1;
double k=j/i;
%>
</c:catch>
<c:out value="${e }"></c:out> 將異常輸出
<c:out value="${e.message }"></c:out> 將異常信息輸出
- c:forTokens
作用:用指定的分隔符切分指定內(nèi)容
格式:
<c:forTokens items=’指定的內(nèi)容或者el表達式’ delims=’分隔符[分隔符]’ var=’給分割出來的對象起個名字’>
</c:forTokens>
例如:
<c:set var="arr" value="12,23,34|45,56"></c:set>
<c:forTokens items="${arr }" delims="|," var='a'>
${a }-
</c:forTokens>
c:import
作用:用于在JSP頁面中導入一個URL地址指向的資源內(nèi)容淤堵,其作用有點類似<jsp:include>這個JSP標準標簽
最基本的使用
<c:import url="if.jsp"></c:import>
c:url
作用:用于在JSP頁面中構(gòu)造一個URL地址
格式:
<c:url value=’路徑’ [context=’工程名’] [var=’給當前路徑起個名稱’] [scope=’page|request|session|application’]></c:url>
例如:
<c:url value="/jstl/if.jsp" var="ifurl" context="/day11" scope="request"/>
c:redirect
作用:主要應(yīng)用于重定向
例如:
<c:redirect url="/jstl/if.jsp" context='/day11'></c:redirect>c:param
作用:在地址欄后面設(shè)置參數(shù),一般和c:import ,c:url,c:redirect一起使用
例如:
<c:url value="/jstl/if.jsp" var="ifurl" context="/day11" scope="request">
<c:param name="username" value="sansan"></c:param>
<c:param name="password" value="123"></c:param>
</c:url>