3、Eternal框架-控制器

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

介绍

MVC:Model-View-Controller,包括三类对象,Model模型对象、View视图表示、Controller控制器。在应用MVC方式以前,通常将这三个对象的功能合到了一起,通过分离 模型、视图和控制器,可以更容易实现灵活性和可重用性。

view和model为观察者和被观察者关系。分离view和model对象,减少对象之间的藕和性,这样,当一个对象改变时,将不会影响到另外的对象,甚至不需要知道另外的对象的实现细节。

Controller定义了对用户输入的处理方式,指Web开发人员编写的处理不同URL。把用户输入的处理方式,封装为控制器。视图对象通过某一控制器对象的实例来实现特定的响应策略。为了实现不同的策略,可以简单的使用不同的控制器实例来替换当前的实例。甚至可以在运行时来改变视图的控制器,以改变视图对象对用户输入的响应。视图和控制器为策略模式关系。

IOC容器:依赖注入。由IOC容器来管理对象的生命周期、依赖关系等,从而使得应用程序的配置和依赖性规范与实际的应用程序代码分开。其中一个特点就是通过文本的配置文件进行应用程序组件间相互关系的配置,而不用重新修改并编译具体的代码。

拦截器:是AOP中的概念,它本身是一段代码,可以通过定义“织入点”,来指定拦截器的代码在“织入点”的前后执行,从而起到拦截的作用。

设计
前置控制器DispatcherServlet.java,他只干了2件事,1、负责初始化。2、接收所有的请求,给处理这。

初始化:DispatcherServlet初始化了系统编码等,控制器的初始化由持有者完成。看下DispatcherServlet.java代码:

package cn.eternal;import java.io.IOException;import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;import cn.eternal.config.Config;public class DispatcherServlet extends GenericServlet {private final Log log = LogFactory.getLog(getClass());private Dispatcher dispatcher;@Overridepublic void init(final ServletConfig config) throws ServletException{super.init(config);log.info("Init Config...");this.dispatcher = new Dispatcher();this.dispatcher.init(new Config() {public String getInitParameter(String name) {return config.getInitParameter(name);}public ServletContext getServletContext() {return config.getServletContext();}});}@Overridepublic void service(ServletRequest req, ServletResponse resp) throws IOException{HttpServletRequest httpReq = (HttpServletRequest) req;HttpServletResponse httpResp = (HttpServletResponse) resp;String method = httpReq.getMethod();if ("GET".equals(method) || "POST".equals(method)) {dispatcher.service(httpReq, httpResp);}else{httpResp.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);}}@Overridepublic void destroy() {this.dispatcher.destroy();}
}
Dispatcher.java

package cn.eternal;import java.io.IOException;import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.digester.Digester;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xml.sax.SAXException;import cn.eternal.config.CommonsConfig;
import cn.eternal.config.Config;
import cn.eternal.container.Container;
import cn.eternal.handler.Handler;
import cn.eternal.util.CommonUtil;class Dispatcher {private final Log log = LogFactory.getLog(getClass());private ServletContext servletContext;public void init(Config config) throws ServletException {this.servletContext = config.getServletContext();try {String maxFileSize = config.getInitParameter("max_file_size");if (maxFileSize!=null) {try {long n = Long.parseLong(maxFileSize);if (n<=0)throw new NumberFormatException();log.info("Init max_file_size "+n);CommonsConfig.setMaxFileSize(n);}catch (NumberFormatException e) {log.warn(" Init Invalid max_file_size value '" + maxFileSize + "', using default.");}}String encoding = config.getInitParameter("encoding");if(encoding!=null){log.info("Init encoding "+encoding);CommonsConfig.setEncoding(encoding);}String systemTitle = config.getInitParameter("system_title");if(systemTitle!=null){log.info("Init system_title "+systemTitle);CommonsConfig.setEncoding(systemTitle);}initDatabase();Container.init(config);}catch (Exception e) {throw new ServletException("DispatcherServlet init failed.", e);}}private void initDatabase() {try {Digester digester = new Digester();digester.setValidating(false);digester.addObjectCreate("database", "cn.eternal.config.CommonsConfig");digester.addCallMethod("database/database", "setDatabase", 0);digester.addCallMethod("database/driver", "setDriver", 0);digester.addCallMethod("database/login", "setLogin", 0);digester.addCallMethod("database/password", "setPassword", 0);String contextRealPath = servletContext.getRealPath("/");String prefix = CommonUtil.replaceAllOccurances(contextRealPath, "\\", "/");if (prefix.endsWith("/")) {prefix = prefix.substring(0, prefix.length() - 1);}digester.parse(prefix+"/WEB-INF/db.xml");log.info("Init Database Success");} catch (IOException e) {log.error("Init Database 错误,没有找到/WEB-INF/db.xml文件。", e);} catch (SAXException e) {log.error("Init Database 文件db.xml中包含错误信息。"+e.getMessage(), e);}}public void service(HttpServletRequest req, HttpServletResponse resp){String url = req.getRequestURI();log.info("Handle Url "+url);String path = req.getContextPath();if (path.length()>0){url = url.substring(path.length());}Handler handler = new Handler();try {handler.handle(url,req, resp,servletContext);} catch (Exception e) {e.printStackTrace();}}public void destroy() {log.info("Destroy Dispatcher...");Container.destroy();}
}


 

