티스토리 뷰

<관리자 페이지>


1. 관리자용 프로젝트 생성하기


이제까지 만든 front 페이지를 그대로 가져와서 admin 쪽만 추가해줄 것이다. 그냥 그래서 위에처럼 생성할 필요없이 Article 프로젝트를 복사 붙여넣기만 하면된다.



그리고 프로젝트 우클릭 - properties - web project settings에서 아래와같이 설정하고 적용버튼을 누른다.



이제까지 만든 회원제 게시판은 아주 치명적인 점을 갖고 있다. 그것은 MEMBERS 테이블에 등록되어있는 많은 바로 관리자 아이디가 없다는 것인데, 관리자의 권한은 계정에 부여된 플래그(flag)로 결정된다.

그래서 toad를 켜서 members 테이블에 관리자인지 아닌지의 여부를 알려줄 column을 하나 추가해주어야한다.




이렇게 추가해주고 데이터를 하나 insert해준다. IS_ADMIN 칼럼에 Y라고 쓴다.



그리고 로그인 시 관리자 계정만 접근할 수 있도록 쿼리를 수정해주어야한다.

query.xml을 열어 아래와 같이 수정해준다.


이렇게 하면은 클라이언트는 관리자 페이지에 로그인할 수 없게 된다.



2. url 수정하기


Article-Admin 프로젝트에 있는 파일들에서 src, action, href 를 검색하여 url을 수정해주어야한다.

Ctrl + H 를 눌러서 File Search 탭을 클릭한 후, 아래와 같이 검색한다. (Ctrl + H 는 한꺼번에 내용을 찾아줄 수 있는 단축키이다)



그러면 이런 화면이 아래부분에 나온다.



이런식으로 src와 action도 검색하여 모두 /admin/를 넣어준다.




3. 일괄 삭제 기능 넣기


list.jsp 에 일괄 삭제 기능을 넣기 위해서는 빨간 네모박스 부분처럼 수정해주어야 한다.

1) 가장 상단의 네모박스를 클릭하면 전체가 다 눌리게 하기

2) 일괄삭제 버튼을 누르면 정말 삭제하시겠습니까? 라는 경고창이 나온 뒤, 다시 list로 redirect하기

3) 만약 아무것도 누르지 않고 일괄삭제를 누르면 삭제할 대상을 선택하세요 라고 나오게 하기


전체 소스는 다음과 같다.


list.jsp

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

<%@ page language="java" contentType="text/html; charset=UTF-8"

   pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri = "http://java.sun.com/jsp/jstl/core" %>

<jsp:include page="/WEB-INF/view/common/header.jsp"></jsp:include>

<script type="text/javascript">

   $(document).ready(function(){

       $("#massiveSelectCheckBox").click(function() {

           

           var isChecked = $(this).prop("checked");

           $(".deleteArticleId").prop("checked", isChecked);

           

       });

       

       $("#massiveDeleteBtn").click(function() {

           

           var isChecked = false;

           

           /* 각각의 클래스를 다 보면서 선택이 됬는지 안됬는지 체크한다. */

           $(".deleteArticleId").each(function(index, data){

               if( data.checked ){

                   isChecked = data.checked;

               }

           });

           

           if(!isChecked){

               alert("삭제할 대상을 선택하세요.");

               return;

           }

           

           /* 사용자에게 한번 더 컨펌 */

           if( confirm("정말 삭제하시겠습니까?")){

               alert("삭제되었습니다");

               

               var form = $("#massiveDeleteForm");

               form.attr("method", "post");

               form.attr("action", "<c:url value="/massiveDelete" />");

               form.submit();

           }

       });

   });

