Servlet & JSP/Servlet & JSP 공부

[자바웹을다루는기술] MVC 이용한 회원 관리 - 회원조회기능

개발자하소서 2022. 2. 23. 12:54
728x90
반응형
SMALL

* MVC방식으로 브라우저의 요청은 서블릿이 맡고,

  비즈니스 처리는 모델이 맡고, 화면은 JSP가 맡는 회원관리 기능구현

 

📌 회원 정보 조회 기능 구현

- 회원 조회 기능 구성

   View = listMembers.jsp

   Model = MemberDAO, MemberVO

   Controller = MemberController(/mem.do)

 

- 회원 조회 기능 순서

1. 브라우저에서 /mem.do로 요청한다.

2. 서블릿 MemberController가 요청을 받아서 MemberDAO의 listMembers() 메서드를 호출한다. 

3. MemberDAO의 listMembers() 메서드에서 SQL문으로 회원 정보를 조회를 한 후에 회원 정보를

   MemberVO에 설정하여 반환한다.

4. 다시 MemberController에서는 조회한 회원 정보를 회원 목록창(listMembers.jsp)으로 포워딩한다.

5. 회원목록창(listMembers.jsp)에서 포워딩한 회원 정보를 목록으로 출력한다. 

 

 

 

📌MemberController

package sec01.ex01;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
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("/mem.do")
public class MemberController extends HttpServlet {
	private static final long serialVersionUID = 1L;
	MemberDAO memberDAO;

	public void init() throws ServletException {
		memberDAO = new MemberDAO();
		// init메서드에서 MemberDAO 객체를 초기화한다.
		// MemberDAO를 생성한다.
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request, response);

	}

	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		List<MemberVO> membersList = memberDAO.listMembers();
		// MemberDAO의 listMembers()메서드를 호출하여 회원정보를 ArrayList로 반환 받는다
		// 요청에 대해 회원정보를 조회한다.
		
		request.setAttribute("membersList", membersList);
		// request에 조회한 회원정보를 membersList 속성 이름으로 바인딩한다.
		// 조회한 회원 정보를 request에 바인딩한다.
		
		RequestDispatcher dispatch = request.getRequestDispatcher("/test01/listMembers.jsp");
		dispatch.forward(request, response);
		// RequestDispatcher클래스를 이용해서 회원목록창(listMembers.jsp)로 포워딩 한다.
		// 컨트롤러에서 표시하고자 하는 jsp로 포워딩 한다. 
		
		// <====Dispatcher Servlet 개념 ======>
		// dispatcherservlet은 받은 요청을 어딘가로 빨리빨리 보내는 서블릿을 뜻한다
       // DispatcherServlet이 모든 요청을 받고 세부 경로는 각 Controller에게 뿌려주는 프론트 컨트롤러의 역할을 함으로써,
	   //web.xml에 서블릿을 일일히 등록할 필요가 없어졌다.
	
	}

	
}

 

 

📌MemberDAO

