Javaweb基礎(chǔ)(五)Servlet交互-作用域?qū)ο?JSP

一.Web之間跳轉(zhuǎn)和信息共享

1.為什么需要Web組件之間跳轉(zhuǎn)和信息共享

之前編寫的Servlet都是相互獨(dú)立的,彼此之間沒有任何的交互.
我們?cè)陂_發(fā)的時(shí)候,從A組件跳轉(zhuǎn)到B組件,在跳轉(zhuǎn)的過程中需要傳遞數(shù)據(jù),供組件使用.

例子需求:從ListServlet中查詢出所有的學(xué)生對(duì)象(List集合),跳轉(zhuǎn)到JSP頁面負(fù)責(zé)顯示所有的學(xué)生信息,在學(xué)生信息的列表中點(diǎn)擊刪除操作之后,又重新回到學(xué)生列表界面.

Web組件信息共享例子.png

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):

語法:

   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方法,如果沒有調(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來決定(如此:Servlet1沒必要做響應(yīng)).
  • 4):請(qǐng)求轉(zhuǎn)發(fā)只能訪問當(dāng)前應(yīng)用的資源,不能跨域訪問.
  • 5):請(qǐng)求轉(zhuǎn)發(fā)可以訪問WEB-INF里面的資源.
請(qǐng)求轉(zhuǎn)發(fā).png
2).URL重定向(redirect):

語法:

   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來決定(如此:Servlet1沒必要做響應(yīng)).
  • 4):URL重定向支持跨域訪問.
  • 5):URL重定向不能訪問WEB-INF里面的資源.
Paste_Image.png
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):訪問WEB-INF里面的資源文件.
    什么時(shí)候使用redirect:
  • 1):當(dāng)前應(yīng)用需要跨域訪問.
  • 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ì)象,每次打開新的瀏覽器,再訪問(可以包含多個(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ū)ο笕绾蝸砉蚕頂?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).

作用域?qū)ο蟮牟僮?png

在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>元素中做的配置,如此一來,該初始化參數(shù)就只能當(dāng)前Servlet使用.
    如果有N個(gè)Servlet有相同的初始化參數(shù)配置,就得重復(fù)配置N次,很不爽,------>全局初始化參數(shù).
    全局初始化參數(shù):可以供所有的Web組件共享,配置如下圖圖.
    如何獲取全局初始化:就只能使用ServletContext對(duì)象.getInitParameter(String name)

全局初始化參數(shù).png

三.動(dòng)態(tài)網(wǎng)頁JSP

1.JSP為何而生

JSP:Java Server Page(Java的服務(wù)網(wǎng)頁),也是Java的動(dòng)態(tài)網(wǎng)頁.
在之前講過Java的另外一個(gè)動(dòng)態(tài)網(wǎng)頁技術(shù):Servlet.

使用Servlet來開發(fā)動(dòng)態(tài)網(wǎng)頁:
動(dòng)態(tài)網(wǎng)頁 = Java代碼為主 + html為輔;
這種開發(fā): 網(wǎng)頁開發(fā)成本大,維護(hù)性很低.

使用JSP來開發(fā)動(dòng)態(tài)網(wǎng)頁:
其本質(zhì)就是html頁面(代碼),再加上 Java代碼.
動(dòng)態(tài)網(wǎng)頁 = Java代碼為輔 + html為主;

jsp.png

開發(fā)JSP:

  • 1):設(shè)置JSP文件模板的編碼:UTF-8.
  • 2):JSP的運(yùn)行必須依賴服務(wù)器,不能直接拖拽到瀏覽器.
  • 3):改變了JSP文件的內(nèi)容,不需要重啟Tomcat,直接刷新網(wǎng)頁即可.

2.JSP的原理

JSP的本質(zhì):其實(shí)就是一個(gè)Servlet.
JSP---->翻譯成Servlet類---->編譯成字節(jié)碼文件--->解釋執(zhí)行了.

JSP的工作流程.png

所有的以.jsp結(jié)尾的資源在請(qǐng)求Tomcat的時(shí)候,都會(huì)被JspServlet類所接受,該類就是把JSP文件翻譯成一個(gè)個(gè)Servlet類.
翻譯到Tomcat根/work/Catalina/localhost/_/org/apache/jsp/目錄下.

JSP的類.png

JSP輸出動(dòng)態(tài)網(wǎng)頁的原理:
其實(shí)就是在JSP翻譯出來的Servlet類中,依然使用輸出流向外輸出一個(gè)html代碼片段.
這和我們自己使用Servlet做動(dòng)態(tài)網(wǎng)頁是相同的.
幫我們屏蔽了,在Servlet類中編寫惡心的html代碼.

JSP輸出動(dòng)態(tài)網(wǎng)頁.png

3.JSP基本語法

JSP語法:

1、JSP的注釋:

        作用:注釋Java腳本代碼

        語法:<%--這是注釋--%>,JSP的注釋不會(huì)被翻譯到Servlet代碼中去.
2、JSP的Java腳本表達(dá)式:

        作用:輸出數(shù)據(jù)到頁面上

        語法:<%=表達(dá)式%>(實(shí)際上就是調(diào)用輸出流打印到頁面上) out.print(表達(dá)式);

3、JSP中的Java腳本片段:(實(shí)際開發(fā)中,應(yīng)做到JSP中不能出現(xiàn)一行Java腳本片段)

        作用:書寫Java代碼邏輯

        語法:<%

      Java代碼
                  %>

        原理:其中的語句會(huì)原封不動(dòng)的被服務(wù)器翻譯到對(duì)應(yīng)的Servlet的_jspService方法中。

4、JSP的聲明:

        作用:定義類的成員

        語法:<%!

                Java代碼

                    %>

        原理:其中的語句會(huì)原封不動(dòng)的被服務(wù)器翻譯到對(duì)應(yīng)的Servlet的類中,作為成員方法和變量。
JSP語法.png

4.JSP三大指令

1).標(biāo)準(zhǔn)指令:設(shè)定JSP網(wǎng)頁的整體配置信息

特點(diǎn):

  • 1):并不向客戶端產(chǎn)生任何輸出,

  • 2):指令在JSP整個(gè)文件范圍內(nèi)有效 (每一個(gè)JSP都得設(shè)置指令)

  • 3):為翻譯階段提供了全局信息

2).JSP三大指令: page/include/taglib指令

格式:<%@ 指令名稱 屬性="屬性值" %>

1.page

    作用:定義JSP頁面的各種屬性

    屬性:

        language:指示JSP頁面中使用腳本語言。默認(rèn)值java,目前只支持java。

        extends:指示JSP對(duì)應(yīng)的Servlet類的父類。不要修改。

        *import:導(dǎo)入JSP中的Java腳本使用到的類或包。(如同Java中的import語句)

                    JSP引擎自動(dòng)導(dǎo)入以下包中的類:

                            javax.servlet.*

                            javax.servlet.http.*

                            javax.servlet.jsp.*

                注意:一個(gè)import屬性可以導(dǎo)入多個(gè)包,用逗號(hào)分隔。

        *sessioin:指示JSP頁面是否創(chuàng)建HttpSession對(duì)象。默認(rèn)值是true,創(chuàng)建

        *buffer:指示JSP用的輸出流的緩存大小.默認(rèn)值是8Kb。

        autoFlush:自動(dòng)刷新輸出流的緩存。

        isThreadSafe:指示頁面是否是線程安全的(過時(shí)的)。默認(rèn)是true。

                true:不安全的。

                false:安全的。指示JSP對(duì)應(yīng)的Servlet實(shí)現(xiàn)SingleThreadModel接口。

        *errorPage:指示當(dāng)前頁面出錯(cuò)后轉(zhuǎn)向(轉(zhuǎn)發(fā))的頁面。

                    目標(biāo)頁面如果以"/"(當(dāng)前應(yīng)用)就是絕對(duì)路徑。

                    

                    配置全局錯(cuò)誤提示頁面:

                        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)前頁面是否產(chǎn)生Exception對(duì)象。

        *contentType:指定當(dāng)前頁面的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"%>
page指令.png

JSP的錯(cuò)誤頁面設(shè)置:
訪問當(dāng)前JSP的時(shí)候,出現(xiàn)錯(cuò)誤(404找不到/500代碼有問題),我們可以專門提供一個(gè)錯(cuò)誤頁面. 出錯(cuò)之后,就跳轉(zhuǎn)到錯(cuò)誤頁面,顯示錯(cuò)誤信息.

JSP錯(cuò)誤頁面配置.png

上述的errorPage屬性,每一個(gè)JSP都要設(shè)置.
我們可以在web.xml中統(tǒng)一的設(shè)置錯(cuò)誤頁面.

統(tǒng)一的設(shè)置錯(cuò)誤頁面.png

2.include(靜態(tài)包含,開發(fā)中能用靜的不用動(dòng)的)

    作用:包含其他的組件。

    語法:<%@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)簽

    語法:<%@taglib uri="標(biāo)簽名稱空間" prefix="前綴"%>

        <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

5.JSP九大內(nèi)置對(duì)象和四大作用域?qū)ο?/h4>
九大內(nèi)置對(duì)象1.png
九大內(nèi)置對(duì)象2.png

1).JSP的九大內(nèi)置對(duì)象

JSP中預(yù)先定義好的九個(gè)Java對(duì)象.

查看:JSP翻譯成Servlet代碼之后,_jspService方法中的九個(gè)局部變量.

對(duì)象名稱 對(duì)象類型 對(duì)象描述
pageContext PageContext JSP的四大作用域?qū)ο?表示當(dāng)前JSP頁面的作用域.
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頁面的作用域.
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ù)

JSP動(dòng)作元素.png
2).JSP的包含操作:

可以解決JSP代碼重復(fù)的問題.
包含方式:

  • 方式1:使用JSP的include指令,靜態(tài)包含.
  • 方式2:使用JSP的include動(dòng)作元素,動(dòng)態(tài)包含.

區(qū)別:

  • 頁面包含的時(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)包含,可以給被包含的頁面?zhèn)鬟f參數(shù).
JSP的包含1.png
JSP的包含2.png

7.Servlet+JSP綜合

Servlet.png
JSP.png

四.小結(jié)

今日面試題:
1):說說請(qǐng)求轉(zhuǎn)發(fā)和URL重定向的區(qū)別.
2):說說forward和redirect的區(qū)別.
3):說說Servlet的三大作用域?qū)ο?
4):說說什么是JSP,說說你對(duì)JSP的理解.
5):JSP的三大指令.
6):說說JSP的注釋和HTML注釋的區(qū)別.
7):JSP的九大內(nèi)置對(duì)象.
8):JSP的四大作用域?qū)ο?
9):靜態(tài)包含和動(dòng)態(tài)包含的區(qū)別.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容