Сохранение параметров строки запроса 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&serviceId=AABBCC&faces-redirect=true";
вы даже можете заменить &
С &
но избежать его в вашем 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>