✿∘˚˳°∘°

55일차 : mvc2WebProject - 2 본문

국비수업/Server

55일차 : mvc2WebProject - 2

_HYE_ 2023. 2. 16. 23:20

20230215

1. 마이페이지( + 정보수정 )

header.jsp

이름 버튼을 클릭하면 마이페이지화면으로 이동

      <div class="header-link">
      <%if(m == null){%>
   		<!-- 모달 id와 target 이름 맞추기 -->
        <button class="btn bc11 modal-open-btn" target="#login-modal">SIGN IN</button>
        <a class="btn bc11" href="/signupFrm.do">SIGN UP</a>
      <%}else {%>
      	<!-- 로그인 성공시 회원 이름 출력 -->
      	<!-- 마이페이지1 : /mypage1.do -->
      	<!-- <a class="btn bc11" href="/mypage1.do"><%=m.getMemberName() %></a> --> 
      	<!-- 마이페이지2 : 세션에서 꺼낸 memberId를 키값에넣어 보내줌 -->
      	<a class="btn bc11" href="/mypage2.do?memberId=<%=m.getMemberId()%>"><%=m.getMemberName() %></a>
      	<a class="btn bc11" href="/logout.do">LOGOUT</a>
      <%} %>
      </div>

1 - 1 ) 마이페이지 1 : 세션에 등록되어있는 현재 로그인정보를 이용해 정보수정하기

페이지 이동을 위한 Servlet

package kr.or.iei.member.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;

/**
 * Servlet implementation class Mypage1Servlet
 */
@WebServlet(name = "Mypage1", urlPatterns = { "/mypage1.do" })
public class Mypage1Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Mypage1Servlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//마이페이지 화면에 필요한 데이터는 session에 저장된 정보로 출력
		//1. 인코딩
		request.setCharacterEncoding("utf-8");
		//2. 값추출 - 생략
		//3. 비즈니스로직 - session에 저장된 정보를 이용할것 이므로 db작업 필요없음
		//4. 결과처리
		RequestDispatcher view = request.getRequestDispatcher("/WEB-INF/views/member/mypage1.jsp");
		view.forward(request, response);		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}	

}

mypage1.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>
<style>
	.input-wrap{
		padding: 15px;
	}
	.input-wrap>label{
		font-size: 1.1em;
		margin-bottom: 10px;
		display: block;
	}
	.btn-box{
		text-align: center;
	}
</style>
</head>
<body>
	<%@ include file="/WEB-INF/views/common/header.jsp" %>
	<div class="page-content">
		<div class="page-title">마이페이지1</div>
		<form action="/updateMember1.do" method="post">
			<div class="input-wrap">
				<!-- disable : 수정불가/데이터넘김X | readonly : 수정불가/데이터넘김O -->
				<label for="memberNo">회원번호</label>
				<!-- 헤더에서 이미 세션에 저장된 정보를 꺼내놨으므로 바로m을 사용할 수 있다. -->
				<!-- value주의점 : 자동완성 시 공백이 생기는데 따옴표 안에 공백이 있으면 된단다 value="user02 "공백이 있으면 이렇게 인식된다 -->
				<input type="text" name="memberNo" id="memberNo" class="input-form" value="<%=m.getMemberNo()%>" disabled>
			</div>
			<div class="input-wrap">
				<label for="memberId">아이디</label>
				<input type="text" name="memberId" id="memberId" class="input-form" value="<%=m.getMemberId()%>" readonly>			
			</div>
			<div class="input-wrap">
				<label for="memberPw">비밀번호</label>
				<input type="password" name="memberPw" id="memberPw" class="input-form" value="<%=m.getMemberPw()%>">			
			</div>
			<div class="input-wrap">
				<label for="memberName">이름</label>
				<input type="text" name="memberName" id="memberName" class="input-form" value="<%=m.getMemberName()%>"disabled>			
			</div>
			<div class="input-wrap">
				<label for="memberPhone">전화번호</label>
				<input type="text" name="memberPhone" id="memberPhone" class="input-form" value="<%=m.getMemberPhone()%>">
			</div>
			<div class="input-wrap">
				<label for="memberAddr">주소</label>
				<input type="text" name="memberAddr" id="memberAddr" class="input-form" value="<%=m.getMemberAddr()%>">
			</div>
			<div class="input-wrap">
				<label for="memberLevel">회원등급</label>
				<%if(m.getMemberLevel() == 1) {%>
				<input type="text" name="memberLevel" id="memberLevel" class="input-form" value="관리자" disabled>
				<%}else if(m.getMemberLevel() == 2) {%>
				<input type="text" name="memberLevel" id="memberLevel" class="input-form" value="정회원" disabled>
				<%}else if(m.getMemberLevel() == 3) {%>
				<input type="text" name="memberLevel" id="memberLevel" class="input-form" value="준회원" disabled>
				<%} %>
			</div>
			<div class="input-wrap">
				<label for="enrollDate">가입일</label>
				<input type="text" name="enrollDate" id="enrollDate" class="input-form" value="<%=m.getEnrollDate() %>" disabled>
			</div>
			<div class="btn-box">
				<button type="submit" class="btn bc66 bs2">정보수정</button>
			</div>
		</form>
	</div>
	<%@ include file="/WEB-INF/views/common/footer.jsp" %>
