1. 개요
서블릿 은 서블릿 컨테이너에서 실행되는 일반 Java 클래스입니다.
HTTP 서블릿(특정 유형의 서블릿)은 Java 웹 애플리케이션의 일급 시민입니다. HTTP 서블릿의 API는 클라이언트-서버 프로토콜로 구현된 일반적인 요청-처리-응답 주기를 통해 HTTP 요청을 처리하는 것을 목표로 합니다 .
또한 서블릿은 요청/응답 매개변수 형식의 키-값 쌍을 사용하여 클라이언트(일반적으로 웹 브라우저)와 서버 간의 상호 작용을 제어할 수 있습니다.
이러한 매개변수는 애플리케이션 전체 범위(컨텍스트 매개변수) 및 서블릿 특정 범위(서블릿 매개변수)로 초기화 및 바인드될 수 있습니다.
이 사용방법(예제)에서는 컨텍스트 및 서블릿 초기화 매개변수를 정의하고 액세스하는 방법을 배웁니다 .
2. 서블릿 매개변수 초기화
어노테이션과 표준 배치 디스크립터인 "web.xml" 파일 을 사용하여 서블릿 매개변수를 정의하고 초기화할 수 있습니다 . 이 두 가지 옵션이 상호 배타적이지 않다는 점은 주목할 가치가 있습니다.
이러한 각 옵션을 자세히 살펴보겠습니다.
2.1. 어노테이션 사용
어노테이션을 사용하여 서블릿 매개변수를 초기화하면 구성과 소스 코드를 같은 위치에 유지할 수 있습니다 .
이 섹션에서는 어노테이션을 사용하여 특정 서블릿에 바인딩된 초기화 매개변수를 정의하고 액세스하는 방법을 보여줍니다.
이를 위해 일반 HTML 형식을 통해 사용자 데이터를 수집 하는 순진한 UserServlet 클래스를 구현합니다.
먼저 양식을 렌더링하는 JSP 파일을 살펴보겠습니다.
<!DOCTYPE html>
<html>
<head>
<title>Context and Initialization Servlet Parameters</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<h2>Please fill the form below:</h2>
<form action="${pageContext.request.contextPath}/userServlet" method="post">
<label for="name"><strong>Name:</strong></label>
<input type="text" name="name" id="name">
<label for="email"><strong>Email:</strong></label>
<input type="text" name="email" id="email">
<input type="submit" value="Send">
</form>
</body>
</html>
EL (Expression Language) 을 사용하여 양식의 action 속성을 코딩했습니다 . 이를 통해 서버의 응용 프로그램 파일 위치에 관계없이 항상 "/userServlet" 경로를 가리킬 수 있습니다.
“ ${pageContext.request.contextPath}” 표현식 은 양식에 대한 동적 URL을 설정하며 이는 항상 애플리케이션의 컨텍스트 경로에 상대적 입니다.
다음은 초기 서블릿 구현입니다.
@WebServlet(name = "UserServlet", urlPatterns = "/userServlet", initParams={
@WebInitParam(name="name", value="Not provided"),
@WebInitParam(name="email", value="Not provided")}))
public class UserServlet extends HttpServlet {
// ...
@Override
protected void doGet(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
forwardRequest(request, response, "/WEB-INF/jsp/result.jsp");
}
protected void processRequest(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("name", getRequestParameter(request, "name"));
request.setAttribute("email", getRequestParameter(request, "email"));
}
protected void forwardRequest(
HttpServletRequest request,
HttpServletResponse response,
String path)
throws ServletException, IOException {
request.getRequestDispatcher(path).forward(request, response);
}
protected String getRequestParameter(
HttpServletRequest request,
String name) {
String param = request.getParameter(name);
return !param.isEmpty() ? param : getInitParameter(name);
}
}
이 경우 initParams 및 @WebInitParam 어노테이션 을 사용하여 두 개의 서블릿 초기화 매개변수 name 및 email 을 정의 했습니다 .
HttpServletRequest의 getParameter() 메서드를 사용하여 HTML 양식에서 데이터를 검색하고 getInitParameter() 메서드를 사용하여 서블릿 초기화 매개변수에 액세스했습니다.
getRequestParameter() 메서드는 이름 및 이메일 요청 매개변수가 빈 문자열인지 확인합니다.
빈 문자열인 경우 일치하는 초기화 매개변수의 기본값이 할당됩니다.
doPost() 메서드 는 먼저 사용자가 HTML 양식(있는 경우)에 입력한 이름과 이메일을 검색합니다. 그런 다음 요청 매개변수를 처리하고 요청을 "result.jsp" 파일로 전달합니다.
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>User Data</title>
</head>
<body>
<h2>User Information</h2>
<p><strong>Name:</strong> ${name}</p>
<p><strong>Email:</strong> ${email}</p>
</body>
</html>
샘플 웹 애플리케이션을 Apache Tomcat, Oracle GlassFish 또는 JBoss WidlFly 와 같은 애플리케이션 서버에 배포 하고 실행하면 먼저 HTML 양식 페이지가 표시되어야 합니다.
사용자가 이름 과 이메일 필드를 채우고 양식을 제출하면 데이터가 출력됩니다.
User Information
Name: the user's name
Email: the user's email
양식이 비어 있으면 서블릿 초기화 매개변수가 표시됩니다.
User Information
Name: Not provided
Email: Not provided
이 예제에서는 어노테이션을 사용하여 서블릿 초기화 매개변수를 정의하는 방법과 g etInitParameter() 메서드 를 사용하여 액세스하는 방법을 보여주었습니다 .
2.2. 표준 배포 설명자 사용
이 접근 방식은 구성과 소스 코드를 서로 격리할 수 있기 때문에 어노테이션을 사용하는 접근 방식과 다릅니다 .
"web.xml" 파일 로 초기화 서블릿 매개변수를 정의하는 방법을 보여주기 위해 먼저 UserServlet 클래스 에서 initParam 및 @WebInitParam 어노테이션을 제거해 보겠습니다 .
@WebServlet(name = "UserServlet", urlPatterns = {"/userServlet"})
public class UserServlet extends HttpServlet { ... }
다음으로 "web.xml" 파일 에서 서블릿 초기화 매개변수를 정의해 보겠습니다 .
<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<servlet>
<display-name>UserServlet</display-name>
<servlet-name>UserServlet</servlet-name>
<init-param>
<param-name>name</param-name>
<param-value>Not provided</param-value>
</init-param>
<init-param>
<param-name>email</param-name>
<param-value>Not provided</param-value>
</init-param>
</servlet>
</web-app>
위와 같이 "web.xml" 파일을 사용하여 서블릿 초기화 매개변수를 정의하면 <init-param>, <param-name> 및 <param-value> 태그를 사용하는 것으로 요약됩니다.
또한 위의 표준 구조를 고수하는 한 필요한 만큼 많은 서블릿 매개변수를 정의할 수 있습니다.
응용 프로그램을 서버에 재배포하고 다시 실행하면 어노테이션을 사용하는 버전과 동일하게 동작해야 합니다.
3. 컨텍스트 매개변수 초기화
때로는 웹 애플리케이션에서 전역적으로 공유하고 액세스해야 하는 불변 데이터를 정의해야 합니다.
데이터의 글로벌 특성으로 인해 데이터 저장을 위해 서블릿 대응 항목에 의존하는 대신 애플리케이션 전체 컨텍스트 초기화 매개변수를 사용해야 합니다 .
어노테이션을 사용하여 컨텍스트 초기화 매개변수를 정의할 수는 없지만 "web.xml" 파일에서 이를 수행할 수 있습니다.
응용 프로그램이 실행되는 국가 및 지방에 대한 일부 기본 전역 값을 제공하려고 한다고 가정해 보겠습니다.
몇 가지 컨텍스트 매개변수를 사용하여 이를 수행할 수 있습니다.
그에 따라 "web.xml" 파일 을 리팩터링해 보겠습니다 .
<web-app
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<context-param>
<param-name>province</param-name>
<param-value>Mendoza</param-value>
</context-param>
<context-param>
<param-name>country</param-name>
<param-value>Argentina</param-value>
</context-param>
<!-- Servlet initialization parameters -->
</web-app>
이번에는 <context-param>, <param-name> 및 <param-value> 태그를 사용하여 지방 및 국가 컨텍스트 매개변수를 정의했습니다.
물론 UserServlet 클래스를 리팩토링하여 이러한 매개변수를 가져와서 결과 페이지로 전달할 수 있도록 해야 합니다.
서블릿의 관련 섹션은 다음과 같습니다.
@WebServlet(name = "UserServlet", urlPatterns = {"/userServlet"})
public class UserServlet extends HttpServlet {
// ...
protected void processRequest(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
request.setAttribute("name", getRequestParameter(request, "name"));
request.setAttribute("email", getRequestParameter(request, "email"));
request.setAttribute("province", getContextParameter("province"));
request.setAttribute("country", getContextParameter("country"));
}
protected String getContextParameter(String name) {-
return getServletContext().getInitParameter(name);
}
}
먼저 getServletContext() 를 통해 서블릿 컨텍스트를 가져온 다음 getInitParameter() 메소드 를 사용하여 컨텍스트 매개변수를 가져오는 getContextParameter() 메소드 구현에 주목하십시오 .
다음 으로 서블릿 관련 매개변수와 함께 컨텍스트 매개변수를 표시할 수 있도록 "result.jsp" 파일 을 리팩터링해야 합니다 .
<p><strong>Name:</strong> ${name}</p>
<p><strong>Email:</strong> ${email}</p>
<p><strong>Province:</strong> ${province}</p>
<p><strong>Country:</strong> ${country}</p>
마지막으로 애플리케이션을 재배포하고 다시 한 번 실행할 수 있습니다.
사용자가 이름과 이메일로 HTML 양식을 채우면 컨텍스트 매개변수와 함께 이 데이터가 표시됩니다.
User Information
Name: the user's name
Email: the user's email
Province: Mendoza
Country: Argentina
그렇지 않으면 서블릿 및 컨텍스트 초기화 매개변수를 출력합니다.
User Information
Name: Not provided
Email: Not provided
Province: Mendoza
Country: Argentina
예제는 고안된 것이지만 컨텍스트 초기화 매개변수를 사용하여 변경 불가능한 전역 데이터를 저장하는 방법을 보여줍니다 .
데이터가 특정 서블릿이 아닌 애플리케이션 컨텍스트에 바인딩되어 있으므로 getServletContext() 및 getInitParameter() 메서드를 사용하여 하나 이상의 서블릿에서 데이터에 액세스할 수 있습니다.
4. 결론
이 기사에서 우리는 컨텍스트 및 서블릿 초기화 매개변수의 핵심 개념과 어노테이션 및 "web.xml" 파일 을 사용하여 이를 정의하고 액세스하는 방법을 배웠습니다 .
한동안 자바에서는 가능할 때마다 XML 구성 파일을 제거하고 어노테이션으로 마이그레이션하는 경향이 강했습니다.
CDI , Spring , Hibernate , 몇 가지 예를 들자면 이에 대한 눈부신 예입니다.
그럼에도 불구하고 컨텍스트 및 서블릿 초기화 매개변수를 정의하기 위해 "web.xml" 파일을 사용하는 데 본질적으로 잘못된 것은 없습니다.
Servlet API 가 이러한 경향을 향해 매우 빠른 속도로 발전 했지만 여전히 컨텍스트 초기화 매개변수를 정의하기 위해 배치 디스크립터를 사용해야 합니다 .
늘 그렇듯이 이 기사에 나오는 모든 코드 샘플은 GitHub 에서 사용할 수 있습니다 .