1. 程式人生 > >Servlet的學習(二)——請求方式(get/post)、處理中文亂碼

Servlet的學習(二)——請求方式(get/post)、處理中文亂碼

一、Servlet獲取請求資料

要獲取請求資料,使用request.getParameter()

程式碼展示:

 <body>
    <form action="servlet/SubmitTest">
    	請輸入使用者名稱:<input type="text" name="username">
    	請輸入密碼:&nbsp;<input type="password" name="password">
    	<input type="submit" value="提交">
    </form>
  </body>
import java.io.IOException;

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

public class SubmitTest extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		String name = request.getParameter("username");
		String pass = request.getParameter("password");
		System.out.println("使用者名稱:" + name + ",密碼:" + pass);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		doGet(request, response);
	}

}

當在頁面提交後,即可在控制檯列印輸出使用者名稱和密碼。

二、請求方式(get/post)

get和post請求是在頁面表單以何種方式提交,也就是設定method是get還是post,預設是get方式。

下面來說說兩種方式的區別:

GET請求:

①引數傳遞方式:GET請求在瀏覽器位址列傳引數,以?分割URL和傳輸資料,引數之間以&相連

②資料量限制:GET提交的資料大小有限制(因為瀏覽器對URL的長度有限制)

③安全問題:GET方式提交資料,會帶來安全問題(位址列顯示出來)

④亂碼處理方式:GET方式請求處理亂碼每個引數都要處理

⑤GET方式效率高

使用場合:傳遞少量的非敏感的引數

比如使用連結的方式,即<a href=""></a>

GET請求對應的Servlet的方法是doGet()

POST請求:

①引數傳遞方式:POST方法是把提交的資料放在HTTP包的Body中(位址列看不到)

②資料量限制:POST方法提交的資料沒有限制 (檔案上傳必須是POST)

③安全問題:POST提交的資料相對安全

④亂碼處理方式:統一處理所有

⑤效率相對沒有GET高

post對應的Servlet的方法是doPost

三、處理中文亂碼

首先,我們需要明白為什麼會產生中文亂碼,產生中文亂碼的原因無非就是伺服器和客戶端溝通的編碼不一致,解決的辦法就是在客戶端和伺服器之間設定一個統一的編碼。

①接收引數亂碼:

ⅠGET中文亂碼

在Tomcat7及以下

客戶端以UTF-8的編碼傳輸資料到伺服器端,而伺服器端的request物件使用的是ISO8859-1這個字元編碼來接收資料,伺服器和客戶端溝通的編碼不一致因此才會產生中文亂碼的。解決辦法:在接收到資料後,先獲取request物件以ISO8859-1字元編碼接收到的原始資料的位元組陣列,然後通過位元組陣列以指定的編碼構建字串,解決亂碼問題。

比如接收到name:

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

name=newString(name.getBytes("ISO8859-1"),"UTF-8");

GET亂碼需要對每個引數都進行亂碼處理

ⅡPOST中文亂碼

由於客戶端是以UTF-8字元編碼將表單資料傳輸到伺服器端的,因此伺服器也需要設定以UTF-8字元編碼進行接收,要想完成此操作,伺服器可以直接使用從ServletRequest介面繼承而來的"setCharacterEncoding(charset)"方法進行統一的編碼設定。

request.setCharacterEncoding("utf-8")

②響應亂碼

瀏覽器識別不到返回的中文是什麼編碼格式,就會預設使用GB2312,如果返回的是UTF-8格式的那麼在瀏覽器上就會顯示亂碼的問題。

解決辦法:response.setContentType("text/html;charset=UTF-8")