Сохранение параметров строки запроса GET request в форме JSF отправить

у меня 3 страницы:

  • main.xhtml
  • agreement.xhtml
  • generated.xhtml

на agreement.xhtml необходимо два параметра для правильной загрузки:serviceId и site. Итак, обычный url выглядит так:/app/agreement.xhtml?site=US&serviceId=AABBCC.

у меня эта кнопка на agreement.xhtml

<h:form>
   <h:commandButton value="Generate License File" action="#{agreement.generateMethod}" />   
</h:form>

на @RequestScoped бин #{agreement} есть такой метод:

public String generateMethod(){
    .......
    return "generated";
}

мне нужно это, по щелчку,generateMethod() метод выполняется, и после его готово, пользователь перенаправляется на

2 ответов


ваша конкретная проблема вызвана тем, что JSF <h:form> по умолчанию отправляет текущий URL-адрес запроса без строки запроса. Посмотрите ближе на сгенерированный вывод HTML, вы увидите

<form action="/app/agreement.xhtml" ...>

таким образом, вам явно необходимо включить эти параметры запроса самостоятельно. Есть несколько способов решить эту проблему. Если вы не отправляли перенаправление, вы можете просто добавить их в качестве скрытых входов в форму JSF.

<h:form>
    <input type="hidden" name="site" value="#{param.site}" />
    <input type="hidden" name="site" value="#{param.serviceId}" />
    ...
</h:form>

только, эти параметры не будут появляться в URL в адресной строке браузера. Это не проблема, если вы используете только ajax на той же странице. The <h:inputHidden> кстати не подходит, так как он будет путано терять свое значение, когда в форме возникает ошибка преобразования или проверки.

для того, чтобы они снова появились в URL, вам нужно <f:viewParam> и includeViewParams. Чтобы получить includeViewParams чтобы работать, вам нужно объявить следующее в и исходный код страницы agreement.xhtml ...

<f:metadata>
    <f:viewParam name="site" value="#{agreement.site}" />
    <f:viewParam name="serviceId" value="#{agreement.serviceId}" />
</f:metadata>

... и целевая страница generated.xhtml:

<f:metadata>
    <f:viewParam name="site" value="#{generated.site}" />
    <f:viewParam name="serviceId" value="#{generated.serviceId}" />
</f:metadata>

теперь вы можете отправить перенаправление, включая параметры просмотра следующим образом:

public String generateMethod() {
    // ...

    return "generated?faces-redirect=true&includeViewParams=true";
}

обратите внимание, что Боб должен быть @ViewScoped чтобы сохранить эти параметры в живых между открытием страницы с формой и отправкой формы, а также при ошибках проверки. В противном случае, при прилипании к @RequestScoped бин, вы должны сохранить их как <f:param> в командной компоненты:

<h:commandButton ...>
    <f:param name="site" value="#{generated.site}" />
    <f:param name="serviceId" value="#{generated.serviceId}" />
</h:commandButton>

нет никакого способа установить их для <f:ajax> внутри входных компонентов ваш Боб должен быть действительно @ViewScoped.


альтернативно, если вы используете служебную библиотеку JSF OmniFaces уже, тогда вы также можете просто заменить <h:form> by <o:form> следующим образом (см. Также витрина):

<o:form includeRequestParams="true">

это в основном все. Это создаст <form action> С текущей строкой запроса включенный.

<form action="/app/agreement.xhtml?site=US&serviceId=AABBCC" ...>

эти параметры запроса затем просто доступны в карте параметров запроса формы отправки. Вам не нужны дополнительные метаданные / viewparams, и Вам также не нужно отправлять перенаправление, и ваш bean может быть сохранен @RequestScoped, если это необходимо.

public String generateMethod() {
    // ...

    return "generated";
}

или, если вы используете библиотеку "pretty URL", такую как PrettyFaces или FacesViews или, возможно, что-то доморощенное, и намерены отправить точно такой же URL, как отображается в адресе браузера бар, тогда вы могли бы использовать .

<o:form useRequestURI="true">

Читайте также:


код generateMethod возвратить

return "generated?site=US&amp;serviceId=AABBCC&amp;faces-redirect=true";

вы даже можете заменить &amp; С & но избежать его в вашем xhtml.

в своем generated.xhtml вы можете поймать параметры, которые передаются с <f:viewParam> такой

<f:metadata>
    <f:viewParam name="site" value="#{yourBean.site}"/><!--Make sure you have a setter-->
    <f:viewParam name="serviceId" value="#{yourBean.serviceId}"/><!--Make sure you have a setter-
</f:metadata>
<h:head>