16.Servlet JSP 위임/MVC

2022. 8. 4. 16:40JAVA

2022.08.04.목


1.Servlet → JSP 위임

 -Servlet이 JSP에 위임하면서 Servlet의 데이터를 전달해줘야 함

  1)전달하는 법

    -Scope를 통해 전달

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	String data = (String)request.getAttribute("requestScope");
	String data2 = (String)session.getAttribute("sessionScope");
	String data3 = (String)application.getAttribute("applicationScope");

%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>a.jsp</h1>
requestScope:<%= data %><br>
sessionScope:<%= data2 %><br>
applicationScope:<%= data3 %><br>
</body>
</html>

  2)위임하는 법

    -포워드(foward) : HttpServletRequest 이용

package com.controller;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
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 javax.servlet.http.HttpSession;

@WebServlet("/ForwardController")
public class ForwardController extends HttpServlet
{
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException 
	{
		System.out.println("ForwardController");
		
		//비즈니스 로직처리
		
		//데이터 전달 => scope 이용
		//1.request scope
		request.setAttribute("requestScope", "request");
		
		//2.session scope
		HttpSession session = request.getSession();
		session.setAttribute("sessionScope", "session");
		
		//3.application scope
		ServletContext application = getServletContext();
		application.setAttribute("applicationScope", "application");
		
		//forward로 위임
		//Servlet에서 만든 request 사용O -> URL 변경X
		//request확장
		RequestDispatcher dispatch = request.getRequestDispatcher("a.jsp");
		dispatch.forward(request, response);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException 
	{
		doGet(request, response);
	}

}

    -리다이렉트(redirect) : HttpServletResponse 이용

package com.controller;

import java.io.IOException;

import javax.servlet.ServletContext;
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 javax.servlet.http.HttpSession;

@WebServlet("/RedirectController")
public class RedirectController extends HttpServlet
{
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException 
	{
		//비즈니스 로직처리
		
		//데이터 전달 => scope 이용
		//1.request scpoe
		request.setAttribute("requestScope", "request");
		
		//2.session scope
		HttpSession session = request.getSession();
		session.setAttribute("sessionScope", "session");
				
		//3.application scope
		ServletContext application = getServletContext();
		application.setAttribute("applicationScope", "application");
		
		//Redirect로 위임
		//Servlet에서 만든 request 사용X -> URL 변경O
		response.sendRedirect("a.jsp");
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException 
	{
		doGet(request, response);
	}

}

2.MVC : 게시판 만들기

 -JDBC 연동(DTO, DAO, Service)

package com.dto;

public class BoardDTO 
{
	private int    num;
	private String title;
	private String author;
	private String content;
	private String writeday;
	private int    readcnt;
	
	public BoardDTO() {}
	public BoardDTO(int num, String title, String author, 
					String content, String writeday, int readcnt) 
	{
		this.num      = num;
		this.title    = title;
		this.author   = author;
		this.content  = content;
		this.writeday = writeday;
		this.readcnt  = readcnt;
	}
	
	public int getNum() 	    { return num; }
	public String getTitle()    { return title; }
	public String getAuthor()   { return author; }
	public String getContent()  { return content; }
	public String getWriteday() { return writeday; }
	public int getReadcnt() 	{ return readcnt; }
	
	public void setNum(int num) 		     { this.num = num; }
	public void setTitle(String title)       { this.title = title; }
	public void setAuthor(String author)     { this.author = author; }
	public void setContent(String content)   { this.content = content; }
	public void setWriteday(String writeday) { this.writeday = writeday; }
	public void setReadcnt(int readcnt)      { this.readcnt = readcnt; }
	
