AWS 클라우드환경 네이티브 수업 119 일차
진행
1. 웹 제작 - 로그아웃, 회원가입, 회원 리스트 목록
2. 웹 제작 - 회원정보 수정, 삭제 기능
요약
1. 웹 제작 - 로그아웃, 회원가입, 회원 리스트 목록
2. Redirect 와 Forward
3. 웹 제작 - 회원정보 수정, 삭제 기능
웹 제작 - 로그아웃, 회원가입, 회원 리스트 목록
(1) 회원 가입 양식 / 회원 리스트 목록 View 제작
<!-- memberForm.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<% request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 가입 폼</title>
</head>
<body>
<!-- 메뉴바 -->
<jsp:include page="../common/topMenu.jsp" flush="false"/>
<div class="container">
<form class="form-horizontal" method="post" name="memInsForm" action="${contextPath}/member/addMember">
<div class="form-group">
<div class="col-sm-offset-2 col-sm-5">
<h2 align="center">회원 가입</h2>
</div>
</div>
<div class="form-group">
<label for="id" class="col-sm-3 control-label">아이디</label>
<div class="col-sm-2">
<input type="text" class="form-control" id="id" name="id" maxlength="10" placeholder="아이디 입력"/>
</div>
</div>
<div class="form-group">
<label for="id" class="col-sm-3 control-label">비밀번호</label>
<div class="col-sm-3">
<input type="password" class="form-control" id="pw" name="pw" maxlength="20" placeholder="비밀번호 입력"/>
</div>
</div>
<div class="form-group">
<label for="id" class="col-sm-3 control-label">비밀번호 확인</label>
<div class="col-sm-3">
<input type="password" class="form-control" id="repwd" name="repwd" maxlength="20" placeholder="비밀번호 확인"/>
</div>
</div>
<div class="form-group">
<label for="id" class="col-sm-3 control-label">이 름</label>
<div class="col-sm-3">
<input type="text" class="form-control" id="name" name="name" maxlength="50" placeholder="이름 입력"/>
</div>
</div>
<div class="form-group">
<label for="id" class="col-sm-3 control-label">이메일</label>
<div class="col-sm-5">
<input type="text" class="form-control" id="email" name="email" maxlength="50" placeholder="이메일 입력"/>
</div>
</div>
<div class="form-group">
<label for="id" class="col-sm-3 control-label">회원가입 동의</label>
<div class="col-sm-2">
<label class="radio-inlne">
<input type="radio" id="registerYn" name="registerYn" value="Y" checked> 동의
</label>
<label class="radio-inlne">
<input type="radio" id="registerYn" name="registerYn" value="N"> 동의 안함
</label>
</div>
</div>
<div class="alert alert-info fade in col-sm-offset-1 col-sm-10">
<strong>[도서쇼핑몰의 개인 정보 수집 및 이용 안내]</strong>
<h5>
개인 정보 제3자 제공 동의
<br>① 개인정보를 제공받는 자: BookStore
<br>② 개인정보를 제공받는 자의 개인 정보 이용 목적 : 영업관리,
설문조사 및 프로모션, 이벤트 경품 제공, eDM 발송, 행사 관련 마케팅
<br>③ 제공하는 개인정보항목 : 이름, 이메일주소, 회사명, 직무/직책, 연락처, 휴대전화
<br>④ 개인정보를 제공받는 자의 개인 정보 보유 및 이용 기간 :
개인정보 취급 목적을 달성하여 더 이상 개인정보가 불 필요하게 된 경우이거나
5년이 지나면 지체 없이 해당 정보를 파기할 것입니다.
<br>귀하는 위와 같은 BookStore의 개인정보 수집 및 이용정책에 동의하지
않을 수 있으나, BookStore으로부터 솔루션, 최신 IT정보, 행사초청안내 등의
유용한 정보를 제공받지 못 할 수 있습니다.
<br> 개인 정보 보호에 대한 자세한 내용은 http://www.BookStore.com 을 참조바랍니다.
</h5>
<div class="checkbox" align="center">
<label>
<input type="checkbox" id="is_subscribed" name="is_subscribed" value="o"/>
</label> BookStore의 개인정보 수집 및 이용에 동의합니다.
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-3 col-sm-4">
<button type="reset" class="btn btn-warning">다시 입력</button>
<button type="submit" class="btn btn-primary">회원 가입</button>
</div>
</div>
</form>
</div>
<!-- 푸터 -->
<jsp:include page="../common/footer.jsp" flush="false"/>
</body>
</html>
<!-- listMembers.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<% request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 전체 목록</title>
</head>
<body>
<%
if(session.getAttribute("isLogOn") == null || session.getAttribute("isLogOn").equals("")) {
response.sendRedirect("/member/loginForm");
}
/*
<c:choose>
<c:when test="${isLogOn == true && member != null}">
<p><b>${member.name}님, 즐거운 시간되십시오.</b></p>
<a href="${contextPath}/member/logout.do" class="btn btn-danger">
<span class="glyphicon glyphicon-log-out"></span>로그아웃
</a>
</c:when>
</c:choose>
*/
%>
<!-- 메뉴바 -->
<jsp:include page="../common/topMenu.jsp" flush="false"/>
<div class="container">
<h1 align="center">회원 전체 목록</h1>
<a href="${contextPath}/member/logout" class="btn btn-danger"><span class="glyphicon glyphicon-log-out">로그아웃</span></a>
<a class="btn btn-sm btn-primary" href="${contextPath}/member/loginModalForm">로그인(Modal)</a>
<table class="table table-bordered table-striped table-hover" style="width:1200px; margin:auto;">
<tr class="info">
<td align="center" width="80"><b>아이디</b></td>
<td align="center" width="80"><b>비밀번호</b></td>
<td align="center" width="80"><b>이 름</b></td>
<td align="center" width="300"><b>이메일</b></td>
<td align="center" width="120"><b>가입일자</b></td>
<td align="center" width="60"><b>수정</b></td>
<td align="center" width="60"><b>삭제</b></td>
</tr>
<c:forEach var="member" items="${memberLists}">
<tr>
<td align="center">${member.id}</td>
<td align="center">${member.pw}</td>
<td align="center">${member.name}</td>
<td align="center">${member.email}</td>
<td align="center">${member.joinDate}</td>
<td align="center"><a class="btn btn-sm btn-primary" href="${contextPath}/member/updateMemberForm?id=${member.id}">수정</a></td>
<td align="center"><a class="btn btn-sm btn-danger" href="${contextPath}/member/removeMember?id=${member.id}">삭제</a></td>
</tr>
</c:forEach>
</table>
</div>
<jsp:include page="../common/footer.jsp" flush="false"/>
</body>
</html>
(2) topMenu View 변경
<!-- topMenu.jsp 뷰를 다음과 같이 변경 -->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<% request.setCharacterEncoding("UTF-8"); %>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap-theme.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
<script>
const result = "${result}"
if(result != "") {
alert(result);
}
</script>
<!--
sticky-top은 상단 공간을 차지하면서 위에 고정하고,
fixed-top은 상단 공간을 차지하지 않고 위에 고정된다.
일부 내용이 상단 메뉴바에 가려져서 보이지 않을 수 있다.
-->
<nav class="navbar navbar-inverse navbar-sticky-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="${contextPath}/">메인으로</a>
</div>
<!-- 실질적인 메뉴를 나열한다. -->
<div class="collapse navbar-collapse" id="myNavbar">
<ul class="nav navbar-nav navbar-right">
<li>
<form class="navbar-form navbar-right" method="post" action="${contextPath}/member/login">
<c:choose>
<c:when test="${isLogOn == true && member != null }">
<p class="navbar-text"><strong>${member.name}</strong>님 안녕하세용~</p>
<a href="${contextPath}/member/logout" class="btn btn-warning">
<span class="glyphicon glyphicon-log-out"></span>로그아웃
</a>
</c:when>
<c:otherwise>
<div class="form-group">
<input type="text" class="form-control" name="id" size="12" maxlength="12" placeholder="아이디"/>
<input type="password" class="form-control" name="pw" size="12" maxlength="12" placeholder="비밀번호"/>
</div>
<button type="submit" class="btn btn-primary">
<span class="glyphicon glyphicon-log-in"></span>로그인
</button>
</c:otherwise>
</c:choose>
</form>
</li>
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">기본 <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="${contextPath}/exam1/">doA</a></li>
<li><a href="${contextPath}/exam1/doB">doB</a></li>
<li role="presentation" class="divider"></li>
<li><a href="${contextPath}/exam2/doC">doC</a></li>
<li><a href="${contextPath}/exam2/gugudanForm">구구단</a></li>
<li role="presentation" class="divider"></li>
<li><a href="${contextPath}/exam3/doD">회원정보(객체)</a></li>
<li><a href="${contextPath}/exam3/doE">회원정보(Map)</a></li>
<li role="presentation" class="divider"></li>
<li><a href="${contextPath}/member/listMembers">회원목록</a></li>
</ul>
</li>
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">회원관리 <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="${contextPath}/member/loginForm">로그인</a></li>
<li><a href="${contextPath}/member/memberForm">회원가입</a></li>
<li><a href="${contextPath}/member/listMembers">회원목록</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
(3) Mapper 변경
<!-- Mapper (memberMapper.xml) -->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.edu.member">
<!-- 로그인정보 가져오기 -->
<resultMap id="memberResult" type="com.edu.member.vo.MemberVO">
<result property="id" column="id"/>
<result property="pw" column="pw"/>
<result property="name" column="name"/>
<result property="email" column="email"/>
<result property="joinDate" column="joinDate"/>
</resultMap>
<!-- 로그인 처리 -->
<!-- #{id} = #{MemberVO.id} -->
<select id="loginByID" parameterType="com.edu.member.vo.MemberVO" resultMap="memberResult">
<![CDATA[
SELECT * FROM T_MEMBER WHERE id = #{id}
]]>
</select>
<!-- 회원가입 처리 -->
<insert id="addMember" parameterType="com.edu.member.vo.MemberVO">
<![CDATA[
INSERT INTO T_MEMBER (id, pw, name, email, joindate)
VALUES (#{id}, #{pw}, #{name}, #{email}, sysdate())
]]>
</insert>
<!-- 회원 목록 조회 -->
<select id="selectAllMemberList" resultMap="memberResult">
<![CDATA[
SELECT * FROM T_MEMBER ORDER BY JOINDATE DESC
]]>
</select>
</mapper>
(4) DAO 제작
// DAO Interface
package com.edu.member.dao;
import java.util.List;
import org.springframework.dao.DataAccessException;
import com.edu.member.vo.MemberVO;
//========================================================
// 회원정보 DAO
//========================================================
public interface MemberDAO {
//========================================================
// 로그인 처리
//========================================================
public MemberVO loginByID(MemberVO memberVO) throws DataAccessException;
//========================================================
// 회원가입 처리
//========================================================
public int addMember(MemberVO memberVO) throws DataAccessException;
//================================================================
// 회원 목록 조회
//================================================================
public List<MemberVO> selectAllMemberList() throws DataAccessException;
} // End - public interface MemberDAO
// DAO
package com.edu.member.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Repository;
import com.edu.member.service.MemberServiceImpl;
import com.edu.member.vo.MemberVO;
//========================================================
// 회원정보 DAO
//========================================================
@Repository("memberDAO")
public class MemberDAOImpl implements MemberDAO {
@Autowired
private SqlSession sqlSession;
private static final String Namespace = "com.edu.member";
private static final Logger logger = LoggerFactory.getLogger(MemberDAOImpl.class);
//========================================================
// 로그인 처리
//========================================================
@Override
public MemberVO loginByID(MemberVO memberVO) throws DataAccessException {
// Namespace.loginByID = 이름, memberVO = 넘겨줄 값(id, pw)
MemberVO memVO = sqlSession.selectOne(Namespace + ".loginByID", memberVO);
return memVO;
}
//========================================================
// 회원가입 처리
// sqlSession.insert(사용할 mapper의 id, 저장할 값)
//========================================================
@Override
public int addMember(MemberVO memberVO) throws DataAccessException {
logger.info("MemberDAOImpl 회원가입 처리() 시작..." + memberVO);
int result = sqlSession.insert(Namespace + ".addMember", memberVO);
return result;
}
//================================================================
// 회원 목록 조회
//================================================================
@Override
public List<MemberVO> selectAllMemberList() throws DataAccessException {
logger.info("MemberDAOImpl 회원 목록 조회() 시작...");
List<MemberVO> memberLists = null;
memberLists = sqlSession.selectList(Namespace + ".selectAllMemberList");
return memberLists;
}
} // End - public class MemberDAOImpl implements MemberDAO
회원 가입 처리 시, 결과를 반환받게 했는데
Mybatis 에서 insert를 하고 나면
(5) Service 제작
package com.edu.member.service;
import java.util.List;
import org.springframework.dao.DataAccessException;
import com.edu.member.vo.MemberVO;
//===================================================
// 회원정보 서비스
//===================================================
public interface MemberService {
//===================================================
// 로그인 처리
//===================================================
public MemberVO login(MemberVO memberVO) throws DataAccessException;
//===================================================
// 회원가입 처리
//===================================================
public int addMember(MemberVO memberVO) throws DataAccessException;
//================================================================
// 회원 목록 조회
//================================================================
public List<MemberVO> listMembers() throws DataAccessException;
} // End - public interface MemberService
// 서비스
package com.edu.member.service;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;
import com.edu.member.dao.MemberDAO;
import com.edu.member.vo.MemberVO;
//========================================================
// 회원정보 서비스
//========================================================
@Service("memberService")
public class MemberServiceImpl implements MemberService {
private static final Logger logger = LoggerFactory.getLogger(MemberServiceImpl.class);
@Autowired
private MemberDAO memberDAO;
//===================================================
// 로그인 처리
//===================================================
@Override
public MemberVO login(MemberVO memberVO) throws DataAccessException {
logger.info("MemberServiceImpl login() 시작...");
return memberDAO.loginByID(memberVO);
}
//===================================================
// 회원가입 처리
//===================================================
@Override
public int addMember(MemberVO memberVO) throws DataAccessException {
logger.info("MemberServiceImpl 회원가입 처리() 시작..." + memberVO);
return memberDAO.addMember(memberVO);
}
//================================================================
// 회원 목록 조회
//================================================================
@Override
public List<MemberVO> listMembers() throws DataAccessException {
logger.info("MemberServiceImpl 회원 목록 조회() 시작...");
List<MemberVO> memberLists = null;
memberLists = memberDAO.selectAllMemberList();
return memberLists;
}
}
(6) Controller 제작
package com.edu.member.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.edu.member.vo.MemberVO;
//=====================================================
// public interface MemberController
//=====================================================
public interface MemberController {
//=====================================================
// 로그인 처리
//=====================================================
public ModelAndView login(@ModelAttribute("memberVO") MemberVO member, RedirectAttributes rAttr,
HttpServletRequest request, HttpServletResponse response) throws Exception;
//=====================================================
// 로그아웃 처리
//=====================================================
public ModelAndView logout(HttpServletRequest request, HttpServletResponse response) throws Exception;
//=====================================================
// 회원가입 폼
//=====================================================
public ModelAndView memberForm(HttpServletRequest request, HttpServletResponse response) throws Exception;
//=====================================================
// 회원가입 처리
//=====================================================
public ModelAndView addMember(@ModelAttribute("memberVO") MemberVO member,
HttpServletRequest request, HttpServletResponse response) throws Exception;
//=====================================================
// 회원 전체 목록 조회
//=====================================================
public ModelAndView listMembers(HttpServletRequest request, HttpServletResponse response) throws Exception;
} // End - public interface MemberController
// 컨트롤러
package com.edu.member.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.edu.member.service.MemberService;
import com.edu.member.vo.MemberVO;
//================================================================
// 회원정보 컨트롤러
//================================================================
@Controller("memberController")
@RequestMapping(value="/member") // url에서 /member로 시작하는 요청들을 처리하는 컨트롤러
public class MemberControllerImpl implements MemberController {
private static final Logger logger = LoggerFactory.getLogger(MemberControllerImpl.class);
//================================================================
// @Inject : Java에서 지원하는 어노테이션... 특정 Framework에 종속적이지 않다.
// @Autowired : Spring에서 지원하는 어노테이션...
//================================================================
@Autowired
private MemberVO memberVO;
// MemberService memberService = new MemberService();
@Autowired
private MemberService memberService;
//================================================================
// 로그인 처리
//================================================================
@Override
@RequestMapping(value="/login", method=RequestMethod.POST)
public ModelAndView login(@ModelAttribute("memberVO") MemberVO member, RedirectAttributes rAttr, HttpServletRequest request,
HttpServletResponse response) throws Exception {
logger.info("MemberControllerImpl login() 시작...");
System.out.println("로그인 정보 => " + member.getId() + " : " + member.getPw());
ModelAndView mav = new ModelAndView();
// 로그인한 정보를 가지고 데이터베이스에 존재하는지 처리를 하고 그 결과를 가져온다.
// 보여줄 화면 종류 = 데이터가 제대로 일치할때, 회원이 존재하지 않을때, 회원은 존재하는데 다른 정보가 틀렸을때
memberVO = memberService.login(member);
System.out.println("로그인 처리 결과 => " + memberVO);
// 로그인한 정보가 데이터베이스에 존재하는지에 따라 처리를 다르게 한다.
if(memberVO != null) { // 로그인 정보에 해당하는 자료가 있으면
if(member.getPw().equals(memberVO.getPw())) {
// 아이디와 비밀번호가 일치하면 세션을 발급한다.
HttpSession session = request.getSession();
session.setAttribute("member", memberVO);
session.setAttribute("isLogOn", true);
// mav.setViewName("redirect:/member/listMembers.do");
mav.setViewName("redirect:/"); // 메인화면으로 이동
} else { // 아이디는 있는데 비밀번호가 틀린 경우
HttpSession session = request.getSession();
String result = "비밀번호가 틀렸습니다.";
rAttr.addFlashAttribute("result", result);
// mav.setViewName("redirect:/member/loginForm.do");
mav.setViewName("redirect:/");
}
} else { // 로그인한 아이디가 존재하지 않으면
// 로그인 실패 메시지를 가지고 로그인 화면으로 이동한다.
HttpSession session = request.getSession();
String result = "아이디가 존재하지 않습니다.";
rAttr.addFlashAttribute("result", result);
// mav.setViewName("redirect:/member/loginForm.do");
mav.setViewName("redirect:/");
}
return mav;
}
//================================================================
// 로그아웃 처리
//================================================================
@Override
@RequestMapping(value= "/logout", method = RequestMethod.GET)
public ModelAndView logout(HttpServletRequest request, HttpServletResponse response) throws Exception {
HttpSession session = request.getSession();
session.removeAttribute("member");
session.removeAttribute("isLogOn");
ModelAndView mav = new ModelAndView();
mav.setViewName("redirect:/"); // 메인화면으로 이동
System.out.println("MemberController logout 로그아웃 완료...");
return mav;
}
//================================================================
// 회원가입 폼
//================================================================
@Override
@RequestMapping(value="/memberForm", method=RequestMethod.GET)
public ModelAndView memberForm(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView();
// mav.setViewName("/member/memberForm"); // 회원가입화면으로 이동
return mav;
}
//================================================================
// 회원가입 처리
//================================================================
@Override
@RequestMapping(value="/addMember", method=RequestMethod.POST)
public ModelAndView addMember(@ModelAttribute("memberVO") MemberVO memberVO,
HttpServletRequest request, HttpServletResponse response) throws Exception {
logger.info("MemberControllerImpl 회원가입 처리() 시작...");
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
int result = 0;
// 사용자가 입력한 정보를 서비스에게 넘겨주어 처리하게 한다.
result = memberService.addMember(memberVO);
ModelAndView mav = new ModelAndView("redirect:/member/listMembers");
return mav;
}
//================================================================
// 회원 목록 조회
//================================================================
@Override
@RequestMapping(value="/listMembers", method=RequestMethod.GET)
public ModelAndView listMembers(HttpServletRequest request, HttpServletResponse response) throws Exception {
logger.info("MemberControllerImpl 회원 전체 목록 조회() 시작...");
List<MemberVO> memberLists = memberService.listMembers();
ModelAndView mav = new ModelAndView();
mav.addObject("memberLists", memberLists);
return mav;
}
} // End - public class MemberControllerImpl implements MemberController
Redirect 에 대한 설명은 이 단락 아래에 첨부한다~~
결과
회원 가입 결과
http://localhost:8080/main/member/memberForm
회원가입 폼 입력형식에 맞춰 내용을 입력하면 DB에 데이터가 추가된다.
로그인 후 회원 목록 클릭 시
http://localhost:8080/main/member/listMembers
로그 아웃 되는 지 확인
redirect / forward
(1) redirect
쉽게 말해,
사용자가 어떤 링크를 클릭
=> 서버에서 이 링크로 가! 하고 Redirect 주소 를 다시 보내주면
=> 사용자가 그 주소로 다시 요청
원하는 주소 줄 테니까 사용자 니가 알아서 찾아가라
특징
- request와 response 객체가 새로 생성 됨.
- 서버는 response로 Redirect 주소를 보낸다.
- 시스템에 변화가 생기는 경우(생성, 수정, 삭제) 재 요청을 방지를 위해 사용.
=> 연관성을 끊는다. - 웹 컨테이너 외부의 주소로도 이동 가능. 어차피 요청을 다시 던지니까.
- URL이 바뀜.
- URL을 새로 보내기 때문에 redirect시 GET 방식으로 보낸다.
새롭게 요청을 던지는 것이기 때문에 - Spring에서는 RedirectAttribute를 사용하여 값을 보낼 수 있다. ( session 이용)
(2) forward
쉽게 말해,
사용자가 링크를 클릭 (서버에 요청)
=> 서버는 자기 내부적으로( Web Container) 다른 주소로 이동한다 (forward). 객체 정보도 같이 전달
=> 이동한 곳에서 나온 결과를 사용자에게 응답
사용자야 , 너가 원하는 거 내가 거기가서 줄 게
특징
- request와 response 객체를 유지
- 서버가 다른 페이지를 요청하는 것이므로 request로 보냄
- URL이 바뀌지 않는다.
- 웹 컨테이너 내부에서만 이동 가능
- 단순 조회에 사용한다. ( 그냥 자주 쓰지 말자.)
웹 제작 - 회원정보 수정, 삭제 기능
(1) 회원 정보 수정 View 제작
<!-- updateMemberForm.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<% request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 정보 수정</title>
</head>
<body>
<!-- 메뉴바 -->
<jsp:include page="../common/topMenu.jsp" flush="false"/>
<div class="container">
<form class="form-horizontal" method="post" name="memModifyForm" action="${contextPath}/member/modifyMember">
<div class="form-group">
<div class="col-sm-offset-2 col-sm-5">
<h2 align="center">회원 정보 수정</h2>
</div>
</div>
<div class="form-group">
<label for="id" class="col-sm-3 control-label">아이디</label>
<div class="col-sm-2">
<input type="text" class="form-control" id="id" name="id" maxlength="10" value="${member.id}" readonly/>
</div>
</div>
<div class="form-group">
<label for="id" class="col-sm-3 control-label">비밀번호</label>
<div class="col-sm-3">
<input type="password" class="form-control" id="pw" name="pw" maxlength="20" value="${member.pw}"/>
</div>
</div>
<div class="form-group">
<label for="id" class="col-sm-3 control-label">비밀번호 확인</label>
<div class="col-sm-3">
<input type="password" class="form-control" id="repwd" name="repwd" maxlength="20" value="${member.pw}"/>
</div>
</div>
<div class="form-group">
<label for="id" class="col-sm-3 control-label">이 름</label>
<div class="col-sm-3">
<input type="text" class="form-control" id="name" name="name" maxlength="50" value="${member.name}"/>
</div>
</div>
<div class="form-group">
<label for="id" class="col-sm-3 control-label">이메일</label>
<div class="col-sm-5">
<input type="text" class="form-control" id="email" name="email" maxlength="50" value="${member.email}"/>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-3 col-sm-4">
<button type="reset" class="btn btn-warning">다시 입력</button>
<button type="submit" class="btn btn-primary">회원 정보 수정</button>
</div>
</div>
</form>
</div>
<!-- 푸터 -->
<jsp:include page="../common/footer.jsp" flush="false"/>
</body>
</html>
(2) Mapper 수정
<!-- memberMapper.xml -->
<!-- 아이디에 해당하는 회원 정보 가져오기 -->
<select id="selectMember" parameterType="String" resultType="com.edu.member.vo.MemberVO">
<![CDATA[
SELECT * FROM t_member WHERE id = #{id}
]]>
</select>
<!-- 아이디에 해당하는 회원 정보 수정하기 -->
<update id="updateMember" parameterType="com.edu.member.vo.MemberVO">
<![CDATA[
UPDATE t_member
SET pw = #{pw}, name = #{name}, email = #{email}
WHERE id = #{id}
]]>
</update>
<!-- 아이디에 해당하는 회원 정보 삭제하기 -->
<delete id="deleteMember" parameterType="String">
<![CDATA[
DELETE FROM t_member
WHERE id = #{id}
]]>
</delete>
(3) DAO
// DAO 인터페이스
//================================================================
// 아이디에 해당하는 회원 정보 가져오기
//================================================================
public MemberVO selectMember(String id) throws DataAccessException;
//================================================================
// 아이디에 해당하는 회원 정보 수정하기
//================================================================
public int updateMember(MemberVO memberVO) throws DataAccessException;
//================================================================
// 아이디에 해당하는 회원 정보 삭제하기
//================================================================
public int deleteMember(String id) throws DataAccessException;
// DAO
//================================================================
// 아이디에 해당하는 회원 정보 가져오기
//================================================================
@Override
public MemberVO selectMember(String id) throws DataAccessException {
MemberVO memberVO = sqlSession.selectOne(Namespace + ".selectMember", id);
return memberVO;
}
//================================================================
// 아이디에 해당하는 회원 정보 수정하기
//================================================================
@Override
public int updateMember(MemberVO memberVO) throws DataAccessException {
int result = sqlSession.update(Namespace + ".updateMember", memberVO);
return result;
}
//================================================================
// 아이디에 해당하는 회원 정보 삭제하기
//================================================================
@Override
public int deleteMember(String id) throws DataAccessException {
int result = sqlSession.delete(Namespace + ".deleteMember", id);
return result;
}
(4) Service
// service 인터페이스
//================================================================
// 아이디에 해당하는 회원 정보 가져오기
//================================================================
public MemberVO selectMember(String id) throws DataAccessException;
//================================================================
// 아이디에 해당하는 회원 정보 수정하기
//================================================================
public int modifyMember(MemberVO memberVO) throws DataAccessException;
//================================================================
// 아이디에 해당하는 회원 정보 삭제하기
//================================================================
public int removeMember(String id) throws DataAccessException;
// 서비스
//================================================================
// 아이디에 해당하는 회원 정보 가져오기
//================================================================
@Override
public MemberVO selectMember(String id) throws DataAccessException {
MemberVO memberVO = memberDAO.selectMember(id);
return memberVO;
}
//================================================================
// 아이디에 해당하는 회원 정보 수정하기
//================================================================
@Override
public int modifyMember(MemberVO memberVO) throws DataAccessException {
return memberDAO.updateMember(memberVO);
}
//================================================================
// 아이디에 해당하는 회원 정보 삭제하기
//================================================================
@Override
public int removeMember(String id) throws DataAccessException {
return memberDAO.deleteMember(id);
}
(5) Controller
// Controller 인터페이스에 코드 추가
//=====================================================
// 아이디에 해당하는 회원 정보 조회
//=====================================================
public ModelAndView updateMemberForm(@RequestParam("id") String id,
HttpServletRequest request, HttpServletResponse response) throws Exception;
//=====================================================
// 아이디에 해당하는 회원 정보 수정하기
//=====================================================
public ModelAndView modifyMember(@ModelAttribute("info") MemberVO memberVO,
HttpServletRequest request, HttpServletResponse response )throws Exception;
//=====================================================
// 아이디에 해당하는 회원 정보 삭제하기
//=====================================================
public ModelAndView removeMember(@RequestParam("id") String id,
HttpServletRequest request, HttpServletResponse response) throws Exception;
// 컨트롤러
//=====================================================
// 아이디에 해당하는 회원 정보 조회
//=====================================================
@Override
@RequestMapping(value="/updateMemberForm", method=RequestMethod.GET)
public ModelAndView updateMemberForm(@RequestParam("id") String id, HttpServletRequest request, HttpServletResponse response)
throws Exception {
System.out.println("MemberController 회원 정보 조회 id ==> " + id);
// 회원 전체 리스트 화면에서 수정을 요청한 id에 해당하는 정보를 찾는 일을 서비스에게 부탁한다.
memberVO = memberService.selectMember(id);
System.out.println("MemberController 회원 정보 조회 ==> " + memberVO);
// 찾아온 데이터를 가지고 개인 정보 수정화면으로 넘어간다.
ModelAndView mav = new ModelAndView("/member/updateMemberForm");
mav.addObject("member", memberVO);
return mav;
}
//=====================================================
// 아이디에 해당하는 회원 정보 수정하기
//=====================================================
@Override
@RequestMapping(value="modifyMember", method=RequestMethod.POST)
public ModelAndView modifyMember(@ModelAttribute("memberVO") MemberVO memberVO, HttpServletRequest request, HttpServletResponse response)
throws Exception {
System.out.println("MemberController 회원 정보 수정하기 memberVO ==> " + memberVO);
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
int result = memberService.modifyMember(memberVO);
ModelAndView mav = new ModelAndView("redirect:/member/listMembers");
return mav;
}
//=====================================================
// 아이디에 해당하는 회원 정보 삭제하기
//=====================================================
@Override
@RequestMapping(value="removeMember", method=RequestMethod.GET)
public ModelAndView removeMember(@RequestParam("id") String id, HttpServletRequest request, HttpServletResponse response)
throws Exception {
request.setCharacterEncoding("UTF-8");
int result = memberService.removeMember(id);
ModelAndView mav = new ModelAndView("redirect:/member/listMembers");
return mav;
}
결과
수정을 하나 삭제하나 모두 listMembers로 이동되게 Controller에서 설정 되어있는 대로 실행 된다.
'코딩수업 > AWS 클라우드환경 네이티브' 카테고리의 다른 글
11/15 웹 제작 - 파일 업로드 / Maven Repository 참고사항 (0) | 2022.11.28 |
---|---|
11/14 웹 제작 - MySQL에서 ERD 생성 / Ajax / Ajax를 이용한 jQuery 사용 / Jackson (0) | 2022.11.28 |
11/10 웹 제작 - @Component와 @Bean / 도서 쇼핑몰 제작 (로그인) (0) | 2022.11.23 |
11/9 웹 제작 - contestPath / c.set 태그 / root-context / 도서 쇼핑몰 만들기 (View) / resources mapping (0) | 2022.11.21 |
(logger 미완)11/8 웹 제작 - RequestMapping / Inject / 로그 관리 (logger) (0) | 2022.11.18 |
댓글