我有一个<odc:tabbedPanel/>
组件。在这里,我在<odc:bfPanel/>
组件中有一个页面。我想从我的<odc:bfPanel/>
托管bean类中的<odc:tabbedPanel/>
页面访问一个值(inputtext或radiobutton)。请指导我如何解决这个问题。请注意,我不想在这里使用会话。我只想要它。我尝试过以下选项,但它们对我不起作用。
选项一
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中的值 -
答案 0 :(得分:29)
首先解释为什么您尝试的选项不起作用:
选项1和2无效,因为它将值(!!)返回为String[]
,而不是单个值String
。
如果参数存在,选项3应该有效。但这不是一个很好的JSF方式。
选项4无效,因为请求标头中未设置参数。
选项5无效,因为它根本没有意义。你只是在它们之间添加一个额外的抽象层,实际上这里不会改变任何东西。
JSF-ish方式是使用ExternalContext#getRequestParameterMap()
:
Map<String, String> parameterMap = (Map<String, String>) externalContext.getRequestParameterMap();
String param = parameterMap.get("paramName");
至于为什么选项3不起作用的可能性是因为参数名称不是你想象/期望的。 JSF是基于视图树中的父UINamingContainer
组件预先添加(woodstocks)客户端ID。在Web浏览器中右键单击生成的JSF页面的HTML输出,然后选择查看源。检查生成的<input>
元素的名称。使用 名称作为参数名称。
那就是说,这毕竟是一种解决方法而不是解决方案。但是我们无法合理地建议真正的解决方案,因为功能要求和您拥有的代码并不完全清楚。您通常将输入元素绑定到辅助bean。如果你实际上在一个不同的支持bean中,那么你也可以从支持bean内部访问那个支持bean,然后再访问与它绑定的输入值。有关如何使用,请参阅Injecting Managed Beans in each other。
答案 1 :(得分: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}" />
豆:
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,可以使用属性注入来引用另一个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>
您可以直接通过上下文查找内容,或使用表达式类通过代码解析内容,但这是一种更简洁的方法。
答案 2 :(得分:0)
我完全不明白你的问题。如果inputtext
或radiobutton
正确绑定到辅助bean中的值,则可以直接在Java中访问该值。如果您感兴趣的是托管bean的编程查找,那么我就是这样做的:
FacesContext facesContext = FacesContext.getCurrentInstance();
MyBean currentProperty = (MyBean) facesContext.getELContext().getELResolver().getValue(facesContext.getELContext(), null, "nameOfTheBackingBean");