Я тестировал пару новых функций JSF, и я наткнулся на Post Redirect Get. Я хотел перенаправить с первой страницы, скажем first.xhtml, на second.xhtml.
У меня есть число как свойство в управляемых компонентах, и я хотел передать его ко второму компоненту из первого компонента, используя параметр запроса.
Это моя первая страница
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<head>
<title>Landing Page</title>
</head>
<body>
<h3>Enter Number</h3>
<h:form>
<h:inputText id="input" name="number" value="#{postRedirectGet.number}" />
<h:commandButton value="redirect to result"
action="resultPage?faces-redirect=true&includeViewParams=true">
</h:commandButton>
</h:form>
</body>
</html>
И на второй странице у меня есть
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<f:metadata>
<f:viewParam name="number" value="#{postRedirectResult.number}"/>
</f:metadata>
<head>
<title>Result Page</title>
</head>
<body>
<h:form>
<h:outputText value="Number #{postRedirectGet.number}" />
<h:outputText value="Number #{postRedirectResult.number}" />
<h:commandButton value="Redirect to index" action="/index?faces-redirect=true" />
</h:form>
</body>
</html>
Теперь страница выполняет POST с помощью commandButton, а затем сначала перенаправляется на вторую страницу, но в URL-адресе она пропускает номер = 0. Он работает, если я меняюсь
<f:viewParam name="number" value="#{postRedirectResult.number}"/>
в
<f:viewParam name="number" value="#{postRedirectGet.number}"/>
но я думал, что viewParam используется для установки значения в bean-компонент и не используется для передачи значений в URL-адресе. Может кто-нибудь объяснить, как мы можем сделать POST и установить свойство управляемого компонента на следующей странице.
Проблема в том, что f:viewParam
используется двумя разными способами в двух сценариях. В h: link он используется для установки свойства целевого компонента, в h:commandButton
он используется для вычисления URL-адреса GET, а затем целевое свойство bean может быть установлено с помощью @ManagedProperty
. Является ли мое понимание правильным или может использовать f:viewParam
для установки свойства в h:commandButton
POST redirect get также.
То, что вам кажется недостающим, это то, что делает includeViewParams
. Позвольте мне процитировать эту очень информативную статью (вы должны ее прочитать):
Другой специальный параметр строки запроса includeViewParams указывает обработчику навигации включать параметры представления при выполнении навигации. Но какие параметры просмотра должны быть включены? Параметры просмотра, которые должны быть включены при выполнении навигации, объявляются на странице просмотра.
Поэтому JSF просматривает ваш resultpage.xhtml
чтобы определить, какие параметры должны пройти. И затем покорно переходит к текущему значению номера postRedirectResult#number
(который в это время не установлен /0
).
Чтобы параметр GET- number
отражался в вашем компоненте, передайте его как реальный параметр:
<h:commandButton value="redirect to result"
action="resultPage?faces-redirect=true&number=4" />
Смотрите также:
<f:param name="number" value="4" />
не будет передавать значение в resultPage как GET, так как оно будет POST на текущей странице, а затем будет перенаправлено на resultPage.
f:param
не выдерживает перенаправления. Виноват. Я протестировал небольшой пример и отредактировал свой ответ, включив способ, который будет работать в рамках PRG. Обратите внимание, что при этом будет сгенерирован статический параметр: вы не можете передать значение, введенное пользователем на той же странице. Возьмите значение и сохраните его в виде bean-компонента (чтобы его можно было f:viewParam
с помощью f:viewParam
на целевой странице).
Существуют различные 4 способа передачи данных с страницы JSF на резервный компонент. Мы можем использовать
f:param
f:setPropertyActionListener
f:attribute
Здесь вы можете попробовать f:setPropertyActionListener
как..
<h:commandButton value="redirect to result"
action="resultPage?faces-redirect=true">
<f:setPropertyActionListener target="#{postRedirectResult.number}" value=4 />
</h:commandButton>
Вот ссылка на это.
h:body
иh:head
вместо HTML-эквивалентов (это делает JSF счастливым и может включать в себя много JS-кода).