JAVA - 【Tomcat】Servlet 請求與響應

目錄

  • HttpServletResponse
    • 操作響應行
      • 設置響應狀態碼
    • 操作響應頭
      • 重定向
      • 刷新
    • 操作響應正文
      • 改變服務器使用的字符集
      • 告訴瀏覽器需要使用什麼字符集解碼
      • 獲得字節輸出流( ServletOutputStream getOutputStream() )
      • 獲得字符輸出流( PrintWriter getWriter() )
  • HttpServletRequest
    • 請求消息行
      • 路徑獲取
    • 獲取請求頭的信息
      • 獲取請求頭的信息
      • 獲取請求頭所有信息
      • 獲取請求頭同一屬性的所有值
    • 請求正文
      • 設置post表單提交數據的解碼字符集
      • 處理表單數據
        • String   getParameter(String name)
        • String[] getParameterValues(String name)
        • Map<String, String[]> getParameterMap()
      • 域對象:request
        • 操作request維護的Map
        • 利用request完成請求轉發
      • 請求轉發與重定向的區別


<一> HttpServletResponse

注:本篇文章僅僅分析常用方法,所有內容可以參考JAVA EE API

1> 操作響應行

  • 設置響應狀態碼
|-response.setStatus(int sc) 設置相應狀態碼
    |-SC_INTERNAL_SERVER_ERROR 500
    |-SC_METHOD_not_ALLOWED    405
        |-未重寫doGet、doPost自動拋出
    |-SC_NOT_FOUND             404
    |-SC_OK                    200

2> 操作響應頭

  • 重定向
  • 覆蓋設置響應頭鍵值
    • refresh刷新
    • refresh重定向
    • location重定向
|-響應頭:
        sendRedirect(String location)
        setHeader(String name,String value)
            |-覆蓋
        addHeader(String name,String value)
            |-添加
        setIntHeader(String name,int value)

3> 操作響應正文

  • 改變服務器使用的字符集
  • 告訴瀏覽器需要使用什麼字符集解碼
|-告訴服務器使用UTF-8字符集解析數據
    |-response.setCharacterEncoding("UTF-8");
    
|-瀏覽器解析錯誤,因爲瀏覽器默認編碼錯誤,需要告訴瀏覽器使用指定編碼解析
    |-response.setHeader("content-type","text/html;charset=UTF-8"); 
    
|-上述兩個操作被封裝進一個方法
    |-response.setContentType("text/html;charset=GBK");
        |-寫錯會變成下載文件
  • 獲得字節輸出流( ServletOutputStream getOutputStream() )

ServletOutputStream sos = response.getOutputStream();


//示例(輸入輸出流)
//通過全路徑獲取字節輸入流
String path = this.getServletContext().getRealPath("/img/a.jpg");
FileInputStream fis = new FileInputStream(path);
//創建一個字節輸出流
ServletOutputStream sos = response.getOutputStream();
//通過全路徑獲取文件名並URL化
String filename = path.substring(path.lastIndexOf("\\")+1);
filename = URLEncoder.encode(filename,"UTF-8");
  • 獲得字符輸出流( PrintWriter getWriter() )
response.getWriter()

<二> HttpServletRequest

1> 請求消息行

getMethod()                獲取請求方式:  GET
getRequestURL()            獲取全路徑:     http://localhost/day0523_servlet/servlet/demo7
    getRequestURI()        獲取資源名部分: /day0523_servlet/servlet/demo7
        getContextPath()   獲取當前應用名:    /day0523_servlet

getQueryString()  獲取請求行的參數部分

2> 獲取請求頭的信息

String getHeader(String name)
Enumeration getHeaderNames()
  • 獲取瀏覽器類型
private void checkBrowserType(HttpServletRequest request) {
	String userAgent = request.getHeader("User-Agent");
	//Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363
	System.out.println(userAgent);
	
	if(userAgent.toLowerCase().contains("firefox")){
		System.out.println("訪問瀏覽器類型:Firefox");
	}else if(userAgent.toLowerCase().contains("edge")){
		System.out.println("訪問瀏覽器類型:Microsoft Edge");
	}else if(userAgent.toLowerCase().contains("chrome")){
		System.out.println("訪問瀏覽器類型:Chrome");
	}else if(userAgent.toLowerCase().contains("safari")){
		System.out.println("訪問瀏覽器類型:Safari");
	}else{
		System.out.println("訪問瀏覽器類型:其他");
	}
}
  • 獲取請求頭所有信息
