java.lang.NoClassDefFoundError: org/apache/jsp 에러에 대해서 알아보자


결론부터 말하자면 jsp파일을 컴파일 하고 저장된 java파일과 class파일의 이름이 jsp파일의 이름을 바꿨는데도 시스템에서 수정되지 않아 생기는 오류이다.

에러를 자세히 보면 jsp 폴더 안에 있는 board/boardWrite_jsp 파일이 wrong name: org/apache/jsp/board/BoardWrite_jsp 

즉,  잘못된 이름의 파일이 저장되어 있다는 뜻으로 해석 가능하다. 이를 해결하기 위해 



서버를 더블 클릭 한뒤



그림과 같이 Open launch configuration을 클릭.



Arguments를 클릭 한 뒤 Dctalina. base나 Dctalina.home 의 파일 경로를 복사 한뒤 파일을 열어 붙여 넣기 한다.

그러고 난뒤 work->Catalina -> localhost -> 자신이 하고 있는 프로젝트명의 파일 -> org -> apache -> jsp  순으로 파일을 이동한다.

C:\Users\kim\Downloads\apache-tomcat-9.0.10\apache-tomcat-9.0.10\work\Catalina\localhost\start_project\org\apache\jsp

    빨간색 글자로 표시한 부분이 각자의 파일을 차이점이 될 것이다. 
이제 jsp 파일안에 들어있는 java파일과 class파일들을 삭제한뒤 다시 컴파일을 실행시키면 오류가 해결 될 것이다.


Initializing Java Tooling' has encountered a problem

오류에 대해서 알아보자.

이와 같은 에러는 프로젝트 파일을 외부에서 가져와서 import 후 사용할 경우 종종 발생한다.

해결방법은 \프로젝트폴더(workspace)경로\.metadata\.plugins\org.eclipse.core.resources\.projects의 하위폴더를 모두 삭제한 뒤 

이클립스를 재부팅하면 된다. (이때 Problems occurred while trying to save the state of the workbench라는 오류가 뜨면 OK!를 누르면 된다)


재부팅하면 아까 지웠던 .projects 폴더 내 하위폴더가 자동으로 재생성 되는데 이때 systemTemp 파일을 생성하지 못하는 경우에는 Could not write metadata for '/RemoteSystemsTempFiles' 라는 오류메시지가 또 뜨면 마지막 project 폴더에 RemoteSystemsTempFiles 이름으로 폴더를 하나 생성해주면 해결된다.


참고 : https://hunit.tistory.com/193

C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib 의 경로에 있는 파일에


ojdbc5.jar 는 Oracle 8i, 9i,& 10g  ojdbc6.jar 는 Oracle 11g이상의 버전을 의미한다.

 

JSP에서 JDBC 커넥션 풀을 설정 할 때 잘 알고 사용해야겠다.


다음은 JDBC 커넥션 풀을 설정하는 방법이다.


먼저 server.xml에서 Resource 태그를 추가한다.


driverClassName, url, username, passowrd 등은 우리가 디비 연결시 필수적으로 필요했던 항목이고

maxActive는 미리 생성해놀 커넥션의 수이다.

maxWiat의 경우 미리 생성한 커넥션 이상의 요청이 들어왔을 때 추가로 커넥션을 생성할 때 최대 기다릴 수 

있는 시간을 설정하는 것이다. 즉 timeout 을 설정

type은 커넥션을 관리하는 DataSource이다.


MemberDAO 클래스는 싱글턴 패턴(Singleton Pattern 디자인 패턴의 일종) 으로 클래스를 설계한다.


MemberDAO 클래스의 getConnection() 메소드로 커넥션 객체를 얻어내는지 확인하기 위한 테스트 JSP 파일을 만들어서 확인한다.






starting tomcat v9.0 server at localhost has encountered a problem


서버를 작동하는데 필요한 시간이 초과되어서 뜨는 오류이다.



Servers -> Tomcat v9.0 Server at localhost 를 더블 클릭해준다.



탭중에 Timeouts 를 선택하여 시간을 늘리면 된다. 20~30초 사이로 시간을 늘려보자.


