1. 程式人生 > >Java中的 Request 和 response

Java中的 Request 和 response

一,什麼是請求和迴應?

    request:請求物件。封裝了請求資訊,通過這個物件獲取請求資訊,是ServletRequest的子介面。

    響應:響應物件封裝了響應資訊,通過這個物件將Servlet的的響應資訊響應給瀏覽器,是ServletResponse的的子介面。

二,請求和響應分別有哪些方法?

    請求:( 前兩方法常用

  1. getParameter(String)方法根據表單名稱獲取輸入的值
  2. getParameterValues(String)方法根據名字獲取一組相關的資料,返回String []
  3. getParameterNames()方法獲取所有引數的名字,返回型別為Enumeration(列舉)
  4. getParameterMap()方法獲取所有資料,返回Map型別
  5. 例:
    @WebServlet("/oneServlet")
    public class OneServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
           
        public OneServlet() {
            super();
        }
    
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		/**
    		 * request:封裝了http請求資訊,就是通過這個物件獲取請求資訊,是ServletRequest的子介面,(常用的兩個方法)
    		 * response:封裝了響應資訊
    		 * 這兩個介面在每次訪問時都會被建立,由Servlet容器建立,並且在伺服器呼叫service方法時傳入
    		 */
    		//4.getWriter()方法,把結果響應給瀏覽器
    		PrintWriter writer = response.getWriter();
    		
    		//1.getParameter(String) 根據表單name獲取輸入的值
    		String username = new String(request.getParameter("username").getBytes("iso-8859-1"),"utf-8");
    		//輸出到頁面
    		writer.write("<h1>"+username+"</h1>");
    		
    		System.out.println("姓名:"+username);
    		//2.getParameterValues(String)根據名字獲取一組相關的資料,返回String[]
    		String[] hobby = request.getParameterValues("hobby");
    		System.out.print("愛好:");
    		for(String h : hobby){
    			System.out.print(h+"   ");
    		}
    		//獲取性別
    		String sex = request.getParameter("sex");
    		System.out.println("\n性別:"+sex);
    		//3.getParameterNames ()方法  獲取所有引數的名字,返回型別為Enumeration
    		Enumeration<String> names = request.getParameterNames();
    		System.out.print("每個引數的名字為:");
    		while (names.hasMoreElements()) {
    			String name = names.nextElement();
    			System.out.print(name+"   ");
    		}
    		System.out.println();
    		
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		doGet(request, response);
    	}
    
    }
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<form action="oneServlet" method="post">
    		姓名:<input type="text" name="username" id="username">
    		<br>
    		<input type="checkbox" name="hobby" value="read"/>讀書
    		<input type="checkbox" name="hobby" value="run"/>跑步
    		<input type="checkbox" name="hobby" value="football"/>踢足球
    		<br>
    		性別:<input type="radio" name="sex" value="nan"/>男
    			<input type="radio" name="sex" value="nv"/>女
    		<br>
    		<input type="submit" value="提交"/>
    	</form>
    </body>
    </html>

    頁面結果:控制檯結果:

   迴應:( 兩個方法互斥,只能使用一種

  1. getWiter()方法用於輸出html資訊,文字資訊。
  2. getOutputSteam()用於下載檔案,如* .avi等。
  3. @WebServlet("/twoServlet")
    public class TwoServlet extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
        public TwoServlet() {
            super();
        }
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	
    	}
    
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		//獲取字元輸出流物件
    		PrintWriter out = response.getWriter();
    		//獲取姓名
    		String username = request.getParameter("username");
    		//列印
    		out.write("姓名:"+username);
    	}
    }
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>Insert title here</title>
    </head>
    <body>
    	<form action="twoServlet" method="post">
    		姓名:<input type="text" name="username" id="username">
    		<br>
    		<input type="submit" value="提交"/>
    	</form>
    </body>
    </html>

    頁面結果:列印結果:

三,為什麼會出現請求或響應亂碼?

    如圖,使用者通過瀏覽器向Servlet發出請求與Servlet向瀏覽器做出響應都要經過Tomcat伺服器,而Tomcat伺服器的編碼格式為ISO-8859-1,而頁面與Servlet是utf-8,頁面和Servlet的編碼與Tomcat伺服器的編碼不同,所以會產生亂碼。

四,如何處理請求亂碼與響應亂碼?

  第一種方法:可以處理請求亂碼與響應亂碼

            PrintWriter out = response.getWriter();
		//獲取姓名
		String username = request.getParameter("username");
		//第一種:可以處理get和post請求
		byte[] byte1 = username.getBytes("iso-8859-1");//把獲取的name值(iso-8859-1)轉成位元組碼
		String username1 = new String(byte1, "utf-8");
		System.out.println(username1);
		out.write("姓名:"+username);

  先將值轉換成位元組碼,而位元組碼可以進行編碼轉換,從而避免亂碼

第二種方法:

   針對post請求,直接使用 HttpServletRequest 的 setCharacterEncoding("編碼") 方法進行轉換

request.setCharacterEncoding("utf-8");

   針對get請求,且Tomcat版本為8.0以下 :可以修改Tomcat的server.xml檔案,在connector節點新增useBodyEncodingForURI="true"。(Tomcat8.0及以上已經預設新增