ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Session객체 (feat.Application과의 차이점)
    Servlet-JSP 2022. 1. 13. 18:12

    **유튜브 뉴렉쳐님의 강의를 들으면서 공부하고 정리한 내용입니다.

     

     

    Application객체로 만든 예제를 Session 객체를 사용해서 만들어보자 

    @WebServlet("/calc2")
    public class calc2 extends HttpServlet{
    	@Override
    	protected void service(HttpServletRequest request, HttpServletResponse response) 
    			throws ServletException, IOException {
    		
    		ServletContext application = request.getServletContext();
    		HttpSession session = request.getSession();//session을 변수화 하는 방법.import
    		
    		
    		response.setCharacterEncoding("UTF-8");
    		response.setContentType("text/html; charset=UTF8");
    		
    		//사용자에게 전달하는 값은 하나만 사용한다. 그리고 오퍼레이터값을 같이 전달한다.
    		String v_ = request.getParameter("v");
    		String op = request.getParameter("operator"); 
    		
    		
    		int v = 0; //기본값 설정. 값을 입력하지 않았을 경우 0으로 대처 
    		//조건검사를 해준다.
    		//만약에(if) x가 가진것이 빈 문자열이 아니다. 그럴 경우에는 x값을 대체해준다(x = ). 형변환 해서 x값을 대입해준다.
    		if(!v_.equals("")) v = Integer.parseInt(v_);
    		
    		//덧뺄셈 버튼을 누를수도 결과값을 보여주는 = 버튼을 누르게 될 수도 있다.
    		//op가 무엇이냐에 따라서 저장을 해야할수도 계산을 해야 할 수도 있다.
    		//우선 =로 해 본다.그 이유는 +,-는 하는 일이 값하고 op후 저장인데 =의 역할은 저장이다.
    		
    		//계산
    		if(op.equals("=")) {
    			//=이 오면 계산하는걸로한다.
    			
    			//int x = (Integer)application.getAttribute("value"); //앞에 입력한 값을 꺼내서 x라고 하고 빨간줄은 형변환해준다
    			int x = (Integer)session.getAttribute("value");
    			int y =v; //지금 사용자가 저장한 value 값이라 v로 
    			//String operator = (String)application.getAttribute("op"); //이걸 어플리케이션 저장소에서 읽어와야하니깐 섭ㄹ릿콘텍스트를 맨 위로 빼준다.
    			String operator = (String)session.getAttribute("op");
    			int result = 0; //여기에 더하기 값을 담아 줄 것이고.
    			//앞에 저장한 값을 꺼내서 +할지 -할지는 =말고 op값을 꺼내서 확인해야하는 것
    			if(operator.equals("+")) 
    				result = x+y;
    			else
    				result = x-y;
    			
    			//result를 출력하기 위해서 response해서 getWriter를 얻어서 포멧팅 후 출력
    			response.getWriter().printf(" 값 :  %d\n", result );
    			
    		}
    		else { //+,-은 저장하는 걸로 하고 
    			//이 값을 저장 해야함. request.getServletContext()는 어플리케이션의 저장소이기때문에
    			//ServletContext라는 변수를 하나 만들어서 application이름을 저장하고 거기에 담아준다.
    			//어떻게 저장하느나. 컬랙션이라고 생각해주고 아래와 같이 작성해준다.이 내용을 두고두고 꺼내서 쓸 수 있게 된다.
    			//application.setAttribute("value", v);
    			//application.setAttribute("op", op);
    			session.setAttribute("value", v);
    			session.setAttribute("op", op);
    
    		}
    
    	}
    }

    어플리케이션 선언 밑에 session 객체를 HttpSession session = request.getSession(); 선언 해 주고

    application이 들어갔던 자리를 session으로 바궈주면 된다.

     

    사용법과 동작되는것은 동일하고 

     

    Application객체와 Session객체의 차이점

    차이점은 이름에서도 알 수 있듯이 Application 객체는 Application 전역에서 사용이 가능한것이고 Session은 Session 범주에서만 사용 가능하다.

     

    Session은 현재 접속한 사용자를 뜻하는 것이다. 그래서 현재 접속한 사용자마다 그 공간이 달라질 수 있다는 의미이다. 

     

    위에 만든 calc2라는 html 파일을 크롬에서 계산을 먼저 해보고 다음에 웨일에서 calc2파일을 연 후에 연산값을 하나만 누르고 = 버튼을 누르게 되면 null포인터가 뜨면서 에러가 발생한다.

     

    그 이유는 다른 브라우저를 사용하게 되면 다른 session으로 인식하고 크롬에서 먼저 입력했던 연산자값이 사라지게 되어서 null이 뜨게 되는 것이다.

     

    하지만 크롬을 두개 열어서 연산값을 하나씩 입력 후 두번쨰 페이지에서 = 버튼을 누르면 null이 뜨지 않고 연산값이 출력된다.

     

    작업관리자를 켜서 확인 해 보면 크롬을 여러창을 켜도 같은 스레드 안에 속하는 것을 확인 할 수 있다. 이 스레드들은 서로 공유하기 떄문에 같은 session으로 인식이 되는 것이다.

    'Servlet-JSP' 카테고리의 다른 글

    Cookie의 maxAge 옵션  (0) 2022.01.14
    Cookie 객체  (0) 2022.01.14
    Application객체와 서블릿Context  (0) 2022.01.13
    상태 유지의 필요성 application, session, cookie  (0) 2022.01.13
    배열로 입력받기  (0) 2022.01.13
Designed by Tistory.