JSP의 전체적인 흐름에 대해서 정리해 보려고 한다. 

  맨 처음에는 사용자(클라이언트)가 화면에서 동작을 하면 FrontController로 들어가게 된다. FrontController는 사용자의 입력을 구분하는 하나의 다리라고 생각하면

  파일은 Servlet으로 만들며 경로를 *.do로 지정해 모든 .do입력들을 받아오게 된다. 



받아온 값들을 GET이나 POST 둘다 actiondo라는 메소드로 연결하여 받아온 url 값을 잘게 잘라 어디의 동작을 받아왔는지 확인 한 후 이벤트를 실행하게 된다.

각각 받아온 값들을 구분 한뒤 FrontController 서블릿이 작업을 직접 처리 하지 않고, 해당 클래스가 처리하도록 하는데 이것이 Command 패턴이 되겠다. 각 Command는 하나 이상의 동작을 수행해기 위해서 하나의 공통된 클래스를 인터페이스하여 사용하면 깔끔하게 사용할 수 있다. 


여러 개의 클래스가 기능 별로 생성 될 것이고 이 클래스들 안에서 이제 진짜 기능을 수행하는 Dao 객체를 만들게 된다.

DAO는 데이터베이스에 접속해서 데이터 추가,삭제,수정 등의 작업을 하는 클래스로서 일반적인 JSP 혹은 Servlet 페이지내에 로직을 함께 기술할 수 도 있지만, 유지보수 및 코드의 모듈화를 위해 별도의 DAO 클래스를 만들어 사용하는 것이 일반적이라고한다.


이렇게 DAO 클래스에서는 DAO 생성자에 ORACLE 데이터베이스에 접근하는 로직을 넣어 모든 클래스 메소드가 사용할 수 있게 하는 것이 편리한 방법이다. 각 메소드들은 Command로부터 받은 pharameter 들을 활용해 사용자가 원하는 데이터를 반환해 준다. 이 때 DTO를 거치는 것도 잊지 않아야 한다. DTO는

DAO클래스를 이용하여 데이터 베이스에서 데이터를 관리할 때 데이터를 일반적인 변수에 할당하여 작업 할 수도 있지만, 해당 데이터의 클래스를 만들어 사용하는 것이 MVC 모델의 가장 기본이기 때문에 MVC모델에서 M(Model)을 담당하고 있는 부분이 되겠다.


 can not find the tag library descriptor for "http://java.sun.com 에러는 jstl과 연관이 있다. jstl을 사용하려면 선언해야 하는 것이기 때문이다. tomcat v6.0과 v7.0에서는 아무런 문제가 없지만 tomcat v8.0부터는 위와 같이 선언할 때 에러가 발생한다. 

 이를 해결하기 위해서는 아래와 같은 파일을 WebContent -> WEB-INF -> lib 파일에 넣어주어야 한다

 파일은 아래에 첨부해 놓겠다.

이제 파일을 넣고 저장을 다시 하면 에러가 사라지게 된다.


jstl.jar

standard.jar




MVC 패턴은 M(Model) V(View) C(Controller)로 구성이 된다. 알기 쉽게 얘기 하자면 M은 데이터베이스, V는 우리가 눈으로 보는 화면, C는 동작을 하는 기능들로 말할 수 있다. M은 Servlet JAVA파일로 만들고 C도 마찬가지 JAVA, V는 JSP로 만드는 것이 일반적이다. 


두 가지 형태로 MVC 모델을 나누는데 Model1은 비교적 작은 프로젝트에 빠른 시일내에 프로그램을 만들기 위해 사용한다. Model2는 큰 프로젝트에 적용한다.


Model1은 빠르게 프로그램을 만들 수 있다는 장점이 있지만 유지보수에서는 힘들 수 있다. 보는 것과 같이 뷰와 컨트롤러가 같이 있다는 것을 볼 수 있다.


Model2는 모듈화를 통해서 프로그램을 만들기 때문에 유지보수를 Model1에 비해 훨씬 쉽게 할 수 있다.



프로그램을 설계 할 때는 당연한 얘기이지만 프로그램 전체 로직을 도식화 시키는 것이 제일 처음 할 일이다.


memberSelect.jsp


<%@page import="exx.MemberDTO"%>

<%@page import="exx.MemberDAO"%>

