너굴 개발 일지

TIL_210531_model1,model2,MVC 패턴 본문

JSP,Serlvet

TIL_210531_model1,model2,MVC 패턴

너굴냥 2021. 5. 31. 16:56

목차

model1

model2

MVC 디자인 패턴
model2 MVC 패턴 예시 코딩 (mvc_board)

 

 

 

웹 애플리케이션 모델(구조) 종류

종류는 2가지로 나뉜다. model1, model2 가 있으며 model2에는 여러 하위 개념이 있는데 가장 많이 사용되는 개념이 MVC 디자인 패턴이다.

즉 model2 방식의 한 패턴으로 MVC 패턴이 있는 것이다.

 

 

model1

디자인 코드인 HTML과 비즈니스 로직인 자바코드를 따로 구분하지 않고 하나의 JSP파일 내에 함께 기술하는 방식(비즈니스 로직 : 컴퓨터 프로그램에서 실세계의 규칙에 따라 데이터를 생성·표시·저장·변경하는 부분)

 

model1 장단점

장점 단점
개발 속도가 빠르며 구조가 단순하여 익히기 쉬움 표현 코드(디자인)과 비즈니스 로직이 하나의 JSP 페이지에 표현되어 코드가 복잡함
중소형 프로젝트에 적합 JSP 파일이 복잡해져 유지보수가 어렵고
비즈니스 로직의 재사용성이 떨어진다

모델1 방식의 구조

 

 

 

model2

웹 어플리케이션을 개발할 때 MVC패턴을 적용하여 웹 어플리케이션의 개발이 가능하도록 구현 한 것으로

ViewJSP가 담당하고, ControllerServlet이 담당하며, ModelJavaBean이나 서비스 클래스를 이용하여 담당

 

model2 장단점

장점 단점
view 코드, 로직 처리를 위한 자바 코드를 분리하기에
코드가 덜 복잡하고 명확한 역할  분담 가능
구조가 복잡해져 기술 습득이 어렵고 작업량이 많아진다
비즈니스 로직의 재사용성이 높아지고 확장성 용이 구조 설계를 위한 시간이 많이 소요

 

model2 방식의 구성 및 흐름

model2 방식의 구조

Controller는 중앙에 위치하여 View와 Model 사이의 연동을 담당, 사용자의 요청을 받으며 Model을 통한 비즈니스 로직을 처리 후 수행 결과를 View에게 전달하고 View를 통해 사용자에게 보여지게 한다.

 

Controller 역할 정리

- 사용자의 요청을 받는다

- 사용자의 요청을 분석한다

- 사용자의 요청을 처리할 자바 빈을 생성하고,비즈니스 로직이 구현된 메소드를 실행한다

- 비즈니스 로직 수행 후 사용자의 요청을 JSP페이지나 혹은 특정 URL로 이동시킨다

 

Model 역할 정리

- 비즈니스 로직이 구현되어 있다

- Database에 데이터를 추가, 조회, 변경, 조회하는 작업을 수행한다

- View에 제공할 Data를 가공한다

 

View 역할 정리

- 클라이언트에게 최종적으로 보여지는 영역이다

- JSP와 JSTL을 이용하여 구현한다

 

 

 

 

MVC 패턴

모델 2 구조에는 여러 하위 개념들이 있는데 가장 많이 사용되는 개념이 MVC이다.

MVC는 Model - View - Controller를 의미하며 일종의 디자인 패턴으로 jsp로 구현해야 하는 기능, 서블릿으로 구현해야 하는 기능이 나눠져 있다.

MVC 패턴은 모델 2의 일부로서 위에 기술한 model2의 특징과 장점을 그대로 지닌다.

(디자인 패턴 : 프로그램 개발시 사용하는 일정한 뼈대(프레임) 또는 틀의 개념)

 

MVC - Model

어플리케이션 로직을 담당하는 부분으로 데이터베이스와의 로직을 담당하는 부분

 

MVC - View

