jsp, mysql 연동 정말 죽겠습니다.

thisrule의 이미지

우분투 edgy에서 jsp을 공부하고 있습니다.
패키지에서 apache2, java6, tomcat5.5, mysql5.0를 설치하고
jsp화면 뜨는것도 보고, java로 mysql접속하는 프로그램까지 성공했습니다.

그런데 jsp에서 mysql접속이 되질않습니다. ㅠ.ㅠ
그리고 tomcat이 내뿜는 error message는 정말 알아보기 힘들더군요.
아래 JSP프로그램과 에러메제지를 보시고 도움주시기 바랍니다.

DriverTest.jsp

<%@page contentType="text/html;charset=euc-kr" import="java.sql.*"%>
<%
    Connection con;
    Statement stmt;
 
    try
    {
        Class.forName( "org.gjt.mm.mysql.Driver" ).newInstance();
        con = DriverManager.getConnection( "jdbc:mysql://localhost/mydb",
             "user", "passwd" );
        stmt = con.createStatement();
        con.close();
 
        out.println( "mysql jdbc test: connect ok!!" );
    }
    catch( Exception ex )
    {
        out.println( ex.getMessage() );
    }
%>

error 메세지

HTTP Status 500 -
 
type Exception report
 
message
 
description The server encountered an internal error () that prevented it from fulfilling this request.
 
exception
 
org.apache.jasper.JasperException: Exception in JSP: /ch09/DriverTest.jsp:9
 
6: 	try
7: 	{
8: 		Class.forName( "org.gjt.mm.mysql.Driver" ).newInstance();
9: 		con = DriverManager.getConnection( "jdbc:mysql://localhost/mydb", "user", "passwd" );
10: 		stmt = con.createStatement();
11: 		con.close();
12: 
 
 
Stacktrace:
	org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:504)
	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)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:243)
	java.security.AccessController.doPrivileged(Native Method)
	javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
	org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:275)
	org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:161)
 
root cause
 
javax.servlet.ServletException: Could not initialize class com.mysql.jdbc.CharsetMapping
	org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:858)
	org.apache.jasper.runtime.PageContextImpl.access$11(PageContextImpl.java:796)
	org.apache.jasper.runtime.PageContextImpl$12.run(PageContextImpl.java:778)
	java.security.AccessController.doPrivileged(Native Method)
	org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:776)
	org.apache.jsp.ch09.DriverTest_jsp._jspService(DriverTest_jsp.java:68)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
	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)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:243)
	java.security.AccessController.doPrivileged(Native Method)
	javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
	org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:275)
	org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:161)
 
root cause
 
java.lang.NoClassDefFoundError: Could not initialize class com.mysql.jdbc.CharsetMapping
	com.mysql.jdbc.Connection.this(Connection.java:1174)
	com.mysql.jdbc.Connection.<init>(Connection.java:1404)
	com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)
	java.sql.DriverManager.getConnection(DriverManager.java:582)
	java.sql.DriverManager.getConnection(DriverManager.java:185)
	org.apache.jsp.ch09.DriverTest_jsp._jspService(DriverTest_jsp.java:51)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
	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)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:243)
	java.security.AccessController.doPrivileged(Native Method)
	javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
	org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:275)
	org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:161)
 
note The full stack trace of the root cause is available in the Apache Tomcat/5.5 logs.
Apache Tomcat/5.5
익명사용자의 이미지

에러를 보면 JDBC 드라이버 클래스 초기화가 안된다는 말인데, 해당 클래스 경로를 다시 한번 점검해 보시기 바랍니다.

thisrule의 이미지

클래스 경로 점검은 어떻게 하나요? classpath를 말씀하시나요?

그런데 제가 아래와 같은 DriverTest.java 파일을 만들어 compile 후 실행하면 잘 되거등요?
(compile할때 warning은 뜨지만요)
암튼 실행이 잘 되면 classpath가 잘 설정되어 있는거 아닌가요?

한번 봐주세요

shell> cat DriverTest.java
import java.sql.*;
 
