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
'Servlet & JSP > Servlet & JSP 공부' 카테고리의 다른 글
[자바웹을다루는기술] MVC 이용한 회원 관리 - 회원 정보 추가 (0) | 2022.02.23 |
---|---|
[자바웹을다루는기술] MVC패턴 (0) | 2022.02.23 |
[자바웹을다루는기술] JSP 액션태그 (0) | 2022.02.17 |
[자바웹을다루는기술] 스크립트 요소 이용해 회원 정보 조회하기 (0) | 2022.02.17 |
[자바웹을다루는기술] 내장 객체 기능 (0) | 2022.02.17 |