域物件 請求轉發 請求重定向與HttpServletResponse響應
阿新 • • 發佈:2019-01-03
域物件獲取全域性配置資訊與伺服器上檔案真實路徑
(1.域物件(在一定範圍內 儲存資訊的物件)
ServletContext 範圍:整個程式中都可以訪問到 並且只有一個(單例物件)
每個servlet都可以訪問到這個域物件
獲取ServletContext物件的方式
方式1:從ServletConfig物件中獲取
方式2:從父類中直接獲取
注意:所有的域物件都有 設定 獲取 刪除的方法
// 方式1
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 從servletConfig物件中獲取
ServletContext application = this.getServletConfig().getServletContext();
// 新增一個數據到context域中
// 相當於新增一個鍵值對
application.setAttribute("username,"zhangsan");
}
// 方式2
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 從父類中直接獲取域物件
Object object = this.getservletContext().getAttribute("username");
System.out.println(object);
(2.設定全域性配置資訊
在web.xml中進行全域性資訊的配置
在<servlet></servlet>外新增全域性資訊
<context-param>
<param-name>key</param-name>
<param-value>value</param-value>
</context-param>
// 獲取全域性配置資訊
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 獲取context
ServletContext application = this.getServletContext();
// 獲取全域性配置資訊
String value = application.getInitParameter("key");
System.out.println(value);
}
(3.獲取伺服器上的真實路徑 並讀取
使用Conttext域物件獲取 可以獲取到伺服器上任意資源路徑
// 在工程src資料夾下建立a.properties檔案 並獲取
private void fun1() throws IOException, FileNotFoundException {
// 獲取a檔案
ServletContext application = this.getservletContext();
// 獲取伺服器上的真實路徑(絕對路徑或磁碟路徑)
String path = application.getRealPath("/WEB/INF?classes/a.properties");
// 讀取檔案
Properties properties = new Properties();
properties.load(new FileInputStream(path));
System.out.println(properties.getProperty("key"));
}
請求轉發與請求重定向
(4.請求轉發與請求重定向
// 請求轉發:瀏覽器只是發起了一次請求 servlet內部做的請求轉發 瀏覽器並不知道
public class Test01 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("要借錢");
System.out.println("沒有 找test02")
// 獲取域物件
ServletContext application = this.getServletContext();
// 從context域中 獲取請求轉發器
RequestDispatcher dispatcher = application.getRuquestDispatcher();
// 進行請求轉發
dispatcher.forward(request,response);
System.out.println("錢已搞定");
public class Test02 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("有錢 這是test02");
執行結果:
要借錢
沒有 找test02
有錢 這是test02
錢已搞定
// 請求重定向:發起了兩次請求(請求地址發生了變化)
瀏覽器發起請求(請求Servlet)
Servlet給瀏覽器一個響應
在響應中會攜帶一個重定向響應頭(頭中有重定向的訪問地址)
瀏覽器接到這個響應後 發現重定向響應頭
再一次發起請求 去訪問重定向響應頭中的地址
// 通過新增重定向響應頭的方式 請求重定向
public class Test03 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("要借錢");
System.out.println("沒有 去找test04");
// 新增重定向響應頭
// 注意:新增 頭資訊 訪問地址的時候 需要寫明工程名
rewponse.setHeader("location","/sh-web-servlet/test04");
// 新增重定向狀態碼
response.setStatus(302);
System.out.println("借錢去了");
}
public class Test04 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println(錢被借走);
執行結果:
要借錢
沒有 去找test04
借錢去了
錢被借走
伺服器響應物件
(5.HTTPServletResponse 伺服器響應物件
響應物件中有:
響應行 http/1.1 狀態碼200
響應頭 告訴瀏覽器要做什麼 例如響應給你的檔案需要下載 以什麼編碼格式解析資料
響應體 響應回瀏覽器的資料
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 設定伺服器的編碼格式 tomcat預設的編碼格式 iso-8859-1
// response.setCharacterEncoding("UTF-8");
// 告訴瀏覽器要使用什麼編碼格式來檢視 新增響應頭
// response.setHeader("Content-type","text/html;charset=UTF-8");
// 代替以上兩句的方法
response.setContextType("text/html;charset=UTF-8");
// 給瀏覽器響應一句話
// 從響應物件 HttpServletResponse 中獲取物件
// 注意:這個流物件不是自己建立 要從響應中獲取
PrintWriter out = response.getWrite();
out.write("很開心");
}
// 重新整理響應
private void fun1(HttpServletResponse response) throws IOException {
// 新增重新整理頭(每秒重新整理一次)
response.setIntHeader("refresh",1);
// 新增隨機數
response.getWriter().write(Math.random() + "");
}
// 跳轉響應
private void fun3(HttpServletResponse response) throws IOException {
// 設定響應的字符集
response.seetContentType("text/html;charset=UTF-8");
// 3秒後 跳轉一個請求地址
response.setHeader("refresh","3;url=http://www.baidu.com");
response.getWriter().write("3秒後 跳轉 很開心");
伺服器上下載檔案
(6.下載檔案
使用者傳送請求 請求到訪問Servlet
Servlet處理請求(把伺服器上的圖片 以流的形式 使用response 響應給使用者瀏覽器)
首先 把名字為 糰子大家族.png的圖片放到工程src資料夾下
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 獲取伺服器上的圖片路徑
String path = this.getServletContext().getRealPath("/WEB-INF/classes/糰子大家族.png");
// 字串切割 獲取圖片的名字
int index = path.lastIndexof("/");
String filename = path.substring(index + 1);
// 修改檔名字的字符集
filename = new String(filename.getBytes(),"iso-8859-1");
// 新增響應頭(需要拼接檔案的名字)
response.setHeader("content-disposition","attachment;filename=" + filename);
// 告訴瀏覽器檔案下載的格式 新增響應頭
response.setHeader("content-type","image/png");
// 從伺服器中讀取圖片 邊讀邊寫
FineInputStream fis = new FileInputstream(path);
// 注意: 需要獲取response當中 位元組流
ServletOutputstream sos = response.getOutputStream();
int len = 0;
byte[] b = new byte[1024];
while ((len = fis.read(b)) != -1) {
// 響應回瀏覽器
// 如果只是單純的把圖片響應回去
// 瀏覽器並不知道你要幹什麼(下載或瀏覽)
// 需要通過響應頭 通知瀏覽器 該檔案是給你下載用的
sos.write(b, 0, len);
}
// 注意:自己建立的流 自己關
fis.close();
}