</script>

   <a href="<c:url value="/logout" />"><img src="<c:url value="/resource/img/logout.png" />" id="btnLogout" /></a>

   총 ${ articles.paging.totalArticleCount } 건의 게시물이 있습니다.

   <br/>

   <table>

       <tr>

           <th>

               <input type="checkbox" id="massiveSelectCheckBox" />

           </th>

           <th>번호</th>

           <th>제목</th>

           <th>글쓴이</th>

           <th>조회수</th>

           <th>추천수</th>

       </tr>

       

       

   <form id="massiveDeleteForm">

       <c:forEach items="${articles.articleList}" var="article">

           <tr>

               <td>

                   <input type="checkbox" class="deleteArticleId"

                           name="deleteArticleId" value="${ article.articleId }" />

               </td>

               <td>${article.articleId}</td>

               <td id="title">

                   <a href = "<c:url value="/increaseHits?articleId=${article.articleId}" />">

                       ${article.title}

                   </a>

                   <c:if test="${article.fileCount gt 0}">

                       [${article.fileCount}개의 첨부파일 있음.]

                   </c:if>

               </td>

               <td>${article.nickName}</td>

               <td>${article.hits}</td>

               <td>${article.recommends}</td>

           </tr>

       </c:forEach>

   </form>    

   

   

       <tr>

           <td colspan="6">

               <form id="searchForm">

               ${ articles.paging.getPagingList("pageNo", "[@]", "[이전]", "[다음]", "searchForm") }

               </form>

           </td>

       </tr>

   </table>

   <a href="<c:url value="/write" />">글쓰기</a>

   <span id="massiveDeleteBtn" style="cursor: pointer;">일괄삭제</span>

   

<jsp:include page="/WEB-INF/view/common/footer.jsp"></jsp:include>



Colored by Color Scripter

cs



MassiveDeleteServlet.java 새로 생성한다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

package com.ktds.smahn.article.web;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

import com.ktds.smahn.article.biz.ArticleBiz;

import com.ktds.smahn.member.vo.MemberVO;

import com.ktds.smahn.util.Root;

/**

* Servlet implementation class MassiveDeleteServlet

*/

public class MassiveDeleteServlet extends HttpServlet {

   private static final long serialVersionUID = 1L;

   

   private ArticleBiz articleBiz;

      

   /**

    * @see HttpServlet#HttpServlet()

    */

   public MassiveDeleteServlet() {

       super();

       articleBiz = new ArticleBiz();

   }

   /**

    * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

    */

   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

       response.sendError(HttpServletResponse.SC_FORBIDDEN, "잘못된 요청입니다.");

   }

   /**

    * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

    */

   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

       

       // 선택 된것만 넘어온다.

       // html 컬렉션 은 배열로 받는다.

       String[] deleteArticleIds = request.getParameterValues("deleteArticleId");

       

       HttpSession session = request.getSession();

       MemberVO member = (MemberVO) session.getAttribute("_MEMBER_");

       

       articleBiz.deleteTheArticles(deleteArticleIds, member);

       

       response.sendRedirect(Root.get(this) + "/list");

       

   }

}

Colored by Color Scripter

cs




ArticleBiz.java 에 추가할 메서드

1

2

3

4

5

6

7

8

9

10

11

12

13

   /**

    * 대량 삭제는 admin만 가지고 있는 기능이니까, admin인지 아닌지만 체크해주면 된다.

    * @param deleteArticleIds

    * @param member

    */

   public void deleteTheArticles(String[] deleteArticleIds, MemberVO member) {

           if( member.isAdmin() ){

               for( String articleId : deleteArticleIds ){

                   articleDAO.deleteOneArticleByArticleId(Integer.parseInt(articleId));

               }

           }

   }

Colored by Color Scripter

cs



ArticleDAO.java 는 동일하다.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

   /**

    * 해당 글 삭제하기

    */

   public void deleteOneArticleByArticleId(int articleId) {

       

       int deleteCount = 0;

       loadOracleDriver();

       Connection conn = null;

       PreparedStatement stmt = null;

       try {

           conn = DriverManager.getConnection(Const.DB_URL, Const.DB_ID, Const.DB_PASSWORD);

           String query = XML.getNodeString("//query/article/deleteOneArticleByArticleId/text()");

           stmt = conn.prepareStatement(query);

           stmt.setInt(1, articleId);

           deleteCount = stmt.executeUpdate();

           if (deleteCount > 0) {

               stmt.close();

               System.out.println("삭제 성공");

           }

       } catch (SQLException e) {

           throw new RuntimeException(e.getMessage(), e);

       } finally {

           closeDB(conn, stmt, null);

       }        

       

   }

Colored by Color Scripter

cs



공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함