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>