Servlet(第二階段講義2)

關於Servlet概念

Servlet是由SUN公司提供的一門動態Web資源開發技術
1.靜態Web資源:不一樣的人,在不一樣的條件下訪問後看到的是相同的效果,這樣的資源叫作靜態Web資源(html、css、js等);
2.動態Web資源:在不一樣的訪問條件下看到的是不一樣的效果,這樣的資源叫作動態Web資源css

(Servlet、jsp、.NET、PHP等)。
Servlet本質上是一段Java程序,和以前的Java程序不一樣的是,Servlet程序沒法獨立運行,須要將Servlet程序放在服務器中(好比tomcat服務器),由服務器調用才能夠執行。

Servlet: 服務器端的Java程序.html

Servlet是運行在服務器端的Java程序,其做用是什麼?web

其做用是對服務器接收過來的請求進行處理(做用爲處理請求)
image數組

2.request和response介紹

request是表明HTTP請求信息的對象,response是表明HTTP響應信息的對象。瀏覽器

當瀏覽器發請求訪問服務器中的某一個Servlet時,服務器將會調用Servlet中的service方法來處理請求。在調用service方法以前會建立出request和response對象。tomcat

其中request對象中封裝了瀏覽器發送給服務器的請求信息(請求行、請求頭、請求實體等),response對象中將會封裝服務器要發送給瀏覽器的響應信息(狀態行、響應頭、響應實體),在service方法執行完後,服務器再將response中的數據取出,按照HTTP協議的格式發送給瀏覽器。服務器

1、request對象

問題1:什麼是請求參數?
所謂的請求參數,就是瀏覽器發送給服務器的數據(不區分請求方式),例如:經過表單向服務器提交的用戶名、密碼等,或者在超連接後面經過問號提交的數據,都是請求參數。
實例:
http://localhost/day10/TestPa...
問題2:如何獲取請求參數?
(1)request.getParameter(String paramName)
//-- 根據請求參數的名字獲取對應的參數值,返回值是一個字符串;
//-- 若是一個參數有多個值,該方法只會返回第一個值。
//-- 若是獲取的是一個不存在的參數,返回值爲null
(2)request.getParameterValues(String paramName)
//-- 根據請求參數的名字獲取該名字對應的全部參數值組成的數組,返回值是一個字符串數組,其中包含了這個參數名對應的全部參數值
//-- 若是獲取的是一個不存在的參數,返回值爲null
舉例:
//1.獲取請求參數中的用戶名(user)
String user = request.getParameter("user");
System.out.println( "user="+user );jsp

//2.獲取請求參數中的愛好(like)
String[] like = request.getParameterValues( "like" );
System.out.println( "like="+Arrays.toString( like ) );
3.獲取請求參數時出現中文亂碼問題
在獲取中文的請求參數時,可能會出現亂碼問題(和請求方式、tomcat服務器版本有關),具體能夠分爲如下三種狀況:
(1)若是請求是GET提交,而且tomcat是8.0及之後的版本,GET提交的中文參數,在獲取時不會出現亂碼問題!(8.0之後的to mcat包括8.0在獲取GET提交的中文參數時,已經處理中文亂碼問題。)編碼

(2)若是請求是POST提交,不論是哪一個版本的tomcat服務器,在獲取中文參數時,都會出現亂碼問題。由於tomcat底層在接收POST提交的參數時,默認會使用iso8859-1編碼接收,而這個編碼中沒有中文字符,因此在接收中文參數時,必定會出現中文亂碼問題!
解決方法是:通知服務器在接收POST提交的參數時,使用utf-8編碼來接收!
代碼實現:
request.setCharacterEncoding("utf-8");
注意:這行代碼不會影響GET提交,只對POST提交有效!url

這行代碼要放在任何獲取參數的代碼以前執行!
(3)若是請求是GET提交,而且tomcat是7.0及之前的版本,GET提交的中文參數,在獲取時會出現亂碼問題!
解決方法:在[tomcat安裝目錄]/ conf/server.xml文件的(修改端口的)Connector標籤上,添加一個 URIEncoding="utf-8" 屬性,以下:
<Connector port="80" protocol="HTTP/1.1"

connectionTimeout="20000"
       redirectPort="8443"
       URIEncoding="utf-8" />