</body>
</html>

정보수정 Servlet

package kr.or.iei.member.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 javax.servlet.http.HttpSession;

import kr.or.iei.member.model.service.MemberService;
import kr.or.iei.member.model.vo.Member;



/**
 * Servlet implementation class UpdateMember1Servlet
 */
@WebServlet(name = "UpdateMember1", urlPatterns = { "/updateMember1.do" })
public class UpdateMember1Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public UpdateMember1Servlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1. 인코딩
		request.setCharacterEncoding("utf-8");
		//2. 값추출
		Member member = new Member();
		member.setMemberId(request.getParameter("memberId"));
		member.setMemberPw(request.getParameter("memberPw"));
		member.setMemberPhone(request.getParameter("memberPhone"));
		member.setMemberAddr(request.getParameter("memberAddr"));
		//3. 비즈니스로직
		MemberService service = new MemberService();
		int result = service.updateMember(member);
		//4. 결과처리
		//-> 1) 다시 마이페이지를 바로 띄우는 방법
		//RequestDispatcher view = request.getRequestDispatcher("/mypage1.do");
		//view.forward(request, response);
		//-> 2) msg.jsp를 이용해서 alert창을 띄우고 마이페지로 가는 방법
		RequestDispatcher view = request.getRequestDispatcher("/WEB-INF/views/common/msg.jsp");
		if(result > 0) {
			request.setAttribute("title", "정보수정성공");
			request.setAttribute("msg", "정보가 수정되었습니다.");
			request.setAttribute("icon", "success");
			
			HttpSession session = request.getSession();
			//getAttribute()는 항상 Object타입
			Member m = (Member)session.getAttribute("m");
			m.setMemberPw(member.getMemberPw());
			m.setMemberPhone(member.getMemberPhone());
			m.setMemberAddr(member.getMemberAddr());
			//session.setAttribute("m", m); 주소를 복사한거기때문에 없어도 된다.			
		}else {
			request.setAttribute("title", "정보수정실패");
			request.setAttribute("msg", "정보수정 실패!");
			request.setAttribute("icon", "error");
		}
		//request.setAttribute("loc", "/WEB-INF/views/member/mypage1.jsp");
		//위코드X -> 주소창에 코드가 바로 들어감 -> WEB-INF는 바로갈수없음(Servlet을 거쳐야함)
		request.setAttribute("loc", "/mypage1.do");
		view.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

Service

	public int updateMember(Member member) {
		Connection conn = JDBCTemplate.getConnection();
		int result = dao.updateMember(conn, member);
		if(result > 0) {
			JDBCTemplate.commit(conn);
		}else {
			JDBCTemplate.rollback(conn);
		}
		JDBCTemplate.close(conn);
		return result;
	}

