jsp, mysql 연동 정말 죽겠습니다.
글쓴이: thisrule / 작성시간: 수, 2007/04/04 - 10:42오전
우분투 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
Forums:
JDBC경로를 잘못 지정한거 같은데요.
에러를 보면 JDBC 드라이버 클래스 초기화가 안된다는 말인데, 해당 클래스 경로를 다시 한번 점검해 보시기 바랍니다.
클래스 경로라는게 무엇인지요?
클래스 경로 점검은 어떻게 하나요? classpath를 말씀하시나요?
그런데 제가 아래와 같은 DriverTest.java 파일을 만들어 compile 후 실행하면 잘 되거등요?
(compile할때 warning은 뜨지만요)
암튼 실행이 잘 되면 classpath가 잘 설정되어 있는거 아닌가요?
한번 봐주세요
드라이버 jar를 톰캣 밑에
mysql 드라이버 jar 파일을 tomcat 의 common/lib 밑에 놓고 사용해보세요.
그리고 요즘 드라이버는 이름은 org.gjt.mm.mysql.Driver 를 안 쓸텐데요
com.mysql.jdbc.Driver 를 사용하세요.
JDK 1.5, 1.6을 쓰신다면
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
쓰고 계신 mysql jdbc
쓰고 계신 mysql jdbc driver인
어쩌구.jar를 웹 컨택스트의 WEB-INF/lib 밑에 넣어 주시고 다시 시도해 보시면 될 듯합니다.
말해질 수 있는 것은 분명하게 말해질 수 있다;
말할 수 없는 것에 대해서는 침묵해야한다.
논리철학논고 - 루드비히 비트겐슈타인
--
말할 수 있는 것은 분명하게 말해질 수 있다;
말해질 수 없는 것에 대해서는 침묵해야한다.
논리철학논고 - 루드비히 비트겐슈타인
그래도 ㅠ.ㅠ
우분투 패키지 libmysql-java를 설치하면 생기는 mysql-3.1.11.jar 파일을
WEB-INF/lib에 복사하고 해도 마찬가지입니다.
혹시 몰라 WEB-INF/lib/ext에 복사해도 안됩니다.
에러 메세지가 조금 달라졌는데...
이런 많은 내용을 자꾸 올리려니 제 자신이 싫어지는 군요. 휴~
어쨌든 에러 메세지 한번 봐주세요.
/etc/hosts파일을 만져주면 되는 경우도 있더군요.
/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
소스코드에서 localhost 에서 127.0.0.1 로 변경해 보세요
아니면 MySQL 서버에서 127.0.0.1 접속을 허용하도록 호스트 권한을 변경.
runtime의 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;
};
------------------------------------- 끝 -------------------------------------
댓글 달기