(서블릿 객체의) 스코프
앞서 서블릿 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>");
}
}
- 각 객체에 바인딩된 속성들을 가져와서 출력한다.
서블릿 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>");
}
- 기존 로그인 테스트 예제해서 한글 인코딩 부분을 주석처리
필터구현
서블릿 필터
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 메서드 기준으로 위쪽이 요청, 아래쪽이 응답 필터 기능을 처리한다.
출처: 자바 웹을 다루는 기술
'프로그래밍 > 자바 웹 프로그래밍' 카테고리의 다른 글
JSP 표현언어 (0) | 2020.02.12 |
---|---|
JSP 액션태그와 Bean (0) | 2020.02.07 |
브라우저에서의 사용자정보관리(쿠키, 세션) (0) | 2020.01.16 |
서블릿 리다이렉트 와 바인딩 (0) | 2019.12.26 |
서블릿과 DB 연동 (2) | 2019.12.19 |