« Ajax/PHPでhelloWorld改 | トップページ | JSPでhelloWorld改 »

ServletでhelloWorld改(Tomcatの使い方)

サーブレットで単純なインタラクティブ画面を作成します。
ボタンを押すたびに「hello world」「This is Servlet-test-1.」という文字列 を交互に出します。さらに補助的にクライアントからサーバ に送られた数値を表示しています

本記事ではWindowsへのTomcatのインストールから冒頭の例が動くまでを説明 します。日本語データの取り扱い、セッションの取り扱い、cookieの取り扱い、 cssなどの情報の設置法なども説明します。

 Tomcatのインストール

予め必要なもの/心の準備
・Java(1.5以上)がインストールされてある必要があります。
・JREの場所を知っておく必要があります。
 例えば)C:\Program Files\Java\jre6
・Tomcat用ポート(デフォルト8080)を決めて置く必要があります。
・Tomcatの管理者の名前(デフォルトadmin)とパスワードを決めてお く必要があります。

インストール
次のサイトからインストールします。
http://tomcat.apache.org/
望むバージョン(通常最新)のDownloadのページに移動し、 Windows_Service_Installerをクリックすると インストールが始まります。

 フォルダー構成

開発/実行用のフォルダは設定で変えられますが、デフォルトでは 次のようになっています。6.0や6wはインストールするバージョンによってことなります。

   [インストール先]\  <-- C:\とかC:\Program Files\Apacheとか
      Tomcat 6.0\
          bin\
             tomcat6w.exe  <-- Tomcatの起動/停止を行います
          lib\
          logs\
          webapps\ <-- この下をTomcatはなめます
             examples\
                 WEB-INF\
                    classes\
             実行.class群
                       プロパティファイル
             サブフォルダ群\
                          実行.class群
                    lib\
                    web.xml
             test\       <-- 例:この名前がURLの先頭になる
                 WEB-INF\
                    classes\   <-- ここに実行プログラムを置く
             実行.class群
                       プロパティファイル
             サブフォルダ群\
                          実行.class群
                    lib\   <-- jarにまとめた場合ここに置く
                       Hello_Srvlt.jar   <-- 例
                    web.xml   <-- URLとプログラムのマッピングなどの定義

Tomcatは起動時にwebappsフォルダを調べ、その下にあるフォルダの中 のWEB-INFフォルダの中に実行形式や定義があるとして、情報を 取り込みます。

設定の読み込みはTomcat起動時に行われるので、設定を変えるたびに 停止/起動を繰り返さなくてはなりません。
停止/起動はbinの下のtomcat6w.exeで行います。これはディスクトップなどに ショートカットを置いておくとよいでしょう。

 Javaによるサーブレットプログラムとコンパイル

サーブレットクラスは純粋なJavaプログラムであり、 HttpServletの派生として記述し、doGet関数またはdoPost関数をオーバーライドします。
引数で渡されたHttpServletResponseにHTMLによるページ記述をprint出力します。
URL上のパラメタをHttpServletRequest.getParameter(パラメタ名)で取得しています。

// Hello_Srvlt.java
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Hello_Srvlt extends HttpServlet {
   public void doGet(HttpServletRequest  request,
                     HttpServletResponse response)
                     throws IOException,
                            ServletException{
      request.setCharacterEncoding("UTF-8");              // 基本中の基本
      response.setCharacterEncoding("UTF-8");             // 基本中の基本
      response.setContentType("text/html; charset=UTF-8");// 基本中の基本
      int c=0;
      try{c= Integer.parseInt(request.getParameter("C"));}// パラメタ取得
      catch(Exception e){e.printStackTrace(System.err);}
      PrintWriter out = response.getWriter();
      out.println("<html><head></head><body>");
      out.println("<form method='GET'"
                  +"action='"+request.getRequestURL()+"'>");
      out.println("<input type='hidden' name='C' value='"
                  +(c+1) // 新パラメタ設定 GETのURLに?C=数値が付加される
                  +"'>");
      out.println("<input type='submit' value='Click Me'>");
      out.println("</form>");
      if( (c%2)==0 ) out.println("<p>Hello World. ("+c+")</p>");
      else           out.println("<p>This is Servlet-test-1. ("+c+")</p>");
      out.println("</body></html>");
      }
   }
これは次のようなHTML文字列を生成するものです。(茶色文字の部分が毎回変わります)
<html><head></head><body>
<form method='GET'action='http://localhost:8080/test/servlet/hello'>
<input type='hidden' name='C' value='7'>
<input type='submit' value='Click Me'>
</form>
<p>Hello World.</p>
</body></html>

