JspServlet

JSP簡介
JSP頁面的構成元素
JSP的生命週期
JSP的內置對象
JSP表達式語言(EL)
JSP標準標籤庫(JSTL)html


JSP簡介
1.使用Servlet產生動態頁面,須要在代碼中打印出不少HTML的標籤,在Servlet將靜態顯示的內容和動態內容代碼混合在一塊兒。
2.使用Servlet開發動態網頁,程序員與美工人員沒法一塊兒工做,由於美工不瞭解Java語言,沒法修改Servlet代碼。
爲了解決這些問題,SUN公司推出了JSP技術。java

JSP的基本原理:
JSP的本質依然是Servlet(一個特殊的Java類),當用戶向Servlet發送請求時,Servlet利用輸出流動態生成HTML頁面,包括每個靜態的HTML標籤和全部在HTML頁面中出現的內容。也就是說,JSP實際上是Servlet的一種簡化,使用JSP時,其實仍是使用Servlet,由於在Web應用中,每一個JSP頁面都會由Servlet容器生成對應的Servlet。JSP必須在Web應用中才有效。git

JSP僅做爲表現層技術,其做用有2點:
1.收集用戶的請求參數。
2.將應用程序的處理結果呈現給用戶。程序員

JSP是一種創建在Servlet規範提供的功能之上的動態網頁技術,在網頁文件中經過JSP頁面元素嵌入Java代碼。web


JSP頁面的構成元素
1.靜態內容:HTML靜態文本。sql

2.指令:
指令主要用於轉換階段提供整個JSP頁面的相關信息,指令不會產生任何的輸出到當前的輸出流中。
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
page指令用於設置JSP頁面的屬性。
<%@ include file="/WEB-INF/jsp/res.jsp"%>
include指令用於在JSP頁面中靜態包含一個文件,該文件能夠是JSP頁面,HTML頁面,文本文件。使用了include指令的JSP頁面在轉換時,JSP容器會在其中插入所包含文件的文本或代碼。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
taglib指令可讓JSP頁面使用標籤。數據庫

3.聲明:<%!%> 類、方法和全局變量。
4.腳本段:<% int a = 30; out.println(a);%> Java代碼。
4.表達式:<%=Math.PI%> 表達式用於求值,而後其值轉化爲字符串,插入到當前流中。express

6.動做:嵌入到JSP頁面中的一個標籤。在頁面被轉換爲Servlet期間,當JSP容器遇到這個標籤,就用預先定義的對應該標籤的Java代碼來替代它。
<jsp:useBean>尋找或者實例化一個JavaBean。
<jsp:setProperty>設置JavaBean的屬性。
<jsp:getProperty>輸出某個JavaBean的屬性。
<jsp:useBean id="BeanId" class="example5.simpleBean" scope="application"/>
<jsp:setProperty name="BeanId" property="name" value="Andrew"/>
<jsp:setProperty name="BeanId" property="age" value="25"/>
<jsp:getProperty name="BeanId" property="name"/>
<jsp:getProperty name="BeanId" property="age"/>
<jsp:include> <jsp:include page="sample.jsp" flush="true"><jsp:param name="name" value="csp"/></jsp:include>
用於在當前頁面中包含靜態和動態的資源,能夠傳遞參數。
<jsp:forward> <jsp:forward page="requestedpage.jsp"/>
和RequestDispatcher接口的forward()方法的做用同樣。容許在運行時將當前的請求轉發給一個靜態的資源,JSP頁面或者Servlet,請求被轉向到的資源必須位於同JSP發送請求相同的上下文環境中。
<jsp:plugin>根據瀏覽器類型爲Java插件生成OBJECT或EMBED標記。apache

7.註釋:<!-- --> <%-- --%>小程序

include指令與include動做
include指令能夠在JSP頁面轉換成Servlet以前,將JSP代碼插入其中。它的主要優勢是功能強大,所包含的代碼能夠含有整體上影響主頁面的JSP構造,好比屬性、方法的定義和文檔類型的設定。它的缺點是難於維護只要被包含的頁面發生更改,就得更改主頁面,這是由於主頁面不會自動地查看被包含的頁面是否發生更改。
include動做是引入執行頁面或Servlet所生成的應答文本。在主頁面被請求時,將次級頁面的輸出包含進來。被包含的頁面發生改變時,無須對主頁面作出修改。
ps:僅當include動做不能知足要求時,咱們才應該使用include指令。

