JAVA基礎之HttpServletRequest請求

   HttpServletRequest請求是獲取請求行、請求頭和請求體;能夠經過這個方法設置防盜鏈,獲取地址。牢記解決亂碼的方式。html

  怎麼選擇是重定向仍是轉發呢?一般狀況下轉發更快,並且能保持request內的對象,因此他是第一選擇。可是因爲在轉發以後,瀏覽器中URL仍然指向開始頁面,此時若是重載當前頁面,開始頁面將會被從新調用。若是你不想看到這樣的狀況,則選擇轉發。詳見https://www.cnblogs.com/wenanbang/p/4142415.htmljava

其實也能夠單純的認爲是如果帶數據的話就請求轉發了,若改地址的話就重定向了。web

1、HttpServletRequest:瀏覽器

  概述和運行流程詳見HttpServletResponse!服務器

2、獲取HTTP請求:post

 3、獲取請求行:性能

一、得到客戶端的請求方式:網站

getMethod()     得到String類型;ui

二、得到請求的資源:編碼

getContextPath() 得到String類型的 web應用的名稱(項目名)

getQueryString() 得到 get提交url 地址後的參數字符串;

 getRequestURI() 獲取URI地址String類型

 getRequestURL() 獲取URL地址StringBuffer類型

request.getRemoteAddr() 得到訪問的客戶端IP地址

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 獲取請求方式
        String method = request.getMethod();
        System.out.println("請求方式爲:" + method);
        // 獲取請求URI
        String URI = request.getRequestURI();
        System.out.println("URI爲" + URI);
        // 獲取請求URL
        StringBuffer URL = request.getRequestURL();
        System.out.println("URL爲:" + URL);
        // URI爲/WEB/LineServlet
        // URL爲:http://localhost:8080/WEB/LineServlet
        // 獲取WEB項目名稱
        String name = request.getContextPath();
        System.out.println("WEB項目名稱爲:" + name);
        // 獲取get請求後url後的字符串
        String query = request.getQueryString();
        System.out.println("get請求的參數爲:" + query);
        // 獲取客戶端的ip地址
        String ip = request.getRemoteAddr();
        System.out.println("ip地址爲:" + ip);
    }

4、獲取請求頭:

 getHeader(String name) 

referer 頭的做用:獲取該訪問的來源,作防盜鏈

protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // 獲取refere頭
        String refere = request.getHeader("Referer");
        String content = null;
        if(refere.startsWith("http://localhost:8080")){
            content="真的離婚了!";        
        }else{
            content="你是小偷!";
        }
        //解決亂碼
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write(content);        
    }
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <a href="/WEB/RefereServlet">宋仲基和宋慧喬分手了</a>
</body>
</html>

5、得到請求體:

一、解決post提交方式的亂碼:request.setCharacterEncoding("UTF-8");

二、解決get提交的方式的亂碼:

            parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //解決中文亂碼問題(post請求)
//        request.setCharacterEncoding("UTF-8");
        //獲取請求參數
        //1.單個值的參數
        String name=request.getParameter("username");
        //get解決亂碼:得先將獲取到的信息用原來的編碼表進行解碼,而後再用後來的編碼表進行編碼
        name=new String(name.getBytes("ISO-8859-1"),"UTF=8");
        String sex=request.getParameter("sex");
        System.out.println(name+" ......"+sex);
        //2.獲取多個值的
        String[] hobbys=request.getParameterValues("hobby");
        //遍歷
        for(String s:hobbys){
            System.out.println(s);
        }
        //3.獲取全部的請求參數MAP
        Map<String,String[]> map=request.getParameterMap();
        //遍歷
        Set<String> set=map.keySet();
        for(String str:set){
            String [] value=map.get(str);
            for(String v:value){
                System.out.println(str+"..."+v);
            }
        }        

 

6、request的其餘功能:

一、request 也是個域對象,也是具備如下功能:

  setAttribute(String name, Object o)

  getAttribute(String name)

  removeAttribute(String name)

二、request完成請求轉發:

  得到請求轉發器----path是轉發的地址

RequestDispatcher getRequestDispatcher(String path)

  經過轉發器對象轉發

requestDispathcher.forward(ServletRequest request, ServletResponse response)

7、ServletContext域與Request域的生命週期比較

一、ServletContext

       建立:服務器啓動

       銷燬:服務器關閉

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

二、request

      建立:訪問時建立request

      銷燬:響應結束request銷燬

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

8、轉發和重定向的區別:

一、重定向兩次請求,轉發一次請求

二、重定向地址欄的地址變化,轉發地址不變

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

四、轉發的性能要優於重定向

(須要帶數據的時候用請求轉發,由第一個Servlet01帶數據到Servlet02須要地址轉變的用重定向)

public class Servlet01 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //向request域中存值
        request.setAttribute("name", "張三" );
        //請求轉發
        request.getRequestDispatcher("/Servlet02").forward(request, response);
    
        
    }
public class Servlet02 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //從request 域中取值
        String name =(String)request.getAttribute("name");
        //解決中文亂碼
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("hello"+name);
    }
相關文章
相關標籤/搜索