六认轨、JSP & EL & JSTL

一很钓、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原理.png

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)置對象及其類型

jsp九個內(nèi)置對象及其類型.png

內(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ū)別

靜態(tài)包含與動態(tài)包含的區(qū)別.png

include標簽與inclue指令區(qū)別:

  1. include指令是靜態(tài)包含洋幻,包含文件中包含了被包含文件的內(nèi)容.
    include標簽是動態(tài)包含郁轻,它包含的是被包含文件執(zhí)行后的結(jié)果.

  2. 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主要作用:

  1. 獲取數(shù)據(jù):
    EL表達式主要用于替換JSP頁面中的腳本表達式拄氯,以從各種類型的web域 中檢索java對象躲查、獲取數(shù)據(jù)。(某個web域 中的對象译柏,訪問javabean的屬性镣煮、訪問list集合、訪問map集合鄙麦、訪問數(shù)組)
  2. 執(zhí)行運算:
    利用EL表達式可以在JSP頁面中執(zhí)行一些基本的關(guān)系運算典唇、邏輯運算和算術(shù)運算镊折,以在JSP頁面中完成一些簡單的邏輯運算。${user==null}
  3. 獲取web開發(fā)常用對象
    EL 表達式定義了一些隱式對象介衔,利用這些隱式對象恨胚,web開發(fā)人員可以很輕松獲得對web常用對象的引用,從而獲得這些對象中的數(shù)據(jù)炎咖。
  4. 調(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ù)

表達式之域查找

  1. pageContext--------------------${pageScope.xxx}
  2. request--------------------------${requestScope.xxx}
  3. session--------------------------${sessionScope.xxx}
  4. 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í)行運算

常見的運算符


EL表達式執(zhí)行運算.png

empty我們在開發(fā)中檢查對象是否為null或“空”或判斷容器size是否為0
注意事項:
1 .EL表達式支持三元運算符

  1. EL表達式不可以嵌套
    ${a+$十减}這種是不允許的栈幸。
  2. 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個標簽

  1. c:out 輸出內(nèi)容到瀏覽器端
  2. c:set 設(shè)置值到四種數(shù)據(jù)范圍瓜富,設(shè)置四個范圍中java對象的一個屬性值
  3. c:remove 用來刪除四個數(shù)據(jù)范圍的數(shù)據(jù)
  4. c:catch 捕獲程序異常
  5. c:if 取代頁面中if條件語句,記住沒有c:else
    <c:if test="${m>5}" > </c:if>
  6. c:choose c:when c:otherwise 一起使用 降盹,取代if elseif else 結(jié)構(gòu) 与柑、switch-case 結(jié)構(gòu)
  7. c:forEach 取代頁面中for循環(huán)
  8. c:forTokens 切割字符串
  9. c:import 效果和include類似
  10. c:url 完成URL重寫 (禁用cookie的session追蹤 ) ---- 結(jié)合c:param完成 中文URL編碼
  11. c:redirect 完成請求重定向
  12. 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

  1. begin屬性
    設(shè)置循環(huán)變量從幾開始

  2. end屬性
    設(shè)置循環(huán)變量到幾結(jié)束;

  3. step屬性
    設(shè)置循環(huán)變量的步長

  4. var屬性
    定義一個變量渔彰,用于接收循環(huán)或把數(shù)組或集合中遍歷的每一個元素賦值給var指定的變量

  5. 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)的元素尼夺。

  6. items:屬性
    指定要循環(huán)的變量,可以是一個數(shù)組也可以是一個集合炒瘸,默認是支持EL表達式

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

  1. 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不寫的時候,會把所有域中的同名的屬性刪除掉.

  2. 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>  將異常信息輸出
  1. 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>
  1. c:import
    作用:用于在JSP頁面中導入一個URL地址指向的資源內(nèi)容淤堵,其作用有點類似<jsp:include>這個JSP標準標簽
    最基本的使用
    <c:import url="if.jsp"></c:import>

  2. 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"/>

  3. c:redirect
    作用:主要應(yīng)用于重定向
    例如:
    <c:redirect url="/jstl/if.jsp" context='/day11'></c:redirect>

  4. 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>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市什燕,隨后出現(xiàn)的幾起案子粘勒,更是在濱河造成了極大的恐慌,老刑警劉巖屎即,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡技俐,警方通過查閱死者的電腦和手機乘陪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雕擂,“玉大人啡邑,你說我怎么就攤上這事【模” “怎么了谤逼?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長仇穗。 經(jīng)常有香客問我流部,道長,這世上最難降的妖魔是什么纹坐? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任枝冀,我火速辦了婚禮,結(jié)果婚禮上耘子,老公的妹妹穿的比我還像新娘果漾。我一直安慰自己,他們只是感情好谷誓,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布绒障。 她就那樣靜靜地躺著,像睡著了一般捍歪。 火紅的嫁衣襯著肌膚如雪端盆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天费封,我揣著相機與錄音焕妙,去河邊找鬼。 笑死弓摘,一個胖子當著我的面吹牛焚鹊,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播韧献,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼末患,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锤窑?” 一聲冷哼從身側(cè)響起璧针,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎渊啰,沒想到半個月后探橱,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體申屹,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年隧膏,在試婚紗的時候發(fā)現(xiàn)自己被綠了哗讥。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡胞枕,死狀恐怖杆煞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腐泻,我是刑警寧澤决乎,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站派桩,受9級特大地震影響构诚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窄坦,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一唤反、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸭津,春花似錦彤侍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至闻书,卻和暖如春名斟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背魄眉。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工砰盐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坑律。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓岩梳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晃择。 傳聞我的和親對象是個殘疾皇子冀值,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348