Search results for 'jsp'

Unable to compile class for JSP

2011/03/22 03:09

서비 JAVA , ,

java / jsp 개발 시 거의 보기 어려운 익셉션으로 대게 아래와 같은 익셉션을 출력한다.
[code]
org.apache.jasper.JasperException: Unable to compile class for JSP:

An error occurred at line: 3 in the jsp file: /src/test/test.jsp
Employee cannot be resolved to a type
1: <%@ page language="java" import="java.util.*,com.employee.*" pageEncoding="ISO-8859-1"%>
2: <%
3: Employee ddd = new Employee();
4: %>
[/code]

익셉션 출력물 그대로 jsp 파일을 .class 파일로 검파일 하지 못했다는 의미이다. 왜 그럴까?
예상하건데 첫 번째 라인의 import 내용과 3번째 라인의 클래스 생성코드를 삭제하고 실행하면 페이지가 열릴 것이다.
그럼, 이 예외상황은 import한 클래스를 찾지 못한 것인가? 그렇지 않다. import 가 잘못되었다면 NoSuchClassFound 같은 익셉션을 보게 될 것이다.

위와 같은 오류를 만나면 아래 jsp를 적당한 이름으로 저장한 후 컨텍스트 루트, 즉 WEB-INF 디렉토리가 있는 경로에 소스를 올리고 jsp를 호출해 보자.
[code]
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   <html>  
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
sun.boot.class.path : <%= System.getProperty("sun.boot.class.path") %>
sun.boot.library.path : <%= System.getProperty("sun.boot.library.path") %>
java.library.path : <%= System.getProperty("java.library.path") %>
java.class.path : <%= System.getProperty("java.class.path") %>
getClassLoader() : <%= this.getClass().getClassLoader() %>
DocumentBuilderFactory : <%= javax.xml.parsers.DocumentBuilderFactory.newInstance() %>
/javax/xml.parsers/DocumentBuilderFactory.class : <%= this.getClass().getResource("/javax/xml.parsers/DocumentBuilderFactory.class") %>
SAXParserFactory : <%= javax.xml.parsers.SAXParserFactory.newInstance() %>
/javax/xml/parsers/SAXParserFactory.class : <%= this.getClass().getResource("/javax/xml/parsers/SAXParserFactory.class") %>
TransformerFactory : <%= javax.xml.transform.TransformerFactory.newInstance() %>
/javax/xml/transform/TransformerFactory.class : <%= this.getClass().getResource("/javax/xml/transform/TransformerFactory.class") %>
<hr>
Servlet : <%= application.getMajorVersion() %>.<%= application.getMinorVersion() %>
JSP : <%= javax.servlet.jsp.JspFactory.getDefaultFactory().getEngineInfo().getSpecificationVersion() %>
ServerInfo : <%= application.getServerInfo() %>
RealPath : <%= application.getRealPath("/") %>
ContextPath : <%= request.getContextPath()%>
<hr>
totalMemory : <%= Runtime.getRuntime().totalMemory() %>
maxMemory : <%= Runtime.getRuntime().maxMemory() %>
freeMemory : <%= Runtime.getRuntime().freeMemory() %>
<hr>
    </body>
</html>
[/code]
위 소스를 실행하면 몇몇 중요한 정보를 얻을 수 있는데 그중에 request.getContextPath() 값을 한번 확인해 보자.
개발 시 의도했던 컨텍스트 루트가 아닐 가능성이 크다.
컨텍스트 루트가 의도했던 루트와 다르다면 웹서버든.. WAS든 host 설정과 관계된 설정파일을 보면서 해당 문제를 교정하면 된다.
원인은 컨텍스트가 다름으로 인해 import한 클래스를 클래스로더가 찾을 수 없어 발생하는 현상이다.

한가지 팁이라면 톰켓 + 가상호스트로  구성한 웹 어플리케이션의 컨텍스트 루트가 / 라면  [CATALINA_HOME]/conf/Catalina/[HOST_NAME]/ROOT.xml 의
Context 항목의 docBase는 "[웹어플리케이션경로]/ROOT" 와 같이 설정되어야 하고, 웹어플리케이션의 또한 [웹어플리케이션경로]/ROOT/  아래에 배포되어야  한다.

2011/03/22 03:09 2011/03/22 03:09
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. Blog Icon
    김진규

    와 진짜 정말 도움 많이됐습니다 ... 이 문제였어요 ㅠㅠ

Tomcat/JSP와 한글 문제...

◎ Tomcat 4.x
단순히 JSP 혹은 서블릿의 최 상단에 request.setCharacterEncoding("euc-kr");을 하면 된다.
GET과 POST 방식에 상관없이 인코딩을 해준다.


◎ Tomcat 5.x
POST 방식은 request.setCharacterEncoding("euc-kr");로 계속 하면된다.
하지만 GET 방식은 server.xml의 설정 부분을 바꿔줘야만 한다.

Server.xml 보기



위에서 URIEncoding="euc-kr" 부분이다.그리고 아래의 port="8009" 부분은 mod_jk를 이용해서 Apache와 Tomcat 5.x 를 연동할 때 URIEncoding="euc-kr"을 지정할 필요가 있다.

URIEncoding으로 지정할 경우, 만약 웹 어플리케이션이 EUC-KR과 UTF-8을 각 요청 별로 따로 처리할 필요가 있을경우 그에 대응할 수 없다. 대신, useBodyEncodingForURI="true"을 사용하면 Tomcat 4.x와 동일한 방식으로 즉, request.setCharacterEncoding() 값에 따라 GET/POST 방식 모두를 처리할 수도 있다. (참조 : http://tomcat.apache.org/tomcat-5.5-doc/config/http.html)

결론적으로 Tomcat 4.x와 Tomcat 5.x 는 모두 request.setCharacterEncoding()이 필요하다는 사실에는 변함이 없다.
2007/03/20 11:38 2007/03/20 11:38
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다