注意:再提醒,在調試網頁時,務必要注意瀏覽器有緩存記錄,所以在調試的時候需要注意,減少不該有的困擾,別浪費時間~
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中的自動配置情況:
好好學,慢慢來,堅持~