response.setContentType(),setCharacterEncoding()で文字コードを設定しています。 基本中の基本です。たまたま不要な場合でも必ず行うべきです。requestに対するsetContentType()は ほぼ無意味ですが、文字化け発生時に「抜かり」と勘違いしないように行っておいた方がよいでしょう。

equest.getParameter("C")でURLに付加するC=xxx値を取得しています。C=xxxは <form>内に置いたhidden型の<input>の値です。

response.getWriter()で得たwriterにHTMLを書くことにより ブラウザ表示が行われます。

 webapps/作業フォルダ/WEB-INF/web.xml設定

ブラウザからはURLで起動指示をします。URLとJavaプログラムは WEB-INFの下に置くweb.xmlファイルで指定します。
マッピングは

     URL            ---> サーブレット名 ---> クラス名
 例) /servlet/hello ---> Hello_servlet  ---> Hello_srvlt.class
の2段階で行われます。

<servlet>
サーブレット名とクラス名のマッピングを行います。
<servlet-name>でサーブレット名を指定し、<servlet-class> でクラス名を指定します。
次の例でHello_srvlt.classをHello_servletというサーブレット名で 使うことを指定しています。

    <servlet>
        <servlet-name>Hello_servlet</servlet-name>
        <servlet-class>Hello_srvlt</servlet-class>
    </servlet>
ここでは説明のため少しつづりを変えていますが、同じ名前でも かまいません。

<servlet-mapping>
サーブレット名とURIのマッピングを行います。
<servlet-name>でサーブレット名を指定し、<url-pattern> でURLを指定します。
次の例ではサーブレットHello_servletを/servlet/helloのURL で呼び出すことを指定しています。
    <servlet-mapping>
        <servlet-name>Hello_servlet</servlet-name>
        <url-pattern>/servlet/hello</url-pattern>
    </servlet-mapping>
ここではURLは"servlet"と"hello"の2段階層の名前としていますが、 これは一段でもよいし、あるいはもっと深い名前でも構いません。 一段目も"servlet"と限るわけではなく自由に名づけることができます。

<servlet>は<servlet-mapping>より前に置く必要があることに注意してください。

この2つの定義により、Hello_srvlt.classは/servlet/helloのURL で呼び出されることになります。

web.xmlの例を示します。

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
   version="2.5">

    <servlet>
        <servlet-name>Hello_Servlet</servlet-name>
        <servlet-class>Hello_Srvlt</servlet-class>
    </servlet>

    <servlet-mapping>
        <url-pattern>/servlet/hello</url-pattern>
        <servlet-name>Hello_Servlet</servlet-name>
    </servlet-mapping>
</web-app>

 ANTによるビルド例

antのビルドファイルを示します。

<?xml version="1.0" encoding="UTF-8"?>
<!-- build.xml -->
<project default="main">
   <property name="TomcatDir"
      value="C:/Program Files/Apache Software Foundation/Tomcat 6.0/" />
   <property name="webappsDir"  value="${TomcatDir}/webapps" />
   <property name="classpath"  value="${TomcatDir}/lib/servlet-api.jar"/>

   <property name="project"    value="test" />
   <property name="installDir" value="${webappsDir}/${project}/WEB-INF" />

   <property name="MAIN"       value="Hello_Srvlt" />

   <target name="main" depends="clean,build,install">
      <echo>=== CLEAN BUILD and INSTALL done ===</echo>
   </target>
   <target name="build" depends="compile">
      <jar destfile="${MAIN}.jar" 
           basedir="." 
           includes="**/*.class" >
         <manifest>
            <attribute name="Main-Class" value="${MAIN}"/>
         </manifest>
      </jar>
   </target>
   <target name="compile">
      <javac srcdir           ="."
             includes         ="*.java"
             includeAntRuntime="false"
             encoding         ="UTF-8"
             debug="yes" optimize="no"
             classpath=".;${classpath}" />
   </target>
   <target name="install" depends="build">
      <copy file="${MAIN}.jar" todir="${installDir}/lib/" overwrite="yes"/>
      <copy file="web.xml"     todir="${installDir}/"     overwrite="yes"/>
   </target>
   <target name="clean">
      <delete dir="." includes="*.class,${MAIN}.jar"/>
   </target>
