Получите значения параметров запроса в JSF

У меня есть a <odc:tabbedPanel/> компонент. В этом у меня есть страница в <odc:bfPanel/> компонент. Я хочу получить доступ к значению (inputtext или переключателя) от страницы в <odc:bfPanel/> в моем <odc:tabbedPanel/> класс управляемого компонента. Ведите меня относительно того, как я иду об этом. Обратите внимание здесь, что я не хочу использовать сессию здесь. Я хочу это в запросе только. Я попробовал ниже опций, но они не работали на меня.

опция один

String value = (String) ctx.getExternalContext()
                        .getRequestParameterValuesMap()
                        .get("managedbean.property");

опция два

String value = (String) ctx.getExternalContext()
                         .getRequestParameterValuesMap()
                         .get("property");

опция три

HttpServletRequest req = (HttpServletRequest) FacesContext.getCurrentInstance()
                         .getExternalContext().getRequest();
System.out.println(req.getParameter("property"));

опция четыре

Map requestMap = FacesContext.getCurrentInstance() 
                         .getExternalContext().getRequestHeaderValuesMap(); 
String msgId = (String) requestMap.get("property"); 
System.out.println(msgId);

опция пять

HttpServletRequestWrapper r = new HttpServletRequestWrapper(req);
String value1 = r.getParameter("managedbean.property");

я хочу значение не в управляемом компоненте jsp..., но я хочу это в некотором другом управляемом компоненте. здесь у меня есть страницы в странице (поскольку я упомянул, что это - панель с вкладками). теперь я хочу значение в управляемом компоненте внешней вкладки –

20
задан Tim Post 1 September 2011 в 05:27
поделиться

3 ответа

Позвольте сначала объяснить, почему варианты, которые вы пробовали, не сработали:

Варианты 1 и 2 недействительны, потому что они возвращают значения (!!) в виде String [] , а не одно значение как String .

Вариант 3 должен работать, если параметр был там. Но это не лучший способ JSF.

Вариант 4 недопустим, поскольку параметры не заданы в заголовке запроса.

Вариант 5 недействителен, потому что он просто не имеет смысла. Вы просто добавляете дополнительный абстрактный слой между ними, который на самом деле здесь ничего не меняет.


В стиле JSF можно использовать ExternalContext # getRequestParameterMap () :

Map<String, String> parameterMap = (Map<String, String>) externalContext.getRequestParameterMap();
String param = parameterMap.get("paramName");

Что касается того, почему вариант 3 не работает, вероятно, потому что имя параметра не то, что вы думаете / ожидаете . JSF, в частности, добавляет в начало (woodstocks) идентификаторы клиента на основе родительских компонентов UINamingContainer в дереве просмотра. Щелкните правой кнопкой мыши сгенерированный HTML-вывод страницы JSF в своем веб-браузере и выберите Просмотреть исходный код . Изучите имя сгенерированного интересующего элемента . Используйте вместо имени параметра то имя .


Тем не менее, это обходной путь, а не решение. Но мы не можем разумно предложить реальное решение, поскольку функциональные требования и имеющийся у вас код не совсем ясны. Обычно вы привязываете элементы ввода к компоненту поддержки. Если вы на самом деле находитесь внутри другого вспомогательного bean-компонента, то вы также можете просто получить доступ к этому поддерживающему bean-компоненту изнутри вспомогательного bean-компонента, а затем, в свою очередь, получить доступ к входному значению, связанному с ним. См. Внедрение управляемых компонентов друг в друга , чтобы узнать, как это сделать.

29
ответ дан 30 November 2019 в 00:31
поделиться

Я не совсем понимаю ваш вопрос. Если inputtext или radiobutton правильно привязан к значению в поддерживающем bean-компоненте, то вы можете получить доступ к значению непосредственно в Java. Если вас интересует программный поиск управляемого bean-компонента, я делаю это следующим образом:

FacesContext facesContext = FacesContext.getCurrentInstance();
MyBean currentProperty = (MyBean) facesContext.getELContext().getELResolver().getValue(facesContext.getELContext(), null, "nameOfTheBackingBean");
0
ответ дан 30 November 2019 в 00:31
поделиться

Тот факт, что ваши элементы управления находятся внутри панелей IBM ODC, не имеет значения.

Обычно вы привязываете элемент управления вводом к значению управляемого боба.

Определение боба:

<managed-bean>
  <managed-bean-name>demo</managed-bean-name>
  <managed-bean-class>foo.MyManagedBean</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

Теги вида:

<!-- needs to be inside a form control -->
<h:inputText value="#{demo.foo}" />
<h:commandButton value="Click Me" action="#{demo.invokeMe}" />

Бин:

package foo;
public class MyManagedBean {
  private String foo;
  public String getFoo() { return foo; }
  public void setFoo(String foo) { this.foo = foo; }

  public String invokeMe() {
    System.out.println(foo);
    return null; //no navigation
  }
}

Если вы хотите связать элемент управления вводом с другим бином, отличным от того, который содержит логику приложения, вы можете использовать инъекцию свойств для ссылки на другой бин.

<managed-bean>
  <managed-bean-name>demo</managed-bean-name>
  <managed-bean-class>foo.MyManagedBean</managed-bean-class>
  <managed-bean-scope>request</managed-bean-scope>
  <managed-property>
    <property-name>propName</property-name>
    <value>#{someExpression}</value>
  </managed-property>
</managed-bean>

Вы можете искать что-то непосредственно через контекст или использовать классы выражений для решения вопросов через код, но этот подход чище.

2
ответ дан 30 November 2019 в 00:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: