[Study #37] 로그인 했을 경우에만 글 작성·수정하도록 제어하기
01. BOARD 생성
01) SQL에서 테이블 생성하기
02) 'board'의 내용이 없다면 보드 내용이 안 나오게 하기 (choose문 사용)
- fn함수를 사용하기 위해서 아래의 코드를 'board.jsp'에 추가하기
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
- fn:length : 길이를 검사하는 명령어 ( 예시 : ${fn:length(list)} )
- ${fn:length(list) gt 0 } : list의 길이가 0보다 클 경우
- when일 때 테이블을 출력하고, otherwise일 때 '출력할 데이터가 없습니다.'라고 출력
<c:choose>
<c:when test="${fn:length(list) gt 0 } ">
<table>
<tr>
<th>번호</th>
<th>제목</th>
<th>작성자</th>
<th>작성일</th>
<th>좋아요</th>
</tr>
<c:forEach items="${list }" var="row">
<tr class="board_list"
onclick="location.href='./detail?bno=${row.bno }'">
<td class="td1">${row.bno }</td>
<td class="title">${row.btitle }</td>
<td class="td1">${row.bwrite }</td>
<td class="td2">${row.bdate }</td>
<td class="td1">${row.blike }</td>
</tr>
</c:forEach>
</table>
</c:when>
<c:otherwise>출력할 데이터가 없습니다.</c:otherwise>
</c:choose>
02. 로그인한 사용자만 글 작성하기
01) 데이터 테이블에서 bwrite를 m_no로 변경
- member의 회원번호를 외래키로 활용하여 두 테이블을 join으로 묶기 위함
- m_write로 연결하지 않는 이유 : 작성자가 중복될 수 있기 때문 (m_no는 단일값을 가지는 기본키)
02) 변경한 m_no를 외래키로 설정하기
- CASCADE : 종속되어 있는 하위 글도 같이 삭제됨
(ex. 해당 보드의 게시글이 지워질 때 댓글도 함께 지우고 싶을 때 사용)
03) join을 이용해서 m_no가 m_name으로 나오게 하기
- JOIN : 두 개 이상의 테이블을 연결할 때 사용
SELECT * FROM board JOIN members : 보드와 멤버를 하나로 연결해서 출력
SELECT * FROM board JOIN members ON board.m_no = members.m_no : 보드의 m_no와 멤버의 m_no를 하나로 연결해서 출력
SELECT b.bno, b.btitle, m.m_name, b.bdate, b.blike, b.bip FROM board b JOIN members m ON b.m_no = m.m_no
: ON으로 둘을 연결하고 board는 b로 부르고 members는 m으로 부름
04) 'boardview' 만들기
- 맨날 치기 힘드니까 'boardview'로 만들기 : 역순 정렬해서 10번까지 보여주기
CREATE VIEW boardview as SELECT b.bno, b.btitle, m.m_name, b.bdate, b.blike, b.bip
FROM board b JOIN members m ON b.m_no = m.m_no
ORDER BY bno DESC LIMIT 10
05) board_mapper.xml 수정하기
- detail, boardList에서 'board'를 'boardview'로 변경
<select id="boardList" resultType="boardDTO">
SELECT * FROM boardview
</select>
06) boardDTO 수정하기 : m_id, m_name 추가하기
- m_id, m_name 추가하기
package com.peazh.pro1;
public class BoardDTO {
private int bno, blike;
private String btitle, m_id, m_name, bcontent, bdate, bip;
public int getBno() {
return bno;
}
public void setBno(int bno) {
this.bno = bno;
}
public int getBlike() {
return blike;
}
public void setBlike(int blike) {
this.blike = blike;
}
public String getBtitle() {
return btitle;
}
public void setBtitle(String btitle) {
this.btitle = btitle;
}
public String getM_name() {
return m_name;
}
public void setM_name(String m_name) {
this.m_name = m_name;
}
public String getBcontent() {
return bcontent;
}
public void setBcontent(String bcontent) {
this.bcontent = bcontent;
}
public String getBdate() {
return bdate;
}
public void setBdate(String bdate) {
this.bdate = bdate;
}
public String getBip() {
return bip;
}
public void setBip(String bip) {
this.bip = bip;
}
public String getM_id() {
return m_id;
}
public void setM_id(String m_id) {
this.m_id = m_id;
}
}
07) 'board.jsp'에서 로그인 안했을 경우 작성하기 버튼 빼기
- 로그인 했을 경우
- 로그인 안했을 경우
- 아래의 코드 추가
- 로그인한 사람 이름 : ${sessionScope.mname }
<c:if test="${sessionScope.mname ne null}">
<img alt="" src="./img/write.png" style="width: 8%;" onclick="location.href='./write'">
</c:if>
08) 'BoardController'에서 @GetMapping("/write") 수정하기
- 로그인 안했을 경우 : 작성하기 버튼을 누르면 로그인 화면으로 돌아가기
@GetMapping("/write")
public String write(HttpServletRequest request) {
HttpSession session = request.getSession();
if (session.getAttribute("mname") != null) {
return "write";
} else {
return "redirect:/login";
}
}
09) 'BoardController'에서 @PostMapping("/write") 수정하기
- if문을 넣어서 로그인 안했을 경우 로그인 화면으로 보내기
@PostMapping("/write")
public String write2(HttpServletRequest request) {
HttpSession session = request.getSession();
if(session.getAttribute("mid") != null ) {
// 로그인 했습니다.
// 사용자가 입력한 데이터 변수에 담기
BoardDTO dto = new BoardDTO();
dto.setBtitle(request.getParameter("title"));
dto.setBcontent(request.getParameter("content"));
// 세션에서 불러오기
dto.setM_id((String)session.getAttribute("mid"));
dto.setM_name((String) session.getAttribute("mname"));
// Service -> DAO -> mybatis -> DB로 보내서 저장하기
boardService.write(dto);
return "redirect:board";
} else {
return "redirect:/login";
}
}
10) 'board-mapper.xml' 수정하기
- 서브쿼리 : 쿼리 속에 쿼리가 들어간 형태
괄호 안에 있는 내부의 내용이 먼저 실행하고 그 후 밖에 있는 값이 실행
- 다음의 코드 추가
<insert id="write" parameterType="boardDTO">
INSERT INTO board (btitle, bcontent, m_no, bip)
VALUES (#{btitle }, #{bcontent }, (SELECT m_no FROM members WHERE m_id=#{m_id}), #{bip });
</insert>
<select id="detail" parameterType="boardDTO"
resultType="boardDTO">
SELECT *
FROM boardview
WHERE bno = #{bno }
<if test="m_id != null">
AND m_id=#{m_id }
</if>
</select>
03. 로그인한 사용자만 글 수정하기
01) 'detail.jsp' 수정하기
- if문 안에 조건문 넣어서 로그인 했을 경우에만 수정&삭제 버튼 나오게 하기
<c:if test="${sessionScope.mid ne null && m_id eq dto.m_id}">
<img alt="" src="./img/edit.png" style="width: 7%;" onclick="edit()">
<img alt="" src="./img/del.png" style="width: 7%;" onclick="del()">
</c:if>
02) 'BoardController.java' 수정하기
// 수정하는 화면 만들기
@GetMapping("/edit")
public ModelAndView edit(HttpServletRequest request) {
HttpSession session = request.getSession();
ModelAndView mv = new ModelAndView("edit");// edit.jsp로 갈거야
// dto를 하나 만들어서 거기에 담겠습니다. = bno, mid
BoardDTO dto = new BoardDTO();
dto.setBno(util.str2Int(request.getParameter("bno")));
// 내 글만 수정할 수 있도록 세션에 있는 mid도 같이 보내기
dto.setM_id((String) session.getAttribute("mid"));
// 데이터 베이스에 bno를 보내서 dto를 얻어오기
BoardDTO result= boardService.detail(dto);
// mv에 보내기
mv.addObject("dto", result);
return mv;
}
@GetMapping("/detail") // model은 jsp에 값을 붙이기 위해서 넣기
public String detail(HttpServletRequest request, Model model) {
// String bno = request.getParameter("bno");
int bno = util.str2Int(request.getParameter("bno"));
// DTO로 변경하기
BoardDTO dto = new BoardDTO();
dto.setBno(bno);// 글 상세보기에선 mid가 없어도 됨
BoardDTO resule = boardService.detail(dto);
model.addAttribute("dto", resule);
return "detail";
03) 'board-mapper' 수정하기
<select id="detail" parameterType="Integer" resultType="boardDTO">
SELECT *
FROM boardview
WHERE bno = #{bno }
AND m_no=(SELECT m_no FROM members WHERE m_id=#{mid})
</select>
04) 'BoardController.java' 수정하기
- ModelAndView 원래의 형태 : ModelAndView mv = new ModelAndView("redirect:/login")
- login.jsp 페이지로 이동 - 따옴표가 비워진 형태 : ModelAndView mv = new ModelAndView(""
- 객체만 생성하고 이동할 곳을 비워서 선언
- 아래의 부분에서 mv.setViewName("edit"); 이렇게 적어줘서 이동할 jsp명을 적어줌
- 이동하는 곳이 여러개일 때 사용
// 수정하는 화면 만들기
@GetMapping("/edit")
public ModelAndView edit(HttpServletRequest request) {
HttpSession session = request.getSession();
ModelAndView mv = new ModelAndView();// edit.jsp로 갈거야
// 로그인 하지 않으면 로그인 화면으로 가기
// if문으로 만들기
if (session.getAttribute("mid") != null) {
// dto를 하나 만들어서 거기에 담겠습니다. = bno, mid
BoardDTO dto = new BoardDTO();
dto.setBno(util.str2Int(request.getParameter("bno")));
// 내 글만 수정할 수 있도록 세션에 있는 mid도 같이 보내기
dto.setM_id((String) session.getAttribute("mid"));
// 데이터 베이스에 bno를 보내서 dto를 얻어오기
BoardDTO result = boardService.detail(dto);
// mv에 보내기
mv.addObject("dto", result);
mv.setViewName("edit");// 이동할 jsp명을 적어줌
return mv;
} else {
mv.setViewName("redirect:/login");
}
return mv;
}