Подтвердить что ты не робот

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

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

вариант 1

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 bean... но я хочу его в каком-то другом управляемом bean. здесь у меня есть страницы внутри страницы (как я упомянул ее панель с вкладками). теперь я хочу значение в управляемой bean внешней вкладке -

4b9b3361

Ответ 1

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

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

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

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

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


Метод JSF-ish будет использовать ExternalContext#getRequestParameterMap():

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

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


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

Ответ 2

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

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

Bean определение:

<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}" />

Bean:

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
  }
}

Если вы хотите связать свой входной контроль с другим bean с логикой приложения, вы можете использовать вложение свойств для ссылки на другой bean.

<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>

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

Ответ 3

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

FacesContext facesContext = FacesContext.getCurrentInstance();
MyBean currentProperty = (MyBean) facesContext.getELContext().getELResolver().getValue(facesContext.getELContext(), null, "nameOfTheBackingBean");