| Interstage Portalworks 管理者ガイド | 
| 目次
			索引    | 
| 付録F Portletの作成方法について | > F.3 Portletの作成手順 | 
ここでは、ユーザからの入力要求を受け付けて、それによって表示内容が変わるようなインタラクティブな処理を行うPortletの作成手順について説明します。
このようなPortletは、processActionメソッドとrenderメソッドを組み合わせて実現します。
processActionメソッドは、Action URLによるAction Requestがトリガとなって呼び出されます。通常、Form入力などのアクションに対して、processActionメソッドが処理されると、続いて同じPortletのrenderメソッドがPortlet Containerにより呼び出され、processActionメソッドの処理結果に応じたビューを生成します。
processActionメソッドとrenderメソッド間でデータを受け渡すためには、Renderパラメータを利用します。processActionメソッドの引数であるActionResponseオブジェクトには、setRenderParameterというメソッドがあり、このメソッドを用いて、Render Requestへパラメータを渡すことができます。また、Sessionスコープを利用することも可能です。
以下にサンプルを示します。
| /* ---------------------- Sample Portlet 2 ---------------------- */
import java.io.*; 
import javax.portlet.*; 
/**
 * processAction と組み合わせたサンプルです。簡易ログイン画面です。
*/
public class TestProcessAction extends GenericPortlet
{
  public void processAction(
    ActionRequest   request, 
    ActionResponse   response) 
    throws   PortletException, IOException
  {
    String   strUserName; 
    String   strPassword; 
    Boolean   bLogin; 
    strUserName = request.getParameter("UserName");
    strPassword = request.getParameter("Password");
    // 外部の Web Service などにアクセスして認証を実行します。
    // bLogin = 〜認証実行結果〜
    // RenderRequest へパラメータを渡します。
    response.setRenderParameter("UserName", strUserName); 
    response.setRenderParameter("isLogin", (bLogin) ? "true" : "false");
  }
  public void doView(
    RenderRequest   request, 
    RenderResponse   response) 
    throws   PortletException, IOException
  {
    PrintWriter   stPrintWriter; 
    String   strUserName; 
    boolean   bLogin; 
    PortletURLstPortletURL; 
    response.setContentType("text/html");
    stPrintWriter   = response.getWriter();
    bLogin          = false; 
   // processAction でセットしたパラメータを取得します。
    strUserName     = request.getParameter("UserName");
    if ((request.getParameter("isLogin") != null) &&
      request.getParameter("isLogin").equals("true")) {
      bLogin      = true; 
    }
    // processAction への URL を作成します。
    stPortletURL    = response.createActionURL();
    // ログインフォーム
    if (bLogin == false) {
      stPrintWriter.println("<center><h2><p>ログイン画面</p></h2>");
      stPrintWriter.println("ユーザ名を入力してください<br>");
      stPrintWriter.println("<form action=\"" + stPortletURL.toString() + "\" method=\"POST\">");
      stPrintWriter.println("<input type=\"text\" name=\"UserName\"   size=\"8\"><br>");
      stPrintWriter.println("パスワードを入力してください<br><br>");
      stPrintWriter.println("<input type=\"password\" name=\"Password\" size=\"8\"><br>");
      stPrintWriter.println("<input type=\"reset\" value=\"reset\">");
      stPrintWriter.println("<input type=\"submit\" name=\"send\" value=\"send\"></form>
      <br></center>");
    }
    else {
      stPrintWriter.println("<center><h2>ログイン中<br></h2>");
      stPrintWriter.println(strUserName + " さん、ようこそ!<br>");
    }
    stPrintWriter.flush();
    stPrintWriter.close();
  }
} | 
画面出力例

インタラクティブなPortletを作成するには、まず、javax.portlet.GenericPortletクラスのprocessActionメソッドをオーバーライドして、ユーザからの入力要求を受け付ける処理を実装し、受け取ったパラメータを利用します。
renderメソッド内では、RenderResponseオブジェクトがもつcreateActionURLメソッドを用いて、Action URLを得ることができます。サンプルでは、doViewメソッドにおいて<form>タグの「action」属性に「Action URL」を指定しています。これによって、processActionメソッドにFormのパラメータが渡されます。
このように、processActionと組み合わせるとインタラクティブなPortletが作成できます。
| 目次
			索引    |