1. 程式人生 > >request $ response

request $ response

項目 訪問 num 共享數據 content nco sstream inf 如果

兩個對象 request response 指的是實現了 ServletResponse接口的

HttpServletResponse

功能1 response對象的概述

  1. 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使用字節流發送文件(就是文件下載)

服務器把文件發送個瀏覽器

  1. 直接訪問該文件 下載

  1. 把文件放在 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方式
  1. 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對象的概述

  1. 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使用字節流發送文件(就是文件下載)

服務器把文件發送個瀏覽器

  1. 直接訪問該文件 下載

  1. 把文件放在 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方式
  1. 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