Spring MVC 遇到的一点点问题(转)
今天下午下班之前看了看凯歌给的Spring Training的教程的lab篇,我之前有跟着做没有遇到什么问题,但是到了跟Spring MVC integrating的时候,遇到一点点有趣的事情。 这个例子很简单,我照着网上的demo做,然后遇到了点问题,请看下面:项目层次 很简单
然后是web.xml的配置
- <servlet>
- <servlet-name>SpringMvcDemo</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>
- /WEB-INF/servlet-config.xml
- </param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>SpringMvcDemo</servlet-name>
- <url-pattern>/*</url-pattern>
- </servlet-mapping>
你可以看到这很简单,定义了上下文以及FrontController拦截的请求地址,不过需要注意的我这里的是匹配所有URL请求,包括**.jsp和什么静态的**.png等等--这一点非常重要。
然后是servlet-config.xml 那就跟简单了,主要是一个包扫描,因为我这里的controller都是使用annotation,然后是一个render jsp的view resolver。
- <context:component-scan base-package="ht.clark.web" />
- <!-- View Resolver -->
- <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
- <property name="prefix" value="/WEB-INF/jsp/"/>
- <property name="suffix" value=".jsp"></property>
- </bean>
最后便是位于ht.clark.web包下的HomeController:
- @Controller
- public class HomeController {
- @RequestMapping(value="/hi.html",method=RequestMethod.GET)
- public ModelAndView Greeting(){
- ModelAndView model = new ModelAndView("greeting");
- model.addObject("msg" , "Hello to Andy Clark");
- return model;
- }
- }
需要注意的是@RequestMapping配置触发这Greeting方法的来源url,也就是浏览器输入http://localhost:8080/SpringMvcDemo/hi.html将会由dispatcher分配到这方法来处理请求。
那显示结果的JSP页面也很简单--注意使用了Jstl来解析
- <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- <html>
- <body>
- <h1>This is my message: ${msg}</h1>
- </body>
- </html>
准备工作完毕,这里的流程那应该是非常之简单的,首先所有在浏览器中输入的url都会传递到DispatchServlet这里简单的servlet中(因为我们使用的是/*--匹配所有url输入),然后DispatchServlet扫描并过滤出所有标记为@Controller的类以及其中的@RequestMapping的方法,并且找到匹配value="/hi.html"的,也就是Greeting方法并做一些处理,返回一个ModelAndView对象,然后根据DispatchServlet会在Render这个对象时delegate到你在Servlet-config中配置的ViewResolver的具体实现,比如我们这里的InternalResourceViewResolver,它可以render jsp的显示技术。最后会将view name(也就是greeting)找到位于WEB-INF/jsp下的greeting.jsp并显示出来。
So,quite straightforward, let's rock and roll!
Oooops,遇到了一点问题,那就是
[color=red]
- 2010-8-17 0:55:30 org.springframework.web.servlet.DispatcherServlet noHandlerFound
- No mapping for [/SpringMvcDemo/WEB-INF/jsp/greeting.jsp] in DispatcherServlet with name 'SpringMvcDemo'
[/color]
Why???!!!! 我的第一反应是,首先我的这个greeting.jsp肯定是在jsp下的,no mapping 是请求没找到,然后去上网搜这个错误嘛,肯定也有人遇到,于是来到了最熟悉的StackOverflow,一搜果然有人遇到这种问题,第一链接 No mapping found for HTTP request with URI [/WEB-INF/pages/apiForm.jsp]http://stackoverflow.com/questions/1266303 里面提供的解决方案是将
- <servlet-mapping>
- <servlet-name>SpringMvcDemo</servlet-name>
- <url-pattern>/*</url-pattern>
- </servlet-mapping>
改为
- <servlet-mapping>
- <servlet-name>SpringMvcDemo</servlet-name>
- <url-pattern>*.html</url-pattern>
- </servlet-mapping>
--也就是将match everything该为match仅以html结尾的url请求。
And it works !!
为什么了? 我看后面的回答:
when i set to / , i the request is render fine. only when i set /* . what is the different / and /* ? – cometta Aug 12 '09 at 15:27
2
<url-pattern>/</url-pattern> only matches the URL host/servlet <url-pattern>/*</url-pattern> matches everything under host/servlet, such as /index.html, /foo.jpg and, most importantly in this case, /WEB-INF/pages/apiForm.jsp the * is the wildcard, which says "anything" In the earlier suggestion, *.do matches anything that ends in .do, for example, /foo.do, /foo/bar.do. It doesn't match anything ending in jsp, so a request for /WEB-INF/pages/apiFrom.jsp is not matched, and is not routed to the DispatcherServlet – ptomli Aug 12 '09 at 15:42
我看ptomli回答的很靠谱。 我查了一下为什么会这样了,下班前凯歌让我去看看源码,我看了下当然是主要的扫了几眼,(因为很多东西搞不清楚),结合Api文档,还好大概的流程有了个概念。
简要地说,当DispatchServlet接受到需要Render的时候,它会去根据需要Render的技术,比如jsp还是xml还是pdf还是velocity等等,在通过你配置的ViewResolver来选择合适的进行处理,所以这里时候它会将请求委托处理resolution InternalResourceViewResoler以及它的子类JstlViewResolver来处理jsp显示的ViewResolver,其实JstlViewResolver或者是InternalResourceViewResoler而言,它们也只是简单调用了RequestDispatch的forward或者include方法来render jsp页面,但是这forward请求,也就是[/SpringMvcDemo/WEB-INF/jsp/greeting.jsp],正如前面所言它匹配DispatchServlet的url表达式(/*),所以它还会交给DispatchServlet来处理,这个时候它肯定是根据你在配置文件中配置或者Controller中annotation比如requestmapping,如果这个时候Controller有一个方法的RequestMapping(value="/WEB-INF/jsp/greeting.jsp')那就会交给它来处理请求,所以,当我们改为使用*.html时候,[/SpringMvcDemo/WEB-INF/jsp/greeting.jsp]并不匹配*.html的格式,所以它不会进入DispatchServlet,而这正是我们想要的,它也不应该route到DispatchServlet中。
所以,这个整个解决问题的过程,还是杰哥说的对,尽管没有说完完整整的自己解决,但是看到别人的解决方案,再想想为什么,然后自己去琢磨,不自觉地有加深对整个框架的理解。
http://clarkht.iteye.com/blog/738820
Spring MVC 遇到的一点点问题(转)的更多相关文章
- Spring MVC(一)Servlet 2.x 规范在 Spring MVC 中的应用
Spring MVC(一)Servlet 2.x 规范在 Spring MVC 中的应用 Spring 系列目录(https://www.cnblogs.com/binarylei/p/1019869 ...
- Spring 注解驱动(二)Servlet 3.0 注解驱动在 Spring MVC 中的应用
Spring 注解驱动(二)Servlet 3.0 注解驱动在 Spring MVC 中的应用 Spring 系列目录(https://www.cnblogs.com/binarylei/p/1019 ...
- Spring mvc解析
方案时间 ,写代码时间 ,解决技术难点时间 , 自测时间,解决bug时间 , 联调时间 ,数据库优化,代码走查1个接口:2个小时 把那个字段再复原回来,不然兼容性不强还有一个刷数据的接口 public ...
- Spring MVC如何获取请求中的参数
目录 一.获取URL中路径参数 1.1 @PathVariable 注解 1.2 @PathParam 注解 二.获取请求参数: 2.1 GET请求 2.1.1 获取请求中的单个参数:@Request ...
- eclipse JavaEE spring,spring mvc,mybits-SSM老年人搭建记录
老求了,好多东西记不住了,再不记以后怕是记不住了. eclipse JAVAEE for web Version: Mars.2 Release (4.5.2) tomcat 7.0.29 sprin ...
- 如何用Java类配置Spring MVC(不通过web.xml和XML方式)
DispatcherServlet是Spring MVC的核心,按照传统方式, 需要把它配置到web.xml中. 我个人比较不喜欢XML配置方式, XML看起来太累, 冗长繁琐. 还好借助于Servl ...
- Spring MVC重定向和转发以及异常处理
SpringMVC核心技术---转发和重定向 当处理器对请求处理完毕后,向其他资源进行跳转时,有两种跳转方式:请求转发与重定向.而根据要跳转的资源类型,又可分为两类:跳转到页面与跳转到其他处理器.对于 ...
- Spring MVC入门
1.什么是SpringMvc Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 M ...
- Spring7:基于注解的Spring MVC(下篇)
Model 上一篇文章<Spring6:基于注解的Spring MVC(上篇)>,讲了Spring MVC环境搭建.@RequestMapping以及参数绑定,这是Spring MVC中最 ...
随机推荐
- 转: 如何实现jQuery的Ajax文件上传
[PHP文件上传] 在开始之前,我觉得是有必要把通WEB上传文件的原理简单说一下的.实际上,在这里不管是PHP,JSP,还是ASP处理上传的文件,其实都是WEB早已把文件上传到服务器了,我们只是运用上 ...
- 转:按需加载html 图片 css js
按需加载是前端性能优化中的一项重要措施,按需加载是如何定义的呢?顾名思义,指的是当用户触发了动作时才加载对应的功能.触发的动作,是要看具体的业务场景而言,包括但不限于以下几个情况:鼠标点击.输入文字. ...
- poj 3053 Fence Repair(优先队列)
题目链接:http://poj.org/problem?id=3253 思路分析:题目与哈夫曼编码原理相同,使用优先队列与贪心思想:读入数据在优先队列中,弹出两个数计算它们的和,再压入队列中: 代码如 ...
- Part Acquisition(spfa输出路径)
Part Acquisition Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4080 Accepted: 1742 ...
- C++数据结构之图
图的实现是一件很麻烦的事情,很多同学可能在学数据结构时只是理解了图的基本操作和遍历原理,但并没有动手实践过.在此,我说说我的实现过程. 首先,在草稿纸上画一个图表,这里是有向图,无向图也一样,如下: ...
- NYoj-街区最短路径问题
街区最短路径问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描写叙述 一个街区有非常多住户,街区的街道仅仅能为东西.南北两种方向. 住户仅仅能够沿着街道行走. 各个街道之 ...
- ThinkPHP - F函数,更新配置文件
Html代码: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset=&quo ...
- 【IE】浏览器模式与文档模式 及其开发中处理方式
原文:http://blog.csdn.net/neo_liu0000/article/details/7589731 什么是浏览器模式和文本模式? 经常使用IE开发者工具的同学,肯定见过浏览器模式和 ...
- iOS 开发设计常用软件及工具整理
1, xCode 2, AppCode 3, Skech 原型设计软件 4, Hype 动画设计工具 5, fontawsome 免费图表 6, Prepo icon, images.catlog 生 ...
- [javascript]一种兼容性比较好的简单拖拽
作为一个马上要找工作.非计算机专业.热爱前端的大四狗,最近开始疯狂写demo.看书,准备九.十月份的校招. 晚上用js实现了一个比较简单(low)的拖拽效果,初步测试兼容性还是不错的,于是写一段小博文 ...