Навигация по лицам не работает в JSF2 - PullRequest
1 голос
/ 21 марта 2012

Я использую JSF 2.0

, это мои лица-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";
}

в моем test.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>

и это мой web.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>

Чего мне не хватает?

1 Ответ

9 голосов
/ 21 марта 2012

Идентификаторы представления не должны содержать отображение 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>.Это более удобно для SEO, так как поисковые роботы не индексируют POST-формы:

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