JavaWeb開發02——Response和Request

Response和Request

一.HttpServletResponse常見應用


Response:Response表明響應,響應消息中的狀態碼、響應頭、實體內容均可以由它進行操做html

1.Response輸出數據到客戶端
response.setContentType("text/html;charset=utf-8") ···解決中文亂碼
response.getOutputStream().write(···);
response.getWriter.wtite(···);
Tip:

對於一次請求,Response的getOutputStream方法和getWriter方法是互斥,只能調用其一,特別注意forward後也不要違反這一規則web

2.Response設置content-disposition頭實現文件下載
response.setHeader("Content-Disposition","attachment;filename=1.jpg"/"attachment;filename="+URLEncoder.encode("圖片.jpg", "utf-8")···將下載文件名改成中文);
response.setHeader("Content-Disposition", 
InputStream in = new FileInputStream(this.getServletContext().getRealPath("1.jpg"));
        OutputStream out = response.getOutputStream();
        byte[]bs = new byte[1024];
        
        int i = 0;
        while((i=in.read(bs))!=-1){
            out.write(bs,0,i);
        }
        
        in.close();
 
//將下載後的文件名改成中文
response.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode("圖片.jpg", "utf-8"));
response.setHeader("Content-Disposition", 
InputStream in = new FileInputStream(this.getServletContext().getRealPath("1.jpg"));
        OutputStream out = response.getOutputStream();
        byte[]bs = new byte[1024];
        
        int i = 0;
        while((i=in.read(bs))!=-1){
            out.write(bs,0,i);
        }
        
        in.close();
3.Response設置refresh頭控制定時刷新
1)指定多少秒後刷新當前頁面
response.getWriter().write(new Date().toLocaleString());
response.setHeader("Refresh", "1");
2)實現註冊後「註冊成功,3秒後跳轉到主頁」的功能
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("恭喜您註冊成功!3秒後回到主頁.....");
response.setHeader("refresh", "3;url=/Day04/index.jsp");
3)在HTML能夠利用<meta http-equiv= "" content="">標籤模擬響應頭的功能
<html>
  <head>
      <meta  http-equiv="Refresh" content="3;url=/Day04/index.jsp">
  </head>
  <body>
      恭喜您註冊成功!3秒後回到主頁......
  </body>
</html>
4.控制是否緩存資源
1)不緩存,直接刷新,多用在表示當前時間(三行代碼都要寫)
response.setIntHeader("Expires", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
2)控制緩存時間(System.currentTimeMillis()表示當前時間)
response.setDateHeader("Expires", System.currentTimeMillis()+想緩存的時間);
Tip:

若是想緩存的時間超出int的範圍,可轉化爲long型來計算,如:「1000*3600*24*30」超出了int的範圍,因此須要寫成「1000l*3600*24*30」segmentfault

5.請求重定向
response.sendRedirect("地址");
6.實現驗證碼

實現驗證碼(https://segmentfault.com/a/11...瀏覽器

二.HttpServletRequest常見應用


Request:Request表明請求對象,其中封裝了對請求中具備請求行、請求頭、實體內容的操做的方法緩存

1.獲取客戶機信息
1)獲取客戶端請求的完整URL
String url = request.getRequestURL().toString();
System.out.println(url);
2)獲取客戶端請求的資源部分的名稱
String uri = request.getRequestURI();
System.out.println(uri);
3)獲取請求行中參數部分
String qStr = request.getQueryString();
System.out.println(qSt):
4)獲取請求客戶端的ip地址
String ip = request.getRemoteAddr();
System.out.println(ip);
5)獲取客戶機的請求方式
String method = request.getMethod();
System.out.println(method);
6)獲取當前web應用的名稱(須要web應用名稱時用 request.getContextPath()表示,以防web應用名稱有變化)
String name = request.getContextPath();
System.out.println(name);
2.獲取請求頭信息
//獲取某個請求頭的方法
String value = request.getHeader("某個請求頭");
System.out.println(value);

//獲取全部請求頭的方法
Enumeration<String> enumeration = request.getHeaderNames();
while(enumeration.hasMoreElements()){
        String name = enumeration.nextElement();
        String value = request.getHeader(name);
        System.out.println(name+":"+value);
        }
        
