CFSERVLET の使用

ColdFusion サーバーでは CFSERVLET タグを処理するとき、JRun に要求を送信します。JRun サーブレット エンジンではサーブレットを処理し、変更されたサーブレット属性値を含むサーブレットの出力とともに、制御を ColdFusion サーバーに戻します。

CFSERVLET タグを使用すると、ColdFusion ページから Java サーブレットを呼び出すことができます。サーブレットを呼び出すには、ColdFusion ページに次の情報が必要です。

これ以降の部分では、CFSERVLET タグの使用方法について説明します。

CFML テンプレートにおけるサーブレットの呼び出し

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 アドレスも指定する必要があるので、属性に関する次の説明は非常に重要です。

CODE

必須。実行する Java サーブレットのクラス名。

JRUNPROXY

オプション。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 の例

次の 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>