請求響應對象
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()是誰的方法?