學習HttpServletRequest和HttpServletResponse的使用
注意:再提醒,在除錯網頁時,務必要注意瀏覽器有快取記錄,所以在除錯的時候需要注意,減少不該有的困擾,別浪費時間~
HttpServletRequest:封裝了客戶端提供過來的一切資料.
- 可以獲取客戶端的請求頭資訊
- 獲取客戶端提交的資料
- 獲取中文資料
但是在處理中文的資料過程中,有可能會出現亂碼,這裡根據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:負責返回資料給客戶端
- 以字元流的方式寫資料
- 以位元組流的方式寫資料
以下是關於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中的自動配置情況:
好好學,慢慢來,堅持~