Как настроить разные контексты веб-приложения для одного сервлета с разным отображением
Прежде всего, у меня есть общий http-сервлет, который я хочу запускать в определенных контекстах в зависимости от сопоставления URL-адресов (поэтому я переключился на реализацию HttpRequestHandler). Пожалуйста, рассмотрите упрощенный пример. В web.xml у меня есть следующая конфигурация:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>testServlet1</servlet-name>
<servlet-class>local.TestServlet</servlet-class>
</servlet>
<servlet>
<servlet-name>testServlet2</servlet-name>
<servlet-class>local.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>testServlet1</servlet-name>
<url-pattern>/test1/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>testServlet2</servlet-name>
<url-pattern>/test2/*</url-pattern>
</servlet-mapping>
Мой сервлет является реализацией HttpRequestHandler и выглядит здесь:
public class TestRequestHandler implements HttpRequestHandler {
private Counter counter;
public void setCounter(Counter counter) {
this.counter = counter;
}
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter writer = response.getWriter();
writer.write("<h1>Hello World</h1>");
writer.write("<h1>" + counter.getName() + ": " + counter.getValue() + "</h1>");
}
}
Поэтому я хочу инициировать оба бина сервлета (testServlet1 и testServlet2) с различными бинами счетчиков и иметь один корневой контекст (applicationContext.xml) для общих бинов и два отдельных контекста сервлета, которые могут расширять и переопределять корневой контекст (testServlet1-servlet.xml и testServlet2-servlet.xml). Поэтому конфигурация должна быть примерно такой:
<bean id="counter" class="local.Counter">
<property name="name" value="CounterA"/>
</bean>
<bean id="testServlet1" class="local.TestRequestHandler">
<property name="counter" ref="counter"/>
</bean>
а также
<bean id="counter" class="local.Counter">
<property name="name" value="CounterB"/>
</bean>
<bean id="testServlet2" class="local.TestRequestHandler">
<property name="counter" ref="counter"/>
</bean>
Возможно ли и как такая конфигурация может быть реализована? Я думал о DispatcherServlet, но не понимаю, как его можно настроить с помощью реализации HttpRequestHandler.
1 ответ
Я нашел решение своей задачи. В двух словах: мы создаем два DispatcherServlets, и каждая конфигурация сервлета имеет свой собственный контекст, который расширяет корневой контекст. Вот конфигурация:
web.xml - настройка для двух DispatcherServlets
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher1</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet>
<servlet-name>dispatcher2</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher1</servlet-name>
<url-pattern>/test1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>dispatcher2</servlet-name>
<url-pattern>/test2</url-pattern>
</servlet-mapping>
applicationContext.xml - корневой контекст и общие бины.
<bean id="counter" class="local.Counter">
<property name="name" value="CounterC"/>
</bean>
dispatcher1-servlet.xml - переопределяет реализацию общих компонентов и конкретной конфигурации в собственном контексте
<bean id="counter" class="local.Counter">
<property name="name" value="CounterA"/>
</bean>
<bean name="testServlet" class="local.TestRequestHandler">
<property name="counter" ref="counter"/>
</bean>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="/test1">testServlet</prop>
</props>
</property>
</bean>