請求響應對象


請求響應對象

request和response
* 當服務器接收到請求后,服務器會創建request和response對象,把請求數據封裝到request對象中;
* 然后調用Servlet的service()方法時把這兩個對象傳遞給service()方法;
* 在service()方法中可以通過request對象獲取請求數據,可以使用response對象向客戶端完成響應;

* 每次請求服務器都會創建新的request和response對象,即每個請求有自己獨自的request和response對象。

==============================
==============================
==============================

response對象

1. response簡介
response是響應對象,用來在Servlet的service()方法中向客戶端響應數據。
response的功能如下:
* 設置響應頭
* 發送狀態碼
* 設置響應正文
* 重定向

2. response響應正文
* ServletOutputStream getOutputStream():用來向客戶端響應字節數據;
* PrintWriter getWriter():用來向客戶端響應字符數據;

response.getWriter().print("你好");//向客戶端響應字符數據
byte[] bytes = ...;
response.getOutputStream().write(bytes);//向客戶端響應字節數據

3. response字符編碼
* Tomcat響應數據默認使用ISO-8859-1
* 通常瀏覽器默認使用GBK編碼
* response.setCharacterEncoding("utf-8");//設置response.getWriter()的字符編碼

1)
response.getWriter().print("大家好");
因為Tomcat默認使用的是ISO-8859-1編碼,不支持中文。所以一定編碼!

2)
response.setCharacterEncoding("utf-8");
response.getWriter().print("大家好");
因為已經設置了字符流編碼為utf-8,所以響應給客戶端的數據為utf-8編碼!
但因為瀏覽器默認使用的是gbk來解析響應數據,所以亂碼!如果瀏覽器使用utf-8編碼,那么就不會亂碼了。

3)
response.setCharacterEncoding("gbk");
response.getWriter().print("大家好");
因為設置了字符流編碼為gbk,所以響應給客戶端的數據為gbk編碼!
因為瀏覽器默認使用gbk來解析數據,所以不會出現亂碼!如果瀏覽器使用utf-8編碼,那么就會出現亂碼!

4)
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("大家好");
setContentType()方法有兩個作用:
* 設置字符流編碼。等同與調用了response.setCharacterEncoding("utf-8");
* 設置Content-type響應頭,即通知瀏覽器響應數據的編碼為utf-8。
因為設置字符流的編碼為utf-8,所以響應給客戶端數據為utf-8編碼
因為設置了Content-type頭為utf-8,所以瀏覽器會使用utf-8來解析響應數據
沒有亂碼!

5)
response.setContentType("text/html;charset=gbk");
response.getWriter().print("大家好");
* 設置了字符流為gbk,所以響應給客戶端的數據為gbk
* 設置了Content-type頭為gbk,所以通知瀏覽器響應數據為gbk編碼
沒有亂碼!

6)
response.setHeader("Content-type", "text/html;charset=utf-8")
等同於
repsonse.setContentType("text/html;charset=utf-8")

7)
response.getOutputStream().write("大家好".getBytes("gbk"));
響應的數據是gbk編碼
客戶端瀏覽器默認使用gbk編碼
所以沒有亂碼

======================

4. response字符流緩沖區
response字符流緩沖區大小為8KB,當向字符流中寫入數據后,數據可能只在緩沖區中,而沒有發送到瀏覽器。
可以調用response.flushBuffer()或response.getWriter().flush()方法刷新緩沖區,把數據發送到瀏覽器。

======================

5. 設置響應頭

response.setHeader("Content-type", "text/html;charset=utf-8");
等同與
response.setContentType("text/html;charset=utf-8");

response.setHeader("Refresh", "5; URL=http://www.itcast.cn");

======================

6. 指定狀態碼

response.setStatus(200):設置狀態碼為200
response.sendError(404, “您要查找的資源不存在”):設置狀態碼為404
repsonse.sendError(500, “服務器出氏了”):設置狀態碼為500

在調用sendError()方法時,不只是設置了狀態碼,而且還會給瀏覽器一個顯示錯誤的頁面。

