关于Spring 中的PortletModeHandlerMapping
关于Spring 中的PortletModeHandlerMapping
在Spring Portlet MVC中,我们可以用PortletModeHandlerMapping来将Portlet模式绑定到对应的Handler上,并且再这里可以声明拦截器,示例代码如下:
- <beanid="portletModeHandlerMapping"class="org.springframework.web.portlet.handler.PortletModeHandlerMapping">
- <propertyname="portletModeMap">
- <map>
- <entrykey="view">
- <beanclass="xx.xx.xx.envprovisioning.handlers.EnvProvisionFlowHandler"/>
- </entry>
- </map>
- </property>
- <propertyname="interceptors">
- <list>
- <refbean="envprovisionhandlerinterceptor"/>
- </list>
- </property>
- </bean>
我们结合框架代码来具体看下这个类是如何工作的。
从最基本的看,它是事先了spring mvc portlet的HandlerMapping 接口,这个接口主要定义了getHandler()方法:
- publicinterface HandlerMapping {
- HandlerExecutionChain getHandler(PortletRequest request) throws Exception;
- }
这个接口的getHandler()方法可以返回对于某种PortletRequest(RenderRequest,ActionRequest,ResourceRequest)的对应的处理方法,并且返回一个HandlerExecutionChain对象,我们可以根据自己的需要注册多个Handler(对应不同类型的PortletRequest)
而在PortletModeHandlerMapping的父类AbstractHandlerMapping中给出了getHandler()的默认实现:
- publicfinal HandlerExecutionChain getHandler(PortletRequest request) throws Exception {
- Object handler = getHandlerInternal(request);
- if (handler == null) {
- handler = getDefaultHandler();
- }
- if (handler == null) {
- returnnull;
- }
- // Bean name or resolved handler?
- if (handler instanceof String) {
- String handlerName = (String) handler;
- handler = getApplicationContext().getBean(handlerName);
- }
- return getHandlerExecutionChain(handler, request);
- }
从这里可以看出它会先调用getHandlerInternal(request), 这个方法是定义在AbstractMapBaseHandlerMapping类中,它用来从handlerMap中提取key(比如"view")等,然后,获取Value(Handler的类名) 。
然后在第10-14行,通过这个Handler的名字,来在Spring Application中建立起对应这个handler对应的bean,并且将控制权返回给执行Handler的执行链。
|
评论暂时关闭