У меня есть 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..., но я хочу это в некотором другом управляемом компоненте. здесь у меня есть страницы в странице (поскольку я упомянул, что это - панель с вкладками). теперь я хочу значение в управляемом компоненте внешней вкладки –
Позвольте сначала объяснить, почему варианты, которые вы пробовали, не сработали:
Варианты 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-компонента, а затем, в свою очередь, получить доступ к входному значению, связанному с ним. См. Внедрение управляемых компонентов друг в друга , чтобы узнать, как это сделать.
Я не совсем понимаю ваш вопрос. Если inputtext
или radiobutton
правильно привязан к значению в поддерживающем bean-компоненте, то вы можете получить доступ к значению непосредственно в Java. Если вас интересует программный поиск управляемого bean-компонента, я делаю это следующим образом:
FacesContext facesContext = FacesContext.getCurrentInstance();
MyBean currentProperty = (MyBean) facesContext.getELContext().getELResolver().getValue(facesContext.getELContext(), null, "nameOfTheBackingBean");
Тот факт, что ваши элементы управления находятся внутри панелей 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>
Вы можете искать что-то непосредственно через контекст или использовать классы выражений для решения вопросов через код, но этот подход чище.