2013-04-17 25 views
1

在一個JSF託管bean,我從this past question採取了以下代碼:轉發來自JSF的請求,託管bean到一個Struts 2的動作不起作用

String uri = "/myAction"; 
FacesContext.getCurrentInstance().getExternalContext().dispatch(uri); 

myAction是一個Struts動作的名稱在我的struts.xml中定義。

但是,當我訪問JSF bean時,我不會轉發到/myAction。相反,我得到一個404 http錯誤:The requested resource (/MyApp/myAction) is not available

爲什麼不起作用?

當我試圖直接從瀏覽器訪問/myAction通過去http://localhost:8080/MyApp/myAction所有工作正常。

回答

0

線索是在Javadoc爲dispatch方法:

「參數: 路徑 - 語境相對路徑指定的資源,其必須以斜線開頭(」 /「)字符」

也就是說,它的指派到URL相對於你的應用程序上下文,而不是Web服務器的根文件夾

你需要的是redirect方法,它重定向到一個絕對的URL。

+0

爲什麼它看起來你不像我以前(/ myAction)的網址,以便爲它工作,應該是相對於Web服務器的根文件夾('HTTP:// mydomain.com') ?它應該與應用程序上下文相關('http:// mydomain.com/MyApp')。正如你所說的那樣。所以,它應該有效,如果我讓你正確。它可以與xhtml文件一起工作,這些文件也可以在應用程序上下文的根目錄找到,比如'/ welcome.xhtml'。我誤解了你的意思嗎? – rapt

+0

出於某種原因,我認爲問題的根源在於JSF管理的bean存在於一個servlet(JSF servlet)中,而Struts動作存在於一個過濾器(Struts 2過濾器)中。在所有servlet完成後調用過濾器。所以,如果我從一個JSF bean轉發到一個圍繞過濾器構建的框架,它似乎不能工作......因爲只要JSF bean還活着就沒有過濾器。或者我誤解了生命週期? – rapt

+0

啊,對不起。疲倦時張貼的危險。我看到「當我嘗試訪問/ myAction時」,並認爲您沒有通過應用程序上下文訪問。在這種情況下,是的,這很奇怪......但我沒有使用struts,所以我不知道應該如何訪問struts過濾器。儘管在servlet api中調度方法期望着陸在另一個我相信的servlet上(這就是我一直使用的servlet) - 所以我敢打賭,這是因爲struts是一個過濾器。使用重定向工作嗎? –

0

設置在Struts中web.xml 2濾波器,可以接受遠期(和直接要求(或重定向)):

在你web.xml,更改:

<filter-mapping> 
    <filter-name>struts2</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

要:

<filter-mapping> 
    <filter-name>struts2</filter-name> 
    <url-pattern>/*</url-pattern> 

    <dispatcher>FORWARD</dispatcher> 
    <dispatcher>REQUEST</dispatcher> 
    <!-- uncomment if you plan to include struts action output --> 
    <!-- 
    <dispatcher>INCLUDE</dispatcher> 
    --> 
</filter-mapping> 

信用度:

http://www.coderanch.com/t/59584/Struts/request-dispatcher-struts-action

http://docs.oracle.com/cd/B32110_01/web.1013/b28959/filters.htm#BCFIEDGB