/**
 * 打印請求頭所有信息於Tomcat控制檯
 * @param HttpServletRequest request
 */
private void printAllHeaderInfo(HttpServletRequest request) {
	Enumeration<String> headerNames = request.getHeaderNames();
	 while(headerNames.hasMoreElements()){
		 String e = headerNames.nextElement();
		 System.out.println(e+":"+request.getHeader(e));
	 }
	 
	 // host:localhost
	 // user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0
	 // accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
	 // accept-language:zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
	 // accept-encoding:gzip, deflate
	 // connection:keep-alive
	 // upgrade-insecure-requests:1
}
  • 獲取請求頭同一屬性的所有值
    • accept-language爲例
/**
 * 獲取請求頭同一屬性的所有值
 * accept-language:
 * 		瀏覽器支持的語言類型,逗號分隔,q表示權重係數[0,1]
 * @param request
 */
private void printHeaders(HttpServletRequest request) {
	
	Enumeration<String> headers = request.getHeaders("accept-language");
	//結果: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
	while (headers.hasMoreElements()) {
		String e = headers.nextElement();
		System.out.println(e);
	}

	String lang = request.getHeader("accept-language");
	String[] langs = lang.split(",");
	for(String i:langs){
		System.out.println(i);
	}
}

3> 請求消息正文(處理post方式提交的表單)

  • 設置post表單提交數據的解碼字符集
    • request.setCharacterEncoding("UTF-8");
  • String   getParameter(String name)
  • String[] getParameterValues(String name)
  • Map<String, String[]> getParameterMap()
private void dealForm1(HttpServletRequest request) {
	try {
		User u = new User();
		Map<String, String[]> parameterMap = request.getParameterMap();
		
		for(Map.Entry<String, String[]> m:parameterMap.entrySet()){
			String name = m.getKey();
			String[] value = m.getValue();
			//JavaBean內省機制
			PropertyDescriptor pd = new PropertyDescriptor(name,User.class);
			Method settler = pd.getWriteMethod();
			if(value.length==1){
				settler.invoke(u, value[0]);
			}else{
				settler.invoke(u, (Object)value);
			}
		}
		System.out.println(u);
	} catch (Exception e) {
		e.printStackTrace();
	}
}

 

private void dealForm2(HttpServletRequest request) {
	//使用BeanUtils包
	//BeanUtils.populate(Object,Map<String,? extends Object>)
	//http://commons.apache.org/proper/commons-beanutils/download_beanutils.cgi
	//http://commons.apache.org/proper/commons-logging/download_logging.cgi

	User u = new User();
	try {
		BeanUtils.populate(u,request.getParameterMap());
	} catch (IllegalAccessException e) {
		e.printStackTrace();
	} catch (InvocationTargetException e) {
		e.printStackTrace();
	}
	System.out.println(u);
}

register.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="/day0525_servlet/servlet/demo1" method="post">
       	用戶名:<input type="text" name="username"/><br/>
        密碼<input type="text" name="password"/><br/>
        
       	性別:<input type="radio" name="sex" value="male" checked="checked"/>男
        <input type="radio" name="sex" value="female" checked="checked"/>女<br/>
        
       	愛好:<input type="checkbox" name="hobby" value="music" checked="checked"/>音樂
            <input type="checkbox" name="hobby" value="book"/>閱讀
            <input type="checkbox" name="hobby" value="file"/>電影<br/>
        
        城市:<select name="city">
                <option>-----請選擇-----</option>
                <option value="bj">北京</option>
                <option value="sh">上海</option>
                <option value="gz">廣州</option>
              </select>
        <br/>
        <input type="submit" value="註冊"/>
        <br/>
    </form>
</body>
</html>

4> 域對象:request

  • 操作request維護的Map
  • 利用request完成請求轉發

其內部維護着一個Map集合,可以通過setAttribute、getAttribute、removeAttribute進行操作;

  • 請求轉發與重定向的區別

請求轉發:在服務器端完成(可以傳遞數據:request維護的Map

        上述的“歡迎!”會被顯示在demo2 頁面中

重定向:在客戶端完成(意味着可以跳轉到其他互聯網頁面:http://www.baidu.com)

        上述的“歡迎!”會被顯示在demo3 頁面中(意味着打開了兩次網頁

        response.sendRedirect("/day0525_servlet/servlet/demo2");

                response.setStatus(302);
               //response.sendRedirect(request.getContextPath()+"/servlet/demo3");
                response.sendRedirect("http://www.baidu.com");

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章