淺談Java web 中request的setAttribute()用法


原文:https://blog.csdn.net/frank_jay/article/details/51243481

在兩個JSP代碼片中有這樣兩端程序:

 

JSP1代碼

String [] test=new String[2];
test[0]="1";
test[1]="2";
request.setAttribute("test",test) ;
response.sendRedirect("jsp2.jsp");

  

JSP2代碼

</pre><pre name="code" class="java">String test[]=(String[])request.getAttribute("test");
out.print(test);

  

但是,問題來了:為什么JSP2 中test獲取不到呢?

其實那就要從request的生命周期或者是說作用范圍說起了,setAttribute()用來在同一個request周期中保存變量使用。

比如servlet調用后,引出JSP頁面,這是一個request周期。如果在Jsp頁面需要servlet中的一些 處理結構,就從request.getAttribute中獲取。

而sendRedirect()方法是通過瀏覽器重定向的,所以第二個JSP頁面中獲得的request並非是前一個頁面的request(兩次請求生成了前后兩個不同的 request對象了)。
而此時使用RequestDispatcher接口的forward()方法則能夠得到request中的對象了,這是因為后者並不是使用客戶端瀏覽器進行重定向的,從函數的名字就可以看出,RequestDispatcher.forward()就是從服務器端進行任務轉發。

sendRedirect()是請求從定向,和超連接是一個意思,比如你在A頁面中寫一個request.setAtribute,sendRedirect到B頁面,就是說服務器從A頁面中給你一個response,然后你的瀏覽器再去request到B頁面,由於有兩次request和response,是不能在B頁面取到request.setAtribute里的值,能從地址欄看到url的改變。

request.getRequestDispatcher().forward(request,response)是請求分發器,比如你在A頁面中寫一個request.setAtribute,request.getRequestDispatcher().forward(request,response)到B頁面,那就是說服務器給你的response是B頁面的,並且只有一次request和response,所以是能在B頁面取到request.setAtribute里的值,地址欄的url仍然是A頁面的。

 

 

所以通常情況下,setAttribute()方法都和RequestDispatcher.forward()都在一起使用,具體用法示例:

List list = new CommonsDao().getAllCommons();
request.setAttribute("CommonsList", list);
request.getRequestDispatcher("View.jsp").forward(request, response);

  

順便談一談 request.getAttribute()與request.setAttribute()

request.getAttribute("nameOfObj"),可得到JSP頁面一表單中控件的Value。

其實表單控件中的Object的 name與value是存放在一個哈希表中的,所以在這里給出Object的name會到哈希表中找出對應它的value。


而不同頁面間傳值使用request.setAttribute(position, nameOfObj)時,只會從a.jsp到b.jsp一次傳遞,之后這個request 就會失去它的作用范圍,再傳就要再設一個 request.setAttribute()。而使用session.setAttribute()會在一個過程中始終保有這個值。


P.S.:JavaScript與JSP中不能相互傳值,因為JavaScript運行在客戶端,而JSP運行在服務器端。若想使它們之間可以相互傳遞參數,可以在JSP中設置一個hidden控件,用它的value結合上面所說的用法來傳遞所需的數值。


免責聲明!

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



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