我做了两个项目,都是非常基本的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。但是我无法找到它。
项目AMyWebAppInitializer.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.javapackage 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 {
}
答案 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>