Servlet作用域&JSP
為什么Servlet之間需要交互
DeleteServlet
刪除列表中某一項后要返回到ListServlet
中
Web組件
之間的跳轉(zhuǎn)
- 三種方式
- 請求轉(zhuǎn)發(fā)(
forward
) -
URL
重定向(redirect
) - 請求包含(
include
)
- 請求轉(zhuǎn)發(fā)(
- 請求轉(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
中的資源
- 瀏覽器地址欄路徑?jīng)]變混卵,依然是
-
URL
重定向(redirect
)- 語法
response.sendRedirect(String path);
// 參數(shù)
// path表示目標資源名稱
- 特點
- 瀏覽器地址欄路徑發(fā)生變化致扯,變成
Servlet2
的資源名稱 - 發(fā)送了兩個請求
- 因為是不同的請求,所以不能共享數(shù)據(jù)
- 最終的響應輸出由
Servlet2
來決定 - 可以跨域訪問資源
- 不可以訪問
WEB-INF
中的資源
- 瀏覽器地址欄路徑發(fā)生變化致扯,變成
- 請求轉(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/jspx的資源都會訪問到該
查看編譯后
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
文件