java--HttpServlet及request、response

 HttpServlet

但在實際開發中,咱們不會直接去實現Servlet接口,由於那樣須要覆蓋的方法太多, 咱們通常建立類繼承HttpServlethtml

實現步驟:web

1)建立類繼承HttpServlet類瀏覽器

2)覆蓋doGet和doPosttomcat

3)在web.xml中進行servlet的配置服務器

HttpServletResponse

1.HttpServletResponse概述

      咱們在建立Servlet時會覆蓋service()方法,或doGet()/doPost(),這些方法都有兩個參數,一個爲表明請求的request和表明響應response。service方法中的response的類型是ServletResponse,而doGet/doPost方法的response的類型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更增強大,今天咱們學習HttpServletResponse。網絡

response的運行流程jsp

Http響應

2.經過response設置響應行 post

1 //設置狀態碼
2 response.setStatus(405);

3.經過response設置響應頭性能

 

//添加響應頭
response.addHeader("name2", "bianxiutong");
//5秒後跳轉百度
response.setHeader("refresh", "5;url=https://baidu.com/");

/*//重定向步驟:1.設置狀態碼
response.setStatus(302);
//2.設置響應頭Location
response.setHeader("Location", "/Servlet04");*/
//實際開發中,上面的代碼不會使用,重定向用一句話搞定
response.sendRedirect("/Servlet04");

4.經過response設置響應體學習

1 response.getWriter().write("hello dandan...");

案例--文件下載

(1)向瀏覽器輸出一張照片

 1 //向客戶端輸出一張圖片
 2     public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 3         //明確數據源
 4         String path=getServletContext().getRealPath("IMG_0152.JPG");
 5         //得到輸入流
 6         FileInputStream fis=new FileInputStream(path);
 7         //明確目的地
 8         ServletOutputStream sos=response.getOutputStream();
 9         //複製
10         int len=0;
11         byte[] bytes=new byte[1024];
12         while((len=fis.read(bytes))!=-1){
13             sos.write(bytes, 0, len);
14         }
15         //釋放資源
16         fis.close();
17     }

(2)提供下載

 1 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 2         //獲取要下載的文件名稱
 3         String filename=request.getParameter("filename");
 4         //response解決中文亂碼
 5         filename=new String(filename.getBytes("ISO8859-1"),"utf-8");
 6         //要下載的文件類型--客戶端會經過文件的MIME類型去區分類型
 7         response.setContentType(getServletContext().getMimeType(filename));
 8         //獲取請求頭中的瀏覽器信息
 9         String agent=request.getHeader("User-Agent");
10         //複製不一樣瀏覽器對文件名編碼的代碼
11         String filenameEncoder="";
12         if (agent.contains("MSIE")) {
13                 // IE瀏覽器
14                 filenameEncoder = URLEncoder.encode(filename, "utf-8");
15                 filenameEncoder = filenameEncoder.replace("+", " ");
16         } else if (agent.contains("Firefox")) {
17                 // 火狐瀏覽器
18                 BASE64Encoder base64Encoder = new BASE64Encoder();
19                 filenameEncoder= "=?utf-8?B?"
20                         + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
21         } else {
22                 // 其它瀏覽器
23                 filenameEncoder= URLEncoder.encode(filename, "utf-8");                
24         }
25         //要告知客戶端文件的打開方式(下載)
26         response.setHeader("Content-Disposition", "attachment;filename="+filenameEncoder);
27         //獲取文件的絕對路徑
28         String path=getServletContext().getRealPath("download/"+filename);
29         //得到該文件的輸入流
30         FileInputStream fis=new FileInputStream(path);
31         //獲取文件輸出流
32         ServletOutputStream sos=response.getOutputStream();
33         //文件複製
34         int len=0;
35         byte[] bytes=new byte[1024];
36         while((len=fis.read(bytes))!=-1){
37             sos.write(bytes, 0, len);
38         }
39         //釋放資源
40         fis.close();
41     }

下載html:

<h1>使用服務器端的編碼方式實現文件的下載</h1>
    <a href="/WEB04/DownLoadServlet?filename=IMG_0152.JPG">IMG_0152.JPG</a>
    <a href="/WEB04/DownLoadServlet?filename=你好.txt">你好.txt</a>
    <a href="/WEB04/DownLoadServlet?filename=New Folder.zip">New Folder.zip</a>
    <a href="/WEB04/DownLoadServlet?filename=ServletCOntext.wmv">ServletCOntext.wmv</a>

response細節點:

  1. response得到的流不須要手動關閉,web容器(tomcat容器)會幫助咱們關閉,
  2. getWriter和getOutputStream不能同時調用
  3. 重定向語句通常做爲終結代碼

關於中文亂碼問題

  https://www.cnblogs.com/-dashu/p/9625892.html

 

HttpServletRequest