得到具體類型客戶機請求頭
getIntHeader(name)方法  --- int
getDateHeader(name)方法 --- long(日期對應毫秒)
實例:防盜鏈製做(https://segmentfault.com/a/11...
3.獲取請求參數

getParameter(name) --- String 經過name得到值
getParameterValues --- String[ ] 經過name得到多值 checkbox
getParameterNames --- Enumeration<String> 得到全部name
getParameterMap --- Map<String,String[ ]> key :name value: 多值服務器

使用的HTML文件:
<html>
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body>
      <h1>POST提交</h1><hr>
      <form action="/Day04/servlet/ParamServlet" method="POST">
          姓名:<input type="text" name="username"/>
          地址:<input type="text" name="addr"/>
          <input type="submit" value="提交" />
      </form>
      <h1>GET提交</h1><hr>
      <form action="/Day04/servlet/ParamServlet" method="GET">
          姓名:<input type="text" name="username"/>
          地址:<input type="text" name="addr"/>
          <input type="submit" value="提交" />
      </form>
  </body>
</html>

//獲取客戶端提交的usename的值
String username = request.getParameter("username");
System.out.println(username);

//遍歷全部的請求參數並打印出來
Enumeration<String> enumeration = request.getParameterNames();
    while(enumeration.hasMoreElements()){
        String name = enumeration.nextElement();
        String value = request.getParameter(name);
        System.out.println(name+":"+value);
        }
Tips:

若是提交內容有中文從而致使亂碼:jsp

對於POST提交,能夠設置request.setCharacterEncoding("utf-8")來能夠解決亂碼ui

request.setCharacterEncoding("utf-8");        
String username = request.getParameter("username");
System.out.println(username);

對於GET提交的亂碼,只能手動的進行編解碼從而解決亂碼問題this

String username = request.getParameter("username");
username = new String(username.getBytes("iso8859-1"),"utf-8");
System.out.println(username);
4.利用請求域傳遞對象

做用範圍:整個請求鏈上url

生命週期:當服務器收到一個請求,建立出表明請求的request對象,request開始。當請求結束,服務器銷燬表明請求的request對象,request域結束.

做用:在整個請求鏈範圍內共享數據,一般咱們在Servlet中處理好的數據會存入request域後請求轉發到jsp頁面來進行展現

Demo3:
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
    request.setAttribute("banana", "yellow banana");
    this.getServletContext().getRequestDispatcher("/servlet/Demo4").forward(request, response);
    
Demo4:
String value = (String)request.getAttribute("banana");
System.out.println(value);

瀏覽器訪問Demo3,而後Eclipse打印的結果爲:
yellow banana
5.實現請求轉發和請求包含
(1)請求轉發:

request.getRequestDispatcher("").forward(request,response);

Demo5:
request.getRequestDispatcher("/servlet/Demo6").forward(request, response);

Demo6:
response.getWriter().write("from demo6....");

訪問Demo5,瀏覽器上打印結果:
from demo6
Tip:

1)一個Servlet裏兩次請求轉發也是不能夠的,一次請求交給兩人處理天然也是不行

2)RequestDispatcher.forward方法只能將請求轉發給同一個WEB應用中的組件;而HttpServletResponse.sendRedirect 方法還能夠重定向到同一個站點上的其餘應用程序中的資源,甚至是使用絕對URL重定向到其餘站點的資源。

(2)請求包含:將兩個資源的輸出進行合併後輸出

request.getRequestDispatcher("").include(request,response);

Demo7:
response.getWriter().write("from demo7");        request.getRequestDispatcher("/servlet/Demo8").include(request, response);

Demo8:
response.getWriter().write("from demo8");

訪問Demo7,瀏覽器上打印結果:
from demo7from demo8
Tip:

被包含的Servlet程序不能改變響應消息的狀態碼和響應頭,若是它裏面存在這樣的語句,這些語句的執行結果將被忽略

三.Web應用中路徑的寫法


概念:

1.絕對路徑:以/開頭的路徑就叫作絕對路徑,絕對路徑在相對於的路徑上直接拼接獲得最終的路徑。

2.相對路徑:不以/開頭的路徑就叫作相對路徑,相對路徑基於當前所在的路徑計算的到最終的路徑。


虛擬路徑: --寫虛擬路徑時都使用絕對路徑

1)若是路徑是給瀏覽器用的,這個路徑相對於虛擬主機,因此須要寫上web應用的名稱(最好用request.getContextPath()代替,以避免web名稱有變化)。(前四個)
2)若是路徑是個服務器用的,這個路徑相對於web應用,因此能夠省寫web應用的名稱。

<a href="/Day04/.....">
<form action="/Day04/...">
<img src="/Day04/....">      response.setHeader("refresh","3;url=/Day04/...");
response.sendRedirect("/Day04/...");  
request.getRequestDispathce("/index.jsp").forward():
request.getRequestDispathce("/index.jsp").include();
真實路徑: --寫真實路徑時都使用相對路徑

根據原理,具體問題具體分析

servletContext.getRealPath("config.properties");//--給一個相對於web應用目錄的路徑 
classLoader.getResource("../../config.properties");//--給一個相對於類加載目錄的路徑
File file = new File("config.properties");//--相對於程序的啓動目錄
new InputStream("config.properties");//--相對於程序的啓動目錄
相關文章
相關標籤/搜索