2012-01-31 1 views
4

Рассмотрим этот шаблон:includeViewParams = истина не работает в шаблонах страниц

<!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/> не работает и не должен работать, если он находится внутри шаблона флатцов. Это не то, что здесь происходит, так что это другая проблема. В спецификации нет ничего, чтобы сказать, что это невозможно. Действительно, не было бы другого способа (насколько мне известно) создания страницы на основе шаблона с параметрами представления.

+0

Добавлен комментарий к [эта ошибка] (http://java.net/jira/browse/JAVASERVERFACES-2260). –

+0

Я надеюсь, что это будет исправлено однажды. Я проголосовал за это. –

+0

У меня есть аналогичная проблема с '' или '', где в том числе атрибут 'includeViewParams =" true "' не дает такого же поведения, как повторение параметров представления с использованием записей ''. При использовании 'includeViewParams' значения параметров в запросе link/GET исходят из бэк-компонента страницы' result', а не из параметров представления, представленных на текущую страницу, как я полагаю, они должны быть. [Core JavaServer Faces - третье издание] (http://horstmann.com/corejsf/) p. 91 подразумевает, что эти два метода должны быть взаимозаменяемыми. –

ответ

0

У меня аналогичная проблема, я решить ее как определить "метаданные" набор метаданных получает инъекции сразу после F: вид

<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>