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을 해야 그 변경된 값이 저장되는 것이었다. 바보 같... 다시 까먹지 않기 위해 남겨둠!