일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- React.memo
- Headless 컴포넌트
- JavaScript
- Microtask Queue
- react
- linux 배포판
- 명시적 타입 변환
- useCallback
- 타입 단언
- AJIT
- prettier
- useLayoutEffect
- useMemo
- 좋은 PR
- useEffect
- TypeScript
- type assertion
- 주니어개발자
- docker
- CS
- Compound Component
- Sparkplug
- Custom Hook
- task queue
- Event Loop
- Dockerfile
- 프로세스
- Render Queue
- 암묵적 타입 변환
- prettier-plugin-tailwindcss
- Today
- Total
구리
TIL_210531_model1,model2,MVC 패턴 본문
목차
model1
model2
MVC 디자인 패턴
model2 MVC 패턴 예시 코딩 (mvc_board)
웹 애플리케이션 모델(구조) 종류
종류는 2가지로 나뉜다. model1, model2 가 있으며 model2에는 여러 하위 개념이 있는데 가장 많이 사용되는 개념이 MVC 디자인 패턴이다.
즉 model2 방식의 한 패턴으로 MVC 패턴이 있는 것이다.
model1
디자인 코드인 HTML과 비즈니스 로직인 자바코드를 따로 구분하지 않고 하나의 JSP파일 내에 함께 기술하는 방식(비즈니스 로직 : 컴퓨터 프로그램에서 실세계의 규칙에 따라 데이터를 생성·표시·저장·변경하는 부분)
model1 장단점
장점 | 단점 |
개발 속도가 빠르며 구조가 단순하여 익히기 쉬움 | 표현 코드(디자인)과 비즈니스 로직이 하나의 JSP 페이지에 표현되어 코드가 복잡함 |
중소형 프로젝트에 적합 | JSP 파일이 복잡해져 유지보수가 어렵고 비즈니스 로직의 재사용성이 떨어진다 |
model2
웹 어플리케이션을 개발할 때 MVC패턴을 적용하여 웹 어플리케이션의 개발이 가능하도록 구현 한 것으로
View는 JSP가 담당하고, Controller는 Servlet이 담당하며, Model은 JavaBean이나 서비스 클래스를 이용하여 담당
model2 장단점
장점 | 단점 |
view 코드, 로직 처리를 위한 자바 코드를 분리하기에 코드가 덜 복잡하고 명확한 역할 분담 가능 |
구조가 복잡해져 기술 습득이 어렵고 작업량이 많아진다 |
비즈니스 로직의 재사용성이 높아지고 확장성 용이 | 구조 설계를 위한 시간이 많이 소요 |
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에 의해 새창으로 출력되는 파일
*/
프로젝트 실행 사진
'JSP,Serlvet' 카테고리의 다른 글
TIL_210429_JSP,Servlet 활용 로그인 및 회원가입 프로그램 (2) | 2021.04.29 |
---|---|
TIL_210428_DAO,DTO,JSP, Servlet 활용 데이터 가공 문제 (0) | 2021.04.28 |
210427_JSP 관련 데이터 다루기 문제 (0) | 2021.04.27 |
TIL_210423_쿠키, 세션 (0) | 2021.04.27 |
TIL_210426_JSTL ,Servlet 기초 (0) | 2021.04.26 |