client에게 보여지는 부분이며 Model에서 생성된 Data를 client에게 제공하는 역할

 

MVC - Controller

사용자의 요청을 받아서 요청에 해당하는 비즈니스 로직을 수행하도록 하고, 작업 결과에 따라 응답을 결정하는 역할

Model과 View 모듈간의 인터페이스 역할

 

 

 

 

 

 

model2 MVC 패턴 예시 코딩 (mvc_board)

mvc_board 흐름도

글을 작성하는 게시판에 대해서는 1개의 서블릿만 생성하며 각 과정마다 command를 생성하여 글삭제(delete),글 작성(write) 등 command 값을 정하고 서블릿에서 command 값을 읽어 어떤 과정으로 처리할지 정한다.후에는 해당 model이 데이터를 처리하고 다른 View로 이동시킨다.전 프로젝트들은 각 과정마다 각각의 서블릿을 생성하였지만 이제는 1개의 서블릿만 생성하여 서블릿 안에서 과정마다 다른 Model을 호출하여 데이터가 처리된다.

프로젝트 구성 파일들

 

 

자바 소스 코드

더보기
DBManager.java

package util;

/** singletone 패턴**/
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class DBManager {
	public static DBManager instance = null;
	
	public DBManager() {}
	
	public static DBManager getInstance() {
		if(instance==null) {
			instance = new DBManager();
		}
		return instance;
	}
	
	/** BoardDAO 의 각 query 실행 메서드에서 기본으로 호출 **/
	public static Connection getConnect() {
		Connection conn = null;
		String url = "jdbc:oracle:thin:@127.0.0.1:1521:XE";
		String userid = "board_mvc";
		String userpw = "1234";
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection(url, userid, userpw);
		}catch(ClassNotFoundException e) {
			System.err.println("getConnection() - ClassNotFoundException : " + e.getMessage());
		}catch(SQLException e) {
			System.err.println("getConnection() - SQLException : " +e.getMessage());
		}
		
		return conn;
	}
	
	/** select 수행 후 리소스 해제를 위한 메서드 **/
	/** PreparedStatement가 없는 이유 ? Statement를 활용해서 만든게 PreparedStatement기에Statement가 부모인셈**/
	public static void close(Connection conn, Statement stmt ,ResultSet rs) {
		try {
			rs.close();
			stmt.close();
			conn.close();
		}catch(SQLException e) {
			e.printStackTrace();
		}
	}
	
	/** DML(insert, delete, update) 수행 후 리소스 해제를 위한 메소드 **/
	public static void close(Connection conn,Statement stmt) {
		try {
			stmt.close();
			conn.close();
		}catch(SQLException e) {
			e.printStackTrace();
		}
	}

}
BoardVO.java package com.bjy.dto; import java.sql.Timestamp; public class BoardVO { private int num; private String name; private String email; private String pass; private String title; private String content; private int readcount; private Timestamp writedate; public BoardVO() { } public String toStringBoardVO() { return "BoardVO => num(번호) : " + getNum() + " | name(이름) : " + getName() + " | email(메일) : " + getEmail() + " | pass(비번) : " + getPass() + " | title(제목) : " + getPass() + " | content(내용) : " + getContent() + " | readcount(조회수) : " + getReadcount() + " | writedate(저장날짜) : " + getWritedate(); } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public int getReadcount() { return readcount; } public void setReadcount(int readcount) { this.readcount = readcount; } public Timestamp getWritedate() { return writedate; } public void setWritedate(Timestamp writedate) { this.writedate = writedate; } }
BoardDAO.java

package com.bjy.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import com.bjy.dto.BoardVO;

import util.DBManager;


/** singletone 패턴 **/
public class BoardDAO {
	private static BoardDAO instance = new BoardDAO();
	
	private BoardDAO() {
	}

	
	/** ~~Action 들이 호출 **/
	public static BoardDAO getInstance() {
		if(instance == null) {
			instance = new BoardDAO();
		}
		return instance;
	}

	/** BoardListAction 에서 호출  **/
	public List<BoardVO> selectAllBoards() {
		String sql = "select * from board order by num desc";
		List<BoardVO> list = new ArrayList<BoardVO>();	// BoardVO.set~~() -> list.add()
		Connection conn = null;
		Statement stmt = null;
		ResultSet rs = null;
		
			try {
				conn = DBManager.getConnect();
				stmt = conn.createStatement();
				rs = stmt.executeQuery(sql);
				
				while(rs.next()) {
					BoardVO vo = new BoardVO();
					vo.setNum(rs.getInt("num"));
					vo.setTitle(rs.getString("title"));
					vo.setName(rs.getString("name"));
					vo.setContent(rs.getString("content"));
					vo.setPass(rs.getString("pass"));
					vo.setEmail(rs.getString("email"));
					vo.setWritedate(rs.getTimestamp("writedate"));
					vo.setReadcount(rs.getInt("readcount"));
					list.add(vo);
				}
			}catch(Exception e) {
				System.err.println("BoardDAO - selectAllBoards() err : " + e.getMessage());
			}
		return list;
	}

	public int insertBoard(BoardVO bVo) {
		String sql = "insert into board (num, name, email, pass, title, content) values (board_seq.nextval, ?, ?, ?, ?, ?)";
		Connection conn = null;
		PreparedStatement pstmt = null;
		int result = 0;
		System.out.println("1");
		try {
			conn = DBManager.getConnect();
			System.out.println("2");
			pstmt = conn.prepareStatement(sql);
			System.out.println(bVo.getName()+ " " + bVo.getEmail());
			pstmt.setString(1, bVo.getName());
			pstmt.setString(2, bVo.getEmail());
			pstmt.setString(3, bVo.getPass());
			pstmt.setString(4, bVo.getTitle());
			pstmt.setString(5, bVo.getContent());
			
			result = pstmt.executeUpdate();
		}catch(Exception e) {
			System.err.println("BaordDAO - insertBoard() err : " + e.getMessage());
		}finally {
			DBManager.close(conn, pstmt);
		}
		
		return result;
	}

	public void updateReadCount(String num) {
		String sql = "update board set readcount=readcount+1 where num=?";
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		try {
			conn = DBManager.getConnect();
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, num);
			
			pstmt.executeUpdate();
		}catch(Exception e) {
			System.err.println("BoardDAO - updateReadCount() err : " + e.getMessage());
		}finally {
			DBManager.close(conn, pstmt);
		}
	}

	// 게시판 글 상세 내용 보기 :글번호로 찾아온다. : 실패 null,
	public BoardVO selectOneBoardByNum(String num) {
		String sql = "select * from board where num = ?";
		
		BoardVO bVo = null;
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;

		try {
			conn = DBManager.getConnect();
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, num);
			
			rs = pstmt.executeQuery();
			
			if(rs.next()) {
				bVo = new BoardVO();
				bVo.setName(rs.getString("name"));
				bVo.setNum(rs.getInt("num"));
				bVo.setPass(rs.getString("pass"));
				bVo.setEmail(rs.getString("email"));
				bVo.setTitle(rs.getString("title"));
				bVo.setContent(rs.getString("content"));
				bVo.setReadcount(rs.getInt("readcount"));
				bVo.setWritedate(rs.getTimestamp("writedate"));
			}
		}catch(Exception e) {
			System.err.println("BoardDAO  - selectOneBoardByNum err : " + e.getMessage());
		}finally {
			DBManager.close(conn, pstmt, rs);
		}
		return bVo;
	}

	public void updateBoard(BoardVO bVo) {
		String sql = "update board set name=?, email=?, pass=?, title=?, content=? where num=?";
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		try {
			conn = DBManager.getConnect();
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, bVo.getName());
			pstmt.setString(2, bVo.getEmail());
			pstmt.setString(3, bVo.getPass());
			pstmt.setString(4, bVo.getTitle());
			pstmt.setString(5, bVo.getContent());
			pstmt.setInt(6, bVo.getNum());
			
			pstmt.executeUpdate();
		}catch(Exception e) {
			System.err.println("updateBoard() err : " + e.getMessage());
		}finally {
			DBManager.close(conn, pstmt);
		}

	}

	public BoardVO checkPassWord(String pass, String num) {
		String sql = "select * from board where pass=? and num=?";
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		BoardVO bVo = null;
		
		try {
			conn = DBManager.getConnect();
			pstmt = conn.prepareStatement(sql);
			
			pstmt.setString(1, pass);
			pstmt.setInt(2, Integer.parseInt(num));
			
			rs = pstmt.executeQuery();
			if(rs.next()) {
				bVo = new BoardVO();
				
				bVo.setNum(rs.getInt("num"));
				bVo.setName(rs.getString("name"));
				bVo.setEmail(rs.getString("email"));
				bVo.setPass(rs.getString("pass"));
				bVo.setTitle(rs.getString("title"));
				bVo.setContent(rs.getString("content"));
				bVo.setWritedate(rs.getTimestamp("writedate"));
			}
		}catch(Exception e) {
			System.err.println("checkPassWord() err : " + e.getMessage());
		}finally {
			DBManager.close(conn, pstmt);
		}
		return bVo;
	}

	public void deleteBoard(String num) {
		String sql = "delete board where num=?";
		Connection conn = null;
		PreparedStatement pstmt = null;

		try {
			conn = DBManager.getConnect();
			pstmt = conn.prepareStatement(sql);
			
			pstmt.setInt(1, Integer.parseInt(num));
			pstmt.executeUpdate();
		}catch(Exception e) {
			System.err.println("deleteBoard() err : " + e.getMessage());
		}finally {
			DBManager.close(conn, pstmt);
		}	
	}
}
Action Interface 
package com.bjy.controller.action;

import java.io.IOException;
import java.rmi.ServerException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public interface Action {
	public void execute(HttpServletRequest request, HttpServletResponse response) throws ServerException, IOException, ServletException;
}
BoardCheckPassAction.java 

package com.bjy.controller.action;

import java.io.IOException;
import java.rmi.ServerException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.bjy.dao.BoardDAO;
import com.bjy.dto.BoardVO;

public class BoardCheckPassAction implements Action {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) throws ServerException, IOException, ServletException {
		// 비밀번호가 맞을 경우, 틀릴 경우(비밀번호 입력 화면: boardCheckPass.jsp)
		String url = null;
		
		String num = request.getParameter("num");
		String pass= request.getParameter("pass");
		
		BoardDAO dao = BoardDAO.getInstance();
		BoardVO bVo = dao.selectOneBoardByNum(num);
		
		if(bVo.getPass().equals(pass)) {
			url = "/board/checkSuccess.jsp";
		}else {
			url = "/board/boardCheckPass.jsp";
			request.setAttribute("message", "비밀번호가 틀립니다");
		}
		
		RequestDispatcher rd = request.getRequestDispatcher(url);
		rd.forward(request, response);
	}
}

BoardCheckPassFormAction.java

package com.bjy.controller.action;

import java.io.IOException;
import java.rmi.ServerException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class BoardCheckPassFormAction implements Action {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) throws ServerException, IOException, ServletException {
		String url = "/board/boardCheckPass.jsp";
		
		RequestDispatcher rd = request.getRequestDispatcher(url);
		rd.forward(request, response);
	}

}
BoardDeleteAction.java

package com.bjy.controller.action;

import java.io.IOException;
import java.rmi.ServerException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.bjy.dao.BoardDAO;

public class BoardDeleteAction implements Action {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) throws ServerException, IOException, ServletException {
		String num = request.getParameter("num");
		
		BoardDAO dao = BoardDAO.getInstance();
		dao.deleteBoard(num);
		
		new BoardListAction().execute(request, response);
	}
}
BoardListAction.java

package com.bjy.controller.action;

