重头开始学 Spring JPetStore 4

本文详细解析了Spring MVC框架中的请求处理流程,包括DispatcherServlet如何利用HandlerMapping将请求映射到具体的Controller,以及ViewResolver如何解析视图名称为实际的视图资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

跟踪一个 .do 请求吧

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

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

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

[quote]

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

[/quote]


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

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

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

这个问题的答案在这里

[quote]org.springframework.web.servlet.view.InternalResourceViewResolver[/quote]


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

[quote]

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

[/quote]


它悄悄的做了手脚。

[quote]<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>[/quote]

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


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

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

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值