SpringMVC适配器模式代码示例

此处采用了适配器模式, 由于Controller的类型不同,有多重实现方式,那么调用方式就不是确定的,如果需要直接调用Controller方法,需要在代码中写成如下形式:

if(mappedHandler.getHandler() instanceof MultiActionController){
  ((MultiActionController)mappedHandler.getHandler()).xxx
}else if(mappedHandler.getHandler() instanceof XXX){
  ...
}else if(...){
  ...
}

这样假设如果我们增加一个HardController,就要在代码中加入一行 if(mappedHandler.getHandler() instanceof HardController)
这种形式就使得程序难以维护,也违反了设计模式中的开闭原则 -- 对扩展开放,对修改关闭。

因此Spring定义了一个适配接口,使得每一种Controller有一种对应的适配器实现类,
让适配器代替controller执行相应的方法。这样在扩展Controller 时,只需要增加一个适配器类就完成了SpringMVC的扩展了,真的是很精巧的做法!

废话不多说还是上代码吧,为了看得清楚,就自己实现一套代码来模拟springMVC, 直接贴Spring源码容易降低关注点。

//定义一个Adapter接口
public interface HandlerAdapter {
	public Boolean supports(Object handler);
	public void handle(Object handler);
}
//以下是三种Controller实现
public interface Controller {
}
public class HttpController implements Controller{
	public void doHttpHandler(){
		System.out.println("http...");
	}
}
public class SimpleController implements Controller{
	public void doSimplerHandler(){
		System.out.println("simple...");
	}
}
public class AnnotationController implements Controller{
	public void doAnnotationHandler(){
		System.out.println("annotation...");
	}
}
//下面编写适配器类
public class SimpleHandlerAdapter implements HandlerAdapter {
	public void handle(Object handler) {
		((SimpleController)handler).doSimplerHandler();
	}
	public Boolean supports(Object handler) {
		return (handler instanceof SimpleController);
	}
}
public class HttpHandlerAdapter implements HandlerAdapter {
	public void handle(Object handler) {
		((HttpController)handler).doHttpHandler();
	}
	public Boolean supports(Object handler) {
		return (handler instanceof HttpController);
	}
}
public class AnnotationHandlerAdapter implements HandlerAdapter {
	public void handle(Object handler) {
		((AnnotationController)handler).doAnnotationHandler();
	}
	public Boolean supports(Object handler) {
		return (handler instanceof AnnotationController);
	}
}
//模拟一个DispatcherServlet
import java.util.ArrayList;
import java.util.List;
public class DispatchServlet {
	public static List<HandlerAdapter> handlerAdapters = new ArrayList<HandlerAdapter>();
	public DispatchServlet(){
		handlerAdapters.add(new AnnotationHandlerAdapter());
		handlerAdapters.add(new HttpHandlerAdapter());
		handlerAdapters.add(new SimpleHandlerAdapter());
	}
	public void doDispatch(){
		//此处模拟SpringMVC从request取handler的对象,仅仅new出,可以出,
		//不论实现何种Controller,适配器总能经过适配以后得到想要的结果
		//   HttpController controller = new HttpController();
		//   AnnotationController controller = new AnnotationController();
		SimpleController controller = new SimpleController();
		//得到对应适配器
		HandlerAdapter adapter = getHandler(controller);
		//通过适配器执行对应的controller对应方法
		adapter.handle(controller);
	}
	public HandlerAdapter getHandler(Controller controller){
		for (HandlerAdapter adapter: this.handlerAdapters){
			if(adapter.supports(controller)){
				return adapter;
			}
		}
		return null;
	}
	public static void main(String[] args){
		new DispatchServlet().doDispatch();
	}
}

通过这个模式可以看出开源代码中的精妙,我们在看框架源码时需要有目标的看,这样会找到很多自己需要学习的东西,目前很多分析源码的帖子大部分是讲解what,how,

以此来抛砖引玉,希望各位能够一起来讨论“why”

总结

以上就是本文关于SpringMVC适配器模式代码示例的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

时间: 2017-11-26

SpringMVC开发restful API之用户查询代码详解

一,什么是restful风格? 首先,我们来看几组例子. 传统的url: 查询 /user/query?name=tom GET 详情 /user/query?id=1 GET 创建 /user/create?name=tom POST 修改 /user/update?id=1&name=jerry POST 删除 /user/delete?id=1 GET restful风格的url: 查询 /user?name=tom GET 详情 /user/1 GET 创建 /user POST 修改

SpringMVC拦截器实现单点登录

单点登录的功能在实际的应用场景中还是很重要的,逻辑上我们也不允许一个用户同时在进行着两个操作,下面就来了解一下SpringMVC的单点登录实现 SpringMVC的拦截器不同于Spring的拦截器,SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServlet,所以只需要在DispatcherServlet上做文章即可,DispatcherServlet也没有代理,同时SpringMVC管理的Controller也不有代理. 1,先探究一个

springmvc Rest风格介绍及实现代码示例

简介 REST 即 Representational State Transfer.(资源)表现层状态转化.是目前最流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便,所以正得到越来越多网站的采用,POST, DELETE, PUT, GET 分别对应 CRUD.Spring3.0 开始支持 REST 风格的请求,是通过 org.springframework.web.filter.HiddenHttpMethodFilter 把 POST 请求转化为 PUT 和 DELETE

Java编程实现springMVC简单登录实例

Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,Struts2等. 1.新建web项目:springmvc 2.导入springmvc需要的jar包 3.配置web.xml文件(核心代码)

java springmvc实现验证码功能

本文实例为大家分享了springmvc实现验证码功能展示的具体代码,供大家参考,具体内容如下 先看效果图: 思路: 首先验证码是一张图片,是一张有着随机字母.数字.图案等组成的图片,所以这图片肯定不是固定不变的,肯定是由后端随机制造出来的,前端用img的src去不断访问这个制造的方法. 第一步:前端页面编写 登录使用的是ajax方法,所以使用的是调用点击事件进行,验证码的图片放在a标签中是为了方便点击变换验证码.显示图片用的是img的src属性,因为使用的是spingmvc所以调用后台方法使用a

SpringMVC+Ajax实现文件批量上传和下载功能实例代码

今天做了文件的上传下载,小小总结一下,基本的web项目建立及SpringMVC框架搭建此处不详细写出来了. 上传form: <form id="uploadfiles" enctype="multipart/form-data"> <input type="file" multiple="multiple" id="file_upload" name="file_upload&q

SpringMVC拦截器实现监听session是否过期详解

本文主要向大家介绍了SpringMVC拦截器实现:当用户访问网站资源时,监听session是否过期的代码,具体如下: 一.拦截器配置 <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/user/login"/> <!-- 不拦截登录请求 --> <mvc:exclude-

Java SSM框架(Spring+SpringMVC+MyBatis)搭建过程

摘要: 这段时间搭建ssm环境,并测试几个下载的项目demo 安装相关文件: MyEclipse界面: 测试项目简单增删改: ssm+mysql+easyui项目: SSM+MYSQL+EXTJS项目 总结 以上所述是小编给大家介绍的Java SSM框架(Spring+SpringMVC+MyBatis)搭建过程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的.在此也非常感谢大家对我们网站的支持!

使用IDEA搭建SSM框架的详细教程(spring + springMVC +MyBatis)

1 框架组成 Spring SpringMVC MyBatis 2 所需工具 Mysql 8.0.15 ​数据库管理系统,创建数据库 Tomcat 8.5.51 ​用于部署web项目 Maven 3.6.1 ​项目构建.项目依赖管理 lombok 1.18.10(可用可不用工具) ​用于类注解创建setter.getter.无参构造.全参构造.toString等函数 ​注:只导入依赖,不安装插件是不起作用的 3 搭建步骤 3.1 新建一个空Maven项目,填写项目相关信息,完成 3.2 添加we

