在 JSF 中获取请求参数值

2022-09-02 01:16:06

我有一个组件。在此内部,我在组件中有一个页面。我想从我的托管 Bean 类中的页面访问一个值(输入文本或单选按钮)。请指导我如何做到这一点。请注意,我不想在这里使用会话。我只想在请求中使用它。我已经尝试了以下选项,但它们不适合我。<odc:tabbedPanel/><odc:bfPanel/><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的托管bean中...但我希望它在另一个管理的豆子。在这里,我在页面中有页面(正如我所提到的,它是一个选项卡式面板)。现在我想要外部选项卡的受管bean中的值 -


答案 1

让我们首先解释为什么您尝试的选项不起作用:

选项 1 和 2 无效,因为它将 values(!!) 作为 返回,而不是将单个值作为 返回。String[]String

如果参数存在,则选项 3 应该有效。但这不是一个好的JSF式方式。

选项 4 无效,因为未在请求标头中设置参数。

选项5是无效的,因为它根本没有意义。你只是在两者之间添加了一个额外的抽象层,实际上它不会改变这里的任何东西。


JSF式的方式是使用ExputalContext#getRequestParameterMap()

Map<String, String> parameterMap = (Map<String, String>) externalContext.getRequestParameterMap();
String param = parameterMap.get("paramName");

至于为什么选项3不起作用可能是因为参数名称不是您认为/期望的那样。JSF 即基于视图树中的父组件的预置(木料)客户端 ID。右键单击 Web 浏览器中 JSF 页面生成的 HTML 输出,然后选择“查看源代码”。检查生成的相关元素的名称。请改用名称作为参数名称。UINamingContainer<input>


也就是说,这毕竟是一种解决方法,而不是解决方案。但是我们不能合理地建议真正的解决方案,因为功能要求和您拥有的代码并不完全清楚。通常将输入元素绑定到后备 Bean。如果您实际上位于不同的后备 Bean 中,那么您也可以从后备 Bean 内部访问该后备 Bean,然后依次访问与其绑定的输入值。请参阅相互注入受管 Bean 以了解操作方法。


答案 2

控件位于 IBM ODC 面板中这一事实无关紧要。

通常,将输入控件绑定到受管 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>

你可以通过上下文直接查找内容,或者使用表达式类通过代码解析内容,但这是一种更简洁的方法。


推荐