アプリ版:「スタンプのみでお礼する」機能のリリースについて

表題のことをしたいのですが、
「HTTPステータス 500 - An exception occurred processing JSP page」という
エラー表示がされてしまいます。

名前、会社、住所というテキストボックスに入力して
決定ボタンを押下するとデータベースにレコード追加されるのを
目的としていますが、下記のコードで間違いはありますでしょうか?
-----------------------------------------------
<%@ page language="java" %>
<%@ page import="java.sql.*"%>
<%@ page contentType="text/html; charset=Shift_JIS"%>
<%
request.setCharacterEncoding("Shift_JIS");
String strName=request.getParameter("name");
String strCompany=request.getParameter("company");
String strAddress=request.getParameter("address");
Class.forName("com.mysql.jdbc.Driver");
String strConn="jdbc:mysql://localhost/***" +
"?user=****&password=****" +
"&useUnicode=true&characterEncoding=Shift_JIS";

Connection conn = DriverManager.getConnection(strConn);
Statement stmt = conn.createStatement();

String strSql="insert into person (name,company,address) values('"+strName + "'," + strCompany + "'," + strAddress + ")";
int result= stmt.executeUpdate(strSql);
stmt.close();
conn.close();
%>
<%//一覧ページにforward%>
<jsp:forward page="****.jsp"/>
-----------------------------------------------
>int result= stmt.executeUpdate(strSql); の行でエラーが出ているっぽいのですが。。。

TomcatとMySQLを使用しています。
※環境など情報が不足していましたら、そちらもご指摘ください。
 開発勉強中で、まだ理解が足りていない所が多数あります。

A 回答 (4件)

よかった、これからも頑張って!



経験値いっぱい貯めればエラーなんかもすぐ当たりが付くようになるよ。
    • good
    • 0
この回答へのお礼

ありがとうございます。
励みになります!!

お礼日時:2014/11/24 12:23

まず、基本的なことを学んでからDBに手を出したほうがいいんじゃない?



>db cannot be resolved
>conn cannot be resolved to a variable
>conn cannot be resolved

読んでそのままの意味。
そんな変数しらんわって言ってるの。

PreparedStatement strSql=db.prepareStatement("INSERT INTO person(name,company,address) VALUES(?,?,?,?)");
dbってどこに宣言してるの?
connをtry{}の中に入れたらfinally{}では使えないよ?
変数のスコープについて調べよう。

SQLに手を出す前の話だよ。

エラーメッセージはかなり親切。
それすら読み取ろうとしないならこの先上達しない。

この回答への補足

>>db cannot be resolved
>>conn cannot be resolved to a variable
>>conn cannot be resolved
>読んでそのままの意味。
>そんな変数しらんわって言ってるの。

色んなサイトで調べてるうちに訳わからんようになってました。
dbから直前の行で宣言しているconnに修正すると上手くいきました。

>connをtry{}の中に入れたらfinally{}では使えないよ?
>変数のスコープについて調べよう。

try, catch, finallyを少し調べると、ダメだった理由が分かりました。

全体的に下記のように修正し、例外処理など課題はまだありますが
とりあえずの目的は達成できました。
ありがとうございました。

--------------------------------------
<%@ page language="java" %>
<%@ page import="java.sql.*,java.util.*,java.text.*"%>
<%@ page contentType="text/html; charset=Shift_JIS"%>
<%
request.setCharacterEncoding("Shift_JIS");
String strName=request.getParameter("name");
String strCompany=request.getParameter("company");
String strAddress=request.getParameter("address");
Class.forName("com.mysql.jdbc.Driver");

String strConn="jdbc:mysql://localhost/****" +
"?user=****&password=****" +
"&useUnicode=true&characterEncoding=Shift_JIS";

Connection conn = DriverManager.getConnection(strConn);

try{
PreparedStatement strSql=conn.prepareStatement("INSERT INTO person(name,company,address) VALUES(?,?,?)");

strSql.setString(1,request.getParameter("name"));
strSql.setString(2,request.getParameter("company"));
strSql.setString(3,request.getParameter("address"));

strSql.executeUpdate();

}catch(SQLException e){
out.println("コネクションがありません");

}finally{
conn.close();
}
%>
<%//一覧ページにforward%>
<jsp:forward page="****.jsp"/>

補足日時:2014/11/20 22:31
    • good
    • 0

エラー内容をまずは貼る。


エラーエラー言っても何のエラーかわかるだけで回答しやすい。

PreparedStatement strSql=db.prepareStatement("INSERT INTO person(name,company,address) VALUES(?,?,?)");

strSql.setString(1,request.getParameter("id"));
strSql.setString(2,request.getParameter("name"));
strSql.setString(3,request.getParameter("company"));
strSql.setString(4,request.getParameter("address"));


で、?の数とセットしている数がおかしいのは気づかない?

あと例外処理がどうおこなわれてるかわからないけど
コネクションとかのリソースの開放をfinally内で実行したほうがいいよ。

この回答への補足

ご指摘ありがとうございます。

>で、?の数とセットしている数がおかしいのは気づかない?

すみません、直しましたがそれでもエラーが出てしまいます。
※内容は以下です。

>あと例外処理がどうおこなわれてるかわからないけど
コネクションとかのリソースの開放をfinally内で実行したほうがいいよ。

こちらも追加してみましたが、やはりエラーが出ます。

お手数ですが、ご教示お願いします。

<エラー内容>-------------------------------------------

type 例外レポート
メッセージ JSPのクラスをコンパイルできません:
説明 The server encountered an internal error that prevented it from fulfilling this request.
例外
org.apache.jasper.JasperException: JSPのクラスをコンパイルできません:

JSPファイル: /hhh/add_person2.jsp の中の25行目でエラーが発生しました
db cannot be resolved
22: Connection conn = DriverManager.getConnection(strConn);
23:
24: //プレースホルダで SQL 作成
25: PreparedStatement strSql=db.prepareStatement("INSERT INTO person(name,company,address) VALUES(?,?,?,?)");
26: //SQLコマンド文字列を作成
27: strSql.setString(1,request.getParameter("id"));
28: strSql.setString(2,request.getParameter("name"));

JSPファイル: /hhh/add_person2.jsp の中の39行目でエラーが発生しました
conn cannot be resolved to a variable
36:
37: }finally{
38: try{
39: if(conn!=null){conn.close();}
40: }catch(SQLException e){
41: e.printStackTrace();
42: }

JSPファイル: /hhh/add_person2.jsp の中の39行目でエラーが発生しました
conn cannot be resolved
36:
37: }finally{
38: try{
39: if(conn!=null){conn.close();}
40: }catch(SQLException e){
41: e.printStackTrace();
42: }

Stacktrace:
org.apache.jasper.compiler.DefaultErrorHandler.javacError(DefaultErrorHandler.java:103)
org.apache.jasper.compiler.ErrorDispatcher.javacError(ErrorDispatcher.java:199)
org.apache.jasper.compiler.JDTCompiler.generateClass(JDTCompiler.java:446)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:361)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:336)
org.apache.jasper.compiler.Compiler.compile(Compiler.java:323)
org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:564)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:357)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:405)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:349)
javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

<ソースコード>-------------------------------------------
<%@ page language="java" %>
<%@ page import="java.sql.*,java.util.*,java.text.*"%>
<%@ page contentType="text/html; charset=Shift_JIS"%>
<%
request.setCharacterEncoding("Shift_JIS");
String strName=request.getParameter("name");
String strCompany=request.getParameter("company");
String strAddress=request.getParameter("address");
Class.forName("com.mysql.jdbc.Driver");

try{
String strConn="jdbc:mysql://localhost/****" +
"?user=****&password=****" +
"&useUnicode=true&characterEncoding=Shift_JIS";
Connection conn = DriverManager.getConnection(strConn);

PreparedStatement strSql=db.prepareStatement("INSERT INTO person(name,company,address) VALUES(?,?,?,?)");
strSql.setString(1,request.getParameter("id"));
strSql.setString(2,request.getParameter("name"));
strSql.setString(3,request.getParameter("company"));
strSql.setString(4,request.getParameter("address"));
strSql.executeUpdate();

}catch(SQLException e){
out.println("コネクションがありません");

}finally{
try{
if(conn!=null){conn.close();}
}catch(SQLException e){
e.printStackTrace();
}
}
%>
<%//一覧ページにforward%>
<jsp:forward page="****.jsp"/>

補足日時:2014/11/19 22:30
    • good
    • 0

strCompany の左側と strAddress の両側にカンマが無いように見えます。



またこのような方法でSQLを組み立てるのは望ましい方法ではありません。
preparedStatementでプレースホルダを使用しましょう。

この回答への補足

ありがとうございます。
色々調べて、セキュリティや効率の観点でpreparedStatementで組むのが良いと
理解しました。

ですが、前述のコードをpreparedStatementで作成したところ、
エラーになってしまいます。
色々試してロジックとしても、おかしくはないかと思っていますが
間違いなどありましたら、またご指摘お願いします。
--------------------------------------------------
<%@ page language="java" %>
<%@ page import="java.sql.*,java.util.*,java.text.*"%>
<%@ page contentType="text/html; charset=Shift_JIS"%>
<%

request.setCharacterEncoding("Shift_JIS");
String strName=request.getParameter("name");
String strCompany=request.getParameter("company");
String strAddress=request.getParameter("address");
Class.forName("com.mysql.jdbc.Driver");

String strConn="jdbc:mysql://localhost/****" +
"?user=****&password=****" +
"&useUnicode=true&characterEncoding=Shift_JIS";
Connection conn = DriverManager.getConnection(strConn);

PreparedStatement strSql=db.prepareStatement("INSERT INTO person(name,company,address) VALUES(?,?,?)");

strSql.setString(1,request.getParameter("id"));
strSql.setString(2,request.getParameter("name"));
strSql.setString(3,request.getParameter("company"));
strSql.setString(4,request.getParameter("address"));

strSql.executeUpdate();
conn.close();
%>
<%//一覧ページにforward%>
<jsp:forward page="****.jsp"/>

補足日時:2014/11/18 22:48
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!