UIUX _국비과정 0718 [스프링 model1방식 웹만들기]

스프링 JDBC update()→ insert, update, deletequeryForInt()queryForObject() : 실행결과를 자바 객체(VO)로 매핑하여 리턴query() : 검색된 데이터의 row(레코드) 수 만큼 RowMapper객체의 MapRow()메소드가 실행된다. 그

100dumpling.tistory.com

 

지난 시간,

프론트 컨트롤러 (jsp)

DispatcherServlet를 만들었다.

 

▼ DispatcherServlet

더보기
package com.springbook.view.controller;

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

// @WebServlet("*.do") 라고 쓰는 매핑정보가  web.xml에 들어 있다.
// 프론트 컨트롤러의 역할
public class DispatcherServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		process(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		process(request, response);
	}

	private void process(HttpServletRequest request, HttpServletResponse response) {
		// request, response를 받아서 필요한 작업 처리
		// getRequestURI() 포트번호를 제외하고 뒤의 값을 반환
		String uri = request.getRequestURI();
		String path = uri.substring(uri.lastIndexOf("/")); // /login.do <- 이렇게 '/' 뒤의 주소를 가지고 온다

		System.out.println(path);

    // .do 뒤에 뭐가 오냐에 따라 판단
		if (path.equals("/login.do")) {
			System.out.println("로그인 처리");
		} else if (path.equals("/logout.do")) {
			System.out.println("로그아웃 처리");
		} else if (path.equals("/insertBoard.do")) {
			System.out.println("글 등록 처리");
		} else if (path.equals("/updataBoard.do")) {
			System.out.println("글 수정 처리");
		} else if (path.equals("/deleteBoard.do")) {
			System.out.println("글 삭제 처리");
		} else if (path.equals("/getBoard.do")) {
			System.out.println("글 상세 조회 처리");
		} else if (path.equals("/getBoardList.do")) {
			System.out.println("글 목록 검색 처리");
		}

	}
}

요청하는 주소값을 잘 처리하고 있다. 이걸 시작으로 model2방식의 게시판을 만들 수 있다.

 


 

 

로그인 처리가 된 주소를

http://localhost:9999/BoardWeb/login.do 이렇게 바꿔줘야 한다.

 

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<center>
		<form action="login.do" method="post">
			<table border="1" callpadding="0" cellspacing="0">
				<tr>
					<td bgcolor="orange">아이디</td>
					<td>
						<input type="text" name="id">
					</td>
				</tr>
				<tr>
					<td bgcolor="orange">비밀번호</td>
					<td>
						<input type="password" name="password">
					</td>
				</tr>
				<tr>
					<td colspan="2" align="center">
						<input type="submit" value="로그인"></td>
				</tr>
			</table>
		</form>
	</center>
</body>
</html>

 

<form action="login.do" method="post"> 를 DispatcherServlet에 써 놓은 주소로 바꿔준다.

DispatcherServlet 에는 login.do로 페이지를 이동하면 어느 화면을 보여줄지 판단하기 위해 모델1방식에서 작성했던 login_proc 의 코드를 옮겨 넣어준다.

모델 1방식에서는 프론트컨트롤러 없이 login_proc가 바로 화면 이동을 할 수 있게 해줬다.

 

→ 글 목록 보기

http://localhost:9999/BoardWeb/getBoardList.jsp 이 주소로 직접 실행하면 안되고

http://localhost:9999/BoardWeb/getBoardList.do 로 직접 접근해야한다.

이렇게 접근해도 주소는 .jsp로 바뀌는데 리다이렉트 방식이기 때문

 

 

DispatcherServlet

package com.springbook.view.controller;

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

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

import com.springbook.biz.board.BoardVO;
import com.springbook.biz.board.impl.BoardDAO;
import com.springbook.biz.user.UserVO;
import com.springbook.biz.user.impl.UserDAO;

// @WebServlet("*.do") 라고 쓰는 매핑정보가  web.xml에 들어 있다.
// 프론트 컨트롤러의 역할
public class DispatcherServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		process(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		process(request, response);
	}

	private void process(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		// request, response를 받아서 필요한 작업 처리
		// getRequestURI() 포트번호를 제외하고 뒤의 값을 반환
		String uri = request.getRequestURI();
		String path = uri.substring(uri.lastIndexOf("/")); // /login.do <- 이렇게 '/' 뒤의 주소를 가지고 온다

		System.out.println(path);
		
		// .do 뒤에 뭐가 오냐에 따라 판단
		if (path.equals("/login.do")) {
			
			   System.out.println("로그인 처리");
			
			   // login_proc 의 코드. 모델 2에서는 프론트컨트롤러가 proc의 역할을 수행한다.
			   String id = request.getParameter("id");
			   String password = request.getParameter("password");
			   
			   UserVO vo = new UserVO();
			   vo.setId(id);
			   vo.setPassword(password);
			   
			   UserDAO dao = new UserDAO();
			   UserVO user = dao.getUser(vo);
			   
			   if(user != null) {
				  HttpSession session = request.getSession();
				  session.setAttribute("id", vo.getId());
			      response.sendRedirect("getBoardList.do");
			      
			   }else{
			      response.sendRedirect("login.jsp");
			   }
			
			   
		} else if (path.equals("/logout.do")) {
			
			System.out.println("로그아웃 처리");
			
			HttpSession session = request.getSession();
			session.invalidate();
			
			response.sendRedirect("login.jsp");
			
			
		} else if (path.equals("/insertBoard.do")) {
			
			System.out.println("글 등록 처리");
			
			request.setCharacterEncoding("UTF-8");
			
			String title = request.getParameter("title");
			String writer = request.getParameter("writer");
			String content = request.getParameter("content");
			
			BoardVO vo = new BoardVO();
			BoardDAO dao = new BoardDAO();
			
			vo.setTitle(title);
			vo.setWriter(writer);
			vo.setContent(content);
			
			dao.insertBoard(vo);
			
			response.sendRedirect("getBoardList.do");
			
			
		} else if (path.equals("/updataBoard.do")) {
			
			System.out.println("글 수정 처리");
			
			request.setCharacterEncoding("UTF-8");

			String seq = request.getParameter("seq");
			String title = request.getParameter("title");
			String content = request.getParameter("content");

			BoardVO vo = new BoardVO();
			BoardDAO dao = new BoardDAO();

			vo.setSeq(Integer.parseInt(seq));
			vo.setTitle(title);
			vo.setContent(content);

			dao.updateBoard(vo);

			response.sendRedirect("getBoardList.do");
			
			
		} else if (path.equals("/deleteBoard.do")) {
			
			System.out.println("글 삭제 처리");
			
			request.setCharacterEncoding("UTF-8");

			String seq = request.getParameter("seq");

			BoardVO vo = new BoardVO();
			BoardDAO dao = new BoardDAO();

			vo.setSeq(Integer.parseInt(seq));

			dao.deleteBoard(vo);

			response.sendRedirect("getBoardList.do");
			
			
		} else if (path.equals("/getBoard.do")) {
			
			System.out.println("글 상세 조회 처리");
			
			String seq = request.getParameter("seq");

			BoardVO vo = new BoardVO();
			BoardDAO dao = new BoardDAO();
			
			vo.setSeq(Integer.parseInt(seq));
			
			BoardVO board = dao.getBoard(vo);
			
			// 데이터를 session에 담아 최종적으로 "getBoard.jsp"로 페이지 이동
			HttpSession session = request.getSession();
			session.setAttribute("board", board);
			response.sendRedirect("getBoard.jsp");
			
			
		} else if (path.equals("/getBoardList.do")) {
			
			System.out.println("글 목록 검색 처리");
			
			BoardVO vo = new BoardVO();
			BoardDAO dao = new BoardDAO();
			
			List<BoardVO> boardList = dao.getBoardList(vo);
			
			// 목록을 session에 담아 최종적으로 "getBoardList.jsp"로 페이지 이동
			HttpSession session = request.getSession();
			session.setAttribute("boardList", boardList);
			// 실제 화면에 뿌려줄때는 jsp로 가야한다.
			response.sendRedirect("getBoardList.jsp");
			
		}

	}
}

 

하지만 이렇게 프론트컨트롤러에 모든 정보를 담아두는 것은 좋은 방법이 아니다.

핸들러의 역할만 하는 것이 적절.

 

getBoard

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@page import="com.springbook.biz.board.*"%>
<%@page import="com.springbook.biz.board.impl.*"%>
<%
	//String seq = request.getParameter("seq");

	//BoardVO vo = new BoardVO();
	//BoardDAO dao = new BoardDAO();
	
	//vo.setSeq(Integer.parseInt(seq));
	
	//BoardVO board = dao.getBoard(vo);
	// 모델 2방식에서는 위 코드 사용 X 
	
	BoardVO board = (BoardVO)session.getAttribute("board");
	
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<center>
		<h1>글 상세</h1>
		<a href="logout.do">Log-out</a>
		<hr>
		<form action="updateBoard.do" method="post">
		
		<input name="seq" type="hidden" value="<%=board.getSeq() %>">
		
			<table border="1" cellpadding="0" cellspacing="0">
				<tr>
					<td bgcolor="orange" width="70">제목</td>
					<td align="left">
					<input name="title" type="text" value="<%=board.getTitle() %> ">
					</td>
				</tr>
				
				<tr>
					<td bgcolor="orange" width="70">작성자</td>
					<td align="left">
					<%=board.getWriter() %>
					</td>
				</tr>
				
			    <tr>
					<td bgcolor="orange" width="70">내용</td>
					<td align="left">
					<textarea name="content" cols="40" rows="10" ><%=board.getContent() %></textarea>
					</td>
				</tr>
				
				<tr>
					<td bgcolor="orange" width="70">등록일</td>
					<td align="left">
					<%=board.getRegDate() %>
					</td>
				</tr>
				
				<tr>
					<td bgcolor="orange" width="70">조회수</td>
					<td align="left">
					<%=board.getCnt() %>
					</td>
				</tr>
				
				<tr>
					<td colspan="2" align="center">
					<input type="submit" value="글 수정"/> 
					</td>
				</tr>
			</table>
		</form>
		<hr>
		<a href="insertBoard.jsp">글 등록</a> <!-- 글 등록은 .jsp -->
		<a href="deleteBoard.do?seq=<%=board.getSeq() %>">글 삭제</a>
		<a href="getBoardList.do">글 목록</a>
		
	</center>
