【问题标题】:Get request parameter values in JSF在 JSF 中获取请求参数值
【发布时间】:2011-03-22 01:11:23
【问题描述】:

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

【问题讨论】:

    标签: java jsf


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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。

      <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 中的值
      • @tejas-a - 使用 managed-property 将属性从一个 bean 注入到另一个 bean - 请参阅最后一节。
      【解决方案3】:

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

      选项 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 组件预先添加(woodstocks)客户端 ID。在您的网络浏览器中右键单击生成的 JSF 页面的 HTML 输出并选择查看源代码。检查生成的&lt;input&gt; 感兴趣元素的名称。使用 that 名称代替参数名称。


      也就是说,这毕竟是一种解决方法而不是解决方案。但是我们不能合理地建议 real 解决方案,因为您的功能要求和代码并不完全清楚。您通常将输入元素绑定到支持 bean。如果您实际上在不同的支持 bean 中,那么您也可以从支持 bean 内部访问 那个 支持 bean,然后依次访问与其绑定的输入值。请参阅Injecting Managed Beans in each other 了解操作方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-02-28
        • 2012-09-16
        • 2011-09-19
        • 1970-01-01
        • 2023-04-05
        • 2012-03-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多