(서블릿 객체의) 스코프

앞서 서블릿 API의 setAttribute 와 getAttribute를 통해 데이터를 바인딩할 수 있었다. 이러한 서블릿 API들은 데이터를 바인딩할 수 있는 영역이 존재한다.

 

ServletContext: 어플리케이션 전체에서 접근 가능

HttpSession: 같은 브라우저 내에서만 접근가능

HttpServletRequest: 해당 메서드에서만 접근 가능

 

 

SetAttribute

package sec01.ex01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
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("/set")
public class SetAttribute extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		String ctxMesg = "context에 바인딩됩니다.";
		String sesMesg = "session에 바인딩됩니다.";
		String reqMesg = "request에 바인딩됩니다.";
		
		ServletContext ctx = getServletContext(); // 전역 스코프
		HttpSession session = request.getSession(); // 브라우저 스코프
		ctx.setAttribute("context", ctxMesg);
		session.setAttribute("session", sesMesg);
		request.setAttribute("request", reqMesg);
		out.print("바인딩을 수행합니다.  <br>" );		
	}
}
  • 각 서블릿 객체의 문자열을 바인딩한다.

 

GetAttribute

package sec01.ex01;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
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("/get")
public class GetAttribute extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		ServletContext ctx = getServletContext(); // 전역 스코프
		HttpSession sess = request.getSession(); // 브라우저 스코프

		String ctxMesg = (String)ctx.getAttribute("context");
		String sesMesg = (String)sess.getAttribute("session");
		String reqMesg = (String)request.getAttribute("request");
		
		out.println("context값: " + ctxMesg + "<br>");
		out.println("session값: " + sesMesg + "<br>");
		out.println("request값: " + reqMesg + "<br>");
		
		
	}
}
  • 각 객체에 바인딩된 속성들을 가져와서 출력한다.

 

데이터 바인딩

 

데이터 출력

 

다른브라우저에서 실행하면 request 객체에 바인딩된 데이터는 가져오지 못함.

 

 

 

서블릿 URL 패턴

살제로 브라우저 주소창에 의해 요청되는 URL 규칙을 의미한다.

(예제 생략)

 

 

필터

필터란 브라우저에서 서버로 요청할 때 전처리 작업 또는 서버에서 브라우저로 응답결과가 전달 되기 전의 처리되야 하는 작업들을 미리 구현할 수 있다.

 

한글인코딩 필터 적용하기

 

LoginTest 클래스

	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException  {
//		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		String user_id = request.getParameter("user_id");
		String user_pw = request.getParameter("user_pw");
		
		out.println("아이디: " + user_id + "<br>");
		out.println("패스워드: " + user_pw + "<br>");
        
	}
  • 기존 로그인 테스트 예제해서 한글 인코딩 부분을 주석처리

 

아이디에 한글을 넣음

 

한글이 깨짐

 

 

필터구현

 

New - Filter

 

 

URL 패턴

 

서블릿 필터

package sec03.ex01;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

@WebFilter("/*")
public class EncoderFilter implements Filter {
	
	ServletContext context;

	public void init(FilterConfig fConfig) throws ServletException {
		System.out.println("utf-8 인코딩");
		context = fConfig.getServletContext();
	}

	// 실제 필터의 기능을 구현함.
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		System.out.println("doFilter 호출");
		request.setCharacterEncoding("utf-8");
		String context = ((HttpServletRequest)request).getContextPath();
		String pathInfo = ((HttpServletRequest)request).getRequestURI();
		String realPath = request.getRealPath(pathInfo);
		
		String mesg = " Context 정보: " + context + "\n URI 정보 : " + pathInfo + "\n 물리적 경로: " + realPath;
		System.out.println(mesg);
		chain.doFilter(request, response); // 다음필터로 넘김
	}

	public void destroy() {
		System.out.println("destory 호출");
	}
}
  • 모든 URL 패턴에 적용됨.
  • doFilter 메서드에서 실제 기능을 처리함.
  • chain.doFilter 메서드 기준으로 위쪽이 요청, 아래쪽이 응답 필터 기능을 처리한다.

 

정상적으로 한글 출력

 

 

출처: 자바 웹을 다루는 기술

블로그 이미지

파니동

,