dreamvc框架(二),dreamvc的机制

上一篇文章点击打开链接,介绍了dreamvc的ioc容器集成,这一篇文章我将会给大家介绍dreamvc的机制,

大家都知道Struts2是由filter进入,然后进行分发的,而SpringMVC是由servlet进入然后进行分发的!对于不同的应用服务器,Filter的init函数的执行时间是不同的,例如:tomcat会在tomcat启动的时候执行init函数,而weblogic等一些其他的应用服务器则会在该Filter匹配的url被首次请求的时候加载。而且filte会在servlet前运行

dreamvc不想规定开发者必须由servlet进入还是由filte进入,dreamvc实现了两种方法。由开发者可以自由的选择,看下面的xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<!-- 配置文件位置,默认为/WEB-INF/applicationContext.xml -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/applicationContext.xml</param-value>
    </context-param>  

     <!-- 上下文Spring监听器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

<!--
  <servlet>

    <servlet-name>DispatcherServlet</servlet-name>
    <servlet-class>org.majorxie.dreamvc.mvc.dispatcher.DispatcherServlet</servlet-class>
    <init-param>
    <param-name>container</param-name>
    <param-value>org.majorxie.dreamvc.ioc.factory.SpringIocFactory</param-value>
    </init-param>
    <init-param>
    <param-name>CodeEnhancement</param-name>
    <param-value>javassist</param-value>
    </init-param>

  </servlet>

  <servlet-mapping>
    <servlet-name>DispatcherServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping> -->
  <filter>
  <filter-name>DispatcherFilter</filter-name>
  <filter-class>org.majorxie.dreamvc.mvc.dispatcher.DispatcherFilter</filter-class><!-- 选择filter进入,或者选择servlet进入(如上) -->
  <init-param>
    <param-name>container</param-name>
    <param-value>org.majorxie.dreamvc.ioc.factory.SpringIocFactory</param-value><!-- 选择springioc作为ioc容器 -->
    </init-param>
    <init-param>
    <param-name>CodeEnhancement</param-name>
    <param-value>SpringAsm</param-value><!-- 选择SpringAsm或者javassist -->

    </init-param>
    <init-param>
    <param-name>template</param-name>
    <param-value></param-value><!-- 选择返回模板这里不填自动选择jsp模板 -->
    </init-param>

  </filter>

  <filter-mapping>
  <filter-name>DispatcherFilter</filter-name>
  <url-pattern>*.do</url-pattern>
  </filter-mapping>

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

开发者选择好事DispatcherFilter还是DispatherServlet之后根据配置就行了。那么dreamvc是怎样做的呢?来看看DispatherServlet和DispatcherFilter的代码

package org.majorxie.dreamvc.mvc.dispatcher;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.GenericServlet;
import javax.servlet.ServletConfig;
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 org.majorxie.dreamvc.tag.Contextconfig.DefaultConfigImpl;
/**
 * dispatcher类,负责初始化任务
 * @author xiezhaodong
 * 2014-10-28
 *
 */
public class DispatcherServlet extends GenericServlet {
	private final Log log=LogFactory.getLog(getClass());	

	private Dispatcher dispatcher;

	public void destroy() {
		log.info("distory!!");
		super.destroy();
	}

	@Override
	public void init(ServletConfig config) throws ServletException {
		super.init(config);
		this.dispatcher=new Dispatcher();
		DefaultConfigImpl configImpl=new DefaultConfigImpl(config);
		dispatcher.init(configImpl);

	}

	@Override
	public void service(ServletRequest arg0, ServletResponse arg1)
			throws ServletException, IOException {
		HttpServletRequest req=(HttpServletRequest) arg0;
		HttpServletResponse resp=(HttpServletResponse) arg1;
		String method=req.getMethod();
		 if ("GET".equals(method) || "POST".equals(method)) {
			 if(!dispatcher.service(req, resp)){
				 return;
			 }
		 }

	}

}
package org.majorxie.dreamvc.mvc.dispatcher;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
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 org.majorxie.dreamvc.tag.Contextconfig.DefaultConfigImpl;
/**
 * filter进入
 * @author xiezhaodong
 *2014-10-31
 */
public class DispatcherFilter implements Filter{
	private Log log=LogFactory.getLog(getClass());
	private Dispatcher dispatcher
	;

	public void destroy() {
		log.info("filter enter destory");
	}

	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		 HttpServletRequest req = (HttpServletRequest) arg0;
	        HttpServletResponse resp = (HttpServletResponse) arg1;
	        String method = req.getMethod();
	        if ("GET".equals(method) || "POST".equals(method)) {
	            if (!dispatcher.service(req, resp))
	            	arg2.doFilter(req, resp);
	            return;
	        }

	}

	public void init(FilterConfig arg0) throws ServletException {
		this.dispatcher=new Dispatcher();
		log.info("filter enter start...");
		DefaultConfigImpl config=new DefaultConfigImpl(arg0);
		dispatcher.init(config);

	}

}

大家可以看到,实际上真正的加载是交给Dispatcher这个类来完成,这样就实现了分离,那么如何做到得到filter和servlet的机制上的差异呢,关键是Config这个接口,大家看

package org.majorxie.dreamvc.tag.Contextconfig;

import javax.servlet.ServletContext;
/**
 * 2014-10-28
 * @author xiezhaodong
 *
 */
public interface Config {

	/**
	 * 得到指定了参数
	 * @return
	 */
	String getInitParameter(String name);
	/**
	 *
	 * @return servlet context
	 */
	ServletContext getServletContext();

}

这个折扣封装了两个方法,一个是得到参数,一个是得到servletCOntext,然后再有一个默认实现,一个简单是组合适配,就完成了filter和servlet不同的适配

package org.majorxie.dreamvc.tag.Contextconfig;

import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

import javax.servlet.FilterConfig;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
/**
 * 2014-10-28
 * @author xiezhaodong
 *配置默认实现
 *对象适配
 *有3个构造函数,选择需要的构造函数实例化
 *servletconfig用于serlvet进入
 *filterconfig用于filter进入
 *
 */
public class DefaultConfigImpl implements FixableConfig {
	private ServletConfig servletConfig;
	private FilterConfig filterConfig;

	public DefaultConfigImpl(ServletConfig servletConfig) {
		this(servletConfig,null);
	}
	public DefaultConfigImpl(FilterConfig filterConfig) {
		this(null,filterConfig);
	}

	public DefaultConfigImpl(ServletConfig servletConfig,FilterConfig filterConfig) {
		this.filterConfig =filterConfig;
		this.servletConfig=servletConfig;
	}

	public String getInitParameter(String name) {
		return servletConfig==null?filterConfig.getInitParameter(name):servletConfig.getInitParameter(name);
	}

	public ServletContext getServletContext() {
		return servletConfig==null?filterConfig.getServletContext():servletConfig.getServletContext();
	}

	@SuppressWarnings("unchecked")
	public String[] getInitParameters() {
		Enumeration<String> names=servletConfig==null?filterConfig.getInitParameterNames():servletConfig.getInitParameterNames();
		List<String> list=new ArrayList<String>();
		while(names.hasMoreElements()){
			list.add(this.getInitParameter(names.nextElement()));
		}
		return (String[]) list.toArray();
	}

}

终上所述,dreamvc的两个机制用户可以自行选择来实现。下一篇讲解Dispatcher类到底做了写什么

转载请注明出处http://blog.csdn.net/a837199685

时间: 2024-10-14 05:16:23

dreamvc框架(二),dreamvc的机制的相关文章

dreamvc框架(一)ioc容器的集成

我的dreamvc框架终于写得差不多了,借鉴了很多开源框架,SpringMVC.Struts2等,目前放在github上面.地址请猛戳我 写得差不多了,是要写一个总结,把自己当时的思路记录下来!还有更多的工作要做! (一) 首先,IOC容器作为管理bean的重要工具,我们在日常的开发当中经常用到,最常用的就属SPRINGIOC了吧!当然,如果开发者不原理是用SPRINGIOC,那么你可以实现自己的容器,或者是用其他的3方ioc工具,只要实现dreamvc提供的IocFactory或者继承Abst

iOS开发项目篇—25字典转模型第三方框架、运行时机制简介