	@Override
	public String toString() {
		return "BoardDTO [num=" + num + ", title=" + title
				+ ", author=" + author + ", content=" + content
				+ ", writeday=" + writeday + ", readcnt=" + readcnt + "]";
	}
	
	
}
package com.dao;

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

import com.dto.BoardDTO;

public class BoardDAO 
{
	//글삭제
	public int delete(Connection con, int n)
	{
		int num = 0;
		PreparedStatement pstmt = null;
		try 
		{
			String sql = "delete board where num = ?";
			
			pstmt = con.prepareStatement(sql);
			pstmt.setInt(1, n);
			num = pstmt.executeUpdate();
		} 
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		finally
		{
			try 
			{
				if(pstmt != null) pstmt.close();
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			}
		}
		
		
		return num;
	}
	//글수정
	public int update(Connection con, BoardDTO dto)
	{
		int num = 0;
		PreparedStatement pstmt = null;
		try 
		{
			String sql = "update board set title = ?, author = ?, content = ? "
						+ "where num = ?";
			
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, dto.getTitle());
			pstmt.setString(2, dto.getAuthor());
			pstmt.setString(3, dto.getContent());
			pstmt.setInt(4, dto.getNum());
			
			num = pstmt.executeUpdate();
		} 
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		finally
		{
			try 
			{
				if(pstmt != null) pstmt.close();
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			}
		}
		
		
		return num;
	}
	//조회수 증가(retrieve메서드에서만 사용)
	private void readCntUpdate(Connection con, int num)
	{
		PreparedStatement pstmt = null;
		try 
		{
			String sql = "update board set readcnt = readcnt + 1 where num = ?";
			pstmt = con.prepareStatement(sql);
			pstmt.setInt(1, num);
			pstmt.executeUpdate();
		} 
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		finally
		{
			try 
			{
				if(pstmt != null) pstmt.close();
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			}
		}
	}
	//글쓰기
	public int write(Connection con, BoardDTO dto)
	{
		int num = 0;
		PreparedStatement pstmt = null;
		try 
		{
			String sql = "INSERT INTO board (num, title, author, content) "
						+ "values(board_seq.nextval, ?, ?, ?)";
			
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, dto.getTitle());
			pstmt.setString(2, dto.getAuthor());
			pstmt.setString(3, dto.getContent());
			
			num = pstmt.executeUpdate();
		} 
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		finally
		{
			try 
			{
				if(pstmt != null) pstmt.close();
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			}
		}
		
		
		return num;
	}
	
	public List<BoardDTO> list(Connection con) 
	{
		//DeptDTO 누적용
		List<BoardDTO> list = new ArrayList<BoardDTO>();
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try 
		{
			String sql = "SELECT num, title, author, content, to_char(writeday, 'yyyy/mm/dd') as writeday, readcnt"
						  + " FROM board order by num desc";
			pstmt = con.prepareStatement(sql);
			rs = pstmt.executeQuery();
			
			while( rs.next())
			{
				int    num = rs.getInt("num");     
				String title = rs.getString("title");   
				String author = rs.getString("author");
				String writeday = rs.getString("writeday");
				int    readcnt = rs.getInt("readcnt"); 
				 
				BoardDTO dto = new BoardDTO();
				dto.setNum(num);
				dto.setTitle(title);
				dto.setAuthor(author);
				dto.setWriteday(writeday);
				dto.setReadcnt(readcnt);
				 
				list.add(dto);
			}
		} 
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		finally
		{
			try 
			{
				if(rs != null) rs.close();
				if(pstmt != null) pstmt.close();
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			}
		}
		return list;
	}
	
	//글자세히 보기
	public BoardDTO retrieve(Connection con, int num) 
	{
		//readCntUpdate() 호출
		readCntUpdate(con, num);
		
		BoardDTO dto = new BoardDTO();
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		try 
		{
			String sql = "SELECT num, title, author, content, to_char(writeday, 'yyyy/mm/dd') as writeday, readcnt"
						  + " FROM board where num = ?";
			pstmt = con.prepareStatement(sql);
			pstmt.setInt(1, num);
			rs = pstmt.executeQuery();
			
			if(rs.next())
			{   
				String title = rs.getString("title");   
				String author = rs.getString("author");
				String content = rs.getString("content");
				String writeday = rs.getString("writeday");
				int    readcnt = rs.getInt("readcnt");
				 
				dto.setNum(num);
				dto.setTitle(title);
				dto.setAuthor(author);
				dto.setContent(content);
				dto.setWriteday(writeday);
				dto.setReadcnt(readcnt);
			}
		} 
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		finally
		{
			try 
			{
				if(rs != null) rs.close();
				if(pstmt != null) pstmt.close();
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			}
		}
		return dto;
	}
	
}
package com.service;

import java.util.List;

import com.dto.BoardDTO;

public interface BoardService 
{
	public List<BoardDTO> list();
	public int write(BoardDTO dto);
	public BoardDTO retrieve(int num);
	public int update(BoardDTO dto);
	public int delete(int n);
}
package com.service;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;

import com.dao.BoardDAO;
import com.dto.BoardDTO;

public class BoardServiceImpl implements BoardService 
{
	//4가지 정보 설정
	String driver = "oracle.jdbc.driver.OracleDriver";
	String url = "jdbc:oracle:thin:@localhost:1521:xe";
	String userid = "SCOTT";
	String passwd = "TIGER";
	
	public BoardServiceImpl()
	{
		try { Class.forName(driver); } 
		catch (ClassNotFoundException e) { e.printStackTrace(); }
	}
	
	@Override
	public int delete(int n) 
	{
		Connection con = null;
		int num = 0;
		try 
		{
			con = DriverManager.getConnection(url, userid, passwd);
			
			BoardDAO dao = new BoardDAO();
			num = dao.delete(con, n);
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		finally
		{
			try 
			{
				if(con != null) con.close();
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			}
		}
		
		return num;
	}
	
	@Override
	public int update(BoardDTO dto) 
	{
		Connection con = null;
		int num = 0;
		try 
		{
			con = DriverManager.getConnection(url, userid, passwd);
			
			BoardDAO dao = new BoardDAO();
			num = dao.update(con, dto);
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		finally
		{
			try 
			{
				if(con != null) con.close();
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			}
		}
		
		return num;
	}
	
	@Override
	public int write(BoardDTO dto) 
	{
		Connection con = null;
		int num = 0;
		try 
		{
			con = DriverManager.getConnection(url, userid, passwd);
			
			BoardDAO dao = new BoardDAO();
			num = dao.write(con, dto);
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		finally
		{
			try 
			{
				if(con != null) con.close();
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			}
		}
		
		return num;
	}
	
	@Override
	public List<BoardDTO> list() 
	{
		Connection con = null;
		List<BoardDTO> list = null;
		try 
		{
			con = DriverManager.getConnection(url, userid, passwd);
			
			BoardDAO dao = new BoardDAO();
			list = dao.list(con);
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		finally
		{
			try 
			{
				if(con != null) con.close();
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			}
		}
		return list;
	}

	@Override
	public BoardDTO retrieve(int num) 
	{
		Connection con = null;
		BoardDTO dto = null;
		try 
		{
			con = DriverManager.getConnection(url, userid, passwd);
			
			BoardDAO dao = new BoardDAO();
			dto = dao.retrieve(con, num);
		}
		catch(SQLException e)
		{
			e.printStackTrace();
		}
		finally
		{
			try 
			{
				if(con != null) con.close();
			} 
			catch (SQLException e) 
			{
				e.printStackTrace();
			}
		}
		return dto;
	}
}

 -JSP

 1)게시판 목록 JSP

<%@page import="com.dto.BoardDTO"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판 목록보기</title>
</head>
<body>
<table border="1">
	<tr>
		<th>글번호</th>
		<th>제목</th>
		<th>작성자</th>
		<th>작성일</th>
		<th>조회수</th>
	</tr>
<%
	List<BoardDTO> list = (List<BoardDTO>)request.getAttribute("board_list");
	for(BoardDTO dto : list)
	{
		int num = dto.getNum();
		String author = dto.getAuthor();
		String writeday = dto.getWriteday();
		int readcnt = dto.getReadcnt();
%>	
	<tr>
		<td><%= num %></td>
		<td><a href="retrieve?num=<%= num %>"><%= dto.getTitle() %></a></td>
		<td><%= author %></td>
		<td><%= writeday %></td>
		<td><%= readcnt %></td>
	</tr>
<%
	} 
%>

</table>
<a href="writeUI">글쓰기</a>
</body>
</html>

 2)게시글 보기 JSP

<%@page import="com.dto.BoardDTO"%>
<%@ 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>
<h1>글자세히보기</h1>
<%
	BoardDTO dto = (BoardDTO)request.getAttribute("retrieve");
%>
<form action="update" method="get">
<input type="hidden" name="num" value="<%= dto.getNum() %>">
						<!-- 공백 -->
글번호 : <%= dto.getNum() %>&nbsp;
작성일 : <%= dto.getWriteday() %>&nbsp;
조회수 : <%= dto.getReadcnt() %><br>
제목 :  <input type="text" name="title" value="<%= dto.getTitle() %>"><br>
작성자 : <input type="text" name="author" value="<%= dto.getAuthor() %>"><br>
내용 :  <textarea name="content" rows="10" cols="30"><%= dto.getContent() %></textarea><br>
<input type="submit" value="수정">
<a href="delete?num=<%= dto.getNum() %>">글삭제</a>
</form>
<br>
<a href="list">목록보기</a>
</body>
</html>

 3)게시글 수정 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>
<h1>글작성</h1>
<form action="write" method="get">
제목 : <input type="text" name="title"><br>
작성자 : <input type="text" name="author"><br>
내용 : <textarea name="content" rows="10" cols="30"></textarea>
<input type="submit" value="저장">
</form>
</body>
</html>

 -Servlet

 1)게시판 목록보기

