一.Web之間跳轉(zhuǎn)和信息共享
1.為什么需要Web組件之間跳轉(zhuǎn)和信息共享
之前編寫的Servlet都是相互獨(dú)立的,彼此之間沒(méi)有任何的交互.
我們?cè)陂_發(fā)的時(shí)候,從A組件跳轉(zhuǎn)到B組件,在跳轉(zhuǎn)的過(guò)程中需要傳遞數(shù)據(jù),供組件使用.
例子需求:從ListServlet中查詢出所有的學(xué)生對(duì)象(List集合),跳轉(zhuǎn)到JSP頁(yè)面負(fù)責(zé)顯示所有的學(xué)生信息,在學(xué)生信息的列表中點(diǎn)擊刪除操作之后,又重新回到學(xué)生列表界面.
2.Web組件之間跳轉(zhuǎn)
在上述例子中,我們看到了Web組件(Servlet/JSP/Filter/Listener)之間需要協(xié)同完成任務(wù),就需要跳轉(zhuǎn)和數(shù)據(jù)共享.
Web組件之間的跳轉(zhuǎn),有三種方式:
- 方式1:請(qǐng)求轉(zhuǎn)發(fā)(forward)
- 方式2:URL重定向(redirect)
- 方式3:請(qǐng)求包含(include):req.getRequestDispatcher("/include/s2").include(req, resp);
1).請(qǐng)求轉(zhuǎn)發(fā)(forward):
語(yǔ)法:
request對(duì)象.getRequestDispatcher(String path).forward(request,response);
如:
request.getRequestDispatcher("/WEB-INF/views/list.jsp").forward(request, response);
參數(shù):
path:資源路徑,跳轉(zhuǎn)目標(biāo)的地址.
注意:一定要記得調(diào)用forward方法,如果沒(méi)有調(diào)用,則不能跳轉(zhuǎn).
請(qǐng)求轉(zhuǎn)發(fā)的特點(diǎn):
- 1):請(qǐng)求轉(zhuǎn)發(fā)的時(shí)候,瀏覽器地址欄不會(huì)改變依然是跳轉(zhuǎn)之前的地址(不會(huì)顯示目標(biāo)地址).
- 2):請(qǐng)求轉(zhuǎn)發(fā)只發(fā)送了一個(gè)請(qǐng)求,Servlet1和Servlet2共享請(qǐng)求(共享請(qǐng)求中的數(shù)據(jù)).
Servlet1和Servlet2之間可以在同一個(gè)請(qǐng)求中共享數(shù)據(jù). - 3):最終給瀏覽器的響應(yīng)有Servlet2來(lái)決定(如此:Servlet1沒(méi)必要做響應(yīng)).
- 4):請(qǐng)求轉(zhuǎn)發(fā)只能訪問(wèn)當(dāng)前應(yīng)用的資源,不能跨域訪問(wèn).
- 5):請(qǐng)求轉(zhuǎn)發(fā)可以訪問(wèn)WEB-INF里面的資源.
2).URL重定向(redirect):
語(yǔ)法:
response對(duì)象.sendRedirect(String path);
參數(shù):
path:資源路徑,跳轉(zhuǎn)目標(biāo)的地址.
URL重定向的特點(diǎn):
- 1):URL重定向的時(shí)候,瀏覽器地址欄發(fā)生改變,變成了目標(biāo)的地址.
- 2):URL重定向發(fā)送了兩個(gè)請(qǐng)求,Servlet1和Servlet2的請(qǐng)求不同.
因?yàn)镾ervlet1和Servlet2不共享同一個(gè)請(qǐng)求,所以也不共享請(qǐng)求中的數(shù)據(jù). - 3):最終給瀏覽器的響應(yīng)有Servlet2來(lái)決定(如此:Servlet1沒(méi)必要做響應(yīng)).
- 4):URL重定向支持跨域訪問(wèn).
- 5):URL重定向不能訪問(wèn)WEB-INF里面的資源.
3).請(qǐng)求轉(zhuǎn)發(fā)和URL重定向的區(qū)別?
- 1):解釋什么是請(qǐng)求轉(zhuǎn)發(fā),URL重定向(操作代碼).
- 2):羅列各自的特點(diǎn).
- 3):特點(diǎn)羅列完畢之后,拿相同的特點(diǎn)做對(duì)比--->區(qū)別.
- 4):什么時(shí)候使用請(qǐng)求轉(zhuǎn)發(fā)/URL重定向(特點(diǎn)不同,用途不同).
4).如何選擇
什么時(shí)候使用forward:
- 1):需要共享同一個(gè)請(qǐng)求中的數(shù)據(jù).
- 2):訪問(wèn)WEB-INF里面的資源文件.
什么時(shí)候使用redirect: - 1):當(dāng)前應(yīng)用需要跨域訪問(wèn).
- 2):防止表單的重復(fù)提交.
其他時(shí)候,任選.
二.Servlet的三大作用域?qū)ο?/h2>
1.Servlet的三大作用域?qū)ο?/h4>
Web組件在跳轉(zhuǎn)的時(shí)候可以共享數(shù)據(jù)(信息共享),Web組件信息共享必須依賴作用域?qū)ο?
我們是把共享的信息先存放在共享對(duì)象中再做傳遞,在目標(biāo)里面從共享對(duì)象中獲取數(shù)據(jù).
Servlet1 ------------>作用域?qū)ο?數(shù)據(jù))-----------> Servlet2
根據(jù)作用域的大小分成三種:
作用域?qū)ο竺Q | 對(duì)象的類型 | 對(duì)象描述 |
---|---|---|
request | HttpServletRequest | 請(qǐng)求對(duì)象,每次新的請(qǐng)求都會(huì)創(chuàng)建新的request. |
session | HttpSession | 會(huì)話對(duì)象,每次打開新的瀏覽器,再訪問(wèn)(可以包含多個(gè)請(qǐng)求). |
servletContext(application) | ServletContext | 應(yīng)用對(duì)象,描述了這一個(gè)Web應(yīng)用(項(xiàng)目),啟動(dòng)Tomcat創(chuàng)建ServletContext對(duì)象,關(guān)閉Tomcat銷毀該對(duì)象.(包含多次會(huì)話) |
作用域?qū)ο笕绾蝸?lái)共享數(shù)據(jù)(把數(shù)據(jù)存放到作用域,從作用域取出數(shù)據(jù),修改/刪除數(shù)據(jù)):
所有作用域?qū)ο蟮牟僮?/strong>方法都是相同的:
- 設(shè)置共享數(shù)據(jù): 作用域?qū)ο?setAttribute(String name,Object value)
- 獲取共享數(shù)據(jù): Object val = 作用域?qū)ο?getAttribute(String name);
- 刪除共享數(shù)據(jù): 作用域?qū)ο?removeAttribute(String name);
注意:從哪一個(gè)作用域中設(shè)置共享數(shù)據(jù),就只能從該作用域中取出共享數(shù)據(jù).
如果需要共享請(qǐng)求中的數(shù)據(jù),只能使用請(qǐng)求轉(zhuǎn)發(fā)(forward).
在request對(duì)象中:getParameter/getAttribute分不清:
String getParameter(String name):獲取用戶輸入的參數(shù).
Object getAttribute(String name):獲取request中的共享數(shù)據(jù),該共享數(shù)據(jù)是程序猿設(shè)置的(setAttribute).
2.servletcontext:ServletContext接口和常用方法
1).ServletContext接口,表示Servlet的上下文(環(huán)境).
ServletContext其實(shí)表示的就是當(dāng)前應(yīng)用對(duì)象,在一個(gè)應(yīng)用中,有且只有一個(gè)ServletContext對(duì)象,我們習(xí)慣吧該對(duì)稱application.
該對(duì)象在Tomcat啟動(dòng)的時(shí)候就創(chuàng)建,在關(guān)閉Tomcat的時(shí)候該對(duì)象被銷毀.
可以被所有的Web組件共享數(shù)據(jù).
2).如何獲取ServletContext對(duì)象:
- 方式1:ServletContext ctx = request對(duì)象.getServletContext();(Tomcat7才支持)
- 方式2:ServletContext ctx = request對(duì)象.getSession().getServletContext();
- 方式3:在Servlet類中: :ServletContext ctx = super.getServletContext();
getServletContext方法是ServletConfig接口中的,而ServletConfig接口是HttpServlet類的父接口.
獲取的ServletContext都是相同的.
3).常用方法:
1):String getContextPath():獲取當(dāng)前應(yīng)用的上下文路徑(<Context path="XXXX"/>)
和request.getContextPath是相同的.2):String getRealPath(String path):返回當(dāng)前資源名稱的真實(shí)路徑(絕對(duì)路徑).
3):之前講解初始化參數(shù),是在<servlet>元素中做的配置,如此一來(lái),該初始化參數(shù)就只能當(dāng)前Servlet使用.
如果有N個(gè)Servlet有相同的初始化參數(shù)配置,就得重復(fù)配置N次,很不爽,------>全局初始化參數(shù).
全局初始化參數(shù):可以供所有的Web組件共享,配置如下圖圖.
如何獲取全局初始化:就只能使用ServletContext對(duì)象.getInitParameter(String name)
三.動(dòng)態(tài)網(wǎng)頁(yè)JSP
1.JSP為何而生
JSP:Java Server Page(Java的服務(wù)網(wǎng)頁(yè)),也是Java的動(dòng)態(tài)網(wǎng)頁(yè).
在之前講過(guò)Java的另外一個(gè)動(dòng)態(tài)網(wǎng)頁(yè)技術(shù):Servlet.
使用Servlet來(lái)開發(fā)動(dòng)態(tài)網(wǎng)頁(yè):
動(dòng)態(tài)網(wǎng)頁(yè) = Java代碼為主 + html為輔;
這種開發(fā): 網(wǎng)頁(yè)開發(fā)成本大,維護(hù)性很低.
使用JSP來(lái)開發(fā)動(dòng)態(tài)網(wǎng)頁(yè):
其本質(zhì)就是html頁(yè)面(代碼),再加上 Java代碼.
動(dòng)態(tài)網(wǎng)頁(yè) = Java代碼為輔 + html為主;
開發(fā)JSP:
- 1):設(shè)置JSP文件模板的編碼:UTF-8.
- 2):JSP的運(yùn)行必須依賴服務(wù)器,不能直接拖拽到瀏覽器.
- 3):改變了JSP文件的內(nèi)容,不需要重啟Tomcat,直接刷新網(wǎng)頁(yè)即可.
2.JSP的原理
JSP的本質(zhì):其實(shí)就是一個(gè)Servlet.
JSP---->翻譯成Servlet類---->編譯成字節(jié)碼文件--->解釋執(zhí)行了.
所有的以.jsp結(jié)尾的資源在請(qǐng)求Tomcat的時(shí)候,都會(huì)被JspServlet類所接受,該類就是把JSP文件翻譯成一個(gè)個(gè)Servlet類.
翻譯到Tomcat根/work/Catalina/localhost/_/org/apache/jsp/目錄下.
JSP輸出動(dòng)態(tài)網(wǎng)頁(yè)的原理:
其實(shí)就是在JSP翻譯出來(lái)的Servlet類中,依然使用輸出流向外輸出一個(gè)html代碼片段.
這和我們自己使用Servlet做動(dòng)態(tài)網(wǎng)頁(yè)是相同的.
幫我們屏蔽了,在Servlet類中編寫惡心的html代碼.
3.JSP基本語(yǔ)法
JSP語(yǔ)法:
1闯捎、JSP的注釋:
作用:注釋Java腳本代碼
語(yǔ)法:<%--這是注釋--%>,JSP的注釋不會(huì)被翻譯到Servlet代碼中去.
2、JSP的Java腳本表達(dá)式:
作用:輸出數(shù)據(jù)到頁(yè)面上
語(yǔ)法:<%=表達(dá)式%>(實(shí)際上就是調(diào)用輸出流打印到頁(yè)面上) out.print(表達(dá)式);
3瑞你、JSP中的Java腳本片段:(實(shí)際開發(fā)中刁岸,應(yīng)做到JSP中不能出現(xiàn)一行Java腳本片段)
作用:書寫Java代碼邏輯
語(yǔ)法:<%
Java代碼
%>
原理:其中的語(yǔ)句會(huì)原封不動(dòng)的被服務(wù)器翻譯到對(duì)應(yīng)的Servlet的_jspService方法中宏怔。
4祸挪、JSP的聲明:
作用:定義類的成員
語(yǔ)法:<%!
Java代碼
%>
原理:其中的語(yǔ)句會(huì)原封不動(dòng)的被服務(wù)器翻譯到對(duì)應(yīng)的Servlet的類中,作為成員方法和變量冻河。
4.JSP三大指令
1).標(biāo)準(zhǔn)指令:設(shè)定JSP網(wǎng)頁(yè)的整體配置信息
特點(diǎn):
1):并不向客戶端產(chǎn)生任何輸出莉擒,
2):指令在JSP整個(gè)文件范圍內(nèi)有效 (每一個(gè)JSP都得設(shè)置指令)
3):為翻譯階段提供了全局信息
2).JSP三大指令: page/include/taglib指令
格式:<%@ 指令名稱 屬性="屬性值" %>
1.page
作用:定義JSP頁(yè)面的各種屬性
屬性:
language:指示JSP頁(yè)面中使用腳本語(yǔ)言。默認(rèn)值java恋博,目前只支持java齐佳。
extends:指示JSP對(duì)應(yīng)的Servlet類的父類。不要修改债沮。
*import:導(dǎo)入JSP中的Java腳本使用到的類或包炼吴。(如同Java中的import語(yǔ)句)
JSP引擎自動(dòng)導(dǎo)入以下包中的類:
javax.servlet.*
javax.servlet.http.*
javax.servlet.jsp.*
注意:一個(gè)import屬性可以導(dǎo)入多個(gè)包,用逗號(hào)分隔秦士。
*sessioin:指示JSP頁(yè)面是否創(chuàng)建HttpSession對(duì)象。默認(rèn)值是true永高,創(chuàng)建
*buffer:指示JSP用的輸出流的緩存大小.默認(rèn)值是8Kb隧土。
autoFlush:自動(dòng)刷新輸出流的緩存提针。
isThreadSafe:指示頁(yè)面是否是線程安全的(過(guò)時(shí)的)。默認(rèn)是true曹傀。
true:不安全的辐脖。
false:安全的。指示JSP對(duì)應(yīng)的Servlet實(shí)現(xiàn)SingleThreadModel接口皆愉。
*errorPage:指示當(dāng)前頁(yè)面出錯(cuò)后轉(zhuǎn)向(轉(zhuǎn)發(fā))的頁(yè)面嗜价。
目標(biāo)頁(yè)面如果以"/"(當(dāng)前應(yīng)用)就是絕對(duì)路徑。
配置全局錯(cuò)誤提示頁(yè)面:
web.xml
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/error.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
*isErrorPage:指示當(dāng)前頁(yè)面是否產(chǎn)生Exception對(duì)象幕庐。
*contentType:指定當(dāng)前頁(yè)面的MIME類型久锥。作用與Servlet中的response.setContentType()作用完全一致
*pageEncoding:通知引擎讀取JSP時(shí)采用的編碼(因?yàn)橐g)
還有contentType屬性的作用。
*isELIgnored:是否忽略EL表達(dá)式异剥。${1+1}瑟由。默認(rèn)值是false。
page指令最簡(jiǎn)單的使用方式:<%@ page pageEncoding="UTF-8"%>
JSP的錯(cuò)誤頁(yè)面設(shè)置:
訪問(wèn)當(dāng)前JSP的時(shí)候,出現(xiàn)錯(cuò)誤(404找不到/500代碼有問(wèn)題),我們可以專門提供一個(gè)錯(cuò)誤頁(yè)面. 出錯(cuò)之后,就跳轉(zhuǎn)到錯(cuò)誤頁(yè)面,顯示錯(cuò)誤信息.
上述的errorPage屬性,每一個(gè)JSP都要設(shè)置.
我們可以在web.xml中統(tǒng)一的設(shè)置錯(cuò)誤頁(yè)面.
2.include(靜態(tài)包含,開發(fā)中能用靜的不用動(dòng)的)
作用:包含其他的組件冤寿。
語(yǔ)法:<%@include file=""%>file指定要包含的目標(biāo)組件歹苦。路徑如果以"/"(當(dāng)前應(yīng)用)就是絕對(duì)路徑。
原理:把目標(biāo)組件的內(nèi)容加到源組件中督怜,輸出結(jié)果殴瘦。
動(dòng)態(tài)包含:
采用動(dòng)作元素:<jsp:include page=""/>路徑如果以"/"(當(dāng)前應(yīng)用)就是絕對(duì)路徑。
3.taglib
作用:引入外部的標(biāo)簽
語(yǔ)法:<%@taglib uri="標(biāo)簽名稱空間" prefix="前綴"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
5.JSP九大內(nèi)置對(duì)象和四大作用域?qū)ο?/h4>
1).JSP的九大內(nèi)置對(duì)象
JSP中預(yù)先定義好的九個(gè)Java對(duì)象.
查看:JSP翻譯成Servlet代碼之后,_jspService方法中的九個(gè)局部變量.
對(duì)象名稱 | 對(duì)象類型 | 對(duì)象描述 |
---|---|---|
pageContext | PageContext | JSP的四大作用域?qū)ο?表示當(dāng)前JSP頁(yè)面的作用域. |
request | HttpServletRequest | JSP的四大作用域?qū)ο?表示每一個(gè)請(qǐng)求對(duì)象. |
session | HttpSession | JSP的四大作用域?qū)ο?表示一個(gè)會(huì)話對(duì)象. |
application | ServletContext | JSP的四大作用域?qū)ο?表示當(dāng)前Web應(yīng)用對(duì)象. |
response | HttpServletResponse | 響應(yīng)對(duì)象. |
config | ServleConfig | 表示Servlet的配置信息對(duì)象. |
out | JspWriter | 表示字符輸出流對(duì)象. |
page | Object | 表示當(dāng)前JSP翻譯成Servlet的對(duì)象. |
exeception | Throwable | 異常對(duì)象(必須給當(dāng)前JSP設(shè)置為:isErrorPage="true") |
2).JSP的四大作用域?qū)ο?
對(duì)象名稱 | 對(duì)象類型 | 對(duì)象描述 |
---|---|---|
pageContext | PageContext | JSP的四大作用域?qū)ο?表示當(dāng)前JSP頁(yè)面的作用域. |
request | HttpServletRequest | JSP的四大作用域?qū)ο?表示每一個(gè)請(qǐng)求對(duì)象. |
session | HttpSession | JSP的四大作用域?qū)ο?表示一個(gè)會(huì)話對(duì)象. |
application | ServletContext | JSP的四大作用域?qū)ο?表示當(dāng)前Web應(yīng)用對(duì)象. |
6.JSP常用的動(dòng)作元素
1).JSP動(dòng)作元素:
<jsp:include/>
<jsp:forward/>
<jsp:param/>:在包含和轉(zhuǎn)發(fā)時(shí)号杠,利用該標(biāo)簽傳遞請(qǐng)求參數(shù)
2).JSP的包含操作:
可以解決JSP代碼重復(fù)的問(wèn)題.
包含方式:
- 方式1:使用JSP的include指令,靜態(tài)包含.
- 方式2:使用JSP的include動(dòng)作元素,動(dòng)態(tài)包含.
區(qū)別:
- 頁(yè)面包含的時(shí)機(jī)不一樣.
- 靜態(tài)包含:在JSP翻譯成Servlet的時(shí)候,就合并在一起,只生成一個(gè)Servlet類.
- 動(dòng)態(tài)包含:有幾個(gè)JSP文件就翻譯成幾個(gè)Servlet類,也編譯成幾個(gè)字節(jié)碼文件.
在加載進(jìn)JVM,動(dòng)態(tài)合并在一起.
- 動(dòng)態(tài)包含,可以給被包含的頁(yè)面?zhèn)鬟f參數(shù).
7.Servlet+JSP綜合
四.小結(jié)
今日面試題:
1):說(shuō)說(shuō)請(qǐng)求轉(zhuǎn)發(fā)和URL重定向的區(qū)別.
2):說(shuō)說(shuō)forward和redirect的區(qū)別.
3):說(shuō)說(shuō)Servlet的三大作用域?qū)ο?
4):說(shuō)說(shuō)什么是JSP,說(shuō)說(shuō)你對(duì)JSP的理解.
5):JSP的三大指令.
6):說(shuō)說(shuō)JSP的注釋和HTML注釋的區(qū)別.
7):JSP的九大內(nèi)置對(duì)象.
8):JSP的四大作用域?qū)ο?
9):靜態(tài)包含和動(dòng)態(tài)包含的區(qū)別.