public class DriverTest
{
   public static void main( String args[] )
   {
      Connection con;
 
      try {
         Class.forName( "org.gjt.mm.mysql.Driver" ).newInstance();
         con = ( DriverManager.getConnection "jdbc:mysql://localhost/mydb", 
                 "user", "passwd" );
         System.out.println( "Success!" );
      }
      catch( Exception ex )
      {
         System.out.println( "Exception:" + ex );
      }
   }
}
 
 
shell> javac DriverTest.java
----------
1. WARNING in DriverTest.java (at line 7)
        Connection con;
                   ^^^
The local variable con is never read
----------
1 problem (1 warning)
 
 
shell> java DriverTest
Success!
stadia의 이미지

mysql 드라이버 jar 파일을 tomcat 의 common/lib 밑에 놓고 사용해보세요.
그리고 요즘 드라이버는 이름은 org.gjt.mm.mysql.Driver 를 안 쓸텐데요
com.mysql.jdbc.Driver 를 사용하세요.

Necromancer의 이미지

JDK 1.5, 1.6을 쓰신다면 WEB-INF/lib나 common/lib 아래에 놓아도 소용없습니다.
톰캣 시동거는 스크립트를 직정 수정해서 톰캣 시작시 해당 jar 파일을 강제로 인식하도록 해 줘야 합니다.

그리고 NoClassDefFoundError는 클래스 못찾았다는 에러메시지가 맞습니다.
먼저 사용하는 JDK가 1.5 이후인지 확인하시고,
컴파일할때의 classpath와 실행되는 톰캣의 classpath는 엄연히 다르니 이것 반드시 확인하십시오.
톰캣에 적용되는 classpath 확인할려면 톰캣 시동스크립트를 좀 손 봐야 할겁니다.
그리고 1.4까지는 jar 파일들을 모아놓은 경로를 classpath에 적용되어도 jar 파일을
모두 자동으로 찾았는데, 1.5이후부터는 JAR파일은 classpath에 해당 파일명까지 명시 해줘야 적용됩니다.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

endofhope의 이미지

쓰고 계신 mysql jdbc driver인
어쩌구.jar를 웹 컨택스트의 WEB-INF/lib 밑에 넣어 주시고 다시 시도해 보시면 될 듯합니다.

말해질 수 있는 것은 분명하게 말해질 수 있다;
말할 수 없는 것에 대해서는 침묵해야한다.
논리철학논고 - 루드비히 비트겐슈타인

--
말할 수 있는 것은 분명하게 말해질 수 있다;
말해질 수 없는 것에 대해서는 침묵해야한다.
논리철학논고 - 루드비히 비트겐슈타인

thisrule의 이미지

우분투 패키지 libmysql-java를 설치하면 생기는 mysql-3.1.11.jar 파일을
WEB-INF/lib에 복사하고 해도 마찬가지입니다.
혹시 몰라 WEB-INF/lib/ext에 복사해도 안됩니다.

에러 메세지가 조금 달라졌는데...
이런 많은 내용을 자꾸 올리려니 제 자신이 싫어지는 군요. 휴~
어쨌든 에러 메세지 한번 봐주세요.

HTTP Status 500 -
 
type Exception report
 
message
 
description The server encountered an internal error () that prevented it from fulfilling this request.
 
exception
 
org.apache.jasper.JasperException: Could not initialize class com.mysql.jdbc.CharsetMapping
	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)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:243)
	java.security.AccessController.doPrivileged(Native Method)
	javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
	org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:275)
	org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:161)
 
root cause
 
javax.servlet.ServletException: Could not initialize class com.mysql.jdbc.CharsetMapping
	org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:858)
	org.apache.jasper.runtime.PageContextImpl.access$11(PageContextImpl.java:796)
	org.apache.jasper.runtime.PageContextImpl$12.run(PageContextImpl.java:778)
	java.security.AccessController.doPrivileged(Native Method)
	org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:776)
	org.apache.jsp.ch09.DriverTest_jsp._jspService(DriverTest_jsp.java:68)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
	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)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:243)
	java.security.AccessController.doPrivileged(Native Method)
	javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
	org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:275)
	org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:161)
 
root cause
 
