16.Servlet JSP 위임/MVC
2022. 8. 4. 16:40ㆍJAVA
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() %>
작성일 : <%= dto.getWriteday() %>
조회수 : <%= 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 |