Seasar DI Container with AOP

S2Portlet » S2GenericPortlet

セットアップ

S2Portlet を利用するためには、Seasar2と同様にJDK1.4以上が必要です。また、Seasar2 については、バージョン 2.4 以上が必要になります。

S2GenericPortlet は、JSR 168 準拠のポートレット実装です。 JSR 168 準拠のポートレットを利用できるポータルサーバーで利用することができます。

利用方法

ハローワールド的なポートレットの作成を通して、利用方法を見てみましょう。

一般的な JSR 168 準拠のポートレットと同様に以下のファイルを作成します。

WEB-INF/portlet.xml
WEB-INF/view/helloworld.jsp (*)
WEB-INF/web.xml (*)
WEB-INF/jp/sf/pal/helloworld/HelloWorldPortlet.class (*)
WEB-INF/jp/sf/pal/helloworld/HelloWorld.dicon
WEB-INF/jp/sf/pal/helloworld/resources/HelloWorldResources.properties (*)
WEB-INF/jp/sf/pal/helloworld/resources/HelloWorldResources_ja.properties (*)
(*) のついたファイルに関しては、S2GenericPortlet を使わないで作った場合と同じことを示しています。 つまり、現在利用しているポートレットに対して、S2GenericPortlet を新たに利用する場合、portlet.xml を編集して、*.dicon ファイルを追加するだけで良いということです。

それでは、各ファイルについて、順番に見ていきましょう。

portlet.xml

portlet.xml は、ポートレットの配備記述子です。 記述方法については、JSR 168 を参照してください。 portlet.xml は以下のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<portlet-app id="s2helloworld" version="1.0">

    <portlet id="S2HelloWorld">
        <portlet-name>S2HelloWorld</portlet-name>
        <display-name>Hello World for Seasar2</display-name>
        <description>HelloWorld is a portlet for testing</description>
        <portlet-class>org.seasar.portlet.S2GenericPortlet</portlet-class>
        <init-param>
            <name>configPath</name>
            <value>jp/sf/pal/helloworld/HelloWorld.dicon</value>
        </init-param>
        <expiration-cache>-1</expiration-cache>
        <supports>
            <mime-type>text/html</mime-type>
            <portlet-mode>VIEW</portlet-mode>
        </supports>
        <supported-locale>en</supported-locale>
        <supported-locale>ja</supported-locale>
        <resource-bundle>
            jp.sf.pal.helloworld.resources.HelloWorldResources
        </resource-bundle>
        <portlet-info>
            <title>Hello World for S2Portlet</title>
            <short-title>Hello</short-title>
            <keywords>Hello,Test</keywords>
        </portlet-info>
    </portlet>

</portlet-app>
注目するべきところを赤字で表示しています。

既にご利用のポートレットに対して、S2GenericPortlet を適用するためには、<portlet-class> で指定したポートレットクラスを configPath で指定した dicon ファイルに記述して、<portlet-class> には org.seasar.portlet.S2GenericPortlet を指定するだけです。

HelloWorld.dicon

HelloWorld.dicon は、通常の Seasar2 の設定ファイルです。 ポートレット上で利用したいコンポーネントを記述します。 S2GenericPortlet を利用する場合は、ポートレットのクラスを .dicon ファイル内で指定する必要があります。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container//EN"
"http://www.seasar.org/dtd/components.dtd">
<components>
    <component class="jp.sf.pal.helloworld.HelloWorldPortlet" name="portletName"/>
</components>

helloworld.jsp

S2GenericPortlet を利用しないでポートレットを作成した場合と変更はありません。

<%@ taglib uri='/WEB-INF/portlet.tld' prefix='portlet'%>
<%@ taglib uri="http://java.sun.com/jstl/fmt" prefix="fmt" %>
<fmt:setBundle basename="jp.sf.pal.helloworld.resources.HelloWorldResources" />
<portlet:defineObjects/>

<form action="<portlet:actionURL />" method="POST">
<table border="0">
    <tr>
        <td align="center"><fmt:message key="helloworld.lable.Hello"/></td>
        <td align="center"><%= request.getAttribute("yourName") %></td>
    </tr>
    <tr>
        <td align="right"><fmt:message key="helloworld.lable.YourName"/></td>
        <td align="left"><input type="text" name="yourName"/></td>
    </tr>
    <tr>
        <td align="center" colspan="2"><input type="submit"
          value="<fmt:message key="helloworld.lable.Submit"/>"/></td>
    </tr>
    <tr>
        <td align="left" colspan="2"><%= request.getAttribute("renderTraceLog") %></td>
    </tr>
