spring mvc 404错误

目标菜市场 2018-09-10 08:49:55
今天在学习搭建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
)。
本人初学,被这个问题纠结了一天,希望哪位大神不惜赐教。
...全文
472 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ouyangjun__ 2018-11-12
  • 打赏
  • 举报
回复
在类上面你可以用@RestController注解替换掉@Controller和@ResponseBody,这是相等的。
@RestController请求表示返回的信息存放在response里。
@Controller请求支持转发和重定向,结合@ResponseBody注解就和@RestController一样,@ResponseBody可以编写于类上、方法上。
LastOfTheWilds 2018-11-10
  • 打赏
  • 举报
回复
找不到路径吧
Info_Qi 2018-09-19
  • 打赏
  • 举报
回复

最后返回的页面被你配置的拦截器给拦截了
</servlet>
<servlet-mapping>
<servlet-name>mvc-dispatcher</servlet-name>
<!-- mvc-dispatcher拦截所有的请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
要么配置过滤JSP,html等文件,要么拦截指定规则的url,比如 *.action
qq_38940297 2018-09-18
  • 打赏
  • 举报
回复
看看你的前端页面呢!!
ridish 2018-09-16
  • 打赏
  • 举报
回复
第一步就配置字符集编码,然后你都访问到了后台,要是就页面出错,要不就是页面设置的问题
kingzhaoc 2018-09-11
  • 打赏
  • 举报
回复
右键工程->properties,你看deployment assembly下面的webapp路径还在不在,不在就加上。
田小瘦 2018-09-11
  • 打赏
  • 举报
回复
你把两边的配置文件对照一下, 看不出来有问题的是哪里么?
目标菜市场 2018-09-11
  • 打赏
  • 举报
回复
那是后来加的,去掉后就仍然是404,访问不到那个jsp页面
做一个梦想家 2018-09-11
  • 打赏
  • 举报
回复
@ResponseBody 去掉。
目标菜市场 2018-09-11
  • 打赏
  • 举报
回复
还是很感谢各位,最终经过测试时因为我ecpilse工作空间存在中文,我把新建的项目重新给了个没有中文的路径就好了,web容器就能访问到web-inf路径了。。。。感谢各位。
目标菜市场 2018-09-11
  • 打赏
  • 举报
回复
引用 6 楼 t15137830 的回复:
你把两边的配置文件对照一下, 看不出来有问题的是哪里么?

兄弟,真不是我不小心,配置文件写错了的问题,我昨天至少花了两个小时再对照配置文件,到最后直接复制了,只有包名不一样需要修改。
而且我今天早上新建了个项目用我昨天的配置文件就能成功访问并显示了。。。。
不过我在jetty上是可以正常启动,但是在tomcat上就不行了,我用的jdk1.8+tomcat8,tomcat出现找不到DispatcherServlet的问题,我开始以为是jar包没引入进去,配置了maven下的lib,也不行,后来猜想是maven引入和servlet包和tomcat有冲突,就有新建了个web工程,没有用maven,就写了个非常简单的servlet,用流输出到页面上,我可以保证web配置是完全正确的,我在jetty上测试了可以访问,换成tomcat仍然报错,找不到servlet,很迷茫。。。。。。难道是我的ecpilse问题?
目标菜市场 2018-09-11
  • 打赏
  • 举报
回复

引用 7 楼 kingzhaoc 的回复:
右键工程->properties,你看deployment assembly下面的webapp路径还在不在,不在就加上。


这些我在昨天都试过了,没有解决问题
我今天重新见了个项目用别人的配置文件就成功了,然后我再换成我之前报错的那个配置文件,只将扫描的包名换成我的新项目包名,发现正常启动并且访问,说明我昨天的配置文件没有问题。变化的仅有扫描的包名,肯定也不是包名写错了,写错了的话,根本就不能进入Controller。
然后我又看了新项目的deployment Assembly 还有build Path,设置是一模一样的。
目标菜市场 2018-09-10
  • 打赏
  • 举报
回复
没办法只能用别人的项目导入进去,然后再改代码了。。。
目标菜市场 2018-09-10
  • 打赏
  • 举报
回复
分不多,求那位高手解答下,十分感激

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