【问题标题】:JSF Passing dynamic UI data to serverJSF 将动态 UI 数据传递给服务器
【发布时间】:2013-01-17 10:44:40
【问题描述】:

我在下面有这段代码:

<h:inputText id="userName" />
...
<h:commandButton actionListener="..." action="...">
<f:param name="userInput" value="user" />
</h:commandButton>

基本上我想获取inputText的值(由客户端提交)并将其存储到&lt;f:param&gt;标签的属性value中。我想这样做,所以我可以从请求参数中访问用户名。有没有办法做到这一点?我知道我可以使用 bean 来存储输入值,但我只是想知道我是否可以将请求值存储到请求参数对象中。

【问题讨论】:

    标签: java jsf jsf-2 request


    【解决方案1】:

    有一些方法:

    1. 自己从请求参数映射中获取。根据标准 HTML 规范,HTML 输入元素的 name 属性表示 HTTP 请求参数名称。在 JSF 中,HTML 输入元素的名称与组件的客户端 ID 相同。

      所以,给定一个

      <h:form id="form">
          <h:inputText id="userName" ... />
      

      生成一个&lt;input name="form:userName"&gt;,可以通过如下方式获取提交的值

      String userName = context.getExternalContext().getRequestParameterMap().get("form:userName");
      

    2. 通过UIInput#getValue() 自己从组件中获取它。 JSF 已经执行了应用请求值、转换/验证它们和更新模型值的步骤。如果您不将输入组件的 value 属性绑定到 bean 属性,那么它会粘在组件本身中。你只需要访问它。组件通过其客户端 ID 在组件树中可用。

      UIInput userNameComponent = context.getViewRoot().findComponent("form:userName");
      String userName = (String) userNameComponent.getValue();
      

    3. 将输入组件绑定到视图并传递UIInput#getValue() 作为操作方法参数。

      <h:inputText binding="#{userName}" ... />
      <h:commandButton ... action="#{bean.submit(userName.value)}" />
      

      public void submit(String userName) {
          // ...
      }
      

    不用说,仅仅将输入值绑定到 bean 上就更简洁了。

    【讨论】:

      【解决方案2】:

      您不需要f:param。您可以像这样访问提交的文本:

      FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("generatedParameter");
      

      在您的情况下,生成的参数名称并不像 userName 那样简单,因为 JSF 准备了组件命名容器的 id。最简单的方法是检查生成的 HTML 代码并查看输入组件的名称。

      【讨论】:

      • 每个用户都会有所不同吗?前置 ID 可以更改吗?
      • getRequestMap() 不返回请求参数。它返回请求属性。
      猜你喜欢
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      • 2016-08-08
      • 1970-01-01
      • 2018-05-10
      • 1970-01-01
      • 1970-01-01
      • 2016-08-21
      相关资源
      最近更新 更多