转载于:https://my.oschina.net/eternal/blog/100620

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java配置JDK

1、将JDK文件拷入电脑并解压缩 根据系统版本选择JDK版本&#xff0c;并将eclipse解压缩 2、配置系统环境变量 右键我的电脑--属性--高级系统设置--环境变量 新建JAVA_HOME如图所示&#xff08;严格区分大小写&#xff09; 修改环境变量Path 在变量值一栏的最前面加上%JAVA_HOM…

可怕!原来我们看到的世界地图一直都是“错”的!多年的地理白学了...

▲ 点击查看几乎每个家庭都会有两张地图&#xff1a;一张世界地图&#xff0c;一张中国地图。薄薄的两张纸&#xff0c;蕴藏着让每个人学会“看世界”的磅礴力量。哈佛上一任校长&#xff0c;也是300多年来唯一一位女校长德鲁吉尔平福斯特&#xff08;Drew Gilpin Faust&#x…

C# 是否可以将 动态或匿名类型 转成 强类型 ?

咨询区 ProfK假如我有一个匿名类型或者动态类型&#xff0c;它的结构定义和我的一个强类型的结构是一致的&#xff0c;请问 C# 中是否有内置的方法可以强转为指定 强类型 &#xff1f;我知道可以使用 AutoMapper&#xff0c;但这有点重量级了&#xff0c;并且实现起来也稍微繁琐…

退火算法 matlab,模拟退火算法(MATLAB实现).pdf

退火,算法,实现退火,算法,实现退火,算法,实现模拟火算法(MATLAB 实现)实验用例&#xff1a;用模拟退火算法解决如下10 个城市的TSP 问题&#xff0c;该问题最优解为f opt 2.691 。表1 10 个城市的坐标城市 X 坐标 Y 坐标 城市 X 坐标 Y 坐标1 0.6683 0.2536 6 0.2293 0.76102 0…

sudo apt-get update

常见命令: sudo apt-get update sudo apt-get install gcc sudo apt-get install g++ gcc --version g++ --version 要用apt-get这种方式安装LAMP时,最好先运行下面在命令升级自己的系统这样是为了更新源,而如果你找的源不好,可能安装LMAP失败。#sudo apt-get update…

读jquery 权威指南[7]-性能优化与最佳实践

一、优化选择器执行速度 1. 优先使用ID选择器和标记选择器 使用选择器时应该首选ID选择器($("#id"))&#xff0c;其次是标记选择器&#xff08;$("div")&#xff09;&#xff0c;最后再选用class、属性等选择器。避免重复使用ID号修饰ID号&#xff0c;例如…

遍历某个文件夹下的所有文件并格式化显示出来

