티스토리 뷰

Biz 에서는 특히나 순서(process)가 중요하다. 무결성 때문에.

(여러개의 task가 어떤 순서를 가지고 있고, 이것을 process, 또는 business라고 한다.)


리스트 및 상세정보를 조회하기 전에 해주어야 할 것이 있다. 

1. 사용자가 리스트를 볼 수 있는 권한이 있나. 

2. 사용자가 상세정보를 볼 권한이 있나. 


이 게시판은 회원제이기 때문에, 회원이 아닌 사람들은 인덱스 페이지와 회원가입 페이지를 제외하고는 다른 페이지를 볼 수 없도록 처리해주어야 한다. 이를 표로 나타낸것은 아래와 같다.


만약 비회원이 url에 직접 uri를 적고 들어오려고 한다면, 여기에 못들어오도록 막아주어야 한다. 즉 서블릿에 접속하기 전에 들렷다 가는 곳, 즉 filter 에서 uri를 체크해주면 된다. 

<url과 uri의 차이점>

 


비회원이 볼수 있는 uri를 담은 List가 whiteList이고, resource 폴더의 내용을 jsp에 입혀 보여주기 위해서 따로 List를 만들었다. 그런데 whiteList만 만들어주면 에러가 난다. 


이를 위해 만들어준것이 바로 staticResourceList!


전체 소스는 다음과 같다.

SessionCheckFilter.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
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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package com.ktds.smahn.filter;
 
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
 
import com.ktds.smahn.member.vo.MemberVO;
 
/**
 * 세션을 체크한다.
 * Servlet Filter implementation class SessionCheckFilter
 */
public class SessionCheckFilter implements Filter {
    
    private List<String> whiteList;
    
    private List<String> staticResourceList;
 
    /**
     * 필터에서 생성자는 의미 없다.
     * Default constructor. 
     */
    public SessionCheckFilter() {
        
        whiteList = new ArrayList<String>();
        //  게스트가 바로 통과할 수 있는 uri
        whiteList.add("/");
        whiteList.add("/doLogin");
        whiteList.add("/registerMember");
        whiteList.add("/addNewMember");
        // url 앞에 뜨는 아이콘
        whiteList.add("/favicon.ico");
        
        //resource를 jsp에서 보여주려면 따로 list를 만들어주어야 한다.
        staticResourceList = new ArrayList<String>();
        //                         /resource --> resourceImage 도 그냥 지나감.
        staticResourceList.add("/resource/");
    }
 
    /**
     * @see Filter#destroy()
     */
    public void destroy() {
    }
 
    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        
        
        
        //ServletRequest, ServletResponse : 인터페이스
        //HttpServletRequest, HttpServletResponse : 클래스
        // 인터페이스와 클래스는 상속관계, 즉 부모와 자식 관계
        HttpServletRequest req = (HttpServletRequest) request;
        
        String uri = req.getRequestURI();
        System.out.println(uri);
        
        
        
        if!whiteList.contains(uri) ){
            
            boolean isURIResourceFile = false;
            
            forString staticResource : staticResourceList ){
                if( uri.startsWith(staticResource) ) {
                    //사용자가 요청한 uri가 /resource로 시작한다면 그냥 지나가라.
                    isURIResourceFile = true;
                    break;
                }
            }
        
        
            if!isURIResourceFile ){ 
            
                // whiteList에 uri가 없다면 세션을 체크해라.
                HttpSession session = req.getSession();
                
                // 데이터를 넣을때는 setAttribute, 가지고올때는 getAttribute를 쓴다. 
                MemberVO member = (MemberVO) session.getAttribute("_MEMBER_");
                // 세션에 null이 있으면 로그인페이지로 redirect한다. 
                if( member == null ){
                    HttpServletResponse res = (HttpServletResponse) response; 
                    res.sendRedirect("/");
                    return;
                }
            }
        }
        
 
 
        
        // pass the request along the filter chain
        chain.doFilter(request, response);
    }
 
    /**
     * web.xml에 어떤 설정을 해 줄때만 가능하다. 
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
 
    }
 
}
 
cs



 이제 권한을 설정해주었으니까, 본격적으로 , 리스트 조회, 상세정보 조회를 하는 업무를 처리 해보자. 현재 구성도는 다음과 같다.


C : 글쓰기

R : 리스트 read

R : 상세정보 read

U : 수정

D : 삭제

총 5개의 기능이 있다. 그러면 페이지는 몇개일까? 이 중에서 삭제는 버튼이므로 페이지로 분류하지 않는다. 수정은 글쓰기와 동일하지만, 다른 점은 양식에 텍스트가 미리 채워져있다는 것과, 폼의 액션이 달라진다. 그렇기 때문에 페이지로 분류하지 않는다. 그래서 총 3개의 페이지가 필요하다.

글쓰는 폼, 리스트 보여주는 폼, 상세정보 보여주는 폼 이렇게 3개 !!! 



먼저 글쓰는 페이지는 다음 포스팅에서 하기로 하고 리스트 보여주기와 상세정보 보여주기 페이지를 만들어보겠다. 

인덱스 페이지에서 로그인 버튼을 눌렀을 때, 로그인이 성공되면 list서블릿을 호출해야한다.


1. 게시물 리스트 보여주기

(1) 서블릿 만들기

ListServlet.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
package com.ktds.smahn.article.web;
 
import java.io.IOException;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import com.ktds.smahn.article.biz.ArticleBiz;
import com.ktds.smahn.article.vo.ArticleVO;
 
/**
 * Servlet implementation class ListServlet
 */
public class ListServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private ArticleBiz articleBiz;
    
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ListServlet() {
        super();
        articleBiz = new ArticleBiz();
 
    }
 
    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
 
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        ArticlVO articles = articleBiz.showList(searchVO);
        
        request.setAttribute("articles", articles);
        RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/view/article/list.jsp");
        rd.forward(request, response);
 
    }
 
}
 
cs


(2) Biz 만들기


() jsp 만들기

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
<%@ 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">
 
 
</script>
 
 
    <a href="/logout"><img src="/resource/img/logout.png" id="btnLogout" /></a>
    <br/>
    <table>
        <tr>
            <th>번호</th>
            <th>제목</th>
            <th>글쓴이</th>
            <th>조회수</th>
            <th>추천수</th>
        </tr>
        
    <c:forEach items="${articles.articleList}" var="article">
        <tr>
            <td>${article.articleId}</td>
            <td id="title">
                <a href = "/increaseHits?articleId=${article.articleId}">
                    ${article.title}
                </a>
            </td>
            <td>${article.nickName}</td>
            <td>${article.hits}</td>
            <td>${article.recommends}</td>
        </tr>
    </c:forEach>
    </table>
    <a href="/write">글쓰기</a>
    
<jsp:include page="/WEB-INF/view/common/footer.jsp"></jsp:include>
cs




2. 게시물에 해당하는 상세 정보 보여주기





공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함