ここでは、ユーザからの入力要求を受け付けて、それによって表示内容が変わるようなインタラクティブな処理を行う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;
PortletURL stPortletURL;
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が作成できます。
javax.portlet.GenericPortletを継承してクラスを作成します。
processActionメソッドをオーバーライドして、ユーザからの入力要求を受け付ける処理を実装します。
doView(および、doEdit、doHelp)メソッドをオーバーライドして、描画処理を実装します。