forward和redirect的區別
forward是服務器請求資源,服務器直接訪問目標地址的URL,把那個URL的響應內容讀取過來,而後把這些內容再發給瀏覽器,瀏覽器根本不知道服務器發送的內容是從哪兒來的,因此它的地址欄中仍是原來的地址。
redirect就是服務端根據邏輯,發送一個狀態碼,告訴瀏覽器從新去請求那個地址,通常來講瀏覽器會用剛纔請求的全部參數從新請求,因此session,request參數均可以獲取。

scope做用域
1.page
表示頁面做用域,即所建立的對象在當前頁面有效,請求轉交給其餘頁面處理時,對象失效。
默認值。在處理當前請求的過程當中,bean對象都應該存放在PageContext對象中。讓同一Servlet中的其餘方法能夠訪問該bean。
2.request
表示請求做用域,即在當前頁面建立的對象,在該請求後續訪問的頁面均可以訪問。
處理當前請求的過程當中,bean對象應存儲在ServletRequest對象中,能夠經過getAttribute訪問到它。
3.session
表示會話做用域,即在某個客戶的會話期間,建立的對象,在其會話存續期間均可以訪問。
bean會被存儲在與當前請求關聯的HttpSession中,和普通的會話對象同樣,在常規Servlet中可使用getAttribute和setAttribute訪問到它們。
4.application
表示應用程序做用域,即建立的對象在web服務器沒有被關閉以前,該對象均可以訪問。
bean將存儲在ServletContext中(經過application變量或調用getServletContext()來訪問)。ServletContext由同一Web應用中的全部Servlet共享(或服務器上的全部Servlet——在沒有另外定義Web應用的狀況下)。


JSP的生命週期
1.翻譯和編譯(轉換階段)
jspinit - JSP容器建立一個對象的時候,執行jspinit方法,該方法在JSP的生命週期中只執行一次。
2.執行階段
jspService - JSP容器處理用戶請求的時候,調用這個方法。一個請求,一個線程。
3.銷燬階段
jspDestory - 因爲Servlet常駐內存,因此JSP響應速度快。當系統資源不足的時候,須要將Servlet移出內存,此時執行jspDestory方法。

JSP執行流程:
第一個用戶請求JSP文件的時候,把JSP文件轉換成Java文件(Servlet類文件),而後再編譯成class文件,常駐內存。而後再有用戶請求的時候,直接再開一個線程,而不是一個進程,無須從新編譯,直接執行第一次已經編譯好的class文件,速度快。若是JSP文件發生變化,那麼就須要從新編譯一次。


JSP的內置對象
1.JSP內置對象是Web容器加載的一組類。
2.它不像通常的Java對象那樣用"new"去獲取實例,而是能夠直接在JSP頁面使用的對象。
3.內置對象的名稱是JSP的保留字。
4.JSP使用Java定義的內置對象來訪問網頁的動態內容。

編寫test.jsp,編譯以後查看test_jsp.java源代碼:
public void _jspService(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
JspFactory _jspxFactory = null;
javax.servlet.jsp.PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
...
}
這些內置對象都在_jspService中定義,因此只能在腳本或表達式中使用內置對象。

1.輸入/輸出對象
request、response、out
2.做用域通訊對象
pageContext、request、session、application
3.Servlet對象
page、config
4.異常對象
exception

request
表示客戶端對網頁的請求,實現javax.servlet.http.HttpServletRequest接口。使用HTTP協議處理客戶端的請求。
經常使用方法
String getParameter(String name)
String[] getParameterValues(String name)

response
處理JSP生成的響應,將響應發送給客戶端,實現javax.servlet.http.HttpServletResponse接口。
經常使用方法
void setContentType(String name)設置響應內容的類型和字符編碼。
void sendRedirect(String name)重定向。