import java.io.IOException;
import java.rmi.ServerException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.bjy.dao.BoardDAO;
import com.bjy.dto.BoardVO;

public class BoardListAction implements Action {
	
	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
		String url="/board/boardList.jsp";
		
		/** BoardDAO를 통해 select한 결과 List를**/
		BoardDAO dao = BoardDAO.getInstance();
		List<BoardVO> boardList = dao.selectAllBoards();
		
		/**request의 attribute에 저장 후 **/
		request.setAttribute("boardList", boardList);
		
		/** RequestDispacther 객체를 통해 forwarding**/
		RequestDispatcher rd = request.getRequestDispatcher(url);
		rd.forward(request, response);
	}
}
BoardUpdateAction.java

package com.bjy.controller.action;

import java.io.IOException;
import java.rmi.ServerException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.bjy.dao.BoardDAO;
import com.bjy.dto.BoardVO;

public class BoardUpdateAction implements Action{

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) throws ServerException, IOException, ServletException {
		BoardVO bVo = new BoardVO();
		bVo.setNum(Integer.parseInt(request.getParameter("num")));
		bVo.setName(request.getParameter("name"));
		bVo.setPass(request.getParameter("pass"));
		bVo.setEmail(request.getParameter("email"));
		bVo.setTitle(request.getParameter("title"));
		bVo.setContent(request.getParameter("content"));
	
		BoardDAO dao = BoardDAO.getInstance();
		dao.updateBoard(bVo);
		
		new BoardListAction().execute(request, response);
	}
}
BoardUpdateFormAction

package com.bjy.controller.action;

import java.io.IOException;
import java.rmi.ServerException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.bjy.dao.BoardDAO;
import com.bjy.dto.BoardVO;

public class BoardUpdateFormAction implements Action{

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) throws ServerException, IOException, ServletException {
		String url = "/board/boardUpdate.jsp";
		String num = request.getParameter("num");
		
		BoardDAO dao = BoardDAO.getInstance();
		dao.updateReadCount(num);
		
		BoardVO bVo = dao.selectOneBoardByNum(num); // 기존 값을 수정화면에 전달
		
		request.setAttribute("board", bVo);
		RequestDispatcher rd = request.getRequestDispatcher(url);
		rd.forward(request, response);
	}
}
BoardViewAction

package com.bjy.controller.action;

import java.io.IOException;
import java.rmi.ServerException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.bjy.dao.BoardDAO;
import com.bjy.dto.BoardVO;

public class BoardViewAction implements Action{

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) throws ServerException, IOException, ServletException {
		String url = "/board/boardView.jsp";
		
		String num = request.getParameter("num"); // boardList.jsp에서 선택한 제목의 글 번호
		
		BoardDAO dao = BoardDAO.getInstance();
		
		/** 1. 제목 클릭시, 조회수 증가 **/
		dao.updateReadCount(num);
		
		/** 2.  제목에 대한 글번호를 이용하여 상세보기 관련 데이터 조회 **/
		BoardVO vo = dao.selectOneBoardByNum(num);
		
		request.setAttribute("board", vo);
		RequestDispatcher rd = request.getRequestDispatcher(url);
		rd.forward(request, response);
	}
}
BoardWriteAction

package com.bjy.controller.action;

import java.io.IOException;
import java.rmi.ServerException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.bjy.dao.BoardDAO;
import com.bjy.dto.BoardVO;

public class BoardWriteAction implements Action{
	
	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) throws ServerException, IOException, ServletException{

		BoardVO vo = new BoardVO();
		vo.setName(request.getParameter("name"));
		vo.setPass(request.getParameter("pass"));
		vo.setEmail(request.getParameter("email"));
		vo.setContent(request.getParameter("content"));
		vo.setTitle(request.getParameter("title"));
		System.out.println(vo.getName() + "" +vo.getPass() + " " +vo.getContent());
		BoardDAO dao = BoardDAO.getInstance();
		int result = dao.insertBoard(vo);
		
		// insert 성공적으로 이뤄진 후 글 목록으로 전환하기 위한 객체 및 메서드
		if(result > 0) {
			new BoardListAction().execute(request, response);
		}
	}
}
BoardWriteFormAction

package com.bjy.controller.action;

import java.io.IOException;
import java.rmi.ServerException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class BoardWriteFormAction implements Action {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) throws ServerException, IOException, ServletException {
		String url = "/board/boardWrite.jsp";
		
		RequestDispatcher rd = request.getRequestDispatcher(url);
		rd.forward(request, response);
	}

}
BoardServlet.java

package com.bjy.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.bjy.controller.action.Action;

/**
 * Servlet implementation class BoardServlet
 */
@WebServlet("/BoardServlet")
public class BoardServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String command = request.getParameter("command");
		System.out.println(command);
		
		ActionFactory factory = ActionFactory.getInstance();
		System.out.println("ActionFactory 객체 생성 완료" + factory);
		
		Action action = factory.getAction(command);
		System.out.println("요청에 맞는 객체 반환 받음" + action);
		
		if(action!=null){
			action.execute(request, response);
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		doGet(request,response);
	}
}
ActionFactory.java

package com.bjy.controller;

import com.bjy.controller.action.Action;
import com.bjy.controller.action.BoardCheckPassAction;
import com.bjy.controller.action.BoardCheckPassFormAction;
import com.bjy.controller.action.BoardDeleteAction;
import com.bjy.controller.action.BoardListAction;
import com.bjy.controller.action.BoardUpdateAction;
import com.bjy.controller.action.BoardUpdateFormAction;
import com.bjy.controller.action.BoardViewAction;
import com.bjy.controller.action.BoardWriteAction;
import com.bjy.controller.action.BoardWriteFormAction;

/** SingleTone Pattern **/
/** BoardServlet의 요청사항에 따라 ~~Action 객체 생성 -> 서블릿에게 객체 반환 **/
public class ActionFactory {
	private static ActionFactory instance = null;
	public ActionFactory() {
	}
	
	public static ActionFactory getInstance() {
		if(instance == null) {
			instance = new ActionFactory();
		}
		return instance;
	}
	
	public Action getAction(String command) {
		Action action = null;
		System.out.println("ActionFactiory의 getAction() 호출시 전달사항 - "+ command);
		
		if(command.equals("board_list")){
			System.out.println("board_list 요청사항에 대한 객체 생성");
			action = new BoardListAction();
		}else if(command.equals("board_write_form")) {
			System.out.println("board_write_form 요청사항에 대한 객체 생성");
			action = new BoardWriteFormAction();
		}else if(command.equals("board_write")) {
			System.out.println("board_write 요청사항에 대한 객체 생성");
			action = new BoardWriteAction();
		}else if(command.equals("board_view")) {
			System.out.println("board_view 요청사항에 대한 객체 생성");
			action = new BoardViewAction();
		}else if(command.equals("board_check_pass_form")) {
			System.out.println("board_check_pass_form 요청사항에 대한 객체 생성");
			action = new BoardCheckPassFormAction();
		}else if(command.equals("board_check_pass")) {
			System.out.println("board_check_pass 요청사항에 대한 객체 생성");
			action = new BoardCheckPassAction();
		}else if(command.equals("board_update_form")) {
			System.out.println("board_update_form 요청사항에 대한 객체 생성");
			action = new BoardUpdateFormAction();
		}else if(command.equals("board_update")) {
			System.out.println("board_update 요청사항에 대한 객체 생성");
			action = new BoardUpdateAction();
		}else if(command.equals("board_delete")) {
			System.out.println("board_delete 요청사항에 대한 객체 생성");
			action = new BoardDeleteAction();
		}
		return action;
	}
}

 

jsp 코드

더보기
boardList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>게시글 목록 : boardList.jsp</title>
	<link rel="stylesheet" type="text/css" href="css/shopping.css">
</head>

