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;

'course 2021 > Spring' 카테고리의 다른 글
Spring10 - 12/15 (0) | 2022.01.03 |
---|---|
Spring08 - 12/13 (0) | 2021.12.26 |
Spring07 - 12/10 (0) | 2021.12.23 |
Spring06 - 12/09 (0) | 2021.12.21 |
Spring05 - 12/08(controller09~11) (0) | 2021.12.21 |
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;

'course 2021 > Spring' 카테고리의 다른 글
Spring10 - 12/15 (0) | 2022.01.03 |
---|---|
Spring08 - 12/13 (0) | 2021.12.26 |
Spring07 - 12/10 (0) | 2021.12.23 |
Spring06 - 12/09 (0) | 2021.12.21 |
Spring05 - 12/08(controller09~11) (0) | 2021.12.21 |