Как настроить разные контексты веб-приложения для одного сервлета с различным отображением

1

Прежде всего, у меня есть общий 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>");
}
}

Поэтому я хочу инициализировать оба сервлета beans (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.

Теги:
servlets
spring
applicationcontext

1 ответ

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>

Ещё вопросы

Сообщество Overcoder
Наверх
Меню