3

Liferay でフォームを表示するポートレットを作成しました。送信後のフォームデータを処理したいのですが、どこかでデータが「消えて」しまいます。

これはjspの私のフォームコードです:

<portlet:actionURL windowState="normal" var="filterURL">
</portlet:actionURL>
    <form action="<portlet:actionURL />" method="post">
    Industry: <input type="text" name="<portlet:namespace />industry" value="<%= industryFilter %>"/>
    <input type="submit" value="Filter" />
</form>

データはポートレット クラスに渡されるはずですが、渡されません。これは私のクラスコードです:

public void processAction(
        ActionRequest actionRequest, ActionResponse actionResponse)
    throws IOException, PortletException {

    String industryFilter = actionRequest.getParameter("industry");
    if(industryFilter == null) {
        industryFilter = "no-param";
    }
    actionResponse.setRenderParameter("industry", industryFilter);

    super.processAction(actionRequest, actionResponse);
}

このクラスは、データを jsp に戻すことを目的としています。メソッドはsetRenderParameter()正常に動作します。jsp を使用して値を読み取ることができますが、request.getParameter("industry");常に「no-param」を返します。つまり、actionRequest.getParameter()null が返されます。

したがって、私のprocessActionメソッドは適切に呼び出されるようですが、フォームデータを受け取りません。エラーはどこにありますか、何が間違っていましたか?

アップデート:

ポートレットをローカル マシンにダウンロードし、Liferay のローカル デモ インストールにデプロイしたところ、うまくいきました。したがって、コードは問題ないはずです。サーバーの設定/問題である必要があります。Chrome 開発者ツールのネットワーク タブでは、ローカル サーバーにはステータス 200 の POST 呼び出しが 1 つしかないのに対し、リモート サーバーには 302 Moved Temporarily の POST と同じ URL の GET 200 があることに気付きました。それは問題を引き起こす可能性がありますか?

4

5 に答える 5

6

name次のように、値に名前空間プレフィックスを付ける必要があります。

<input type="text" name="<portlet:namespace />inputTextName" />

requires-namespaced-parametersまたは、で設定を false に設定できますliferay-portlet.xml

これは Liferay 6.2 からの変更です: https://github.com/liferay/liferay-aui-upgrade-tool/issues/30

于 2014-01-08T07:17:20.983 に答える
1

フォーム要素の名前は"<portlet:namespace />industry"、単なる「業界」ではなく です。代わりに、このコード行を試してください。

String industryFilter = 
    actionRequest.getParameter(actionResponse.getNamespace()+"industry");

編集: ポートレットの名前空間がパラメーターから取り除かれていることを知りませんでした。これは Liferay のものに違いないと思います。その場合、他のオプションをいくつか提供します。

リクエストからパラメーターを取得するのにまだ問題がある場合は、デバッグを行う価値があるかもしれません。を使用actionRequest.getParameterMap()してすべてのパラメーターを取得し、奇妙な命名が行われているかどうかを確認できます。

また、ブラウザーとポートレットの間に、要求を操作している可能性のあるフィルターがあるかどうかを検討してください。私にとっては、ポートレット フィルターを実装して、SQL インジェクション攻撃の正規表現に一致するパラメーターをすべて削除する必要がありました。これにより、後でデバッグするのが少し面倒ではない問題が発生しました。

于 2013-09-25T20:22:05.877 に答える
1

わかりました、私は最終的に自分で解決策を見つけました。ある時点で、ポートレットを別のページに追加したところ、驚くべきことに機能しました。そこで、元のページを削除して、パーミッションなどを設定して段階的に再生成したところ、問題はページの名前 (フレンドリ URL) にあることがわかりました。問題の原因と思われるメンバーに設定されました。現職で同窓会会員に変更しました。

于 2013-09-27T11:31:01.097 に答える
1

次のような、可能な限り liferay のユーティリティ メソッドを使用することをお勧めします。

String industryFilter = ParamUtil.getString(actionRequest, "industry");

このようにして、名前空間の先頭に追加することを心配する必要はありません。さらに、ParamUtilクラスには , (使用してから に変換する代わりに Long の配列を返す)、 、 などのような他の多くの便利なメソッドがgetLong付属しgetLongValuesています。request.getParameterValuesLonggetIntegergetIntegerValues

<aui:input />また、liferay のように JSP でタグを使用すると便利です。

<aui:input type="text" name="industry" value="<%= industryFilter %>" />

これは、生成された htmlタグのname属性で名前空間を処理するためです。<input />

ただし、上記のいずれも使用したくない場合は、@NickRoth が提供するソリューションを問題なく使用できます。

String industryFilter = actionRequest.getParameter(actionResponse.getNamespace()+"industry");
于 2013-09-26T05:21:21.363 に答える