Spring MVC 遇到的一点点问题(转)

 今天下午下班之前看了看凯歌给的Spring Training的教程的lab篇,我之前有跟着做没有遇到什么问题,但是到了跟Spring MVC integrating的时候,遇到一点点有趣的事情。 这个例子很简单,我照着网上的demo做,然后遇到了点问题,请看下面:项目层次 很简单  
   
然后是web.xml的配置 

Java代码  

  1.   <servlet>  
  2.     <servlet-name>SpringMvcDemo</servlet-name>  
  3.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  4.     <init-param>  
  5.        <param-name>contextConfigLocation</param-name>   
  6.     <param-value>   
  7.         /WEB-INF/servlet-config.xml   
  8.     </param-value>         
  9.     </init-param>  
  10.      <load-on-startup>1</load-on-startup>  
  11. </servlet>  
  12.   
  13. <servlet-mapping>  
  14.     <servlet-name>SpringMvcDemo</servlet-name>  
  15.     <url-pattern>/*</url-pattern>  
  16. </servlet-mapping>  

你可以看到这很简单,定义了上下文以及FrontController拦截的请求地址,不过需要注意的我这里的是匹配所有URL请求,包括**.jsp和什么静态的**.png等等--这一点非常重要。 
   然后是servlet-config.xml 那就跟简单了,主要是一个包扫描,因为我这里的controller都是使用annotation,然后是一个render jsp的view resolver。 

Java代码  

  1. <context:component-scan base-package="ht.clark.web" />    
  2. <!-- View Resolver  -->  
  3. <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">      
  4.     <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>  
  5.  <property name="prefix" value="/WEB-INF/jsp/"/>  
  6.  <property name="suffix" value=".jsp"></property>  
  7. </bean>  

最后便是位于ht.clark.web包下的HomeController: 

Java代码  

  1. @Controller  
  2. public class HomeController {  
  3.       
  4.     @RequestMapping(value="/hi.html",method=RequestMethod.GET)  
  5.     public ModelAndView Greeting(){  
  6.         ModelAndView model = new ModelAndView("greeting");  
  7.         model.addObject("msg" , "Hello to Andy Clark");  
  8.         return model;  
  9.     }   
  10. }  

需要注意的是@RequestMapping配置触发这Greeting方法的来源url,也就是浏览器输入http://localhost:8080/SpringMvcDemo/hi.html将会由dispatcher分配到这方法来处理请求。 
那显示结果的JSP页面也很简单--注意使用了Jstl来解析 

Java代码  

  1.  <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>  
  2. <html>  
  3. <body>  
  4.     <h1>This is my message: ${msg}</h1>  
  5. </body>  
  6. </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]

Java代码  

  1. 2010-8-17 0:55:30 org.springframework.web.servlet.DispatcherServlet noHandlerFound  
  2.  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 里面提供的解决方案是将

Java代码  

  1. <servlet-mapping>  
  2.        <servlet-name>SpringMvcDemo</servlet-name>  
  3.        <url-pattern>/*</url-pattern>  
  4.    </servlet-mapping>  

改为

Java代码  

  1. <servlet-mapping>  
  2.        <servlet-name>SpringMvcDemo</servlet-name>  
  3.        <url-pattern>*.html</url-pattern>  
  4.    </servlet-mapping>  

--也就是将match everything该为match仅以html结尾的url请求。 
  And it works !! 
为什么了? 我看后面的回答: 

引用

When you set the url-pattern to /* then all requests will be sent to that DispatcherServlet, which includes the request for JSP rendering. Though it's not true, it's sometimes useful to think of the InternalResourceView (and derived like JstlView) as another HTTP request, since that way you'll see why a request for the JSP is getting picked up by the DispatcherServlet. – ptomli Aug 12 '09 at 15:16 
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

 

时间: 2024-09-20 04:21:26

Spring MVC 遇到的一点点问题(转)的相关文章

SI 系列入门 之 手把手构建 Spring MVC 工程

SI 系列入门 之 手把手构建 Spring MVC 工程 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. SI 前文有述,Spring MVC + MyBatis 的简称,因为 Spring

Spring MVC中的MultiActionController用法详解

Spring MVC 中 Controller 的层次实在是多,有些眼花缭乱了 .在单个的基础上,再新加两三个叫做丰富,再多就未必是好事, 反而会令人缩手新闻片脚,无从定夺.多数 Controller 都是只完 成一个任务,不过也有一个像 Struts 的 DispatchAction 的那样 的 Conntroller, org.springframework.web.servlet.mvc.multiaction.MultiActio nController,意即在一个 Controller

深入整体分析Spring MVC framework

在当今的MVC framework里,似乎Webwork2逐渐成为主流, Webwork2+SpringFramework的组合变得越来越流行.这似乎意味着Spring自带的MVC framework远比Webwork2差,所以大家纷纷用Webwork2来代替.确实,Spring的MVC framework不算是整个Spring的核心部件,但它的威力却超过了很多人的想象.很多人包括xiecc认为Spring的MVC framework是非常优秀的,甚至比Webwork2更优秀. 下面列举一下Sp

Spring MVC框架的高级配置

高级 本文将为您提供关于Spring MVC框架的配置技巧,以帮助管理基于Spring的web应用程序的多个实例.本配置管理主题常被学术界所忽略,但是,这对于现实的web开发尤为重要.本主题并不直接关联任何具体的技术,因此,我们将从最基本的概念开始对这个问题进行说明.下面,我们将根据Spring MVC框架,为基于本技术开发的项目提供一系列的解决方案. Spring配置 人们经常会在一台以上的主机上配置一种Web应用程序.例如,在生产中,一个网站可能只有一个实例.除了此实例外,开发人员可以在用于

Spring MVC 开发快速入门

快速入门 这篇文章将教你快速地上手使用 Spring 框架,如果你手上有一本<Spring in Action>, 那么你最好从第三部分"Spring 在 Web 层的应用--建立 Web 层"开始看, 否则那将是一场恶梦! 首先, 我需要在你心里建立起 Spring MVC 的基本概念. 基于 Spring 的 Web 应用程序接收到 http://localhost:8080/hello.do(事实上请求路径是 /hello.do) 的请求后, Spring 将这个请求

深入Spring MVC framework之总体分析

在当今的MVC framework里,似乎Webwork2逐渐成为主流, Webwork2+SpringFramework的组合变得越来越流行.这似乎意味着Spring自带的MVC framework远比Webwork2差,所以大家纷纷用Webwork2来代替.确实,Spring的MVC framework不算是整个Spring的核心部件,但它的威力却超过了很多人的想象.很多人包括xiecc认为Spring的MVC framework是非常优秀的,甚至比Webwork2更优秀. 下面列举一下Sp

如何通过spring mvc接收页面表单List

最近在用Spring mvc时遇到一个问题,在网上搜了很多资料.几乎没看到解决办法! 例如:当我们在做批量添加或者更新时,在Controller层接收表单数据的问题! 我们做一个对用户批量添加的实验! 用户Model: public class User { //用户名 private String username; //密码 private String password; public String getUsername() { return username; } public voi

Spring MVC与JAX-RS比较与分析

导言 过去几年,REST逐渐成为影响Web框架.Web协议与Web应用设计的重要概念. 现在有越来越多的公司希望能以简单而又贴合Web架构本身的方式公开Web API,因此REST变得越来越 重要也就不足为奇了.使用Ajax进行通信的富浏览器端也在朝这个目标不断迈进.这个架构原则提升了万 维网的可伸缩性,无论何种应用都能从该原则中受益无穷. JAX-RS(JSR 311)指的是Java API for RESTful Web Services,Roy Fielding也参与了JAX-RS的制 订

Apache Geronimo和Spring框架,第6部分:Spring MVC:使用Web视图技术

简介:本教程是系列教程(共六部分)的最后一部分,向您展示了如何利用 Spring 框架来使用 JavaServer Page(JSP).Velocity.Tile 和 PDF 导出功能.您将用 Model-View-Controller (MVC)中的 V 做试验,即 Spring MVC 中内置的各种 Web 视图.通过对 Spring MVC 所支持的各种视 图技术的全面介绍,您将看到在整个系列教程中构建的样例电话本应用程序中实现这些技术有多么轻松. 开始之前 本系列教程适合于需要了解 Sp