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프로젝트에서는 이런 구조를 많이 사용한다. 



JSP EL(Expression Language) 알아보도록 하자

EL(Expression Language) 은 기존의 JSP 문법을 다른 사람이 알아보기 쉽도록 간략화 해주는 기법이다. 유지보수에 도움이 된다.

기존 <% %> 를 ${ }로 바꾸어 표기하는 방식이다.


 이름 : <jsp:getProperty name= "member" property="name"/><br/> 

이렇게 코딩 되어있는것을

 이름 : ${member.name}<br/> 처럼 간단하게 변경가능하게한다.


뿐만아니라 다양한 내장객체를 사용할 수 있어 보기 좋게 표현 가능하다.


왼쪽에서 초기화해준 값들을 오른쪽에서와 같이 사용하게 해준다.


위쪽 context 초기화 파라미터 값들을 문서 어디에서든 사용할 수 있게 값을 지정해주는 web.xml 코드이다.

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

JSP 포워딩(RequestDispatcher 클래스  (0) 2018.07.29
FrontController 패턴과 Command 패턴  (0) 2018.07.29
JSP 파일 업로드  (0) 2018.07.29
DAO, DTO / PrepareStatement / 커넥션풀(DBCP)  (0) 2018.07.27
jdk tomcat 오류  (0) 2018.07.27

파일 업로드를 만들기 앞서 라이브러리를 다운로드 받는다

http://www.servlets.com 에 들어가 com.oreilly.servlet를 클릭 한 후 Download에 cos-26Dec2008.zip 을 다운 받아 준다


그 후 압축을 푼뒤 자신의 프로젝트 파일 WebContent 안에 fileForder를 만들어주어 파일업로드가 될때 파일이 저장될 폴더를 만든다.


실제 파일이 저장되는 경로는

C:\Users\kim\Downloads\apache-tomcat-9.0.10\apache-tomcat-9.0.10\wtpwebapps\ex2\fileForder

자신이 아파치 톰캣 서버를 설치한 곳의 프로젝트 fileForder가 되겠다


다음은 코드이다


파일 업로드 화면


파일 업로드 동작

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

FrontController 패턴과 Command 패턴  (0) 2018.07.29
JSP EL(Expression Language)  (0) 2018.07.29
DAO, DTO / PrepareStatement / 커넥션풀(DBCP)  (0) 2018.07.27
jdk tomcat 오류  (0) 2018.07.27
자바 빈 사용  (0) 2018.07.26

빈을 설정해서 MemberDto에서 GETTER SETTER 해준 값들을 전역으로 사용할 수 있다.

dto.getId() 이렇게 사용가능하다. 

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

JAVA 파일입출력  (0) 2018.08.30
자바 다운그레이드  (0) 2018.08.26
JAVA 관련 사이트 기술 커리큘럼  (0) 2018.07.25
스트레티지 패턴  (0) 2018.07.23
Java for-each 쉽게 이해하기  (0) 2018.07.19

DAO와 DTO 는 MVC 프레임워크에서 M(Model) 역할을 맡는다고 생각하면 이해하기 쉽다.

DAO는 데이터베이스를 서버와 연결해 주는 역할을 하고 DTO는 데이터베이스만 따로 저장해주는 역할(getter, setter)을 한다.





PreparedStatement 객체


커넥션 풀:커넥션 객체를 미리 생성하여 부하가 없게 쓰도록 한다


미리 만들어 놓은 커넥션이 50개의 요청에 대해서 빠르게 반응한다. 51번째는 기다린다. 톰캣이 1개씩 증가시켜준다.


Servers => context 맨밑에 줄에서 resource를 정의한다.


서버에서 오른쪽 Publish to the server를 눌러 톰캣과 동기화 시켜준다.

동기화가 끝난 모습이다.


데이터를 모듈화하여 사용하고 있는 예이다.


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

JSP EL(Expression Language)  (0) 2018.07.29
JSP 파일 업로드  (0) 2018.07.29
jdk tomcat 오류  (0) 2018.07.27
자바 빈 사용  (0) 2018.07.26
예외처리  (0) 2018.07.26

+ Recent posts