1.HttpServletRequest概述

  咱們在建立Servlet時會覆蓋service()方法,或doGet()/doPost(),這些方法都有兩個參數,一個爲表明請求的request和表明響應response。service方法中的request的類型是ServletRequest,而doGet/doPost方法的request的類型是HttpServletRequest,HttpServletRequest是ServletRequest的子接口,功能和方法更增強大,今天咱們學習HttpServletRequest。

response的運行流程

 

 

http請求

 

 2.經過request得到請求行

 1 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 2         //1.獲取請求方式
 3         String method=request.getMethod();
 4         System.out.println("請求方式:"+method);
 5         //2.獲取請求資源的相關內容
 6         String requestURI=request.getRequestURI();
 7         System.out.println("requestURI:"+requestURI);
 8         StringBuffer requestURL=request.getRequestURL();
 9         System.out.println("requestURL:"+requestURL);
10         //3.獲取WEB應用名稱
11         String contextpath=request.getContextPath();
12         System.out.println("WEB項目名稱爲:"+contextpath);
13         //4.獲取get方式提交url後的參數信息
14         String queryString=request.getQueryString();
15         System.out.println("get提交參數信息"+queryString);
16         //5.獲取客戶端的訪問者的ip地址
17         String ip=request.getRemoteAddr();
18         System.out.println("ip地址爲:"+ip);
19     }

 

 3.經過request得到請求頭

 1 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 2         //1.獲取指定的頭
 3         String agent=request.getHeader("User-Agent");
 4         System.out.println(agent);
 5         //2.獲取全部頭的名稱
 6         Enumeration<String> headerNames=request.getHeaderNames();
 7         while(headerNames.hasMoreElements()){
 8             String headerName=headerNames.nextElement();
 9             String headerValue=request.getHeader(headerName);
10             System.out.println(headerName+"..."+headerValue);
11         }
12     }

 

 1 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 2         //獲取referer的信息
 3         String refer=request.getHeader("referer");
 4         //解決中文亂碼
 5         response.setContentType("text/hetml;charset=utf-8");
 6         //對referer進行判斷
 7         if(refer!=null&& refer.startsWith("http://localhost")){
 8             response.getWriter().write("1、京東重創中國網絡零售商京東創始人劉強東涉嫌犯罪事態升級。明尼拿波里斯警察局發言人埃爾德(John Elder)接受電話採訪表示,劉強東涉嫌強暴重罪。");
 9         }else{
10             response.getWriter().write("你是盜鏈者,可恥");
11         }
12     }

4.經過request得到請求體

 

form.jsp:

<form action="/WEB06/ContentServlet" method="post">
        用戶名:<input type="text" name="username"><br>
        <input type="checkbox" name="hobby" value="zq">足球
        <input type="checkbox" name="hobby" value="lq">籃球
        <input type="checkbox" name="hobby" value="pq">排球
        <input type="checkbox" name="hobby" value="ppq">乒乓球
        <input type="submit" value="提交">
</form>

 

 servlet:

 1 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 2         //獲取單個值
 3         String username=request.getParameter("username");
 4         //獲取指定表單元素的value值
 5         String[] hobbys=request.getParameterValues("hobby");
 6         for(String h:hobbys){
 7             System.out.println(h);
 8         }
 9         //獲取全部參數,並封裝到一個Map<String,String[]>中
10         Map<String,String[]> map=request.getParameterMap();
11         for(Map.Entry<String,String[]> entry:map.entrySet()){
12             //參數的name值
13             System.out.println(entry.getKey());
14             //參數value值(String[])
15             for(String str:entry.getValue()){
16                 System.out.println(str);
17             }
18             System.out.println("-----------------");
19         }
20

 5.request的其餘功能

(1)request是一個域對象

//往域對象中設置值
request.setAttribute("name", "張三");
//中文亂碼
response.setContentType("text/hetml;charset=utf-8");
//獲取域對象值
String name=(String)request.getAttribute("name");
response.getWriter().write(name);

 (2)request完成請求轉發

 

//請求轉發--得到轉發器、經過轉發器轉發
request.getRequestDispatcher("/Servlet2").forward(request, response);

轉發與重定向的區別?

1)重定向兩次請求,轉發一次請求

2)重定向地址欄的地址變化,轉發地址不變

3)從新定向能夠訪問外部網站 轉發只能訪問內部資源

4)轉發的性能要優於重定向

 

注意:ServletContext域與Request域的生命週期比較?

ServletContext:

建立:服務器啓動

銷燬:服務器關閉

域的做用範圍:整個web應用

request

建立:訪問時建立request

銷燬:響應結束request銷燬

域的做用範圍:一次請求中

注意:客戶端地址與服務器端地址的寫法?

客戶端地址:

是客戶端去訪問服務器的地址,服務器外部的地址,特色:寫上web應用名

直接輸入地址:重定向 

服務器端地址:

服務器內部資源的跳轉的地址,特色:不須要寫web應用的名稱

請求轉發

相關文章
相關標籤/搜索