Dao

	public int updateMember(Connection conn, Member member) {
		PreparedStatement pstmt = null;
		int result = 0;
		String query = "update member_tbl set member_pw=?, member_phone=?, member_addr=? where member_id=?";
		
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, member.getMemberPw());
			pstmt.setString(2, member.getMemberPhone());
			pstmt.setString(3, member.getMemberAddr());
			pstmt.setString(4, member.getMemberId());
			result = pstmt.executeUpdate();

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JDBCTemplate.close(pstmt);
		}
		return result;
	}

2. 마이페이지2 : DB작업으로 현재 로그인한 사람의 정보를 불러와서 정보수정

정보를 조회하기위한 Servlet( Service와 Dao는 중복체크를 위해 작성했던 selectOneMember(memberId)메소드 이용

package kr.or.iei.member.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 kr.or.iei.member.model.service.MemberService;
import kr.or.iei.member.model.vo.Member;

/**
 * Servlet implementation class Mypage2Servlet
 */
@WebServlet(name = "Mypage2", urlPatterns = { "/mypage2.do" })
public class Mypage2Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Mypage2Servlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1.인코딩
		request.setCharacterEncoding("utf-8");
		//2.값추출
		String memberId = request.getParameter("memberId");
		//3.비즈니스로직 - 아이디중복체크할때 사용한걸 활용
		MemberService service = new MemberService();
		Member m = service.selectOneMember(memberId);
		//4.결과처리
		RequestDispatcher view = request.getRequestDispatcher("/WEB-INF/views/member/mypage2.jsp");
		request.setAttribute("m", m);		
		view.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

mypage2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%
    	Member member = (Member)request.getAttribute("m"); 
    	//헤더에서 선언한 Member m과 중복되면 에러가 발생하므로 변수명을 다르게 해준다
    %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<style>
	.input-wrap{
		padding: 15px;
	}
	.input-wrap>label{
		font-size: 1.1em;
		margin-bottom: 10px;
		display: block;
	}
	.btn-box{
		text-align: center;
	}
</style>
</head>
<body>
	<%@ include file="/WEB-INF/views/common/header.jsp" %>
	<div class="page-content">
		<div class="page-title">마이페이지2</div>
		<form action="/updateMember2.do" method="post">
			<div class="input-wrap">				
				<label for="memberNo">회원번호</label>
				<input type="text" name="memberNo" id="memberNo" class="input-form" value="<%=member.getMemberNo()%>" disabled>
			</div>
			<div class="input-wrap">
				<label for="memberId">아이디</label>
				<input type="text" name="memberId" id="memberId" class="input-form" value="<%=member.getMemberId()%>" readonly>			
			</div>
			<div class="input-wrap">
				<label for="memberPw">비밀번호</label>
				<input type="password" name="memberPw" id="memberPw" class="input-form" value="<%=member.getMemberPw()%>">			
			</div>
			<div class="input-wrap">
				<label for="memberName">이름</label>
				<input type="text" name="memberName" id="memberName" class="input-form" value="<%=member.getMemberName()%>"disabled>			
			</div>
			<div class="input-wrap">
				<label for="memberPhone">전화번호</label>
				<input type="text" name="memberPhone" id="memberPhone" class="input-form" value="<%=member.getMemberPhone()%>">
			</div>
			<div class="input-wrap">
				<label for="memberAddr">주소</label>
				<input type="text" name="memberAddr" id="memberAddr" class="input-form" value="<%=member.getMemberAddr()%>">
			</div>
			<div class="input-wrap">
				<label for="memberLevel">회원등급</label>
				<%if(member.getMemberLevel() == 1) {%>
				<input type="text" name="memberLevel" id="memberLevel" class="input-form" value="관리자" disabled>
				<%}else if(member.getMemberLevel() == 2) {%>
				<input type="text" name="memberLevel" id="memberLevel" class="input-form" value="정회원" disabled>
				<%}else if(member.getMemberLevel() == 3) {%>
				<input type="text" name="memberLevel" id="memberLevel" class="input-form" value="준회원" disabled>
				<%} %>
			</div>
			<div class="input-wrap">
				<label for="enrollDate">가입일</label>
				<input type="text" name="enrollDate" id="enrollDate" class="input-form" value="<%=member.getEnrollDate() %>" disabled>
			</div>
			<div class="btn-box">
				<button type="submit" class="btn bc66 bs2">정보수정</button>
				<%if(m.getMemberLevel() == 1) {%>
				<a class="btn bc6 bs2" href="/adminPage.do">회원관리</a>
				<%} else{ %>
				<a class="btn bc6 bs2" href="/deleteMember.do">회원탈퇴</a>
				<%} %>
			</div>
		</form>
	</div>
	<%@ include file="/WEB-INF/views/common/footer.jsp" %>
</body>
</html>

정보 수정을 진행할 Servlet(Service와 Dao는 마이페이지1에서 작성한 코드를 사용)

package kr.or.iei.member.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 javax.servlet.http.HttpSession;

import kr.or.iei.member.model.service.MemberService;
import kr.or.iei.member.model.vo.Member;

/**
 * Servlet implementation class UpdateMember2Servlet
 */
@WebServlet(name = "UpdateMember2", urlPatterns = { "/updateMember2.do" })
public class UpdateMember2Servlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public UpdateMember2Servlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1. 인코딩
				request.setCharacterEncoding("utf-8");
				//2. 값추출
				Member member = new Member();
				member.setMemberId(request.getParameter("memberId"));
				member.setMemberPw(request.getParameter("memberPw"));
				member.setMemberPhone(request.getParameter("memberPhone"));
				member.setMemberAddr(request.getParameter("memberAddr"));
				//3. 비즈니스로직
				MemberService service = new MemberService();
				int result = service.updateMember(member);
				//4. 결과처리
				RequestDispatcher view = request.getRequestDispatcher("/WEB-INF/views/common/msg.jsp");
				if(result > 0) {
					request.setAttribute("title", "정보수정성공");
					request.setAttribute("msg", "정보가 수정되었습니다.");
					request.setAttribute("icon", "success");			
				}else {
					request.setAttribute("title", "정보수정실패");
					request.setAttribute("msg", "정보수정 실패!");
					request.setAttribute("icon", "error");
				}
				//아이디를 넘기지 않았으므로 null로 빠져서 에러발생
				request.setAttribute("loc", "/mypage2.do?memberId="+member.getMemberId());
				view.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

 

3. 관리자페이지

관리자에겐 회원전체정보를 확인할 수 있는 페이지를 / 일반회원에겐 회원탈퇴버튼을 만들어준다.

<%if(m.getMemberLevel() == 1) {%>
<a class="btn bc6 bs2" href="/adminPage.do">회원관리</a>
<%} else{ %>
<a class="btn bc6 bs2" href="/deleteMember.do">회원탈퇴</a>
<%} %>

3 - 1 ) 회원관리 페이지(+ 회원등급변경 )

