JSPの最近のブログ記事
2011年4月14日
Tomcatエラーメッセージ(変数編)
Duplicate local variable 変数名
「Duplicate local variable 変数名」は同じ名前の変数を重複して宣言しているために起きるエラーです。
サンプル
<%@ page contentType="text/html; charset=Windows-31J"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>JSPサンプル</title> <meta http-equiv="content-type" content="text/html; charset=Windows-31J"> </head> <body> <p> <% int i = 10; int i = 20; //エラー発生 %> <%=i%> </p> </body> </html>
上記のjspファイルを実行すると下記のエラーが表示されます。
org.apache.jasper.JasperException: JSPのクラスをコンパイルできません JSPファイル: /Test1.jsp の中の11行目でエラーが発生しました 生成されたサーブレットのエラーです: Duplicate local variable i
12行目で変数iを宣言したのに、13行目でも同じ名前iで宣言しているため起きたエラーです。
javaでは同じ名前の変数を複数宣言することはできません。
※「11行目でエラーが発生しました」とあるが実際にエラーが起きているのは13行目です。
JSPの場合、エラーが含まれる<% %>開始タグの行番号が表示されるので注意が必要です。
対処法1
<%@ page contentType="text/html; charset=Windows-31J"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>JSPサンプル</title> <meta http-equiv="content-type" content="text/html; charset=Windows-31J"> </head> <body> <p> <% int i = 10; i = 20; //12行目で宣言されたiを使う %> <%=i%> </p> </body> </html>
対処法1の表示結果
20
対処法2
<%@ page contentType="text/html; charset=Windows-31J"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>JSPサンプル</title> <meta http-equiv="content-type" content="text/html; charset=Windows-31J"> </head> <body> <p> <% int i = 10; int j = 20; //iは12行目で宣言されてるので別名jで変数を宣言した %> <%=i%> </p> </body> </html>
対処法2の表示結果
10
変数名 cannot be resolved
「変数名 cannot be resolved」は宣言されていない変数を使用したために起きるエラーです。
サンプル
<%@ page contentType="text/html; charset=Windows-31J"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>JSPサンプル</title> <meta http-equiv="content-type" content="text/html; charset=Windows-31J"> </head> <body> <p> <% int i = 10; %> <%=j%> </p> </body> </html>
上記のjspファイルを実行すると下記のエラーが表示されます。
org.apache.jasper.JasperException: JSPのクラスをコンパイルできません JSPファイル: /Test2.jsp の中の14行目でエラーが発生しました 生成されたサーブレットのエラーです: j cannot be resolved
14行目で宣言されていない変数jを表示しようとしたため起きたエラーです。
対処法
<%@ page contentType="text/html; charset=Windows-31J"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>JSPサンプル</title> <meta http-equiv="content-type" content="text/html; charset=Windows-31J"> </head> <body> <p> <% int i = 10; int j = 20; //変数jを使う前に宣言・初期化する %> <%=j%> </p> </body> </html>
表示結果
20
The local variable 変数名 may not have been initialized
「The local variable 変数名 may not have been initialized」は初期化されていない変数を使用したために起きるエラーです。
サンプル
<%@ page contentType="text/html; charset=Windows-31J"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>JSPサンプル</title> <meta http-equiv="content-type" content="text/html; charset=Windows-31J"> </head> <body> <p> <% int j; %> <%=j%> </p> </body> </html>
上記のjspファイルを実行すると下記のエラーが表示されます。
org.apache.jasper.JasperException: JSPのクラスをコンパイルできません JSPファイル: /Test1.jsp の中の14行目でエラーが発生しました 生成されたサーブレットのエラーです: The local variable j may not have been initialized
14行目で初期化されていない変数jを表示しようとしたため起きたエラーです。
対処法
<%@ page contentType="text/html; charset=Windows-31J"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html> <head> <title>JSPサンプル</title> <meta http-equiv="content-type" content="text/html; charset=Windows-31J"> </head> <body> <p> <% int j = 20; //変数jに値をいれて初期化する %> <%=j%> </p> </body> </html>
表示結果
20
2011年2月19日
TOMCATの再起動をbatファイルで行う
サービスの再起動を「コントロールパネル>管理ツール>サービス」から行うのは面倒なので、batファイルから再起動させてみる。
基本ファイル
下記ファイルの9行目に再起動の対象サービス名、12行目にログの出力場所を記述し「任意の名前.bat」として保存します。(windowsで実行させるので作成ファイルの文字コードはShift-JISにします)
あとは再起動を行いたい時に作成したbatファイルをダブルクリックすれば処理が実行されます。
ちなみに今回はサービスが開始していない時も、再起動できるようにエラー時に処理を中止していません。処理を中止させたい時は、エラーログ出力後に「exit」してください。
@echo off rem ------------------------------------------------- rem サービスの再起動用batファイル rem ------------------------------------------------- rem # 再起動サービス名 set SERVICE="サービス名を記述" rem # ログ出力パス set LOG=出力パスを記述 rem # 実行日時出力 echo ---------- >> %LOG% date /t >> %LOG% time /t >> %LOG% rem # 対象サービス停止コマンド実施 net stop %SERVICE% >> %LOG% rem # 対象サービス停止エラー判定 if %errorlevel%==0 goto STOP_OK rem # エラー時 echo サービス終了時にエラーが発生しました。 >> %LOG% echo エラー番号:%errorlevel% >> %LOG% net helpmsg %errorlevel% >> %LOG% rem # 正常時 :STOP_OK echo 処理終了時刻 >> %LOG% time /t >> %LOG% echo. >> %LOG% rem # 対象サービス開始コマンド実施 net start %SERVICE% >> %LOG% if %errorlevel%==0 goto START_OK rem # エラー時 echo サービス開始時にエラーが発生しました。 >> %LOG% echo エラー番号:%errorlevel% >> %LOG% net helpmsg %errorlevel% >> %LOG% rem # 正常時 :START_OK echo 処理終了時刻 >> %LOG% time /t >> %LOG% echo. >> %LOG%
TOMCAT再起動用
例えば「Apache Tomcat」を再起動させ、ログファイルを「C:\restart_service.log」に出力するbatファイルは以下のような記述になります。
@echo off rem ------------------------------------------------- rem サービスの再起動用batファイル rem ------------------------------------------------- rem # 再起動サービス名 set SERVICE="Apache Tomcat" rem # ログ出力パス set LOG=C:\restart_service.log rem # 実行日時出力 echo ---------- >> %LOG% date /t >> %LOG% time /t >> %LOG% rem # 対象サービス停止コマンド実施 net stop %SERVICE% >> %LOG% rem # 対象サービス停止エラー判定 if %errorlevel%==0 goto STOP_OK rem # エラー時 echo サービス終了時にエラーが発生しました。 >> %LOG% echo エラー番号:%errorlevel% >> %LOG% net helpmsg %errorlevel% >> %LOG% rem # 正常時 :STOP_OK echo 処理終了時刻 >> %LOG% time /t >> %LOG% echo. >> %LOG% rem # 対象サービス開始コマンド実施 net start %SERVICE% >> %LOG% if %errorlevel%==0 goto START_OK rem # エラー時 echo サービス開始時にエラーが発生しました。 >> %LOG% echo エラー番号:%errorlevel% >> %LOG% net helpmsg %errorlevel% >> %LOG% rem # 正常時 :START_OK echo 処理終了時刻 >> %LOG% time /t >> %LOG% echo. >> %LOG%