學習HttpServletRequest和HttpServletResponse的使用

注意:再提醒,在調試網頁時,務必要注意瀏覽器有緩存記錄,所以在調試的時候需要注意,減少不該有的困擾,別浪費時間~

HttpServletRequest:封裝了客戶端提供過來的一切數據.

  1. 可以獲取客戶端的請求頭信息
  2. 獲取客戶端提交的數據
  3. 獲取中文數據

但是在處理中文的數據過程中,有可能會出現亂碼,這裏根據get和post請求兩種不同的情況進行講解。
    1)get請求時:
     get請求過來的數據,在url地址欄上已經經過編碼了,所以我們得到的是亂碼;

     tomcat收到了數據,getParameter默認使用ISO-  8859-1  去編碼;

     所以我們先讓文字回到ISO-8859-1對應的字節數組,然後再按utf-8組拼字符串。

     我們也可以可以在tomcat裏面做配置,使get請求過來的數據永遠都是UTF-8編碼,在conf->server.xml 加URIEncoding="UTF-8"

<Connector connectionTimeout="20000" port="9000" protocol="Http/1.1" redirectPort="8843" URIEncoding="UTF-8" />

    2)post請求時:需要在取數據之前設置指定的編碼

 

測試參考代碼如下:HServlet.java

 

package cw.Servlet;

import java.io.IOException;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class HServlet
 */
public class HServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1.可以獲取客戶端的請求頭信息
		Enumeration<String> headerNames=request.getHeaderNames();	//得到一個枚舉集合
		while(headerNames.hasMoreElements()){
			String name=(String)headerNames.nextElement();
			String value=request.getHeader(name);
			System.out.println(name+"="+value);
		}
		
		//2.獲取客戶端提交的數據
			//http://localhost:9000/JavaWeb_1/HServlet?name=aa&&age=18
		String name2=request.getParameter("name");
		String age=request.getParameter("age");
		System.out.println("name="+name2);		//null
		System.out.println("age="+age);
		
		//Enumeration<String> parameterNames=request.getParameterNames();  //獲取所有的參數,得到一個枚舉集合
		Map<String,String[]> map=request.getParameterMap();
		Set<String> keySet=map.keySet();
		Iterator<String> iterator=keySet.iterator();
		while(iterator.hasNext()){
			String key=(String)iterator.next();
			String va=map.get(key)[0];
			System.out.println(key+":"+va);
		}		
		//3.獲取中文數據
		String username=request.getParameter("username");
		String password=request.getParameter("password");
		System.out.println(username+"..."+password);
		username=new String(username.getBytes("ISO-8859-1"),"UTF-8");
		System.out.println(username+"..."+password);
		
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 處理post請求過來的數據亂碼
		// 需要在取數據之前設置指定的編碼
		request.setCharacterEncoding("UTF-8");		//這裏設置的是請求體裏的文字編碼
		String username=request.getParameter("username");
		String password=request.getParameter("password");
		System.out.println(username+"..."+password);
		
	}

}

 

HttpServletResponse:負責返回數據給客戶端

  1. 以字符流的方式寫數據
  2. 以字節流的方式寫數據

以下是關於HttpServletResponse常用的一些方法

設置當前這個請求的處理狀態碼    response.setHeader(arg0, arg1);
設置一個頭    response.setHeader(name, arg1);
設置響應的內容類型,以及編碼    response.setContentType(arg0);

與HttpServletRequest類似,在返回數據給客戶端時,也存在着中文亂碼的問題,所以需要解決有可能存在的中文亂碼問題。中文亂碼分爲兩種。

第一種是以字符流的方式寫數據

如果用的是字符流,這裏寫出去的是默認ISO-8859-1,所以我們需要設置
        response.setCharacterEncoding("UTF-8");    //指定輸出到客戶端的時候,這些文字使用UTF-8編碼
        response.setHeader("Content-Type","text/html;charset=UTF-8");    //直接規定瀏覽器看這個數據時,就是用UTF-8
        response.getWriter().write("大家好!");

第二種是以字節流的方式寫數據

//直接規定瀏覽器看這個數據時,就是用UTF-8,且響應的數據類型是html文本
        response.setContentType("text/html;charset=UTF-8");
//默認情況下getOutputStream方法使用的是UTF-8的編碼

//如果想指定具體編碼,可以獲取byte數組時指定.getBytes("UTF-8")
        response.getOutputStream().write("大家好!2".getBytes());

 

代碼實現:

HServlet.java

package cw.Servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class HServlet2
 */
public class HServlet2 extends HttpServlet {
   
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
		//以字符流的方式寫數據
		response.getWriter().write("hello");
		response.getWriter().write("<h1>hello</h1>");
		//以字節流的方式寫數據
		//response.getOutputStream().write("hello2....".getBytes());
		
		//響應的數據包含中文,可能出現導致亂碼
		//如果用的是字符流,這裏寫出去的是默認ISO-8859-1,所以我們需要設置
		response.setCharacterEncoding("UTF-8");	//指定輸出到客戶端的時候,這些文字使用UTF-8編碼
		response.setHeader("Content-Type","text/html;charset=UTF-8");	//直接規定瀏覽器看這個數據時,就是用UTF-8
		response.getWriter().write("大家好!");
		
		//如果是用的是以字節流的方式
		//直接規定瀏覽器看這個數據時,就是用UTF-8,且響應的數據類型是html文本
		response.setContentType("text/html;charset=UTF-8");
		//默認情況下getOutputStream方法使用的是UTF-8的編碼,如果想指定具體編碼,可以獲取byte數組時,指定。getBytes("UTF-8")
		response.getOutputStream().write("大家好!2".getBytes());
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	}

}

 

在使用servlet時,定義了一個login.html進行調試

<!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>
	<h2>請輸入登陸信息</h2>
	<!-- <form action="LoginServlet" method="get"> -->
	<!-- <form action="HServlet" method="get"> -->
	<form action="HServlet" method="post">
		賬號:<input type="text" name="username" />
		密碼:<input type="text" name="password" />
		<input type="submit" name="登陸" />
	</form>	
</body>
</html>

 

web.xml配置文件中在新建Servlet中的自動配置情況:

 

好好學,慢慢來,堅持~

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章