Servlet & Jsp

[servletContext & HttpSession & Request] - Head Frist Servlet & Jsp

사과씨앗 2020. 12. 23. 00:33
728x90
반응형

안녕하세요 이번 글에서는 제목처럼 servletContext  & HttpSession & Request 세 가지에 대하여 간단히 알아보겠습니다.

 

1. servletContext

 

먼저 servletContext 란 컨테이너가 web.xml 상의 정보를 읽어 서블릿을 초기화 할때 모든 서블릿에서 사용할 수 있도록 생성되는 것입니다. 그 바로 아래 각각의 서블릿에서만 사용할 수 있는 servletConfig라는 것도 생성되지만 오늘은 servletContext에 대해서만 알아보겠습니다.

 

servletContexts 애플리케이션을 사용하는 누구라도 접근이 가능합니다.

예를 들어

 

사용자 1 요청 --> age=20 --> servletContext의 age 값을 20으로 지정 --> 호출 --> 20

사용자 2 요청 --> age=10 --> servletContext의 age 값을 10으로 지정 --> 호출 --> 10

사용자 1 요청 --> 다시 호출 --> 10

 

이런 식으로 접근할 수 있는 누구에게나 하나의 값을 보내 주기 때문에 공통으로 사용되는 값이나 변하지 않는 값을 세팅하는 것이 좋습니다.

 

2. Session

 

session은 간단히 설명하면 범위는 애플리케이션 전체에서 사용 가능하지만 요청을 보낸 해당 클라이언트에서만 사용할 수 있습니다.(session에 대한 단원에서 자세하게 작성하겠습니다.. 책이 그렇게 돼있어요ㅎㅎ)

 

*주의할 점 : 하나의 클라이언트에서 두 개의 브라우저를 열어도 기본적으로 하나의 세션을 사용하기 때문에 브라우저 단위가 아니라 클라이언트 단위라서 작성했습니다.

 

3. request

 

앞 글에서도 언급한 적 있지만 request는 클라이언트가 보낸 요청을 컨테이너에서 HttpRequest 객체로 만들어 서블릿에서 전달해 주는 것입니다. request는 해당 요청에 대한 스레드가 생성될 때 같이 생기고 요청이 끝나고 스레드가 죽으면 같이 소멸됩니다.

 

4. 사용범위

 

 

5. 사용방법

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>SampleProject</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <!-- servletContext 선언방법 -->
  <context-param>
  	<param-name>age</param-name>
  	<param-value>20</param-value>
  </context-param>
  <!-- servletContext 선언방법 -->
  
  
    <!-- servletConfig 선언방법 -->
  <servlet>
  <servlet-name>test22.do</servlet-name>
  <servlet-class>com.main.controller.mainController</servlet-class>
  <init-param>
  <param-name>age</param-name>
  <param-value>20</param-value>
  </init-param>
  </servlet>
     <!-- servletConfig 선언방법 -->
  
  
</web-app>

servletContext는 이런 식으로 web.xml 파일에 선언하여 사용할 수 있습니다.

 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		
		//애플리케이션 내 모은 서블릿 에서 사용 가능하다
		ServletContext sc = request.getServletContext();
		//web.xml 에서 셋팅한 값을 꺼내는방법
		String age = (String)sc.getAttribute("age");
		System.out.println("age");
		//서블릿에서 ServletContext 셋팅
		sc.setAttribute("name", "servletContext");
		
		//요청을 보낸 클라이언트의 세션 에서만 사용
		HttpSession session = request.getSession();
		session.setAttribute("name", "session");
		
		//클라이언트가 보낸 요청으로 생선된 시점의 스레드 에서만 사용가능
		request.setAttribute("name", "request");
		
		//RequestDispatcher 객체를 호출하여 요청을 보낼 jsp 경로를 호출하여 줍니다.
		RequestDispatcher view = request.getRequestDispatcher("view/next.jsp");
		//초기화한 객체를 forward 방식으로 request , response를 jsp에서 사용할 수 있도록 넘겨 줍니다.
		view.forward(request, response);
	
	}

위처럼 각각의 객체를 선언한 뒤 값을 세팅하여 줍니다.

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<form action="test.do" method="POST">

<input type="submit" value="서브밋 버튼!"> 

</form>


</body>
</html>

index.jsp는 이런 식으로 세팅하여 줍니다.

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%  
	String servlettName = (String)request.getServletContext().getAttribute("name");
	String sessionName = (String)request.getSession().getAttribute("name");
	String requestName = (String)request.getAttribute("name");

%>  
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<ul>
<li><%=servlettName %></li>
<li><%=sessionName %></li>
<li><%=requestName %></li>
</ul>


</body>
</html>

요청을 받을 next.jsp를 위와 같이 코딩하여 줍시다.

* getAttribute()는 기본적으로 반환 값이 Object 형태이기 때문에 (String)을 앞에 선언하여 캐스팅하여줍니다.*

서버를 실행시켜봅시다.

 

위 화면처럼 셋팅한 값들이 각각호출되는 것을 확인할수 있습니다.

 

브라우저를 새로 하나 열어준 뒤 위 url을 그대로 복사하여 호출하여 봅시다.

 

그럼 위에 화면처럼 request 부분만 null값이 들어온 것을 확인할 수 있는데 index.jsp에서 요청을 보내지 않고 바로 호출하였기 때문에 생성되지 않은것을 확인할 수 있습니다.

 

그럼 session값은 어떻게 확인하면 좋을까요?? 브라우저를 따로 켜도 하나의 세션 값을 바라보고 있어서 혼자서 테스트할 때는 정확하게 servletContext와 session의 차이를 확인하기가 쉽지 않습니다.

 

하지만!! 구글에서 제공하는 서비스를 이용하면 간단히 확인할 수 있습니다.

 

브라우저 상단 ... 버튼을 누른뒤 새 시크릿 창을 열어줍니다.

 

그럼 이런 간지나는 구글화면이 나타납니다 ㅎㅎ 이상태로 좀전에 했던 방식과 똑같이 url을 복붙한뒤 호출해 봅시다.

 

위 화면처럼 session값이 null이되고 servletContext의 값만 호출되는 것을 확인할 수있습니다.구글 시크릿 모드는 현재 켜져있는 브라우저와 session을 따로 쓰나봅니다(자세히는 저도잘 ....ㅎㅎㅎ)

 

 

부족한 글이지만 봐주셔서 감사합니다 ^^

728x90
반응형