3、Eternal框架-控制器
2019獨角獸企業重金招聘Python工程師標準>>>
介紹
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
總結
以上是生活随笔為你收集整理的3、Eternal框架-控制器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css怎么把背景图片拉伸至100%
- 下一篇: latex 如何添加圆圈数字?