1

f:param私のページ ナビゲーションのほとんどは get リクエストを使用しており、使用するために内部h: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();
}

h:linkこのロジックはそれほど複雑ではありませんが、および と同じロジックのように見えるため、非常に冗長に見えますh:button

それで、誰かがこのロジックが実装されている場所を知っていますか?

4

1 に答える 1

0

Mojarra では、この種のロジックもOutcomeTargetRenderer#getEncodedTargetURL()(および にHtmlBasicRenderer#getParamList()) 埋め込まれています。API によって提供される唯一のパブリック パーツは ですが、コンポーネントのリストではなく、パラメータ マップとしてViewHandler#getBookmarkableURL()取ります。MapUIParameter

具体的な機能要件が何であるかはわかりませんが、これまでのところ、POST リクエストではなく単純な GET リクエストを実際に起動したいようです。その場合、<h:link>or <h:button>(または<p:button>) を使用する必要があります。彼らのレンダラーは、OutcomeTargetRendererこのロジックを内部的に実装することから拡張されています。属性で EL を使用することもできoutcomeます (これが不可能であるという想定が、コマンド ボタンを試した理由かもしれません)。

<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 に答える