java.lang.NoClassDefFoundError: Could not initialize class com.mysql.jdbc.CharsetMapping
	com.mysql.jdbc.Connection.this(Connection.java:1174)
	com.mysql.jdbc.Connection.<init>(Connection.java:1404)
	com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266)
	java.sql.DriverManager.getConnection(DriverManager.java:582)
	java.sql.DriverManager.getConnection(DriverManager.java:185)
	org.apache.jsp.ch09.DriverTest_jsp._jspService(DriverTest_jsp.java:51)
	org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)
	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)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:243)
	java.security.AccessController.doPrivileged(Native Method)
	javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
	org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:275)
	org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:161)
김운하의 이미지

/etc/hosts를 보시면

127.0.0.1 localhost
127.0.0.1 hostname.domain.com hostname
---------

처럼 되어있을 경우
(hostname과 domain.com은 설치하실 때 지정한 값)

hostname에 해당하는 127.0.0.1을 실제 IP주소로 고쳐준 후에 재부팅하면

갑자기 되는 경우도 있더군요.

질문글 올라온 지 몇 달이 지났지만 혹시 다른 분이 볼까 해서 글 남깁니다.

익명 사용자의 이미지

소스코드에서 localhost 에서 127.0.0.1 로 변경해 보세요
아니면 MySQL 서버에서 127.0.0.1 접속을 허용하도록 호스트 권한을 변경.

M.W.Park의 이미지

필요한 곳에서 다음으로 확인해보면 됩니다.

System.getProperty("java.class.path");

WAS 실행환경과 command line은 확실히 다릅니다.

-----
오늘 나의 취미는 끝없는, 끝없는 인내다. 1973 法頂

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

김운하의 이미지

중복해서 글을 올려서 죄송합니다. 갑자기 또 다른 경우가 생각이 나서요.

저같은 경우, 보안 권한에 걸려서 실행이 안 되는 경우도 있더군요.

JDBC파일인 mysql-3.1.xx.jar파일을 /common/lib 에 넣으면 괜찮지만
(ubuntu에서는 /usr/share/tomcat5/common/lib/ 이네요.)

이것을 자기가 짠 어플리케이션의 /WEB-INF/lib/ 에 넣은 경우 혹은
DB 연결에 관련된 클래스를 /WEB-INF/classes/에 넣은 경우에는
보안에 걸려서 실행이 안 됩니다.

해결책은 http://tomcat.apache.org/tomcat-5.5-doc/security-manager-howto.html 을 참조하시면 됩니다.

영어가 껄끄러우실 경우에 대비해서 한글로 간략하게나마 설명 드리면..
자기가 짠 프로그램이 깔리는 디렉토리의 딸려있는 모든 하위 디렉토리에 대해서
모든 권한을 허용하면 됩니다.

구체적인 예를 들어서 ABCD.war 이라는 프로그램이

/usr/share/tomcat5/webapps/ 아래에 ABCD 디렉토리에 설치될 경우
/usr/share/tomcat5/webapps/ABCD/ 및 그 하위 디렉토리에 대해서 모든 권한을 허가합니다.

netbeans 5.5로 개발할 경우 생성되는 war파일을 설치하면 생성되는 디렉토리구조에 따르면
/usr/share/tomcat5/webapps/ABCD/
/usr/share/tomcat5/webapps/ABCD/WEB-INF/classes/
/usr/share/tomcat5/webapps/ABCD/WEB-INF/lib/
이 기본적으로 생성되는 데 다시 그 하위 디렉토리까지 모두 권한을 허가했습니다.

구체적으로 예를 들면,

~> vi /etc/tomcat5/policy.d/ABCD.policy (빈 파일에 다음 내용을 추가한다.)
-------------------- /etc/tomcat5/policy.d/ABCD.policy의 내용 ---------------
grant codeBase "file:${catalina.home}/webapps/ABCD/-" {
permission java.security.AllPermission;
};

grant codeBase "file:${catalina.home}/webapps/ABCD/WEB-INF/classes/-" {
permission java.security.AllPermission;
};

grant codeBase "file:${catalina.home}/webapps/ABCD/WEB-INF/lib/-" {
permission java.security.AllPermission;
};

grant codeBase "file:${catalina.home}/webapps/ABCD/WEB-INF/classes/library/-" {
permission java.security.AllPermission;
};
------------------------------------- 끝 -------------------------------------

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.