Сохранение параметров строки запроса GET request в форме JSF отправить
у меня 3 страницы:
main.xhtmlagreement.xhtmlgenerated.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>