Web
4 Jun 2020

Servlet Request Attribute

해당 게시글은 웹을 공부하기 위해 개인적으로 기록했던 자료입니다.

ServletRequest attribute


tomcat servletapi에서 javax.servlet에 있는 ServletRequest Interface에 가면 getAttribute와 setAttribute메소드를 확인할 수 있습니다.

우리는 이제가지 form값을 Servlet을 통해 넘겨줄 때 객체가 아닌 값을 넘겨주었지만(Wrapper 클래스도 포함하기로 하자 ex int, double..) 객체를 넘겨줘야 할 때가 있습니다. 그럴 때 Servlet의 attribute를 설정해줍니다.

01servletRequestAttribute

02setAttribute

getAttribute와 setAttribute를 통해서 객체를 전달 할 수있습니다.

위의 사진은 ServletRequest Interface의 getAttribute()메소드에 대한 설명입니다. 이 두 메소드를 가지는 인터페이스들은 총 4개입니다.

  1. ServletContext
  2. ServletRequest
  3. HttpServletRequest
  4. HttpSession

HttpServletRequest는 ServletRequest Interface를 상속받고 있으므로 설명이 똑같고 나머지 세개가 각기 메소드 이름이 같지만 하는 역할이 다릅니다.

In ServletContext attribute


ServletContext는 API를 봐도 잘 알겠지만 구체적인 Servlet instance들보다 먼저 생기는 영역이고 좀더 Container영역과 가깝습니다. 다룰 수 있는 Scope가 넓다고 생각할 수 있습니다.

java.lang.Object getAttribute(java.lang.String name)
- Returns the servlet container attribute with the given name, or null if there is no attribute by that name.


void setAttribute(java.lang.String name, java.lang.Object object)
- Binds an object to a given attribute name in this servlet context.

API에서도 Servlet Container Attribute를 핸들링한다고 적혀있습니다. 그리고 중요하게 봐야하는 점이 Binding한다는 표현입니다. Object와 바인딩되는 String name이라는 녀석은 변수가 아닙니다. 그저 하나의 이름이라고 봐야합니다.

In ServletRequest attribute


ServletRequest는 ServletContext보다 Scope가 작습니다. ServletContext는 서버가 가동되자마자 만들어진다면 ServletRequest는 브라우저의 요청이 있을 후에 각각의 구체적인 Servlet Instance가 만든다고 볼 수 있습니다.

API에 나와있는 설명을 약간 옮겨보자면,

Attribute에 값을 설정하는 방법은 두 가지가 있습니다.

  1. Servlet Container가 요청에 대한 설정 정보를 저장할 수 있습니다. 예를 들어서 브라우저에서 https 요청을 한다면 javax.servlet.request.X509Certificate가 attribute로 설정이 됩니다.
  2. Attribute는 프로그램적으로 setAttribute(java.lang.String, java.lang.Object) Method를 이용해 설정될 수 있습니다.

java.lang.Object getAttribute(java.lang.String name)
- Returns the value of the named attribute as an Object, or null if no attribute of the given name exists. This allows information to be embedded into a request before a RequestDispatcher call.

RequestDispatcher 호출은 attribute에 있는 내용을 전달한 다음 경로를 지정하고 request와 response를 그대로 넘겨줄 수 있습니다.

void setAttribute(java.lang.String name, java.lang.Object object)
- Stores an attribute in this request. Attributes are reset between requests. This method is most often used in conjunction with RequestDispatcher.

In HttpSession attribute


HttpSession Interface에 attribute getter, setter가 정의되어 있습니다. HttpServletRequest의 attribute getter, setter와의 차이가 명확하게 구분됩니다.

java.lang.Object getAttribute (java.lang.String name)
- Returns the servlet container attribute with the given name, or null if there is no attribute by that name.


void setAttribute(java.lang.String name, java.lang.Object value)
- Binds an object to this session, using the name specified. If an object of the same name is already bound to the session, the object is replaced.

Servlet Context code


아래와 같이 폼을 만들어주고 url-pattern register을 가지는 Servlet을 만들어줍니다.

register.html중..

<form action="register" method="post">
	Name: <input type="text" name="name"><br>
	Age: <input type="text" name="age"><br>
	Address: <input type="text" name="address"><br>
<input type="submit" value="회원가입">
</form>


RegisterServlet.java중..doProcess Method.

	protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		String name = request.getParameter("name");
		int age = Integer.parseInt(request.getParameter("age"));
		String address = request.getParameter("address");
		
		MemberVO member = new MemberVO(name, age, address);
		
		context = getServletContext();
		context.setAttribute("member", member);
		
		PrintWriter out = response.getWriter();
		out.println("<a href='ViewServlet'>ViewServlet 결과 확인하러 가기</a>");
		/*out.println("<a href='result.jsp'>결과 확인하러 가기</a>");*/
		out.close();
	}


위 코드를 보면 getServletContext() 메소드로 ServletContext를 불러오는 것을 알 수 있습니다. HttpServlet클래스가 GenericServlet을 상속받고 있고 GenericServlet은 ServletConfig를 상속받고 있고 ServletConfig는 ServletContext를 참조하고 있으므로 가능합니다.

그리고 “memeber”라는 이름으로 member객체와 바인딩하고 있습니다. 그리고 ViewServlet Servlet으로 요청처리를 넘깁니다.

ViewServlet Servlet의 doProcess()..

	protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		context = getServletContext();
		MemberVO member = (MemberVO)context.getAttribute("member");
		
		PrintWriter out = response.getWriter();
		out.println("<html><body>");
		out.println("<h2>회원정보</h2>");
		out.println("Name: "+member.getName()+" Age: "+member.getAge()+" Address: "+member.getAddr()+"<br>");
		out.println("</body></html>");
		out.close();
	}


ViewServlet Servlet에서는 getAttriute를 이용해 member객체를 받고 member객체를 화면에 뿌려줍니다.


Tags:
0 comments