v 와 c 가 하나이고, 에 객체생성이들어간것
객체생성이 jsp 에 들어가면 안된다
jsp 안에 모든 처리 다 때리박는게 모델 원
M V C 가 각각 모듈화 되어있다
아래는 모델 2 의 각 파트별 코드이다.
package edu.global.ex.dto; import java.sql.Timestamp; /* 이름 널? 유형 -------- -------- ------------- BID NOT NULL NUMBER(4) BNAME VARCHAR2(20) BTITLE VARCHAR2(100) BCONTENT VARCHAR2(300) BDATE DATE BHIT NUMBER(4) BGROUP NUMBER(4) BSTEP NUMBER(4) BINDENT NUMBER(4) */ public class BDto { private int bid; private String bname; private String btitle; private String bcontent; private Timestamp bdate; private int bhit; private int bgroup; private int bstep; private int bindent; // public BDto() {} // public BDto( int bid, String bname, String btitle, String bcontent, Timestamp bdate, int bhit, int bgroup, int bstep, int bindent ) { this.bid = bid; this.bname = bname; this.btitle = btitle; this.bcontent = bcontent; this.bdate = bdate; this.bhit = bhit; this.bgroup = bgroup; this.bstep = bstep; this.bindent = bindent; } public int getBid() { return bid; } public void setBid(int bid) { this.bid = bid; } public String getBname() { return bname; } public void setBname(String bname) { this.bname = bname; } public String getBtitle() { return btitle; } public void setBtitle(String btitle) { this.btitle = btitle; } public String getBcontent() { return bcontent; } public void setBcontent(String bcontent) { this.bcontent = bcontent; } public Timestamp getBdate() { return bdate; } public void setBdate(Timestamp bdate) { this.bdate = bdate; } public int getBhit() { return bhit; } public void setBhit(int bhit) { this.bhit = bhit; } public int getBgroup() { return bgroup; } public void setBgroup(int bgroup) { this.bgroup = bgroup; } public int getBstep() { return bstep; } public void setBstep(int bstep) { this.bstep = bstep; } public int getBindent() { return bindent; } public void setBindent(int bindent) { this.bindent = bindent; } }
package edu.global.ex.dao; // import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Timestamp; import java.util.ArrayList; import java.util.List; // import javax.naming.Context; import javax.naming.InitialContext; import javax.sql.DataSource; // import edu.global.ex.dto.BDto; // public class BDao { //커넥션풀을 사용하기 위한 소스코드 (DataSource를 import할 시 java.sql로 해야한다. private DataSource dataSource = null; //기존에driver를 설정하고 Class.forName(driver)를 넣는 방식과는 달리 context.xml에 //리소스를 설정해주었다. context.xml에 있는 소스를 읽기 위해 context객체 생성한다 public BDao() { try { //jdbc/oracle : context.xml에 들어간 Resource에서 name에 해당하는 부분 //위의 식은 context.xml에서 name을 lookup 찾으라는 뜻이다. Context context = new InitialContext(); dataSource = (DataSource) context.lookup("java:comp/env/jdbc/oracle"); } catch (Exception e) { e.printStackTrace(); } } public List<BDto> list(){ ArrayList<BDto> dtos = new ArrayList<>(); Connection connection = null; PreparedStatement preparedStatement = null; ResultSet rs = null; try { String query= "select * from mvc_board"; connection = dataSource.getConnection(); preparedStatement = connection.prepareStatement(query); rs = preparedStatement.executeQuery(); while(rs.next()) { int bid = rs.getInt("bid"); String bname = rs.getString("bname"); String btitle = rs.getString("btitle"); String bcontent = rs.getString("bcontent"); Timestamp bdate = rs.getTimestamp("bdate"); int bhit = rs.getInt("bhit"); int bgroup = rs.getInt("bgroup"); int bstep = rs.getInt("bstep"); int bindent = rs.getInt("bindent"); BDto dto = new BDto(bid, bname, btitle, bcontent, bdate, bhit, bgroup, bstep, bindent); dtos.add(dto); } } catch (Exception e) { e.printStackTrace(); }finally { try { if(rs != null) rs.close(); if(preparedStatement != null) preparedStatement.close(); if(connection != null) connection.close(); } catch (Exception e2) { // TODO: handle exception } } return dtos; } public void write(String bname, String btitle , String bcontent){ System.out.println("write() .."); Connection connection = null; PreparedStatement preparedStatement = null; //이때 ?,?,? 물음표는 아래에서 setString메소드로 넣어줄 값을 표현하는 것 try { /* 파라미터로 받는 값이 bname, btitle, bcontent 3개므로, 3개만 ?로 넣고 나머지는 0으로 설정했다. 글 작성시 조회수(bhit)는 0이고, 원본 글로 취급하므로 bstep, bindent는 지수를 넣어줄 필요가 없기 때문이다. */ String query = "insert into mvc_board " + "(bid, bname, btitle, bcontent, bhit, bgroup, bstep, bindent )" + "values ( mvc_board_seq.nextval,?,?,?,0, mvc_board_seq.currval,0,0)"; connection = dataSource.getConnection(); preparedStatement = connection.prepareStatement(query); preparedStatement.setString(1, bname); preparedStatement.setString(2, btitle); preparedStatement.setString(3, bcontent); int rn = preparedStatement.executeUpdate(); System.out.println("업데이트 갯수 :"+rn); } catch (Exception e) { e.printStackTrace(); }finally { try { if(preparedStatement != null) preparedStatement.close(); if(connection != null) connection.close(); } catch (Exception e2) { // TODO: handle exception } } } }
package edu.global.ex.command; // import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; // public interface BCommand { //인터페이스므로 메소드선언만 가능하다. 구현은 자손이 한다. void execute(HttpServletRequest request, HttpServletResponse response); }
package edu.global.ex.command; // import java.util.ArrayList; import java.util.List; // import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; // import edu.global.ex.dao.BDao; import edu.global.ex.dto.BDto; // public class BListcommand implements BCommand { //자손이 구현하므로 interface의 메소드를 override한다. @Override public void execute(HttpServletRequest request, HttpServletResponse response) { BDao dao = new BDao(); //테이블에 있는 모든 데이터를 끌고 온다는 뜻 List<BDto> dtos = dao.list(); //forwarding될때까지 메모리에 살아있음을 반드시 기억해야한다★ request.setAttribute("list", dtos); } }
package edu.global.ex.command; // import java.util.ArrayList; import java.util.List; // import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; // import edu.global.ex.dao.BDao; import edu.global.ex.dto.BDto; // public class BWritecommand implements BCommand { // //자손이 구현하므로 interface의 메소드를 override한다. @Override public void execute(HttpServletRequest request, HttpServletResponse response) { // String bname = request.getParameter("bname"); String btitle = request.getParameter("btitle"); String bcontent = request.getParameter("bcontent"); // // // BDao dao = new BDao(); dao.write(bname, btitle, bcontent); // } // }
package edu.global.ex.controller; // import java.io.IOException; // 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 edu.global.ex.command.BCommand; import edu.global.ex.command.BListcommand; // // 모든 url 들은 webServlet에서 받아내겠다는 뜻 @WebServlet("*.do") public class BController extends HttpServlet { private static final long serialVersionUID = 1L; // /** * @see HttpServlet#HttpServlet() */ public BController() { super(); // } // /** * @see HttpServlet#doGet( HttpServletRequest request, HttpServletResponse response) */ protected void doGet( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { //doGet메소드를 탈 시에 console에 기록하기 위해 넣었다.(디버깅위해) System.out.println("doGet() .."); actionDo(request,response); } // /** * @see HttpServlet#doPost( HttpServletRequest request, HttpServletResponse response) */ protected void doPost( HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { //doPost메소드를 탈 시에 console에 기록하기 위해 넣었다.(디버깅위해) System.out.println("doPost() .."); actionDo(request,response); } // private void actionDo( HttpServletRequest request, HttpServletResponse response ) throws ServletException , IOException { System.out.println("actionDo() .."); // request.setCharacterEncoding("UTF-8"); // String viewPage = null; BCommand command = null; // //위의 세 줄은 http://localhost:8282/jsp_mvc_board/list.do 에서 //list.do를 꺼내기 위한 코드들. String uri = request.getRequestURI(); String conPath = request.getContextPath(); String com = uri.substring(conPath.length()); // System.out.println("경로 확인:" + uri + ":" + conPath + ":" + com ); // if(com.equals("/list.do")) { System.out.println("디버깅문구"); command = new BListcommand(); command.execute(request, response); viewPage ="list.jsp"; }else if (com.equals("/write_view.do")) { System.out.println("/write_view.do......."); viewPage = "write_view.jsp"; } // /* 클라이언트에게 list 는 list.jsp로 forwarding을 시키겠다는 의미이다. forwarding은 BListCommand클래스에서 메모리에 올린 request, response 객체 정보를 list.jsp에서 사용가능하다는 의미다. forwarding될때까지 정보가 살아있기 때문이다. 고로 list.jsp에서 forEach문을 사용하여 데이터를 꺼낼 수 있다. */ // RequestDispatcher dispatcher = request.getRequestDispatcher(viewPage); dispatcher.forward(request, response); } }
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <table width="500" border="1"> <tr> <td>번호</td> <td>이름</td> <td>제목</td> <td>날짜</td> <td>히트</td> </tr> <!-- --이때 list는 BListCommand에서 메모리에 올린 list를 뜻함. 포워딩시까지 살아있으므로 forEach문을 이용해 데이터를 꺼낼 수 있다. --> <c:forEach var="board" items="${list}"> <tr> <td>${board.bid}</td> <td>${board.bname}</td> <td>${board.btitle}</td> <td>${board.bdate}</td> <td>${board.bhit}</td> </tr> </c:forEach> <tr> <td colspan="5"> <a href="write_view.do">글 작성</a></td> </tr> </table> </body> </html>
<%@ 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> <table width="500" cellpadding="0" cellspacing="0" border="1"> <form action="write.do" method="post"> -- form action : form태그에서 submit시 write.do로 이동하도록 설정하는부분 <tr> <td>이름</td> <td><input type="text" name="bname" size="50"></td> </tr> <tr> <td>제목</td> <td><input type="text" name="btitle" size="50"></td> </tr> <tr> <td>내용</td> <td><textarea name="bcontent" rows="10"></textarea></td> </tr> <tr> <td colspan="2"> <input type="submit" value="입력"> <a href="list.do">목록보기</a></td> </tr> </form> </table> </body> </html>