package com.controller;

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

import javax.servlet.RequestDispatcher;
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.dto.BoardDTO;
import com.service.BoardService;
import com.service.BoardServiceImpl;

@WebServlet("/list")
public class BoardListController extends HttpServlet 
{
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException 
	{
		//비즈니스 로직 처리
		BoardService service = new BoardServiceImpl();
		List<BoardDTO> list = service.list();
		
		//데이터 전달 => scope 이용
		request.setAttribute("board_list", list);
		
		//jsp에게 요청(위임)
		RequestDispatcher dispatch = request.getRequestDispatcher("list.jsp");
		dispatch.forward(request, response);
		
		
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException 
	{
		doGet(request, response);
	}

}

 2)게시판 글쓰기

 -글쓰기 화면 보기

package com.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;

@WebServlet("/writeUI")
public class BoardWriteUIController extends HttpServlet 
{
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException 
	{
		//writeFrom.jsp 요청(위임)
		response.sendRedirect("writeForm.jsp");
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException 
	{
		doGet(request, response);
	}

}

 -글쓰기 저장

package com.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.dto.BoardDTO;
import com.service.BoardService;
import com.service.BoardServiceImpl;

@WebServlet("/write")
public class BoardWriteController extends HttpServlet 
{
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException 
	{
		//사용자 입력 파라미터 얻기
		String title = request.getParameter("title");
		String author = request.getParameter("author");
		String content = request.getParameter("content");
		
		BoardService service = new BoardServiceImpl();
		BoardDTO dto = new BoardDTO();
		dto.setTitle(title);
		dto.setAuthor(author);
		dto.setContent(content);
		
		int num = service.write(dto);
		
		//목록으로 가기 => list.jsp로 직접가면 안됨
		//Servlet 요청	   (서블릿 매핑값)
		response.sendRedirect("list");
		
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException 
	{
		//한글처리
		response.setCharacterEncoding("utf-8");
		doGet(request, response);
	}

}

 3)게시글 보기

package com.controller;

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

import javax.servlet.RequestDispatcher;
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.dto.BoardDTO;
import com.service.BoardService;
import com.service.BoardServiceImpl;

@WebServlet("/retrieve")
public class BoardRetrieveController extends HttpServlet 
{
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException 
	{
		String num = request.getParameter("num");
		
		BoardService service = new BoardServiceImpl();
		BoardDTO dto = service.retrieve(Integer.parseInt(num));
		
		//데이터 전달
		request.setAttribute("retrieve", dto);
		
		//jsp 요청(위임)
		request.getRequestDispatcher("retrieve.jsp").forward(request, response);
		
		
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException 
	{
		doGet(request, response);
	}

}

 4)게시글 수정

package com.controller;

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

import javax.servlet.RequestDispatcher;
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.dto.BoardDTO;
import com.service.BoardService;
import com.service.BoardServiceImpl;

@WebServlet("/update")
public class BoardUpdateController extends HttpServlet 
{
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException 
	{
		//수정할 입력 파라미터 얻기
		String num = request.getParameter("num");
		String title = request.getParameter("title");
		String author = request.getParameter("author");
		String content = request.getParameter("content");
		
		BoardDTO dto = new BoardDTO();
		dto.setNum(Integer.parseInt(num));
		dto.setTitle(title);
		dto.setAuthor(author);
		dto.setContent(content);
		
		BoardService service = new BoardServiceImpl();
		int n = service.update(dto);
		
		//jsp요청(위임)
		response.sendRedirect("list");
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException 
	{
		doGet(request, response);
	}

}

 5)게시글 삭제

package com.controller;

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

import javax.servlet.RequestDispatcher;
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.dto.BoardDTO;
import com.service.BoardService;
import com.service.BoardServiceImpl;

@WebServlet("/delete")
public class BoardDeleteController extends HttpServlet 
{
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException 
	{
		//비즈니스 로직 처리
		String num = request.getParameter("num");
		
		BoardService service = new BoardServiceImpl();
		int n = service.delete(Integer.parseInt(num));
		
		//jsp요청(위임)
		response.sendRedirect("list");
		
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException 
	{
		doGet(request, response);
	}

}

'JAVA' 카테고리의 다른 글

18.mybatis  (0) 2022.08.08
17.MVC/mybatis  (0) 2022.08.05
15.Java 경로/Scope/JSP  (0) 2022.08.03
14.Java Servlet/DB 연동  (0) 2022.08.02
13.Java Wep Application/Servlet  (0) 2022.08.01