Servlet的學習(二)——請求方式(get/post)、處理中文亂碼
一、Servlet獲取請求資料
要獲取請求資料,使用request.getParameter()
程式碼展示:
<body> <form action="servlet/SubmitTest"> 請輸入使用者名稱:<input type="text" name="username"> 請輸入密碼: <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")