======================

7. 重定向

response.sendStatus(302);
repsonse.setHeader("Location", "http://www.baidu.com");

快捷的方法重定向:

response.sendRedirect("http://www.baidu.com");

* 重定向是兩次請求
* 重定向不局限與當前應用,也可以是其他應用,例如重定向到百度
* 重定向響應碼為302,而且必須有Location響應頭
* 重定向與response響應流同時使用。

======================
======================
======================

request

1. request功能介紹
* 獲取請求頭
* 獲取請求參數
* Servlet三大域對象之一
* 請求包含和請求轉發

2. request域方法
* void setAttribute(String name, Object value):添加或替換request域屬性
* Object getAttribute(String name):獲取request域指定名稱的域屬性
* void removeAttribute(String name):移除request域指定名稱的域屬性
* Enumeration getAttributeNames():獲取所有request域的屬性名稱

3. request獲取請求頭
* String getHeader(String name):獲取指定名稱的請求頭
* int getIntHeader(String name):獲取指定名稱的請求頭,把值轉換成int類型。
* Enumeration getHeaderNames():獲取所有請求頭名稱

4. request請求數據相關其他方法
重點:
* String getMethod():獲取請求方式
* String getContextPath():獲取上下文路徑,即“/” + 應用名稱,例如:/day05_1
* void setCharacterEncoding(String):設置請求體的編碼
* String getRemoteAddr():獲取客戶端IP地址

非重點:
* int getContentLength():獲取請求體字節數
* Locale getLocale():獲取請求Locale,例如zh_CN表示中文,中國
* String getCharacterEncoding():獲取請求體編碼,在沒有調用setCharacterEncoding()之前該方法返回null
* String getQueryString():獲取參數列表,例如:username=zhangSan&password=123
* String getRequestURI():返回請求URI路徑,從應用名稱開始,到參數之前這一段,例如:/day05_1/AServlet
* StringBuffer getRequestURL():整個請求URL,不包含參數部分
* String getServletPath():返回Servlet路徑,從應用名稱后開始,到參數之前這一段,不包含應用名稱。
* String getServerName():返回主機名,例如:localhost
* int getServerPort():返回服務器端口號,例如:8080

5. 請求參數
獲取請求參數,即獲取超鏈接上的參數和表單中的參數
* String getParameter(String name):獲取指定名稱的參數,如果存在同名參數,那么該方法只獲取第一個參數值
* String[] getParameterValues(String name):獲取指定名稱的參數,因為同名參數的存在,所以返回值為String[]
* Enumeration getParameterNames():獲取所有參數名稱
* Map getParameterMap():獲取所有參數,封裝到Map中,key為參數名稱,value為參數值。

6. 請求包含和請求轉發
* 請求包含和請求轉發都是在一個請求中,訪問兩個Servlet。
* 請求包含和請求轉發都是有一個Servlet去調用執行另一個Servlet
* 請求包含和請求轉發都可以共享request中的數據,因為都是一個請求。

* 從AServlet請求轉發到BServlet
> 在AServlet中可以設置響應頭
> 在AServlet中不能使用響應流輸出

如果在AServlet中執行了響應操作,那么有兩種可能:
* 如果在AServlet中響應的數據導致response提交,那么在轉發時拋出異常;
* 如果在AServlet中響應的數據沒有導致response提交,那么response中的數據會被清空。

* 從AServlet請求包含BServlet
> 在AServlet可以設置響應頭
> 在AServlet可以使用響應流輸出

* 請求轉發和請求包含都要使用RequestDispatcher對象:RequestDispatcher rd = request.getRequestDispatcher("/BServlet");
* 請求轉發執行RequestDispatcher的forward()方法:rd.forward(request,response);
* 請求包含執行RequestDispatcher的include()方法:rd.include(request,response);
* 請求轉發和請求包含的路徑都是服務器端路徑,相對當前應用