public class FileList { private static int num;//定义往下循环了多少层 public static void deepList(File file){ if (file.isFile() || file.listFiles().length0) { return; } else { File[] files file.listF…

Spring高级应用之注入各类集合

先定义一个测试类&#xff0c;由于本文将要介绍注入各种集合时如何配置&#xff0c;故这个类包含各种集合&#xff0c;类名和属性名不好取&#xff0c;没有特殊含义&#xff1a; ?123456789public class Test { private List<String> listTest; private Map<String, …

.NET 程序测试 Java 项目 log4j2 是否存在远程代码执行漏洞

最近两天被朋友圈的“Apache Log4j2 远程代码执行漏洞”刷屏了&#xff0c;主要是因为组件存在 Java JNDI 注入漏洞&#xff1a;当程序将用户输入的数据记入日志时&#xff0c;攻击者通过构造特殊请求&#xff0c;来触发 Apache Log4j2 中的远程代码执行漏洞&#xff0c;从而利…

matlab总最近邻法则,MATLAB中最近邻插值算法

一段时间后&#xff0c;我在MATLAB Image Processing Toolbox中通过了imresize功能的代码&#xff0c;为图像的最近邻插值创建了一个简化版本。以下是如何应用于您的问题&#xff1a;%# Initializations:scale [2 2]; %# The resolution scale factors: [rows columns]oldSize…

史上最牛的文科生:法学出身,却发明出十进制计算器,折磨无数人的微积分符号,跨界40多个领域惊艳学术圈

全世界只有3.14 % 的人关注了爆炸吧知识“世界上没有完全相同的两片树叶。”想必大家对这句话耳熟能详&#xff0c;但却不知道这名言背后的作者是谁吧&#xff1f;其实&#xff0c;他就是与牛顿争论微积分优先权大战中的大佬&#xff1a;莱布尼茨。博览群书 天赋异禀1646年&…

如何解决secureCRT里面的The remote system refused the connection.

不废话,先爆照 Ubuntu缺省安装了openssh-client,所以在这里就不安装了,如果你的系统没有安装的话,再用apt-get安装上即可。然后确认sshserver是否启动了: ps -e |grep ssh 如果只有ssh-agent那ss

为operamasks增加HTML扩展方式的组件调用

#为operamasks增加HTML扩展方式的组件调用##背景 之前的[博文](http://www.cnblogs.com/p2227/p/3540858.html)中有提及到&#xff0c;发现easyui中的combobox,datebox,layout都有效率问题&#xff0c;其中layout的问题在[这里](http://www.cnblogs.com/p2227/p/3541162.html)有…

python 带pydev的eclipse无法导入win32api包(或无法导入其他包)

需要重新配置pydev中的python解释器&#xff0c;因为它不会自动更新。 将原先的python.exe先remove掉&#xff0c;再重新new回来&#xff0c;new回来的时候会让你勾选system libs&#xff0c;把你想要更新的勾选上去就可以了。转载于:https://blog.51cto.com/xuewei/1111889

OC之非ARC环境下循环retain问题

观察上述情况&#xff0c;上述就是著名的循环引用问题&#xff0c;对于此类问题&#xff0c;“你包含我&#xff0c;我包含你”&#xff0c;里面相关的对象占用的内存永远回收不了&#xff0c;解决办法很简单&#xff0c;与常规方法不同。正常情况下&#xff0c;我们应在Person…

我的开源故事

| 作者&#xff1a;李扬| 编辑&#xff1a;钱奕| 设计&#xff1a;杨敏| 责编&#xff1a;钱英宇一、前 言我相信我与开源故事的开始并不是第一次用GitHub或者CSDN&#xff0c;而是突如其来的新冠疫情。2020年1月25日&#xff0c;大年初一&#xff0c;范晶晶的一条关于wuhan202…

matlab 类 使用,matlab中sortrows的用法

sortrows有三种用法&#xff1a;B sortrows(A)B sortrows(A,column)[B,index] sortrows(A,...)我们先创建一个矩阵Afloor(gallery(uniformdata,[6 7],0)*100);A(1:4,1)95; A(5:6,1)76; A(2:4,2)7; A(3,3)73A 95 45 92 41 13 1 8495 7 73 89 20 74 5295 7 73 5 19 44 2095 7 …

Spring+EhCache缓存实例(详细讲解+源码下载)

转载注明出处http://blog.csdn.net/u013142781 一、ehcahe的介绍 EhCache 是一个纯Java的进程内缓存框架&#xff0c;具有快速、精干等特点&#xff0c;是Hibernate中默认的CacheProvider。Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。…

大型打脸现场!被藐视的少女摇身一变成为“抽象代数之母”,哲学教授只能跪地喊爸爸...

全世界只有3.14 % 的人关注了爆炸吧知识今天小天要为大家介绍一位数学界的女神。在爱因斯坦、帕维尔亚历山德罗夫等人的眼中&#xff0c;她是数学史上最重要的女人&#xff0c;甚至被爱因斯坦称为数学界的雅典娜。她&#xff0c;就是诺特定理的提出者——艾米诺特。艾米诺特上学…

组策略应用之一:映射网络驱动器

在部署文件服务器时&#xff0c;我们经常会用映射网络驱动器的方法访问共享文件&#xff0c;但如果有新员工离职、调岗或更换电脑后&#xff0c;就不得不重新映射网络驱动器&#xff0c;在一定程度上即增加了系统管理员的工作负担&#xff0c;另外在一定程度上也会影响员工的工…