Получить значения параметров запроса в 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 внешней вкладке -
Ответы
Ответ 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");