2012-03-21 74 views
1

真正的工作,我在我的測試中使用JSF 2.0面臨導航不JSF2

這是我在faces-config.xml

<?xml version="1.0" encoding="UTF-8"?> 
<!-- This file is not required if you don't need any extra configuration. --> 
<faces-config version="2.0" xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
     http://java.sun.com/xml/ns/javaee 
     http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"> 

    <navigation-rule> 
     <from-view-id>/pages/test/test.html</from-view-id> 
     <navigation-case> 
      <from-outcome>write</from-outcome> 
      <to-view-id>/pages/test/test-write.html</to-view-id> 
     </navigation-case> 

    </navigation-rule> 

</faces-config> 

的TestController.java

@ManagedBean(name="testController") 
@SessionScoped 
public class TestController implements Serializable { 

    private static final long serialVersionUID = -3244711761400747261L; 

    public String test() { 


     return "write?faces-redirect=true"; 
} 

。 xhtml文件

<?xml version="1.0" encoding="UTF-8"?> 
<ui:composition xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:h="http://java.sun.com/jsf/html" 
    template="/WEB-INF/templates/default.xhtml"> 
    <ui:define name="content"> 
      <h:form> 
        <h:commandButton action="#{testController.test()}" value="test" /> 
      </h:form> 
    </ui:define> 

</ui:composition> 

這是我的我們b.xml

<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
    version="3.0"> 
    <display-name>Bachelor Demo</display-name>  

    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.html</url-pattern> 
    </servlet-mapping> 
</web-app> 

我在想什麼?

回答

9

視圖ID不應該包含FacesServlet映射。它應該表示物理文件路徑/名稱。將.html更改爲.xhtml。 您還應該刪除?faces-redirect=true,而不是將<redirect />添加到<navigation-case>

<navigation-rule> 
    <from-view-id>/pages/test/test.xhtml</from-view-id> 
    <navigation-case> 
     <from-outcome>write</from-outcome> 
     <to-view-id>/pages/test/test-write.xhtml</to-view-id> 
     <redirect /> 
    </navigation-case> 
</navigation-rule> 

順便說一句,這是舊JSF 1.x的風格。你知道新的JSF2隱式導航嗎?你可以返回"/pages/test/test-write.xhtml?faces-redirect=true"

public String test() { 
    return "/pages/test/test-write.xhtml?faces-redirect=true"; 
} 

不再需要臃腫的XML導航案例。此外,如果您的操作方法實際上沒有做其他任何事情,那麼您也可以將action屬性中的確切返回值代替。

<h:commandButton ... action="/pages/test/test-write.xhtml?faces-redirect=true" /> 

更有甚者,如果是普通的頁面到頁面導航,而使用<h:link>代替。它更搜索引擎友好的searchbots不索引POST形式:

<h:link ... outcome="/pages/test/test-write.xhtml" /> 
+0

喜@BalusC,我都嘗試 - 我改變了它在navigationrule到.xhmtl - 這是行不通的。我也刪除了導航規則並使用''/pages/test/test-write.xhtml?faces-redirect=true''是'faces-config.xml'和'web.xml'嗎? – Joerg 2012-03-21 16:22:12

+1

如果規則不起作用,那麼從視圖ID只是不匹配。您可以通過在action方法中檢查'facesContext.getViewRoot()。getViewId()'來了解它。請注意,我更新了我的答案,並建議刪除'?faces-redirect'。此外,我不確定我是否理解你的最後一個問題。該字符串應該是操作方法的「返回」值。 – BalusC 2012-03-21 16:24:24

+1

哦,這個動作根本不會被調用。您可以通過在操作方法上設置斷點或通過添加sysout/logger行來計算出來。順便說一下,如果action方法不包含除naviation的返回值之外的任何內容,那麼您也可以將'action'屬性中的確切返回值替換。更重要的是,如果它是純粹的頁面到頁面導航,而是使用''而不用重定向。這對SEO更友好。另請參閱http://stackoverflow.com/questions/4317684/when-should-i-use-houtputlink-instead-of-hcommandlink – BalusC 2012-03-21 16:54:40