현재 디렉토리 구조이다.
web/WEB-INF/views가 view에 해당한다.
각 계층간 데이터 교환을 위한 객체
public class SaramDTO {
Long seq;
String id;
String name;
int age;
// 생성자, getter/setter, toString() ...
}
saram 테이블의 seq, id, name, age를 클래스의 멤버변수로 선언한다.
DTO 멤버변수를 private로 구성하고 생성자, getter/setter을 구현한다.
DB의 데이터를 접근하는데 쓰이는 객체
public class SaramDAO {
// Database에 CRUD를 전담하는 클래스
Connection conn = null; // 디비 연결 용도
PreparedStatement stmt = null; // 디비에 SQL 전달
ResultSet rs = null; // 결과를 받아 올때 사용.
final String FIND_ALL = "SELECT * FROM SARAM";
final String FIND_ONE = "SELECT * FROM SARAM WHERE SEQ = ?";
final String SAVE = "insert into saram(id, name, age) values(?,?,?)";
final String UPDATE="UPDATE SARAM SET ID =?, NAME=? , AGE =? WHERE SEQ=?";
final String DELETE="DELETE FROM SARAM WHERE=?";
// 검색
public List<SaramDTO> findAll() {
List<SaramDTO> list = new ArrayList<SaramDTO>();
try {
conn = JdbcUtil.getConnection();
stmt = conn.prepareStatement(FIND_ALL);
rs = stmt.executeQuery();
while(rs.next()) {
Long seq = rs.getLong("seq");
String id = rs.getString("id");
String name = rs.getString("name");
int age = rs.getInt("age");
list.add(new SaramDTO(Math.toIntExact(seq), id, name, age));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JdbcUtil.close(conn, stmt, rs);
}
return list;
}
public SaramDTO findOne(SaramDTO dto) {
return null;
}
// 입력
public void save(SaramDTO dto) {
}
// 수정
public void update(SaramDTO dto) {
}
// 삭제
public void remove(SaramDTO dto) {
}
}
conn = JdbcUtil.getConnection();
- conn 객체를 통해 데이터베이스에 엑세스한다.
stmt = conn.prepareStatement(FIND_ALL); rs = stmt.executeQuery();
- 조회, 입력, 수정, 삭제 기능에 적절한 쿼리문을 전달하여 작업을 수행하고 결과를 rs 객체에 담는다.
JdbcUtil.close(conn, stmt, rs);
- 사용한 리소스를 반납한다
public class SaramController implements Controller {
@Override
public String process(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{
// String으로 다운 캐스팅
String path = (String)req.getAttribute("path");
SaramDAO dao = new SaramDAO();
String viewName = "/WEB-INF/views/home.jsp";
if(path.indexOf("/input.do") != -1) {
viewName = "/WEB-INF/views/saram/input.jsp";
} else if(path.indexOf("/detail.do") != -1) {
viewName = "/WEB-INF/views/saram/detail.jsp";
} else if(path.indexOf("/modify.do") != -1) {
SaramDTO dto = new SaramDTO();
dto.setSeq(Integer.parseInt(req.getParameter("seq")));
SaramDTO saram = dao.findOne(dto);
req.setAttribute("saram",saram);
viewName = "/WEB-INF/views/saram/modify.jsp";
} else {
List<SaramDTO> list = dao.findAll();
req.setAttribute("list", list);
viewName = "/WEB-INF/views/saram/list.jsp";
}
return viewName;
}
}
사용자의 url에 따른 dao의 처리 메소드(CRUD)을 불러오고 수행 후 적절한 view를 리턴한다.
public class DispatcherServlet extends HttpServlet {
SaramDAO saramDAO = new SaramDAO();
SaramController saramController = new SaramController();
BoardController boardController = new BoardController();
private String encodingWork(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html; charset=UTF-8");
// path 만들기
String ctxPath = req.getContextPath();
String reqUri = req.getRequestURI();
int beginIndex = ctxPath.length();
String path = reqUri.substring(beginIndex);
System.out.println("path >>>> " + path);
// 하위 컨트롤러에서 path를 사용하도록 req에 저장
req.setAttribute("path", path);
return path;
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet() - DispatcherServlet 요청");
String path = encodingWork(req,resp);
//String viewName = new BoardController().process(req, resp);
//String viewName = new SaramController().process(req, resp);
Controller controller = new BoardController(); // 업캐스팅
if(path.indexOf("/saram") != -1) {
controller = saramController;
} else if(path.indexOf("/board") != -1) {
controller = boardController;
}
String viewName = controller.process(req, resp);
RequestDispatcher view = req.getRequestDispatcher(viewName);
view.forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String path = encodingWork(req, resp);
int seq = Integer.parseInt(req.getParameter("seq")==null?"0":req.getParameter("seq"));
String id = req.getParameter("id");
String name = req.getParameter("name");
int age = Integer.parseInt(req.getParameter("age")==null?"0":req.getParameter("age"));
SaramDTO dto = new SaramDTO(seq,id, name, age);
if("/saram/input.do".indexOf(path) != -1){
saramDAO.save(dto);
}
else if("/saram/modify.do".indexOf(path)!=-1){
saramDAO.update(dto);
}
resp.sendRedirect(req.getContextPath() + "/saram/list.do");
}
}
사용자의 url get/post의 흐름에 따라 적절한 뷰를 리턴하거나 로직을 수행한 후 뷰를 리턴한다.
https://taylog.tistory.com/59
https://12716.tistory.com/entry/JDBC-MVC-%ED%8C%A8%ED%84%B4Model-View-Controller