jsp 221202

John·2022년 12월 2일
0

java

목록 보기
19/20
post-thumbnail

MVC 패턴

모델 1

v 와 c 가 하나이고, 에 객체생성이들어간것

객체생성이 jsp 에 들어가면 안된다
jsp 안에 모든 처리 다 때리박는게 모델 원

모델2

M V C 가 각각 모듈화 되어있다
아래는 모델 2 의 각 파트별 코드이다.



DTO

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;
	}		
}

DAO

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
	         }	         
	      }
	   }
}

command

package edu.global.ex.command;
//
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//
public interface BCommand {
	//인터페이스므로 메소드선언만 가능하다. 구현은 자손이 한다. 
	void execute(HttpServletRequest request, HttpServletResponse response);
}

BListcommand

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);      
		
	}
	
}

BWritecommand

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);
//
	}
	//
}

BController

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);

	}

}

list.jsp

<%@ 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>

write_view.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>
<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="입력">
            &nbsp;&nbsp;<a href="list.do">목록보기</a></td>
         </tr>      
      </form>
   </table>
</body>
</html>
profile
hello there

0개의 댓글