同時在[Eclipse]/Servers/[當前tomcat服務器對應的配置目錄]/server.xml文件中,在Connector標籤上,添加一個 URIEncoding="utf-8" 屬性,同上!

2、response對象

response是表明HTTP響應信息的對象。

向客戶端發送數據

PrintWriter out = response.getWriter();
因爲服務器在經過response獲取的流發送數據時,默認使用iso8859-1編碼,而這個編碼中沒有中文字符,因此在經過response獲取的流發送中文數據時,會出現亂碼問題。

解決方法是:在響應數據以前,通知服務器使用utf-8發送數據。

/* 通知服務器在響應數據時,使用utf-8編碼

  • 也能通知瀏覽器使用utf-8接收服務器發送的數據 */

response.setContentType( "text/html;charset=utf-8" );
PrintWriter out = response.getWriter();
out.write( "你好" );

3、資源的跳轉方式

請求轉發(forward)和重定向(()Redirect)

請求轉發

image
請求轉發是服務器內部資源的一種跳轉方式,即當瀏覽器發送請求訪問服務器中的某一個資源(A)時,該資源將請求轉交給另一個資源(B)進行處理而且由資源B作出響應的過程,就叫作請求轉發。

請求轉發和重定向都是資源的跳轉方式,可是跳轉的過程有所不一樣。
請求轉發的特色:
(1)轉發是一次請求,一次響應
(2)請求轉發先後,瀏覽器的地址欄地址不會發生變化。(瀏覽器--訪問--> A --轉發--> B,地址欄地址始終指向A的地址)
(3)請求轉發先後的兩個資源必須屬於同一個Web應用,不然將沒法進行轉發。(A--轉發-->B,A和B必須屬於同一個Web應用!)
(4)在轉發時,能夠帶數據到目的地(好比,從A轉發到B,能夠從A帶數據給B,須要配合域對象才能夠)
請求轉發實現的代碼:
request.getRequestDispatcher(url地址/轉發到資源的地址).forward(req, res);

實現重定向(Redirect)

當瀏覽器向服務器發請求訪問某一個資源A,資源A在響應時通知瀏覽器須要向B進一步發出請求才能獲取到對應的資源,瀏覽器再次發請求訪問服務器中的資源B,最終由資源B響應瀏覽器要獲取的資源,這個過程叫作重定向。
image
重定向的特色:
(1)重定向是兩次請求、兩次響應
(2)重定向先後,瀏覽器的地址欄地址會發生變化。(由於兩次請求都是經過瀏覽器發起,瀏覽器知道這個跳轉的過程,所以地址欄地址會變化)
(3)重定向先後的request對象不是同一個(由於重定向是兩次請求,服務器會根據兩次請求建立兩個不一樣的request對象,request對象不是同一個,也就不能在重定向時經過request帶數據到目的地。)
(4)重定向先後的兩個資源能夠是來自不一樣的web應用,甚至能夠是來自不一樣的服務器。(進行跳轉的兩個資源之間沒有限制)

總結1.請求轉發(forward)和重定向(redirect)的區別?
(1)請求轉發是一次請求,一次響應; 而重定向是兩次請求兩次響應
(2)請求轉發先後地址欄地址不會發生變化; 而重定向先後地址欄地址會發生變化
(3)請求轉發先後的request對象是同一個,能夠配合request域對象帶數據到目的地; 而重定向先後的request對象不是同一個, 不能結合request域對象在重定向先後帶數據.
(4)請求轉發要求兩個資源必須屬於同一個Web應用; 而進行重定向的兩個資源能夠是同一個Web應用,也能夠不是同一個Web應用,甚至能夠是來自於不一樣的主機或服務器.

總結-2:何時用請求轉發(forward)?何時用重定向(redirect)?(1)若是但願跳轉先後地址欄地址不會發生變化, 只能使用轉發; 若是但願跳轉先後地址欄地址會發生變化, 只能使用重定向(2)若是但願在跳轉先後, 可以經過request對象帶數據到目的地, 只能使用轉發(3)若是僅僅是作一個跳轉,沒有其餘要求,此時推薦使用轉發(轉發是一次請求,一次響應,能夠減小訪問服務器的次數,下降服務器的壓力)

相關文章
相關標籤/搜索