1. 程式人生 > >10-HTTPServletReauest和HTTPServletResponse

10-HTTPServletReauest和HTTPServletResponse

Servlet配置方式

 1. 全路徑匹配

 以 / 開始 /a /aa/bb

 localhost:8080/專案名稱/aa/bb

2. 路徑匹配 , 前半段匹配

 以 / 開始 , 但是以 * 結束 /a/* /*

 * 其實是一個萬用字元,匹配任意文字

 localhost:8080/專案名稱/aa/bb

 3. 以副檔名匹配

 寫法: 沒有/ 以 * 開始 *.副檔名 *.aa *.bb


ServletContext

 Servlet 上下文

 每個web工程都只有一個ServletContext物件。 說白了也就是不管在哪個servlet裡面,獲取到的這個類的物件都是同一個。

如何得到物件

//1. 獲取物件
ServletContext context = getServletContext();

 有什麼作用

1. 獲取全域性配置引數
2. 獲取web工程中的資源
3. 存取資料,servlet間共享資料 域物件

可以獲取全域性配置引數


獲取全域性引數



 可以獲取Web應用中的資源

1. 獲取資源在tomcat裡面的絕對路徑

先得到路徑,然後自己new InpuStream

context.getRealPath("") //這裡得到的是專案在tomcat裡面的根目錄。

D:\tomcat\apache-tomcat-7.0.52\apache-tomcat-7.0.52\wtpwebapps\Demo03\

String path = context.getRealPath("file/config.properties");

D:\tomcat\apache-tomcat-7.0.52\apache-tomcat-7.0.52\wtpwebapps\Demo03\file\config.properties


2. getResourceAsStream 獲取資源 流物件 直接給相對的路徑,然後獲取流物件。

 


通過classloader去獲取web工程下的資源


 使用ServletContext存取資料。

 

1. 定義一個登陸的html頁面, 定義一個form表單

2. 定義一個Servlet,名為LoginServlet

3. 針對成功或者失敗,進行判斷,然後跳轉到不一樣的網頁

ServletContext存取值分析


細節:

<!-- 
A路徑: Servlet的路徑
http://localhost:8080/Demo4/login

B路徑: 當前這個html的路徑:
http://localhost:8080/Demo4/login.html -->


<form action="login" method="get">
賬號:<input type="text" name="username"/><br>
密碼:<input type="text" name="password"/><br>
<input type="submit" value="登入"/>
</form>


ServletContext 何時建立, 何時銷燬? 伺服器啟動的時候,會為託管的每一個web應用程式,建立一個ServletContext物件 從伺服器移除託管,或者是關閉伺服器。 ServletContext 的作用範圍 只要在這個專案裡面,都可以取。 只要同一個專案。 A專案 存, 在B專案取,是取不到的? ServletContext物件不同。

 


HttpServletRequest

 這個物件封裝了客戶端提交過來的一切資料。

1. 可以獲取客戶端請求頭資訊

//得到一個列舉集合 
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String name = (String) headerNames.nextElement();
String value = request.getHeader(name);
System.out.println(name+"="+value); } 2. 獲取客戶端提交過來的資料 String name = request.getParameter("name"); String address = request.getParameter("address"); System.out.println("name="+name); System.out.println("address="+address); ------------------------------------------------- //name=zhangsan&name=lisi&name=wangwu 一個key可以對應多個值。  Map<String, String[]> map = request.getParameterMap(); Set<String> keySet = map.keySet(); Iterator<String> iterator = keySet.iterator(); while (iterator.hasNext()) { String key = (String) iterator.next(); System.out.println("key="+key + "--的值總數有:"+map.get(key).length); String value = map.get(key)[0]; String value1 = map.get(key)[1]; String value2 = map.get(key)[2]; System.out.println(key+" ======= "+ value + "=" + value1 + "="+ value2); } 3. 獲取中文資料 > 客戶端提交資料給伺服器端,如果資料中帶有中文的話,有可能會出現亂碼情況,那麼可以參照以下方法解決。

 

 如果是GET方式

1. 程式碼轉碼
String username = request.getParameter("username");
String password = request.getParameter("password");

System.out.println("userName="+username+"==password="+password);

//get請求過來的資料,在url位址列上就已經經過編碼了,所以我們取到的就是亂碼,
//tomcat收到了這批資料,getParameter 預設使用ISO-8859-1去解碼

//先讓文字回到ISO-8859-1對應的位元組陣列 , 然後再按utf-8組拼字串
username = new String(username.getBytes("ISO-8859-1") , "UTF-8");
System.out.println("userName="+username+"==password="+password); 直接在tomcat裡面做配置,以後get請求過來的資料永遠都是用UTF-8編碼。 2. 可以在tomcat裡面做設定處理 conf/server.xml 加上URIEncoding="utf-8" <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>

 

如果是POST方式

這個說的是設定請求體裡面的文字編碼。 get方式,用這行,有用嗎? ---> 沒用
request.setCharacterEncoding("UTF-8");

這行設定一定要寫在getParameter之前。


HttpServletResponse

 負責返回資料給客戶端。

輸出資料到頁面上

 

//以字元流的方式寫資料    
//response.getWriter().write("<h1>hello response...</h1>");

//以位元組流的方式寫資料 
response.getOutputStream().write("hello response2222...".getBytes());

 


響應的資料中有中文,那麼有可能出現中文亂碼

 以字元流輸出

> response.getWriter()


//1. 指定輸出到客戶端的時候,這些文字使用UTF-8編碼
response.setCharacterEncoding("UTF-8");

//2. 直接規定瀏覽器看這份資料的時候,使用什麼編碼來看。
response.setHeader("Content-Type", "text/html; charset=UTF-8");

response.getWriter().write("我愛黑馬訓練營...");

 

 

以位元組流輸出

> response.getOutputStream()



//1. 指定瀏覽器看這份資料使用的碼錶
response.setHeader("Content-Type", "text/html;charset=UTF-8");

//2. 指定輸出的中文用的碼錶
response.getOutputStream().write("我愛深圳黑馬訓練營..".getBytes("UTF-8"));


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

不管是位元組流還是字元流,直接使用一行程式碼就可以了。

response.setContentType("text/html;charset=UTF-8");

然後在寫資料即可。

 


演練下載資源。

1. 直接以超連結的方式下載,不寫任何程式碼。 也能夠下載東西下來。

 

讓tomcat的預設servlet去提供下載:<br>
<a href="download/aa.jpg">aa.jpg</a><br>
<a href="download/bb.txt">bb.txt</a><br>
<a href="download/cc.rar">cc.rar</a><br>

 

> 原因是tomcat裡面有一個預設的Servlet -- DefaultServlet 。這個DefaultServlet 專門用於處理放在tomcat伺服器上的靜態資源。

 

總結

1. Servlet註冊方式

2. ServletContext【重點】

作用:

1. 獲取全域性引數

2. 獲取工程裡面的資源。

3. 資源共享。 ServletContext 域物件

有幾個 一個 

什麼時候建立 ? 什麼時候銷燬

伺服器啟動的時候給每一個應用都建立一個ServletContext物件, 伺服器關閉的時候銷燬

簡單登入

3. HttpServletRequest【重點】

1. 獲取請求頭

2. 獲取提交過來的資料

 

4. HttpServletResponse【重點】

負責輸出資料到客戶端,其實就是對之前的請求作出響應

5. 中文亂碼問題。【重點】

6. 下載


作業:


1. 完成註冊

2. 完成登入

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

V1.1 最好配合上資料庫,完成註冊和登入的功能。