수업/정리

220503 Spring-9 실습: 회원관리, 게시판관리

jumphare 2022. 5. 3. 23:39

** 회원 관리 - 이어서

*member_login.jsp
비밀번호 찾기
 <input type="button" value="비번찾기" class="input_button" onclick="pwd_find()" />

function pwd_find(){
   window.open("pwd_find.nhn","비번찾기","width=450,height=500");
    //팝업창 ("경로와 파일명","팝업창이름","팝업 속성(기본단위 픽셀)")
 }

*pwd_find.jsp
아이디/메일 써서 pwd_find_ok.nhn으로 넘김

*MemberAction.java (Controller)
@RequestMapping(value = "/pwd_find_ok.nhn", method = RequestMethod.POST)
public String pwd_find_ok(@ModelAttribute MemberBean mem, HttpServletResponse response, Model model) throws Exception {

비밀번호 메일을 보내는 내용을 집어넣고
model.addAttribute("pwdok", "등록된 email을 확인하세요");
return "member/pwd_find";

*다시 pwd_find.jsp
<c:if test="${!empty pwdok}">
    <h2 class="pwd_title2">결과</h2>
    <table id="pwd_t2">
     <tr>
      <th>검색한 비번:</th>
      <td>${pwdok}</td>
     </tr>
    </table>
</c:if>

---> 메일이 왔는지 확인.


*인터셉터 : 로그인 상태에서 진행해야 하는 요청이 있을 때, 컨트롤러로 넘어가기 전 요청을 가로채서 실행해보고 문제 없을 경우 컨트롤러로 다시 넘겨줌
public class SessionCheckInter extends HandlerInterceptorAdapter {

// preHandle(request,response,handler)메소드
// 1.Controller에서 요청(*.nhn)을 받기 전에  preHandle()가 호출되어 가로채는 역할로 사용
// 2.로그인 하지않고(세션이 없으면) 요청하면 로그인 폼으로 이동 하도록 해주는 역할


public boolean preHandle(HttpServletRequest request, 
   HttpServletResponse response, Object handler) throws Exception {
   HttpSession session = request.getSession();
   String id = (String)session.getAttribute("id");
   if (id == null || id.equals(""))  {
      response.sendRedirect("member_login.nhn"); // 세션이 없으면 로그인 폼으로 이동
      return false;
   }
   return true;
}

---> servlet-context에 맵핑한 요청이 있을 시 이 클래스로 넘어감!
<mapping path="/member_edit.nhn"/>
<mapping path="/member_edit_ok.nhn"/>
<mapping path="/member_del.nhn"/>
<mapping path="/member_del_ok.nhn"/>
<mapping path="/member_logout.nhn"/>



** 게시판 관리
환경설정은 이제껏 했던 것과 동일함 - 생략.

체크할 부분
@RequestMapping(value = "/board_del_ok.do", method=RequestMethod.POST)
public String board_del_ok(@RequestParam("board_num") int board_num, @RequestParam("page") int page,
@RequestParam("pwd") String board_pass, //받은 값은 pwd인데 매개변수는 board_pass일 때두 값을 서로 맵핑해주기 위해 @RequestParam 사용
Model model)

@RequestMapping(value = "/board_reply_ok.do", method=requestMethod.POST)
public String board_reply_ok(@ModelAttribute BoardBean b, //dto의 변수와 일치하는 값을 맵핑해주기 위해 @ModelAttribute 사용
@RequestParam("page") String page) 


//공통적으로 진행되는 과정이 있는 경우 이렇게 묶어서 나뉘는 부분만 조건문으로 처리할 수 있음! --> 효율적으로 요청을 실행하는 방법.
@RequestMapping(value = "/board_cont.do")
public String board_cont(@RequestParam("board_num") int board_num,
@RequestParam("page") String page,@RequestParam("state") String state,  Model model) throws Exception {

   if (state.equals("cont")) {    // 상태가 내용보기일때만
      boardService.hit(board_num);  // 조회수 증가
   }

   BoardBean board = boardService.board_cont(board_num);
   //db값 dto에 저장해서 model 객체로 공유
   model.addAttribute("bcont", board);  //변수 다르게 놓을 경우 헷갈리지 말 것.
   model.addAttribute("page", page);

   if (state.equals("cont")) {// 내용보기일때
      String board_cont = board.getBoard_content().replace("\n","<br/>");
      //글내용 중 줄바꿈 부분 출력되도록 html형태로 수정
      model.addAttribute("board_cont", board_cont);
      return "board/board_cont";  // 상세페이지로 넘어감
   } else if (state.equals("edit")) {   // 수정폼
      return "board/board_edit";
   } else if (state.equals("del")) {   // 삭제폼
      return "board/board_del";
   } else if (state.equals("reply")) {   // 답변폼
      return "board/board_reply";
   }
   return null;
}

*답글
boardService.reply_ok(b)

public void reply_ok(BoardBean b) throws Exception {
   boardDao.refEdit(b); // 기존 댓글 board_re_seq값 1증가
//얘는 특정 조건의 seq값만 증가시켜야 하므로 sql문으로 실행함
   b.setBoard_re_lev(b.getBoard_re_lev() + 1);  // 부모보다 1증가된 값을 저장
   b.setBoard_re_seq(b.getBoard_re_seq() + 1);
//기존에 sql문에서 처리하던 부분을 service 클래스에서 셋팅한 뒤 바꾼 값을 그대로 mapper로 넘겨 update 처리함 --- 기본적으로 다 1을 증가시키니까 가능
   boardDao.boardReplyOk(b);
}

※ 서비스 클래스의 메소드에 붙는 @Override : 상속받은 메소드에 달아주면 오버라이드한 메소드임을 표시할 수 있음. 생략해도 상관없지만 있으면 실수를 줄일 수 있음