iOS开发项目篇—25字典转模型第三方框架.运行时机制简介 一.使用第三方框架完成字典转模型 1.获取框架 在www.code4app.com网站中,搜索字典转模型 可以点击下载代码进行下载,也可以带github上去下载. 管理框架的好处:点击刷新按钮会刷新所有的项目. 2.使用 1.导入第三方框架 2.使用示例 错误提示: 在刷新的时候直接使用一行代码即可: 1 /**加载最新微博数据*/ 2 -(void)loadNewStatus 3 { 4 //1.获得请求管理者 5 AFHTTPReq

MFC框架剖析和消息机制

即便是基于MFC的应用程序,建立窗口类也是会遵循如下的过程: 设计窗口类->注册窗口类->生成窗口->显示窗口->更新窗口->消息循环->消息路由到窗口过程函数处理.下面就剖析一下在MFC中是如何完成上述过程的. (1)每个应用程序都有且仅有一个应用类的全局变量theApp,全局变量先于WinMain函数进行处理. (2)WinMain函数体在APPMODUL.CPP文件中,定义如下: extern "C" int WINAPI _tWinMain(

企业级应用框架(二)三层架构之数据访问层的封装与抽象

接上一篇我们来对数据访问层进行封装与抽象.在上一篇我们知道,要解除BLL对DAL的依赖,我们就必须抽象出DAL层的接口,同时基于DAL的数据访问技术很多,如EF,ADO.NET,LINQ TO SQL,因此,我们的数据访问层必须对这些技术提供相应的支持.所以今天我们要做的事情有两件,第一,定义我们的数据访问层接口:第二,屏蔽各类数据库访问技术的差异,提供统一的数据库访问模型.举个例子,我们只需要修改一下我们的配置文件,就能够把ADO.NET的实现方式,改变成EF的实现方式.好下面搭建我们的三层构

百思不得姐框架(二)

一 该部分框架效果图和实现思路 框架二的效果图: 实现思路: -- 1> 先完善tabBar(主要是自定义) -- 2> 再完善导航条 -- 3> 其次完善屏幕侧滑(主要是全屏侧滑功能) 二 抽取分类(设置到插件中) 1 抽取分类的思想: 实现复用 --> 1.1 上部分代码中,我们需要设置tabBar中图片成未被渲染的格式,因此我们抽取了一个分类,用分类里面的方法实现了效果. --> 分类代码: //传入一张图片的名称返回一张未被渲染的图片 + (UIImage *)ori

结合手机上网流量业务来说明Hadoop中的二次排序机制,分区机制

本篇博客将结合手机上网流量业务来详细介绍Hadoop的二次排序机制.分区机制,先介绍一下业务场景: 先介绍一下业务场景:统计每个用户的上行流量和,下行流量和,以及总流量和. 本次描述所用数据: 日志格式描述: 日志flowdata.txt中的具体数据: 首先我们先通过mapreduce程序实现上面的业务逻辑: 代码实现: package FlowSum; import java.io.DataInput; import java.io.DataOutput; import java.io.IOE

深入JVM虚拟机(二) JVM运行机制

深入JVM虚拟机(二) JVM运行机制 1 JVM运行机制 1.1 JVM启动流程 JVM是Java程序运行的环境,同时是一个操作系统的一个应用程序进程,因此它有自己的生命周期,也有自己的代码和数据空间.JVM工作原理和特点主要是指操作系统装入JVM,是通过jdk中Java.exe来完成通过下面4步来完成JVM环境. 1.创建JVM装载环境和配置. 2.装载JVM.dll. 3.初始化JVM.dll并挂界到JNIENV(JNI调用接口)实例. 4.调用JNIEnv实例装载并处理class类. J

Chrome插件开发入门(二)——消息传递机制

Chrome插件开发入门(二)——消息传递机制 由于插件的js运行环境有区别,所以消息传递机制是一个重要内容.阅读了很多博文,大家已经说得很清楚了,直接转一篇@姬小光 的博文,总结的挺好.后面附一个自己写过的demo,基本就对消息传递能够熟悉了. 在开发 Chrome 扩展时经常需要在页面之间进行通讯,比如 background 与 content script 之间,background 与 popup 之间等等,本文结合官方文档中的例子介绍了 chrome 扩展开发中消息传递的基本实现. 一

dreamvc框架(三),dispartcher做了些什么

这一篇我会介绍一些dreamvc的核心类Dispatcher都做了些什么,首先我们先来看一看init方法,这是在DispatcherServlet和DispatcherFilter里面都会调用到的一个方法 void init(FixableConfig config)throws ServletException{ this.servletContext=config.getServletContext(); try { initProxy(config); log.info("init con