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("&","&").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");
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);}
}
}
「右クリック-対象をファイルに保存」でソースセットをダウンロードできます
Javaでクッキーを設定/取得する(もちろん日本語)(サンプルDLあり)
クッキーは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のみあり)
説明はいずれ
「右クリック-対象をファイルに保存」でソースセットをダウンロードできます
| 固定リンク