<body>
	<div id="wrap" align="center">
		<h1>게시글 리스트</h1>
		<table>
			<tr>
				<td colspan="5" style="border: white; text-align: right;">
					<a href="BoardServlet?command=board_write_form">게시글 등록</a>
				</td>
			</tr>
			
			<tr>
				<th>번호</th>
				<th>제목</th>
				<th>작성자</th>
				<th>작성일</th>
				<th>조회수</th>
			</tr>
			
			<c:forEach items="${boardList}" var="board">
			<tr class="record">
				<td>${board.num }</td>
				<td>
					<a href="BoardServlet?command=board_view&num=${board.num }">
						${board.title}
					</a>
				</td>
				<td>${board.name }</td>
				<td>${board.writedate}</td>
				<td>${board.readcount }</td>
			</tr>
			</c:forEach>
		</table>	
	</div>
</body>
</html>
boardView.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>글 상세화면 :boardView.jsp</title>
	<link rel="stylesheet" type="text/css" href="css/shopping.css">
	<script type="text/javascript" src="script/board.js"></script>
</head>

<body>
	<div id="wrap" align="center">
		<h1>글 상세보기</h1>
		
		<table>
			<tr>
				<th>작성자</th>
				<td>${board.name }</td>
				<th>이메일</th>
				<td>${board.email }</td>
			</tr>
			
			<tr>
				<th>작성일</th>
				<td>
					<fmt:formatDate value="${board.writedate }"/>
				</td>
				<th>조회수</th>
				<td>${board.readcount }</td>
			</tr>
			
			<tr>
				<th>제목</th>
				<td colspan="3">${board.title }</td>
			</tr>
			
			<tr>
				<th>내용 </th>
				<td colspan="3">
					<pre>${board.content }</pre>
				</td>
			</tr>
		</table>
		<br /><br />
		
		<input type="button" value="글 수정" onclick="open_win('BoardServlet?command=board_check_pass_form&num=${board.num}', 'update')">
		<input type="button" value="글 삭제" onclick="open_win('BoardServlet?command=board_check_pass_form&num=${board.num}', 'delete')">
		<input type="button" value="글 목록" onclick="location.href='BoardServlet?command=board_list'">
		<input type="button" value="글 등록" onclick="location.href='BoardServlet?command=board_write_form'">
	</div>
</body>
</html>
boardWrite.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>게시글 입력 화면 : boardWrite.jsp</title>
	<link rel="stylesheet" type="text/css" href="css/shopping.css">
</head>

<body>
	<div id="wrap" align="center">
		<h1>게시글 등록 화면</h1>
		
		<form action="BoardServlet" method="post">
			<input type="hidden" name="command" value="board_write" />
			
			<table>
				<tr>
					<th>작성자</th>
					<td>
						<input type="text" name="name" required="required" />*필수
					</td>
				</tr>
				
				<tr>
					<th>비밀번호</th>
					<td>
						<input type="password" name="pass" required="required" />*필수 (게시물 수정, 삭제시 필요)
					</td>
				</tr>
				
				<tr>
					<th>이메일</th>
					<td>
						<input type="email" name="email" />
					</td>
				</tr>
				
				<tr>
					<th>제목</th>
					<td>
						<input type="text" name="title" required="required" />*필수
					</td>
				</tr>
				
				<tr>
					<th>내용</th>
					<td>
						<textarea rows="15" cols="70" name="content"></textarea>
					</td>
				</tr>
			</table>
			<br /><br />
			
			<input type="submit" value="글 등록" />
			<input type="reset" value="다시 작성" />
			<input type="button" value="글 목록" onclick="location.href='BoardServlet?command=board_list'">
		</form>
	</div>
</body>
</html>
boardUpdate.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Insert title here</title>
	<link rel="stylesheet" type="text/css" href="css/shopping.css">
	<script type="text/javascript" src="script/board.js"></script>
</head>

