在写这篇文章之前,xxx已经写过了几篇关于改控制器框架主题的文章,想要了解的朋友可以去翻一下之前的文章

Struts1无疑是一个灰常经典的MVC框架,在Struts有前端控制器和业务控制器的概念。那么这两个控制器的实质又是什么呢?让我来带你一步步走进它的世界。

前端控制器ActionServlet的职责:

1、通过对拜访路径的截取

2、根据截取的路径,实例化响应的业务控制器

业务控制器Action的职责:

1、获取参数

2、调用业务逻辑

3、实现转向

下面,给大家看一个比较简单的struts的MVC框架的实现

Action:

public interface Action {public String execute(HttpServletRequest request, HttpServletResponse response)   throws Exception;
}public class AddUserAction implements Action {public String execute(HttpServletRequest request,HttpServletResponse response) throws Exception {String username = request.getParameter("username");//调用业务逻辑UserManager userManager = new UserManager();userManager.add(username);return "/add_success.jsp"; //转向路径可以通过配置文件读取}
}

ActionServlet:

每日一道理
在每个人心中,都曾停留过那些值得怀念的人,也许还在,也许早已消逝,在茫茫人海中丢失,于是,那份怀念便得凄凉,因为模糊的记忆中只剩下一个“空壳”,没有什么,甚至连自己的心都装不下,时间把一切抹平,也把当日的泪水封锁,因为已经没有,怀念只是悲凉!
public class ActionServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {//截取拜访的URIString requestURI = request.getRequestURI();//对URI停止截取,例如localhost:8080//test/addUser.do,截取后就是/addUserString path = requestURI.substring(requestURI.indexOf("/", 1), requestURI.indexOf("."));Action action = null;if ("//addUser".equals(path)) {action = new AddUserAction();}else {throw new RuntimeException("请求失败");}String forward = null;try {forward = action.execute(request, response);} catch (Exception e) {e.printStackTrace();}request.getRequestDispatcher(forward).forward(request, response);}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doGet(request, response);}
}

但是现在还有一些问题,就是当增加一个业务逻辑的时候,我们就不得不修改ActionServlet,违背了设计模式中的开闭准则。在设计模式中有这样一句话,凡是有if...else...和switch..case...语句的地方,就可以通过反射来消除。

struts恰是通过一个struts-config.xml来消除了ActionServlet中的if...else...语句,使得ActionServlet更加具有通用性,从而开发人员只需要编写Action,然后配置到xml文件中便可。

静下心来想,实质上不就是一个策略模式的调用么?回首之前做过的系统,要想系统变的灵活,其实就是一个又一个策略模式的应用。策略加反射的结合通常是一个框架的核心组成。

至此,对于策略模式的懂得便不得不深入一下了。

最最开始接触策略模式的时候,是这样懂得的:对于一件事的不同做法。而这一件事现在的懂得是具体的事情,例如付款可以由用信用卡,现金,支票等。而对于付款和用饭这两件事,就不会想到这是一件事。其实这只是粒度大小的不同而已。

如果提升到这都是人的一个活动层次上呢?两者是不是就可以说是一件事,不同的处置方法了呢?

struts就是这样做的,把所有的请求抽取一个接口Action,需要修改的方法为execute(),这些就是Struts的核心思想,其他的Struts核心对象在下篇博客中将会逐一论述。

应用框架会影响程序的效率,但是以现在硬件的水平,这些效率问题不再是重要问题,规范性开发被奉为最高纲领。软件开发从最初起码代码到现在规范性开发,这不得不赞叹计算机开展的速度。

文章结束给大家分享下程序员的一些笑话语录: 古鸽是一种搜索隐禽,在中国快绝迹了…初步的研究表明,古鸽的离去,很可能导致另一种长着熊爪,酷似古鸽,却又习性不同的猛禽类——犤毒鸟

控制器框架Struts与策略模式那点事相关推荐

  1. 设计模式-组合+策略模式

    实现一个中间部件对象,也就是可以添加叶子节点的对象,最终这个中间件部件装载在根form对象上.这个中间件的好处是可以按照实际业务需求进行分组.本例中划分了三种业务,分别是名字分组,地址分组和测试分组. ...

  2. 利用策略模式结合alibaba/alpha框架优化你的图片上传功能

    图片上传作为一个App经常用到的功能,项目中可以使用各种成熟的框架去完成,但往往实际的情况比想象的复杂.假设我们的上传功能需要满足下面的情况: 支持上传一张图 支持上传多张图 上传多张图时能获取到每张 ...

  3. C++设计模式-使用Qt框架模拟策略模式(Strategy)+简单工厂实现商场促销

    商城促销: 1.简单工厂模式:客户端认识两个类,CashSuper与CashFactory 2.简单工厂模式 + 策略模式:客户端只要认识CashContext就可以了,更加降低耦合性 策略模式解析: ...

  4. C++设计模式-使用Qt框架模拟策略模式(Strategy)商场促销

    UML图如下: 如果单使用策略模式,会出现这个问题: 客户端判断使用哪个算法! 这里可以用简单工厂与策略模式结合! 运行截图如下: 源码如下: cash.h #ifndef CASH_H #defin ...

  5. 基于Tiles框架Struts框架的UI 设计—几种组织HTML和JSP视图组件

    摘要每个web应用开发者一定组织视图组件,例如  页首,正文体和页尾. 有许多技术可以组织这些组件, 但每个都有优缺点.这篇文章包括了7个可用的解决方案并让你了解 Tiles框架和Struts框架的灵 ...

  6. .NET简谈设计模式之(策略模式)

    策略模式在我们日常开发中经常被用到,这篇文章不是策略模式的深入讨论和学术研究,只是让初学者能有个基本的了解. 什么叫策略:1. 可以实现目标的方案集合:2. 根据形势发展而制定的行动方针和斗争方法:3 ...

  7. else 策略模式去掉if_设计模式(三)——简单的状态模式代替if-else

    博主将会针对Java面试题写一组文章,包括J2ee,SQL,主流Web框架,中间件等面试过程中面试官经常问的问题,欢迎大家关注.一起学习,一起成长. 前言 大多数开发人员现在还在使用if else的过 ...

  8. 实践:使用Spring 原生注解来快速实现 策略模式 + 工厂模式

    作者:Richard_Yi juejin.im/post/5db0e910518825648f2ef355 前言 这阵子在做项目组重构的工作,工作中的一部分就是就目前代码库中与企业交互的逻辑抽离出来, ...

  9. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)

    Java设计模式Ⅶ 1.备忘录模式 1.1 备忘录模式概述 1.2 代码理解 2.解释器模式 2.1 解释器模式概述 3.状态模式 3.1 状态模式概述 3.2 代码理解 4.策略模式 4.1 策略模 ...

