`
wutao8818
  • 浏览: 607042 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

重头开始学 Spring JPetStore 4

阅读更多
跟踪一个  .do 请求吧

就它了。 Enter the Store      http://localhost:8080/jpetstore/shop/index.do

org.springframework.web.servlet.DispatcherServlet 动用了强大的handlerMapping 。

当然这个接口有很多实现。

引用


AbstractDetectingUrlHandlerMapping, AbstractHandlerMapping, AbstractPathMapHandlerMapping, AbstractUrlHandlerMapping, BeanNameUrlHandlerMapping, CommonsPathMapHandlerMapping, ControllerClassNameHandlerMapping, DefaultAnnotationHandlerMapping, SimpleUrlHandlerMapping




看看petstore-servlet.xml 用了哪个? 这里使用了org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping这个实现
,说白了其实它特单纯。也就是 /shop/index.do 这段作为对应处理Controller bean的那么属性。找找吧。是不是有个  name="/shop/index.do" bean

引用
<bean name="/shop/index.do" class="org.springframework.web.servlet.mvc.ParameterizableViewController">
<property name="viewName" value="index"/>
</bean>
 

对了,就是这个bean了。找到了吗。这个请求就被分发到了org.springframework.web.servlet.mvc.ParameterizableViewController 这个Controller也是个很单纯的控制器了。直接就转向一个viewName属性指定的index.jsp页面了。当然省略了一个过程。index怎么就到了index.jsp呢?

这个问题的答案在这里

引用
org.springframework.web.servlet.view.InternalResourceViewResolver



一个ViewResolver的实现。还有其他几个实现。

引用


AbstractCachingViewResolver, AbstractTemplateViewResolver, BeanNameViewResolver, FreeMarkerViewResolver, InternalResourceViewResolver, JasperReportsViewResolver, ResourceBundleViewResolver, UrlBasedViewResolver, VelocityLayoutViewResolver, VelocityViewResolver, XmlViewResolver, XsltViewResolver




它悄悄的做了手脚。

引用
<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/spring/"/>
<property name="suffix" value=".jsp"/>
</bean>


首先到 /WEB-INF/jsp/spring/ 里找 后缀..jsp 这就成了  /WEB-INF/jsp/spring/index.jsp了。完了,放松一下吧。一个请求到此已经结束了。是不是太快了。。。。


spring mvc 这部机器 说白了其实很简单,DispatcherServlet 把 HandlerMapping Controller ViewResolver 3个组件 组装在一起就完成了整个处理过程。

想起来就像人吃饭一样。把饭放入嘴巴,经过喉咙,然后到胃里,处理一下,再接着往下传,到肠子 最后把处理的结果 排泄出来。呵呵,恶心一把  
当然还吸收了一些,这就类似存了一些数据到数据库。说白了还真这么回事。

还以2个小细节,看到有部分的请求由另外一个HandlerMapping实现了。
引用
org.springframework.web.servlet.handler.SimpleUrlHandlerMapping


为什么他要第二个?看这个bean的id应该就能明白几分了。secureHandlerMapping,这些请求需要经过一个安全验证。这个安全验证通过 signonInterceptor 这个interceptors 插件插入到了 HandlerMapping 中。

引用

<bean id="signonInterceptor" class="org.springframework.samples.jpetstore.web.spring.SignonInterceptor"/>


关于这个插入的组件有很多文章提到它。也就是一个类似AOP或者filter的作用吧。看到一篇文章上提到 一点就是 interceptors比aop少了一个方式就是round环绕模式的实现。也就是无法把一个 前部分处理的变量  舒服的传递到 后部。

另外安全控制 如果在一个大一点的项目里,现在可以用 spring 另外一个独立的模块 ACEGI  Spring security 来做。

再一次可以看出来spring 真的是三头六臂的感觉,满身都是插口。到处都能安装插件。和变形金刚差不多了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics