简单深入 SpringMvc
一、如何让一个普通类成为 Controller?
方案一:实现接口 Controller
解析:handleRequest(request,response)
方案二:继承 AbstractController
解析:handleRequestInternal(request,response)
若处理器继承自 AbstractController 类,那么该控制器就具有了一些新功能。因为 AbstractController 类还继承自一个父类 webContentGenerator,WebContentGenerator 具有 supportMethods 属性
部分源码实现:
原理:
发现 AbstractController 类中有一个 handleRequest() 方法,用到了模板方法设计模式。
保证该方法中去调度了一个抽象方法。抽象方法在子类中根据业务需求被重写。
二、如果想在一个 Controller 中定义 N 个方法,让他们分别执行,如何实现?[继承自 MultiActionController]
其次该如何去匹配这些方法?在这里引出一个方法名称解析器 [MethodNameResolver]。
作用:将 url 地址中的资源路径和方法名称做一一对应
在 MultiActionController 中有一个成员变量
private MethodNameResolver methodNameResolver = new InternalPathMethodNameResolver();
MethodNameResolver 接口:
两大实现类:
①InternalPathMethodNameResolver--- 在请求地址中指定方法名称
②PropertyMethodNameResolver
第一种方案关键代码:[InternalPathMethodNameResolver]
- <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- <property name="mappings">
- <props>
- <prop key="/*.do">
- firstController
- </prop>
- </props>
- </property>
- </bean>
- <!-- 默认方法名称解析器-->
- <bean id="nameResolver" class="org.springframework.web.servlet.mvc.multiaction.InternalPathMethodNameResolver">
- </bean>
- <bean id="firstController" class="cn.happy.controller.MyMultiController">
- <property name="methodNameResolver" ref="nameResolver">
- </property>
- </bean>
第二种方案关键代码:[PropertyMethodNameResolver]
- <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- <property name="mappings">
- <props>
- <prop key="/*.do">
- firstController
- </prop>
- </props>
- </property>
- </bean>
- <!-- 方法名称解析器 -->
- <bean id="nameResolver" class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
- <property name="mappings">
- <props>
- <prop key="/h1.do">
- list
- </prop>
- <prop key="/h2.do">
- add
- </prop>
- </props>
- </property>
- </bean>
- <bean id="firstController" class="cn.happy.controller.MyMultiController">
- <property name="methodNameResolver" ref="nameResolver">
- </property>
- </bean>
三、参数方法名称解析器 [ParameterMethodNameResolver]
关键代码:
- <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
- <property name="mappings">
- <props>
- <prop key="/hello.do">
- firstController
- </prop>
- </props>
- </property>
- </bean>
- <!-- 参数方法名称解析器 默认的是action-->
- <bean id="nameResolver" class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
- <property name="paramName" value="actionName">
- </property>
- </bean>
- <bean id="firstController" class="cn.happy.controller.MyMultiController">
- <property name="methodNameResolver" ref="nameResolver">
- </property>
- </bean>
四、通过视图解析器引入外部或内部资源对象
- <!-- 内部资源对象 -->
- <bean id="internal" class="org.springframework.web.servlet.view.JstlView">
- <property name="url" value="/WEB-INF/jsp/index.jsp"></property>
- </bean>
- <!-- 外部资源对象 -->
- <bean id="jd" class="org.springframework.web.servlet.view.RedirectView">
- <property name="url" value="http://www.jd.com"></property>
- </bean>
- <!-- 视图解析器 -->
- <bean class="org.springframework.web.servlet.view.BeanNameViewResolver"></bean>
- <!-- 处理器配置 -->
- <bean id="/hello.do" class="cn.happy.controller.MyController"></bean>
来源: