今天作毕设的时候,在搭建ssm框架的使用使用springmvc的@PathVariable时出现了一个路径匹配的问题,最后花了点时间解决了。
代码结构:
问题内容:
访问url为:
按照道理说,我应该到jsp的index页面去。最后的结果确实到了index页面,可是由于该页面引用了几个css和js,报异常找不到。有使用过spring经验的童鞋应该知道使用如下代码解决静态资源的访问。
// 方法一 <mvc:default-servlet-handler/> // 方法二 <mvc:resources location="/easyui/js/" mapping="/themes/**"/> <mvc:resources location="/easyui/themes/" mapping="/js/**"/>
可是最后还是访问不到静态资源。
于是我就想是因为@PathVariable的原因吗?于是在下面做了一个实验
@RequestMapping("/index") public String index() { System.out.println("index execute "); return "index"; }
实验的结果就是可以正确访问。看样子好像确实是这样。于是我又再一次访问上面的地址(http://localhost:8080/ksxt_v1/user/index),并且打开控制台来查看,如下:
从上面标识的地方可以看出问题的原因了,当请求的URL为http://localhost:8080/ksxt_v1/user/index时,它在请求静态资源的时候也会把user带上,我们的静态资源肯定不是放在这个文件夹里面的了。最后的结局当然是找不到了。
上面的问题产生是因为我在引用静态文件使用的是相对路径。
解决方法就是将其全部修改为绝对路径。
<link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/easyui/themes/default/easyui.css" rel="external nofollow" > <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/easyui/themes/icon.css" rel="external nofollow" > <script type="text/javascript" src="${pageContext.request.contextPath}/easyui/js/jquery.min.js"></script> <script type="text/javascript" src="${pageContext.request.contextPath}/easyui/js/jquery.easyui.min.js"></script>
最后完美解决。当然应该也有其它方式解决,暂时未想到。
补充:SpringMVC 请求路径结尾存在.使用@PathVariable访问路径内容,路径参数获取不准确的问题
SpringMVC采用Get方式请求资源时,如果请求路径的结尾中带有小数点(.)时,同时使用@PathVariable访问路径内容时,请求路径中最后一个小数点及其后面的内容会被Spring截断丢弃
对于请求路径:
http://host:port/program/module/download/apk/3.20.10
后端RequestMapping为
@RequestMapping(value="module/download/apk/{version}",method=RequestMethod.GET) public void download(HttpSession session,HttpServletResponse response,@PathVariable("version")String version){ //解析后获得到的版本值为:3.20 }
对于请求路径:
http://host:port/program/viewFile/module/201612201231445.pdf
后端RequestMapping为
@RequestMapping(value="viewFile/{module}/{filename}",method=RequestMethod.GET) public void viewFile(HttpSession session,HttpServletResponse response,@PathVariable String module, @PathVariable String filename){ //解析后获得到的文件名称为201612201231445并没有或追文件后缀 }
1、在路径后加任意小数点结尾的字符串
http://host:port/program/module/download/apk/3.20.10.html
http://host:port/program/viewFile/module/201612201231445.pdf.jsp
2、使用Spring正则表达式(SpEL)
@RequestMapping(value="module/download/apk/{version:.+}",method=RequestMethod.GET) @RequestMapping(value="viewFile/{module}/{filename:.+}",method=RequestMethod.GET)
以上为个人经验,希望能给大家一个参考,也希望大家多多支持呐喊教程。如有错误或未考虑完全的地方,望不吝赐教。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:notice#nhooo.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。