Ответ 1
Ваша конкретная проблема вызвана тем, что 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 на той же странице. <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";
}
Обратите внимание, что bean должен быть @ViewScoped
, чтобы поддерживать эти параметры между открытием страницы с формой и отправкой формы, а также ошибками проверки. В противном случае, придерживаясь @RequestScoped
bean, вы должны сохранить их как <f:param>
в компонентах команды:
<h:commandButton ...>
<f:param name="site" value="#{generated.site}" />
<f:param name="serviceId" value="#{generated.serviceId}" />
</h:commandButton>
Нет способа установить их для <f:ajax>
внутренних компонентов ввода, тогда ваш bean должен быть действительно @ViewScoped
.
В качестве альтернативы, если вы уже используете служебную библиотеку JSF OmniFaces, вы также можете просто заменить <h:form>
на <o:form>
следующим образом (см. также пример витрины):
<o:form includeRequestParams="true">
Это в основном все. Это приведет к созданию <form action>
с включенной текущей строкой запроса.
<form action="/app/agreement.xhtml?site=US&serviceId=AABBCC" ...>
Эти параметры запроса затем доступны только на карте параметров запроса формы submit. Вам не нужны дополнительные метаданные /viewparams, и вам также не нужно отправлять перенаправление, и при необходимости bean можно сохранить @RequestScoped
.
public String generateMethod() {
// ...
return "generated";
}
Или, если вы используете библиотеку "довольно URL", такую как PrettyFaces или FacesViews, или, возможно, что-то домашнее и намерено представить точно так же, как и в адресной строке браузера, тогда вы можете использовать useRequestURI
вместо.
<o:form useRequestURI="true">