關於異步請求時出現的問題
第一個問題:
在struts2的配置文件中 如果不指定type的類型 那麽在action中任何跳轉都是默認forword類型的 稱為內部跳轉 比如下面的例子
第一個例子:
管理員登錄成功之後 跳轉到list.jsp頁面
但是網頁上的url卻是下面的
第二個例子:
用戶登錄成功之後 跳轉到detail.jsp頁面
但是url
說了這麽多 就是為了解決上面的操作和異步請求時 容易出現的問題
繼續拿第二個例子來說明 如果在該詳情頁面中 我使用異步操作(比如做更新)
只要我們使用了異步操作 那麽有沒有想過 將來action中做了相應操作之後 無論是否返回數據給瀏覽器
異步請求之後 最終都是需要一個返回一個地址的 這個地址怎麽確定呢
就是你在那個url上發送的異步請求 說到這 我們似乎有點明白了 即如果在一個url=.jsp上發送的異步請求 那麽將來返回的
地址就是這個.jsp頁面 如果在url =xxx.action上發送的異步請求 那麽將來返回的時候 還會去找這個action地址
所以就造成了如下的結果
登錄成功之後(url=xx.action 只是把登錄成功之後的detail.jsp頁面在當前url下展示了出來 所以請求地址不是xx.jsp 在以前的總結中提到過forward和redirect的區別) 在該頁面上 我想要修改員工的信息
那麽我們點擊提交 打個斷點來觀察 下面是點擊“信息變更”之後 準備發送異步請求(時刻記得當前請求的url=empAction_login.action 因為一會返回時就會返回個這個action 而不是detail這個頁面)
繼續下一步
正常進入提高的更新action 這裏我把response給註銷掉了(其實有沒有該語句 執行效果都 一樣 如下面的情況)
首先 我在empAction_login.action中 打上了斷點 易於觀察
然後繼續下一步
可以看到 我們剛才的推論是正確的 它的確返回給了發送異步請求處的url 即empAction.action
所以這就出現了問題 我們明明做的是更新操作 預想結果:要麽成功 要麽失敗 可以現在卻又來到了登錄處的action 無論登錄成功或者失敗 都不是我們想要的處理流程
所以 結論:
如果在一個url=.jsp上發送的異步請求 那麽將來返回的地址就是這個.jsp頁面 如果在url =xxx.action上發送的異步請求 那麽將來返回的時候 還會去找這個action地址
問題二:根據上邊出現的問題 我現在的思路就是在登錄成功之後 在struts2中的配置文件中 改變type類型 使其直接重定向到detail.jsp頁面 這樣就可以解決上面的問題了
修改如下:
然後登錄訪問
登錄成功
然後根據struts2.xml的配置 進行重定向
但是卻出現了如下的結果:
這是因為 我們的detail.jsp頁面在WEB-INF下面 重定向 相當於客戶端重新發送一次請求 直接訪問 所以 訪問不到
到這都非常有意思了 一方面是 為了保證頁面的安全 不登錄不讓其訪問 一方面又想通過重定向訪問 這怎麽搞呢
解決辦法(其實也可以把該頁面給拿到web-inf外部 因為這個頁面不是安全性不是非常高)
看到沒 我在web.xml中配置了一個映射 註意和servlet程序映射的不同
這樣配置之後 就可以通過瀏覽器直接訪問web-inf下的內容了
然後 在struts配置文件中 我們這樣寫
不過因為使用了重定向 所以需要把查詢到的數據放在session域中 但是問題還是存在 因為我們登錄成功 重定向之後的url是這樣的
比較坑爹 這樣提交之後
關於異步請求時出現的問題