之前我看過不少文章,大概的意思是:擋在瀏覽器請求時就會生成一個新的線程,request就會在整個線程的生命週期裏,jsp->action->jsp,當線程註銷時,request也會註銷,當你再次請求瀏覽器時,又會再生一個線程,同時也會生成新的request。java
其實這裏面的意思你們都會明白,當看到這樣的文章我也感受本身很明白,但是實際應用中還會表現出不足。瀏覽器
下面的討論都是在product_id不變的狀況下討論的,只是簡單的從一個jsp傳令一個jsp中jsp
瀏覽器中咱們請求路徑:http://localhost:8080/fangdo/calculator/listPriceByProductId.action?product_id=1,會根據配置文件找到相應的action的方法,線程
在方法中咱們能夠經過code
HttpServletRequest request = ServletActionContext.getRequest(); String product_id= request.getParameter("product_id");
這倆行得到product_id參數值,而後在後臺進行邏輯操做。生命週期
能夠經過下面的代碼傳到jsp頁面中get
request.setAttribute("product_id", product_id);
在jsp頁面中能夠經過這一行得到值:io
String product_id = request.getAttribute("product_id");
上面的流程是請求開始時傳遞參數,這個參數伴隨着整個生命週期。
發現問題沒?class
請求是jsp->action->jsp,若是咱們想在跳轉後的jsp頁面中得到參數,能夠直接使用後臺
String product_id= (String)request.getParameter("product_id");
而不用上面那麼麻煩,這個參數一直在這個request生命中,你能夠在在這個request生命中的任什麼時候候獲取他,使用它。
若是在action中得到參數,而後經過setAttribute()方法發送到jsp中,再有jsp中getAttribute()得到。這是對request生命週期的理解錯誤的表現,可能你會理解成jsp->action就是request的做用區域,因此須要setAttribute()方法將參數再次傳一下。其實在瀏覽器請求時就會生成一個新的線程,request就會在整個線程的生命週期裏,jsp->action->jsp,這是request的整個生命週期。