JavaWeb入門(mén):HttpResponse和HttpRequest詳解
HttpResponse 講解
HttpServletResponse概述:
在創(chuàng)建Servlet時(shí)會(huì)覆蓋service()方法,或doGet()/doPost(),這些方法都有兩個(gè)參數(shù),一個(gè)為代表請(qǐng)求的request和代表響應(yīng)response。service方法中的response的類(lèi)型是ServletResponse,而doGet/doPost方法的response的類(lèi)型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加強(qiáng)大。
Response運(yùn)行流程

響應(yīng)頭有很多這里只介紹常用的。
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-bAvaDBGw-1620739367741)(C:\Users\ASUS\Desktop\JavaWeb_study\JavaWeb\JavaWeb.assets\image-20210511163256716.png)]](http://img.jbzj.com/file_images/article/202107/2021071616193781.jpg)
在瀏覽器可以按F12 抓包看響應(yīng)頭、請(qǐng)求頭、具體的可以再查。
設(shè)置響應(yīng)行
設(shè)置響應(yīng)的狀態(tài)碼
/**
* @Author: crush
* @Date: 2021-05-09 19:35
* version 1.0
*/
@WebServlet("/test3")
public class HttpResponseTest3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("設(shè)置狀態(tài)碼,前臺(tái)通過(guò)判斷狀態(tài)碼,來(lái)判斷請(qǐng)求是否成功");
resp.setStatus(404);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
測(cè)試

設(shè)置響應(yīng)頭
刷新 跳轉(zhuǎn)頁(yè)面
/**
* @Author: crush
* @Date: 2021-05-09 19:35
* version 1.0
*/
@WebServlet("/test4")
public class HttpResponseTest4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 設(shè)置響應(yīng)頭 每1秒自動(dòng)刷新
System.out.println("設(shè)置響應(yīng)頭 每1秒自動(dòng)刷新");
resp.setHeader("Refresh", "1");
//定時(shí)跳轉(zhuǎn) 3秒后將自動(dòng)跳轉(zhuǎn)
// resp.setHeader("Refresh","3;URL=hello.jsp");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
測(cè)試
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-LGJQhKor-1620739367743)(C:\Users\ASUS\Desktop\JavaWeb_study\JavaWeb\JavaWeb.assets\image-20210511162434487.png)]](http://img.jbzj.com/file_images/article/202107/2021071616193783.png)
一個(gè)小demo 實(shí)現(xiàn)刷新 頁(yè)面累加
/**
* response
* @author Adimi
*/
@WebServlet("/test4")
public class ResponseTest4 extends HttpServlet {
private static Integer id=1;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("Refresh","1");
PrintWriter writer = response.getWriter();
id++;
writer.print("id==>"+id);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
設(shè)置字符編碼 解決中文亂碼問(wèn)題
/**
* @Author: crush
* @Date: 2021-05-09 19:35
* version 1.0
*/
@WebServlet("/test1")
public class HttpResponseTest1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 解決中文亂碼問(wèn)題
// 設(shè)置響應(yīng)頭
// 設(shè)置字符編碼 resp.setCharacterEncoding("UTF-8");
// 設(shè)置響應(yīng)內(nèi)容以什么格式展示到頁(yè)面 什么編碼格式 包含了設(shè)置字符編碼
resp.setContentType("text/html;charset=utf-8");
PrintWriter writer = resp.getWriter();
writer.print("中國(guó),你好?。。?);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
測(cè)試
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-5VCR2LeF-1620739367746)(C:\Users\ASUS\Desktop\JavaWeb_study\JavaWeb\JavaWeb.assets\image-20210511162823603.png)]](http://img.jbzj.com/file_images/article/202107/2021071616193784.png)
重定向 redirect
/**
* 重定向
* @Author: crush
* @Date: 2021-05-09 19:35
* version 1.0
*/
@WebServlet("/test5")
public class HttpResponseTest5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendRedirect("hello.jsp");
// resp.setHeader("location","www.baidu.com"); 通過(guò)設(shè)置響應(yīng)頭轉(zhuǎn)發(fā)
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
request轉(zhuǎn)發(fā)
/**
* 重定向
* @Author: crush
* @Date: 2021-05-09 19:35
* version 1.0
*/
@WebServlet("/test5")
public class HttpResponseTest5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// resp.sendRedirect("hello.jsp");
req.getRequestDispatcher("hello.jsp").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
重定向和轉(zhuǎn)發(fā)的區(qū)別
文件下載
獲取路徑資源
String path=this.getServletContext().getRealPath("WEB-INF\\classes\\8.jpg");
讀取資源
FileInputStream fileInputStream=new FileInputStream(path);
獲取到文件名,路徑在電腦上保存的形式是 \ \
String fileName=path.substring(path.lastIndexOf("\\")+1);
設(shè)置消息頭告訴瀏覽器,我要下載1.png這個(gè)圖片 設(shè)置編碼
resp.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
把讀取到的內(nèi)容回送給瀏覽器
int len=0;
byte[] bytes=new byte[1024];
// ServletOutputStream 提供用于將二進(jìn)制數(shù)據(jù)發(fā)送到客戶(hù)端的輸出流
ServletOutputStream servletOutputStream=resp.getOutputStream();
while((len=fileInputStream.read(bytes))>0) {
servletOutputStream.write(bytes,0,len);
}
關(guān)閉資源
servletOutputStream.close();
fileInputStream.close();
注:8.jpg 放在我的resources 文件夾下 但是這里需要寫(xiě)的是編譯完8.jpg存放的位置

具體代碼
/**
* @Author: crush
* @Date: 2021-05-09 19:40
* version 1.0
*/
@WebServlet("/down")
public class ResponseDownFile extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//獲取路徑資源
String path=this.getServletContext().getRealPath("WEB-INF\\classes\\8.jpg");
//讀取資源
FileInputStream fileInputStream=new FileInputStream(path);
//獲取到文件名,路徑在電腦上保存的形式是\\
String fileName=path.substring(path.lastIndexOf("\\")+1);
//設(shè)置消息頭告訴瀏覽器,我要下載1.png這個(gè)圖片
// 該方式文件名為中文時(shí)會(huì)亂碼
//防止中文亂碼
resp.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));
//把讀取到的內(nèi)容回送給瀏覽器
int len=0;
byte[] bytes=new byte[1024];
ServletOutputStream servletOutputStream=resp.getOutputStream();
while((len=fileInputStream.read(bytes))>0) {
servletOutputStream.write(bytes,0,len);
}
// 關(guān)閉資源
servletOutputStream.close();
fileInputStream.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
HttpRequest 講解
HttpServletRequest概述
我們?cè)趧?chuàng)建Servlet時(shí)會(huì)覆蓋service()方法,或doGet()/doPost(),這些方法都有兩個(gè)參數(shù),一個(gè)為代表請(qǐng)求的request和代表響應(yīng)response。service()方法中寫(xiě)了根據(jù)請(qǐng)求方式的不同調(diào)用doget()和dopost().
service方法中的request的類(lèi)型是ServletRequest,而doGet/doPost方法的request類(lèi)型HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更加強(qiáng)大.
Request 運(yùn)行流程

