在JSF中获取请求参数值

时间:2010-07-28 09:02:53

标签: java jsf

我有一个<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中的值 -

3 个答案:

答案 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)

我完全不明白你的问题。如果inputtextradiobutton正确绑定到辅助bean中的值,则可以直接在Java中访问该值。如果您感兴趣的是托管bean的编程查找,那么我就是这样做的:

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