Java SpringXML配置不支持';行不通-

Java SpringXML配置不支持';行不通-,java,spring,spring-mvc,tomcat8,Java,Spring,Spring Mvc,Tomcat8,我正在学习如何在春天创建应用程序 首先,我使用AbstractAnnotationConfigDispatcherServletInitializer在Java配置中配置了应用程序,它可以正常工作 现在我尝试使用XML配置MVC应用程序,结果是HTTP 404:/ web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi

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

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

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

web.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>
pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>info.bambo</groupId>
    <artifactId>test</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>test Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.2.5.RELEASE</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>test</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>


    </build>
</project>

4.0.0
班博信息


从5个小时以来,我尝试了不同的方法,但没有结果。

我没有足够的分数发表评论,但看起来您正在尝试点击/test/的基本url。如果您使用的是内部视图解析器,那么您不应该点击/test/welcome,因为它必须映射回jsp吗?

我没有足够的要点来评论,但看起来您正在尝试点击/test/的基本url。如果您使用的是内部视图解析器,那么您不应该点击/test/welcome,因为它必须映射回jsp吗?

我添加到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>

上下文配置位置
/WEB-INF/dispatcher-servlet.xml
org.springframework.web.context.ContextLoaderListener
但我不明白为什么它会起作用?为什么我必须添加两次dispatcher-servlet.xml


我读了《实践中的春天》,作者在web.xml中没有使用和。发生了什么事

我添加到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>

上下文配置位置
/WEB-INF/dispatcher-servlet.xml
org.springframework.web.context.ContextLoaderListener
但我不明白为什么它会起作用?为什么我必须添加两次dispatcher-servlet.xml


我读了《实践中的春天》,作者在web.xml中没有使用和。发生了什么事

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

看到web.xml,我发现您没有配置根应用程序上下文。配置DispatcherServlet时,需要配置web上下文。用我的话来说,关键的一点是,对于配置DispatcherServlet的web应用程序,您可以配置一个web上下文,如果需要,可以在web xml中添加
org.springframework.web.context.ContextLoaderListener
,您可以在Spring请求添加一个根应用程序上下文,它将是web上下文的父级

但是,在web.xml中,您没有添加根应用程序上下文xml文件的位置,如果web-INF下没有名为applicationContext.xml的文件(官方文档:第6.15.4章web应用程序的便捷应用程序上下文实例化),Spring将找不到配置文件。要解决此问题,您可以在web.xml中添加一个参数,如下所示:

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:application-context.xml</param-value>
    </context-param>
<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>

上下文配置位置
类路径:application-context.xml
很明显,添加

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

上下文配置位置
/WEB-INF/dispatcher-servlet.xml
在web.xml中,您提供了根应用程序上下文配置的路径,一切正常

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

回复回复更新:

在我看来,一个正确的方法是在根上下文中配置服务、存储库等,在根上下文中配置litener,在web.xml和controller/rest端点中插入litener,在所有web层(视图解析器、拦截器等)中插入litener在DispatcherServlet创建的web上下文中

如果您没有为servlet和/或侦听器spring插入配置,请使用您的默认配置约定,如果您提供了这些约定,则可以超越这些约定

在许多情况下,您可以在internet上看到exampel,它使用如下配置:

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:application-context.xml</param-value>
    </context-param>
<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>

org.springframework.web.context.ContextLoaderListener
上下文配置位置
类路径:application-context.xml
调度员
org.springframework.web.servlet.DispatcherServlet
1.
调度员
/
....
但请记住my answare,因为web应用程序是强制性的,由dispatcer servlet创建一个web上下文,如果您愿意,它可以覆盖xml文件的位置,但更好的方法是在internet上使用一个单独的上下文,您可以看到配置和侦听器,但它不是强制性的


我希望这能帮助你,澄清你的想法。

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

看到web.xml,我发现您没有配置根应用程序上下文。配置DispatcherServlet时,需要配置web上下文。用我的话来说,关键的一点是,对于配置DispatcherServlet的web应用程序,您可以配置一个web上下文,如果需要,可以在web xml中添加
org.springframework.web.context.ContextLoaderListener
,您可以在Spring请求添加一个根应用程序上下文,它将是web上下文的父级

但是,在web.xml中,您没有添加根应用程序上下文xml文件的位置,如果web-INF下没有名为applicationContext.xml的文件(官方文档:第6.15.4章web应用程序的便捷应用程序上下文实例化),Spring将找不到配置文件。要解决此问题,您可以在web.xml中添加一个参数,如下所示:

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:application-context.xml</param-value>
    </context-param>
<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>

上下文配置位置
类路径:application-context.xml
很明显,添加

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

上下文配置位置
/WEB-INF/dispatcher-servlet.xml
在web.xml中,您提供了根应用程序上下文配置的路径,一切正常

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

在评论中更新answareing: