[초기화 매개변수]
프로그램을 동작시킬때 필요한 정보(ex. url, id, pw...)를 소스코드에 하드코딩을 해왔음
그런데 이런 정보들을 프로젝트 중간에 쉽게 변경이 될수있음
그래서 이런 정보들을 별도로 환경설정파일(.xml)에 보관
정보 == 초기화 매개변수
<init-param></init-param> -> ServletConfig
: 해당 서블릿에서 사용가능
<context-param></context-param> -> ServletContext
: 동일한 웹 어플리케이션 내에서의 모든 서블릿에서 사용가능
xml파일 경로 -> WEB-INF 하위에 생성
<?xml version="1.0" encoding="UTF-8"?>
<web-app>
<context-param>
<param-name>name</param-name>
<param-value>timo</param-value>
</context-param>
<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
<error-page>
<exception-type>java.lang.Throwable</exception-type>
<location>/error/error.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error/error404.jsp</location>
</error-page>
</web-app>
★ .xml -> @(어노테이션, 애너테이션)
컴파일을 시도할때,
어노테이션이 있었음을 별도로 기억함
특정 기능을 수행할때, 그에 해당하는 어노테이션이 있었는지를 가장먼저 확인함!
특정 순간에 반응(모니터링, 감지)하는 어노테이션이 있음 해당 순간에 기능을 수행함!
하기 코드와 같이 초기화 매개변수를 설정하고 해당 변수를 화면에 조회해보았다.
※ URL 매핑 설정이란?
브라우저에서 어떤 URL 요청에대해 해당 서블릿을 서비스할지를 결정
package test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class TestServlet
*/
@WebServlet(urlPatterns={"/TestServlet"}, initParams= {@WebInitParam(name="msg1", value="HELLO"), @WebInitParam(name="msg2", value=":D")})
//URL 매핑 설정이란?
// 브라우저에서 어떤 URL 요청에대해 해당 서블릿을 서비스할지를 결정
public class TestServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public TestServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8"); // 인코딩을 위해서 넣어줌
PrintWriter out=response.getWriter();
out.println("<HTML>");
out.println("<BODY>");
out.println("<H1>초기화 매개변수 - @</H1>");
out.println("msg1 : " + getInitParameter("msg1")+"<BR>");
out.println("msg2 : " + getInitParameter("msg2"));
// 서블릿 초기화 매개변수 -> @
out.println("<HR>");
out.println("name: " + getServletContext().getInitParameter("name"));
out.println("encoding: " + getServletContext().getInitParameter("encoding"));
// 웹 어플리케이션 초기화 매개변수 -> web.xml
out.println("</BODY>");
out.println("</HTML>");
}
}
[리스너]
특수한 형태의 서블릿
특정 동작을 모니터링(감지)해서 기능을 자동호출
어떤 동작을 감지할지 선택할 수 있음
샘플데이터 확보용
※ 톰캣 서버가 시작 -> web.xml 참조 + @어노테이션 스캔
-> @WebListener(리스너 클래스)가 발견되면 어떤 동작에 대해
해당 리스너 클래스를 자동호출해야하는지 별도로 기억
Servlet/JSP 이벤트소스와 리스너 종류
이벤트 소스
|
이벤트 리스너
|
발생 이벤트 객체
|
설명
|
ServletContext
|
ServletContextListener
|
ServletContextEvent
|
웹어플리케이션의 시작, 종료 이벤트에 대한 이벤트 리스너입니다. 핸들러 메서드에서는 ServletContext에 대한 참조를 얻을 수 있습니다.
|
ServletContextAttributeListener
|
ServletContextAttributeEvent
|
ServletContext에 attribute를 추가하거나 제거, 수정됐을 때에 대한 이벤트 리스너입니다. 핸들러 메서드에서는 추가하거나 제거, 수정된 attribute 정보를 얻을 수 있습니다.
|
|
HttpSession
|
HttpSessionListener
|
HttpSessionEvent
|
HTTP 세션의 시작, 종료 이벤트에 대한 이벤트 리스너입니다. 핸들러 메서드에서는 현재 세션 객체를 얻을 수 있습니다.
|
HttpSessionAttributeListener
|
HttpSessionBindingEvent
|
HttpSession에 attribute를 추가하거나 제거, 수정됐을 때에 대한 이벤트 리스너입니다. 핸들러 메서드에서는 추가하거나 제거, 수정된 attribute 정보를 얻을 수 있습니다.
|
|
ServletRequest
|
ServletRequestListener
|
ServletRequestEvent
|
클라이언트로부터의 요청으로 인한 ServletRequest 생성과 응답 이후 ServletRequest 제거시에 대한 이벤트 리스너입니다. 핸들러 메서드에서는 요청에 관련된 정보와 ServletContext에 대한 참조를 얻을 수 있습니다.
|
ServletRequestAttributeListener
|
ServletRequestAttributeEvent
|
ServletRequest에 attribute를 추가하거나 제거, 수정됐을 때에 대한 이벤트 리스너입니다. 핸들러 메서드에서는 추가하거나 제거, 수정된 attribute 정보를 얻을 수 있습니다.
|
리스너 파일 생성
Lifecycle -> 시작 or 소멸을 감지
Changes to attributes -> 속성 변경에 대해 감지
package test;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
/**
* Application Lifecycle Listener implementation class TestListener
*
*/
@WebListener
public class TestListener implements ServletContextListener {
/**
* Default constructor.
*/
public TestListener() {
// TODO Auto-generated constructor stub
}
/**
* @see ServletContextListener#contextDestroyed(ServletContextEvent)
*/
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
}
/**
* @see ServletContextListener#contextInitialized(ServletContextEvent)
*/
public void contextInitialized(ServletContextEvent sce) {
ServletContext sc=sce.getServletContext();
//application scope
Member member=new Member("홍길동",100);
sc.setAttribute("member", member);
System.out.println("TestListener: contextInitialized(): 톰캣 시작이 감지됨");
}
}
[필터]
사용 용도
- 인증, 인가
- 로깅
- 데이터 변환
- 인코딩
- 국제화 (다국어 처리, 번역)
※ 웹서버(톰캣)가 시작되면 필터 클래스 init() 동작함
-> 사용자가 서비스를 자유롭게 이용함
-> 그러던중에, 특정 요청을 수행하면,
-> 필터가 반응함 : doFilter()
필터파일 생성
자동으로 매핑되어있는 URL패턴을 삭제하고, 자신의 프로젝트에 사용되는 URL패턴을 기입한다.
만약 여러개의 URL패컨을 사용할 경우 모두 작성하여 인코딩을 적용한다.
package test;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpFilter;
/**
* Servlet Filter implementation class EcnFilter
*/
@WebFilter("*.jsp")
public class EcnFilter extends HttpFilter implements Filter {
private String encoding;
/**
* @see HttpFilter#HttpFilter()
*/
public EcnFilter() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see Filter#destroy()
*/
public void destroy() {
// TODO Auto-generated method stub
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding(this.encoding); // 하드코딩 -> web.xml(환경설정파일)에 저장되어있던 초기화 매개변수로 교체
System.out.println("doFilter() 동작완료");
chain.doFilter(request, response);
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig fConfig) throws ServletException {
// 서버를 만들면 init으로 필터를 하고 doFilter를 진행
System.out.println("필터 클래스 최초 초기화 진행 완료");
this.encoding=fConfig.getServletContext().getInitParameter("encoding");
}
}
request.setCharacterEncoding(this.encoding); 해당 코드로 인코딩을 할 수 있지만
이런 코드가 바로 하드코딩이기 때문에 응집도를 높히기 위해 web.xml(환경설정파일)에 저장되어있던
초기화 매개변수로 교체 한다!!
'JSP' 카테고리의 다른 글
[JSP] FrontController, MVC 패턴 활용 게시판 사이트 만들기 (0) | 2022.08.29 |
---|---|
[JSP] AJAX 활용 아이디 중복 검사 (0) | 2022.08.26 |
[JSP] FrontController 개념 (0) | 2022.08.24 |
[JSP] 트랜잭션 commit(), rollback() (0) | 2022.08.18 |
[JSP] 리스너 클래스, JSTL (0) | 2022.08.18 |