目錄
- 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");