今天在学习搭建springMVC时发生404错误。
后台一切正常,返回了请求信息
后台信息如下:2018-09-10 19:40:08,832 [qtp10001825-20] DEBUG [org.springframework.web.servlet.DispatcherServlet] - DispatcherServlet with name 'mvc-dispatcher' processing GET request for [/hello/mvc]
2018-09-10 19:40:08,833 [qtp10001825-20] DEBUG [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] - Looking up handler method for path /hello/mvc
2018-09-10 19:40:08,835 [qtp10001825-20] DEBUG [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] - Returning handler method [public java.lang.String com.zhou.mvcdome.controller.HelloMvcController.helloMvc()]
2018-09-10 19:40:08,835 [qtp10001825-20] DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] - Returning cached instance of singleton bean 'helloMvcController'
2018-09-10 19:40:08,835 [qtp10001825-20] DEBUG [org.springframework.web.servlet.DispatcherServlet] - Last-Modified value for [/hello/mvc] is: -1
后台访问到了
2018-09-10 19:40:08,845 [qtp10001825-20] DEBUG [org.springframework.web.servlet.view.ContentNegotiatingViewResolver] - Requested media types are [*/*] based on Accept header types and producible media types [*/*])
2018-09-10 19:40:08,846 [qtp10001825-20] DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] - Invoking afterPropertiesSet() on bean with name 'home'
2018-09-10 19:40:08,847 [qtp10001825-20] DEBUG [org.springframework.web.servlet.view.ContentNegotiatingViewResolver] - Returning [org.springframework.web.servlet.view.JstlView: name 'home'; URL [/WEB-INF/jsps/home.jsp]] based on requested media type '*/*'
2018-09-10 19:40:08,847 [qtp10001825-20] DEBUG [org.springframework.web.servlet.DispatcherServlet] - Rendering view [org.springframework.web.servlet.view.JstlView: name 'home'; URL [/WEB-INF/jsps/home.jsp]] in DispatcherServlet with name 'mvc-dispatcher'
2018-09-10 19:40:08,849 [qtp10001825-20] DEBUG [org.springframework.web.servlet.view.JstlView] - Forwarding to resource [/WEB-INF/jsps/home.jsp] in InternalResourceView 'home'
2018-09-10 19:40:08,853 [qtp10001825-20] DEBUG [org.springframework.web.servlet.DispatcherServlet] - Successfully completed request业务层代码只是一个简单的返回,如下:package com.zhou.mvcdome.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/hello")
public class HelloMvcController {
//代表该方法响应//host:端口/hello/mvc请求
@RequestMapping("/mvc")
public String helloMvc() {
System.out.println("后台访问到了");
return "home";
}
}项目使用maven 配置jetty插件进行调试 ,前台报错信息如图
我查了配置文件未发现错误,具体配置文件如下
web.xml<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>springMVC</display-name>
<!-- spring MVC配置开始 -->
<!-- 全局配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/configs/applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- 配置DispatcherServlet -->
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- dispatcherServlet对应的上下文配置,默认为/WEB-INF/$-servlet-name$-servlet.xml这个配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/configs/mvc-dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<!-- mvc-dispatcher拦截所有的请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
springmvc配置文件mvc-dispatcher-servlet.xml内容
<?xml version="1.0" encoding="UTF-8"?>
<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/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 本配置文件是工名为mvc-dispatcher的DispatcherServlet使用, 提供其相关的Spring MVC配置 --> <!-- 启用Spring基于annotation的DI, 使用户可以在Spring MVC中使用Spring的强大功能。 激活 @Required
@Autowired,JSR 250's @PostConstruct, @PreDestroy and @Resource 等标注 -->
<context:annotation-config /> <!-- DispatcherServlet上下文, 只管理@Controller类型的bean, 忽略其他型的bean, 如@Service -->
<context:component-scan base-package="com.zhou.mvcdome">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan> <!-- HandlerMapping, 无需配置, Spring MVC可以默认启动。 DefaultAnnotationHandlerMapping
annotation-driven HandlerMapping --> <!-- 扩充了注解驱动,可以将请求参数绑定到控制器参数 -->
<mvc:annotation-driven /> <!-- 静态资源处理, css, js, imgs -->
<mvc:resources mapping="/resources/**" location="/resources/" />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsps/" />
<property name="suffix" value=".jsp" />
</bean></beans>
项目目录结构
回想之前,我在引入配置文件路径时使用/WEB-INF/configs/spring/配置文件名,项目启动报找不到文件报错,报错主要信息如下:
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/configs/spring/mvc-dispatcher-servlet.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/configs/spring/mvc-dispatcher-servlet.xml]
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:344)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
换成classpath:写法没有报错了,当时就没在管了。后来我又把param-value内容写成如下方式,并确保路径文件都是正确的,启动后报同样的错误。
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/configs/spring/mvc-dispatcher-servlet.xml</param-value>
</init-param>
所以我认为可能是加载配置文件时,不能识别WEB-INF路径,在请求返回时,同样也不能识别WEB-INF路径,访问不到view资源,查阅了相关资料,并没有发现有提到这种问题。
随后我在Controller上加上@ResponseBody
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
@RequestMapping("/hello")
@ResponseBody
public class HelloMvcController {
//代表该方法响应//host:端口/hello/mvc请求
@RequestMapping("/mvc")
public String helloMvc() {
System.out.println("后台访问到了");
return "home";
}
}可以正常输出home到页面,也证明访问路径和后台配置是正确的。
我又将别人的项目spring mvc项目导入进ecplise中,其 配置文件使用的是这种写法<param-value>/WEB-INF/configs/spring/mvc-dispatcher-servlet.xml</param-value>调试可以正常启动并访问得到指定页面,然后我又将别人的配置文件内容全部拷到我的项目里,结果,仍是发生同样的错误,访问不到配置文件,改成classpath就可以正常启动,但仍是报同样的404问题(后台正常已进入Controller
)。
本人初学,被这个问题纠结了一天,希望哪位大神不惜赐教。
后台一切正常,返回了请求信息
后台信息如下:2018-09-10 19:40:08,832 [qtp10001825-20] DEBUG [org.springframework.web.servlet.DispatcherServlet] - DispatcherServlet with name 'mvc-dispatcher' processing GET request for [/hello/mvc]
2018-09-10 19:40:08,833 [qtp10001825-20] DEBUG [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] - Looking up handler method for path /hello/mvc
2018-09-10 19:40:08,835 [qtp10001825-20] DEBUG [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping] - Returning handler method [public java.lang.String com.zhou.mvcdome.controller.HelloMvcController.helloMvc()]
2018-09-10 19:40:08,835 [qtp10001825-20] DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] - Returning cached instance of singleton bean 'helloMvcController'
2018-09-10 19:40:08,835 [qtp10001825-20] DEBUG [org.springframework.web.servlet.DispatcherServlet] - Last-Modified value for [/hello/mvc] is: -1
后台访问到了
2018-09-10 19:40:08,845 [qtp10001825-20] DEBUG [org.springframework.web.servlet.view.ContentNegotiatingViewResolver] - Requested media types are [*/*] based on Accept header types and producible media types [*/*])
2018-09-10 19:40:08,846 [qtp10001825-20] DEBUG [org.springframework.beans.factory.support.DefaultListableBeanFactory] - Invoking afterPropertiesSet() on bean with name 'home'
2018-09-10 19:40:08,847 [qtp10001825-20] DEBUG [org.springframework.web.servlet.view.ContentNegotiatingViewResolver] - Returning [org.springframework.web.servlet.view.JstlView: name 'home'; URL [/WEB-INF/jsps/home.jsp]] based on requested media type '*/*'
2018-09-10 19:40:08,847 [qtp10001825-20] DEBUG [org.springframework.web.servlet.DispatcherServlet] - Rendering view [org.springframework.web.servlet.view.JstlView: name 'home'; URL [/WEB-INF/jsps/home.jsp]] in DispatcherServlet with name 'mvc-dispatcher'
2018-09-10 19:40:08,849 [qtp10001825-20] DEBUG [org.springframework.web.servlet.view.JstlView] - Forwarding to resource [/WEB-INF/jsps/home.jsp] in InternalResourceView 'home'
2018-09-10 19:40:08,853 [qtp10001825-20] DEBUG [org.springframework.web.servlet.DispatcherServlet] - Successfully completed request业务层代码只是一个简单的返回,如下:package com.zhou.mvcdome.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/hello")
public class HelloMvcController {
//代表该方法响应//host:端口/hello/mvc请求
@RequestMapping("/mvc")
public String helloMvc() {
System.out.println("后台访问到了");
return "home";
}
}项目使用maven 配置jetty插件进行调试 ,前台报错信息如图
我查了配置文件未发现错误,具体配置文件如下
web.xml<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>springMVC</display-name>
<!-- spring MVC配置开始 -->
<!-- 全局配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/configs/applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<!-- 配置DispatcherServlet -->
<servlet>
<servlet-name>mvc-dispatcher</servlet-name>
<servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- dispatcherServlet对应的上下文配置,默认为/WEB-INF/$-servlet-name$-servlet.xml这个配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/configs/mvc-dispatcher-servlet.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<!-- mvc-dispatcher拦截所有的请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
springmvc配置文件mvc-dispatcher-servlet.xml内容
<?xml version="1.0" encoding="UTF-8"?>
<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/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 本配置文件是工名为mvc-dispatcher的DispatcherServlet使用, 提供其相关的Spring MVC配置 --> <!-- 启用Spring基于annotation的DI, 使用户可以在Spring MVC中使用Spring的强大功能。 激活 @Required
@Autowired,JSR 250's @PostConstruct, @PreDestroy and @Resource 等标注 -->
<context:annotation-config /> <!-- DispatcherServlet上下文, 只管理@Controller类型的bean, 忽略其他型的bean, 如@Service -->
<context:component-scan base-package="com.zhou.mvcdome">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan> <!-- HandlerMapping, 无需配置, Spring MVC可以默认启动。 DefaultAnnotationHandlerMapping
annotation-driven HandlerMapping --> <!-- 扩充了注解驱动,可以将请求参数绑定到控制器参数 -->
<mvc:annotation-driven /> <!-- 静态资源处理, css, js, imgs -->
<mvc:resources mapping="/resources/**" location="/resources/" />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsps/" />
<property name="suffix" value=".jsp" />
</bean></beans>
项目目录结构
回想之前,我在引入配置文件路径时使用/WEB-INF/configs/spring/配置文件名,项目启动报找不到文件报错,报错主要信息如下:
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/configs/spring/mvc-dispatcher-servlet.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/configs/spring/mvc-dispatcher-servlet.xml]
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:344)
at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
换成classpath:写法没有报错了,当时就没在管了。后来我又把param-value内容写成如下方式,并确保路径文件都是正确的,启动后报同样的错误。
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/configs/spring/mvc-dispatcher-servlet.xml</param-value>
</init-param>
所以我认为可能是加载配置文件时,不能识别WEB-INF路径,在请求返回时,同样也不能识别WEB-INF路径,访问不到view资源,查阅了相关资料,并没有发现有提到这种问题。
随后我在Controller上加上@ResponseBody
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
@RequestMapping("/hello")
@ResponseBody
public class HelloMvcController {
//代表该方法响应//host:端口/hello/mvc请求
@RequestMapping("/mvc")
public String helloMvc() {
System.out.println("后台访问到了");
return "home";
}
}可以正常输出home到页面,也证明访问路径和后台配置是正确的。
我又将别人的项目spring mvc项目导入进ecplise中,其 配置文件使用的是这种写法<param-value>/WEB-INF/configs/spring/mvc-dispatcher-servlet.xml</param-value>调试可以正常启动并访问得到指定页面,然后我又将别人的配置文件内容全部拷到我的项目里,结果,仍是发生同样的错误,访问不到配置文件,改成classpath就可以正常启动,但仍是报同样的404问题(后台正常已进入Controller
)。
本人初学,被这个问题纠结了一天,希望哪位大神不惜赐教。
解决方案 »
- 关于webservice入门问题!
- sharedObject无法在服务器端生成.fso文件
- 问下,Struts和Struts2有什么区别啊?
- Struts2 属性取值问题
- 简单jsp问题--网页调用速度奇慢
- This code should have never made it into the jar
- createSession: Too many active sessions???
- 关于Tag<jsp:setProperties>的问题
- 请教:关于语音聊天室
- 同一个JSP页面Ext.onReady 和wondow.onload那个先执行?
- javaWeb SQL异常
- myeclipse运行程序出现500错误,该怎么解决?错误如下,项目为网上商城
我今天重新见了个项目用别人的配置文件就成功了,然后我再换成我之前报错的那个配置文件,只将扫描的包名换成我的新项目包名,发现正常启动并且访问,说明我昨天的配置文件没有问题。变化的仅有扫描的包名,肯定也不是包名写错了,写错了的话,根本就不能进入Controller。
然后我又看了新项目的deployment Assembly 还有build Path,设置是一模一样的。
而且我今天早上新建了个项目用我昨天的配置文件就能成功访问并显示了。
不过我在jetty上是可以正常启动,但是在tomcat上就不行了,我用的jdk1.8+tomcat8,tomcat出现找不到DispatcherServlet的问题,我开始以为是jar包没引入进去,配置了maven下的lib,也不行,后来猜想是maven引入和servlet包和tomcat有冲突,就有新建了个web工程,没有用maven,就写了个非常简单的servlet,用流输出到页面上,我可以保证web配置是完全正确的,我在jetty上测试了可以访问,换成tomcat仍然报错,找不到servlet,很迷茫难道是我的ecpilse问题?
最后返回的页面被你配置的拦截器给拦截了
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<!-- mvc-dispatcher拦截所有的请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
要么配置过滤JSP,html等文件,要么拦截指定规则的url,比如 *.action
@RestController请求表示返回的信息存放在response里。
@Controller请求支持转发和重定向,结合@ResponseBody注解就和@RestController一样,@ResponseBody可以编写于类上、方法上。