7. 請求轉發與重定向
* 請求轉發是一個請求,而重定向是兩個請求
* 請求轉發,是使用RequestDispatcher來完成,重定向使用response對象來完成
* 請求轉發的路徑都是服務器端路徑,而重定向是客戶端路徑,需要給出應用名稱
* 請求轉發在瀏覽器地址欄中的地址是第一個Servlet的路徑,而重定向在地址欄中的地址是第二個請求的Servlet的路徑
* 請求轉發中的兩個Servlet是可以共享request數據的,而重定向因為是兩個請求,所以不能共享request數據
* 請求轉發只能轉發到本應用的其他Servlet,而重定向可以重定向到其他應用中。

8. request.getParameter()和request.getAttribute()
* getParameter()是獲取客戶端參數,它是從客戶端傳遞給服務器的數據。
* getAttribute()是獲取服務器端自己設置的數據,而不是客戶端的數據。
* request沒有setParameter()方法,不能自己設置參數,參數都由客戶端傳遞
* request有setAttribute()方法,在getAttribute()之前,需要先setAttribute()才能獲取到。
* getAttribute()和setAttribute()是用來在請求轉發和請求包含中的多個Servlet中共享數據。

======================
======================
======================

路徑

1. 客戶端路徑和服務器端路徑
* 客戶端路徑需要給出應用名稱,例如:/day05_1/AServlet
* 服務器端路徑無需給出應用名稱,例如:/AServlet

2. 客戶端路徑
1). 頁面中都是客戶端路徑:
* 超鏈接的href
* 表單的action
* <img>的src
2). 重定向也是客戶端路徑:response.sendRedirect("/day05_1/BServlet");

3. 服務器端路徑
* <url-pattern>
* 請求轉發和請求包含
* ServletContext獲取資源等

======================
======================
======================

亂碼

1. 請求編碼
* 客戶端發送的數據編碼:由瀏覽器來決定:
1). 如果是在地址欄中直接給出url,那么一般都是默認為GBK,但這個可能不太大。
2). 如果是通過頁面上的表單或超鏈接發出請求,那么由當前頁面的編碼來決定發送的參數的編碼。

* 無論瀏覽器發送過來的是什么編碼的數據,Tomcat都默認使用ISO-8859-1來解碼
1). POST:可以使用request.setCharacterEncoding()方法來設置請求體數據的編碼,因為POST請求參數在請求體中,所以是可以設置編碼的。在使用request.getParameter()方法獲取參數之前,先使用request.setCharacterEncoding()方法來設置編碼即可。
2). GET:沒有方法可以設置它,因為參數在url中。所以使用request.getParameter()獲取到的數據一定是錯誤的使用了iso-8859-1解碼的。可以再使用iso-8859-1把字符串轉回到byte[],再重新使用正確的編碼來解碼即可。
String s = request.getParameter("s");//使用iso-8859-1錯誤的解碼了
byte[] bytes = s.getBytes("iso-8859-1");//退回錯誤的解碼,讓字符串通過iso-8859-1返回到字節數據,即還原字節數據
s = new String(bytes, "utf-8");//重新使用正確的utf-8來解碼。

 

 

內容:
* response
* request
* 編碼
* 路徑

------------------

服務器處理請求的流程:
服務器每次收到請求時,都會為這個請求開辟一個新的線程。
服務器會把客戶端的請求數據封裝到request對象中,request就是請求數據的載體!(袋子)
服務器還會創建response對象,這個對象與客戶端連接在一起,它可以用來向客戶端發送響應。(手機)

------------------


response:其類型為HttpServletResponse
ServletResponse-->與協議無關的類型
HttpServletResponse-->與http協議相關的類型

  回憶一下http協議!http協議中響應的內容包含哪些東西呢?
  * 狀態碼:200表示成功、302表示重定向、404表示客戶端錯(訪問的資源不存在)、500表示服務器端錯
    > sendError(int sc) --> 發送錯誤狀態碼,例如404、500
    > sendError(int sc, String msg) --> 也是發送錯誤狀態碼,還可以帶一個錯誤信息!
    > setStatus(int sc) --> 發送成功的狀態碼,可以用來發送302
    案例:
    > 發送404
  * 響應頭:Content-Type、Refresh、Location等等
    頭就是一個鍵值對!可能會存在一個頭(一個名稱,一個值),也可能會存在一個頭(一個名稱,多個值!)
    > *****setHeader(String name, String value):適用於單值的響應頭,例如:response.setHeader("aaa", "AAA");
    > addHeader(String name, String value):適用於多值的響應頭