out
表示輸出流,javax.servlet.jsp.JspWriter類的實例,以字符流的形式輸出數據,經過page指令的buffer屬性來制定緩衝區的大小,默認是8kb。
經常使用方法
write()、print()、println()

session
用戶會話對象,Web服務器爲單個用戶發送的多個請求建立會話,實現javax.servlet.http.HttpSession接口。
經常使用方法
void setAttribute(String name,Object value)
void getAttribute(String name)

application
JSP頁面所屬的應用程序,實現javax.servlet.ServletContext接口。
經常使用方法
void setAttribute(String name,Object value)
void getAttribute(String name)

pageContext
頁面上下文對象,繼承javax.servlet.jsp.PageContext類。它的做用範圍是在同一頁面。
經常使用方法
void setAttribute(String name,Object value)
void getAttribute(String name)

page
頁面對象,繼承java.lang.Object類。JSP中不多使用該對象。

config
配置信息對象,實現javax.servlet.ServletConfig接口。在Servlet初始化時向其傳遞配置信息。

exception
異常對象,用於處理JSP頁面中的異常。


JSP表達式語言
EL(Expression Language),能夠簡化對變量的訪問。由兩個組開發(JSP標準標籤庫專家組、JSP2.0專家組)。

語法
${EL Expression}

EL表達式的操做內容能夠是常量、變量、JSP內置對像。還提供了對操做內容的運算(算述運算、關係運算、邏輯運算)。EL表達式的操做結果會自動輸出到輸出流對象中。

EL支持的文字常量
字符串 - 由0個或多個字符組成。
整形 - 十進制、十六進制和八進制類型的值。
浮點型 - 由兩部分組成,如用'E'、'e'和f後綴類型表示的指數。
布爾型 - 指定或檢查運算結果,返回結果爲true或false。
Null - 表示無值,Null值可用於代碼中檢查方法是否返回值。

使用情形
1.靜態文本。
2.標準標籤和自定義標籤。
3.EL不能在腳本元素中使用。

10/5=${10/5} -- 10/5=2.0
10%5=${10%5} -- 10%5=0
${true && false} -- false
${true || false} -- true
5>6=${5>6} -- 5>6=false
5==6=${5==6} -- 5==6=false

EL使用"[]"和"."操做符來訪問對象屬性。
${user.name}同${user["name"]}

禁用EL
<%@ page isELIgnored ="true"%>

EL表達式搜索範圍
EL在對變量進行操做的時候,它默認經過pageContext.findAttribute("")的方式來查找變量,查找的範圍從page、request、session到application。假如途中找到變量,就直接回傳,再也不繼續找下去。若是這幾個範圍都沒有找到則返回null。也能夠經過如下的內容來指定範圍pageScope、requestScope、sessionScope和applicationScope。${pageScope.user.name}。

EL變量類型自動轉換
${param.count + 20}當param.count爲10時,則結果爲30。

運算符
1.算術運算符
(+、-、*、/或div、%或mod)
${param.count + param.count}

2.關係運算符
(==或eq、!=或ne、<或lt、>或gt、<=或le、>=或ge)
${param.count eq param.count}

3.邏輯運算符
(&&或and、||或or、!或not)
${param.count == 1 || param.count == 2}

4.其它運算符
empty運算符主要用來判斷值是否爲null或空的。
${empty param.count}
條件運算符。當A爲true時,執行B,A爲false時,則執行C。
${A ? B : C}

EL中的隱含對像共有11個,能夠分紅三類
1.與範圍有關的隱含對象(pageScope、requestScope、sessionScope、applicationScope)。
它們基本上就和JSP的pageContext、request、session和application同樣,不過必須注意的是,這四個隱含對象只能用來取得範圍屬性值,即JSP中的getAttribute(String name),卻不能取得其餘相關信息,沒有其它相關的方法。
2.與輸入有關的隱含對象(param、paramValues)。
用來取得用戶請求的參數,如:
${param.name}
${paramValues.name}
以上的做用爲:
request.getParameter(String name)
request.getParameterValues(String name)

3.其餘隱含對象。
cookie是一個小小的文本文件,它是以key、value的方式將session tracking的內容記錄在這個文本文件內。EL沒有實現cookie地動做,只是能夠簡單的把cookie中保存的值取出,其它的工做交由後臺的程序員來完成。
${cookie.userCountry}
取出cookie中保存的userCountry的信息。

