course 2021/Spring

Spring09 - 12/14

코딩하는토끼 2021. 12. 27. 15:50

navBar.tag

<c:url value="/member/list" var="memberListUrl"></c:url>

      <li class="nav-item active">
        <a class="nav-link" href="${memberListUrl }">회원목록보기</a> 
      </li>

MemberController 추가

	@GetMapping("/list")
	public void list(Model model) {
		List<MemberVO> list = service.getList();
		
		model.addAttribute("memberList", list);
		
	}

list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="b" tagdir="/WEB-INF/tags/board"%>
<% request.setCharacterEncoding("utf-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="<%= request.getContextPath() %>/resource/css/icon/css/all.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/css/bootstrap.min.css" integrity="sha384-zCbKRCUGaJDkqS1kPbPd7TveP5iyJE0EjAuZQTgFLD2ylzuqKfdKlfG/eSrtxUkn" crossorigin="anonymous">

<title>Insert title here</title>
</head>
<body>
  <b:navBar></b:navBar>
  
  <!-- .container>.row>.col>h1{회원 목록} -->
  <div class="container">
    <div class="row">
      <div class="col">
        <h1>회원 목록</h1>

        <!-- table.table>thead>tr>th*5^^tbody -->
        <table class="table">
          <thead>
            <tr>
              <th>아이디</th>
              <th>패스워드</th>
              <th>이메일</th>
              <th>주소</th>
              <th>가입일시</th>
              <th><i class="far fa-sticky-note"></i></th>
            </tr>
          </thead>
          <tbody>
            <c:forEach items="${memberList }" var="member">
              <tr>
                <td>${member.id }</td>
                <td>${member.password }</td>
                <td>${member.email }</td>
                <td>${member.address }</td>
                <td>${member.inserted }</td>
              </tr>
            </c:forEach>
          </tbody>
        </table>
      </div>
    </div>
  </div>
  

	<script src="https://cdn.jsdelivr.net/npm/jquery@3.5.1/dist/jquery.slim.min.js" integrity="sha384-DfXdz2htPH0lsSSs5nCTpuj/zy4C+OGpamoFVy38MVBnE+IbbVYUew+OrCXaRkfj" crossorigin="anonymous"></script>
	<script src="https://cdn.jsdelivr.net/npm/bootstrap@4.6.1/dist/js/bootstrap.bundle.min.js" integrity="sha384-fQybjgWLrvvRgtW6bFlB7jaZrFsaBXjsOMm/tB9LTS58ONXgqbR9W8oWht/amnpF" crossorigin="anonymous"></script>
</body>
</html>

MemberController 수정

 

	@GetMapping("/list")
	public String list(Model model, HttpSession session) {
		// 로그인된 상태가 아니면 로그인화면으로 redirect  
		MemberVO vo = (MemberVO) session.getAttribute("loggedInMember");
		
		// 로그아웃 상태 
		if (vo == null) {
			return "redirect:/member/login";
		}
		List<MemberVO> list = service.getList();
		
		model.addAttribute("memberList", list);
		return null;
		
	}

controller 파일에 로그아웃 상태면 login 페이지로 리디렉트하는 코드가 반복적으로 작성되어있음

→ filter 를 사용해 볼 것

org.zerock.filter 패키지 만들기 - filter 만들기 (new - other - filter) name: CheckLogInFilter

CheckLogInFilter

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		
		// session attribute loggedInMember 가 있으면 계속 진행
		HttpServletRequest req = (HttpServletRequest) request;
		HttpSession session = req.getSession();
		MemberVO vo = (MemberVO) session.getAttribute("loggedInMember");
		
		if (vo == null) {
			// 없으면 /member/login 으로 redirect
			String location = req.getContextPath() + "/member/login";
			HttpServletResponse res = (HttpServletResponse) response;
			res.sendRedirect(location);
		} else {
			// 있으면 (로그인된 상태이면)
			chain.doFilter(request, response);
		}
	}

필터 생성 후 doFilter 메소드만 작성

web.xml 수정 

filter 등록

MemberController 수정

기존 코드 주석처리 


연습하기

> 닉네임 항목 추가해보기

1. 테이블에서 컬럼 추가

UPDATE Member SET nickName = id; 실행 위해 preferences - SQL Editor - Safe Updates 해제 (새로고침) 해야 함

이렇게 복붙하는 과정임 (not null)

 

2. 이후 과정 (오후 수업~)

MemberVO 추가

	private String nickName;

 

signup.jsp 추가

          <div class="form-group">
            <label for="input5">닉네임 </label>
            <input type="text" class="form-control" id="input5" required name="nickName" value="${member.nickName }">
          </div>

 

MemberMapper.xml 추가

   <insert id="insert">
      INSERT INTO 
      Member (id, password, email, address, nickName) 
      VALUES
      (#{id}, #{password}, #{email}, #{address}, #{nickName})
    </insert>

 

info.jsp 추가

          <div class="form-group">
            <label for="input5">닉네임 </label>
            <input type="text" required id="input5" class="form-control" name="nickName" value="${sessionScope.loggedInMember.nickName }">
          </div>

 

list.jsp 추가

          <thead>
            <tr>
              <th>아이디</th>
              <th>패스워드</th>
              <th>닉네임</th> 
              <th>이메일</th>
              <th>주소</th>
              <th>가입일시</th>
              <th><i class="far fa-sticky-note"></i></th>
            </tr>
          </thead>
          <tbody>
            <c:forEach items="${memberList }" var="member">
              <tr>
                <td>${member.id }</td>
                <td>${member.password }</td>
                <td>${member.nickName }</td>
                <td>${member.email }</td>
                <td>${member.address }</td>
                <td>${member.inserted }</td>
              </tr>
            </c:forEach>
          </tbody>

 

MemberMapper.xml 추가

	<select id="select"
		resultType="org.zerock.domain.project1.MemberVO">
		SELECT id, password, email, address, inserted, nickName
		FROM Member
		WHERE id = #{id}
	</select>
    
	<update id="update">
		UPDATE Member
		SET
		password = #{password}, 
		email = #{email},
		address = #{address},
		nickName = #{nickName}
		WHERE id = #{id}
	</update>

게시물 목록 (/board/list) 에서 Board 테이블의 writer 대신 Member 테이블의 nickName 불러오도록  

1) 먼저 Board 테이블의 writer 컬럼에 저장된 값을 Member 테이블의 id 값으로 수정 (safe updatesn 해제필요)

Board 의 writer 가 Member 의 id 를 참조하도록 하고, 이를 통해 Member 의 nickName 을 불러올 수 있게 함

writer 는 memberId 같은 역할 

2) BoardMapper.xml 수정

	<select id="getList"
		resultType="org.zerock.domain.project1.BoardVO">
		SELECT
		b.id, b.title, b.content, b.writer, b.inserted, b.updated, m.nickName
		FROM Board b
		JOIN Member m 
		ON b.writer = m.id
		ORDER BY b.id DESC
	</select>
	<select id="read"
		resultType="org.zerock.domain.project1.BoardVO">
		SELECT
		b.id, b.title, b.content, b.writer, b.inserted, b.updated, m.nickName
		FROM
		Board b
		JOIN
		Member m ON b.writer = m.id
		WHERE b.id = #{id}
	</select>

Member 테이블과 JOIN 하여 작성 - nickName 불러올 수 있도록

3)  BoardVO 에 nickName 추가

	private String nickName;

4) writer 대신 nickName 불러오도록 수정

board > list.jsp 수정 

                <td>${board.nickName }</td>

 

board > get.jsp 수정

          <div class="form-group">
            <label for="input3">작성자</label>
            <input type="text" class="form-control" id="input3" readonly value="${board.nickName }">
          </div>

 


> 로그인 상태에서만 게시글 작성할 수 있도록 변경

navBar 수정

web.xml 수정


> 작성자만 게시글을 수정/삭제할 수 있도록 변경

board > get.jsp 수정

          <c:if test="${sessionScope.loggedInMember.id eq board.writer }">
            <a href="modify?id=${board.id }" class="btn btn-outline-secondary">
              수정/삭제
            </a>
          </c:if>

<c:if test=""> 작성


board > register.jsp 수정

          <div class="form-group">
            <label for="input3">작성자</label>
            <input type="text" class="form-control" id="input3" readonly value="${sessionScope.loggedInMember.nickName }">
          </div>
          
          <input type="hidden" name="writer" value ="${sessionScope.loggedInMember.id }">

로그인한 회원 정보 ${sessionScope.loggedInMember. } 으로 불러와서

1) nickName 전달 (readonly)

2) writer 에 Member 의 id 값 전달 (hidden)

board > modify.jsp 수정

          <div class="form-group">
            <label for="input3">작성자</label>
            <input type="text" class="form-control" id="input3" value="${board.nickName }" readonly>
          </div>
          
          <input type="hidden" name="writer" value="${board.writer }">

writer hidden 으로 전달


 

연습하기

> 회원이 작성한 게시글 수 항목 추가해보기

member > list.jsp 추가

              <td>작성글수</td>

              <td>${member.numberOfBoard }</td>

MemberMapper.xml 수정

	<select id="list"
		resultType="org.zerock.domain.project1.MemberVO">
		SELECT
		m.id, m.password, m.email, m.address, m.inserted, m.nickName, COUNT(b.id) AS numberOfBoard
		FROM Member m
		LEFT JOIN
		Board b ON m.id = b.writer
		GROUP BY m.id
		ORDER BY m.inserted DESC
	</select>

 

COUNT(b.id) AS numberOfBoard 추가

null 도 카운트 하기 위해 LEFT JOIN

id 별로 묶어서 보기 위해 GROUP BY

MemberVO 추가

	private Integer numberOfBoard;