Servlet06
15.HttpServletResponse
15.1HttpServletResponse介紹
- 每次HTTP請求,Tomcat都會創建一個HttpServletResponse物件傳遞給Servlet程式使用
- HttpServletRequest表示請求過來的資訊,HttpServletResponse表示所有回應的資訊,如果需要設定回傳給客戶端的資訊,通過HttpServletResponse物件來設定即可,
- HttpServletResponse類圖

- 向客戶端回傳資料方法:
- 位元組流getOutputStreamWriter(); 常用于下載(處理二進制資料)
- 字符流getWriter(); 常用于回傳字串
- 兩個流同時只能使用一個,使用了位元組流,就不能使用字符流,反之亦然,否則就會報錯,
例子
15.2回傳資料時注意事項和細節
-
處理中文亂碼問題-方案1(推薦)
response.setContentType("text/html;charset=utf-8"); -
處理中文亂碼問題-方案2
//1.設定服務器使用utf-8 response.setCharacterEncoding("utf-8"); //2.設定瀏覽器端是utf-8,而且型別是text/html response.setHeader("Content-Type","text/html;charset=utf-8");
15.3請求重定向
15.3.1請求重定向介紹
請求重定向:一個web資源收到客戶端請求后,通知客戶端去訪問另外一個web資源,這稱之為請求重定向
請求重定向的地址欄會改變
15.3.2請求重定向應用實體
需求:演示請求重定向的使用,當訪問DownServlet下載檔案,重定向到DownServletNew下載檔案
DownServlet:
package com.li.servlet.response;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(urlPatterns = {"/downServlet"})
public class DownServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//完成自己的業務..
//請求重定向->downServletNew
//1.sendRedirect本質 會回傳一個 302的狀態碼 和一個Location:/servlet_demo/downServletNew
//2.因此302和location是瀏覽器決議的,而不是服務器
//3.瀏覽器會將/servlet_demo/downServletNew 決議成
// =>http://localhost:8080/servlet_demo/downServletNew
//瀏覽器不能知道服務器上的web應用名稱,只能將當前所在頁面的主機名和埠拼上來,
// 所以重定向需要把/web應用名也寫上來
//而請求轉發是在服務器端的,可以獲取到web應用名稱,所以請求轉發直接寫/資源名即可
response.sendRedirect("/servlet_demo/downServletNew");
}
}
DownServletNew:
package com.li.servlet.response;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(urlPatterns = {"/downServletNew"})
public class DownServletNew extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("DownServletNew-doPost()被呼叫..");
response.setContentType("application/x-tar;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.print("ok");
writer.flush();
writer.close();
}
}
down.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>下載檔案</title>
</head>
<body>
<h1>下載檔案</h1>
<a href="http://localhost:8080/servlet_demo/downServlet">天龍八部</a>
</body>
</html>
15.3.3請求重定向注意事項和細節
-
最佳應用場景:網站遷移,比如原域名是www.abc.com,遷移到www.xyz.com,但是百度抓取的還是原網址
-
瀏覽器地址會發生變化,本質上是兩次http請求
-
不能共享Request域中的資料,本質是兩次http請求,因此會產生兩個httpServletRequest物件
-
不能重定向到/WEB-INF下的資源
-
可以重定向到Web工程之外的資源,比如到 www.baidu.com
-
重定向有兩種方式,推薦使用第一種
-
動態獲取到application context(即Tomcat中配置的web應用專案名稱)
//動態獲取到application context String contextPath = getServletContext().getContextPath(); //contextPath => /servlet_demo response.sendRedirect(contextPath+"/downServletNew");
15.3.4練習

- 撰寫一個MyPayServlet,能夠接收到提交的資料
- 撰寫一個簡單的html頁面pay.html
- 如果支付金額大于100,則重定向到payok.html,否則重定向到原來的pay.ok
WebUtils:
package com.li.servlet.response.homework;
//撰寫一個String-->int的方法,并處理可能的例外
public class WebUtils {
public static int parseString(String str) {
int num = 0;
try {
//try-catch快捷鍵:ctrl+alt+t
num = Integer.parseInt(str);
} catch (NumberFormatException e) {
//這個例外不會throw給Tomcat
System.out.println("輸入的str格式不正確...");
//如果輸入的格式不正確,num的值還是0
}
return num;
}
}
MyPayServlet:
package com.li.servlet.response.homework;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet(urlPatterns = {"/myPayServlet"})
public class MyPayServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//得到金額
String moneyCount = request.getParameter("moneyCount");
//轉成int
//處理一下例外
int i = WebUtils.parseString(moneyCount);
if (i > 100) {
//重定向到payok.html
response.sendRedirect(getServletContext().getContextPath() + "/payok.html");
} else {
//重定向到pay.html
response.sendRedirect(getServletContext().getContextPath() + "/pay.html");
}
}
}
pay.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>支付頁面</title>
</head>
<body>
<h1>支付頁面</h1>
<!--注意:這里action="/servlet_demo/myPayServlet"的第一個斜杠/
被瀏覽器決議成瀏覽器當前地址欄的主機-->
<!--什么時候加上web應用名主要看 / 是服務器還是瀏覽器來決議
如果是瀏覽器來決議就要加上web工程名
如果是服務器來決議,就不需要加(例如請求轉發)-->
<form action="/servlet_demo/myPayServlet" method="post">
用戶編號:<input type="text" name="userId"/><br/>
支付金額:<input type="text" name="moneyCount"/><br/>
<input type="submit" value="https://www.cnblogs.com/liyuelian/archive/2022/11/13/點擊支付">
</form>
</body>
</html>
payok.html:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>支付成功</title>
</head>
<body>
<h1>恭喜你,支付成功~</h1>
</body>
</html>
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/532539.html
標籤:其他
下一篇:資料加密 - 資料庫隱私欄位組件
