两个非常相似的SpringMVC项目。一个人无法显示模型数据

时间:2017-09-10 21:33:52

标签: java jsp spring-mvc

我做了两个项目,都是非常基本的Spring MVC,基本配置和单个控制器。两个项目中的一些文件都是IDENTICAL,如控制器,视图和视图解析器定义。这样做是为了找到导致失败的原因:在 projectA 中,视图无法显示控制器发送的模型数据。 projectB 运行正常。 (我使用的是Spring 4.3.9和Tomcat 8.5.20)

项目A - 通过扩展AbstractAnnotationConfigDispatcherServletInitializer定义的Dispatcher servlet。 getRootConfigClasses()返回一个配置类,该类链接定义视图解析器的web-config.xml。

├── pom.xml
└── src
    └── main
        ├── java
        │   └── mywebapp
        │       ├── config
        │       │   ├── MyWebAppInitializer.java
        │       │   └── RootConfig.java
        │       └── web
        │           └── HomeController.java
        ├── resources
        │   └── web-config.xml
        └── webapp
            └── WEB-INF
                ├── views
                │   └── home.jsp
                └── web.xml

项目B - 在web.xml中定义的调度程序。在web.xml中链接的Servlet上下文和根上下文。

├── pom.xml
└── src
    └── main
        ├── java
        │   └── mywebapp
        │       └── web
        │           └── HomeController.java
        ├── resources
        │   ├── app-config.xml
        │   └── web-config.xml
        └── webapp
            └── WEB-INF
                ├── views
                │   └── home.jsp
                └── web.xml

项目A 返回

Hello World!

${message} 
${message}

项目B 返回

Hello World!

my message in model 
my message in model

由于两个项目都使用IDENTICAL:

一个)JSP视图。 b )所述视图的控制器。 c )定义视图解析器的配置文件。(web-config.xml)

并且根上下文文件(app-config.xml和RootConfig.java)仅用作servlet上下文文件和调度程序定义之间的链接,失败的原因必须来自调度程序servlet的java-config。但是我无法找到它。

项目A

MyWebAppInitializer.java

package mywebapp.config;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[] { RootConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return null;
    }
}
来自项目B

web.xml

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

    <display-name>Spring MVC XML Configuration Example</display-name>

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

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <servlet>
        <servlet-name>my-dispatcher-servlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:web-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

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

</web-app>

web-config.xml - 由BOTH项目共享

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       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="mywebapp.web" />

    <mvc:annotation-driven />

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

</beans>

HomeController.java - 由 BOTH 项目共享

package mywebapp.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
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 index(ModelMap model){
        model.addAttribute("message", "my message in model");
        return "home";
    }

}

请帮我找到显示模型数据失败的原因,这样我就可以使用java-config模板了。

项目A

中的RootConfig.java
package mywebapp.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.context.annotation.ImportResource;

import java.util.List;

@Configuration
@ComponentScan (basePackages={"mywebapp"}, excludeFilters={@Filter(type=FilterType.ANNOTATION, value=EnableWebMvc.class)})
@ImportResource("classpath:web-config.xml")
public class RootConfig {
}

1 个答案:

答案 0 :(得分:0)

第1步) 在项目A 中 - 删除由maven archetype创建的web.xml

步骤2)将以下内容添加到pom.xml

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.0.0</version>
        </plugin>
    </plugins>
</build>