1

私は2つのビューを得ました:

  1. エンティティに関するいくつかの一般的な情報を表示します
  2. このエンティティに関する詳細を表示します

2 番目のビューには、最初のビューへのリンクがあります。リンクを作成するには、いくつかの情報が必要です。2 つの ID (「id1」と「id2」) を考えてみましょう。これらの ID は、リクエスト パラメータによって 2 番目のビューのコントローラに渡されます。

2 番目のビューで戻るリンクを作成するには、リクエスト パラメータを手動でモデルに転送する必要があります。これはあまり便利ではありません。

この転送を自動的に行う方法はありますか?

ここに例があります:

最初のビューの詳細へのリンク:

<portlet:renderURL var="detailsUrl">
    <portlet:param name="action" value="showDetails" />
    <portlet:param name="id1" value="${entity.id1}" />
    <portlet:param name="id2" value="${entity.id2}"/>
</portlet:renderURL>
<a href="${detailsUrl}">Details</a>

2 番目のコントローラーの Render メソッド:

@RenderMapping(params = "action=showDetails")
public String showDetails (
        @RequestParam("id1") int id1,
        @RequestParam("id2") int id2,
        Model model) {
    // The current unconvenient approach
    model.addAttribute("id1", id1);
    model.addAttribute("id2", id2);

    return "showDetails";
}

2 番目のビューの戻るリンク:

<portlet:renderURL var="entityUrl">
    <portlet:param name="action" value="showEntity" />
    <portlet:param name="id1" value="${id1}" />
    <portlet:param name="id2" value="${id2}"/>
</portlet:renderURL>
<a href="${entityUrl}">Back</a>

インターネットで何時間も検索して、見逃したトリックのようなものを見つけました。しかし、私が見つけた唯一のことは、「春はあなたのためにそれを自動的に投与する」ということでした。しかし、これを確認することはできません。

ご協力いただきありがとうございます...

4

3 に答える 3

2

わかりました。@ModelAttributeが役に立たない場合は、もう少し複雑なアプローチはどうでしょうか。

org.springframework.web.portletHandlerInterceptorを実装するクラスを作成します。一連のメソッドをオーバーライドする必要がありますが、そのうちの1つでpostHandleRenderで、モデルへのIDの設定を行います。

ブール値を返すすべての実装メソッドがtrueを返すことを確認してください。そうしないと、portletメソッドが呼び出されない可能性があります(たとえば、preHandleRenderがfalseを返した場合)。

もちろん、インターセプターを機能させるには、ポートレットにインターセプターを導入する必要があります。これは、ポートレットのcontext-configに以下を追加することで実行できます。

<bean class="org.springframework.web.portlet.mvc.annotation.DefaultAnnotationHandlerMapping">
    <property name="interceptors">
        <bean class="some.package.to.my.interceptors.MyInterceptor"/>
    </property>         
</bean>
于 2010-11-25T14:13:59.433 に答える
0

以下のようなメソッドを記述し、Map の生成を追加するだけです。モデル マップに追加します。

private Map<String, String> getParamterMap(PortletRequest request){
        Map<String, String> parameters = new HashMap<String, String>();

        Set<String> keySet = request.getParameterMap().keySet();
        for(String key : keySet){
            parameters.put(key, request.getParameter(key));
        }

        return parameters;

    }

RenderMapping メソッドからこのメソッドを呼び出して、すべてのリクエスト パラメータを ModelMap に追加します。

modelMap.addAllAttributes(getParamterMap(request));
于 2013-08-22T06:03:15.027 に答える
0

@ModelAttribute で ID をマークしてみてください。

@RenderMapping(params = "action=showDetails")
public String showDetails (
        @ModelAttribute @RequestParam("id1") int id1,
        @ModelAttribute @RequestParam("id2") int id2,
        Model model) {
    // The current unconvenient approach
    //model.addAttribute("id1", id1);
    //model.addAttribute("id2", id2);

    return "showDetails";
}

モデルへのIDの明示的な設定をコメントアウトしたことに注意してください。私はこれをテストしていないので、動作する場合はここに戻って報告してください..

于 2010-11-25T13:31:12.633 に答える