最新文章

  1. 闲话能力管理(Capacity Management)
  2. ios 常用数学函数
  3. 前端_JavaScript_面向对象编程
  4. 玩转 React(四)- 创造一个新的 HTML 标签
  5. C语言-- 大端小端详解
  6. 厉害了!90后奥运冠军被北大录取
  7. HDU1976 Software Version【水题】
  8. Arturia SQ80 V for Mac 音频波形合成器
  9. CTP Java 版(Swig)
  10. html打开本地excel文件夹,html使用excel表格数据库-html读取本地excel文件并展示
  11. 如何阅读mysql源代码_我是如何开始阅读MySQL源码的?
  12. java中文转繁体汉字
  13. 局域网中文件共享方案介绍(Win10版)
  14. nodejs之koa配置koa-views中间件
  15. android手机 联系人迁移,有什么软件能快速将手机通讯录的联系人传到另一个手机上...
  16. 亲历医院蹩脚程序(项目)的糟糕
  17. 新一配:一篇看懂加油站产业链解决方案
  18. 鸿蒙系统怎么安装 google play
  19. violate,synchronized
  20. 算法:分治法之合并排序

热门文章

  1. postgresql 基础sql
  2. nagios监控远程端口
  3. CmsEasy20160825前台无限制GetShell复现
  4. 使用 xcode 8 构建版本 iTunes Connect 获取不到应用程序的状态的解决办法
  5. block的一些注意事项
  6. 肢解“文件夹图标”病毒,制作专杀工具——“郑大扫帚”
  7. 一步一步学linq to sql(四)查询句法
  8. centos 服务详解
  9. Unity3D中暂停时的动画及粒子效果实现
  10. sbt+Scala IDE建立Scala项目