includeViewParams = true не работает на шаблонных страницах - PullRequest
4 голосов
/ 31 января 2012

Рассмотрим этот шаблон:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets">
    <f:view contentType="text/html">
        <ui:insert name="metadata"/>
        <h:head>
            <title></title>
        </h:head>
        <h:body>
            <ui:insert name="content"/>
        </h:body>
    </f:view>
</html>

эта страница, которая его использует (/pages/test.xhtml):

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets">
    <f:view contentType="text/html">
        <h:head>
            <title></title>
        </h:head>
        <h:body>
            <ui:composition template="/WEB-INF/templates/testLayout.xhtml">
                <ui:define name="metadata">
                    <f:metadata>
                        <f:viewParam name="foobar" value="#{pageBean.foo}"/>
                    </f:metadata>
                </ui:define>
                <ui:define name="content">
                    <h:form>
                        <h:commandLink value="Click"
                                       action="#{util.currentPageAction()}"/>
                    </h:form>
                </ui:define>
            </ui:composition>
        </h:body>
    </f:view>
</html>

боб страницы:

@Named
@RequestScoped
public class PageBean implements Serializable
{
    public String getFoo()
    {
        return foo;
    }

    public void setFoo(String foo)
    {
        this.foo = foo;
    }

    private String foo;
}

и этот боб:

@Named
@ApplicationScoped
public class Util implements Serializable
{
    public String currentPageAction()
    {
        return FacesContext.getCurrentInstance().getViewRoot().getViewId() +
                   "?faces-redirect=true&includeViewParams=true";
    }
}

Когда я загружаю http://localhost:8080/faces/pages/test.xhtml?foo=bar в браузер и нажимаю <h:commandLink/>, URL меняется на http://localhost:8080/faces/pages/test.xhtml. То есть параметры просмотра не включены в URL перенаправления.

Однако, когда я реорганизую страницу таким образом, что она не использует шаблон, она ведет себя как ожидалось. То есть параметры просмотра включены в URL перенаправления.

Я понимаю, что <f:metadata/> не работает и не должен работать, если поместить его в шаблон лицевых панелей. Это не то, что здесь происходит, так что это другая проблема. Там нет ничего в спецификации, чтобы сказать, что это не может быть сделано. Действительно, не было бы другого (насколько мне известно) способа создать страницу на основе шаблона с параметрами представления.

1 Ответ

0 голосов
/ 26 января 2013

У меня похожая проблема, я решаю ее, как определить набор метаданных. Метаданные вводятся сразу после f: view

<ui:define name="metadata">
   <f:metadata>
           <f:viewParam name="id" .../>
   </f:metadata>
    </ui:define>

template.xhtml

        <html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"
       xml:lang="en" lang="en">
         <f:view>
    <ui:insert name="metadata"/>
       <div id="container">
    <ui:insert name="content"/>
            </div>
          </f:view>
...