response.addHeader("aaa", "A");
response.addHeader("aaa", "AA");
response.addHeader("aaa", "AAA");
    > setIntHeader(String name, int value):適用於單值的int類型的響應頭
` response.setIntHeader("Content-Length", 888);
    > addIntHeader(String name, int value):適用於多值的int類型的響應頭
    > setDateHeader(String name, long value):適用於單值的毫秒類型的響應頭
response.setDateHeader("expires", 1000 * 60 * 60 * 24);
    > addDateHeader(String name, long value):適用於多值的毫秒類型的響應頭
    案例:
    > 發送302,設置Location頭,完成重定向!
    > 定時刷新:設置Refresh頭,你可以把它理解成,定時重定向!
    > 禁用瀏覽器緩存:Cache-Control、pragma、expires
    > <meta>標簽可以代替響應頭:<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  * 響應體:通常是html、也可以是圖片!
    > response的兩個流:
      <> ServletOutputStream,用來向客戶端發送字節數據。ServletOutputStream out = resopnse.getOutputStream();
      <> PrintWriter,用來向客戶端發送字符數據!需要設置編碼。PrintWriter writer = response.getWriter();
      <> 兩個流不能同時使用!
    案例:
    > 使用PrintWriter發送字符數據
    > 使用ServletOutputStream發送字節數據(圖片)
  * 重定向:設置302,設置Location!其中變化的只有Location,所以java提供了一個快捷方法,完成重定向!
   > sendRedirect(String location)方法

------------------

request --> 封裝了客戶端所有的請求數據!
請求行
請求頭
空行
請求體(GET沒體)

  回憶一下http協議!請求協議中的數據都可以通過request對象來獲取!
  * 獲取常用信息
    > 獲取客戶端IP,案例:封IP。request.getRemoteAddr()
    > 請求方式,request.getMethod(),可能是POST也可能是GET
  * 獲取HTTP請求頭
    > *****String getHeader(String name),適用於單值頭
    > int getIntHeader(String name),適用於單值int類型的請求頭
    > long getDateHeader(String name),適用於單值毫秒類型的請求頭
    > Enumeration<String> getHeaders(String name),適用於多值請求頭

   案例:
    > 通過User-Agent識別用戶瀏覽器類型
    > 防盜鏈:如果請求不是通過本站的超鏈接發出的,發送錯誤狀態碼404。Referer這個請求頭,表示請求的來源!
  * 獲取請求URL
http://localhost:8080/day10_2/AServlet?username=xxx&password=yyy
    > String getScheme():獲取協議,http
    > String getServerName():獲取服務器名,localhost
    > String getServerPort():獲取服務器端口,8080
    > *****String getContextPath():獲取項目名,/day10_2
    > String getServletPath():獲取Servlet路徑,/AServlet
    > String getQueryString():獲取參數部分,即問號后面的部分。username=xxx&password=yyy
    > String getRequestURI():獲取請求URI,等於項目名+Servlet路徑。/day10_2/AServlet
    > String getRequestURL():獲取請求URL,等於不包含參數的整個請求路徑。http://localhost:8080/day10_2/AServlet

  * 獲取請求參數:請求參數是由客戶端發送給服務器的!有可能是在請求體中(POST),也可能是在URL之后(GET)
    請求參數:有一個參數一個值的,還有一個參數多個值!
    > *****String getParameter(String name):獲取指定名稱的請求參數值,適用於單值請求參數
    > String[] getParameterValues(String name):獲取指定名稱的請求參數值,適用於多值請求參數
    > Enumeration<String> getParameterNames():獲取所有請求參數名稱
    > *****Map<String,String[]> getParameterMap():獲取所有請求參數,其中key為參數名,value為參數值。
    案例:超鏈接參數
    案例:表單數據

  * 請求轉發和請求包含
    RequestDispatcher rd = request.getRequestDispatcher("/MyServlet"); 使用request獲取RequestDispatcher對象,方法的參數是被轉發或包含的Servlet的Servlet路徑
    請求轉發:*****rd.forward(request,response);
    請求包含:rd.include(request,response);

    有時一個請求需要多個Servlet協作才能完成,所以需要在一個Servlet跳到另一個Servlet!
    > 一個請求跨多個Servlet,需要使用轉發和包含。
    > 請求轉發:由下一個Servlet完成響應體!當前Servlet可以設置響應頭!(留頭不留體)
    > 請求包含:由兩個Servlet共同未完成響應體!(都留)
    > 無論是請求轉發還是請求包含,都在一個請求范圍內!使用同一個request和response!
  * request域
    Servlet中三大域對象:request、session、application,都有如下三個方法:
    > void setAttribute(String name, Object value)
    > Object getAttribute(String name)
> void removeAttribute(String name);
    > 同一請求范圍內使用request.setAttribute()、request.getAttribute()來傳值!前一個Servlet調用setAttribute()保存值,后一個Servlet調用getAttribute()獲取值。

  * 請求轉發和重定向的區別
    > 請求轉發是一個請求一次響應,而重定向是兩次請求兩次響應
    > 請求轉發地址欄不變化,而重定向會顯示后一個請求的地址
    > 請求轉發只能轉發到本項目其他Servlet,而重定向不只能重定向到本項目的其他Servlet,還能定向到其他項目
    > 請求轉發是服務器端行為,只需給出轉發的Servlet路徑,而重定向需要給出requestURI,即包含項目名!
    > 請求轉發和重定向效率是轉發高!因為是一個請求!
      <> 需要地址欄發生變化,那么必須使用重定向!
      <> 需要在下一個Servlet中獲取request域中的數據,必須要使用轉發!
  
------------------

編碼
  常見字符編碼:iso-8859-1(不支持中文)、gb2312、gbk、gb18030(系統默認編碼,中國的國標碼)、utf-8(萬國碼,支持全世界的編碼,所以我們使用這個)

1. 響應編碼
  * 當使用response.getWriter()來向客戶端發送字符數據時,如果在之前沒有設置編碼,那么默認使用iso,因為iso不支持中文,一定亂碼
  * 在使用response.getWriter()之前可以使用response.setCharaceterEncoding()來設置字符流的編碼為gbk或utf-8,當然我們通常會選擇utf-8。這樣使用response.getWriter()發送的字符就是使用utf-8編碼的。但還是會出現亂碼!因為瀏覽器並不知道服務器發送過來的是什么編碼的數據!這時瀏覽器會使用gbk來解碼,所以亂碼!
  * 在使用response.getWriter()之前可以使用response.setHeader("Content-type","text/html;charset=utf-8")來設置響應頭,通知瀏覽器服務器這邊使用的是utf-8編碼,而且在調用setHeader()后,還會自動執行setCharacterEncding()方法。這樣瀏覽器會使用utf-8解碼,所以就不會亂碼了!
  * setHeader("Content-Type", "text/html;charset=utf-8")的快捷方法是:setContentType("text/html;charset=utf-8)。
2. 請求編碼
  * 客戶端發送給服務器的請求參數是什么編碼:
    客戶端首先要打開一個頁面,然后在頁面中提交表單或點擊超鏈接!在請求這個頁面時,服務器響應的編碼是什么,那么客戶端發送請求時的編碼就是什么。
  * 服務器端默認使用什么編碼來解碼參數:
    服務器端默認使用ISO-8859-1來解碼!所以這一定會出現亂碼的!因為iso不支持中文!
  * 請求編碼處理分為兩種:GET和POST:GET請求參數不在請求體中,而POST請求參數在請求體中,所以它們的處理方式是不同的!
  * GET請求編碼處理:
    > String username = new String(request.getParameter("iso-8859-1"), "utf-8");
    > 在server.xml中配置URIEncoding=utf-8
  * POST請求編碼處理:
    > String username = new String(request.getParameter("iso-8859-1"), "utf-8");
    > 在獲取參數之前調用request.setCharacterEncoding("utf-8");

3. URL編碼
  表單的類型:Content-Type: application/x-www-form-urlencoded,就是把中文轉換成%后面跟隨兩位的16進制。
  為什么要用它:在客戶端和服務器之間傳遞中文時需要把它轉換成網絡適合的方式。

  * 它不是字符編碼!
  * 它是用來在客戶端與服務器之間傳遞參數用的一種方式!
  * URL編碼需要先指定一種字符編碼,把字符串解碼后,得到byte[],然后把小於0的字節+256,再轉換成16進制。前面再添加一個%。
  * POST請求默認就使用URL編碼!tomcat會自動使用URL解碼!
  * URL編碼:String username = URLEncoder.encode(username, "utf-8");
  * URL解碼:String username = URLDecoder.decode(username, "utf-8");

  最后我們需要把鏈接中的中文參數,使用url來編碼!今天不行,因為html中不能給出java代碼,但后面學了jsp就可以了。

------------------

路徑
  * web.xml中<url-pattern>路徑,(叫它Servlet路徑!)
    > 要么以“*”開關,要么為“/”開頭
  * 轉發和包含路徑
    > *****以“/”開頭:相對當前項目路徑,例如:http://localhost:8080/項目名/ request.getRequestdispacher("/BServlet").for...();
    > 不以“/”開頭:相對當前Servlet路徑。 request.getRequestdispacher("/BServlet").for...();,假如當前Servlet是:http://localhost:8080/項目名/servlet/AServlet, 就是http://localhost:8080/項目名/servlet/BServlet
  * 重定向路徑(客戶端路徑)
    > 以“/”開頭:相對當前主機,例如:http://localhost:8080/, 所以需要自己手動添加項目名,例如;response.sendRedirect("/day10_1/Bservlet");
  * 頁面中超鏈接和表單路徑
    > 與重定向相同,都是客戶端路徑!需要添加項目名
> <form action="/day10_1/AServlet">
> <a href="/day10_/AServlet">
> <a href="AServlet">,如果不以“/”開頭,那么相對當前頁面所在路徑。如果是http://localhost:8080/day10_1/html/form.html。 即:http://localhost:8080/day10_1/html/ASevlet
> *****建立使用以“/”開頭的路徑,即絕對路徑!
  * ServletContext獲取資源路徑
    > 相對當前項目目錄,即當然index.jsp所在目錄
  * ClassLoader獲取資源路徑
    > 相對classes目錄
  * Class獲取資源路徑
    > 以“/”開頭相對classes目錄
    > 不以“/”開頭相對當前.class文件所在目錄。

 

1. request和response是由客戶端還是服務器創建?
2. 重定向是基於http協議的么?請求轉發和請求包含是基於http協議的么?
3. 響應編碼問題:
  response.getWriter().print("傳智"),是否能保證不出亂碼?
  response.setCharacterEncoding("utf-8");response.getWriter().print("傳智"),是否能保證不出亂碼?
  response.setContentType("text/html;charset=utf-8");response.getWriter().print("傳智"),是否能保證不出亂碼?
  response.setHeader("Content-Type", "text/html;charset=utf-8");response.getWriter().print("傳智"),是否能保證不出亂碼?
  response.getOutputStream().write("傳智".getByte("utf-8")),是否能保證不能亂碼?
4. HTTP協議中是否制定了response的API?
5. 瀏覽器是否知道response對象的存在?
6. 服務器是通過什么對象向客戶端發送http響應信息的?
7. response向客戶端發送數據只能使用response.getWriter()這一個流?
8. response對象是否有緩存?
9. 通常是否需要我們自己來關閉response.getWriter()和response.getOutputStream()?
10. 服務器從response中獲取信息,然后發送給客戶端?
11. response的兩個流是否可以同時使用?
12. 請求轉發時第一個Servlet設置的響應頭是否會留下,設置的響應體是否會留下?
13. 看代碼
Servlet1:
response.getOutputStream().write(“傳智”.getBytes(“gbk”));
response.getWriter().write(“播客”);
request.getRequestDispatcher(“/Servlet2”).forward(request,response);

Servlet2:
response.getOutputStream().write(“OK”.getBytes(“utf-8”));

輸出結果是什么?
14. 看代碼
Servlet1:
response.setHeader(“Content-Type”,“text/html;charset=utf-8”);
response.getOutputStream().write(“傳智”.getBytes(“utf-8”));
request.getRequestDispatcher(“/Servlet2”).forward(request,response);

Servlet2:
response.getOutputStream().write(“播客”.getBytes(“utf-8”));
輸出結果是什么?
15. 當需要改變瀏覽器地址欄中的地址,是使用重定向還是請求轉發?
16. 重定向路徑是否需要加載項目名?
17. ServletRequest與HttpServletRequest的區別是,前者與協議無關,而后者與http協議有關,所以后者可以獲取與http協議相關的信息
18. request是由服務器創建的,每個請求都會創建一個新的request對象。
19. request對象由瀏覽器發送給服務器?
20. request域是什么?
21. request域的范圍為整個請求鏈
22. request對象在發出請求時開始,到響應時結束,對么?
23. request.getAttribute()方法用來獲取瀏覽器發送過來的請求參數?
24. 請求參數是由瀏覽器發送給服務器的
25. request對象請求參數進行增、刪、改、查
26. 請求參數與request域有關系么?
27. 重定向為兩個請求,第一個請求中的請求參數,在第二個請求中是否可以獲取的到?
28. 服務器默認使用什么編碼來解碼請求數據?
29. request.setCharacterEncoding()方法只對什么請求方式有效?
30. GET請求方法處理編碼怎么處理?
31. 看代碼
Servlet1:
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Type", "text/html;charset=utf-8");
response.getWriter().write("傳播");
request.getRequestDispatcher("/servlet/Servlet2").forward(request,response);
Servlet2:
response.getWriter().write("智慧");
request.getRequestDispatcher("/servlet/Servlet3").forward(request,response);
response.setHeader("Content-Type", "text/html;charset=iso8859-1");
Servlet3:
response.getWriter().write("揮灑汗水");
輸出結果是什么?
32. 看代碼
Servlet1:
response.setContentType("text/html;charset=gbk");
response.getWriter().write("傳播智慧");
request.getRequestDispatcher("/servlet/Servlet2").forward(request,response);
response.sendRedirect("/app/servlet/Servlet3");
Servlet2:
response.getWriter().write("收獲成長");
輸出結果是什么?
33. 請求轉發和請求包含與瀏覽器無關,對么?
34. 請求包含可以實現多個Servlet的輸出合並?
35. 請求包含不能包含html頁面?
36. response.sendRedirect(“/app/Servlet2”); 地址欄中地址會變化么?
37. response.sendRedirect(“/Servlet2”);會不會404?
38. response.setStatues(302);response.setHeader(“location”,”/app/Servlet2”);會404么
39. response.setHeader(“Refresh”,”0;url=/app/Servlet2”);會404么
40. 在Servlet中這樣是獲取哪里的資源:FileInputStream fin = new FileInputStream(“1.jpg”);
41. 在Servlet中這樣是獲取哪里的資源:FileInputStream fin = new FileInputStream(this.getServletContext().getRealPath(“/1.jpg”));
42. 在Servlet中這樣是獲取哪里的資源:InputStream fin = this.getClass().getClassLoader().getResourceAsStream("1.jpg");
43. 在Servlet中這樣是獲取哪里的資源:InputStream fin = this.getClass().getClassLoader().getResourceAsStream("../1.jpg");
43. request.getParameter()、request.getAttribute()、request.getHeader(),說明一下。
44. sendRedirect()是誰的方法?

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM