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>