</project>

  • ここではTomcatDirでTomcatの管理フォルダを指定しています。
  • classpathにはライブラリjavax-apiのあるjarを指定しています。
    なおTomcat5.0ではservlet-api.jarではなくservlet.jarとなります。
  • projectでwebappsの下に生成するフォルダを指定しています。
  • installターゲットでTomcatの管理フォルダに必要ファイルを コピーしています。
  • compileターゲットでコンパイルし、installでTomcatの管理ディレクトリに必要ファイル をコピーしています。

 TOMCATの起動/再起動

Tomcat 6.0\bin\tomcat6w.exeを動かし、TOMCATを停止/起動します。

設定を変えるたびに再起動する必要があります。
また、TOMCATに限るわけではありませんが、ページがキャッシュされてしまう ことがあるので、試験の場合はTOMCATの再起動と同時に、ブラウザの キャッシュをクリアするくせをつけた方がよいでしょう。

 実行時ログ

次のログがTomcatの管理フォルダ下のlogフォルダ(C:/Program Files/Apache Software Foundation/Tomcat 6.0/logなど)に出力されます。

catalina.xxx.log:Tomcat起動などに関するlog:web.xmlなどの記述ミスはここで分かります
tomcat6-stderr.xxx.log:サーブレットの標準エラー:サーブレットがSytem.errに出したエラーや、TomcatがSystem.errに出したメッセージがここに出ます
tomcat6-stdout.xxx.log:サーブレットの標準出力:サーブレットがSytem.outに出したエラーがここに出ます

ただし、設定によっては、各種エラー出力もtomcat6-stdout.xxx.logに出る場合があります。

ログの文字コード設定はWindowsでは"現実的には"できないことに注意が必要です。文字化けする場合 読む側で文字コードを選ぶ必要があります。

 サンプルのダウンロード

ソースとビルドキットの入ったsrvltHello.zipを置きます。

   build.xml        ANTビルドファイル
                    TomcatDirプロパティにTomcatの管理フォルダを指定してください
   web.xml   
  Hello_Srvlt.java javaコード
   A10_install.bat  antの呼び出し(ビルドして、インストールする)
   A00_clean.bat    antの呼び出し(このフォルダ上の2次ファイルを削除)
「右クリック-対象をファイルに保存」でダウンロードできます
Tomcatライブラリは含まれていません。

 セッションを使う例(サンプルDLあり)

セッションを使う例も載せておきます。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Hello_Srvlt extends HttpServlet {
   public void doGet(HttpServletRequest  request,
                     HttpServletResponse response)
                     throws IOException,
                            ServletException{
      request.setCharacterEncoding("UTF-8");              // 基本中の基本
      response.setCharacterEncoding("UTF-8");             // 基本中の基本
      response.setContentType("text/html; charset=UTF-8");// 基本中の基本
      HttpSession session= request.getSession();
      Integer c=(Integer)(session.getAttribute("C"));
      if( c!=null ) c= c+1;
      else          c= 0;
      session.setAttribute("C",c);
      PrintWriter out = response.getWriter();
      out.println("<html><head></head><body>");
      out.println("<form method='GET'"
                  +"action='"+request.getRequestURL()+"'>");
      out.println("<input type='submit' value='Click Me'>");
      out.println("</form>");
      if( (c%2)==0 ) out.println("<p>Hello World. ("+c+")</p>");
      else           out.println("<p>This is Servlet-test-02. ("+c+")</p>");
      out.println("</body></html>");
      }
   }
getSessionによりセッション情報を得、指定アトリビュートを取り出し、なければセットする という単純なものです。
ここでは単純なIntegerを登録していますが、もちろん複雑なクラスのインスタンスを 登録することもできます。

同じクラス名で同じweb.xmlによるマッピングを行いますが、build.xmlで インストール先をtest02としている

   <property name="project"    value="test02" />
ためURLは
   http://localhost:8080/test02/servlet/hello
でアクセスします。

「右クリック-対象をファイルに保存」でダウンロードできます

 ライブラリや補助ファイル(cssやイメージなど)を使う例(サンプルDLあり)

ライブラリや補助ファイルを使う例を載せます。
<form>を使わずJavascriptからGETを出す手法の説明を兼ねています。

