我正在讲授如何在春季创建应用程序。

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

现在,我尝试使用XML配置MVC App,结果是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>


dispatcher-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,我发现您没有配置根应用程序上下文。配置调度程序servlet,然后配置Web上下文。用我的话来说,关键是要为配置调度程序servlet的Web应用程序配置Web上下文,如果需要,在Spring要求的Web xml中添加org.springframework.web.context.ContextLoaderListener以添加将作为其父级的根应用程序上下文。您的网络环境。

但是,在web.xml中,您不会添加根应用程序上下文xml文件的位置,并且如果您在WEB-INF下没有名为applicationContext.xml的文件(官方文档:http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/第6.15.4章,方便的ApplicationContext) Web应用程序实例化),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。
许多Web应用程序(例如Alfresco)都使用此策略。

在评论时更新的答案:

我认为一种正确的方法是在根上下文中配置服务,存储库,以及在一般的buisiness-application-service Bean中进行更多配置,即在Web.xml和控制器/其余端点中以及在一般情况下在所有Web-调度程序Servlet创建的Web上下文中的图层(视图解析器,拦截器等)。

假设如果您不为servlet和/或侦听器spring插入配置,请使用默认配置约定(如果提供),则可以过度使用该约定。

在许多情况下,您可以通过以下配置在Internet上查看文字检查:

<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应用程序是强制性的,有一个由Dispatcer Servlet创建的Web上下文,如果需要,它可以覆盖xml文件的位置,但是更好的方法是在Internet上使用单独的上下文,您总是可以看到配置,但监听器这不是强制性的。

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

09-10 06:04
查看更多