javaweb開發入門-request對象

來源:互聯網
上載者:User

HttpServletRequest

HttpServletRequest對象代表用戶端的請求,當用戶端通過HTTP協議訪問伺服器時,HTTP要求標頭中的所有資訊都封裝在這個對象中,開發人員通過這個對象的方法,可以獲得客戶這些資訊

request常用方法

l獲得客戶機資訊

getRequestURL方法返回用戶端發出請求時的完整URL。

getRequestURI方法返回請求行中的資源名部分。

getQueryString 方法返回請求行中的參數部分。

getRemoteAddr方法返回傳出請求的客戶機的IP地址

getRemoteHost方法返回傳出請求的客戶機的完整主機名稱

getRemotePort方法返回客戶機所使用的網路連接埠號碼

getLocalAddr方法返回WEB伺服器的IP地址。

getLocalName方法返回WEB伺服器的主機名稱

getMethod得到客戶機請求方式

 

URL和URI的關係:URI是URL的父類,URI描述資源,URL描述互連網的資源

 

String url = request.getRequestURL().toString();

        System.out.println(url);

        System.out.println(request.getRequestURI());

       

        System.out.println(request.getQueryString());

       

        System.out.println(request.getRemoteAddr());

       

        System.out.println(request.getRemoteHost());

       

        System.out.println(request.getRemotePort());

       

        System.out.println(request.getMethod());

 

Request常用方法

l獲得客戶機要求標頭

getHead(name)方法

•getHeaders(String name)方法

•getHeaderNames方法

l獲得客戶機請求參數(用戶端提交的資料)

•getParameter(name)方法

•getParameterValues(String name)方法

•getParameterNames方法

•getParameterMap方法  //

•getInputStream

 

擷取客戶機帶過來的資料

 

        String username = request.getParameter("username");

        System.out.println(username);

      

        System.out.println("----------------------");

      

        Enumeration  e = request.getParameterNames();

        while(e.hasMoreElements()){

           String name =(String) e.nextElement();

           String value = request.getParameter(name);

           System.out.println(name + "=" + value);

       }

      

        System.out.println("----------------------");

      

        String values[] =request.getParameterValues("username");

        for(int i=0;values!=null &&i<values.length;i++){

           System.out.println(values[i]);

       }

      

        System.out.println("----------------------");

        //http://localhost:8080/day05/servlet/RequestDemo3?username=aaa&username=bbb&password=123

        Map<String,String[]>map = request.getParameterMap();

        Set<Map.Entry<String,String[]>> set = map.entrySet();

        for(Map.Entry<String,String[]> entry : set){

           username =entry.getKey();

           values =entry.getValue();

           for(int i=0;values!=null &&i<values.length;i++){

               System.out.println(username +"=" + values[i]);

           }

       }

 

request常見應用1

l防盜鏈

String referer =request.getHeader("referer");

        if(referer==null ||!referer.startsWith("http://localhost")){

           response.sendRedirect("/day05/index.html");

           return;

       }

        String data = "鳳姐日記";

        response.setCharacterEncoding("UTF-8");

        response.setHeader("content-type", "text/html;charset=UTF-8");

        response.getWriter().write(data);

 

l各種表單輸入項資料的擷取

•text、password、radio、checkbox、

•file、select、textarea、 hidden、

•image、button給js編程用

package cn.itcast.request;

 

import java.io.IOException;

import java.util.Arrays;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

//擷取不同類型表單的資料(擷取客戶機表單提交的資料)

public class RequestDemo5 extends HttpServlet {

 

    publicvoid doGet(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

 

        System.out.println(request.getParameter("username"));

        System.out.println(request.getParameter("password"));

        System.out.println(request.getParameter("gender"));

        System.out.println(Arrays.asList(request.getParameterValues("like")==null?newString[]{}:request.getParameterValues("like")));

        System.out.println(request.getParameter("city"));

        System.out.println(request.getParameter("resume"));

        System.out.println(request.getParameter("xx"));

       

       

        String username =request.getParameter("username"); //"" null

        if(username==null ||username.trim().equals("")){

            System.out.println("您沒有提交資料");

        }

        request.getParameter("gender");  //null

        request.getParameterValues("like");//null

    }

    publicvoid doPost(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        doGet(request, response);

    }

 

}

 

form表單:

 

<!DOCTYPE HTML PUBLIC "-//W3C//DTDHTML 4.01 Transitional//EN">

<html>

  <head>

    <title>form.html</title>

   

    <meta http-equiv="keywords"content="keyword1,keyword2,keyword3">

    <meta http-equiv="description"content="this is my page">

    <meta http-equiv="content-type"content="text/html; charset=UTF-8">

   

    <!--<link rel="stylesheet"type="text/css"
