JSF 2: как обновить значение в компоненте поддержки из SelectOneMenu?

Я использую Pretty Faces и JSF 2.

У меня есть selectOneMenu для выбора значения. Затем я хочу передать выбранное значение во вторую форму с помощью командной кнопки, чтобы перейти на другую страницу. Я не хочу видеть параметр в URL.

Мне не нужен такой URL-адрес: addpartipant.xhtml или addparticipant.xhtml?study_name=TEST или /Addparticpant/New/TEST.

Я хочу, чтобы такой URL-адрес был только /Addparticipant/New, но если я сделаю это, я не смогу получить правильное значение параметра, я только получаю значение, установленное по умолчанию в bean-компоненте для параметра, а не обновленная страница ценность.

Еще больше беспокоит то, что у меня есть кнопка, которая появляется, когда я изменяю значение по умолчанию на странице. И она работает, но похоже, что значение параметра bean-компонента не влияет и остается по умолчанию.

Как я должен к этому? Спасибо за помощь. Я пробовал, чтобы слушатель в ajax-вызове установил параметр значения в bean-компоненте, но на самом деле он не работает?

/* Форма, которая генерирует событие ajax, когда вы изменяете значение selectOneMenu, чтобы добавить значение в качестве параметра во вторую форму */

<h:form id="studySelection_form">
  <h:outputText value="Sélection de l'étude :"/>
  <h:selectOneMenu  id="study" 
                    value="#{home.study_name}" 
                    required="true"
                    requiredMesage="Selectionnez au moins une étude.">
    <f:selectItems value="#{home.studyNameItems}" 
                   var="c" 
                   itemLabel="#{c.studyNameLabel}" 
                   itemValue="#{c.studyNameValue}" />

    <f:ajax execute="study" 
            render=":add_form" 
            event="change" 
            listener="#{home.updateStudyname}"/>
   </h:selectOneMenu>
 </h:form>

/* Вторая форма, в которой параметр для передачи вводится из вызова ajax из события перемещения из формы ниже */

 <h:commandButton value="Ajout" 
                  type="button" 
                  action="pretty:participant" 
                  rendered="#{home.study_name ne '-----'}" >
   <f:param name="theNameofTheStudy" 
            value="#{home.study_name}"  />
 </h:commandButton>

Файл конфигурации PrettyFaces:

<url-mapping id="participant">
  <pattern value="/Participant/New/" />
  <view-id value="/addParticipant.xhtml" />
</url-mapping>

Результат страницы addParticipant.xhtml:

<h:outputFormat value="Print : {0}, {1} ">
  <f:param value="#{home.study_name}" />
  <f:param value=" #{theNameofTheStudy}" />
</h:outputFormat>

person ZheFrench    schedule 21.10.2013    source источник
comment
По сути, у вас есть два варианта. Один из них — не выполнять redirect, чтобы URL-адрес в браузере не изменился. Второй — использовать флеш-область или что-то подобное, чтобы каким-то образом сохранить значение параметра при переходе от одного представления к другому.   -  person Xtreme Biker    schedule 22.10.2013
comment
Pretty Faces всегда использовали перенаправление? Нет ? На самом деле, я должен отказаться от Pretty Faces и использовать что-то вроде этого с action=addParticipant.   -  person ZheFrench    schedule 22.10.2013
comment
И я не понимаю, как получить параметр, должен ли я использовать #{home.study_name} или #{theNameofTheStudy} на целевой странице. («дом» — это bean-компонент со страницы отправителя)   -  person ZheFrench    schedule 22.10.2013


Ответы (2)


Prettyfaces всегда использует POST- REDIRECT-GET для выполнения навигации. Таким образом, ваш шанс состоит в том, чтобы вызвать метод управляемого компонента в вашем методе действия h:commandButton вместо того, чтобы возвращать сам результат навигации, и поместить свой параметр в область flash< /а>:

<h:commandButton value="Ajout" 
    action="#{home.actionGoToAddStudent}" 
    rendered="#{home.study_name ne '-----'}" />

И в вашем управляемом компоненте:

public String actionGoToAddStudent(){
    FacesContext.getCurrentInstance().getExternalContext().getFlash().put("param1", study_name);
    return "pretty:participant"; //or just "/addParticipant.xhtml" and Prettyfaces will translate to pretty url
}

После этого вы можете получить param1 из целевого управляемого компонента. Это для использования скрытых параметров.

Всякий раз, когда вы хотите использовать стандартные видимые параметры GET, вы найдете этот пост полезным. Использование параметров GET включает отправку их с запросом GET, поэтому ваша целевая страница должна перехватывать их с помощью <f:viewParam> и может хранить их в свойстве управляемого компонента назначения. Здесь вы можете обратиться к моему предыдущему ответу на вопрос:

Исходная страница:

<!--Performs a GET request with study param-->
<h:button value="Basic GET request" outcome="pretty:participant">
    <f:param name="study" value="#{home.study}" />
</h:button>

Целевая страница:

<f:metadata>
    <!--Takes the study param and sets it into the destination bean's property-->
    <f:viewParam name="study" value="#{destinationBean.study}" />
</f:metadata>

<h:outputFormat value="Print : {0} ">
   <f:param value="#{destinationBean.study}" />      
</h:outputFormat>
person Xtreme Biker    schedule 23.10.2013
comment
Я предлагаю другое решение без PrettyFaces и задаю другим вопросы выше по теме. Спасибо. - person ZheFrench; 23.10.2013
comment
getFlash() выдает ошибку - java.lang.NoSuchMethodError: javax.servlet.http.Cookie.isHttpOnly()... Я перехожу со страницы входа (Spring Security) в свой home.xhtml (область сеанса, возможно, я изменю чтобы просмотреть область, я на самом деле читаю материалы о области и о том, как их использовать), а затем я хочу перейти к addParticipant.xhtml, чтобы добавить что-то в свою базу данных (область запроса). Это глобальная идея. - person ZheFrench; 23.10.2013
comment
Это зависит от вашей версии API сервлета, какой сервер вы используете? - person Xtreme Biker; 23.10.2013
comment
Это нормально с этой версией? Мохара 2.2.0. Я еще не устранил ошибку, чтобы использовать флеш-прицел. - person ZheFrench; 24.10.2013
comment
Прицел Flash все еще немного глючит в Mojarra, похоже. Я рекомендую вам обновиться до последней версии, но даже там еще не решено для некоторых браузеров. Чтобы использовать его с Tomcat 6, я рекомендую вам использовать ветку Mojarra 2.1.x, попробуйте 2.1.26. Ветвь 2.2.x больше привязана к спецификации Servlet 3.0 (Tomcat 7). - person Xtreme Biker; 24.10.2013
comment
Я еще не установил рабочий сервер. Я попытаюсь установить Tomcat 7 с TomEE, поэтому я могу оставить Mojarra 2.2.x. Надеюсь, это не сильно повлияет на мою конфигурацию. - person ZheFrench; 24.10.2013
comment
Это работает! используя Tomcat 7. Спасибо за помощь. Так что я понимаю вспышку в порядке, но я все еще не в духе классического способа. Я имею в виду, что если я решу использовать /Participant/New/#{home.study_name} (обратите внимание, что использование #{param.study_name} вызывает ошибку...) в prettyConfig.xml, вы скажете мне, что я получу параметр с помощью f:viewparam и установите компонент поддержки приемника, используя value=#{participant.study_name}, но когда я попытался напечатать #{param.studynameItem} и #{participant.study_name}, оба имеют значение null... я мог получить #{home.study_name} из отправитель поддерживающего компонента, но это не имеет смысла... - person ZheFrench; 24.10.2013
comment
Хммм ОК, Я ПОНИМАЮ СЕЙЧАС. Я сделал работу «классическим способом» с передачей параметра в URL как это /Participant/New/#{studynameItem:home.study_name} . Таким образом, он работает нормально ... и если вы удалите ‹f:metada› ‹f:viewparam› , #{patient.study_name} станет нулевым, потому что создание/связывание больше не выполняется внутри параметра просмотра с резервным значением. Окккккк, трудный день :) - person ZheFrench; 24.10.2013
comment
Использование /Participant/New/#{participant.study_name} (обратите внимание, здесь я использую целевой компонент) и просто /Participant/New/ в сочетании с f:viewParam на целевой странице избыточно. Это означает, что они делают одно и то же. Посмотрите на мою старую тему, обсуждая ее с руководителем группы PrettyFaces. Однако я настоятельно рекомендую вам использовать второй подход, то есть не включать выражение EL непосредственно в сопоставление URL-адресов. В любом случае, рад видеть, что это помогло решить эту проблему! - person Xtreme Biker; 24.10.2013

