`
sunqitang
  • 浏览: 77005 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

自制MVC框架:TonyMVC

    博客分类:
  • SSH
阅读更多

MVC框架已经使用的非常广泛了,现在我也自制一个MVC框架来加深我对MVC框架的理解。

 

首先MVC共分三个内容,M(MODEL)V(VIEW)C(controller)。

M:主要就是一些Action,用来处理业务内容和数据库的操作。

V:视图,用于向用户显示内容。

C:所有的请求由这里来管理,进行分配。分发业务请求。

 

 

 

1 在web.xml文件中加入一个servlet,去拦截所有的满足条件请求,这些请求由控制键(C)来进行分发管理。

 <servlet>
    <description>DispatchServlet</description>
    <display-name>DispatchServlet</display-name>
    <servlet-name>DispatchServlet</servlet-name>
    <servlet-class>com.hrbust.mvc.controller.DispatchServlet</servlet-class>
    <init-param>
      <description>Configuration File</description>
      <param-name>configFile</param-name>
      <param-value>WEB-INF/mvc-config.xml</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>DispatchServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>

 其中具有自制MVC框架的配置文件:mvc-config.xml,当做参数设置在servlet中。

 

2 controller文件:

 

  初始化:读取配置文件,把相应的Action信息加入到ActionMap中。

      并获取ActionMap。此时ActionMap为缓存。

  doGet方法: 取得请求URL,把它进行拆分。

 

  Controller中使用了ConfigHelper类来加载缓存。

 

package com.hrbust.mvc.controller;

import java.io.IOException;
import java.lang.reflect.Method;
import java.util.Map;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hrbust.mvc.action.ActionPackager;
import com.hrbust.mvc.config.ConfigHelper;
import com.hrbust.mvc.util.RegexUtil;

/**
 * Action分发类<br>
 * 将请求分派给指定Action处理
 * 
 * @author Welkin
 *
 */
public class DispatchServlet extends HttpServlet {

	private static final long serialVersionUID = 1131523345611250389L;

	private static final String CONTENT_TYPE="text/html;charset=UTF-8";
	
	private Map<String,ActionPackager> actionsMap;
	
	/*public static String DataURL=null;
	public static String MarkURL=null;
	public static String PastePicsURL=null;*/
	
	/**
	 * Constructor of the object.
	 */
	public DispatchServlet() {
		super();
	}
	
	/**
	 * Initialization of the servlet. <br>
	 *
	 * @throws ServletException if an error occurs
	 */
	public void init() throws ServletException {
		//read config values from the web.xml
		
		// 通过ServletContext取得工程的绝对物理路径
        ServletContext sct = getServletContext();
        String realPath = sct.getRealPath("/");
		
        // 通过ServletConfig实例取得初始化参数configFile
        ServletConfig config=this.getServletConfig();        
        String CfgFile=config.getInitParameter("configFile");

        // 组合配置文件全物理路径
        CfgFile=realPath+CfgFile;
        
        //创建ConfigHelper对象,初始化actionsMap
        ConfigHelper configHelper=new ConfigHelper(CfgFile,config);
        actionsMap=configHelper.getActionsMap();
		
	}
	
	/**
	 * Destruction of the servlet. <br>
	 */
	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		actionsMap=null;
	}

	/**
	 * The doGet method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		response.setContentType(CONTENT_TYPE);
		
		// 取得请求的URL
        String reqURL=request.getServletPath();
        
        // 取得模式匹配字符串,取得请求后缀
        String patternStr;
        if(reqURL.contains("?")){
            patternStr=RegexUtil.getMatchedString("([.])(.*)?",reqURL);
        }
        else{
            patternStr=RegexUtil.getMatchedString("([.])(.*)$",reqURL);
        }
        
        // 取得请求的Action名称
        String actionName=RegexUtil.getMatchedString("/(.*)[.]"+patternStr,reqURL);
        
        ActionPackager actionPackager=actionsMap.get(actionName);
        
        //如果请求的Action为空,则返回404错误
        if(actionPackager==null)
        	response.sendError(HttpServletResponse.SC_NOT_FOUND);
        else{
        	String methodName=request.getParameter(actionPackager.getMethodName());

            //执行Action中的方法
            Class<?> actionClass=actionPackager.getActionClass();
    		Object actionObj=actionPackager.getActionObj();
    		
    		try {
				Method method = actionClass.getMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);
				method.invoke(actionObj, request,response);
			} catch (NoSuchMethodException e) {
				//如果请求方法不存在,抛出404错误
				response.sendError(HttpServletResponse.SC_NOT_FOUND);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
        }
        
	}

	/**
	 * The doPost method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to post.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		this.doGet(request, response);
	}

}

 

 

3 ConfigHelper文件:

 

  用来加载配置文件。

  创建Action的包装类ActionPackager和Action的工厂类ActionFactory。

 

package com.hrbust.mvc.config;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletConfig;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.hrbust.mvc.ActionFactory;
import com.hrbust.mvc.action.Action;
import com.hrbust.mvc.action.ActionPackager;

/**
 * 配置文件Helper类<br>
 * 用于获取配置文件相关
 * 
 * @author Welkin
 *
 */
public class ConfigHelper {
	
	public static Log log=LogFactory.getLog(ConfigHelper.class);
	
	private ActionFactory actionFactory;
	
	private Document document;
	
	
	/**
	 * 构造函数,加载配置文件,初始化document
	 * @param configFile
	 */
	public ConfigHelper(String configFile,ServletConfig servletConfig){

		log.info("加载mvc配置文件...");
		
		try {
			File file = new File(configFile);
			SAXReader reader = new SAXReader();
			document = reader.read(file);
		} catch (DocumentException e) {
			log.error("配置文件不存在或格式不正确");
			e.printStackTrace();
		}
		
		log.info("初始化ActionFactory...");
		if(servletConfig==null){
			try {
				throw new Exception();
			} catch (Exception e) {
				log.error("ServletConfig参数为Null,ActionFactory初始化失败");
				e.printStackTrace();
			}
		}else{
			actionFactory=new ActionFactory(servletConfig);
		}
	}
	
	public Map<String,ActionPackager> getActionsMap(){
		
		log.info("读取mvc配置文件,装载至缓存中...");
		
		Map<String,ActionPackager> actionsMap=new HashMap<String,ActionPackager>();
		
		Element root = document.getRootElement();
		List<?> actionElms=root.elements("action");
		
		//遍历所有action元素
		for(int i=0;i<actionElms.size();i++){
			Element actionElm  = (Element)actionElms.get(i);
			ActionPackager action=new ActionPackager();
			
			String actionClassPath=actionElm.attributeValue("class");
			Action actionObj=actionFactory.getActionInstance(actionClassPath);
			

			action.setName(actionElm.attributeValue("name"));
			action.setClassPath(actionClassPath);
			action.setMethodName(actionElm.attributeValue("method"));
			
			action.setActionClass(actionObj.getClass());
			action.setActionObj(actionObj);
			
			actionsMap.put(action.getName(), action);
		}
		
		log.info("装载完成");
		
		return actionsMap;
	}
	
	
}

 

 

4 ActionFactory

 

  ActionFactory的工厂类。用来创建Action。

package com.hrbust.mvc.action;

import javax.servlet.ServletConfig;

/**
 * SuperAction<br>
 * 所有Action的父类
 * 
 * @author Welkin
 */
public abstract class Action{
	
	private static ServletConfig config;
	
	/**
	 * 注入servletConfig
	 * 
	 * @param servletConfig
	 */
	public static void setServletConfig(ServletConfig servletConfig){
		config=servletConfig;
	}
	
	/**
	 * 得到ServletConfig
	 * 
	 * @return
	 */
	protected ServletConfig getServletConfig(){
		return config;
	}
}

 

 

5 ActionPackager

 Action相关信息的包装类。

 

package com.hrbust.mvc;

import javax.servlet.ServletConfig;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.hrbust.mvc.action.Action;

/**
 * Action 工厂
 * 
 * @author Welkin
 *
 */
public class ActionFactory {
	
	public static Log log=LogFactory.getLog(ActionFactory.class);
	private ServletConfig servletConfig;
	
	public ActionFactory(ServletConfig servletConfig){
		this.servletConfig=servletConfig;
	}
	
	/**
	 * 得到Action实例
	 * @return
	 */
	public Action getActionInstance(String actionClassPath){
		
		Class<?> actionClass=null;
		Action actionObj=null;
		
		try {
			
			//向Action中注入servletConfig
			Action.setServletConfig(servletConfig);
			
			//实例化Action子类
			actionClass=Class.forName(actionClassPath);
			actionObj= (Action)actionClass.newInstance();
			log.debug("创建"+actionClassPath+"实例");
			
		}catch (ClassNotFoundException e) {
			log.error("Action相关类没有找到");
			e.printStackTrace();
		}catch (Exception e) {
			e.printStackTrace();
		}
		return actionObj;
	}
	
}

 

 

分享到:
评论
1 楼 hardPass 2010-05-06  
能看看你的mvc-config.xml 啊?

相关推荐

    自制MVC框架:IAIMVC

    【标题】"IAIMVC" 是一个自制的MVC(Model-View-Controller)框架,旨在帮助开发者构建高效、可维护的Web应用程序。MVC模式是一种软件设计模式,它将业务逻辑、数据处理和用户界面分离开来,使得各部分可以独立地...

    构建自己的MVC框架:JavaScript中的MVC模式详解与实践

    本文将详细介绍MVC模式的工作原理,并指导如何在JavaScript中实现一个简单的MVC框架。 在JavaScript中实现一个简单的MVC框架可以帮助你更好地理解MVC模式的工作原理,并为你的Web应用程序提供一个结构化的方法。通过...

    音乐推荐系统 系统算法:基于用户的协同过滤推荐算法 编程语言:python 数据库:sqlite 框架:MVC web应用框架:

    音乐推荐系统 系统算法:基于用户的协同过滤推荐算法 编程语言:python ...框架:MVC web应用框架:Django 解压就可以运行(自己需要有调试项目环境的能力),需要软件python和pycharm或者Anaconda 项目有配套的文档

    ASP.NET MVC框架开发系列课程(1):MVC模式与ASP.NET MVC框架概述

    ASP.NET MVC框架是微软开发的一款用于构建Web应用程序的开源、轻量级且高度模块化的框架。这个框架结合了Model-View-Controller(MVC)设计模式的灵活性和ASP.NET的强大功能,为开发者提供了构建可测试、高性能的Web...

    PHP mvc框架

    Todo应用通常是一个基础的待办事项列表,用于展示基本的CRUD(创建、读取、更新、删除)操作,这有助于理解MVC框架的核心概念。 在PHP MVC框架中: 1. **Model** 负责处理数据和业务逻辑。对于Todo应用,Model可能...

    MVC详解:了解真正所谓的框架

    【MVC模式详解:理解框架的核心价值】 在Web开发领域,MVC(Model-View-Controller)模式是一种广泛采用的设计模式,它将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。这个模式...

    简单的MVC框架例子

    **简单的MVC框架例子** 在Web开发中,MVC(Model-View-Controller)模式是一种广泛应用的设计模式,它将应用程序的结构分为三个主要部分:模型(Model)、视图(View)和控制器(Controller)。这个简单的MVC框架...

    基于Spring MVC的轻量级MVC框架设计源码

    轻量级MVC框架:基于Java开发,包含89个文件,包括25个...该项目是一个基于Spring MVC的轻量级扩展,借鉴了ASP.Net MVC及JFinal框架的思路,提供了一种更简洁的MVC路由模式,旨在简化Web应用的开发流程,提高开发效率。

    C++实现简单的MVC框架

    本项目是用C++实现的一个简单的MVC框架,名为MVCDemo,旨在帮助开发者理解MVC设计模式的基础概念。 首先,我们来详细解释MVC的三个组成部分: 1. Model(模型):模型层是应用的核心,它负责管理数据和业务逻辑。...

    开源mvc框架源码

    - MVC:Model-View-Controller模式是一种广泛应用于Web开发的软件设计模式,其中模型负责管理应用程序的数据和业务逻辑,视图负责显示数据,控制器则处理用户的输入并协调模型和视图。 - 开源MVC框架:这些框架的源...

    基于Java Web MVC框架的电力班组智能化管理系统.pdf

    "基于Java Web MVC框架的电力班组智能化管理系统" 本文介绍了基于Java Web MVC框架的电力班组智能化管理系统的设计和实现。该系统旨在解决当前电力班组管理中存在的人力资源浪费、信息不完善、缺乏智能化管理等问题...

    MVC框架工程Myeclipse做的

    **MVC框架详解** 在软件开发领域,MVC(Model-View-Controller)框架是一种广泛应用于Web应用设计的架构模式。MVC将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller),以此实现业务...

    mvc框架例子该例子主要讲述了怎样创建mvc框架以及怎样用mvc操作数据库该希望对初学mvc的人有所帮助欢迎大家下载分享

    **MVC(Model-View-Controller)框架是软件开发中常用的一种设计模式,尤其在Web应用领域中,它能够帮助开发者有效地分离业务逻辑、数据处理和用户界面。本例子将详细解析如何创建一个MVC框架,并展示如何通过该框架...

    工作中Android开发用的项目框架:模块化、组件化开发,可快速集成

    1、MVC框架 : 使用简单(结合DataBinding更好用) 2、MVP框架 : 高解耦、提高维护效率、类文件多(View、Data、IPresenter、IContract) 3、MVVM框架: 一般般

    MVC模式与ASP.NET MVC框架概述源码

    MVC模式与ASP.NET MVC框架概述源码MVC模式与ASP.NET MVC框架概述源码MVC模式与ASP.NET MVC框架概述源码MVC模式与ASP.NET MVC框架概述源码MVC模式与ASP.NET MVC框架概述源码MVC模式与ASP.NET MVC框架概述源码

    微信开发php+mvc框架

    微信开发php+mvc框架

    MVC框架教程

    **MVC(Model-View-Controller)框架教程** MVC是一种设计模式,广泛应用于Web开发领域,它将应用程序的逻辑分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。这种架构模式有助于实现代码的...

Global site tag (gtag.js) - Google Analytics