【问题标题】:f:param not passed in ajax requestf:param 未在 ajax 请求中传递
【发布时间】:2011-11-26 10:07:03
【问题描述】:

以下代码有问题:

<h:inputHidden value="autoCompleteHidden" id="administradorAutocompleteType">
                            <f:param value="#{suggestionEntitiesDM.usuario}" name="type"></f:param>
                        </h:inputHidden>
                        <p:autoComplete id="administradorAutocomplete"
                                        value="#{empresaDM.administradorSeleccionada}"
                                        completeMethod="#{suggestionEntitiesDM.suggestionList}"
                                        var="administrador" itemLabel="#{administrador.txtNombreUsuario}"
                                        forceSelection="true" 
                                        itemValue="#{administrador}" converter="entityConverter">
                            <p:ajax event="start" update="administradorAutocomplete" process="administradorAutocompleteType"/>


                        </p:autoComplete>

我想要的是在请求中发送类型参数,以便我可以通过使用获取值:

String type=FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("type");

但是,当我引用 String 类型时,我只是得到 null,我什至使用 Firebug 检查了请求参数,并且有效地传递了 administradorAutocompleteType=autoCompleteHidden,但从未发布 type=value。 我做错了什么?,如何在使用 f:ajax JSF 2 标签时传递额外的请求参数?非常感谢。

【问题讨论】:

  • 对不起我的回答,你错了。我应该自己先用 p:autoComplete 测试它。回到问题,您的目标是 Servlet 3.0 环境吗? IE。您的目标环境支持使用参数调用方法的新 EL 2.2 特性吗?
  • 我正在使用 Jboss AS 7,认为它是 Servlet 3.0,因为 web.xml 不是必需的,但是我认为我的 pom 中没有包含对 EL 2.2 的支持,我应该使用glassfish 2.2 依赖项,或者在这种情况下可能有一个等效的 Jboss EL。非常感谢。
  • 不,你不需要。所有 JSP/Servlet 容器都已经捆绑了 EL。 Servlet 3.0 (Java EE 6) 已经捆绑了 EL 2.2。如有必要,只需将 EL 2.2 标记为“已提供”。但是好的,目标环境的能力现在更清楚了。如果我有时间,我会为你试验。
  • 等等,为什么你需要将 bean 属性传递回 same bean #{suggestionEntitiesDM} 中的方法?你为什么不把它作为方法中的局部变量来访问呢?例如。 this.usuario;suggestionList() 方法内?您没有将代码示例过度简化吗?
  • 因为我想创建一个可重用的方法来返回一个建议实体列表(使用 p:autocomplete 的 Pojo 功能),但是为了实现这一点,我需要知道我的 Entity 类应该查询,这就是为什么我发送该值以避免硬编码参数,如 name="type" value="MyClassName" (认为和 Enum 会是一个更好的选择......但不知道如何将它们与 EL 一起使用) 通过可能实现自动完成组件的页面无处不在。

标签: ajax jsf-2 primefaces el


【解决方案1】:

this PF forum topic 中所述,&lt;p:ajax&gt;&lt;p:autoComplete&gt;支持。此外,completeMethod 中无法传递其他参数。

我认为&lt;p:remoteCommand&gt; 最适合您的目的。它生成一个 JS 函数,允许您设置 bean 属性。这个JS函数又被&lt;p:autoComplete&gt;onstart属性调用。

<h:form>
    <p:autoComplete 
        value="#{bean.text}" 
        onstart="setType()"
        completeMethod="#{bean.complete}"
        >
    </p:autoComplete>
    <p:remoteCommand name="setType">
        <f:setPropertyActionListener target="#{bean.type}" value="foo" />
    </p:remoteCommand>
</h:form>

private String text;
private String type;

public List<String> complete(String query) {
    System.out.println("type: " + type); // type: foo
    // ...
}

您可以将foo 设置为您想要的任何值。它将在 complete() 方法的范围内以 type 的形式提供。

【讨论】:

    【解决方案2】:

    找到了问题的解决方案,诀窍是按照此链接中的建议使用 f:attribute:

    f:param or f:attribute support on primefaces autocomplete?

    因为 f:param 没有在请求中发送,并且完整的方法需要一个固定的参数才能工作。

    【讨论】:

    • 哦对了,这也是一种方式:)完全忘记了那个相关的问题。
    猜你喜欢
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 2014-02-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多