<body>
	
	<div id="wrap" align="center">
	<form action="BoardServlet" method="post">
		<h1>게시글 수정화면</h1>
		<input type="hidden" name="command" value="board_update" />
		<input type="hidden" name="num" value="${board.num }" />
		<table>
			<tr>
				<th>작성자</th>
				<td>
					<input type="text" name="name" size="12" value="${board.name }" required="required" />*필수
				</td>
			</tr>
			
			<tr>
				<th>비밀번호</th>
				<td>
					<input type="password" name="pass" size="12" required="required" />*필수(수정, 삭제 시 반드시 필요합니다.)
				</td>
			</tr>
			
			<tr>
				<th>이메일</th>
				<td>
					<input type="email" name="email" size="40" maxlength="50" value="${board.email }" />
				</td>
			</tr>
			
			<tr>
				<th>제목</th>
				<td>
					<input type="text" name="title" size="70" value="${board.title }"/>
				</td>
			</tr>
			
			<tr>
				<th>내용</th>
				<td>
					<textarea rows="15" cols="70" name="content">${board.content }</textarea>
				</td>
			</tr>
		</table>
		<br /><br />
		<input type="submit" value="등룩(수정)" />
		<input type="reset" value="다시 작성" />
		<input type="button" value="목록" onclick="location.href='BoardServlet?command=board_list'">
	</form>
	</div>
</body>
</html>
boardCheckPass.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>수정/삭제를 위한 비밀번호 입력 화면 : </title>
	<link rel="stylesheet" type="text/css" href="css/shopping.css">
	<script type="text/javascript" src="script/board.js"></script>
</head>

<body>
	<div align="center">
		<h1>비밀번호 확인</h1>
		
		<form action="BoardServlet" name="frm" method="post">
			<input type="hidden" name="command" value="board_check_pass" />
			<input type="hidden" name="num" value="${param.num }" />
			
			<table style="width:80%;">
				<tr>
					<th>비밀번호</th>
					<td>
						<input type="password" name="pass" />
					</td>
				</tr>
			</table>
			<br />
			<input type="submit" value="확인" onclick="return passCheck()" />
			<br />
			<br />
			${message }
		</form>
	</div>
</body>
</html>
checkSuccess.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>수정, 삭제 버튼 구별</title>
</head>

<body>
	<!-- 수정, 삭제 구분(창 이름을 이용) -->
	<script>
		if(window.name=="update"){
			window.opener.parent.location.href="BoardServlet?command=board_update_form&num=${param.num}";
		}else if(window.name=="delete"){
			alert("삭제되었습니다.");
			window.opener.parent.location.href="BoardServlet?command=board_delete&num=${param.num}";
		}
		window.close();
	</script>
</body>
</html>
shopping.css
@charset "UTF-8";
#wrap{
	width: 971px;
	margin: 0 auto;
}

h1{
	color:green;
}

table{
	width: 100%;
	border-collapse: collapse;
	font-size: 12px;
	line-height: 24px;
}

table td,th {
	border: 1px solid #000000;
	padding: 5px;
}

th{
	background: yellowgreen;
}

a{
	text-decoration: none;
	color: black;
}

a:hover{
	text-decoration: underline;
	color: green;
}

script/board.js

function open_win(url, name){
	window.open(url, name, "width=500, height=230");
}

function passCheck(){
	if(document.frm.pass.value.length==0){
		alert("비밀번호를 입력하세요");
		return false;
	}
	return true;
}

/**
 * passcheck()의 frm,pass는 boardCheckPass.jsp 내부의 form 태그와 input 태그에 대한 name 속성값
 * 
 * boardCheckPass.jsp는 BoardCheckPassFormAction에 의해 새창으로 출력되는 파일
 */

 

프로젝트 실행 사진

더보기
프로젝트 실행 첫 화면
게시글 등록 버튼 클릭후
게시글 등록 버튼 클릭 후 화면
글 제목 클릭 후 화면
글 수정 버튼 클릭 후 화면
수정값 입력
게시글 삭제 버튼 클릭 시 화면