【问题标题】:Spring XML configuration doesn't working -Spring XML 配置不起作用 -
【发布时间】:2016-05-06 04:01:47
【问题描述】:

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

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

现在我尝试使用 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>

调度程序-servlet.xml

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

家庭控制器

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";
    }   
}

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>

Project structure

Result

5 小时后我尝试了不同的方法,但没有结果。

【问题讨论】:

  • 您确定您的应用上下文启动正确吗?我想问它,因为我没有看到您的根应用程序上下文的名称,可能问题可能在于根上下文的错误实例化。
  • 你的意思是 在 web.xml 吗?我使用本教程:mkyong.com/spring-mvc/gradle-spring-mvc-web-project-example 而在 spring-core-config.xml 中只有组件扫描

标签: java spring spring-mvc tomcat8


【解决方案1】:

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

看到您的 web.xml,我发现您没有配置根应用程序上下文。配置调度程序 servlet,您可以配置 Web 上下文。我的话中的关键点是,对于配置调度程序 servlet 的 Web 应用程序,您需要配置一个 Web 上下文,如果需要,在您的 Web xml 中添加 org.springframework.web.context.ContextLoaderListener 您在 Spring 要求添加一个根应用程序上下文,该上下文将是你的网络环境。

但是,在您的 web.xml 中,您没有添加根应用程序上下文 xml 文件的位置,并且如果您在 WEB-INF 下没有名为 applicationContext.xml 的文件(官方文档:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/ 第 6.15 章。 4 方便Web应用的ApplicationContext实例化),Spring找不到配置文件。为了克服这个问题,您可以在 web.xml 中添加一个参数,如下所示:

<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 和/或监听器插入配置,spring 使用你的默认配置约定,如果你提供你可以覆盖这些约定。

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

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

但请记住我的回答,对于 Web 应用程序,必须有一个由调度程序 servlet 创建的 Web 上下文,如果您愿意,可以覆盖 xml 文件的位置,但更好的方法是在 Internet 上有一个单独的上下文,您总是可以看到配置机智的听众,但这不是强制性的。

希望对你有所帮助,理清思路。

【讨论】:

  • 好的,非常感谢。所以 Spring 需要 即使 application-context.xml 没有退出?将来在 application-context.xml 中,我将配置例如 Spring Web Flow 等。是吗?那么,为什么许多作者不在 web.xml 中包含这个 呢?
  • 我更新了我的答案,我认为这可能会澄清你的疑虑
【解决方案2】:

我没有足够的评论点数,但您似乎正在尝试访问位于 /test/ 的基本 url。如果您使用的是内部视图解析器,您不应该点击 /test/welcome,因为它必须映射回 jsp?

【讨论】:

  • 是的,我想在 /test/ 中访问基本 url。 “欢迎”是 .jsp 文件的名称。如您所见,我设置了后缀和前缀,因此 /test/ 映射到 /test/welcome.jsp
【解决方案3】:

我添加到 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 Pactise”,作者没有在 web.xml 中使用 and。到底是怎么回事 ?

【讨论】:

    猜你喜欢
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 2016-04-21
    • 2017-10-08
    相关资源
    最近更新 更多