Servlet3.0 - 모듈식 및 동적 서브렛
여기까지만 설명하고 서브렛 3.0의 새로운 기능들이 있는데,
한 웹 응용 프로그램에 여러 개의 웹-fragment가 나타날 수 있기 때문이다.xml 성명 파일, 웹을 추가합니다.xml 파일, 불러오는 순서 문제가 어쩔 수 없는 문제가 되었습니다.web-fragment.xml은 선택할 수 있는 두 개의 맨 윗부분 라벨을 포함하고 있으며, 현재 파일에 명확한 불러오는 순서를 지정하려면 보통 이 두 개의 라벨을 사용해야 한다. 주로 현재 파일을 표시하는 데 사용되고, 선후 순서를 지정하는 데 사용된다.간단한 예는 다음과 같습니다.
FragmentA
FragmentB
FragmentC
위에서 보듯이, 탭의 값은 보통 다른 웹-fragment에 의해 추출됩니다.xml 파일은 선후 순서를 정의할 때 인용되며 현재 파일에서는 일반적으로 사용되지 않으며 현재 파일을 표시하는 역할을 한다.위의 특성을 알고 나면 지금 우리는
ServletRegistration.Dynamic addServlet(String servletName,Class extends Servlet> servletClass)
ServletRegistration.Dynamic addServlet(String servletName, Servlet servlet)
ServletRegistration.Dynamic addServlet(String servletName, String className)
T createServlet(Class clazz)
ServletRegistration getServletRegistration(String servletName)
Map getServletRegistrations()
그 중에서 앞의 세 가지 방법의 작용은 같지만 매개 변수의 유형이 다를 뿐이다.createServlet () 방법으로 만든 서브렛은 일반적으로 사용자 정의 설정을 한 다음addServlet () 방법으로 서비스에 사용할 수 있는 서브렛으로 동적 등록합니다.두 개의 getServlet Registration () 방법은 주로 동적으로 서브렛에 맵 정보를 추가하는 데 사용되며, 이것은 웹과 같다.xml (또는 웹-fragment.xml) 에서 존재하는 서브렛에 맵 정보를 추가하기 위해 탭을 사용합니다.
위와 같은 서브렛 Context에서 추가된 방법은 서브렛 Context Listener의 contexInitialized 방법에서 호출되거나 서브렛 ContainerInitializer의onStartup () 방법에서 호출됩니다.(구체적 실현에 의해 결정됨) 서브렛 컨테이너 Initializer는 서브렛 3.0에 추가된 인터페이스(즉 시작된SCI)로 용기가 시작할 때 SPI를 사용하여 서브렛 컨테이너 Initializer의 실현을 발견한다.다음은 내가 예시 코드를 제시한다
public void contextInitialized(ServletContextEvent sce) {
ServletContext sc = sce.getServletContext();
// Register Servlet
ServletRegistration sr = sc.addServlet("DynamicServlet",
"web.servlet.dynamicregistration_war.TestServlet");
sr.setInitParameter("servletInitName", "servletInitValue");
sr.addMapping("/*");
// Register Filter
FilterRegistration fr = sc.addFilter("DynamicFilter",
"web.servlet.dynamicregistration_war.TestFilter");
fr.setInitParameter("filterInitName", "filterInitValue");
fr.addMappingForServletNames(EnumSet.of(DispatcherType.REQUEST),
true, "DynamicServlet");
// Register ServletRequestListener
sc.addListener("web.servlet.dynamicregistration_war.TestServletRequestListener");
}
@HandlesTypes(WebApplicationInitializer.class)
public class SpringServletContainerInitializer implements ServletContainerInitializer {
@Override
public void onStartup(@Nullable Set> webAppInitializerClasses, ServletContext servletContext)
throws ServletException {
List initializers = new LinkedList<>();
if (webAppInitializerClasses != null) {
for (Class> waiClass : webAppInitializerClasses) {
// Be defensive: Some servlet containers provide us with invalid classes,
// no matter what @HandlesTypes says...
if (!waiClass.isInterface() && !Modifier.isAbstract(waiClass.getModifiers()) &&
WebApplicationInitializer.class.isAssignableFrom(waiClass)) {
try {
initializers.add((WebApplicationInitializer)
ReflectionUtils.accessibleConstructor(waiClass).newInstance());
}
catch (Throwable ex) {
throw new ServletException("Failed to instantiate WebApplicationInitializer class", ex);
}
}
}
}
if (initializers.isEmpty()) {
servletContext.log("No Spring WebApplicationInitializer types detected on classpath");
return;
}
servletContext.log(initializers.size() + " Spring WebApplicationInitializers detected on classpath");
AnnotationAwareOrderComparator.sort(initializers);
for (WebApplicationInitializer initializer : initializers) {
initializer.onStartup(servletContext);
}
}
}
@HandlesTypes 주석은 SpringServlet Container Initializer가 처리하는 클래스를 나타냅니다. 표시된 클래스는onStartup 방법으로 매개 변수 값으로 전송되어야 합니다. onStartup 방법에서는set>c를 통해 얻을 수 있습니다.ContextConfig 감청기는 용기가 시작될 때 모든 웹 응용 프로그램의 WEB-INF/lib 디렉터리에 포함된jar 패키지의 META-INF/services/javax를 읽습니다.servlet.Servlet Container Initializer 및 웹 루트 디렉토리에 있는 META-INF/services/javax.servlet.Servlet Container Initializer, 반사를 통해 이 Servlet Container Initializer의 실례화를 완성한 다음에 Context 용기에 설정하면 마지막에 Context 용기가 시작될 때 각각 Servlet Container Initializer의 onStartup 방법을 호출합니다
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.