FireDrago

[Servlet] MVC2 연습하기 - CR 구현 본문

프로젝트

[Servlet] MVC2 연습하기 - CR 구현

화이용 2023. 6. 27. 12:07

- mvc 2

모든 요청을 컨트롤러가 받아서 모델, 뷰와 연결하는 패턴을 말한다.  

 

1. web.xml 설정 (컨트롤러 설정)

<servlet>
  <servlet-name>controller</servlet-name>
  <servlet-class>controller.memcontroller</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>controller</servlet-name>
  <url-pattern>*.do</url-pattern>
</servlet-mapping>

controller 패키지의 memcontroller 가 controller 라는 이름의 컨트롤러가 되고,

모든 .do 요청에대해서 우선적으로 처리하게된다.

 

2. 컨트롤러 클래스 작성

public class memcontroller extends HttpServlet{

	@Override
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request,response);
	}

	@Override
	public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		//텍스트 편집
		String RequestURI = req.getRequestURI();
		String contextPath = req.getContextPath();
		String command = RequestURI.substring(contextPath.length());
		System.out.println(command);

		if (command.equals("/read.do")) {
			System.out.println("/read.do실행");
			read(req); // 모델 호출 (여기서는 메서드로 간단히 처리)
			RequestDispatcher fw = req.getRequestDispatcher("./read.jsp"); //뷰에 리퀘스트 재활용해서 보냄
			fw.forward(req, resp);
		} 
		else if(command.equals("/create.do")) {
			System.out.println("/create.do실행");
			create(req);
			RequestDispatcher fw = req.getRequestDispatcher("./create.jsp");
			fw.forward(req, resp);
		}
		else if(command.equals("/create_action.do")) {
			System.out.println("/create_action.do실행");
			create_action(req);
			RequestDispatcher fw = req.getRequestDispatcher("/read.do");
			fw.forward(req, resp);
		}

	}

	public void read(HttpServletRequest request) {
		dao daoconn = dao.getinstance();
		ArrayList<member> allmember = daoconn.getallmember();
		request.setAttribute("all", allmember);
	}

	public void create(HttpServletRequest request) {
		System.out.println("생성실행");
	}

	public void create_action (HttpServletRequest request) {
		dao daoconn = dao.getinstance();
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		member mb = new member();
		mb.setId(id);
		mb.setPassword(pw);

		daoconn.insert(mb);   
	}
}

편의를 위해 컨트롤러 클래스에 모델 역할을 하는 함수 read( ) ,create( ), create_action( )을 함께 작성했다.

다양한 요청 (/read.do , /create.do, /create_action.do )에 따라 적절한 메서드를 호출한뒤 (모델 ) , 클라이언트에게 보여질 

jsp 페이지 (뷰)를 연결한다. 뷰에 필요한 파라미터도 request 에 담아서 함께 보낸다.

 

3. dto 객체 생성

 dto 객체는 도메인 객체라고도 한다. 데이터를 담는 최소의 단위 객체이다.

package DTO;

public class member {
	private String id;
	private String password;
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}

 

4. dao 객체 생성 

 - dao 객체는 dto 객체에 담긴 각각의 정보들을 ArrayList에 담아 관리하고, 데이터베이스와 연결하여 각종 작업을 수행하는 클래스이다. 

package DAO;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import DTO.member;

public class dao {
	private static dao instance = new dao();

	private dao() {}

	public static dao getinstance() {
		return instance;
	}

	public ArrayList<member> getallmember() {

		Connection conn = null;
		PreparedStatement pstmt=null;
		ResultSet result = null;
		
		try {
			//데이터베이스 연결
			String url = "jdbc:mysql://localhost:3306/crud";
			String user = "root";
			String password ="****";
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection(url,user,password);
			//sql 실행하여 결과값 받기
			String sql = "select * from member";
			pstmt = conn.prepareStatement(sql);
			result = pstmt.executeQuery();
			//결과값을 ArrayList에 담고 반환
			ArrayList<member> allmember = new ArrayList<member>();

			while(result.next()) {
				String id = result.getString("id");
				String pw = result.getString("password");
				//member 객체하나는 데이터베이스 레코드 하나다.
				member mb = new member();
				mb.setId(id);
				mb.setPassword(pw);

				allmember.add(mb);
			}
			return allmember;
			
		} catch(Exception ex) {
			ex.printStackTrace();
		}
		//데이터베이스 연결했으면 반드시 닫아줘야한다.
		finally {
			if(result !=null) {try{result.close();}catch(Exception e){}}
			if(pstmt != null) {try{pstmt.close();}catch(Exception e){}}
			if(conn != null) {try{conn.close();}catch(Exception e){}}
		}
		return null;
	}
	
	public void insert(member mb) {
	      Connection conn = null;
	      PreparedStatement pstmt=null;
	      try 
	      {
	         
	         String url = "jdbc:mysql://localhost:3306/crud";
	         String user = "root";
	         String password ="1234";
	         Class.forName("com.mysql.jdbc.Driver");
	         conn = DriverManager.getConnection(url,user,password);
	         
	         String sql = "insert into member values(?,?)";
	         pstmt = conn.prepareStatement(sql);
	         pstmt.setString(1, mb.getId());
	         pstmt.setString(2, mb.getPassword());
	         pstmt.executeUpdate();
	      } catch (Exception ex) {
	         System.out.println("insertBoard() 에러 : " + ex);
	      } finally {
	         try {                           
	            if (pstmt != null) 
	               pstmt.close();            
	            if (conn != null) 
	               conn.close();
	         } catch (Exception ex) {
	            throw new RuntimeException(ex.getMessage());
	         }      
	      }   
	   }
}

 

5. 뷰 페이지 작성

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ page import="DTO.member" %>
<%
   System.out.println("출력페이지 도착");
   ArrayList<member> all = (ArrayList<member>) request.getAttribute("all"); 
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
   <%
      for(int i=0; i<all.size(); i++){
         member mb = (member) all.get(i);
   %>
      <div style="border:1px solid red; width:30%;">
         <h1>아이디 :</h1><h2><%= mb.getId() %></h2>
         <h1>패스워드 :</h1><h2><%= mb.getPassword() %></h2>
      </div>
   <%      
      }
   %>
   <div>
      <h1></h1>
   </div>
</body>
</html>

read .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="/CRUD/create_action.do" method="post">
      <p> 아이디 : <input type="text" name="id"></p>
      <p> 패스워드 :<input type="text" name="pw"></p>
      <input type="submit" value="전송">
   </form>
</body>
</html>

create.jsp는 수정할 데이터를 입력받는 페이지