header和headerValues
取出請求的關信息。用戶瀏覽器的版本、用戶計算機所設定的區域等其餘相關數據。在鮮少機會下,有可能同一標頭名稱擁有不一樣的值,此時必須改成使用headerValues來取得這些值。
${header["User-Agent"]}
取得瀏覽器的版本信息。

initParam
取得web.xml中的配置參數,如在web.xml中有以下配置
<context-param>
<param-name>userid</param-name>
<param-value>mike</param-value>
</context-param>
${initParam.userid}同String userid = (String)application.getInitParameter("userid");

pageContext
提供對頁面屬性的訪問
${pageContext.request.queryString}取得請求的參數字符串
${pageContext.request.requestURL}取得請求的URL,但不包括請求參數字符串。
${pageContext.request.contextPath}服務的web application的名稱。
${pageContext.request.method}取得HTTP的方法(get、post)。
${pageContext.request.protocol}取得使用的協議(HTTP/1.一、HTTP/1.0)。
${pageContext.request.remoteUser}取得用戶名稱。
${pageContext.request.remoteAddr}取得用戶IP。
${pageContext.session.new}判斷session是否爲新的。所謂新的session,表示剛由server產生而client還沒有使用。
${pageContext.session.id}取得session的ID。
${pageContext.servletContext.serverInfo}取得主機端的服務信息。


JSP標準標籤庫
JSTL(JSP Standard Tag Library),由標籤庫和EL表達式兩部分組成。功能包括迭代和條件判斷、數據管理格式化、XML操做以及數據庫訪問。由apache的jakarta小組維護。JSTL1.0發佈於2002年6月,目前最新版本爲1.2。

JSTL包含5大標籤庫
1.核心標籤庫:包含Web應用的常見工做,好比:循環、表達式賦值、基本輸入輸出等。
2.國際化標籤庫:用來格式化顯示數據,好比:日期、數字格式化。
3.數據庫標籤庫:訪問數據庫。
4.XML標籤庫:訪問XML。
5.函數標籤庫:讀取已定義的函數。

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/xml" prefix="x" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>

1.核心標籤庫
對JSP頁面通常處理的封裝,包含14標籤,分爲4類
a.多用途核心標籤
<c:out>、<c:set>、<c:remove>、<c:catch>

用於顯示的<c:out>標籤
<c:out>標籤是一個最經常使用的標籤,用於在JSP中顯示數據。若是vlaue爲null時,會顯示default的值。
<c:out value="${param.count}" [escapeXml="{true|false}"] [default="0"] />

用於賦值的<c:set>標籤
<c:set>標籤主要用來將變量存儲到JSP範圍中或JavaBean中的屬性中。
<c:set var="number" scope="request" value="csp" />
<c:set target="user" property="name" value="csp" />

