您的位置:首页 > 理论基础 > 计算机网络

SpringMVC中静态资源无法找到(No mapping found for HTTP request with URI)的四种解决方式

2018-01-15 23:16 573 查看
今天写程序遇到一个问题,及jsp页面加载静态文件加载不进来。

页面这样:

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<script  type="text/javascript" src="../js/echarts.js">
alert('hello');
</script>

<title>跳转成功页面</title>

</head>
<body>
<h2>Echars Demo Page</h2>

<!-- 为ECharts准备一个具备大小(宽高)的Dom -->
<div id="main" style="background:#CCC;width: 600px;height:400px;" ></div>

<script type="text/javascript">
// 基于准备好的dom,初始化echarts实例
var myChart = echarts.init(document.getElementById('main'));
//alert(typeof(myChart));
// 指定图表的配置项和数据
var option = {
title: {
text: 'ECharts 写入网页框架'
},
tooltip: {},
legend: {
data:['指标']
},
xAxis: {
data: ["南航","东航","国航","春秋","澳门","首都"]
},
yAxis: {},
series: [{
name: '值机数',
type: 'bar',
data: [50, 200, 360, 100, 100, 200]
}]
};

// 使用刚指定的配置项和数据显示图表。
myChart.setOption(option);
</script>

</body>
</html>


其中,
<script  type="text/javascript" src="../js/echarts.js">
需要加载一个静态js文件。

总是出现如下错误:



文字描述为:

No mapping found for HTTP request with URI [/springDemo/js/echarts.js] in DispatcherServlet with name ‘springDispatcherServlet’

即找不到资源,servlet映射不到这样的url请求。

网页变成这样,只有body中div的显示出来,却没有内容。



后来看了大神的文章《完美解决SpringMVC中静态资源无法找到(No mapping found for HTTP request with URI)问题》解决了问题,并知道了原理。

原来web.xml一开始进行servlet-mapping映射配置时候,设置如下。

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

<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>


servlet-mapping 设置的过滤方式为所有,确实是mvc拦截器在作祟。

从配置上分析,如此配置会把所有的请求都会进行拦截,交给spring去处理。而spring所有请求的URL都是在controller中使用注解@RequestMapping标明,所以这样的情况下访问静态资源是访问不到的。

以下给出三种解决方案,自行选择使用

方法1:简单粗暴地告诉服务器,这些资源不需要拦截!

直接在web.xml文件中进行配置,如下:

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.xml</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.swf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.zip</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.gif</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.png</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.js</url-pattern>
</servlet-mapping>


如果你嫌这样太麻烦,太麻烦、看得眼花缭乱的话,请移步下面两种方法!

方法2:直接告诉spring,这个你就得这么做!

在MVC配置文件中添加资源文件映射。

<resources mapping="/resources/**" location="/resources/" />
<resources mapping="/images/**" location="/images/" />
<resources mapping="/js/**" location="/js/" />


注解:

mapping:映射

location:本地资源路径,注意必须是webapp根目录下的路径。

两个*,它表示映射resources/下所有的URL,包括子路径(即接多个/)

可能有筒子看完这个后会回来说:“博主写的啥玩意,照着写了还是没用,我绝对没敲错字!我还是复制过去的!!!”

如果真的有这样的哥们,别告诉我,否则我怕我会忍不住会拿出我的30米大刀!

请自行更换路径!!!

当然这个还有一个需要注意的地方:

配置的location一定要是web-app根目录下才行,如果你将资源目录,放置到web-app/WEB-INF下面的话,恭喜你,访问失败!404 NOT FOUND

方法3:全部使用默认的,也别操啥心了

<mvc:default-servlet-handler/>


比较懒得童鞋可以直接在MVC配置文件加上这么一句,这个确实方便,但是弊端就是他会把你发出的请求全部按照默认的处理了!

如果直接贴出这一句,我怕又有筒子会说怎么报错了,mvc标签报错了!

哥们,你要是这种错误都解决不了,你也先别看这博文了,先去看看什么叫namespace吧!还来得及治疗!

方法4:

直接在web.xml更换过滤器的过滤方式:

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

<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>


更改为:

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

<!-- Map all requests to the DispatcherServlet for handling -->
<servlet-mapping>
<servlet-name>springDispatcherServlet</servlet-name>
<url-pattern>*.action</url-pattern>
</servlet-mapping>


我用了第四种方法,重新开启服务器,运行后页面正常。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