在JSF中获取请求参数值

22
我有一个<odc:tabbedPanel/>组件,其中包含一个在<odc:bfPanel/>组件中的页面。我想从<odc:tabbedPanel/>的托管bean类中访问<odc:bfPanel/>页面中的输入文本或单选按钮的值。请指导我如何操作。请注意,我不想在此处使用会话。我只想在请求中获取它。我尝试了以下选项,但它们对我没有起作用。
选项一
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个回答

32

首先解释一下为什么你尝试的选项都不起作用:

选项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中,根据视图树中的父 UINamingContainer 组件,其为每个客户端ID加上前缀(例如:woodstocks)。在Web浏览器中右键单击JSF页面的生成HTML输出,选择查看源代码。检查感兴趣的生成<input>元素的名称。使用该名称而不是参数名称。尽管如此,这只是一种解决方法,而不是真正的解决方案。由于功能需求和您拥有的代码不够清晰,我们无法合理地建议真正的解决方案。通常,您将输入元素绑定到后备bean。如果您实际上在不同的后备bean中,则还可以从后备bean中访问后备bean,然后再访问与其绑定的输入值。有关详细信息,请参见相互注入托管bean

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>

您可以直接通过上下文查找信息,或使用表达式类通过代码解析信息,但这种方法更加简洁。

我想要的值不在JSP的托管bean中...而是在另一个托管bean中。这里我有页面在一个页面内(就像我之前提到的选项卡面板)。现在我想要在外部选项卡的托管bean中获取该值。 - user265950
@tejas-a - 使用 managed-property 将一个 bean 的属性注入另一个 bean 中 - 请参见最后一节。 - McDowell

0

我不太明白你的问题。如果inputtextradiobutton正确地绑定到后端bean中的一个值,那么你可以直接在Java中访问该值。如果你感兴趣的是编程方式查找托管bean,那么这就是我做的方式:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接