用於刪除的<c:remove>標籤
<c:remove>標籤用於刪除存在於scope中的變量。
<c:remove var="varName" [scope="{page|request|session|application}]" />

用於異常捕獲的<c:catch>標籤
<c:catch var="err">
${param.car[2] == 1}
</c:catch>
${err}

b.條件控制標籤
<c:if>、<c:choose>、<c:when>、<c:otherwise>
用於判斷的<c:if>標籤
<c:if test="${param.count==1}" [var="varName"] [scope="{page|request|session|application}"]>
...
</c:if>

用於複雜判斷的<c:choose>、<c:when>、<c:otherwise>標籤
<c:choose>標籤沒有屬性,能夠被認爲是父標籤,<c:when>、<c:otherwise>將做爲其子標籤來使用。<c:when>標籤等價於if語句,它包含一個test屬性,該屬性表示須要判斷的條件。<c:otherwise>標籤沒有屬性,它等價於else語句。
<c:choose>
<c:when test="${param.count == 0}">
...
</c:when>
<c:when test="${param.count == 1}">
...
</c:when>
<c:otherwise>
...
</c:otherwise>
</c:choose>

c.循環控制標籤
<c:forEach>、<c:forTokens>
用於循環的<c:forEach>標籤
<c:forEach [var="v"] [items="collection"] [varStatus="i"] [begin="begin"] [end="end"] [step="step"]>
...
</c:forEach>

用於分隔字符的<c:forTokens>標籤
<c:forTokens items="stringOfTokens" delims="delimiters" [var="v"] [varStatus="i"] [begin="begin"] [end="end"] [step="step"]>
</c:forTokens>
<c:forTokens items="aa,bb,cc,dd" delims="," var="v">
${v}
</c:forTokens>

d.URL相關標籤
<c:import>、<c:url>、<c:redirect>、<c:param>
用於包含頁面的<c:import>
<c:import>標籤能夠把其餘靜態或動態文件包含到本頁面來。和<jsp:include>最大的區別是<jsp:include>只能包含和本身同一個應用下的文件,<c:import>便可包含和本身同一個應用下的文件,也能夠包含和本身不一樣的應用下的文件。
<c:import url="url" [context="context"] [var="v"] [scope=""] [charEncoding="charEncoding"]>
...
</c:import>

用於獲得URL地址的<c:url>標籤
<c:url value="url" [context="context"] [var="varName"] [scope=""] >
  <c:param name="param" value="value"/>
</c:url>

用於頁面重定向的<c:redirect>標籤
<c:redirect url="url" [context="context"]>
<c:param>
</c:redirect>

用於包含傳遞參數的<c:param>標籤
<c:param name="param" [value="value"]/>

2.國際化標籤庫
fmt庫中的定製標記主要分紅四組。第一組容許設置本地化上下文,其它標記將在其中進行操做。換句話說,這組標記容許頁面做者顯式地設置其它fmt標記在格式化數據時將要使用的語言環境和時區。第二組和第三組標記分別支持對日期和數字進行格式化和解析。最後一組標記側重於對文本消息進行本地化。
用戶語言環境
<fmt:setLocale value="en_US" [scope="session"] [variant="Microsoft Windows"]/>
JSP容器處理完該JSP代碼段以後,將忽略用戶瀏覽器設置中所指定的語言首選項。

用於時區
<fmt:setTimeZone value="Australia/Brisbane" [var="name"] [scope="scope"]/>

用於日期標記
<fmt:formatDate>用來格式化和顯示日期和時間(數據輸出)。
<fmt:parseDate>用來解析日期和時間值(數據輸入)。
<fmt:formatDate value="expression" [timeZone="expression"] [type="field]" [dateStyle="style"] [timeStyle="style]" [var="name"] [pattern="expression"] [scope="scope"]/>
<fmt:formatDate value="${createTime}" pattern="yyyy/MM/dd HH:mm:ss"/>

用於數字標記
<fmt:formatNumber>標記用來以特定於語言環境的方式顯示數字數據,包括貨幣和百分數。
<fmt:parseNumber>操做解析了一個數值,該數值是經過value屬性或該操做的標記體內容以特定於語言環境的方式提供的,將結果做爲java.lang.Number類的實例返回。
<fmt:formatNumber value="expression" [type="type"] [pattern="expression"] [currencyCode="expression"] [currencySymbol="expression"] [maxIntegerDigits="expression"] [minIntegerDigits="expression"] [maxFractionDigits="expression"] [minFractionDigits="expression"] [groupingUsed="expression"] [var="name"] [scope="scope"]/>
<fmt:formatNumber value="0.02" type="currency"/>

用於消息標記
<fmt:message key="expression" [bundle="expression"] [var="name"] [scope="scope"]>
  <fmt:param value="expression"/>
</fmt:message>

3.函數標籤
functions標籤被用於EL表達式語句中。爲兩大類,共16個函數。長度函數:fn:length。字符串處理函數:fn:contains、fn:containsIgnoreCase、fn:endsWith、fn:escapeXml、fn:indexOf、fn:join、fn:replace、fn:split、fn:startsWith、fn:substring、fn:substringAfter、fn:substringBefore、fn:toLowerCase、fn:toUpperCase、fn:trim。

長度函數
${fn:length(arrayList)}

判斷函數 fn:contains,判斷源字符串是否包含子字符串。 ${fn:contains("ABC","A")}
判斷函數 fn:containsIgnoreCase,忽略大小寫判斷源字符串是否包含子字符串。
詞頭判斷函數 fn:startsWith。
詞尾判斷函數 fn:endsWith。
字符實體轉換函數 fn:escapeXml,將全部特殊字符轉化爲字符實體碼。只包含一個string參數,返回一個string類型的值。
字符匹配函數 fn:indexOf,取得子字符串與源字符串匹配的開始位置。
分隔符函數,返回string類型的值。 ${fn:join({"a","b","c"},",")}
替換函數 ${fn:replace("ABC","A","B")}
分隔符轉換數組函數,返回string[]類型的值。 ${fn:split("A,B,C",",")}
字符串截取函數 ${fn:substring("ABC","1","2")} B
起始到定位截取字符串函數 ${fn:substringBefore("ABCD","BC")} A
小寫轉換函數 fn:toLowerCase
大寫轉換函數 fn:toUpperCase
空格刪除函數 fn:trim

 

Servlet

前面已經介紹JSP本質就是Servlet,直接使用Servlet的壞處是:
1.開發效率低,全部的HTML標籤都須要使用頁面輸出流完成。
2.不利於團隊開發,美工人員沒法參與Servlet開發。
3.可維護性差,修改時須要編輯Java代碼並從新編譯。

自MVC規範出來後,Servlet的責任開始明確下來,僅僅做爲控制器使用,相似於調度員,全部用戶的請求都發送到Servlet。再也不須要生成頁面標籤,也再也不做爲視圖層角色使用。

Servlet被稱爲服務器端小程序,運行在服務器端,用於處理及響應客戶端的請求。

Servlet是個特殊的Java類,這個Java類必須繼承HttpServlet。Servlet提供不一樣的方法來響應客戶端請求。
doGet:用於響應客戶端的GET請求。
doPost:用於響應客戶端的POST請求。
大部分時候,Servlet對於全部請求的響應都是徹底同樣的。所以能夠採用重寫service方法來代替上面的全部方法。

init(ServletConfig config):建立Servlet實例時,初始化Servlet資源。
destory():銷燬Servlet。

JSP與Servlet的區別:
1.Servlet中沒有內置對象,須要由程序顯示建立。
2.對於靜態HTML標籤,Servlet都必須使用頁面輸出流逐行輸出。

從Servlet3.0開始,配置Servlet有兩種方式:
1.在web.xml文件中配置。
<servlet>
  <servlet-name>login</servlet-name>
  <servlet-class>com.csp.LoginAction</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>login</servlet-name>
  <url-pattern>/login</url-pattern>
</servlet-mapping>

2.在Servlet類中使用註解配置。
@WebServlet(name="login",urlPatterns={"/login"})

Servlet生命週期:
1.建立Servlet實例。
2.init方法初始化Servlet對象。
3.service方法處理客戶的請求。
4.destroy方法銷燬Servlet。

當Servlet在容器中運行時,其實例的建立及銷燬都不是由程序員決定的,而是由Web容器進行控制。
建立Servlet實例有兩個時機:
1.客戶端第一次請求某個Servlet時,系統建立該Servlet實例,大部分Servlet都是這種Servlet。
2.Web應用啓動時當即建立Servlet實例,即load-on-startup,這種Servlet沒有service方法,不能處理用戶請求。
<servlet>
  <servlet-name>myThread</servlet-name>
  <servlet-class>com.csp.MyThread</servlet-class>
  <load-on-startup>1</load-on-startup>
</servlet>

Filter介紹:
Filter能夠認爲是Servlet的增強版,它主要用於對用戶請求進行預處理,也能夠對HttpServletResponse進行後處理。建立Filter須要兩個步驟:
1.建立Filter處理類,實現Javax.servlet.Filter接口。
2.web.xml文件中配置Filter。

<filter>  <filter-name>login</filter-name>  <filter-class>com.csp.LoginFilter</filter-class></filter><filter-mapping>  <filter-name>login</filter-name>  <url-pattern>/*</url-pattern></filter-mapping>

相關文章
相關標籤/搜索