ColdFusion サーバーでは CFSERVLET タグを処理するとき、JRun に要求を送信します。JRun サーブレット エンジンではサーブレットを処理し、変更されたサーブレット属性値を含むサーブレットの出力とともに、制御を ColdFusion サーバーに戻します。
CFSERVLET タグを使用すると、ColdFusion ページから Java サーブレットを呼び出すことができます。サーブレットを呼び出すには、ColdFusion ページに次の情報が必要です。
これ以降の部分では、CFSERVLET タグの使用方法について説明します。
CFSERVLET タグを使用すれば、CFML ページから簡単にサーブレットを呼び出すことができます。CFSERVLET タグは、JRun エンジンで Java サーブレットを実行します。このタグは CFSERVLETPARAM タグと併用します。CFSERVLETPARAM タグは、サーブレットにパラメータまたは属性、あるいはその両方が設定されている場合、そのサーブレットにデータを渡すためのタグです。
<CFSERVLET CODE="class name of servlet" JRUNPROXY="proxy server" TIMEOUT="timeout in seconds" WRITEOUTPUT="Yes" or "No" DEBUG="Yes" or "No"> <CFSERVLETPARAM NAME="parameter name" or "attribute name" VALUE="value" > ... </CFSERVLET>
サーブレットを初めて使用するユーザは、サーブレットの名前を指定する必要があり、リモート ホストで実行している場合は IP アドレスも指定する必要があるので、属性に関する次の説明は非常に重要です。
必須。実行する Java サーブレットのクラス名。
オプション。JRun エンジンが実行されているリモート マシンを指定します。既定 では、JRun エンジンは、ColdFusion を実行しているホストで実行されます。リ モート ホストの名前を指定する場合は、リモート ホストの IP アドレスの後にコ ロンを入力し、その後に JRun が受信しているポート番号を指定します。この JRun サーバー コネクタ ポートは、JRun コネクタ ウィザードで指定されます。
次の例は、SnoopServlet
という最も単純な形式でこのタグを使用する方法を示します。
<HTML>
<HEAD> <TITLE>CFSERVLET</TITLE> </HEAD> <BASEFONT FACE="Arial, Helvetica" SIZE=2> <BODY bgcolor="#FFFFD5"> <H3>CFSERVLET</H3> <P> <!--- JRUNPROXY is Web server IP:proxy port. To determine proxy port, look at the jcp.endpoint.main.port property in the local.properties file for the JRun server you want to access. ---> <CFSERVLET code="SnoopServlet" JRUNPROXY="127.0.0.1:53003" TIMEOUT="10" > </CFSERVLET> </BODY> </HTML>
このページは、ほかの CFML ページと同じようにブラウザで表示できます。
CFSERVLETPARAM タグを使用すると、パラメータと属性が設定されているサーブレットを CFML テンプレートから呼び出せます。このタグでは参照または値を使用できます。
次のサーブレットは、パラメータと属性の両方を使用しています。このサーブレットは属性値を変更し、対応する CFML 変数に新しい値を返します。
import java.io.*;
import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class MySimpleServlet extends HttpServlet { public void doGet (HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // コンテンツ タイプを設定して、PrintWriter を作成します。 resp.setContentType("text/html"); PrintWriter out = resp.getWriter(); // 応答のデータを書き込みます。 // パラメータの名前を取得します。 Enumeration enumNames = req.getParameterNames(); // 各パラメータの名前と値を while ループに書き込みます。 out.println("<P>Here are the pass-by-value parameters."); while ( enumNames.hasMoreElements() ) { String strName = (String) enumNames.nextElement(); out.println("<br> " + strName + ":" + req.getParameter(strName)); } // パラメータ名を知っている場合は、それを名前で参照します。 out.println("<P>Here are the pass-by-value parameters, again."); out.println("<br> Town:" + req.getParameter("town")); out.println("<br> State:" + req.getParameter("state")); // 属性の名前を取得します。 Enumeration enumAttrNames = req.getAttributeNames(); out.println("<P>Here are the attributes."); while ( enumAttrNames.hasMoreElements() ) { String attrName = (String) enumAttrNames.nextElement(); out.println("<br> " + attrName + ":" + req.getAttribute(attrName)); } // 属性名を知っている場合は、それを名前で参照します。 out.println("<P>Here are the attributes, again."); out.println("<br> aString:" + req.getAttribute("aString")); out.println("<br> aDate:" + req.getAttribute("aDate")); out.println("<br> aDouble:" + req.getAttribute("aDouble")); // aString 属性を取得して、それを StringObject に割り当てます。 Object StringObject = req.getAttribute("aString"); if(StringObject != null) { String myString = (String)StringObject; // 印刷します。 out.println("<br> The string value is:\"" + myString + "\""); // 文字列を修正します。 myString = "New value from servlet"; // 修正した文字列を印刷します。 out.println("<br> The string value is:\"" + myString + "\""); // 元のオブジェクトを修正します。 StringObject = myString; // StringObject の値を CFML 変数に返します。 req.setAttribute("aString", StringObject); }else{ out.println("<h2>StringObject is null</H2>"); } // aDate 属性を取得して、DateObject オブジェクトに割り当てます。 Object DateObject = req.getAttribute("aDate"); // DateObject オブジェクトが Date タイプかどうかをチェックします。そうでない場合は、 // 例外を返します。 if(DateObject != null) { if(DateObject instanceof java.util.Date) { // (Date) タイプ変換を使用して、myDate にその値を設定することによって、 // JVM に DateObject が Date クラスを持っていることを知らせます。 // メモ : Date は Java のクラスです。 Date myDate = (Date)DateObject; // 印刷します。 out.println("<br>Date value:\"" + myDate.toString() + "\""); // 修正して返します。 myDate = new Date(System.currentTimeMillis()); // 印刷します。 out.println("<br>MODIFIED date:\"" + myDate.toString() + "\""); // 元のオブジェクトを修正します。 DateObject = myDate; // DateObject の新しい値を CFML 変数に返します。 req.setAttribute("aDate", DateObject); }else{ throw new ServletException("Illegal type for aDate - expected type java.util.Date and instead the type was:"+ DateObject.getClass().getName()); } }else{ out.println("<h2>DateObject is null</H2>"); } // 渡した実数値を変更するには、 // aDouble 属性を取得して、RealObject オブジェクトに割り当てます。 Object RealObject = req.getAttribute("aDouble"); // (Double) タイプ変換を使用して、myDouble にその値を設定することによって、 // JVM に RealObject が Double クラスを持っていることを知らせます。 // メモ : double は Java のクラスです。つまり、double はスカラー タイプです。 if(RealObject != null) { Double myDouble = (Double)RealObject; // toString メソッドを使用して、myDouble の値を印刷します。 out.println("<br> Value of Parameter that was passed in:" + myDouble.toString() + "\""); // myDouble オブジェクトからスカラー値 (実数/倍精度) を抽出し、 // それを dVal に割り当てます。 double dVal = myDouble.doubleValue(); // 渡された実数値に 100 を加えます。 dVal += 100.0; // 新しい値を double タイプの myDouble に割り当てます。 myDouble = new Double(dVal); // 修正した値を印刷します。 out.println("<br> Double:" + myDouble.toString() + "\""); // 元のオブジェクトを修正します。 RealObject = myDouble; // サーブレットの aDouble 属性から CF 変数を返します。 req.setAttribute("aDouble", RealObject); }else{ out.println("<h2>RealObject is null</H2>"); } // out.println("</BODY>"); out.close(); } public String getServletInfo() { return "A simple servlet"; } }
次の CFML テンプレートでは、前述のサンプル Java サーブレットを呼び出します。Java サーブレットで参照する各パラメータおよび属性は、CFSERVLETPARAM タグを使用して渡す必要があります。
パラメータを渡すには、属性 NAME と VALUE を使用します。NAME はパラメータの名前、VALUE はその値を表します。属性を渡すには、属性 NAME、VARIABLE、および TYPE を使用します。NAME は Java サーブレットの属性名、VARIABLE は CFML ページで対応する変数名、TYPE は変数のデータ タイプを表します。TYPE は、値のタイプが整数、ブール値、または実数値 (浮動小数点) の場合にのみ指定します。
<HTML>
<HEAD> <TITLE>CFSERVLET</TITLE> </HEAD> <BASEFONT FACE="Arial, Helvetica" SIZE=2> <BODY bgcolor="#FFFFD5"> <H3>CFSERVLET</H3> <CFPARAM name="aUser" default="Mary Horvath"> <CFPARAM name="aReal" default="44.6"> <CFPARAM name="theDate" default="#now()#"> <p>These are the values of the attributes that are to be passed into the servlet.</p> <cfoutput> <ul> <li>User:#aUser# <li>Real Number:#aReal# <li>Date:#theDate# </ul> </cfoutput> <p>Call MySimpleServlet to demonstrate the following: <ul> <li>How to pass parameters. <li>How to pass attributes. <li>How to change the value of an attribute within a servlet and return it to the CFML page. </ul> <CFSERVLET jrunproxy="52000" code="MySimpleServlet" debug="Yes"> <cfservletparam name="aString" variable="aUser" type="STRING"> <cfservletparam name="aDouble" variable="aReal" type="REAL"> <cfservletparam name="aDate" variable="theDate" > <cfservletparam name="town" value="Concord"> <cfservletparam name="state" value="MA"> </cfservlet> <p>Here are the modified values of the attributes:</p> <CFOUTPUT> <P>User:#aUser# <P>Number:#aReal# <P>Date:#theDate# </CFOUTPUT> </BODY> </HTML>