전체회원 조회를 위한 Servlet

package kr.or.iei.member.controller;

import java.io.IOException;
import java.util.ArrayList;

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 javax.servlet.http.HttpSession;

import kr.or.iei.member.model.service.MemberService;
import kr.or.iei.member.model.vo.Member;

/**
 * Servlet implementation class AdminPageServlet
 */
@WebServlet(name = "AdminPage", urlPatterns = { "/adminPage.do" })
public class AdminPageServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public AdminPageServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1.인코딩
		request.setCharacterEncoding("utf-8");
		//2.값추출 - 세션을 검증해주지 않으면 주소창만 알고있어도 페이지이동+등급변경이 가능하다
		//메인페이지에 들르면 자동으로 session이 생성됨 - else로 또다시 체크해줘야한다
		HttpSession session = request.getSession(false);
		Member m = (Member)session.getAttribute("m");
		
		if(m != null) {
			//로그인이 된 경우
			if(m.getMemberLevel() != 1){
				//로그인은 했으나 해당회원의 level이 1이 아닌경우(관리자가 아닌경우)
				RequestDispatcher view = request.getRequestDispatcher("/WEB-INF/views/common/msg.jsp");
				request.setAttribute("title", "?????");
				request.setAttribute("msg", "관리자만 이용 가능합니다.");
				request.setAttribute("icon", "warning");
				request.setAttribute("loc", "/");
				view.forward(request, response);
				return;
			}
		}else {
			//로그인이 안된 경우
			RequestDispatcher view = request.getRequestDispatcher("/WEB-INF/views/common/msg.jsp");
			request.setAttribute("title", "접근제한");
			request.setAttribute("msg", "로그인 후 이용 가능합니다.");
			request.setAttribute("icon", "info");
			request.setAttribute("loc", "/");
			view.forward(request, response);
			return;
		}
		
		/*
		if(session == null) {
			//세션이 만들어지지 않은상태
			RequestDispatcher view = request.getRequestDispatcher("/WEB-INF/views/common/msg.jsp");
			request.setAttribute("title", "접근제한");
			request.setAttribute("msg", "로그인 후 이용 가능합니다.");
			request.setAttribute("icon", "info");
			request.setAttribute("loc", "/");
			view.forward(request, response);
			return;
		}else {
			//세션이 만들어진 상태
			Member m = (Member)session.getAttribute("m");
			if(m == null) {
				//로그인을 하지않은 상태
				RequestDispatcher view = request.getRequestDispatcher("/WEB-INF/views/common/msg.jsp");
				request.setAttribute("title", "접근제한");
				request.setAttribute("msg", "로그인 후 이용 가능합니다.");
				request.setAttribute("icon", "info");
				request.setAttribute("loc", "/");
				view.forward(request, response);
				return;
			}else if(m.getMemberLevel() != 1){
				//로그인은 했으나 해당회원의 level이 1이 아닌경우(관리자가 아닌경우)
				RequestDispatcher view = request.getRequestDispatcher("/WEB-INF/views/common/msg.jsp");
				request.setAttribute("title", "?????");
				request.setAttribute("msg", "관리자만 이용 가능합니다.");
				request.setAttribute("icon", "warning");
				request.setAttribute("loc", "/");
				view.forward(request, response);
				return;
			}
		}*/
		//3.비즈니스로직
		//전체회원정보 조회
		MemberService service = new MemberService();
		ArrayList<Member> list = service.selectAllMember();
		//4.결과처리
		RequestDispatcher view = request.getRequestDispatcher("/WEB-INF/views/member/adminPage.jsp");
		request.setAttribute("list", list);
		view.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

