# Servlet傳遞數據方式
### 基本概述
????Servlet傳遞數據的方式有很多,這里提供五種方式:
1、靜態變量
2、HttpServletResponse的sendRedirect()方法
3、HttpServletRequest的getRequestDispatch()方法
4、HttpServletRequest的getSession()方法
5、HttpServletRequest的setAttribute()方法
?
### 靜態變量
????通過建立一個數據類來進行傳遞。
案例:
public?class?MyData{
????public?static?String?data; //通過使用該類來實現數據傳遞
}
?
### HttpServletResponse的sendRedirect()方法
????sendRedirect()方法是讓瀏覽器重定向到另一個鏈接。其內部原理是設置狀態碼為303,并設置相應的Location響應頭。
基本語法:
response.sendRedirect("/Web應用名/資源名?uname="+username+"&pwd="+password);
response.sendRedirect(“servlet的地址?參數名=參數值&參數名=參數值...”);
參照值是String?,?參數名應當使用?字母組合
在接受數據的Servlet中:
String?參數=request.getParameter(“參數名”);
?
#### 基本原理圖

PS:使用重定向不能使用PrintWrite,ServletOutputStream這樣的流。因為重定向已經將消息返回給瀏覽器,其數據流也就沒必要使用了。
?
### HttpServletRequest的getRequestDispatch()方法
????getRequestDispatch()方法是使WEB服務器從當前Servlet轉發到當前應用下的另一個Servlet。
基本語法:
request.getRequestDispatcher(資源地址).forward(request,response);
資源地址:不需要項目名。因為它只能在WEB服務器內部轉發。
?
#### 基本原理圖

PS:getRequestDispatcher()請求轉發可以一直轉發下去,只要最終會處理并給服務器相應內容就行了。而且請求轉發不會改變瀏覽器的URL,sendRedirect()會改變URL。
注意事項:
1、使用forward不能轉發到該WEB應用外的URL
2、因為forward發生在文本服務器內,所以Servlet1、Servlet2等等,只要一直轉發,使用的都是相同的request和response
### HttpServletRequest的getSession()方法
? ? getSession()方法會獲取一個會話,這個內容會在另一篇博客會話技術中詳細說明。
基本語法:
1、放入session:request.getSession.setAttribute("loginUser",username);?
2、取出session:request.getSession.getAttribute("loginUser");
PS:該方法可以傳遞對象
案例:
放入:
User?user=?new?User();
user.setName(“zs”);
user.setPassWord(“123”);
request.getSession.setAttribute("userObj",userObj);?
取出:
User?user=(User)request.getSession.getAttribute(“userObj”);
?
### HttpServletRequest的setAttribute()方法
? ? setAttribute()方法可以設置一個鍵值對,該鍵值對在該request的有效期內都可以使用。相應的還有removeAttribute()注銷鍵值對的方法。該方法經常和getRequestDispatch()一起使用。
基本語法:
setAttribute(name,?value);
?
PS:request的Attribute在一次請求中有效。一次請求:沒有將響應消息返回給瀏覽器就視為一次請求。
### 比較sendRedirect()和forward(request,response)
1、sendRedirect()重定向,forward()轉發
2、實際發生的位置不一樣
????sendRedirect?發生在瀏覽器
????forward?發生在web服務器
3、使用用法不一樣
request.getRequestDispatcher(“/資源URI”).forward(request,response)
response.sendRedirect(“/web應用/資源URI”);
4、能夠去URL范圍不一樣
sendRedirect可以去任意URL
forward?只能去當前的WEB應用的資源
?
?
----------參考《韓順平.細說Servlet》