<%@page import="java.util.ArrayList"%>

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="EUC-KR">

<title>Insert title here</title>

</head>

<body>

<%

MemberDAO memberDAO = new MemberDAO();

ArrayList<MemberDTO> dtos = memberDAO.memberSelect();

for(int i=0;i<dtos.size(); i++){

MemberDTO dto = dtos.get(i);

String name = dto.getName();

String id = dto.getId();

String pw = dto.getPw();

String phone = dto.getPhone1()+"-"+dto.getPhone2()+"-"+dto.getPhone3();

String gender = dto.getGender();

out.println("이름:"+name+"아이디:"+id+",비밀번호:"+pw+",연락처:"+phone+",성별:"+gender+"<br/>");

}

%>

</body>

</html>


--------------------------------------------------------------------------------------

MemberDAO.java


package exx;


import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.Statement;

import java.util.ArrayList;


import javax.naming.Context;

import javax.naming.InitialContext;


import org.apache.tomcat.jdbc.pool.DataSource;


public class MemberDAO {

private DataSource dataSource;

public MemberDAO() {

try {

}catch(Exception e) {

e.printStackTrace();

}

}

public ArrayList<MemberDTO> memberSelect(){

ArrayList<MemberDTO> dtos = new ArrayList<MemberDTO>();

Connection con = null;

Statement stmt = null;

ResultSet rs = null;

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

con =DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","scott","tiger");

stmt = con.createStatement();

rs = stmt.executeQuery("select *from member");

while(rs.next()) {

String name = rs.getString("name");

String id = rs.getString("id");

String pw = rs.getString("pw");

String phone1 = rs.getString("phone1");

String phone2 = rs.getString("phone2");

String phone3 = rs.getString("phone3");

String gender = rs.getString("gender");

MemberDTO dto = new MemberDTO(name,id,pw,phone1,phone2,phone3,gender);

dtos.add(dto);

}

}catch(Exception e) {

e.printStackTrace();

}finally {

try {

if(rs!=null) rs.close();

if(stmt!=null)stmt.close();

if(con!=null)con.close();

}catch(Exception e) {

e.printStackTrace();

}

}

return dtos;

}

}



------------------------------------------------------------------------------------


MemberDTO dto = new MemberDTO(name,id,pw,phone1,phone2,phone3,gender);

dtos.add(dto);


ArrayList에 add한다. 

첫 번째 방법은 RequestDispatcher 클래스를 이용한 위임 방법이다



이렇게 jsp에서 서블릿으로, 서블릿에서 jsp로 객체를 위임할 수 있게 하는것이 RequestDispatcher 클래스이다. 쉽게 사용할 수 있으니 활용이 많이 될듯쉽다.


두 번째는 HttpServletResponse 클래스로 위임하는 방법이다


redirect.jsp에서 HttpServletResponse 클래스를 내부적으로 상속받기 때문에 request.setAttribute(); 메소드를 사용할 수 있는데 이곳에서 set 해서 response로 넘겨 주었다고 해서 왼쪽 RequestObj.java에서 받는 것이 아니라 새로운 객체를 하나 생성하는 것이다. 즉 속성을 참고해서 사용할 수가 없다.

'프로그래밍 > JSP' 카테고리의 다른 글

MVC 패턴  (0) 2018.07.31
JSP ArrayList로 모든 멤버 보여주기  (0) 2018.07.30
FrontController 패턴과 Command 패턴  (0) 2018.07.29
JSP EL(Expression Language)  (0) 2018.07.29
JSP 파일 업로드  (0) 2018.07.29

지금은 확장자 패턴을 사용해 보겠다


FrontController 패턴이다 

모든 처리를 하나의 클래스 안에서 처리를 하는 방식이다.


이렇게 각각의 요청을 하나의 클래스에서 받아 비교를 한뒤 처리를 한다.

이렇게 하면 if 절 하나하나마다 코드량이 엄청 나게 늘어날 수 있다. 그래서 이제 설명할 Command 패턴을 사용한다.



이제 서블릿에서 받은 클래스에서 DAO로 접근을 해서 로직을 수행한다. 이것을 Command 패턴이라고 한다. MVC프로젝트에서는 이런 구조를 많이 사용한다. 



+ Recent posts