</body>
</html>

 

getBoardList

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@page import="com.springbook.biz.board.*"%>
<%@page import="com.springbook.biz.board.impl.*"%>
<%@page import="java.util.*"%>
<%
  
	//BoardVO vo = new BoardVO();
	//BoardDAO dao = new BoardDAO();
	
	//List<BoardVO> boardList = dao.getBoardList(vo);
	// 모델 2방식에서는 위 코드를 사용하지 않는다.
	
	// DispatcherServlet에서 만들어 둔 session에서 데이터를 가지고 온다
	List<BoardVO> boardList = (List<BoardVO>)session.getAttribute("boardList");
    
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<center>
		<h1>글 목록</h1>
		<h3>
			테스트님! 게시판에 오신 걸 환영합니다! <a href="logout.do">log-out</a>
		</h3>

		<form action="getBoardList.jsp" method="post">
			<table border="1" cellpadding="0" cellspacing="0" width="700">
				<tr>
					<td align="right">
					<select name="searchCondition">
							<option value="TITLE">제목</option>
							<option value="CONTENT">내용</option>
					</select>
					<input name="searchKeyword" type="text" /> 
					<input type="submit" value="검색" /> 
					</td>
				</tr>
			</table>
		</form>

		<table border="1" cellpadding="0" cellspacing="0" width="700">
			<tr>
				<th bgcolor="orange" width="100">번호</th>
				<th bgcolor="orange" width="200">제목</th>
				<th bgcolor="orange" width="150">작성자</th>
				<th bgcolor="orange" width="150">등록일</th>
				<th bgcolor="orange" width="100">조회수</th>
			</tr>

			<% 
				for (BoardVO board : boardList) {
					
				%>

			<tr>
				<td>
					<%=board.getSeq() %>
				</td>
				<td>
				<a href="getBoard.do?seq=<%=board.getSeq() %>">
					<%=board.getTitle() %></a>
				</td>
				<td>
					<%=board.getWriter() %>
				</td>
				<td>
					<%=board.getRegDate() %>
				</td>
				<td>
					<%=board.getCnt() %>
				</td>
			</tr>

			<%
				}
				%>
		</table>

		<br> <a href="insertBoard.jsp">새글 등록</a>
	</center>
</body>
</html>

 

insertBoard

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<center>
		<h1>글 등록</h1>
		<a href="logout.do">Log-out</a>
		<hr>
		<form action="insertBoard.do" method="post">
			<table border="1" callpadding="0" cellspacing="0">
				<tr>
					<td bgcolor="orange" width="70">제목</td>
					<td align="left"><input type="text" name="title" /></td>
				</tr>

				<tr>
					<td bgcolor="orange">작성자</td>
					<td align="left"><input type="text" name="writer" size="10" /></td>
				</tr>

				<tr>
					<td bgcolor="orange">내용</td>
					<td align="left"><textarea name="content" cols="40" rows="10"></textarea></td>
				</tr>

				<tr>
					<td colspan="2" align="center">
					<input type="submit" value="새 글 등록" />
					</td>
				</tr>
			</table>
		</form>
		<hr>
		<a href="getBoardList.do">글 목록 가기</a>
	</center>
</body>
</html>

글이 잘 들어오는 것을 확인할 수 있다.

 

 


 

MVC 구조의 프로그래밍

 

 

  • DispatcherServlet(f.c)

 

  • HandlerMapping

: 매핑정보를 관리해주는 핸들러

 

  • Controller(a.c)

: 인터페이스 상속하는 구조로 작성, 역할은 다르지만 하나의 표준화된 메소드를 가지고 실행

(비즈니스 계층과 비슷하다)

 

  • ViewResolver(jsp)

+ Recent posts