【问题标题】:How to configure different web application contexts for one servlet with different mapping如何为具有不同映射的一个 servlet 配置不同的 Web 应用程序上下文
【发布时间】:2015-01-26 04:20:30
【问题描述】:

首先我有一个通用的 http servlet,我想在特定的上下文中运行它取决于 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>

我的 servlet 是 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>");
}
}

所以我想用不同的 Counters bean 初始化两个 servlet bean(testServlet1 和 testServlet2),并有一个用于公共 bean 的根上下文(applicationContext.xml)和两个可以扩展和覆盖的 单独 servlet 上下文根上下文(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 的实现来配置它。

【问题讨论】:

    标签: java spring servlets applicationcontext


    【解决方案1】:

    我找到了我的任务的解决方案。简而言之 - 我们创建了两个 DispatcherServlet,每个 servlet 配置都有其 自己的 上下文,它扩展了根上下文。这是配置:

    web.xml - 两个 DispatcherServlet 的设置

    <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 放在这里

    <bean id="counter" class="local.Counter">
        <property name="name" value="CounterC"/>
    </bean>
    

    dispatcher1-servlet.xml - 在 自己的 上下文中覆盖公共 bean 和特定配置的实现

    <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>
    

    【讨论】:

      猜你喜欢
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 2016-12-06
      • 2018-01-17
      • 2011-11-05
      • 1970-01-01
      • 2013-03-19
      • 1970-01-01
      相关资源
      最近更新 更多