1

Liferayテーマ(速度テンプレート)でカスタムサービスまたはLiferayサービスを使用するをオンにしましたか?

カスタムメソッドはそのまま正常に機能しています。しかし、私にはいくつかの特定の要件があります。

PortletSessionオブジェクトまたはRenderRequestをCustomメソッドに渡す方法を知っている場合はお知らせください。

例えば

次のインターフェイスを作成しようとしました。

package com.myTool;


import javax.portlet.PortletSession;
import javax.portlet.RenderRequest;

public interface MyTest{
  public String getUserCountry(PortletSession portletSession);
  public String getUserCountry(RenderRequest request);
}

インターフェイスを実装するクラスには、次のメソッドがあります。

public String getUserCountry(PortletSession portletSession) {
        try {
            myUtil.setPortletSession(portletSession);
            return "Success";
        }
        catch (Exception e) {
            e.printStackTrace();
            return "exception-portletSession";
        }

    };

    public String getUserCountry(RenderRequest request) {
        try {
            myUtil.setPortletSession(request.getPortletSession());
            return "Success request";
        }
        catch (Exception e) {
            e.printStackTrace();
            return "exception-renderRequest";
        }

    };

私は運が悪かった次の方法を試しました:

1)

#set($currentProfileUtil = $utilLocator.findUtil("myportlets-1.0-SNAPSHOT", "com.myTool.MyTest"))
#set($result = $currentProfileUtil.getUserCountry($request.getAttribute("javax.portlet.response")))
$result

2)

#set($currentProfileUtil = $utilLocator.findUtil("myportlets-1.0-SNAPSHOT", "com.myTool.MyTest"))
#set($result = $currentProfileUtil.getUserCountry($request.get("portlet-session")))
$result

3)

#set($currentProfileUtil = $utilLocator.findUtil("myportlets-1.0-SNAPSHOT", "com.myTool.MyTest"))
#set($result = $currentProfileUtil.getUserCountry($request.getSession()))
$result

4)

#set($currentProfileUtil = $utilLocator.findUtil("myportlets-1.0-SNAPSHOT", "com.myTool.MyTest"))
#set($result = $currentProfileUtil.getUserCountry($request.getSession()))
$result

PS「なぜこれが必要なのか」と言わないでください。--PortletSessionまたはPortletSessionを取得できるオブジェクトを送信する方法に関するアイデアを提供するだけです。ありがとう

4

2 に答える 2

1

速度テンプレートをどこで使用しているか (テーマ、Web コンテンツ テンプレートなど) について明確に述べていませんか?

最初にテーマでそれらを使用する方法を説明するリンクを提供したので、それはテーマになると思います。そのため、短い答えは、速度テンプレートから取得することはできませんがPortletSession、取得して取得RenderRequestできるので心配しないでください。テンプレート ファイルで、liferay の.HttpSessionHttpServletRequestinit.vm

したがって、変数$requestは forであり、 forHttpRequestではないためRenderRequest、and not$request.getSession()が得られます。HttpSessionPortletSession

ポートレット固有のリクエストとセッションを速度で取得できない理由は、テンプレートがポートレットに依存しないため、request.

とにかく、ポートレットのリクエストに存在する可能性のあるすべての属性またはパラメーターは にあるHttpServletRequestため、メソッドの署名を次のように変更する必要があると思います。

public interface MyTest{
    public String getUserCountry(HttpSession portletSession);
    public String getUserCountry(HttpServletRequest request);
}

そして、次を使用します。

#set($result = $currentProfileUtil.getUserCountry($request.getSession()))
#set($result = $currentProfileUtil.getUserCountry($request))

私はこれを試しましたが、RenderRequestから取得することができますHttpServletRequest

RenderRequest renderRequest = (RenderRequest) request.getAttribute(JavaConstants.JAVAX_PORTLET_REQUEST);

および応答:

RenderResponse renderResponse = (RenderResponse) request.getAttribute(JavaConstants.JAVAX_PORTLET_RESPONSE);

注:$request変数は Web コンテンツ テンプレートでも使用できます (OP のコメント)

お役に立てれば

于 2012-11-30T13:49:30.440 に答える
0

Liferay Forum で回答が提供されました (これは PortletSession ではなく HttpSession ですが、私の場合は問題ありませんでした)。

http://www.liferay.com/web/raymond.auge/blog/-/blogs/6051129 (2012 年 11 月 30 日午前 9 時 54 分の Ray Augé からのコメント)

私の場合(元の質問から)、解決策は次のとおりでした:

#set($serviceContext = $portal.getClass().forName("com.liferay.portal.service.ServiceContextThreadLocal").getServiceContext())
#set($currentProfileUtil = $utilLocator.findUtil("myportlets-1.0-SNAPSHOT", "com.myTool.MyTest"))
#set($result = $currentProfileUtil.getUserCountry($serviceContext.getSession()))
$result

他の人にも役立つことを願っています

于 2012-12-01T21:35:44.687 に答える