請求亂碼
客戶端發送請求常用方式是GET、POST
GET請求
- 使用代碼轉換的方式
- 修改tomcat配置文件server.xml的方式
代碼轉換
url
http://localhost:8080/HelloServlet/h5?username=王學武
servlet類
1 public class HelloServlet5 extends HttpServlet { 2 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 String username = req.getParameter("username"); 6 //get請求過來的數據,在url地址欄上就已經經過編碼了,所以我們取到的就是亂碼 7 System.out.println("username===" + username); 8 9 //tomcat收到了這批數據,getParameter 默認使用ISO-8859-1去解碼 10 //先讓文字回到ISO-8859-1對應的字節數組 , 然后再按utf-8組拼字符串 11 username = new String(username.getBytes("ISO-8859-1"), "UTF-8"); 12 System.out.println("username===" + username); 13 } 14 15 }
console輸出
username===ç妿¦ username===王學武
修改tomcat配置文件
直接在tomcat里面做配置,在tomcat里面做設置處理 conf/server.xml 加上URIEncoding="utf-8",以后get請求過來的數據永遠都是用UTF-8編碼
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="utf-8"/>
servlet類
1 public class HelloServlet5 extends HttpServlet { 2 @Override 3 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 4 String username = req.getParameter("username"); 5 System.out.println("username===" + username); 6 } 7 }
console輸出
username===王學武
POST請求
設置請求體里面的文字編碼
request.setCharacterEncoding("UTF-8");
servlet類
1 public class HelloServlet5 extends HttpServlet { 2 3 @Override 4 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 req.setCharacterEncoding("utf-8"); 6 String name = req.getParameter("username"); 7 System.out.println("設置請求體編碼后:name==="+name); 8 } 9 10 }
console輸出
設置請求體編碼后:name===王五
如果在獲取參數后設置req.setCharacterEncoding("utf-8");就不會起作用
1 public class HelloServlet5 extends HttpServlet { 2 3 @Override 4 protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 String name = req.getParameter("username"); 6 System.out.println("設置請求體編碼前:name==="+name); 7 System.out.println("-------------------------"); 8 9 req.setCharacterEncoding("utf-8"); 10 name = req.getParameter("username"); 11 System.out.println("設置請求體編碼后:name==="+name); 12 } 13 14 }
console輸出
設置請求體編碼前:name===çäº ------------------------- 設置請求體編碼后:name===çäº
對GET方式不起作用
url
http://localhost:8080/HelloServlet/h5?name=王學武
servlet類
1 public class HelloServlet5 extends HttpServlet { 2 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 req.setCharacterEncoding("utf-8"); 6 String name = req.getParameter("name"); 7 System.out.println("name==="+name); 8 } 9 10 }
console輸出
name===ç妿¦
響應亂碼
響應輸出有兩種方式
- 字符流
- 字節流
1 public class HelloServlet5 extends HttpServlet { 2 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 //以字符流的方式寫數據 6 // resp.getWriter().write("<h3>response...</h3><br/>"); 7 // resp.getWriter().write("<h3>response...</h3>"); 8 // resp.getWriter().flush(); 9 //以字節流的方式寫數據 10 resp.getOutputStream().write("response...".getBytes()); 11 } 12 13 }
注:getWriter(),outPutStream在進行文件寫入操作只能用一個,否則會拋出java.lang.IllegalStateException: getWriter() has already been called for this response
字符流輸出亂碼
1 public class HelloServlet5 extends HttpServlet { 2 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 //以字符流的方式寫數據 6 PrintWriter out = resp.getWriter(); 7 //out.write("<h3>響應輸出數據</h3><br/>"); 8 9 //1. 指定輸出到客戶端的時候,這些文字使用UTF-8編碼 10 resp.setCharacterEncoding("UTF-8"); 11 //2. 直接規定瀏覽器看這份數據的時候,使用什么編碼來看。 12 resp.setHeader("Content-Type", "text/html; charset=UTF-8"); 13 14 out.write("<h3>響應輸出數據</h3>"); 15 } 16 17 }
原因:必須在resp.getWriter()之前設置字符編碼操作
1 public class HelloServlet5 extends HttpServlet { 2 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 6 //1. 指定輸出到客戶端的時候,這些文字使用UTF-8編碼 7 resp.setCharacterEncoding("UTF-8"); 8 //2. 直接規定瀏覽器看這份數據的時候,使用什么編碼來看。 9 resp.setHeader("Content-Type", "text/html; charset=UTF-8"); 10 11 //以字符流的方式寫數據 12 PrintWriter out = resp.getWriter(); 13 out.write("<h3>響應輸出數據</h3>"); 14 } 15 16 }
修改servlet類的代碼
1 public class HelloServlet5 extends HttpServlet { 2 3 @Override 4 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 5 6 //1. 指定輸出到客戶端的時候,這些文字使用UTF-8編碼 7 resp.setCharacterEncoding("UTF-8"); 8 //2. 直接規定瀏覽器看這份數據的時候,使用什么編碼來看。 9 resp.setHeader("Content-Type", "text/html; charset=UTF-8"); 10 11 //以字符流的方式寫數據 12 PrintWriter out = resp.getWriter(); 13 out.write("<h3>響應輸出數據</h3>"); 14 } 15 16 }
字節流輸出
1 public class HelloServlet5 extends HttpServlet { 2 @Override 3 protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 4 //1. 指定瀏覽器看這份數據使用的碼表 5 resp.setHeader("Content-Type", "text/html;charset=UTF-8"); 6 7 //2. 指定輸出的中文用的碼表 8 resp.getOutputStream().write("響應輸出數據".getBytes("UTF-8")); 9 } 10 }
其實,無論是字節流輸出還是字符流輸出,通用寫法:
- response.setContentType("text/html;charset=UTF-8")
- 寫輸出數據即可