게시글삭제 / 검색 / 로그인필터 구현

DeadWhale·2022년 6월 8일
0

Servlet/JSP

목록 보기
22/22
post-thumbnail

게시글 삭제

로그인하고 작성자일 경우에만 수정/삭제 버튼이 활성화 되는데.
즉시 실행 함수( )( ) 으로
deleteBtn이라는 Id값이 클릭된 경우의 Event를 추가했다

(function deleteBoard(){
    const deleteBtn = document.getElementById("deleteBtn"); // if문으로 인해 없을경우 NULL 

    if(deleteBtn != null){ //삭제 버튼이 화면에 존재할 경우
        deleteBtn.addEventListener("click",function(){
            // /community/board/delete?no=1500&  type = 1
            //                 어느 게시글을 삭제할지 / 어느 게시판인지

            let url = "delete"; //상대경로

            // 1) 쿼리 스트링에 존재하는 모든 파라미터만 얻어오기
            const params = new URL(location.href).searchParams;

            // 2) url에 쿼리스트링 추가
            const no = "?no="+params.get("no");//게시글 얻어오기.
            const type = "&type="+params.get("type");//게시판 종류 얻어오기.
        
            // 3) url에 필요한 parameter들 전부 저장
            url +=no+type;
            
            if(confirm("정말로 삭제하시겠습니까?")){
                location.href=url; //Get방식 요청
            }
        })
    }
})();

JS으로 추가된 이벤트가 수행시 해당 게시글의 번호와 게시판 종류를 Parameter로 저장후 BoardDeleteServlet으로 요청된다

이후에는 어렵다고 생각되는 부분이 따로 없다
다만 한번 더 생각해야 할 부분은 게시글의 'DELETE' 가 아닌
'UPDATE'으로 게시글의 상태가 변경되는것임을 기억하자

JDBC 수행 후 Redirect할 주소로 req.getHeader("referer") 작성시
요청받은 페이지의 바로 이전 페이지로 이동된다


검색

BoardList.JSP 페이지에서 boardSearch 영역의
form 태그가 submit 되었을 때의 기능 검색한 경우의 기능
단순 게시글 검색과 유사하지만
전달되는 파라미터를 이용해 검색 해야 하는 조건이 달라진다

전달되는 Parameter

  • input type="hidden" 으로 전달되는 게시판 종류
  • select > option 속성( 제목,내용,제목+내용,작성자 ) 하나
  • query 내용 (입력되지 않을 경우 submit 중지 )

새로운 Servlet을 생성하는 것이 아닌. 이미 있는 목록을 조회하는 BoardListServlet에서 만약 검색할때만 전달되는 parameter( key , query 등등) 가 null이 아닐때 map에 검색된 게시글 목록을 조회해 대입하는 service를 호출한다

// 게시판 이름, 페이지네이션 객체, 게시글 리스트 3개를 한번에 반환하는 service 호출
Map<String, Object> map = null;
			 
if(req.getParameter("key")==null) { //일반 목록 조회
	map=service.selectBoardList(type, cp);
}else { //검색 목록 조회
	String key = req.getParameter("key");
	String query = req.getParameter("query");
	map = service.searchBoardList(type,cp,key,query);
			}

BoardService

Parameter로 전달받는 key(검색옵션) , query(검색내용)을 가공해 Switch문으로 SQL문에 조건절을 추가한다.

String condition = null; //검색 조건을 저장하기 위한 변수.
switch(key) {
	case "t":condition=" AND BOARD_TITLE LIKE '%"+query+"%' "; break;
	case "c":condition=" AND BOARD_CONTENT LIKE '%"+query+"%' "; break;
	case "tc":condition=" AND (BOARD_CONTENT LIKE '%"+query+"%' OR BOARD_TITLE LIKE '%"+query+"%') "; break;
	case "w":condition=" AND MEMBER_NICK LIKE '%"+query+"%' "; break;
		}

이후 sql을 수행할 때 pagination하기 위해 포함되는 모든 게시글의 수 구할때는
단순히 + 으로 sql을 수행하면 되지만

실제로 게시글 목록을 조회하는 SQL의 경우 중간에 추가적인 조건문( condition )이 중간에 들어가야 함으로 두개의 entry로 나눠 중간에 접목하는 모양새를 취해야 한다.

<entry key="searchListCount">
SELECT COUNT(*) FROM BOARD 
JOIN MEMBER USING(MEMBER_NO)
WHERE BOARD_ST='N' 
AND BOARD_CD=?  + 여기에 가공된 조건문 첨부
</entry>

	
<entry key="searchBoardList1">
SELECT * FROM(
SELECT ROWNUM AS RNUM, A.* FROM(
	SELECT BOARD_NO,BOARD_TITLE,MEMBER_NICK,
	TO_CHAR(CREATE_DT,'YYYY-MM-DD') AS CREATE_DT,  
	READ_COUNT,
		(SELECT IMG_RENAME FROM BOARD_IMG
		WHERE IMG_LEVEL=0 
		AND BOARD_IMG.BOARD_NO = BOARD.BOARD_NO) THUMBNAIL
	FROM BOARD
	JOIN MEMBER USING(MEMBER_NO)
	WHERE BOARD_CD=? 
	AND BOARD_ST='N'
</entry>
	여기 사이에 가공된 조건문이 첨부
<entry key="searchBoardList2">
	ORDER BY BOARD_NO DESC
	) A
)
WHERE RNUM BETWEEN ? AND ?
</entry>

로그인 필터

로그인 하지 않았을 경우. 접근을 제한해야 하는 페이지가 존재한다.
게시글작성/수정/삭제 , 댓글 작성/수정/삭제 마이페이지등
로그인하지 않으면 접근을 못하게 막고 메인페이지로 이동 시키는 필터를 작성했다

@ 어노테이션

@WebFilter(filterName="loginFilter",
urlPatterns={
  "/board/write",
  "/board/delete",
  "/reply/insert",
  "/reply/update",
  "/reply/delete",
  "/member/myPage/*"}	)

위의 url로 요청이 들어올때 로그인 필터를 거치게 된다.

이 때 session 객체를 생성해야 하는데 Filter의 경우에는 HTTPServlet Req/Resp가 아니라 다른 Request , response객체라 다운캐스팅이 필요하다
`

//1. ServletRequest , ServletResponse 다운 캐스팅
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
		
//2.session 얻어오기.
HttpSession session = req.getSession();

그 후 session객체에를 if문으로 조회하고 T/F 값에 따라 다른 수행이 진행된다

//3. 로그인 여부 확인
if(session.getAttribute("loginMember")!=null) { //로그인 된 경우.
//정상 동작
//다음 필터 호출 , 없으면 servlet으로 이동
chain.doFilter(request, response);
}else { //로그인 값이 없는 경우
  session.setAttribute("message", "비정상적인 접근입니다. 로그인 후 이용해주세요");
  resp.sendRedirect(req.getContextPath()); //메인페이지(최상위 페이지)
		}

0개의 댓글