控制器框架Struts与策略模式那点事

在写这篇文章之前,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 {
	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//截取拜访的URI
		String requestURI = request.getRequestURI();
		//对URI停止截取,例如localhost:8080//test/addUser.do,截取后就是/addUser
		String 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);
	}

	@Override
	protected 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核心对象在下篇博客中将会逐一论述。

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

    

    

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

原文地址:https://www.cnblogs.com/jiangu66/p/3086126.html