1. 程式人生 > >淺談Java web 中request的setAttribute()用法

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

一下是來自社群問答的一些回答,我整合了一下形成文章

在兩個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結合上面所說的用法來傳遞所需的數值。