次の課題として、入力チェック時などのアラートの文言について直接ソースに書いてしまっているものをメッセージテーブルを新規に作り、メッセージコードを置き換えることでアラートの文言を変更できたり、
逆にメッセージテーブルの文言を修正することで同じメッセージコードが配置されているものについて反映されるように出来ないかを考えています。
現在のJSPでの構成でも上記のようにすることは可能でしょうか?
逆にメッセージテーブルの文言を修正することで同じメッセージコードが配置されているものについて反映されるように出来ないかを考えています。
現在のJSPでの構成でも上記のようにすることは可能でしょうか?
投稿:ばく[owada]/2006年 10月 24日 11時 35分
/更新:2006年 10月 24日 11時 35分
RE:アラート処理について
by 竹形 誠司[takegata]
メッセージコードをメッセージに変換するクラスを作ってJSPから呼び出すという方法はどうでしょう。
投稿:竹形 誠司[takegata]/2006年 10月 24日 15時 34分
/更新:2006年 10月 24日 15時 34分
こんばんは。
アイデアありがとうございます。
JSP側は、IF文で該当するエラーを選別し、クラス側にエラーコードを渡す。
クラス側は、JSP側から渡されたエラーコードを元に、SQL文でエラーコードから該当するメッセージをJSP側に返す。
こんな感じのですか?
アイデアありがとうございます。
JSP側は、IF文で該当するエラーを選別し、クラス側にエラーコードを渡す。
クラス側は、JSP側から渡されたエラーコードを元に、SQL文でエラーコードから該当するメッセージをJSP側に返す。
こんな感じのですか?
投稿:ばく[owada]/2006年 10月 24日 18時 36分
/更新:2006年 10月 24日 18時 36分
そんな感じでいいと思います。
ただ、ブラウザ上のJavaScriptからサーバ上のJavaクラスを呼び出すことは(普通の方法では)できないので、入力のチェックをJavaScriptで行う場合は、想定されるすべてのメッセージをあらかじめJavaScriptに埋め込んでおく必要があるんじゃないですかね。
Ajax等を使えばできるのかも知れませんが、私はまだ試したことがありません。
ただ、ブラウザ上のJavaScriptからサーバ上のJavaクラスを呼び出すことは(普通の方法では)できないので、入力のチェックをJavaScriptで行う場合は、想定されるすべてのメッセージをあらかじめJavaScriptに埋め込んでおく必要があるんじゃないですかね。
Ajax等を使えばできるのかも知れませんが、私はまだ試したことがありません。
投稿:竹形 誠司[takegata]/2006年 10月 24日 19時 00分
/更新:2006年 10月 24日 19時 02分
おはようございます。
入力のチェックで想定されるすべてのメッセージをあらかじめJavaScriptに
埋め込んでおくというのは、既に出来ていることだと思っています。
今のままだとエラーメッセージをコードから取得するということには繋がらないということですね。
現在のJSPにて行ってる一切の処理を別の形式(サーブレット?)で書き換えるなどして、
エラーの対象コードから別クラスでメッセージを呼び出し、返せるようにするという方法はあるのでしょうか?
Ajaxという名前しか聞いたことが無いのでちょっと調べてみます。
入力のチェックで想定されるすべてのメッセージをあらかじめJavaScriptに
埋め込んでおくというのは、既に出来ていることだと思っています。
今のままだとエラーメッセージをコードから取得するということには繋がらないということですね。
現在のJSPにて行ってる一切の処理を別の形式(サーブレット?)で書き換えるなどして、
エラーの対象コードから別クラスでメッセージを呼び出し、返せるようにするという方法はあるのでしょうか?
Ajaxという名前しか聞いたことが無いのでちょっと調べてみます。
投稿:ばく[owada]/2006年 10月 25日 09時 05分
/更新:2006年 10月 25日 09時 05分
JavaScriptに埋め込むところで、固定された文字列を使うのではなく、クラスからメソッド呼び出しによって取り込むということを言いたかったのですが・・・
投稿:竹形 誠司[takegata]/2006年 10月 25日 09時 23分
/更新:2006年 10月 25日 10時 24分
昨日、ブラウザ上のJavaScriptからサーバ上のJavaクラスを呼び出すことは(普通の方法では)できないとのことでしたが、
クラスが呼び出せないのにクラスからメソッド呼び出しによって取り込むというのはどういう事なのでしょうか?
JSP ⇒ クラス ⇒ メソッド
×
JSP ? クラス ⇒ メソッド
○
クラスが呼び出せないのにクラスからメソッド呼び出しによって取り込むというのはどういう事なのでしょうか?
JSP ⇒ クラス ⇒ メソッド
×
JSP ? クラス ⇒ メソッド
○
投稿:ばく[owada]/2006年 10月 25日 10時 23分
/更新:2006年 10月 25日 10時 25分
たとえば、こんな感じです。
<SCRIPT TYPE="javascript">
function funcCheck(){
if(document.form1.textbox1.value==""){
alert("<%=SomeClass.getMessage(ここにメッセージID)%>");
}
}
</SCRIPT>
JSPの話とJavaScriptの話が混ざっているようですが、これらは全く別ものですので、お間違えのないように。function funcCheck(){
if(document.form1.textbox1.value==""){
alert("<%=SomeClass.getMessage(ここにメッセージID)%>");
}
}
</SCRIPT>
投稿:竹形 誠司[takegata]/2006年 10月 25日 10時 26分
/更新:2006年 10月 25日 10時 26分
提示していただいたサンプルのように、想定されるエラーの数だけIF文を作り、
該当コードを元にメッセージを取得するということですか?
今までだとエラーを検出するためのIF文をJSPのHEAD部分に置いていたわけですが、
上記で示されたJavaScriptはどう設置すればいいのでしょうか?
また、getMessageとあるのでコードを元にメッセージテーブルから対象のメッセージを
取り出し、返す部分も必要になると推測できるのですが、
これはクラスで対応するのでしょうか?
理解が不十分なままでの質問で申し訳ありませんが、よろしくお願いします。
投稿:ばく[owada]/2006年 10月 25日 11時 07分
/更新:2006年 10月 25日 11時 07分
JavaScriptを置く場所はHEAD部分でいいと思います。
メッセージIDからメッセージへ変換する方法はいろいろ考えられると
思いますが、上に示した例ではあるクラスの中にIDを渡すとメッセージが
返されるようなメソッドを作って、それをJSPから呼び出すという感じです。
クラス名やメソッド名は例のとおりでなくても構いません。
メッセージIDからメッセージへ変換する方法はいろいろ考えられると
思いますが、上に示した例ではあるクラスの中にIDを渡すとメッセージが
返されるようなメソッドを作って、それをJSPから呼び出すという感じです。
クラス名やメソッド名は例のとおりでなくても構いません。
投稿:竹形 誠司[takegata]/2006年 10月 25日 12時 53分
/更新:2006年 10月 25日 12時 53分
少しずつ理解出来てきているような気がするので、再度確認させて下さい。
テキストボックスを配置しているJSPに、下記のJavaScriptを埋め込んだ時、
<SCRIPT TYPE="javascript">
function funcCheck(){
if(document.form1.textbox1.value==""){
alert("<%=SomeClass.getMessage(ここにメッセージID)%>");
}
}
</SCRIPT>
IF文の条件がtrueだった場合に、別のClassファイルのSomeClassクラスの
getMessageメソッドにIDを渡して、そのIDに該当するメッセージを見つけ出して、
JavaScriptに返す。
こういう認識でよろしいでしょうか?
テキストボックスを配置しているJSPに、下記のJavaScriptを埋め込んだ時、
<SCRIPT TYPE="javascript">
function funcCheck(){
if(document.form1.textbox1.value==""){
alert("<%=SomeClass.getMessage(ここにメッセージID)%>");
}
}
</SCRIPT>
IF文の条件がtrueだった場合に、別のClassファイルのSomeClassクラスの
getMessageメソッドにIDを渡して、そのIDに該当するメッセージを見つけ出して、
JavaScriptに返す。
こういう認識でよろしいでしょうか?
投稿:ばく[owada]/2006年 10月 25日 13時 45分
/更新:2006年 10月 25日 13時 45分
それがちょっと違うんですよ。
JavaScriptというのは、通常はブラウザ内で完結しているもので、サーバとの間で通信を行うことはありません。Ajaxなどの技術を使えばJavaScriptでもサーバとの通信を行うことはできるようですが、上のコードはそういったものではありません。
JavaScriptはHTMLデータの一部としてサーバからブラウザへ送られますが、その時点でJSPの変数はすべて文字列に置き換えられています。たとえば、
JavaScriptで条件を評価して、その結果に従ってサーバ側のクラスを呼び出しているのではありません。ですから、JavaScriptから値を受け取ってJavaのクラスに渡すということは(Ajaxなどを使わなければ)できません。
JavaScriptというのは、通常はブラウザ内で完結しているもので、サーバとの間で通信を行うことはありません。Ajaxなどの技術を使えばJavaScriptでもサーバとの通信を行うことはできるようですが、上のコードはそういったものではありません。
JavaScriptはHTMLデータの一部としてサーバからブラウザへ送られますが、その時点でJSPの変数はすべて文字列に置き換えられています。たとえば、
public class SomeClass{
public static String getMessage(String code){
String strReturn="";
if(code.equals("C001")){
strReturn="値が入っていません";
}
return strReturn;
}
}
のようなクラスがあって、JSPの中にpublic static String getMessage(String code){
String strReturn="";
if(code.equals("C001")){
strReturn="値が入っていません";
}
return strReturn;
}
}
<SCRIPT TYPE="javascript">
function funcCheck(){
if(document.form1.textbox1.value==""){
alert("<%=SomeClass.getMessage("C001")%>");
}
}
</SCRIPT>
のようなJavaScriptがあったとします。サーバからブラウザに送られる際に、この部分はfunction funcCheck(){
if(document.form1.textbox1.value==""){
alert("<%=SomeClass.getMessage("C001")%>");
}
}
</SCRIPT>
<SCRIPT TYPE="javascript">
function funcCheck(){
if(document.form1.textbox1.value==""){
alert("値が入っていません");
}
}
</SCRIPT>
になっているはずです(ブラウザ側でHTMLソースを表示してみれば確認できます)。つまり、JavaScriptでif文を評価したときにクラスのメソッドを呼び出すのではなく、予めメソッドの呼び出しによってコードからメッセージに置き換えられた文字列をJavaScriptに埋め込んでおいて、それをブラウザに送る、ということです。function funcCheck(){
if(document.form1.textbox1.value==""){
alert("値が入っていません");
}
}
</SCRIPT>
JavaScriptで条件を評価して、その結果に従ってサーバ側のクラスを呼び出しているのではありません。ですから、JavaScriptから値を受け取ってJavaのクラスに渡すということは(Ajaxなどを使わなければ)できません。
投稿:竹形 誠司[takegata]/2006年 10月 25日 15時 48分
/更新:2006年 11月 11日 22時 02分
やっと理解出来たような気がします。
結果が分かってからエラーを取りに行くのではなく、
先にエラーの一覧を待機させておいてから結果に出たものを
その場で取るということですね。
ということは、メッセージテーブルを作る必要は無く、
想定されるエラーを列挙したクラスファイルを
作ればいいということですね。
試してみます。
結果が分かってからエラーを取りに行くのではなく、
先にエラーの一覧を待機させておいてから結果に出たものを
その場で取るということですね。
ということは、メッセージテーブルを作る必要は無く、
想定されるエラーを列挙したクラスファイルを
作ればいいということですね。
試してみます。
投稿:ばく[owada]/2006年 10月 25日 16時 36分
/更新:2006年 10月 25日 16時 36分
提示していただいたサンプルを元に確認してみたのですが、
JSP側でクラス名のところがエラーになってしまいました。
どのような原因が考えられるでしょうか?
---------- ChangeMessage.java ----------
public class ChangeMessage{
public static String getMessage(String code){
String strReturn="";
if(code.equals("e001")){
strReturn="何も入力されていません。";
}
return strReturn;
}
}
---------- Name_Insert_Form.jsp ----------
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%
//JDBCドライバを登録
Class.forName("com.mysql.jdbc.Driver");
//データベース接続文字列を作成
String strConn = "jdbc:mysql://localhost/Sample"
+ "?user=user1&password=password"
+ "&useUnicode=true&characterEncoding=cp932";
//コネクションオブジェクトを取得
Connection conn = DriverManager.getConnection(strConn);
//ステートメントオブジェクトを取得
Statement stmt = conn.createStatement();
//SQLコマンドを作成
String strSql = "SELECT * FROM items";
//問い合わせを実行してリザルトセットを取得
ResultSet rs = stmt.executeQuery(strSql);
%>
<!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">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
<SCRIPT TYPE="text/javascript"><!--
function check(){
var x=0;
for(i=0;i<3;i++){
var a1=document.form1.Co_Item[i].value;
var b1=document.form1.Item_Name[i].value;
var c1=document.form1.Price[i].value;
if(a1=="" && b1=="" && c1==""){
x=x+1;
if(x==3){
alert("<%=ChangeMessage.getMessage("e001")%>");
document.form1.Co_Item[0].focus();
return false;
}
}else if(a1==""){
alert((i+1)+"レコード目のアイテムコードが空欄です。");
document.form1.Co_Item[i].focus() ;
return false;
}else if(b1==""){
alert((i+1)+"レコード目のアイテム名が空欄です。");
document.form1.Item_Name[i].focus() ;
return false;
}else if(c1==""){
alert((i+1)+"レコード目の単価が空欄です。");
document.form1.Price[i].focus() ;
return false;
}else if(isNaN(a1)){
alert((i+1)+"レコード目のアイテムコードが半角数字ではありません。");
document.form1.Co_Item[i].focus();
return false;
}else if(isNaN(c1)){
alert((i+1)+"レコード目の単価が半角数字ではありません。");
document.form1.Price[i].focus();
return false;
}
}
}
</SCRIPT>
</HEAD><BODY>
<H1>名称テーブル登録</H1>
<FORM METHOD="post">
<DIV CLASS="section">
<TABLE CLASS ="itemlist">
<%="名称テーブル"%>
<TR><TH>アイテムコード</TH><TH>アイテム名</TH></TR>
<%while(rs.next()){%>
<TR><TD CLASS ="C3"><%=rs.getString("co_item")%></TD><TD CLASS ="C3"><%=rs.getString("item_name")%></TD></TR>
<%}
stmt.close();
conn.close();
%>
</TABLE>
</DIV>
</FORM>
<FORM NAME="form1" ACTION="Name_Insert_Confirm.jsp" METHOD="post" ONSUBMIT="return check();">
<DIV CLASS="section">
<TABLE>
<%="登録フォーム"%>
<TR><TH>アイテムコード</TH><TH>アイテム名</TH><TH>単価</TH></TR>
<TR><TD><INPUT TYPE="text" MAXLENGTH="4" NAME="Co_Item"></TD><TD><INPUT TYPE="text" MAXLENGTH="10" NAME="Item_Name"></TD><TD><INPUT TYPE="text" MAXLENGTH="7" NAME="Price"></TD></TR>
<TR><TD><INPUT TYPE="text" MAXLENGTH="4" NAME="Co_Item"></TD><TD><INPUT TYPE="text" MAXLENGTH="10" NAME="Item_Name"></TD><TD><INPUT TYPE="text" MAXLENGTH="7" NAME="Price"></TD></TR>
<TR><TD><INPUT TYPE="text" MAXLENGTH="4" NAME="Co_Item"></TD><TD><INPUT TYPE="text" MAXLENGTH="10" NAME="Item_Name"></TD><TD><INPUT TYPE="text" MAXLENGTH="7" NAME="Price"></TD></TR>
</TABLE>
<INPUT TYPE="submit" VALUE="確 認">
<INPUT TYPE="button" VALUE="戻 る" ONCLICK="location.href='Menu.jsp'">
</FORM>
</DIV>
</BODY></HTML>
org.apache.jasper.JasperException: JSPのクラスをコンパイルできません
JSPファイル: /Name_Insert_Form.jsp の中の36行目でエラーが発生しました
生成されたサーブレットのエラーです:
ChangeMessage cannot be resolved
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
原因
org.apache.jasper.JasperException: JSPのクラスをコンパイルできません
JSPファイル: /Name_Insert_Form.jsp の中の36行目でエラーが発生しました
生成されたサーブレットのエラーです:
ChangeMessage cannot be resolved
org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:84)
org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:328)
org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:409)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:297)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:276)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:264)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:563)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:303)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
JSP側でクラス名のところがエラーになってしまいました。
どのような原因が考えられるでしょうか?
---------- ChangeMessage.java ----------
public class ChangeMessage{
public static String getMessage(String code){
String strReturn="";
if(code.equals("e001")){
strReturn="何も入力されていません。";
}
return strReturn;
}
}
---------- Name_Insert_Form.jsp ----------
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%
//JDBCドライバを登録
Class.forName("com.mysql.jdbc.Driver");
//データベース接続文字列を作成
String strConn = "jdbc:mysql://localhost/Sample"
+ "?user=user1&password=password"
+ "&useUnicode=true&characterEncoding=cp932";
//コネクションオブジェクトを取得
Connection conn = DriverManager.getConnection(strConn);
//ステートメントオブジェクトを取得
Statement stmt = conn.createStatement();
//SQLコマンドを作成
String strSql = "SELECT * FROM items";
//問い合わせを実行してリザルトセットを取得
ResultSet rs = stmt.executeQuery(strSql);
%>
<!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">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
<SCRIPT TYPE="text/javascript"><!--
function check(){
var x=0;
for(i=0;i<3;i++){
var a1=document.form1.Co_Item[i].value;
var b1=document.form1.Item_Name[i].value;
var c1=document.form1.Price[i].value;
if(a1=="" && b1=="" && c1==""){
x=x+1;
if(x==3){
alert("<%=ChangeMessage.getMessage("e001")%>");
document.form1.Co_Item[0].focus();
return false;
}
}else if(a1==""){
alert((i+1)+"レコード目のアイテムコードが空欄です。");
document.form1.Co_Item[i].focus() ;
return false;
}else if(b1==""){
alert((i+1)+"レコード目のアイテム名が空欄です。");
document.form1.Item_Name[i].focus() ;
return false;
}else if(c1==""){
alert((i+1)+"レコード目の単価が空欄です。");
document.form1.Price[i].focus() ;
return false;
}else if(isNaN(a1)){
alert((i+1)+"レコード目のアイテムコードが半角数字ではありません。");
document.form1.Co_Item[i].focus();
return false;
}else if(isNaN(c1)){
alert((i+1)+"レコード目の単価が半角数字ではありません。");
document.form1.Price[i].focus();
return false;
}
}
}
</SCRIPT>
</HEAD><BODY>
<H1>名称テーブル登録</H1>
<FORM METHOD="post">
<DIV CLASS="section">
<TABLE CLASS ="itemlist">
<%="名称テーブル"%>
<TR><TH>アイテムコード</TH><TH>アイテム名</TH></TR>
<%while(rs.next()){%>
<TR><TD CLASS ="C3"><%=rs.getString("co_item")%></TD><TD CLASS ="C3"><%=rs.getString("item_name")%></TD></TR>
<%}
stmt.close();
conn.close();
%>
</TABLE>
</DIV>
</FORM>
<FORM NAME="form1" ACTION="Name_Insert_Confirm.jsp" METHOD="post" ONSUBMIT="return check();">
<DIV CLASS="section">
<TABLE>
<%="登録フォーム"%>
<TR><TH>アイテムコード</TH><TH>アイテム名</TH><TH>単価</TH></TR>
<TR><TD><INPUT TYPE="text" MAXLENGTH="4" NAME="Co_Item"></TD><TD><INPUT TYPE="text" MAXLENGTH="10" NAME="Item_Name"></TD><TD><INPUT TYPE="text" MAXLENGTH="7" NAME="Price"></TD></TR>
<TR><TD><INPUT TYPE="text" MAXLENGTH="4" NAME="Co_Item"></TD><TD><INPUT TYPE="text" MAXLENGTH="10" NAME="Item_Name"></TD><TD><INPUT TYPE="text" MAXLENGTH="7" NAME="Price"></TD></TR>
<TR><TD><INPUT TYPE="text" MAXLENGTH="4" NAME="Co_Item"></TD><TD><INPUT TYPE="text" MAXLENGTH="10" NAME="Item_Name"></TD><TD><INPUT TYPE="text" MAXLENGTH="7" NAME="Price"></TD></TR>
</TABLE>
<INPUT TYPE="submit" VALUE="確 認">
<INPUT TYPE="button" VALUE="戻 る" ONCLICK="location.href='Menu.jsp'">
</FORM>
</DIV>
</BODY></HTML>
org.apache.jasper.JasperException: JSPのクラスをコンパイルできません
JSPファイル: /Name_Insert_Form.jsp の中の36行目でエラーが発生しました
生成されたサーブレットのエラーです:
ChangeMessage cannot be resolved
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
原因
org.apache.jasper.JasperException: JSPのクラスをコンパイルできません
JSPファイル: /Name_Insert_Form.jsp の中の36行目でエラーが発生しました
生成されたサーブレットのエラーです:
ChangeMessage cannot be resolved
org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:84)
org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:328)
org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:409)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:297)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:276)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:264)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:563)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:303)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
投稿:ばく[owada]/2006年 10月 25日 17時 20分
提示していただいたサンプルを元に確認してみたのですが、
Name_Insert_Form.jspに異動するところで
クラス名がエラーだとなってしまいました。
どのような原因が考えられるでしょうか?
---------- ChangeMessage.java ----------
public class ChangeMessage{
public static String getMessage(String code){
String strReturn="";
if(code.equals("e001")){
strReturn="何も入力されていません。";
}
return strReturn;
}
}
---------- Name_Insert_Form.jsp ----------
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%
//JDBCドライバを登録
Class.forName("com.mysql.jdbc.Driver");
//データベース接続文字列を作成
String strConn = "jdbc:mysql://localhost/Sample"
+ "?user=user1&password=password"
+ "&useUnicode=true&characterEncoding=cp932";
//コネクションオブジェクトを取得
Connection conn = DriverManager.getConnection(strConn);
//ステートメントオブジェクトを取得
Statement stmt = conn.createStatement();
//SQLコマンドを作成
String strSql = "SELECT * FROM items";
//問い合わせを実行してリザルトセットを取得
ResultSet rs = stmt.executeQuery(strSql);
%>
<!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">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
<SCRIPT TYPE="text/javascript"><!--
function check(){
var x=0;
for(i=0;i<3;i++){
var a1=document.form1.Co_Item[i].value;
var b1=document.form1.Item_Name[i].value;
var c1=document.form1.Price[i].value;
if(a1=="" && b1=="" && c1==""){
x=x+1;
if(x==3){
alert("<%=ChangeMessage.getMessage("e001")%>");
document.form1.Co_Item[0].focus();
return false;
}
}else if(a1==""){
alert((i+1)+"レコード目のアイテムコードが空欄です。");
document.form1.Co_Item[i].focus() ;
return false;
}else if(b1==""){
alert((i+1)+"レコード目のアイテム名が空欄です。");
document.form1.Item_Name[i].focus() ;
return false;
}else if(c1==""){
alert((i+1)+"レコード目の単価が空欄です。");
document.form1.Price[i].focus() ;
return false;
}else if(isNaN(a1)){
alert((i+1)+"レコード目のアイテムコードが半角数字ではありません。");
document.form1.Co_Item[i].focus();
return false;
}else if(isNaN(c1)){
alert((i+1)+"レコード目の単価が半角数字ではありません。");
document.form1.Price[i].focus();
return false;
}
}
}
</SCRIPT>
</HEAD><BODY>
<H1>名称テーブル登録</H1>
<FORM METHOD="post">
<DIV CLASS="section">
<TABLE CLASS ="itemlist">
<%="名称テーブル"%>
<TR><TH>アイテムコード</TH><TH>アイテム名</TH></TR>
<%while(rs.next()){%>
<TR><TD CLASS ="C3"><%=rs.getString("co_item")%></TD><TD CLASS ="C3"><%=rs.getString("item_name")%></TD></TR>
<%}
stmt.close();
conn.close();
%>
</TABLE>
</DIV>
</FORM>
<FORM NAME="form1" ACTION="Name_Insert_Confirm.jsp" METHOD="post" ONSUBMIT="return check();">
<DIV CLASS="section">
<TABLE>
<%="登録フォーム"%>
<TR><TH>アイテムコード</TH><TH>アイテム名</TH><TH>単価</TH></TR>
<TR><TD><INPUT TYPE="text" MAXLENGTH="4" NAME="Co_Item"></TD><TD><INPUT TYPE="text" MAXLENGTH="10" NAME="Item_Name"></TD><TD><INPUT TYPE="text" MAXLENGTH="7" NAME="Price"></TD></TR>
<TR><TD><INPUT TYPE="text" MAXLENGTH="4" NAME="Co_Item"></TD><TD><INPUT TYPE="text" MAXLENGTH="10" NAME="Item_Name"></TD><TD><INPUT TYPE="text" MAXLENGTH="7" NAME="Price"></TD></TR>
<TR><TD><INPUT TYPE="text" MAXLENGTH="4" NAME="Co_Item"></TD><TD><INPUT TYPE="text" MAXLENGTH="10" NAME="Item_Name"></TD><TD><INPUT TYPE="text" MAXLENGTH="7" NAME="Price"></TD></TR>
</TABLE>
<INPUT TYPE="submit" VALUE="確 認">
<INPUT TYPE="button" VALUE="戻 る" ONCLICK="location.href='Menu.jsp'">
</FORM>
</DIV>
</BODY></HTML>
org.apache.jasper.JasperException: JSPのクラスをコンパイルできません
JSPファイル: /Name_Insert_Form.jsp の中の36行目でエラーが発生しました
生成されたサーブレットのエラーです:
ChangeMessage cannot be resolved
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
原因
org.apache.jasper.JasperException: JSPのクラスをコンパイルできません
JSPファイル: /Name_Insert_Form.jsp の中の36行目でエラーが発生しました
生成されたサーブレットのエラーです:
ChangeMessage cannot be resolved
org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:84)
org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:328)
org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:409)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:297)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:276)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:264)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:563)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:303)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
</TEXTAREA>
<BR>
<INPUT TYPE="submit" VALUE="OK">
<INPUT TYPE="button" VALUE="キャンセル" ONCLICK="history.back()">
<SCRIPT TYPE="text/javascript"><!--
function funcRefer(){
objWin=window.open("refer.jsp","sub","width=620,height=550");
}
//--></SCRIPT>
</FORM>
</DIV>
</DIV><!--end of main contents-->
<DIV class="bottom">
JaMyTo Forum
</DIV>
</BODY></HTML>
Name_Insert_Form.jspに異動するところで
クラス名がエラーだとなってしまいました。
どのような原因が考えられるでしょうか?
---------- ChangeMessage.java ----------
public class ChangeMessage{
public static String getMessage(String code){
String strReturn="";
if(code.equals("e001")){
strReturn="何も入力されていません。";
}
return strReturn;
}
}
---------- Name_Insert_Form.jsp ----------
<%@ page contentType="text/html; charset=Windows-31J"%>
<%@ page import="java.sql.*"%>
<%
//JDBCドライバを登録
Class.forName("com.mysql.jdbc.Driver");
//データベース接続文字列を作成
String strConn = "jdbc:mysql://localhost/Sample"
+ "?user=user1&password=password"
+ "&useUnicode=true&characterEncoding=cp932";
//コネクションオブジェクトを取得
Connection conn = DriverManager.getConnection(strConn);
//ステートメントオブジェクトを取得
Statement stmt = conn.createStatement();
//SQLコマンドを作成
String strSql = "SELECT * FROM items";
//問い合わせを実行してリザルトセットを取得
ResultSet rs = stmt.executeQuery(strSql);
%>
<!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">
<LINK REL="stylesheet" TYPE="text/css" HREF="style.css">
<SCRIPT TYPE="text/javascript"><!--
function check(){
var x=0;
for(i=0;i<3;i++){
var a1=document.form1.Co_Item[i].value;
var b1=document.form1.Item_Name[i].value;
var c1=document.form1.Price[i].value;
if(a1=="" && b1=="" && c1==""){
x=x+1;
if(x==3){
alert("<%=ChangeMessage.getMessage("e001")%>");
document.form1.Co_Item[0].focus();
return false;
}
}else if(a1==""){
alert((i+1)+"レコード目のアイテムコードが空欄です。");
document.form1.Co_Item[i].focus() ;
return false;
}else if(b1==""){
alert((i+1)+"レコード目のアイテム名が空欄です。");
document.form1.Item_Name[i].focus() ;
return false;
}else if(c1==""){
alert((i+1)+"レコード目の単価が空欄です。");
document.form1.Price[i].focus() ;
return false;
}else if(isNaN(a1)){
alert((i+1)+"レコード目のアイテムコードが半角数字ではありません。");
document.form1.Co_Item[i].focus();
return false;
}else if(isNaN(c1)){
alert((i+1)+"レコード目の単価が半角数字ではありません。");
document.form1.Price[i].focus();
return false;
}
}
}
</SCRIPT>
</HEAD><BODY>
<H1>名称テーブル登録</H1>
<FORM METHOD="post">
<DIV CLASS="section">
<TABLE CLASS ="itemlist">
<%="名称テーブル"%>
<TR><TH>アイテムコード</TH><TH>アイテム名</TH></TR>
<%while(rs.next()){%>
<TR><TD CLASS ="C3"><%=rs.getString("co_item")%></TD><TD CLASS ="C3"><%=rs.getString("item_name")%></TD></TR>
<%}
stmt.close();
conn.close();
%>
</TABLE>
</DIV>
</FORM>
<FORM NAME="form1" ACTION="Name_Insert_Confirm.jsp" METHOD="post" ONSUBMIT="return check();">
<DIV CLASS="section">
<TABLE>
<%="登録フォーム"%>
<TR><TH>アイテムコード</TH><TH>アイテム名</TH><TH>単価</TH></TR>
<TR><TD><INPUT TYPE="text" MAXLENGTH="4" NAME="Co_Item"></TD><TD><INPUT TYPE="text" MAXLENGTH="10" NAME="Item_Name"></TD><TD><INPUT TYPE="text" MAXLENGTH="7" NAME="Price"></TD></TR>
<TR><TD><INPUT TYPE="text" MAXLENGTH="4" NAME="Co_Item"></TD><TD><INPUT TYPE="text" MAXLENGTH="10" NAME="Item_Name"></TD><TD><INPUT TYPE="text" MAXLENGTH="7" NAME="Price"></TD></TR>
<TR><TD><INPUT TYPE="text" MAXLENGTH="4" NAME="Co_Item"></TD><TD><INPUT TYPE="text" MAXLENGTH="10" NAME="Item_Name"></TD><TD><INPUT TYPE="text" MAXLENGTH="7" NAME="Price"></TD></TR>
</TABLE>
<INPUT TYPE="submit" VALUE="確 認">
<INPUT TYPE="button" VALUE="戻 る" ONCLICK="location.href='Menu.jsp'">
</FORM>
</DIV>
</BODY></HTML>
org.apache.jasper.JasperException: JSPのクラスをコンパイルできません
JSPファイル: /Name_Insert_Form.jsp の中の36行目でエラーが発生しました
生成されたサーブレットのエラーです:
ChangeMessage cannot be resolved
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:375)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
原因
org.apache.jasper.JasperException: JSPのクラスをコンパイルできません
JSPファイル: /Name_Insert_Form.jsp の中の36行目でエラーが発生しました
生成されたサーブレットのエラーです:
ChangeMessage cannot be resolved
org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:84)
org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:328)
org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:409)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:297)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:276)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:264)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:563)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:303)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)
javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
</TEXTAREA>
<BR>
<INPUT TYPE="submit" VALUE="OK">
<INPUT TYPE="button" VALUE="キャンセル" ONCLICK="history.back()">
<SCRIPT TYPE="text/javascript"><!--
function funcRefer(){
objWin=window.open("refer.jsp","sub","width=620,height=550");
}
//--></SCRIPT>
</FORM>
</DIV>
</DIV><!--end of main contents-->
<DIV class="bottom">
JaMyTo Forum
</DIV>
</BODY></HTML>
投稿:ばく[owada]/2006年 10月 25日 17時 24分
/更新:2006年 10月 25日 17時 24分
ChangeMessageのクラスパスが通っていないことが原因でしょう。
次のようにpackage名を指定してみてください。
このファイルをWEB-INF/classesの下に置いて
次にJSPの上の方に、このパッケージを使えるように次の行を追加します。
次のようにpackage名を指定してみてください。
package test1;
public class ChangeMessage{
public static String getMessage(String code){
String strReturn="";
if(code.equals("e001")){
strReturn="何も入力されていません。";
}
return strReturn;
}
}
test1は別の名前でもOKです。public class ChangeMessage{
public static String getMessage(String code){
String strReturn="";
if(code.equals("e001")){
strReturn="何も入力されていません。";
}
return strReturn;
}
}
このファイルをWEB-INF/classesの下に置いて
javac -d . ChangeMessage.java
でコンパイルします。-d .(ハイフン ディー ドット)が大事です。このオプションをつけてコンパイルすると、WEB-INF/classesの下にパッケージ名(test1)のディレクトリが自動的に作成され、その下にChangeMessage.classというファイルができるはずです。まずこれができたかどうかを確認してください。次にJSPの上の方に、このパッケージを使えるように次の行を追加します。
<%@ page import="test1.*"%>
最後にアプリケーションをリロード(またはTomcatを再起動)します。
投稿:竹形 誠司[takegata]/2006年 10月 25日 18時 33分
/更新:2006年 10月 25日 18時 33分
おはようございます。
動作確認できましたのでご報告致します。
先週まで取り組んでいたPDF出力のバッチファイル内のjavaファイル名を変更して実行したら、
javaファイルと同じフォルダ内にクラスファイルが出来て何でなんだろうと疑問に思っていました。
クラスファイルは意図したファイル内に作れ、メッセージも問題なく表示できるようになりました。
ありがとうございました。
動作確認できましたのでご報告致します。
先週まで取り組んでいたPDF出力のバッチファイル内のjavaファイル名を変更して実行したら、
javaファイルと同じフォルダ内にクラスファイルが出来て何でなんだろうと疑問に思っていました。
クラスファイルは意図したファイル内に作れ、メッセージも問題なく表示できるようになりました。
ありがとうございました。
投稿:ばく[owada]/2006年 10月 26日 09時 39分
/更新:2006年 10月 26日 09時 39分