request $ response
兩個對象 request 和 response 指的是實現了 ServletResponse接口的
HttpServletResponse
功能1 response對象的概述
- response 代表 服務器對瀏覽器的響應 通過HTTP響應協議
2.在response中 存在的方法 響應給客戶端
應用RESPONSE
1. 響應首行手動向瀏覽器 發送404 狀態碼
a) 如果一個方法過時了 一般源碼有提示信息
2重定向
效果圖 輸入www.localhost:80/jw08resq&req/Bservlet 錯誤
2.1開發中重定向
傻瓜式重定向不用明白原理
使用response的一個方法
3瀏覽器和服務器的訪問流程
4. web項目結構
5. refresh頭,刷新 五秒後跳轉
6. 瀏覽器和服務器通信監視器Fidder
7. 相應正文
7.1發送字節流 發送中文 制造並且解決亂碼問題
字節流亂碼 utf-------gbk
7.2使用字符流發送字符
IS5 9 編碼集中不存在中文
字節流 發文本 字符流 發圖片或者多媒體信息
7.3字節流和字符流不能同時使用
8服務器錯誤
7.4使用字節流發送圖片
告訴瀏覽器 服務器輸入的文件類型 text/html是關於字符內容類型
“imgae/jpeg” 告訴瀏覽器 服務器發送過去的是一個圖片
告訴瀏覽器 你發送的字節流 0101 是什麽格式的 瀏覽器去解析 這個文件的是什麽類型 image/jpeg
7.4使用字節流發送文件(就是文件下載)
服務器把文件發送個瀏覽器
- 直接訪問該文件 下載
- 把文件放在 WEB-INF外界訪問不到 控制下載權限
//0 告訴瀏覽器是什麽東西(不用手動去類型查文件對象那個是什麽)
//getServletContext().getMimeType(".jar") Context對象根據 後綴名去
web.xml查找mime類型.
response.setContentType(getServletContext().getMimeType(".avi"));
//告訴瀏覽器推薦用戶使用什麽名稱下載 一般選擇英文類型
response.setHeader("Content-Disposition", "attachment;filename=java.avi");
//1 獲得圖片的輸入流
InputStream in =
getServletContext().getResourceAsStream("/WEB-INF/03225.avi");
//2 通過response獲得輸出字節流
OutputStream out = response.getOutputStream();
//3 兩個對接
byte[] buffer = new byte[1024];
int len = 0;
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
out.flush();
}
in.close();
out.close();
功能2 request對象的概述
1.request對象 封裝了 瀏覽器發過來的信息
Request對象
1. 獲取瀏覽器請求首行請求頭
請求首行 請求方式 請求路徑 協議/版本號
request.getMethod(): GET
request.getRequestURI(): /Day08-request/AServlet
request.getServletPath(): /AServlet
request.getContextPath(): /Day08-request 獲得應用路徑 /jw08rr02
request.getScheme(): http
請求頭
//--原始方式獲得請求頭 比較繁瑣有key 得到value
String getHeader(String name)
long getDateHeader(String name)
int getIntHeader(String name)
Enumeration getHeaders(String name)
Enumeration getHeaderNames()
//---javaee封裝好的方法.
request.getContentLength(): -1
request.getContentType(): null
request.getLocale(): zh_CN zh 中文
request.getQueryString(): name=tom&age=18
request.getRequestURL(): http://localhost:8080/Day08-request/AServlet 絕對路徑 網絡上的任何資源
request.getRequestURI(): /Day08-request/AServlet 相對路徑
request.getRemoteAddr(): 0:0:0:0:0:0:0:1
request.getRemoteHost(): 0:0:0:0:0:0:0:1
request.getRemotePort(): 52074 獲得遠端 瀏覽器的
request.getServerName(): localhost
request.getServerPort(): 8080
請求空行
請求正文 表單傳送過來的鍵值對
2.獲得請求正文 獲得表單提交的參數. 亂碼問題
2.1亂碼:只要確保編碼和解碼一致,就絕對沒有問題.
1. GET方式
- http://localhost:8080/jw08rr02/BBServlet?name=tom&age=18
1.瀏覽器負責編碼.瀏覽器使用的碼表就是表單所在頁面的碼表.
2.服務器負責解碼.服務器默認使用ISO-8859-1解碼. 但如果你的服務器使用的是utf-8就不用配置了 如下配 置的URIEncoding來決定
解碼碼表
<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
connectionTimeout="20000"
redirectPort="8443" /> 在tomcat servlet .xml 中
如上配置會影響整個服務器不推薦.
我們使用如下代碼解決:
//獲得參數
String name = request.getParameter("name");
//因為服務器使用了錯誤的碼表,那麽我們按照錯誤的碼表原路返回
byte[] nameByte = name.getBytes("ISO-8859-1");
//用正確的碼表重新解碼
String newName = new String(nameByte,"UTF-8");
System.out.println("解決之後的:"+newName);
2.POST方式
因為Post解碼是在調用getParameter同時進行解碼,那麽解決亂碼只需要在調用該方法之前設置服務器解碼方式
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
System.out.println(name);
涉及到獲得表單參數的方法還有哪些呢?
String getParameter() 根據鍵獲得值
Map getParameterMap() 獲得服務器保存表單參數的容器
就是map<String,String[]>. 泛型: habit=chi&habit=shui&habit=la
for(Entry<String, String[]> en : map.entrySet()){
String key = en.getKey();
String[] value = en.getValue();
System.out.println(key+"==>" +Arrays.toString(value));
}
Enumeration getParameterNames() 獲得提交的所有鍵 列舉
while(en.hasMoreElements()){
String key = en.nextElement();
System.out.println("提交上來的鍵==>"+key);
}
String[] getParameterValues(String name) 根據鍵獲得值.
獲得一鍵對應多 個值的情況的.
System.out.println(Arrays.toString(habits));
//---------------------------------------------------------------------------------------------------------------------
2. request的請求轉發和包含功能.
轉發:
一個Servlet處理完畢交給下面的servlet(JSP)繼續處理.
作用:
在現實開發中,沒有servlet轉發給servlet的情況.都是由servlet轉發給JSP.
這樣可以達到分工的作用:
servlet: 比較適合處理業務.
JSP: 比較適合顯示功能
註意問題:
//servlet中不要做 輸出正文的動作,沒有結果的
//如果放到前面會出現亂碼. 解決 response.serCharacterEncoding(“utf-8”);
字符串 通過 utf-8編碼 變為 二進制字節 傳輸
網頁 通過 utf-8編碼集 把二進制字節解碼
邏輯處理
//1 獲得表單提交的用戶名密碼
String name = request.getParameter("name");
String password = request.getParameter("password");
//2 判斷是否正確 tom 1234 才算成功
if(name!=null && name.trim().length()>0 && name.equals("tom")&&
password!=null && password.trim().length()>0 &&
password.equals("1234")){
//成功 ==> 轉發到成功頁面
request.getRequestDispatcher("/login/success.jsp").forward(request,
response);
//自己來做,很多弊端,不要這樣
/* AServlet a = new AServlet();
a.service(request, response);*/
}else{
//失敗 ==> 轉發到失敗頁面
request.getRequestDispatcher("/login/error.jsp").forward(request, response);
}
//但是響應頭是可以設置的.
請求包含:
兩個servlet(jsp)共同向瀏覽器輸出內容.
作用:
在現實開發中,多個頁面含有相同的內容,我們把相同的內容抽取到一個jsp中,在需要顯示這個段內容的jsp中,包含抽取的jsp.可以達到
統一管理相同的內容.
正文部分和頁腳分開顯示
兩個jsp頁面 success包含 error頁面 訪問一個 success頁面就行
有不嚴謹的地方 使用jsp標簽來實現
3.request域的應用.
原理:
在request對象中含有一個map.這個map就是request域.
作用:
在將來開發中. 使用請求轉發時,servlet處理完數據, 處理結果要交給jsp顯示. 可以使用request域將處理結果有servlet帶給jsp顯示. 共享數據
操作:
1.setAttribute(key,value) 存入一個鍵值對
2.getAttribute(key) 通過鍵取出值
3.getAttributeNames() 獲得域中所有鍵
4.removeAttribute(key) 跟據鍵移除一個鍵值對
request的範圍:
一個request對象對應一個request域(map).
系統當前有多少個request就有多少request域.
//1 獲得表單提交的用戶名密碼
String name = request.getParameter("name");
String password = request.getParameter("password");
//
Map<String,String> error = new HashMap<String, String>();
//2 驗證
if(!(name!=null && name.trim().length()>0 && name.equals("tom"))){
error.put("name", "用戶名有誤!");
}
if(!(password!=null && password.trim().length()>0 && password.equals("1234"))){
error.put("password", "密碼錯誤!");
}
//將錯誤信息通過request域帶到錯誤頁面
request.setAttribute("error",error );
if(error.size() > 0){
//失敗==> 回到登錄頁面,並顯示錯誤信息
request.getRequestDispatcher("/login2/login.jsp").forward(request, response);
}else{
//成功==> 成功頁面
request.getRequestDispatcher("/login2/success.jsp").forward(request, response);
}
<body>
<h1>用戶登錄</h1>
<form action="/Day08-request/HServlet" method="POST">
用戶名:<input type="text" name="name" /> <br>
密碼:<input type="password" name="password" /><br>
<input type="submit" >
</form>
<%
Map<String,String> error = (Map<String,String>)request.getAttribute("error");
if(error!=null && error.size()>0){
for(Entry<String,String> en : error.entrySet()){
out.print("<font color=‘red‘>");
out.print(en.getValue()+"<br>");
out.print("</font>");
}
}
%>
</body>
//=================================================================================================================
路徑總結:
路徑分為兩種情況:
1.客戶端路徑 ==> 給瀏覽器用的路徑“/”相對於主機
<form action="/Day08-request/AServlet" >
<a href="/Day08-request/AServlet" >
<img src="/Day08-request/AServlet" >
response.sendRedirect("/Day08-request/AServlet")
Refresh:3;url=/Day08-request/AServlet
路徑寫法:
帶"/" : "/" ==> 相對於 主機.
例如: 表單所在頁面路徑為==>
http://localhost:8080/Day08-request/login.jsp ==> "/" 代表http://localhost:8080/
不帶"/":(開發中一定不要出現不帶"/"的情況).代表從當前目錄找.
例如: 表單所在頁面路徑為==>
http://localhost:8080/Day08-request/info/login.jsp ==> 代表
http://localhost:8080/Day08-request/info/
2.服務器端路徑”/”相對於項目
<url-pattern> /AServlet ==> http://localhost:8080/Day08-request/AServlet
request.getRequestDispatcher("/AServlet") ==>
http://localhost:8080/Day08-request/AServlet
路徑寫法:
"/": 相對於項目. "/"==>http://localhost:8080/Day08-request/
兩個對象 request 和 response 指的是實現了 ServletResponse接口的
HttpServletResponse
功能1 response對象的概述
- response 代表 服務器對瀏覽器的響應 通過HTTP響應協議
2.在response中 存在的方法 響應給客戶端
應用RESPONSE
1. 響應首行手動向瀏覽器 發送404 狀態碼
a) 如果一個方法過時了 一般源碼有提示信息
2重定向
效果圖 輸入www.localhost:80/jw08resq&req/Bservlet 錯誤
2.1開發中重定向
傻瓜式重定向不用明白原理
使用response的一個方法
3瀏覽器和服務器的訪問流程
4. web項目結構
5. refresh頭,刷新 五秒後跳轉
6. 瀏覽器和服務器通信監視器Fidder
7. 相應正文
7.1發送字節流 發送中文 制造並且解決亂碼問題
字節流亂碼 utf-------gbk
7.2使用字符流發送字符
IS5 9 編碼集中不存在中文
字節流 發文本 字符流 發圖片或者多媒體信息
7.3字節流和字符流不能同時使用
8服務器錯誤
7.4使用字節流發送圖片
告訴瀏覽器 服務器輸入的文件類型 text/html是關於字符內容類型
“imgae/jpeg” 告訴瀏覽器 服務器發送過去的是一個圖片
告訴瀏覽器 你發送的字節流 0101 是什麽格式的 瀏覽器去解析 這個文件的是什麽類型 image/jpeg
7.4使用字節流發送文件(就是文件下載)
服務器把文件發送個瀏覽器
- 直接訪問該文件 下載
- 把文件放在 WEB-INF外界訪問不到 控制下載權限
//0 告訴瀏覽器是什麽東西(不用手動去類型查文件對象那個是什麽)
//getServletContext().getMimeType(".jar") Context對象根據 後綴名去
web.xml查找mime類型.
response.setContentType(getServletContext().getMimeType(".avi"));
//告訴瀏覽器推薦用戶使用什麽名稱下載 一般選擇英文類型
response.setHeader("Content-Disposition", "attachment;filename=java.avi");
//1 獲得圖片的輸入流
InputStream in =
getServletContext().getResourceAsStream("/WEB-INF/03225.avi");
//2 通過response獲得輸出字節流
OutputStream out = response.getOutputStream();
//3 兩個對接
byte[] buffer = new byte[1024];
int len = 0;
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
out.flush();
}
in.close();
out.close();
功能2 request對象的概述
1.request對象 封裝了 瀏覽器發過來的信息
Request對象
1. 獲取瀏覽器請求首行請求頭
請求首行 請求方式 請求路徑 協議/版本號
request.getMethod(): GET
request.getRequestURI(): /Day08-request/AServlet
request.getServletPath(): /AServlet
request.getContextPath(): /Day08-request 獲得應用路徑 /jw08rr02
request.getScheme(): http
請求頭
//--原始方式獲得請求頭 比較繁瑣有key 得到value
String getHeader(String name)
long getDateHeader(String name)
int getIntHeader(String name)
Enumeration getHeaders(String name)
Enumeration getHeaderNames()
//---javaee封裝好的方法.
request.getContentLength(): -1
request.getContentType(): null
request.getLocale(): zh_CN zh 中文
request.getQueryString(): name=tom&age=18
request.getRequestURL(): http://localhost:8080/Day08-request/AServlet 絕對路徑 網絡上的任何資源
request.getRequestURI(): /Day08-request/AServlet 相對路徑
request.getRemoteAddr(): 0:0:0:0:0:0:0:1
request.getRemoteHost(): 0:0:0:0:0:0:0:1
request.getRemotePort(): 52074 獲得遠端 瀏覽器的
request.getServerName(): localhost
request.getServerPort(): 8080
請求空行
請求正文 表單傳送過來的鍵值對
2.獲得請求正文 獲得表單提交的參數. 亂碼問題
2.1亂碼:只要確保編碼和解碼一致,就絕對沒有問題.
1. GET方式
- http://localhost:8080/jw08rr02/BBServlet?name=tom&age=18
1.瀏覽器負責編碼.瀏覽器使用的碼表就是表單所在頁面的碼表.
2.服務器負責解碼.服務器默認使用ISO-8859-1解碼. 但如果你的服務器使用的是utf-8就不用配置了 如下配 置的URIEncoding來決定
解碼碼表
<Connector port="8080" protocol="HTTP/1.1" URIEncoding="UTF-8"
connectionTimeout="20000"
redirectPort="8443" /> 在tomcat servlet .xml 中
如上配置會影響整個服務器不推薦.
我們使用如下代碼解決:
//獲得參數
String name = request.getParameter("name");
//因為服務器使用了錯誤的碼表,那麽我們按照錯誤的碼表原路返回
byte[] nameByte = name.getBytes("ISO-8859-1");
//用正確的碼表重新解碼
String newName = new String(nameByte,"UTF-8");
System.out.println("解決之後的:"+newName);
2.POST方式
因為Post解碼是在調用getParameter同時進行解碼,那麽解決亂碼只需要在調用該方法之前設置服務器解碼方式
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
System.out.println(name);
涉及到獲得表單參數的方法還有哪些呢?
String getParameter() 根據鍵獲得值
Map getParameterMap() 獲得服務器保存表單參數的容器
就是map<String,String[]>. 泛型: habit=chi&habit=shui&habit=la
for(Entry<String, String[]> en : map.entrySet()){
String key = en.getKey();
String[] value = en.getValue();
System.out.println(key+"==>" +Arrays.toString(value));
}
Enumeration getParameterNames() 獲得提交的所有鍵 列舉
while(en.hasMoreElements()){
String key = en.nextElement();
System.out.println("提交上來的鍵==>"+key);
}
String[] getParameterValues(String name) 根據鍵獲得值.
獲得一鍵對應多 個值的情況的.
System.out.println(Arrays.toString(habits));
//---------------------------------------------------------------------------------------------------------------------
2. request的請求轉發和包含功能.
轉發:
一個Servlet處理完畢交給下面的servlet(JSP)繼續處理.
作用:
在現實開發中,沒有servlet轉發給servlet的情況.都是由servlet轉發給JSP.
這樣可以達到分工的作用:
servlet: 比較適合處理業務.
JSP: 比較適合顯示功能
註意問題:
//servlet中不要做 輸出正文的動作,沒有結果的
//如果放到前面會出現亂碼. 解決 response.serCharacterEncoding(“utf-8”);
字符串 通過 utf-8編碼 變為 二進制字節 傳輸
網頁 通過 utf-8編碼集 把二進制字節解碼
邏輯處理
//1 獲得表單提交的用戶名密碼
String name = request.getParameter("name");
String password = request.getParameter("password");
//2 判斷是否正確 tom 1234 才算成功
if(name!=null && name.trim().length()>0 && name.equals("tom")&&
password!=null && password.trim().length()>0 &&
password.equals("1234")){
//成功 ==> 轉發到成功頁面
request.getRequestDispatcher("/login/success.jsp").forward(request,
response);
//自己來做,很多弊端,不要這樣
/* AServlet a = new AServlet();
a.service(request, response);*/
}else{
//失敗 ==> 轉發到失敗頁面
request.getRequestDispatcher("/login/error.jsp").forward(request, response);
}
//但是響應頭是可以設置的.
請求包含:
兩個servlet(jsp)共同向瀏覽器輸出內容.
作用:
在現實開發中,多個頁面含有相同的內容,我們把相同的內容抽取到一個jsp中,在需要顯示這個段內容的jsp中,包含抽取的jsp.可以達到
統一管理相同的內容.
正文部分和頁腳分開顯示
兩個jsp頁面 success包含 error頁面 訪問一個 success頁面就行
有不嚴謹的地方 使用jsp標簽來實現
3.request域的應用.
原理:
在request對象中含有一個map.這個map就是request域.
作用:
在將來開發中. 使用請求轉發時,servlet處理完數據, 處理結果要交給jsp顯示. 可以使用request域將處理結果有servlet帶給jsp顯示. 共享數據
操作:
1.setAttribute(key,value) 存入一個鍵值對
2.getAttribute(key) 通過鍵取出值
3.getAttributeNames() 獲得域中所有鍵
4.removeAttribute(key) 跟據鍵移除一個鍵值對
request的範圍:
一個request對象對應一個request域(map).
系統當前有多少個request就有多少request域.
//1 獲得表單提交的用戶名密碼
String name = request.getParameter("name");
String password = request.getParameter("password");
//
Map<String,String> error = new HashMap<String, String>();
//2 驗證
if(!(name!=null && name.trim().length()>0 && name.equals("tom"))){
error.put("name", "用戶名有誤!");
}
if(!(password!=null && password.trim().length()>0 && password.equals("1234"))){
error.put("password", "密碼錯誤!");
}
//將錯誤信息通過request域帶到錯誤頁面
request.setAttribute("error",error );
if(error.size() > 0){
//失敗==> 回到登錄頁面,並顯示錯誤信息
request.getRequestDispatcher("/login2/login.jsp").forward(request, response);
}else{
//成功==> 成功頁面
request.getRequestDispatcher("/login2/success.jsp").forward(request, response);
}
<body>
<h1>用戶登錄</h1>
<form action="/Day08-request/HServlet" method="POST">
用戶名:<input type="text" name="name" /> <br>
密碼:<input type="password" name="password" /><br>
<input type="submit" >
</form>
<%
Map<String,String> error = (Map<String,String>)request.getAttribute("error");
if(error!=null && error.size()>0){
for(Entry<String,String> en : error.entrySet()){
out.print("<font color=‘red‘>");
out.print(en.getValue()+"<br>");
out.print("</font>");
}
}
%>
</body>
//=================================================================================================================
路徑總結:
路徑分為兩種情況:
1.客戶端路徑 ==> 給瀏覽器用的路徑“/”相對於主機
<form action="/Day08-request/AServlet" >
<a href="/Day08-request/AServlet" >
<img src="/Day08-request/AServlet" >
response.sendRedirect("/Day08-request/AServlet")
Refresh:3;url=/Day08-request/AServlet
路徑寫法:
帶"/" : "/" ==> 相對於 主機.
例如: 表單所在頁面路徑為==>
http://localhost:8080/Day08-request/login.jsp ==> "/" 代表http://localhost:8080/
不帶"/":(開發中一定不要出現不帶"/"的情況).代表從當前目錄找.
例如: 表單所在頁面路徑為==>
http://localhost:8080/Day08-request/info/login.jsp ==> 代表
http://localhost:8080/Day08-request/info/
2.服務器端路徑”/”相對於項目
<url-pattern> /AServlet ==> http://localhost:8080/Day08-request/AServlet
request.getRequestDispatcher("/AServlet") ==>
http://localhost:8080/Day08-request/AServlet
路徑寫法:
"/": 相對於項目. "/"==>http://localhost:8080/Day08-request/
request $ response