2015-03-30 2 views
2

Я использую JSF 2.2 на Glassfish 4.1.Передача переменной области действия, переданной как параметр метода действия EL, не работает

Я пытаюсь передать в качестве параметра запроса в качестве аргумента метода действия следующим образом: (. Знайте, что param является implicit EL object)

// Example 1. This does not work. 

// at url http://localhost:8080/app/[email protected] 

<p:commandButton value="Place order" action="#{orderManager.placeOrder(param['email'])}" /> 

В журнале сервера я настроил его чтобы напечатать параметр метода, но я вижу, что пустая строка была передана, а не «[email protected]», как я и ожидал.

Я подтвердил, что моя общая конфигурация работает. Если я заменю выше фрагмент кода со следующим, а затем «[email protected]» выводится в журнал сервера:

// Example 2. This works. 

<p:commandButton value="Place order" action="#{orderManager.placeOrder('[email protected]')}" /> 

Я также подтвердил, что мое использование EL неявных объектов осуществима. Следующий фрагмент кода работает, если я получить параметр из FacesContext (после удаления параметра электронной почты от подписи placeOrder «s, конечно):

// Example 3. This works. 

<p:commandButton value="Place order" action="#{orderManager.placeOrder()}" > 
    <f:param name="email" value="#{param['email']}"/> 
</p:commandButton> 

А вот окончательная тайну, тот, который действительно путает меня, если я используйте следующий фрагмент, я могу получить параметр «email» как из параметра метода , так и FacesContext, но помните, что параметр метода не был извлечен в примере 1!

// Example 4. This works, and BOTH parameters are retrievable! 

<p:commandButton value="Place order" action="#{orderManager.placeOrder(param['email'])}" > 
    <f:param name="email" value="#{param['email']}"/> 
</p:commandButton> 

Могу ли я передать в неявном объекте JSF EL в качестве параметра метода действия?

И есть ли у вас объяснение, почему он работает в примере 4, но не в примере 1?

ответ

3

Атрибут action оценивается во время фазы запроса запроса запроса, инициируемого отправкой формы, что является, таким образом, другим HTTP-запросом, чем тот, который вывел вывод HTML с помощью thering формы (и имеет параметр email в запросе).

Тег <f:param> оценивается во время фазы ответа рендеринга HTTP-запроса, который должен выводить результат HTML в форме. Таким образом, это заканчивается «жестко закодированным» в сгенерированном выходном HTML (в отличие от аргументов метода EL в атрибуте action!). Когда пользователь отправляет форму, это просто возвращается на сервер как простой параметр запроса ванили String (который вам нужно будет преобразовать обратно, если он был изначально сложным типом).

Это не имеет никакого отношения к тому, является ли значение неявным EL-объектом или нет.

Тем не менее, есть 2 другие способы:

  1. Pass его как скрытый вход (нет, не с <h:inputHidden>).

    <h:form> 
        <input type="hidden" name="email" value="#{param.email}" /> 
        ... 
    </h:form> 
    
  2. Установить его как свойство зрения области видимости боба, он будет оставаться в бобе до тех пор, как вид жизнь.

    <f:metadata> 
        <f:viewParam name="email" value="#{viewScopedBean.email}" /> 
    </f:metadata> 
    
+0

Спасибо, BalusC. Ваш ответ имеет смысл, но можете ли вы рассказать мне, как _I_ мог выяснить, в какой фазе происходят эти события? Многие из учебников JSF, которые я прочитал, объясняют _usage_, не объясняя, что происходит _happening_ под абстракцией, что полезно для отладки и понимания. Как вы узнали об этом? – DavidS

+1

Зная HTTP и HTML (и EL) заранее. Выход HTML не содержит подсказки о аргументе метода действия, поэтому он определенно не «передается обратно» через HTML. – BalusC