Как вы сказали ранее, другим решением может быть простое использование вперед с навигацией JSF. Параметры остаются скрытыми, привязанными к первой странице URL-адреса навигации (например, мы могли бы сказать /Home). Но хорошо, у вас не будет стиля /Addparticpant/New/TEST.

В чем преимущество POST-REDIRECT-GET, предлагаемого PrettyFaces? И f:param на самом деле бессмысленно, когда вы используете PrettyFaces из-за POST... если вы не используете GET (что означает, что вы не используете PrettyFaces) и не помещаете параметры в URL. Я прочитаю вашу ссылку, потому что на самом деле у меня возникают некоторые проблемы с получением моих параметров в соответствии с областями действия, действием Post/Get и местом (на странице JSF/компоненте поддержки).

Альтернативное решение:

    <navigation-rule>
       <from-view-id>/home.xhtml</from-view-id> 
       <navigation-case>
          <from-outcome>participant</from-outcome>
          <to-view-id>/addParticipant.xhtml</to-view-id>
       </navigation-case>
    </navigation-rule>


    /*I use viewparam but if I don't use it it's working too, I clearly don't understand what viewparam is used for  */

    <f:metadata>
          <f:viewParam name="study_name" value="#{home.study_name}" required="true"/>
     </f:metadata>

   /* What is the best way to retrieve information? Then how i load param in a backing bean who this destination page ? */ 
   <h:outputFormat value="Hello,{0},{1},">
                <f:param value="#{home.study_name}" />
                <f:param value="#{param.studynameItem}" />
    </h:outputFormat>
person ZheFrench    schedule 23.10.2013
comment
Вы на самом деле смешиваете концепции param. Предположим, что у вас есть управляемый bean-компонент, привязанный к вашей домашней странице, а другой — к вашей странице добавления студента, /addParticipant.xhtml не нужно обращаться к home bean-компоненту, никогда. Вот для чего используются параметры представления. Также имейте в виду, что PrettyFaces используется на практике для выполнения запросов GET, то есть для получения страницы контента. Я обновлю свой ответ, чтобы дать вам несколько советов. Кроме того, POST-REDIRECT-GET имеет свои преимущества, так как это чистый и понятный шаблон, и свои недостатки, так как браузеру требуется больше времени для обновления содержимого, поскольку необходимо выполнить два цикла запроса. - person Xtreme Biker; 23.10.2013
comment
Однако я еще не уверен в том, чего вы хотите достичь. Ваше альтернативное решение все еще идет с PrettyFaces... - person Xtreme Biker; 23.10.2013
comment
Я полностью согласен с тем, что addParticipant не должен получать доступ к домашнему компоненту. Это было просто решение, которое я нашел и работало... но явно не лучший способ... Я хочу иметь чистый URL-адрес, чтобы скрыть свои параметры , получить их в Addparticipant.xhtml и внедрить в вспомогательный компонент AddBeanParticpant относительно Addparticipant.xhtml. Я ищу чистый пример, где ваши параметры извлечения. Вы могли бы показать мне один, где параметры отображаются, и один, где они скрыты. Для скрытого случая есть ли особая область для использования? Я прочитаю об этом. Спасибо. - person ZheFrench; 23.10.2013
comment
Просто используйте вспышку (первый пример, который я показал вам в своем ответе). Домашний компонент помещает параметр, который вы хотите передать, в метод действия. После этого, когда перенаправление выполнено, вы можете использовать событие prerenderView, которое инициализирует целевой компонент, и в этом компоненте вы может получить доступ к флэш-карте, где должен храниться ваш параметр. - person Xtreme Biker; 23.10.2013