href="./styles.css">-->

 

  </head>

 

  <body>

    <form action="/day05/servlet/RequestDemo5"method="post">

     使用者名稱:<input type="text"name="username"><br/>

     密碼:<input type="password"name="password"><br/>

     性別:<input type="radio"name="gender" value="male">男

         <input type="radio"name="gender" value="female">女

         <br/>

     愛好:<input type="checkbox"name="like" value="basketball">藍球

         <input type="checkbox"name="like" value="football">足球

         <input type="checkbox"name="like" value="java">java

         <input type="checkbox"name="like" value=".net">.net

         <br/>

     所在地:<select name="city">

                <option value="bj">北京</option>

                <option value="sh">上海</option>

                <option value="cs">長沙</option>

           </select><br/>

         簡曆:<textarea rows="5"cols="60" name="resume"></textarea><br/>

         大頭照:<input type="file" name="image"><br/>

         <input type="hidden"name="xx" value="yyy">

     <input type="submit" value="提交">

    </form>

   

   

    <form action="/day05/servlet/RequestDemo6"method="get">

     使用者名稱:<input type="text"name="username"><br/>

     <input type="submit" value="提交">

    </form>

   

   

     <form action="/day05/servlet/RequestDemo7"method="post">

     使用者名稱:<input type="text"name="username"><br/>

     <input type="submit" value="提交">

    </form>

   

    <!-- 超連結後面帶中文資料一定要經過url編碼 -->

    <a href="/day05/servlet/RequestDemo8?name=方立勳">點點</a>

   

   

  </body>

</html>

 

如果都沒有添 或選擇,輸入項預設為空白串“”,選擇項為NUll

所以最好用這種方式進行比較判斷:if(username==null ||username.trim().equals("")){

l請求參數的中文亂碼問題

 

importjava.io.IOException;

 

importjavax.servlet.ServletException;

importjavax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

 

//request的亂碼問題:get\post

public classRequestDemo6 extends HttpServlet {

 

    public void doGet(HttpServletRequest request, HttpServletResponseresponse)

            throwsServletException, IOException {

 

        //以下代碼可以解決post提交的亂碼

        request.setCharacterEncoding("UTF-8");  //只對post方式有效

        //String username1 =request.getParameter("username");

        //System.out.println(username1);

       

       

        //以下代碼可能解決get提交的亂碼

        String username2 =request.getParameter("username");

        //username2 = newString(username2.getBytes("iso8859-1"),"UTF-8");

        System.out.println(username2);

       

    }

 

    public void doPost(HttpServletRequest request,HttpServletResponse response)

            throwsServletException, IOException {

        doGet(request,response);

    }

 

}

 

importjava.io.IOException;

 

importjavax.servlet.ServletException;

importjavax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

 

//思考題 :下面程式有亂碼嗎????

public classRequestDemo7 extends HttpServlet {

 

    public void doGet(HttpServletRequest request, HttpServletResponseresponse)

            throwsServletException, IOException {

       

        request.setCharacterEncoding("UTF-8");

        String username = request.getParameter("username");  //方立

       

        response.setCharacterEncoding("gb2312");

        response.setContentType("text/html;charset=gb2312");

        response.getWriter().write(username);

    }

 

    public void doPost(HttpServletRequest request,HttpServletResponse response)

            throwsServletException, IOException {

 

        doGet(request,response);

    }

 

}

 

 

lURL地址的編碼

 

 

import java.io.IOException;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

 

//超連結提交中文資料  在伺服器端擷取的代碼

 

/*

 *   <!-- 超連結後面帶中文資料一定要經過url編碼 -->

   <a href="/day05/servlet/RequestDemo8?name=方立勳">點點</a>

 *

 */

public class RequestDemo8 extendsHttpServlet {

 

       publicvoid doGet(HttpServletRequest request, HttpServletResponse response)

                     throws ServletException, IOException {

 

              Stringname = request.getParameter("name");

              name= new String(name.getBytes("iso8859-1"),"UTF-8");

              System.out.println(name);

             

             

       }

 

       publicvoid doPost(HttpServletRequest request, HttpServletResponse response)

                     throws ServletException, IOException {

 

              doGet(request, response);

       }

 

}

 

request常見應用2

lrequest對象實現請求轉寄:請求轉寄指一個web資源收到用戶端請求後,通知伺服器去調用另外一個web資源進行處理。

l請求轉寄的應用情境:MVC設計模式

lrequest對象提供了一個getRequestDispatcher方法,該方法返回一個RequestDispatcher對象,調用這個對象的forward方法可以實現請求轉寄。

lrequest對象同時也是一個域對象,開發人員通過request對象在實現轉寄時,把資料通過request對象帶給其它web資源處理。

setAttribute方法

getAttribute方法 

removeAttribute方法

getAttributeNames方法

 

 * 請求轉寄的特點:

 * 1.請求轉寄對瀏覽器而言只發了一次請求,並且瀏覽器的地址欄不會發生變化

 * 2.請求轉寄下,伺服器只會建立一個request response

 *

 * 請求轉寄應用情境mvc設計模式

 * 在mvc設計模式下,都是servlet處理請求,處理請求產生資料後,servlet會把資料存放區request域,然後轉寄給jsp顯示

 *

    String data = "aaaa";

        request.setAttribute("data", data);

      

        request.setAttribute("data", data);

        RequestDispatcher rd =request.getRequestDispatcher("/view.jsp");

        rd.forward(request, response);

 

請求轉寄的細節

lforward方法用於將請求轉寄到RequestDispatcher對象封裝的資源。

l如果在調用forward方法之前,在Servlet程式中寫入的部分內容已經被真正地傳送到了用戶端,forward方法將拋出IllegalStateException異常。

l如果在調用forward方法之前向Servlet引擎的緩衝區(response)中寫入了內容,只要寫入到緩衝區中的內容還沒有被真正輸出到用戶端,forward方法就可以被正常執行,原來寫入到輸出緩衝區中的內容將被清空,但是,已寫入到HttpServletResponse對象中的回應標頭欄位資訊保持有效

 

 

        String data = "aaa";

        response.getWriter().write(data);  //瀏覽器不會看到這個資料的輸出

      

      

        request.getRequestDispatcher("/index.jsp").forward(request, response);

      

        String data2 = "bbb";

        response.getWriter().write(data2); //瀏覽器不會看到這個資料的輸出

請求重新導向和請求轉寄的區別

l一個web資源收到用戶端請求後,通知伺服器去調用另外一個web資源進行處理,稱之為請求轉寄。

l一個web資源收到用戶端請求後,通知瀏覽器去訪問另外一個web資源,稱之為請求重新導向。

 

lRequestDispatcher.forward方法只能將請求轉寄給同一個WEB應用中的組件;而HttpServletResponse.sendRedirect方法還可以重新導向到同一個網站上的其他應用程式中的資源,甚至是使用絕對URL重新導向到其他網站的資源。

l如果傳遞給HttpServletResponse.sendRedirect 方法的相對URL以“/”開頭,它是相對於整個WEB網站的根目錄;如果建立RequestDispatcher對象時指定的相對URL以“/”開頭,它是相對於當前WEB應用程式的根目錄。

l調用HttpServletResponse.sendRedirect方法重新導向的訪問過程結束後,瀏覽器地址欄中顯示的URL會發生改變,由初始的URL地址變成重新導向的目標URL;調用RequestDispatcher.forward方法的請求轉寄過程結束後,瀏覽器地址欄保持初始的URL地址不變。

lHttpServletResponse.sendRedirect方法對瀏覽器的請求直接作出響應,響應的結果就是告訴瀏覽器去重新發出對另外一個URL的訪問請求;RequestDispatcher.forward方法在伺服器端內部將請求轉寄給另外一個資源,瀏覽器只知道發出了請求並得到了響應結果,並不知道在伺服器程式內部發生了轉寄行為。

lRequestDispatcher.forward方法的調用者與被調用者之間共用相同的request對象和response對象,它們屬於同一個訪問請求和響應過程;而HttpServletResponse.sendRedirect方法調用者與被調用者使用各自的request對象和response對象,它們屬於兩個獨立的訪問請求和響應過程。

 

RequestDispatcher

linclude方法:

•RequestDispatcher.include方法用於將RequestDispatcher對象封裝的資源內容作為當前響應內容的一部分包含進來,從而實現可程式化的伺服器端包含功能。

•被包含的Servlet程式不能改變響應訊息的狀態代碼和回應標頭,如果它裡面存在這樣的語句,這些語句的執行結果將被忽略

 

       //動態包含

        request.getRequestDispatcher("/servlet/HeadServlet").include(request, response);

      

        String data = "aaa<br/>";

        response.getWriter().write(data);

      

        request.getRequestDispatcher("/servlet/FootServlet").include(request, response);

      

 

工程中“\”的用法:

伺服器端“\”代表Web應用,用戶端代表整個網站

        this.getServletContext().getRealPath("/download/日本 妞.jpg");

      

      

        this.getServletContext().getResourceAsStream("/download/日本 妞.jpg");

      

      

        request.getRequestDispatcher("/login.html");

      

      

        response.sendRedirect("/day05/index.jsp");

      

       /*

      

       <a href="/day05/message.jsp">點點</a>

      

       <form action="/day05/servlet/FootServlet">

      

        </form>

      

       <img src="/day05/download/日本紐.jpg">

      

       */

    }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.