この例ではotsuライブラリ(hiNote.jar)を使い、文字列の置き換えなどを行っています。
次のようなフォルダ構成をとっています。

   webapp
   |
   +-- test03
       | tmpl.html    HTMLテンプレート
       | hi_style.css CSSファイル
       |
       +-- images
       |      *.gif    ボタンなどのイメージファイル
       | 
       +-- (servlet) 仮のURL
       |   +--   (hello) 仮のURL
       |
       +-- WEB-INFO
           | web.xml  Tomcatのサーブレットマッピング
           |
           +--  lib  ライブラリ(本体Hello_Srvlt.jarとhiNote.jar

次のようなコードとなっています。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import otsu.hiNote.*;
public class Hello_Srvlt extends HttpServlet {
   public void doGet(HttpServletRequest  request,
                     HttpServletResponse response)
                     throws IOException,
                            ServletException{
      request.setCharacterEncoding("UTF-8");              // 基本中の基本
      response.setCharacterEncoding("UTF-8");             // 基本中の基本
      response.setContentType("text/html; charset=UTF-8");// 基本中の基本
      try{
         int            c    = hiU.atoi(request.getParameter("C"));
         BufferedReader br   = hiU.openTextFileR(
                                     getServletContext().getRealPath(".")
                                     +File.separator+"tmpl.html");
         String         html = "";
         String         line;
         while( (line=br.readLine())!=null ) html+=line+"\n";
         br.close();
         PrintWriter out = response.getWriter();
         out.println(hiU.replace(html
                         ,"url="+request.getRequestURL()
                         ,"msg="+((c%2)==0?"Hello World. ("+c+")"
                                       :"this is Servlet-test-03. ("+c+")")
                         ,"val="+(c+1)));
         System.err.println("HTML="+html);
         }
      catch(Exception e){throw new RuntimeException(e);}
      }
   }

getServletContext().getRealPath(".")で実フォルダ(ここではwebapp/test03)を取得 しています。
test03下に置いたtmpl.htmlファイルを読み込んで${url},${msg},${val}をhiU.replace関数で 置き換えています。
otsu.hiNoteのマニュアル、ダウンロードページは Otsuライブラリにあります。

テンプレートtmpl.htmlは次のようになっています。${xxx}はプログラムで 置き換えられます。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0.1//EN" "http://www.w3.org/TR/html4/strict.dtd">
<!-- saved from url=(0014)about:internet -->
<html lang="ja">
<head>
<meta http-equiv="Content-Type" Content="text/html;charset=UTF-8">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<link rel="Stylesheet" href="../hi_style.css" type="text/css">
<script type="text/javascript">
function doGet(n){ // JavascriptでGETを出す
   var url="${url}?C="+n;
   window.open(url,"_self",null,false); // 新しい窓を開かない
   }
</script>
</head>
<body style="background:#E0E0E0;">
<div class=bar>
<p style="color:white;position:relative;top:15px;">
 試験03</p>
</div>
<p>
${msg}
</p>
<a class=A1 href="javascript:doGet('${val}')">値送信</a>
<p style="background-color:#000050">
<br>
 <input class="B" type="button" value="ボタン1" onClick="doGet('1')"
       title="ボタン"
       style="width:80px">
 <input class="B2" type="button" value="ボタン2" onClick="doGet('2')"
       title="ボタン"
       style="width:80px">
 <input class="B3" type="button" value="ボタン3" onClick="doGet('3')"
       title="ボタン"
       style="width:80px">
 <input class="B4" type="button" value="ボタン4" onClick="doGet('4')"
       title="ボタン"
       style="width:80px">
<br><br>
</p>
</body>
</html>

ANTのbuild.batは次のようになっています。

<?xml version="1.0" encoding="UTF-8"?>
<!-- build.xml -->
<project default="main">
   <property name="TomcatDir"
      value="C:/Program Files/Apache Software Foundation/Tomcat 6.0/" />
   <property name="webappsDir"  value="${TomcatDir}/webapps" />
   <property name="classpath"  value="${TomcatDir}/lib/servlet-api.jar;
                                     ./hiNote.jar"/>

   <property name="project"    value="test03" />
   <property name="baseDir"    value="${webappsDir}/${project}" />
   <property name="installDir" value="${webappsDir}/${project}/WEB-INF" />

   <property name="MAIN"       value="Hello_Srvlt" />

   <target name="main" depends="clean,build,install">
      <echo>=== CLEAN BUILD and INSTALL done ===</echo>
   </target>
   <target name="build" depends="compile">
      <jar destfile="${MAIN}.jar" 
           basedir="." 
           includes="**/*.class" >
         <manifest>
            <attribute name="Main-Class" value="${MAIN}"/>
         </manifest>
      </jar>
   </target>
   <target name="compile">
      <javac srcdir           ="."
             includes         ="*.java"
             includeAntRuntime="false"
             encoding         ="UTF-8"
             debug="yes" optimize="no"
             classpath=".;${classpath}" />
   </target>
   <target name="install" depends="build">
      <copy file="${MAIN}.jar"  todir="${installDir}/lib/" overwrite="yes"/>
      <copy file="hiNote.jar"   todir="${installDir}/lib/" overwrite="yes"/>
      <copy file="web.xml"      todir="${installDir}/"     overwrite="yes"/>
      <copy file="hi_style.css" todir="${baseDir}/"        overwrite="yes"/>
      <copy file="tmpl.html"    todir="${baseDir}/"        overwrite="yes"/>
      <copy todir="${baseDir}/images" overwrite="yes">
          <fileset dir="images" />
      </copy>
   </target>
   <target name="clean">
      <delete dir="." includes="*.class,${MAIN}.jar,*.BAK"/>
   </target>
</project>

次の様な画面がでます。

「右クリック-対象をファイルに保存」でソースセットをダウンロードできます

 GETで日本語データ:JavaScript側とJava側(サンプルDLあり)

getParameter()では日本語を受け取ることはできません。 正確にいうと出来なくはないのですが文字コードハンドリングが混乱を極めるため、現実的ではありません。

日本語データをGETで流すJavascript側で直接クエリー文字列を作り、Java側でクエリー文字列の解析を行います。 日本語部はJavascript側ではencodeURIComponent()関数でエンコードし、Java側ではURLDecoder.decode()で でコードします

このサンプルでは次のような画面が出ます。ボタンをクリックするたびにサーバにGETが出され、2つの文字領域 の内容が入れ替わった画面に変わります。

テンプレートtmpl.htmlは次のようになっています。${xxx}はプログラムで 置き換えられます。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0.1//EN" "http://www.w3.org/TR/html4/strict.dtd">
<!-- saved from url=(0014)about:internet -->
<html lang="ja">
<head>
<meta http-equiv="Content-Type" Content="text/html;charset=UTF-8">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<link rel="Stylesheet" href="../hi_style.css" type="text/css">
<script type="text/javascript">
function $E(id){return document.getElementById(id);}
function $U(id){return encodeURIComponent($E(id).value);} 
function doGet(){  
   var url="${url}?T1="+$U("t1")+"&T2="+$U("t2");
   window.open(url,"_self",null,false);
   }
</script>
</head>
<body style="background:#E0E0E0;">
<h2>試験04</he>
<p>
<input id="t1" class="text" value="${msg1}"> 
<input id="t2" class="text" value="${msg2}"> 
<input class="B" type="button" value="送信" onClick="doGet()" style="width:80px">
<br><br>
</p>
</body>
</html>

Java側は次のようになっています。decodeQuery()関数でクエリー文字列を分割解析しています。 文字列をHTML上にセットするために"<"などのエスケープをxmlEscape()関数で行っています。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import otsu.hiNote.*;
import java.net.*;
import java.util.*;
public class Hello_Srvlt extends HttpServlet {
   static HashMap<String,String> decodeQuery(String queryStr)throws Exception{
      HashMap<String,String> ret=new HashMap<String,String>();
      if( !hiU.isNull(queryStr) ){
         String qsets[]=queryStr.split("&");
         for(String qset:qsets){
            String keyNval[]= qset.split("=");
            if( keyNval.length!=2 ) continue;
            ret.put(keyNval[0],URLDecoder.decode(keyNval[1],"UTF-8"));
            }
         }
      return ret;
      }
   static String xmlEscape(String str){
      return str.replaceAll("&","&amp;").replaceAll("<","&lt;")
                .replaceAll("\"","&quot;").replaceAll("'","&apos;");
      }
   public void doGet(HttpServletRequest  request,
                     HttpServletResponse response)
                     throws IOException,
                            ServletException{
      request.setCharacterEncoding("UTF-8");              // 基本中の基本
      response.setCharacterEncoding("UTF-8");             // 基本中の基本
      response.setContentType("text/html; charset=UTF-8");// 基本中の基本
      try{
         HashMap<String,String> qset=decodeQuery(request.getQueryString());
         String                 msg1= qset.get("T1");
         String                 msg2= qset.get("T2");
         if( msg1==null ) msg1="こんにちは";
         if( msg2==null ) msg2="日本語試験";
         BufferedReader br   = hiU.openTextFileR(getServletContext().getRealPath(".")
                                                 +File.separator+"tmpl.html");
         StringBuilder  sb   = new StringBuilder();
         String         line;
         while( (line=br.readLine())!=null ) sb.append(line).append("\n");
         br.close();
         PrintWriter out = response.getWriter();
         out.println(hiU.replace(sb.toString()
                            ,"url="+request.getRequestURL()
                            ,"msg1="+xmlEscape(msg2)
                            ,"msg2="+xmlEscape(msg1)));
         }
      catch(Exception e){throw new RuntimeException(e);}
      }
   }

「右クリック-対象をファイルに保存」でソースセットをダウンロードできます

クッキーはHttpServletRequest#getCookie()で取得できます。Cookieの配列が 得られらます。配列の中から必要データを探し出すことになります。

クッキーの設定は構築子で文字列を与えたCookieインスタンスを HttpServletResponse#addCookie()で設定します。
CookieインスタンスにはsetMaxAge()で有効期間を指定することができます。

Cookieには直接日本語は入りません。URLEncoder.encode(),URLDecoder.decode()でエンコード デコードします。BASE64エンコードを使っても構いません。

Javaのサンプルを以下に載せます。HTMLサンプルは前出のものと基本的に同じです。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import otsu.hiNote.*;
import java.net.*;
import java.util.*;
public class Hello_Srvlt extends HttpServlet {
   static HashMap<String,String> decodeQuery(String queryStr)throws Exception{
      HashMap<String,String> ret=new HashMap<String,String>();
      if( !hiU.isNull(queryStr) ){
         String qsets[]=queryStr.split("&");
         for(String qset:qsets){
            String keyNval[]= qset.split("=");
            if( keyNval.length!=2 ) continue;
            ret.put(keyNval[0],URLDecoder.decode(keyNval[1],"UTF-8"));
            }
         }
      return ret;
      }
   static String xmlEscape(String str){
      return str.replaceAll("&","&").replaceAll("<","<")
                .replaceAll("\"",""").replaceAll("'","'");
      }
   public void doGet(HttpServletRequest  request,
                     HttpServletResponse response)
                     throws IOException,
                            ServletException{
      request.setCharacterEncoding("UTF-8");              // 基本中の基本
      response.setCharacterEncoding("UTF-8");             // 基本中の基本
      response.setContentType("text/html; charset=UTF-8");// 基本中の基本
      try{
         HashMap<String,String> qset= decodeQuery(request.getQueryString());
         String                 msg1= qset.get("T1");
         String                 msg2= qset.get("T2");
         String                 msg3= null;
         Cookie cookies[] = request.getCookies();
         if (cookies != null){
            for(Cookie cookie:cookies){
               if (cookie.getName().equals("C1")){
                  msg3 = URLDecoder.decode(cookie.getValue(),"UTF-8");
                  }
               }
            }
         if( msg1==null ) msg1="こんにちは";
         if( msg2==null ) msg2="日本語試験";
         if( msg3==null ) msg3="クッキー試験";
         Cookie cookie = new Cookie("C1", URLEncoder.encode(msg2,"UTF-8"));
         cookie.setMaxAge(60);// 60秒間有効
         response.addCookie(cookie);
         BufferedReader br   = hiU.openTextFileR(getServletContext().getRealPath(".")
                                                 +File.separator+"tmpl.html");
         StringBuilder  sb   = new StringBuilder();
         String         line;
         while( (line=br.readLine())!=null ) sb.append(line).append("\n");
         br.close();
         PrintWriter out = response.getWriter();
         out.println(hiU.replace(sb.toString()
                            ,"url="+request.getRequestURL()
                            ,"msg1="+xmlEscape(msg3)
                            ,"msg2="+xmlEscape(msg1)));
         }
      catch(Exception e){throw new RuntimeException(e);}
      }
   }

「右クリック-対象をファイルに保存」でソースセットをダウンロードできます

 ###

2013/2/21:

  • ビルド説明をバッチからantに変えました。
  • 混乱防止のためHTMLからの呼び出し例を消しました。
  • classpathで指定する.jarをservlet.jarからservlet-api.jarに変更
  • 先頭に項目indexを置きました。
  • 補助ファイル参照の例を追加しました

 次の窓が開くまで待ちアニメを出す(サンプルDLのみあり)

説明はいずれ

「右クリック-対象をファイルに保存」でソースセットをダウンロードできます

|

« Ajax/PHPでhelloWorld改 | トップページ | JSPでhelloWorld改 »

トラックバック


この記事へのトラックバック一覧です: ServletでhelloWorld改(Tomcatの使い方):

« Ajax/PHPでhelloWorld改 | トップページ | JSPでhelloWorld改 »