티스토리 뷰

Java

[Servlet] Session 객체 사용하기

Alledy 2019. 6. 18. 11:18

Servlet에서 Session 객체 사용하기

  • 구현 기능

    • html 파일에서 클릭 이벤트 발생시 id를 쿼리스트링으로 보내고, 서블릿에서 이를 받아서 세션 객체에 저장함
    • 장바구니 기능에 응용될 수 있는 것으로, 사용자가 어떤 이미지를 클릭할 때마다 클라이언트 쪽에서 id 쿼리스트링을 보내서 이를 세션 객체로 생성한 배열에 저장하여 상품 id당 클릭이벤트의 누적 값을 보여주도록 함.

     

  • 코드

    • javascript click event - a 태그로
    // productlog2.html
    // image append는 이미 되어 있다고 가정한다. 아래는 이미지 로드 시 실행될 이벤트 함수 
    function getA() {
        var anchor = document.createElement('a');
        $('#somediv').append(anchor); 
        // 이미지 id 패스
        anchor.href=`/someurl?pid=${this.id}`
        anchor.appendChild(this); 
    }
    

     

    • Servlet
    package core;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    
    @WebServlet("/someurl")
    public class BasketServlet2 extends HttpServlet {
    	private static final long serialVersionUID = 1L;
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		response.setContentType("text/html; charset=utf-8");
            // 쿼리스트링 저장(pid는 상품 아이디)
    		String pid = request.getParameter("pid");
    		String action = request.getParameter("action");
    		int[] arr;
    		PrintWriter out = response.getWriter();
            
    		// 세션 생성
    		HttpSession session = request.getSession(true)
                
            // action은 장바구니 비우기 기능을 위한 것 
    		if(action != null) {
    			if(action.equals("r")) {
    				session.removeAttribute("arr");
    				out.write("<h2>상품 모두 삭제</h2>");
    			}
    		}
    		
            // 세션 객체에 배열 생성하여 저장
    		if(session.getAttribute("arr") == null) {
    			session.setAttribute("arr", new int[10]); 
    		}
    
            // 세션 객체 배열 불러옴(다운캐스팅 필수)
    		int[] getArr = (int[])session.getAttribute("arr");
            // 불러온 배열 원소 값 변경
    		getArr[Integer.parseInt(pid.substring(2,4))-1]++; 
    		
            // 다시 저장
    		session.setAttribute("arr", getArr); 
    
    		out.write("<h2>선택한 상품 리스트</h2>");
    		out.write("<hr>");
    		out.write("<ul>");
            // 배열 출력
    		for(int i = 0 ; i < 10 ; i++) {
    			out.write("<li>p" + (i+1) + " 상품: " + getArr[i]  + "개</li>");
    		}
    		out.write("</ul>");
    		out.write("<a href=\"html/productlog2.html\">상품선택화면</a>");
    		out.write(" ");
    		out.write("<a href=\"someurl?action=r\">상품 비우기</a>");
    	}
    }
    

    처음에 session 객체에서 정보를 불러올 때에 arr을 setAttribute하기만 하면 그 뒤로 arr 원소 값을 변경하면 자동으로 알아서 저장된 정보가 갱신될 줄 알았다.(?) 그래서 세션 객체에 배열을 set한 뒤 값을 변경하고 getAttribute으로 꺼내다 썼는데 변경값이 저장되어 있지 않았다.

    그런데 값을 변경한 뒤 다시 set을 해야 그 변경된 값이 저장되는 것이었다. 바보 같... 다시 까먹지 않기 위해 남겨둠!

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함