1

我的大部分页面导航都使用 get 请求,现在我有一个表单,其中的参数应该包含在查询字符串参数中,使用f:paraminsideh:commandButton或检查属性以includeViewParams供使用UIViewParameter

我不想使用includeViewParams,因为这将包括所有视图定义的参数,我只想使用作为命令组件的子级提供的参数。

<h:form>
    <p:inputText value="#{bean.value1}"/>
    <p:selectOneMenu value="#{bean.value2}"/>
    <p:commandButton action="#{utilBean.performActionParams(outcome)}">
        <f:param name="key1" value="#{bean.value1}"/>
        <o:param name="key1" value="#{bean.value2}" converter="#{bean.converter}/>
    </p:commandButton>
</h:form>

public String performActionParams(final String outcome)
{
    final UriBuilder uriBuilder = UriBuilder.fromPath(outcome);

    final FacesContext context = FacesContext.getCurrentInstance();
    final UIComponent component = UIComponent.getCurrentComponent(context);

    for (final UIComponent child : component.getChildren())
        if (child instanceof UIParameter)
        {
            final UIParameter param = (UIParameter) child;

            if (!param.isDisable() && !StringUtils.isBlank(param.getName()))
            {
                final Object value = param.getValue();

                if (value != null)
                    uriBuilder.queryParam(param.getName(), value);
            }
        }

    return uriBuilder.build().toString();
}

这个逻辑并不是很复杂,但它看起来很多余,因为它似乎与 in 中的逻辑h:link相同h:button

那么有人知道这个逻辑在哪里实现吗?

4

1 回答 1

0

在 Mojarra 中,这种逻辑也被埋在OutcomeTargetRenderer#getEncodedTargetURL()(和HtmlBasicRenderer#getParamList())中。API 提供的唯一公共部分是ViewHandler#getBookmarkableURL(),但是它需要一个Map作为参数映射,而不是UIParameter组件列表。

我不确定具体的功能要求是什么,但到目前为止,您似乎实际上想要触发一个简单的 GET 请求而不是 POST 请求。在这种情况下,您应该使用<h:link><h:button>(或<p:button>)。OutcomeTargetRenderer他们的渲染器从内部实现这个逻辑扩展而来。您可以只在outcome属性中使用 EL(可能假设这是不可能的,这可能是您尝试命令按钮的原因)。

<p:button outcome="#{outcome}">
    <f:param name="key1" value="#{value1}" />
    <o:param name="key1" value="#{value2}" converter="#{bean.converter}" />
</p:button>

更新:根据评论,具体功能要求基本上是将 JSF POST 表单与提交的数据一起转换为 GET 请求。在这种情况下,如果将输入绑定到Map准备好在getBookmarkableURL().

<h:inputText value="#{bean.params.key1}" />
<h:inputText value="#{bean.params.key2}" />
<p:commandButton value="#{bean.submit(outcome)}" />

private Map<String, String> params;

@PostConstruct
public void init() {
    params = new HashMap<>();
}

public String submit(outcome) {
    // ...

    return context.getApplication().getViewHandler()
        .getBookmarkableURL(context, outcome, params, false);

    // TODO: Is faces-redirect=true also considered?
}
于 2013-05-27T13:28:54.540 回答