Как работает POST REDIRECT GET в JSF по commandButton

1

Я тестировал пару новых функций 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&amp;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 также.

  • 1
    Не имеет значения, но вы, вероятно, захотите h:body и h:head вместо HTML-эквивалентов (это делает JSF счастливым и может включать в себя много JS-кода).
Теги:
jsf
jsf-2

2 ответа

1
Лучший ответ

То, что вам кажется недостающим, это то, что делает includeViewParams. Позвольте мне процитировать эту очень информативную статью (вы должны ее прочитать):

Другой специальный параметр строки запроса includeViewParams указывает обработчику навигации включать параметры представления при выполнении навигации. Но какие параметры просмотра должны быть включены? Параметры просмотра, которые должны быть включены при выполнении навигации, объявляются на странице просмотра.

Поэтому JSF просматривает ваш resultpage.xhtml чтобы определить, какие параметры должны пройти. И затем покорно переходит к текущему значению номера postRedirectResult#number (который в это время не установлен /0).

Чтобы параметр GET- number отражался в вашем компоненте, передайте его как реальный параметр:

<h:commandButton value="redirect to result" 
        action="resultPage?faces-redirect=true&amp;number=4" />

Смотрите также:

  • 0
    <f:param name="number" value="4" /> не будет передавать значение в resultPage как GET, так как оно будет POST на текущей странице, а затем будет перенаправлено на resultPage.
  • 0
    Вы правы, использование f:param не выдерживает перенаправления. Виноват. Я протестировал небольшой пример и отредактировал свой ответ, включив способ, который будет работать в рамках PRG. Обратите внимание, что при этом будет сгенерирован статический параметр: вы не можете передать значение, введенное пользователем на той же странице. Возьмите значение и сохраните его в виде bean-компонента (чтобы его можно было f:viewParam с помощью f:viewParam на целевой странице).
1

Существуют различные 4 способа передачи данных с страницы JSF на резервный компонент. Мы можем использовать

  1. f:param
  2. f:setPropertyActionListener
  3. f:attribute
  4. Выражение метода (JSF 2.0).

Здесь вы можете попробовать f:setPropertyActionListener как..

<h:commandButton value="redirect to result" 
        action="resultPage?faces-redirect=true">
    <f:setPropertyActionListener target="#{postRedirectResult.number}" value=4 />
</h:commandButton>

Вот ссылка на это.

  • 0
    Ваш ответ исправит проблему, так как вы устанавливаете свойство в bean-компоненте postRedirectResult, но он также загрузит оба моих bean-компонента на странице 1. Могу ли я каким-то образом сделать редирект с помощью GET и установить свойство на второй странице.
  • 0
    так что вы можете сделать, это ... 1) перенести ваш параметр с URL на следующую страницу 2) чем на странице загрузки после <body> вы можете вызвать метод public void init () {// сделать что-то} и написать код для взятия URL-адреса и получения параметра HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance (). getExternalContext (). getRequest (); String clipId = request.getParameter ("id"); и вы можете установить это в вашей локальной переменной и использовать эту переменную на следующей странице / ...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню