1. 程式人生 > 其它 >3_ Http請求響應實戰

3_ Http請求響應實戰

技術標籤:Javaweb

3 Http請求

3.1 HttpServletRequest請求物件

http://127.0.0.1:8080/request?userName=jack&age=11&sport=ball&sport=sleep
​
//客戶端請求資訊
System.out.println("應用上下文路徑getContextPath="+request.getContextPath()) ;
System.out.println("客戶端發出請求時的完整URL getRequestURL="+request.getRequestURL()) ;

System.out.println("請求行中的資源名部分 getRequestURI="+request.getRequestURI()) ;

System.out.println("請求行中的引數部分 getQueryString="+request.getQueryString()) ;

System.out.println("發出請求的客戶機的IP地址 getRemoteAddr="+request.getRemoteAddr()) ;

System.out.println("客戶機發請求使用的網路埠號 getRemotePort="+request.getRemotePort()) ;

//獲取請求頭
System.out.println("獲取請求頭 getHeader(Accept)="+request.getHeader("Accept")) ;

//獲取請求引數
System.out.println("客戶端請求引數 getParameter="+request.getParameter("userName"));

String[] sport = request.getParameterValues("sport");

System.out.println("客戶端請求引數列表,多個值 getParameterValues="+sport.toString());

Map<String,String[]> map = request.getParameterMap();

System.out.println("客戶端請求引數封裝成的map型別 getParameterMap="+map.toString());
  • 四大作用域物件:PageContext->【ServletRequest】->HttpSession->ServletContext;
//ServletRequest作用域:對像生命週期存在一次請求裡面
//儲存java物件到request作用域
request.setAttribute("name","jack");

3.2 HttpServletRequest和使用者登入表單提交

使用jsp編寫form表單提交
UserServlet, doPost裡面呼叫doGet

<form action="/user/loin" method="post">
    <div>使用者名稱: <input type="text" name="userName" /> </div>
    <div>密碼: <input type="password" name="pwd"/> </div>
    <div> <input type="submit"  value="登入"> </div>
  </form>
​
​
​
   @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
​
        resp.setContentType("text/html;charset=utf-8");
​
        String userName = req.getParameter("userName");
        String pwd = req.getParameter("pwd");
​
        if(userName.equals("xdclass") && pwd.equals("123")){
            resp.getWriter().write("登入成功");
        }else {
            resp.getWriter().write("賬號密碼錯誤");
        }
​
​
    }

關於亂碼問題

//POST方式遇到中文亂碼,如果客戶端是以UTF-8字元編碼,需要伺服器以UTF-8的編碼接收資料,
req.setCharacterEncoding("UTF-8");
​
​
//對於以get方式傳輸的中文資料亂碼需要另外一種方式,預設的還是使用ISO8859-1這個字元編碼來接收資料
//辦法:對接收到的原始資料的位元組陣列,然後通過位元組陣列以指定的編碼構建字串,解決亂碼問題
​
String name = request.getParameter("name");//接收資料
name =new String(name.getBytes("ISO8859-1"), "UTF-8")

3.3 HttpServletResponse響應物件講解

HttpServletResponse物件
簡介:代表伺服器的響應,封裝了向客戶端傳送資料、傳送響應頭,傳送響應狀態碼的方法

常見API

//設定有多個值的http響應頭,引數name表示響應頭名稱,引數value表示響應頭的值,
//比如:response.addHeader("name", "java");response.addHeader("name", "spring");
addHeader(String name,String value) 
​
//設定只有一個值的http響應頭,引數name表示響應頭名稱,引數value表示響應頭的值
setHeader(String name,String value) 
​
//設定http狀態碼
response.setStatus(200);

getOutputStream():

建立的位元組輸出流物件,可以按位元組形式輸出響應正文,直接輸出位元組陣列中的二進位制資料,更多用於下載輸出檔案流

//設定編碼格式為UTF-8
​
response.setCharacterEncoding("UTF-8");
​
//通過設定響應頭控制瀏覽器以UTF-8的編碼顯示資料,如果不加這句話,那麼瀏覽器顯示的將是亂碼
 response.setHeader("Content-Type","text/html;charset=utf-8");
​
String data = "小滴課堂java高階工程師成長系列";
​
//獲取OutputStream輸出流
OutputStream outputStream = response.getOutputStream();
​
//將字元轉換成位元組陣列,指定以UTF-8編碼進行轉換
byte[] dataByteArr = data.getBytes("UTF-8");
​
//使用OutputStream流向客戶端輸出位元組陣列
outputStream.write(dataByteArr);

getWriter():
建立的字元輸出流物件,可以按字元形式輸出響應正文,只能輸出輸出字元文字內容,和上面的互斥

//設定編碼格式為UTF-8
response.setCharacterEncoding("UTF-8");
​
//通過設定響應頭控制瀏覽器以UTF-8的編碼顯示資料,如果不加這句話,那麼瀏覽器顯示的將是亂碼
response.setHeader("content-type", "text/html;charset=UTF-8");
String data = "小滴課堂java高階工程師成長系列";
​
//獲取PrintWriter輸出流
PrintWriter out = response.getWriter();
​
//使用PrintWriter流向客戶端輸出字元
out.write(data);