Spring XML配置不起作用 -

时间:2016-05-04 18:18:55

标签: java spring spring-mvc tomcat8

我正在学习如何在春季创建应用程序。

首先,我使用 AbstractAnnotationConfigDispatcherServletInitializer 在Java Config中配置了应用程序并且它可以正常工作。

现在我尝试使用XML配置MVC App,结果是HTTP 404:/

的web.xml

Windows

调度-servlet.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>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>



</web-app>

的HomeController

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans     
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd ">

    <context:component-scan base-package="test" />

    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/views/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <mvc:annotation-driven />

</beans>

的pom.xml

package test.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller     
public class HomeController {

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String welcome(Model model) {
        model.addAttribute("greeting", "Hello!");
        model.addAttribute("tagline", "First XML Config");

        return "welcome";
    }   
}

Project structure

Result

我从5小时开始尝试了不同的事情,但没有结果。

3 个答案:

答案 0 :(得分:0)

我没有足够的评论点,但看起来你正试图在/ test /上点击基本网址。如果你正在使用内部视图解析器不应该打/测试/欢迎,因为它必须映射回jsp?

答案 1 :(得分:0)

我添加到web.xml并且它可以工作:

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

但我不明白为什么会这样?为什么我必须两次添加dispatcher-servlet.xml?

我读过“Spring in Practice”,作者没有在web.xml中使用。到底是怎么回事 ?

答案 2 :(得分:0)

我没有太多细节,但从我们的评论开始,我可以这么说。

查看您的web.xml我发现您没有配置根应用程序上下文。配置调度程序servlet,可以配置Web上下文。我的关键点是,对于配置调度程序servlet的Web应用程序,您需要配置Web上下文,如果需要,在Web xml中添加org.springframework.web.context.ContextLoaderListener,在Spring中要求添加根应用程序上下文,您的网络背景的父级。

但是,在您的web.xml中,您没有添加根应用程序上下文xml文件的位置,如果您在WEB-INF下没有名为applicationContext.xml的文件(官方文档:{{ 3}}章节6.15.4 Web应用程序的便捷ApplicationContext实例化),Spring无法找到配置文件。为克服这个问题,您可以在web.xml中添加一个paramiter,如下所示:

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:application-context.xml</param-value>
    </context-param>

很明显,添加

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/dispatcher-servlet.xml</param-value>
</context-param>

在您的web.xml中,您提供了根应用程序上下文配置的路径,并且一切正常。

您可以考虑,如果您不需要分离Web上下文和根上下文,则可以擦除侦听器并将根上下文的bean配置为Web上下文的bean。 许多像Alfresco这样的网络应用程序都使用这种策略。

在评论时发送安全更新:

在我看来,正确的方法是配置服务,存储库以及更多通用商务应用服务bean,在您配置的根上下文中,在web.xml和控制器/休息端点中插入litener以及更多通用所有调度程序servlet创建的Web上下文中的Web层(视图解析程序,拦截器等)。

如果您没有为servlet和/或监听器弹簧配置插件,请使用您的默认配置约定(如果您提供)可以超出此约定。

在许多情况下,您可以通过互联网查看使用如下配置的示例:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                             http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
                            version="3.0">
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:application-context.xml</param-value>
    </context-param>


    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>


....
</web-app>

但请记住我的answare,因为web应用程序必须有一个由dispatcer servlet创建的web上下文,如果你想要覆盖xml文件的位置,但是一个更好的方法在Internet上有一个单独的上下文你总是看到配置机智的听众,但这不是强制性的。

我希望这可以帮助你并澄清你的想法。