Java中的 Request 和 response
阿新 • • 發佈:2018-12-21
一,什麼是請求和迴應?
request:請求物件。封裝了請求資訊,通過這個物件獲取請求資訊,是ServletRequest的子介面。
響應:響應物件封裝了響應資訊,通過這個物件將Servlet的的響應資訊響應給瀏覽器,是ServletResponse的的子介面。
二,請求和響應分別有哪些方法?
請求:( 前兩方法常用)
- getParameter(String)方法根據表單名稱獲取輸入的值
- getParameterValues(String)方法根據名字獲取一組相關的資料,返回String []
- getParameterNames()方法獲取所有引數的名字,返回型別為Enumeration(列舉)
- getParameterMap()方法獲取所有資料,返回Map型別
- 例:
@WebServlet("/oneServlet") public class OneServlet extends HttpServlet { private static final long serialVersionUID = 1L; public OneServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { /** * request:封裝了http請求資訊,就是通過這個物件獲取請求資訊,是ServletRequest的子介面,(常用的兩個方法) * response:封裝了響應資訊 * 這兩個介面在每次訪問時都會被建立,由Servlet容器建立,並且在伺服器呼叫service方法時傳入 */ //4.getWriter()方法,把結果響應給瀏覽器 PrintWriter writer = response.getWriter(); //1.getParameter(String) 根據表單name獲取輸入的值 String username = new String(request.getParameter("username").getBytes("iso-8859-1"),"utf-8"); //輸出到頁面 writer.write("<h1>"+username+"</h1>"); System.out.println("姓名:"+username); //2.getParameterValues(String)根據名字獲取一組相關的資料,返回String[] String[] hobby = request.getParameterValues("hobby"); System.out.print("愛好:"); for(String h : hobby){ System.out.print(h+" "); } //獲取性別 String sex = request.getParameter("sex"); System.out.println("\n性別:"+sex); //3.getParameterNames ()方法 獲取所有引數的名字,返回型別為Enumeration Enumeration<String> names = request.getParameterNames(); System.out.print("每個引數的名字為:"); while (names.hasMoreElements()) { String name = names.nextElement(); System.out.print(name+" "); } System.out.println(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="oneServlet" method="post"> 姓名:<input type="text" name="username" id="username"> <br> <input type="checkbox" name="hobby" value="read"/>讀書 <input type="checkbox" name="hobby" value="run"/>跑步 <input type="checkbox" name="hobby" value="football"/>踢足球 <br> 性別:<input type="radio" name="sex" value="nan"/>男 <input type="radio" name="sex" value="nv"/>女 <br> <input type="submit" value="提交"/> </form> </body> </html>
頁面結果:控制檯結果:
迴應:( 兩個方法互斥,只能使用一種)
- getWiter()方法用於輸出html資訊,文字資訊。
- getOutputSteam()用於下載檔案,如* .avi等。
- 例
@WebServlet("/twoServlet") public class TwoServlet extends HttpServlet { private static final long serialVersionUID = 1L; public TwoServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲取字元輸出流物件 PrintWriter out = response.getWriter(); //獲取姓名 String username = request.getParameter("username"); //列印 out.write("姓名:"+username); } }
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <form action="twoServlet" method="post"> 姓名:<input type="text" name="username" id="username"> <br> <input type="submit" value="提交"/> </form> </body> </html>
頁面結果:列印結果:
三,為什麼會出現請求或響應亂碼?
如圖,使用者通過瀏覽器向Servlet發出請求與Servlet向瀏覽器做出響應都要經過Tomcat伺服器,而Tomcat伺服器的編碼格式為ISO-8859-1,而頁面與Servlet是utf-8,頁面和Servlet的編碼與Tomcat伺服器的編碼不同,所以會產生亂碼。
四,如何處理請求亂碼與響應亂碼?
第一種方法:可以處理請求亂碼與響應亂碼
PrintWriter out = response.getWriter();
//獲取姓名
String username = request.getParameter("username");
//第一種:可以處理get和post請求
byte[] byte1 = username.getBytes("iso-8859-1");//把獲取的name值(iso-8859-1)轉成位元組碼
String username1 = new String(byte1, "utf-8");
System.out.println(username1);
out.write("姓名:"+username);
先將值轉換成位元組碼,而位元組碼可以進行編碼轉換,從而避免亂碼
第二種方法:
針對post請求,直接使用 HttpServletRequest 的 setCharacterEncoding("編碼") 方法進行轉換
request.setCharacterEncoding("utf-8");
針對get請求,且Tomcat版本為8.0以下 :可以修改Tomcat的server.xml檔案,在connector節點新增useBodyEncodingForURI="true"。(Tomcat8.0及以上已經預設新增)