</table>
</form>

web.xml

S2GenericPortlet を利用しないでポートレットを作成した場合と変更はありません。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
                         "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <display-name>HelloWorld Portlet</display-name>
  <description>HelloWorld Portlet</description>
</web-app>

HelloWorldPortlet.java

S2GenericPortlet を利用しないでポートレットを作成した場合と変更はありません。

package jp.sf.pal.helloworld;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.io.IOException;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.GenericPortlet;
import javax.portlet.PortletConfig;
import javax.portlet.PortletContext;
import javax.portlet.PortletException;
import javax.portlet.PortletRequestDispatcher;
import javax.portlet.PortletSession;
import javax.portlet.RenderRequest;
import javax.portlet.RenderResponse;

/**
 * HelloWorldPortlet is a portlet to say "Hello!"
 *
 * @author <a href="mailto:shinsuke@yahoo.co.jp">Shinsuke Sugaya</a>
 */
public class HelloWorldPortlet extends GenericPortlet
{
    /**
     * Logger for this class
     */
    private static final Log log = LogFactory.getLog(HelloWorldPortlet.class);

    public static final String YOUR_NAME_KEY = "yourName";
    public static final String COUNT_KEY = "count";

    /* (non-Javadoc)
     * @see javax.portlet.Portlet#init(javax.portlet.PortletConfig)
     */
    public void init(PortletConfig config) throws PortletException
    {
        super.init(config);
    }

    /* (non-Javadoc)
     * @see javax.portlet.GenericPortlet#doView(javax.portlet.RenderRequest,
     *        javax.portlet.RenderResponse)
     */
    protected void doView(RenderRequest request, RenderResponse response)
        throws PortletException, IOException
    {
        response.setContentType("text/html");

        PortletContext context = getPortletContext();

        String yourName = request.getParameter(YOUR_NAME_KEY);
        if (yourName == null)
        {
            yourName = "";
        }
        request.setAttribute(YOUR_NAME_KEY, yourName);

        PortletRequestDispatcher rd = context.getRequestDispatcher("/WEB-INF/view/helloworld.jsp");
        rd.include(request, response);
    }

    /* (non-Javadoc)
     * @see javax.portlet.Portlet#processAction(javax.portlet.ActionRequest,
     *        javax.portlet.ActionResponse)
     */
    public void processAction(ActionRequest request, ActionResponse response)
        throws PortletException, IOException
    {
        PortletSession session = request.getPortletSession();
        String yourName = request.getParameter(YOUR_NAME_KEY);

        if (yourName != null)
        {
            Integer count = (Integer) session.getAttribute(COUNT_KEY);
            if (count != null)
            {
                count = new Integer(count.intValue() + 1);
            }
            else
            {
                count = new Integer(1);
            }

            session.setAttribute(COUNT_KEY, count);
            response.setRenderParameter(YOUR_NAME_KEY, yourName);
        }

        return;
    }

}

HelloWorldResources.properties

S2GenericPortlet を利用しないでポートレットを作成した場合と変更はありません。

# helloworld.jsp
helloworld.lable.Hello=Hello!
helloworld.lable.YourName=Your Name:
helloworld.lable.Submit=Submit

HelloWorldResources_ja.properties

S2GenericPortlet を利用しないでポートレットを作成した場合と変更はありません。

# portlet info
javax.portlet.title=S2Portlet\u7528\u30cf\u30ed\u30fc\u30ef\u30fc\u30eb\u30c9
javax.portlet.short-title=\u30cf\u30ed\u30fc
javax.portlet.keywords=\u30c6\u30b9\u30c8,\u30cf\u30ed\u30fc

# helloworld.jsp
helloworld.lable.Hello=\u3053\u3093\u306b\u3061\u306f\u3001
helloworld.lable.YourName=\u540d\u524d:
helloworld.lable.Submit=\u9001\u4fe1

まとめ

以上のファイルを JSR 168 に定義されたのパッケージ化の仕様に従い、WAR ファイルにまとめて、ポータルへ配備すれば、動作します。 ポータルへの配備手順については、ご利用のポータルのドキュメントを参照してください。