Spring+SpringMVC+MyBatis整合详细教程(SSM)

使用SSM(Spring.SpringMVC和Mybatis)已经有三个多月了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当然肯定有很多可以改进的地方.之前没有记录SSM整合的过程,这次刚刚好基于自己的一个小项目重新搭建了一次,而且比项目搭建的要更好一些.以前解决问题的过程和方法并没有及时记录,以后在自己的小项目中遇到我再整理分享一下.这次,先说说三大框架整合过程.个人认为使用框架并不是很难,关键要理解其思想,这对于我们提高编程水平很有帮助.不过,如果用都不会,谈思想就

Spring+SpringMVC+MyBatis深入学习及搭建(一)之MyBatis的基础知识

1.对原生态jdbc程序中问题总结 1.1 jdbc程序 需求:使用jdbc查询mysql数据库中用户表的记录 statement:向数据库中发送一个sql语句 预编译statement:好处:提高数据库性能. 预编译statement向数据库中发送一个sql语句,数据库编译sql语句,并把编译的结果保存在数据库砖的缓存中.下次再发sql时,如果sql相同,则不会再编译,直接使用缓存中的. jdbc编程步骤: 1. 加载数据库驱动 2. 创建并获取数据库链接 3. 创建jdbc statemen

Spring+SpringMVC+MyBatis深入学习及搭建(三)之MyBatis全局配置文件解析

前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(二)--MyBatis原始Dao开发和mapper代理开发 MyBatis的全局配置文件SqlMapConfig.xml,配置内容和顺序如下: properties(属性) setting(全局配置参数) typeAliases(类名别名) typeHandlers(类名处理器) objectFactory(对象工厂) plugins(插件) environments(环境集合属性对象) environment(环境子属性

Spring+SpringMVC+MyBatis深入学习及搭建(二)之MyBatis原始Dao开发和mapper代理开发

前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)--MyBatis的基础知识.MybatisFirst中存在大量重复的代码.这次简化下代码: 使用MyBatis开发Dao,通常有两种方法,即原始Dao开发方法和Mapper接口开发方法. 1.SqlSession使用范围 1.1 SqlsessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory,将SqlSessionFactoryBu

使用maven整合Spring+SpringMVC+Mybatis框架详细步骤(图文)

(项目结构图参照文章末尾) 1.创建maven工程,在pom.xml文件中导入需要的jar包依赖: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apach

AngularJS整合Springmvc、Spring、Mybatis搭建开发环境

最近想学习AngularJS的使用,网上搜了一圈后,折腾了半天解决bug后,成功使用AngularJS整合Springmvc.Spring.Mybatis搭建了一个开发环境.(这里Spring使用的版本是4.0.6,Mybatis版本是3.2.5,AngularJS的版本是1.0.3) 第一步:创建一Maven项目,在pom.xml下添加需要的包 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="

JavaWeb开发之Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架

简单介绍一下,本框架的基本功能点: Spring:整个框架的主体部分,这个自不用说. SpringMVC:MVC部分我还是比较喜欢Spring的. MyBatis:选型的时候选择这个ORM主要也是考虑其灵活性的问题,毕竟我也不知道,今后会遇到怎样的需求,用Hibernate一来是不太会用,二来,我还是比较喜欢直接写SQL来的简单一点. SpringSecurity:这个主要是安全框架,负责用户登录验证及整站权限分配的相关事项(权限分配真的很有用,这个我就不多说了). EhCache:一个非常流行

spring+springmvc+mybatis 开发JAVA单体应用

myshop 概述 myshop项目是根据视频教程 Java 单体应用 做的一个练习项目,目前完成了登录功能.用户管理.类别管理后续有时间会继续做其它的功能.趁着双11花了99元一年买了台阿里云服务器,演示地址>> myshop 项目地址  https://gitee.com/yehuabin/myshop 项目结构 my-shop-dependencies:管理jar包的版本,所有项目依赖此项目 my-shop-commons:项目通用工具.实体类 my-shop-domain: POJO类