Servlet作用域&JSP

Servlet作用域&JSP

為什么Servlet之間需要交互


DeleteServlet刪除列表中某一項后要返回到ListServlet

Web組件之間的跳轉(zhuǎn)

  • 三種方式
    • 請求轉(zhuǎn)發(fā)(forward)
    • URL重定向(redirect)
    • 請求包含(include)
  • 請求轉(zhuǎn)發(fā)(forward
    • 語法
request.getRequestDispatcher(String path).forward(request, response);
// 參數(shù)
// path表明目標資源名稱(需要跳轉(zhuǎn)到哪里)
  • 特點
    • 瀏覽器地址欄路徑?jīng)]變混卵,依然是Servlet1的資源名稱
    • 只發(fā)送了一個請求
    • 共享一個請求润绵,在請求中共享數(shù)據(jù)
    • 最終的響應輸出由Servlet2來界定
    • 只能訪問當前應用中的資源酷誓,不能跨域跳轉(zhuǎn)
    • 可以訪問WEB-INF中的資源
  • URL重定向(redirect)
    • 語法
response.sendRedirect(String path);
// 參數(shù)
// path表示目標資源名稱
  • 特點
    • 瀏覽器地址欄路徑發(fā)生變化致扯,變成Servlet2的資源名稱
    • 發(fā)送了兩個請求
    • 因為是不同的請求,所以不能共享數(shù)據(jù)
    • 最終的響應輸出由Servlet2來決定
    • 可以跨域訪問資源
    • 不可以訪問WEB-INF中的資源
  • 請求轉(zhuǎn)發(fā)和URL重定向的區(qū)別
    • 分別解釋各自的定義
    • 羅列各自的特點
    • 各自的應用場景
  • 請求轉(zhuǎn)發(fā)和URL重定向的選擇
    • 若需要共享請求中的數(shù)據(jù)只能使用請求轉(zhuǎn)發(fā)
    • 若需要訪問WEB-INF中的資源拂铡,只能使用請求轉(zhuǎn)發(fā)
    • 若需要跨域訪問塌忽,只能使用URL重定向
    • 請求轉(zhuǎn)發(fā)可能造成表單的重復提交問題

Servlet與JSP的數(shù)據(jù)共享作用域


名稱 類型 描述
pageContext(page) PageContext 表示當前JSP頁面的范圍
request HttpServletRequest 表示當前請求的范圍,只是共享一個請求中的數(shù)據(jù)秸抚。
session HttpSession 表示當前回話的范圍,只要瀏覽器不關閉意蛀,session就是同一個對象
application ServletContext Tomcat關閉applicaiton對象才銷毀

ServletContext接口和常用方法


  • 概念

ServletContext接口耸别,表示的是當前應用對象,Tomcat啟動的時候會創(chuàng)建一個對象县钥,Tomcat關閉的時候?qū)ο箐N毀

在整個Web的生命中期中秀姐,只有一個對象茎芭,表示的就是當前應用

  • 如何獲取該對象
// 1.在Servlet中
ServletContext ctx = super.getServletContext();
// GenericServlet實現(xiàn)了Servlet和ServletConfig接口铅祸,而getServletContext是GenericServlet的一個方法

// 2.通過請求對象獲取
// Servlet3.0之后
ServletContext ctx2 = req.getServletContext();
// Servlet3.0之前
ServletContext ctx3 = req.getSession.getServletContext();
  • ServletContext的常用方法
// 獲取上下文路徑
String getContextPath();
// 根據(jù)指定的相對路徑獲取到絕對路徑
String getRealPath(String path);
  • 問題
    • 如果在Servlet中定躏,出現(xiàn)了硬編碼贯涎,應該將硬編碼配置到web.xml中,然后使用ServletConfig中的getinitParameter(String name)獲取蠢沿,但是如果在多個Servlet中有相同的配置伸头,那就要在多個Servlet中寫相同的配置,不便于維護
    • 解決方案
<!-- 使用全局初始化參數(shù) -->
<context-param>
  <param-name>name</param-name>
  <param-value>neld</param-value>
</context-param>
// 根據(jù)指定的名稱獲取全局初始化參數(shù)
String getInitParameter(String name);
// 獲取所有全局初始化參數(shù)的名稱
Enumeration getInitParameterNames();
  • 獲取初始化參數(shù)的區(qū)別
    • HttpServletRequest中的getParameter(String name)獲取用戶提交的數(shù)據(jù)
    • ServletConfig中的getInitParameter(String name)獲取Servlet`中的初始化參數(shù)
    • ServletContext中的getInitParmeter(String name)獲取web.xml中的全局初始化參數(shù)作用域中的getAttribute(String name)獲取對應作用于中的共享數(shù)據(jù)

JSP


  • 功能

    • Servlet一樣舷蟀,都是用來實現(xiàn)動態(tài)頁面輸出
  • Servlet的缺陷

    • 輸出頁面的代碼非常惡心
    • Servlet中恤磷,沒有體現(xiàn)責任分離的原則
  • Servlet擅長做的事情

    • 獲取請求參數(shù)
    • 調(diào)用業(yè)務處理請求
    • 控制頁面跳轉(zhuǎn)
  • JSP擅長的事情

    • 頁面輸出
  • Servlet動態(tài)頁面輸出

    • Java代碼(主)+Html代碼(輔) --> 動態(tài)頁面
  • JSP動態(tài)頁面輸出

    • Java代碼(輔) + Html代碼(主) --> 動態(tài)頁面

JSP底層原理分析


  • web.xml中配置有<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>

    • 只要是后綴名為jsp/jspx的資源都會訪問到該servlet
    • Servlet的職責就是負責將JSP文件翻譯成`Servlet
  • 查看編譯后JSP文件,發(fā)現(xiàn)有.class/.java的文件

  • HttpJspBase繼承了HttpServlet并且實現(xiàn)了HttpJspPage

  • 最終在頁面上輸出的還是使用Servlet代碼來實現(xiàn)的

JSP三大指令


標準指令:設定JSP網(wǎng)頁的個整體配置信息

  • 特點

    • 不向客戶端產(chǎn)生任何輸出
    • 指令在JSP整個文件范圍內(nèi)有效
  • 指定的使用語法

<%@ 指令名稱 屬性名=屬性值 屬性名=屬性值 %>

page

  • 作用

定義JSP頁面的各種屬性

  • 屬性

import:導入JSP中的Java腳本使用到的類或者包野宜,一個import可以導入多個包扫步,需要用逗號分隔。

session:指示JSP頁面是否創(chuàng)建HttpSession對象匈子,默認值是true

buffer:指示JSP用的出書流的緩沖大小河胎,默認是8KB

errorPage:指當前頁面出錯以后轉(zhuǎn)向的頁面,需要在web.xml中配置

<error-page>
  <excepiton-type>java.lang.Exception</exception-type>
  <location>/error.jsp</location>
</error-page>

isErrorPage:指示當前頁面是否產(chǎn)生Exception對象

contenType:指定當前頁面的MIME類型虎敦,作用與Servlet中的response.setContentType一致

pageEncoding:通知引擎讀取JSP的時候采用的編碼

isELIgnored:是否忽略EL表達式,默認是false

include

靜態(tài)包含游岳,在開發(fā)的時候,如果能使用靜態(tài)的則使用靜態(tài)的其徙,而不使用動態(tài)的

  • 作用

包含其他組件

  • 語法

<%@include file=""%>其中file為指定要包含的目標組件胚迫。路徑如果以"/"(當前應用),就是絕對路徑唾那。

  • 原理

把目標組件的內(nèi)容加到源組件中晌区,輸出結(jié)果

  • 動態(tài)包含

采用動作元素:<jsp:include page="" /> 路徑如果以"/"(當前應用)就是絕對路徑。

taglib

  • 作用

引入外部的標簽

  • 語法

<%@taglib uri="標簽名稱空間" prefix="前綴"%>

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

JSP九大內(nèi)置對象和四大作用域


  • JSP內(nèi)置對象
    • JSP中事先創(chuàng)建好的對象通贞,可以直接拿來使用
名稱 類型 描述
request HttpServletRequest 當前的請求對象
response HttpServletResponse 當前的響應對象
pageContext PageContext 表示當前的JSP頁面對象
session HttpSession 當前會話對象,在JSP中必須設置session="true"
exception Throwable 表示異常對象恼五,必須在JSP中設置isErrorPage="true"
application ServletContext 表示當前應用
config ServletConfig 表示JSP的配置對象
out JspWriter 表示輸出流對象
page Object 表示當前頁面對象
  • JSP四大作用域?qū)ο?/li>
名稱 類型 描述
pageContext PageContext 表示當前的JSP頁面對象
request HttpServletRequest 當前的請求對象
session HttpSession 當前會話對象,在JSP中必須設置session="true"
application ServletContext 表示當前應用

JSP中靜態(tài)包含和動態(tài)包含的區(qū)別


在JSP中使用靜態(tài)包含

<%@include file="被包含的頁面">

  • 特點

在翻譯階段就已經(jīng)合并在一起了昌罩,只有一個Java文件

在JSP中使用動態(tài)包含

<jsp:include page="被包含的頁面">

  • 特點

在運行階段合并在一起,有兩個Java文件

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末灾馒,一起剝皮案震驚了整個濱河市茎用,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌睬罗,老刑警劉巖轨功,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異容达,居然都是意外死亡古涧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門花盐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來羡滑,“玉大人菇爪,你說我怎么就攤上這事∑饣瑁” “怎么了凳宙?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長职祷。 經(jīng)常有香客問我氏涩,道長,這世上最難降的妖魔是什么有梆? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任是尖,我火速辦了婚禮,結(jié)果婚禮上淳梦,老公的妹妹穿的比我還像新娘析砸。我一直安慰自己,他們只是感情好爆袍,可當我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布首繁。 她就那樣靜靜地躺著,像睡著了一般陨囊。 火紅的嫁衣襯著肌膚如雪弦疮。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天蜘醋,我揣著相機與錄音胁塞,去河邊找鬼。 笑死压语,一個胖子當著我的面吹牛啸罢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播胎食,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼扰才,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了厕怜?” 一聲冷哼從身側(cè)響起衩匣,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎粥航,沒想到半個月后琅捏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡递雀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年柄延,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片映之。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡拦焚,死狀恐怖蜡坊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赎败,我是刑警寧澤秕衙,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站僵刮,受9級特大地震影響据忘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜搞糕,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一勇吊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窍仰,春花似錦汉规、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至碟狞,卻和暖如春啄枕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背族沃。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工频祝, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人脆淹。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓常空,卻偏偏與公主長得像,于是被迫代替她去往敵國和親盖溺。 傳聞我的和親對象是個殘疾皇子窟绷,可洞房花燭夜當晚...
    茶點故事閱讀 42,762評論 2 345

推薦閱讀更多精彩內(nèi)容