獲取請(qǐng)求攜帶的參數(shù)
/**
* @Author: crush
* @Date: 2021-05-11 16:52
* version 1.0
*/
@WebServlet("/request1")
public class RequestTest1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 這里是請(qǐng)求的參數(shù)名 必須是同名的
String username = req.getParameter("username");
String password = req.getParameter("password");
PrintWriter writer = resp.getWriter();
writer.print("<h1>"+username+":"+password+"</h1>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
![[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來(lái)直接上傳(img-2zxGslkb-1620739367750)(C:\Users\ASUS\Desktop\JavaWeb_study\JavaWeb\JavaWeb.assets\image-20210511170056042.png)]](http://img.jbzj.com/file_images/article/202107/2021071616193887.png)
獲取多個(gè)參數(shù)的值
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 設(shè)置請(qǐng)求的編碼 不然會(huì)亂碼
req.setCharacterEncoding("utf-8");
Enumeration<String> names = req.getParameterNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
String[] values = req.getParameterValues(name);
System.out.println(name+":"+ Arrays.toString(values));
}
}
獲得請(qǐng)求行的信息
/**
* @Author: crush
* @Date: 2021-05-11 16:52
* version 1.0
*/
@WebServlet("/request3")
public class RequestTest3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 獲得請(qǐng)求的url
StringBuffer requestURL = req.getRequestURL();
System.out.println("請(qǐng)求的URL===>"+requestURL);
// 獲得請(qǐng)求的Servlet的路徑
String path = req.getServletPath();
System.out.println("請(qǐng)求的Servlet的路徑===>"+path);
//返回發(fā)出此請(qǐng)求的HTTP方法的名稱(chēng),例如GET,POST或PUT
String method = req.getMethod();
System.out.println("返回發(fā)出此請(qǐng)求的HTTP方法的名稱(chēng)==>"+method);
//返回發(fā)送請(qǐng)求的客戶(hù)端或最后一個(gè)代理的Internet協(xié)議(IP)地址
String remoteAddr = req.getRemoteAddr();
System.out.println("remoteAddr==>"+remoteAddr);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
request實(shí)現(xiàn)轉(zhuǎn)發(fā)
/**
* @Author: crush
* @Date: 2021-05-11 16:52
* version 1.0
*/
@WebServlet("/request2")
public class RequestTest2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 訪問(wèn)request2 轉(zhuǎn)發(fā)到 request4去
req.getRequestDispatcher("/request4").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
request是一個(gè)域?qū)ο?/h3>
request對(duì)象也是一個(gè)存儲(chǔ)數(shù)據(jù)的區(qū)域?qū)ο?,所以也具有如下方法?/p>
setAttribute(String name, Object o)
getAttribute(String name)
removeAttribute(String name)
ServletContext 作用域:
創(chuàng)建:?jiǎn)?dòng)web應(yīng)用程序的時(shí)候創(chuàng)建
銷(xiāo)毀:關(guān)閉web應(yīng)用程序的時(shí)候銷(xiāo)毀
域的作用范圍:整個(gè)web應(yīng)用的啟動(dòng)周期
request作用域:
創(chuàng)建:訪問(wèn)時(shí)創(chuàng)建request
銷(xiāo)毀:響應(yīng)結(jié)束request銷(xiāo)毀
域的作用范圍:一次請(qǐng)求中
總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
java中統(tǒng)一返回前端格式及統(tǒng)一結(jié)果處理返回詳解
這篇文章主要介紹了統(tǒng)一結(jié)果處理的重要性,以及如何在SpringBoot項(xiàng)目中定義和使用統(tǒng)一結(jié)果返回類(lèi),通過(guò)構(gòu)造器私有化和靜態(tài)方法ok、error,提供了成功和失敗的統(tǒng)一響應(yīng)格式,需要的朋友可以參考下2025-02-02
java如何使用zip壓縮實(shí)現(xiàn)讀取寫(xiě)入
Java中IO流之字符流與字節(jié)流的轉(zhuǎn)換方式
MyBatis不用@Param傳遞多個(gè)參數(shù)的操作
Java對(duì)文件的隨機(jī)讀寫(xiě)以及壓縮處理操作
如何解決HttpServletRequest.getInputStream()多次讀取問(wèn)題
Java如何使用Set接口存儲(chǔ)沒(méi)有重復(fù)元素的數(shù)組

