오늘은 어제 각 매핑마다 세션을 만들던 것을 세션 만드는 곳을 따로 util 에 넣기
김영한님 스프링 강의에서 본 것처럼 의존성을 최소화하는 방법인 것 같다
public HttpServletRequest req() {
ServletRequestAttributes sra =
(ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
// 이렇게 작성해야만 접속한 사람의 request 를 받을 수 있음
HttpServletRequest request = sra.getRequest();
return request;
}
BoardService 의 request 만들던 것 util 꺼로 바꾸기
public int write(BoardDTO dto) {
HttpSession session = util.req().getSession();
dto.setMid((String) session.getAttribute("mid"));
return boardRepository.write(dto);
}
컨트롤러에서 매개변수로 건내주던 거 바꾸기
// IP 잡아주기
dto.setBoard_ip(request.getRemoteAddr());
// int result = boardService.write(dto, request);
int result = boardService.write(dto);
util 에서 세션까지 받기
public HttpServletRequest req() {
ServletRequestAttributes sra =
(ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
// 이렇게 작성해야만 접속한 사람의 request 를 받을 수 있음
HttpServletRequest request = sra.getRequest();
return request;
}
public HttpSession getSession() {
HttpSession session = req().getSession();
return session;
// return req().getSession();
}
서비스나 컨트롤러에서 계속 getSession 해서 getAttribute 로 mid 나 다른 것을 가져올거면
그것도 util 에 만들 수 있지 않을까해서 만든 getMid
public String getMid() {
return (String) getSession().getAttribute("mid");
}
이런식으로 활용할 수 있음
public int commentWrite(CommentDTO comment) {
comment.setMid(util.getMid());
return boardRepository.commentWrite(comment);
}
아이피 가져오는 것도 만들기
public String getIp() {
return (String) req().getRemoteAddr();
}
글 삭제 시 로그인 여부 체크, 로그인하지 않으면 로그인으로 보내기
@PostMapping("/postDel")
public String postDel(@RequestParam("bno") int no) {
// 삭제 시 로그인 여부 확인하기
if (util.getMid() != null) {
int result = boardService.postDel(no);
if (result == 1) {
return "redirect:/board";
} else {
return "redirect:/error";
}
} else {
return "redirect:/login";
}
}
글 삭제 시 로그인 한 사용자의 mid 도 같이 전송하여 작성자가 맞으면 글 삭제하기
public int postDel(int no) {
BoardDTO dto = new BoardDTO();
dto.setBoard_no(no);
dto.setMid(util.getMid());
return boardRepository.postDel(dto);
}
Repository 에서도 mybatis 에 dto 를 보내고 mapper 에서 쿼리문 수정하기
<update id="postDel" parameterType="boardDTO">
<![CDATA[
update board set board_del = '0'
where board_no = #{board_no}
and mno=(select mno from member where mid=#{mid})
]]>
</update>
이제 로그인한 사용자와 글쓴이, 댓 글쓴이가 같을 경우에만 아이콘 뜨게 만들기
<!-- 글 작성자와 체크하기 -->
<span class="mname">${detail.mname }
<c:if test="${sessionScope.mid eq detail.mid }">
<i class="xi-document"></i>
<i class="xi-close-circle-o" onclick="deletePost()"></i>
</c:if>
</span>
<!-- 댓글 작성자와 체크하기 -->
<span class="commentMname">${comment.mname } 님
<c:if test="${sessionScope.mid eq comment.mid }">
<i class="xi-document"></i>
<i class="xi-close-circle-o" onclick=""></i>
</c:if>
</span> <span>${comment.cdate }</span>
댓글 삭제 만들기, 댓글 삭제 아이콘에 onclick 달기
<i class="xi-close-circle-o" onclick="commentDel(${comment.no})"></i>
스크립트 작성
function commentDel(cno) {
if (confirm("삭제하시겠습니까?")) {
let vform = $('<form></form>');
vform.attr('method', 'post');
vform.attr('action', './commentDel');
vform.append($('<input/>', {type:'hidden', name:'no', value:cno}));
vform.appendTo('body');
vform.submit();
}
}
controller, Serivce 와 repository 까지 연결
@PostMapping("/commentDel")
public String commentDel(CommentDTO dto) {
// 로그인한 사람도 같이 보내기
dto.setMid(util.getMid());
boardService.commentDel(dto);
// 헤더에서 이전 페이지를 읽음
String referer = util.req().getHeader("Referer");
// 이전 페이지로 리다이렉트
return "redirect:"+ referer;
}
board-mapper 에 update 문 추가
<update id="commentDel" parameterType="commentDTO">
<![CDATA[
update comment set cdel = '0'
where cno = #{no}
and mno=(select mno from member where mid=#{mid})
]]>
</update>
글 쓸때 <, > 표시 바꾸기
public String http2Java(String str) {
String result = str.replaceAll("<br>", "\r\n");
result = str.replaceAll("<", "<");
result = result.replaceAll(">", ">");
return result;
}
이것을 글 쓸때와 댓글 적을 때 둘 다 적용
public int write(BoardDTO dto) {
// HttpSession session = util.req().getSession();
// HttpSession session = util.getSession();
// dto.setMid((String) session.getAttribute("mid"));
dto.setMid((String) util.getSession().getAttribute("mid"));
dto.setBoard_title(util.http2Java(dto.getBoard_title()));
dto.setBoard_content(util.http2Java(dto.getBoard_content()));
return boardRepository.write(dto);
}
글을 다시 불러올 때 <br> 을 바꾼 걸 다시 <br> 로 변경
public String java2Http(String str) {
String result = str.replaceAll("\r\n|\r|\n|\n\r", "<br>");
return result;
}
이건 엔터키 처리가 필요없는 input 대신 textarea 쪽에 처리
BoardController 에서 마지막 DTO 가 전달되어 Controller 에서 처리
int reNo = util.str2Int(no);
if (reNo != -1) {
BoardDTO boardDTO = boardService.detail(reNo);
boardDTO.setBoard_content(util.java2Http(boardDTO.getBoard_content()));
model.addAttribute("detail", boardDTO);
if (boardDTO.getComment() > 0) {
List<CommentDTO> commentList = boardService.commentList(reNo);
model.addAttribute("comment", commentList);
}
return "detail";
Login 을 시도하고 로그인 실패 시 시도한 ID 의 시도횟수 늘리기
먼저 DB 에 count 칼럼 추가
이후 mapper 에 update 추가하기
<update id="countUp" parameterType="loginDTO">
update member set mcount = mcount + 1
where mid=#{mid}
</update>
로그인 시 count 늘리는 것 추가하기, dto 는 로그인 시도 시 id, pw 조회하는 dto
loginService.countUp(dto);
return loginRepository.countUp(dto);
return sqlSession.update("login.countUp", dto);
로그인 성공 시 count 수 초기화 하는 작업 수행
<update id="countReset" parameterType="loginDTO">
update member set mcount = 0 where mid=#{mid}
</update>
board.jsp 에 글 쓸때 summernote 추가하기
부트스트랩 5버전과 충돌나니 꼭 이 블로그를 보고 진행할 것
화이팅
'Spring' 카테고리의 다른 글
240223 스프링 프로젝트 (0) | 2024.02.23 |
---|---|
240222 스프링 프로젝트 (0) | 2024.02.22 |
240220 스프링 프로젝트 (0) | 2024.02.20 |
240219 스프링 프로젝트 (0) | 2024.02.19 |
240216 스프링 프로젝트 (2) | 2024.02.16 |