Service

	public ArrayList<Member> selectAllMember() {
		Connection conn = JDBCTemplate.getConnection();
		ArrayList<Member> list = dao.selectAllMember(conn);
		JDBCTemplate.close(conn);
		return list;
	}

Dao

	public ArrayList<Member> selectAllMember(Connection conn) {
		PreparedStatement pstmt = null;
		ResultSet rset = null;
		ArrayList<Member> list = new ArrayList<Member>();
		String query = "select * from member_tbl order by 1";
		
		try {
			pstmt = conn.prepareStatement(query);
			rset = pstmt.executeQuery();
			while(rset.next()) {
				Member m = new Member();
				m.setEnrollDate(rset.getString("enroll_date"));
				m.setMemberAddr(rset.getString("member_addr"));
				m.setMemberId(rset.getString("member_id"));
				m.setMemberLevel(rset.getInt("member_level"));
				m.setMemberName(rset.getString("member_name"));
				m.setMemberNo(rset.getInt("member_no"));
				m.setMemberPhone(rset.getString("member_phone"));
				m.setMemberPw(rset.getString("member_pw"));
				list.add(m);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JDBCTemplate.close(pstmt);
			JDBCTemplate.close(rset);
		}
		return list;
	}

정보를 받아와 화면에 보여줄 View

<%@page import="kr.or.iei.member.model.vo.Member"%>
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%
    	ArrayList<Member> list = (ArrayList<Member>)request.getAttribute("list");
    %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%@include file="/WEB-INF/views/common/header.jsp" %>
	<div class="page-content">
		<div class="page-title">회원관리</div>
		<table class="tbl tbl-hover">
			<tr class="tr-3">
				<th>선택</th>
				<th>회원번호</th>
				<th>아이디</th>
				<th>이름</th>
				<th>전화번호</th>
				<th>주소</th>
				<th>가입일</th>
				<th>회원등급</th>
				<th>등급변경</th>
			</tr>
			<%for(Member member : list) {%>
			<tr class="tr-1">
				<td><input type="checkbox" class="chk"></td>
				<td><%=member.getMemberNo() %></td>
				<td><%=member.getMemberId() %></td>
				<td><%=member.getMemberName() %></td>
				<td><%=member.getMemberPhone() %></td>
				<td><%=member.getMemberAddr() %></td>
				<td><%=member.getEnrollDate() %></td>
				<td>
					<%if(member.getMemberLevel() == 1) {%>
					<select class="input-form">
						<option value="1" selected>관리자</option>
						<option value="2">정회원</option>
						<option value="3">준회원</option>
					</select>
					<%} else if(member.getMemberLevel() == 2) {%>
					<select class="input-form">
						<option value="1">관리자</option>
						<option value="2" selected>정회원</option>
						<option value="3">준회원</option>
					</select>
					<%} else if(member.getMemberLevel() == 3) {%>
					<select class="input-form">
						<option value="1">관리자</option>
						<option value="2">정회원</option>
						<option value="3" selected>준회원</option>
					</select>
					<%} %>
					
				</td>
				<td>
					<button class="btn bc5 changeLevel">등급변경</button>
				</td>
			</tr>
			<%} %>
			<tr>
				<th colspan="9">
					<button class="btc bc2 bs4 checkedChangeLevel">선택회원등급변경</button>
				</th>
			</tr>
		</table>
	</div>
	<script>
			$(".changeLevel").on("click", function(){
				//클릭한 버튼을 기준으로 해당 회원의 번호
				const memberNo = $(this).parent().parent().children().eq(1).text();
				//클릭한 버튼을 기준으로 선택한 등급
				const memberLevel = $(this).parent().prev().children().val();
				//회원등급에 필요한 정보수집은 끝 -> 회원번호, 선택한등급
				//-> 서버에 update요청을 해줘야함(1. 폼태그로 요청 / 2. a태그로 요청)
				//-> 지금은 form도 a태그도 아닌 javascript(폼/a태그를 만들어서 요청이 가능하긴함)
				//-> a태그 요청 <a href="/서블릿주소?key1=value1&key2=value2"> -> 이역할을 해주는 javascript함수가 잇음
				// location.href
				location.href = "/changeLevel.do?memberNo="+memberNo+"&memberLevel="+memberLevel;
			});
			
			$(".checkedChangeLevel").on("click", function(){
				const check = $(".chk:checked");
				if(check.length == 0){
					alert("선택된 회원이 없습니다.");
					return;
				}
				//체크된 회원번호를 저장할 배열
				const no = new Array();
				//체크된 회원의 등급을 저장할 배열
				const level = new Array();
				//체크된 체크박스 기준으로 회원번호, 등급을 찾아서 배열에 넣는 작업
				check.each(function(index, item){
					const memberNo = $(item).parent().next().text();
					no.push(memberNo);
					//check기준으로 td -> tr -> 후손중에 select찾기
					const memberLevel = $(item).parent().parent().find("select").val();
					level.push(memberLevel);
				});
				//location.href="/checkedChangeLevel.do?no="+no+"&level="+level;
				//넘겨줄값이 여러개인경우 no=1,2 level=1,2 이런식으로 값이 나감
				//join()이용
				location.href="/checkedChangeLevel.do?no="+no.join("/")+"&level="+level.join("/");
			});
	</script>
	<%@include file="/WEB-INF/views/common/footer.jsp" %>
</body>
</html>

- 회원 등급 변경(등급변경 버튼을 클릭해서 변경)

<button class="btn bc5 changeLevel">등급변경</button>

버튼 관련 스크립트(현재등급과 회원번호를 서블릿에 보내주기위함)

	<script>
			$(".changeLevel").on("click", function(){
				//클릭한 버튼을 기준으로 해당 회원의 번호
				const memberNo = $(this).parent().parent().children().eq(1).text();
				//클릭한 버튼을 기준으로 선택한 등급
				const memberLevel = $(this).parent().prev().children().val();
				//회원등급에 필요한 정보수집은 끝 -> 회원번호, 선택한등급
				//-> 서버에 update요청을 해줘야함(1. 폼태그로 요청 / 2. a태그로 요청)
				//-> 지금은 form도 a태그도 아닌 javascript(폼/a태그를 만들어서 요청이 가능하긴함)
				//-> a태그 요청 <a href="/서블릿주소?key1=value1&key2=value2"> -> 이역할을 해주는 javascript함수가 잇음
				// location.href
				location.href = "/changeLevel.do?memberNo="+memberNo+"&memberLevel="+memberLevel;
			});
	</scipt>

등급변경 Servlet

package kr.or.iei.member.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 kr.or.iei.member.model.service.MemberService;

/**
 * Servlet implementation class ChangeLevelServlet
 */
@WebServlet(name = "ChangeLevel", urlPatterns = { "/changeLevel.do" })
public class ChangeLevelServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ChangeLevelServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1. 인코딩
		request.setCharacterEncoding("utf-8");
		//2. 값추출
		int memberNo = Integer.parseInt(request.getParameter("memberNo"));
		int memberLevel = Integer.parseInt(request.getParameter("memberLevel"));
		System.out.println("memberNo : "+memberNo);
		System.out.println("memberLevel : "+memberLevel);
		//3. 비즈니스로직
		MemberService service = new MemberService();
		int result = service.changeLevel(memberNo, memberLevel);
		//4. 결과처리
		// 변경성공 : 관리자페이지로 이동
		// 변경실패 : alert메세지 띄운 후 관리자페이지
		if(result > 0) {
			//주소창을 변경
			response.sendRedirect("/adminPage.do");
			// RequestDispatcher로 페이지이동 시켜줄수는 있음 -> 사용하면 안되는 이유가 있음
			// 화면을 만들기위해서는 반드시 arrayList를 받아와야하는데 이방식으로 보내면 ArrayList가 없음
			// RequestDispatcher를 사용할거면 ArrayList<Member> list = service.selectAllMember()를 하고
			// list값을 저장하고 view.forward로 보내줘야함 - 모두 adminPage.do에서 하고있는 것
		}else {
			RequestDispatcher view = request.getRequestDispatcher("/WEB-INF/views/common/msg.jsp");
			request.setAttribute("title", "등급 변경 실패");
			request.setAttribute("msg", "등급 변경 중 문제가 발생했습니다.");
			request.setAttribute("icon", "warning");
			request.setAttribute("loc", "/adminPage.do");
			view.forward(request, response);
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

Service

	public int changeLevel(int memberNo, int memberLevel) {
		Connection conn = JDBCTemplate.getConnection();
		int result = dao.changeLevel(conn, memberNo, memberLevel);
		if(result > 0) {
			JDBCTemplate.commit(conn);;
		}else {
			JDBCTemplate.rollback(conn);
		}
		JDBCTemplate.close(conn);
		return result;
	}

Dao

	public int changeLevel(Connection conn, int memberNo, int memberLevel) {
		PreparedStatement pstmt = null;
		int result = 0;
		String query = "update member_tbl set member_level = ? where member_no = ?";
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setInt(1, memberLevel);
			pstmt.setInt(2, memberNo);
			result = pstmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JDBCTemplate.close(pstmt);
		}
		return result;
	}

 

- 회원 등급 변경(선택한 회원의 등급을 한번에 변경)

아래 버튼을 클릭해서 변경해줄 것

<button class="btc bc2 bs4 checkedChangeLevel">선택회원등급변경</button>

관련 스크립트 - 체크된 회원의 회원번호/등급을 찾아 servlet에 보내주기위해

	<script>
			$(".checkedChangeLevel").on("click", function(){
				const check = $(".chk:checked");
				if(check.length == 0){
					alert("선택된 회원이 없습니다.");
					return;
				}
				//체크된 회원번호를 저장할 배열
				const no = new Array();
				//체크된 회원의 등급을 저장할 배열
				const level = new Array();
				//체크된 체크박스 기준으로 회원번호, 등급을 찾아서 배열에 넣는 작업
				check.each(function(index, item){
					const memberNo = $(item).parent().next().text();
					no.push(memberNo);
					//check기준으로 td -> tr -> 후손중에 select찾기
					const memberLevel = $(item).parent().parent().find("select").val();
					level.push(memberLevel);
				});
				//location.href="/checkedChangeLevel.do?no="+no+"&level="+level;
				//넘겨줄값이 여러개인경우 no=1,2 level=1,2 이런식으로 값이 나감
				//join()이용
				location.href="/checkedChangeLevel.do?no="+no.join("/")+"&level="+level.join("/");
			});
	</script>

Servlet

package kr.or.iei.member.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 kr.or.iei.member.model.service.MemberService;

/**
 * Servlet implementation class CheckedChangeLevelServlet
 */
@WebServlet(name = "CheckedChangeLevel", urlPatterns = { "/checkedChangeLevel.do" })
public class CheckedChangeLevelServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public CheckedChangeLevelServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1. 인코딩
		request.setCharacterEncoding("utf-8");
		//2. 값 추출
		// 추출값은 join("/")때문에 no=3/4 level=1/2 형식으로 들어옴 -> 실제로 사용하는건 숫자 -> 일단은 문자열로 받고 잘라서사용
		String no = request.getParameter("no");
		String level = request.getParameter("level");
		//no랑 level은 데이터편집작업을 해줘야함 -> 이것도 service에서 한다
		//3. 비즈니스로직
		MemberService service = new MemberService();
		//boolean으로 받는 이유 : update문을 여러번 돌리기 때문에 전부 성공했을때 / 한번이라고 실패했을 때를 나눌 것
		boolean result = service.checkedChangeLevel(no, level); 
		//4. 결과처리
		RequestDispatcher view = request.getRequestDispatcher("/WEB-INF/views/common/msg.jsp");
		if(result) {
			request.setAttribute("title", "정보변경 성공");
			request.setAttribute("msg", "요청이 처리되었습니다.");
			request.setAttribute("icon", "success");
		}else {
			request.setAttribute("title", "정보변경 실패");
			request.setAttribute("msg", "요청 처리 중 문제가 발생했습니다.");
			request.setAttribute("icon", "error");
		}
		request.setAttribute("loc", "/adminPage.do");
		view.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

Service

	public boolean checkedChangeLevel(String no, String level) {
		Connection conn = JDBCTemplate.getConnection();
		//no : 1/4/7
		//level : 1/2/3
		//-> 따로따로 분리를 해야 no:1에 level:1를 넣을 수 있음 -> StringTokenizer 이용
		//no라는 문자열을 "/"로 자르고 nextToken으로 하나달라고 요청
		StringTokenizer sT1 = new StringTokenizer(no, "/");
		StringTokenizer sT2 = new StringTokenizer(level, "/");
		boolean result = true;
		while(sT1.hasMoreTokens()) {//sT1에 토큰남아있어?
			int memberNo = Integer.parseInt(sT1.nextToken());
			int memberLevel = Integer.parseInt(sT2.nextToken());
			int changeResult = dao.changeLevel(conn, memberNo, memberLevel);
			if(changeResult == 0) {
				result = false;
				break; //한번이라도 실패하면 더이상 update를 할 필요가 없으므로 while문 종료
			}
		}
		if(result) {
			JDBCTemplate.commit(conn);
		}else {
			JDBCTemplate.rollback(conn);
		}
		JDBCTemplate.commit(conn);
		return result;
	}

Dao

	public int changeLevel(Connection conn, int memberNo, int memberLevel) {
		PreparedStatement pstmt = null;
		int result = 0;
		String query = "update member_tbl set member_level = ? where member_no = ?";
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setInt(1, memberLevel);
			pstmt.setInt(2, memberNo);
			result = pstmt.executeUpdate();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			JDBCTemplate.close(pstmt);
		}
		return result;
	}

 

'국비수업 > Server' 카테고리의 다른 글

57일차 : mvc2WebProject - 4  (0) 2023.02.19
56일차 : mvc2WebProject - 3  (0) 2023.02.16
54일차 : mvc2WebProject - 1  (0) 2023.02.16
53일차 : JSP, MVC1, MVC2  (0) 2023.02.16
52일차 : DB연결  (0) 2023.02.10
Comments