SpringMVC自定义处理器里的那些事

时间:2025-01-17 18:37:56

一、如何让一个普通类成为Controller?

①:实现接口Controller
  解析:handleRequest(request,response)

②:继承AbstractController

  解析:handleRequestInternal(request,response)

若处理器继承自AbstractController类,那么该控制器就具有了一些新功能。因为AbstractController类还继承自一个父类WebContentGenerator,WebContentGenerator具有supportMethods属性

部分源码实现:

原理:
发现AbstractController类中有一个handleRequest()方法,用到了模板方法设计模式。
保证该方法中去调度了一个抽象方法。抽象方法在子类中根据业务需求被重写。

SpringMVC自定义处理器里的那些事

SpringMVC自定义处理器里的那些事


SpringMVC自定义处理器里的那些事

applicationContext.xml:

SpringMVC自定义处理器里的那些事

SpringMVC自定义处理器里的那些事

SpringMVC自定义处理器里的那些事


还可以设置支持的HTTP数据提交方式。默认支持GET/POST/HEAD,限定请求提交方式。

SpringMVC自定义处理器里的那些事

SpringMVC自定义处理器里的那些事

地址栏默认的是GET请求,输入的Post请求则报405。(高大上的405)

SpringMVC自定义处理器里的那些事


二、如果想在一个Controller中定义N个方法,让他们分别执行,如何实现?[继承自MultiActionController]

SpringMVC自定义处理器里的那些事

其次该如何去匹配这些方法?在这里引出一个方法名称解析器[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>

  

SpringMVC自定义处理器里的那些事

第二种方案关键代码:[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>

实现效果: 

SpringMVC自定义处理器里的那些事

SpringMVC自定义处理器里的那些事


三、参数方法名称解析器 [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>

SpringMVC自定义处理器里的那些事

注:不指定paramName,默认是action。

SpringMVC自定义处理器里的那些事

SpringMVC自定义处理器里的那些事


四、通过视图解析器引入外部或内部资源对象

<!-- 内部资源对象 -->
<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>

SpringMVC自定义处理器里的那些事

外部资源对象实现效果:跳转到京东首页:

SpringMVC自定义处理器里的那些事


SpringMVC自定义处理器里的那些事

内部资源对象实现效果:

SpringMVC自定义处理器里的那些事


只有创造,才是真正的享受,只有拚搏,才是充实的生活。

                --- 享受生活