package sec01.ex01;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class MemberDAO {
	private DataSource dataFactory;
	private Connection conn;
	private PreparedStatement pstmt;
	
	

	public MemberDAO() {
		try {
			Context ctx = new InitialContext();
			Context envContext = (Context) ctx.lookup("java:/comp/env");
			//initCtx의 lookup메서드를 이용해서 "java:comp/env" 에 해당하는 객체를 찾아서 evnCtx에 삽입한다.
			
			dataFactory = (DataSource) envContext.lookup("jdbc/oracle");
			//envCtx의 lookup메서드를 이용해서 "jdbc/oracle"에 해당하는 객체를 찾아서 dataFactory에 삽입
			

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public List<MemberVO> listMembers() {
		// listMembers() 메서드 호출 시 sql문을 이용하여 
		 // 회원 정보를 조회한 후에 결과를 ArrayList로 반환한다
		List<MemberVO> membersList = new ArrayList();
		try {
			conn = dataFactory.getConnection();
			 // conn객체에 연결한다
			
			String query = "select * from  t_member order by joinDate desc";
			 // sql문을 작성한다.
			 
			System.out.println(query);
			pstmt = conn.prepareStatement(query);
			 // prepareStatement 객체를 생성하면서 sql문을 인자로 전달한다.
			 

			ResultSet rs = pstmt.executeQuery();
			while (rs.next()) {
				String id = rs.getString("id");
				String pwd = rs.getString("pwd");
				String name = rs.getString("name");
				String email = rs.getString("email");
				Date joinDate = rs.getDate("joinDate");
				MemberVO memberVO = new MemberVO(id, pwd, name, email, joinDate);
				 // 조회한 회원 정보를 레코드별로 MemberVO 객체의 속성에 저장한다.
				
				membersList.add(memberVO);
				// membersList에 memberVO객체들을 차례대로 저장한다.
			 }
			 
			 rs.close();
			 pstmt.close();
			 conn.close();
		 }catch(Exception e) 
		 {
			 e.printStackTrace();
		 }
		 return membersList;
	 }
	 
	 public void addMember(MemberVO m) {
		 
		 try {
			 
			 conn = dataFactory.getConnection();
			 String id = m.getId();
			 String pwd = m.getPwd();
			 String name = m.getName();
			 String email = m.getEmail();
			 String query = "INSERT INTO t_member(id, pwd, name, email)" + " VALUES(?, ? ,? ,?)";
			 System.out.println(query);
			 // preparestatment 객체를 생성하면서 sql문을 인자로 전달한다.
			 // ---- PreparedStatement를 사용하는 순서 -----
			 //① Connection.prepareStatement() 메소드를 사용하여 PreparedStatement 생성
			 //② PreparedStatement의 set 메소드를 사용하여 필요한 값 지정
			 //③ PreparedStatement의 executeQuery() 또는 excuteUpdate() 메소드를 사용하여 쿼리 실행
			 // ④ finally 블록을 사용한 PreparedStatement 를 닫는다.(close() 메소드 실행)
			 pstmt = conn.prepareStatement(query);
			 pstmt.setString(1, id);
			 pstmt.setString(2, pwd);
			 pstmt.setString(3, name);
			 pstmt.setString(4, email);
			 pstmt.executeUpdate();
			 // sql문을 실행한다 
			 // executeQuery는 result set을 만드는 sql문에서 사용하며, 주로 SELECT문을 수행할 때 사용됩니다.
			 //executeUpdate는 INSERT나 UPDATE와 같은 DDL이나 DML을 실행할 때 사용됩니다.
			 pstmt.close();
			 conn.close();
			 
		 }catch(Exception e) 
		 {
			 e.printStackTrace();
			 }
	 }
}

 

📌MemberVO

 

package sec01.ex01;

import java.sql.Date;

public class MemberVO {

	private String id;
	private String pwd;
	private String name;
	private String email;
	private Date joinDate;
	
	// 인자 4개를 갖는 생성자와
	// 인자 5개를 갖는 생성자를 만든다 
	public MemberVO() {
		System.out.println("MemberVO 생성자 호출");
	}
	
	public MemberVO(String id, String pwd, String name, String email) {
		super();
		this.id = id;
		this.pwd = pwd;
		this.name = name;
		this.email = email;
	}



	public MemberVO(String id, String pwd, String name, String email, Date joinDate) {
		super();
		this.id = id;
		this.pwd = pwd;
		this.name = name;
		this.email = email;
		this.joinDate = joinDate;
	}

	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public Date getJoinDate() {
		return joinDate;
	}
	public void setJoinDate(Date joinDate) {
		this.joinDate = joinDate;
	}
	
	
}

 

 

 

📌listMembers.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	import=" java.util.*,sec01.ex01.*"
	pageEncoding="UTF-8"
	isELIgnored="false" 
%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>    
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
request.setCharacterEncoding("UTF-8");
%>    
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원정보출력창</title>
<style>
	.cls1{
	
		font-size: 40px;
		text-align: center;
	}
	
	.cls2{
		font-size: 20px;
		text-align: center;
	}	
</style>
</head>
<body>
 <p class="cls1">회원정보</p>
   <table align="center" border="1" >
      <tr align="center" bgcolor="lightgreen">
         <td width="7%" ><b>아이디</b></td>
         <td width="7%" ><b>비밀번호</b></td>
         <td width="7%" ><b>이름</b></td>
         <td width="7%"><b>이메일</b></td>
         <td width="7%" ><b>가입일</b></td>
   </tr>

 	<!-- choose함수는 자바에서 switch함수랑 같다 -->
 <c:choose>
    <c:when test="${ empty membersList}" >
      <tr>
        <td colspan=5 align="center">
          <b>등록된 회원이 없습니다.</b>
       </td>  
      </tr>
   </c:when>  
   <c:when test="${!empty membersList }" >
      <c:forEach  var="mem" items="${membersList }" >
      			<!-- foreach 문 사용법 -->
			<!-- var = 사용할 변수명	 -->
			<!-- items = Collection 객체(List, Map)	 -->
			<tr align="center">
          <td>${mem.id }</td>
          <td>${mem.pwd }</td>
          <td>${mem.name}</td>     
          <td>${mem.email }</td>     
          <td>${mem.joinDate}</td>     
       </tr>
     </c:forEach>
		</c:when> 	
 	</c:choose>
 	</table>

	<a href="#">
	 	<p class="cls2">회원 가입하기</p>
	</a>


</body>
</html>

 

 

📌결과창 

 

728x90
반응형
LIST