`
kokonol
  • 浏览: 3810 次
  • 性别: Icon_minigender_1
  • 来自: 大连
最近访客 更多访客>>
社区版块
存档分类
最新评论

超级迷你小框架EasyAction

阅读更多

    没什么活干,让我想起了毕业设计,记得当初改过几个毕业设计。有相当一部分Java开发的毕业设计都用到了类似于Struts的一些框架,可是大部分人只是用到了Struts的相当一小部分核心功能。。。

    所以在学习过程中我就又萌生了动手的想法,其实仔细想想MVC下的表现层框架工作流程无非是:

        1. 拦截并分析请求信息;

        2. 利用请求的action名将请求中的参数设入相应的Java对象(既Struts中的Form)中;

        3. 利用请求的action名实例化相应的Action类,并调用相应的方法;

        4. 利用返回值取得相应的路径,完成跳转。

    所以核心功能应该不难实现,主要还是基于Java的反射机制。后来还见过一篇文章,不错,不过我倒是想做一下这位大哥不屑于做的事:再造一个破轮子(木头轮子) 呵呵~

        http://superleo.iteye.com/blog/227857

 

/*
 *  EasyAction超迷你框架主Servlet
 *  author KOKONOL
 *  version 0.00000001
 *  date 2008-08-29
 */

package EasyAction;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.Map;

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

import EasyAction.config.EasyActionConfig;
import EasyAction.servlet.EasyActionServletContext;
import EasyAction.util.StringUtility;

/**
 * @author KOKONOL
 * @version 0.00000001
 * @date 2008-08-29
 * */
public class EasyActionServlet extends HttpServlet {

	/** 配置Class */
	private EasyActionConfig easyActionConfig;
	
	/**
	 * Constructor of the object.
	 */
	public EasyActionServlet() {
		super();
	}

	/**
	 * The doGet method of the servlet. 
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		this.doPost(request, response);

	}

	/**
	 * The doPost method of the servlet. 
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		EasyActionServletContext.setRequest(request);
		EasyActionServletContext.setResponse(response);

		// 从requestURL中取得 Action类名 和 Form类名
		String requestUrl = request.getRequestURL().toString();
		String actionName = requestUrl.substring(requestUrl.lastIndexOf("/") + 1, requestUrl.length()).replace(".do", "");
		
		//若form请求action属性值为"NNN" 则 Action的类名为"NNNAction" Form的类名为"NNNForm"
		
		String actionClassName = easyActionConfig.getActionClassName(actionName);
		String formClassName = easyActionConfig.getFormClassName(actionName);
		
		// Action.execute返回值
		String resultStr = "";

		// 根据请求参数创建Form对象 并 设值
		Object formO = null;
		try {
			formO = this.setForm(formClassName, request.getParameterMap());
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		// 创建相应Action的对象,并调用 execute方法,取得返回值
		try {
			
			// 定义Action的Class 并实例化
			Class actionClass = Class.forName(actionClassName);
			Object actionO = actionClass.newInstance();
			
			// 取得 execute的 Method实例
			Method actionExecuteMethod = actionClass.getMethod("execute", formO.getClass());
			
			// 执行execute方法
			resultStr = actionExecuteMethod.invoke(actionO, formO).toString();
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InstantiationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}  catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		String tgtURL = "";
		if(resultStr!=null && !"".equals(resultStr)){
			tgtURL = easyActionConfig.getForwardURL(actionName, resultStr);
		}
		request.getRequestDispatcher(tgtURL).forward(request, response);

	}

	/**
	 * Initialization of the servlet.
	 */
	public void init() throws ServletException {
		
		// 将Servlet内置对象静态封装入EasyActionServletContext中
		EasyActionServletContext.setServletContext(this.getServletContext());
		
		// 取得配置文件所在的路径
		String configPath = this.getServletContext().getRealPath("WEB-INF");
		
		try {
			// 取得配置类的实例
			easyActionConfig = new EasyActionConfig(configPath);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * Set request parameter values of request to FormObject.
	 */
	private Object setForm(String formClassName, Map<String,String[]> paramMap) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException {
		
		// 声明并实例化FormClass
		Class formClass = Class.forName(formClassName);
		Object formObject = formClass.newInstance();
		
		// 如果没有请求参数 则 退出该方法
		if(paramMap == null || paramMap.size() == 0){
			return null;
		}
		
		// 取得FormClass的方法列表
		Method[] allMethod = formClass.getMethods();
		
		// 遍历FormClass的方法列表
		Iterator<String> it = paramMap.keySet().iterator();
w:		while(it.hasNext()){
			
			// 取得请求参数名
			String key = it.next();
			
			// 取得该请求参数对应的set方法名
			String methodName = "set"+StringUtility.toUpperCaseFirst(key);
			
			for(Method m:allMethod){
				if(m.getName().equals(methodName)){
					// 选择请求参数在Form中对应的set方法
					String[] paramValue = paramMap.get(key);
					
					// 取得该Set方法第一个参数的类型
					Class paramType = m.getParameterTypes()[0];
					
					if(String[].class.equals(paramType)){
						// 请求参数为String[]的情况时
						Method method = formClass.getMethod(methodName, new Class[]{String[].class});
						method.invoke(formObject, new Object[]{paramValue});
						
					}else{
						// 请求参数为String的情况时
						Method method = formClass.getMethod(methodName, new Class[]{String.class});
						method.invoke(formObject, new Object[]{paramValue[0]});
						
					}
					continue w;
					
				}
			}
			
		}
		return formObject;
		
	}
	
}

   代码还没有完成,还有不少任务。。。比如Exception都没有处理。

   稍后我会上传完整的代码。。。 

 

 

    这只是实现了基础中的基础的功能,通过写这点东西 我发现有很多东西需要学一下,接下来学一学dom4j,然后学一下log4j。让我这个破轮子能够真正的跑起来。

3
0
分享到:
评论
4 楼 kokonol 2008-09-01  
limaofa的意思是?
   这个action的后缀不要写死,而是去xml中取得?

我现在是固定拦截.do的请求,然后根据这个action名,去xml中取得 Action类名 和Form类名。。。
3 楼 limaofa 2008-09-01  
String actionName = requestUrl.substring(requestUrl.lastIndexOf("/") + 1, requestUrl.length()).replace(".do", "");

写死了?

2 楼 maxiaoxia 2008-08-31  
画个类图就好了,就不要贴大段代码了吧,谢谢
1 楼 kokonol 2008-08-30  
欢迎发表各种建议意见~~

相关推荐

    java迷你框架附使用例程

    1. **轻量级框架**:轻量级框架在不牺牲功能的情况下,提供较小的体积和更快的启动时间,常用于中小型项目。它们通常比重量级框架如Spring更简洁,易于理解和使用。 2. **依赖注入(Dependency Injection,DI)**:...

    迷你MVVM框架---avalonjs.html

    一个迷你框架

    usb冰箱超级迷你小冰箱.pdf

    随着科技的进步与生活节奏的加快,人们对于便捷生活的需求越来越高,这促使了各类小巧便捷的家用电器产品的诞生,其中之一便是USB迷你小冰箱。USB迷你小冰箱以其独特的便携性、多功能性以及节能环保的特点,日益受到...

    用一个文件,实现迷你 Web 框架.doc

    为了帮助开发者更深入地了解Web框架的工作原理,本文档将介绍如何仅用一个Python文件实现一个简单的迷你Web框架,并且通过这个过程,揭示Web框架的核心技术。 网络协议是Web通信的基石,其中HTTP(超文本传输协议)...

    超级精小的迷你IS

    标题中的“超级精小的迷你IS”指的是一个轻量级的网络服务器软件,它具有小巧的体积和低资源占用的特点。这种IS(可能是Internet Server或Information Server的简称)设计的目标是为了在有限的系统资源下提供高效的...

    手写迷你mybatis框架,里面使用了mybatis设计模式和框架.zip

    手写迷你mybatis框架,里面使用了mybatis设计模式和框架

    超级迷你绿色截图软件珍藏版

    在此背景下,“超级迷你绿色截图软件珍藏版”应运而生,成为了一款备受推崇的截图神器。 “超级迷你绿色截图软件珍藏版”之所以成为用户的宠儿,源于其独特的设计和实用的功能。与那些体积庞大、安装繁琐的传统截图...

    excel迷你小台历

    excel迷你小台历

    dotnet-一个超简迷你版的ASPNETCore框架

    -一个超简迷你版的ASP.NET Core框架,真实模拟 足够简单 可以执行,基于蒋金楠老师的分享改写成的基于.NET Standard的版本,有.NET Framework和.NET Core两个服务端的启动程序。

    VC6 连接器-超级迷你版.rar

    【VC6 连接器-超级迷你版.rar】是一个压缩包文件,主要针对的是Visual C++ 6.0(简称VC6)的开发环境。在编程领域,连接器(Linker)是编译过程中的重要组成部分,它负责将编译器生成的多个目标文件(.obj)以及库...

    超级迷你相册汉化版

    《超级迷你相册汉化版》是一款专为用户打造的小型图片管理工具,以其小巧精悍的特性赢得了用户的青睐。这款软件设计简洁高效,只包含一个文件,却能实现基本的图片管理和操作功能,极大地提升了用户在处理图像时的...

    linux-bashmanager迷你bash框架用于创建命令行工具

    Linux开发中的Shell脚本开发是实现自动化任务和创建命令行工具的重要途径,而BashManager则是一个专为此目的设计的迷你bash框架。这个框架简化了命令行工具的创建过程,使得开发者可以更高效地构建功能丰富的CLI应用...

    webwind,超迷你的MVC框架

    WebWind的"超迷你"特性意味着它可能具有极小的体积和高度优化的性能,这通常对于小型项目或快速原型设计非常理想。作为一个MVC框架,WebWind可能会包含以下核心组件: 1. **控制器(Controller)**:控制器是MVC中...

    VC6 链接器-超级迷你版(10M).zip

    在"VC6链接器-超级迷你版(10M).zip"这个压缩包中,包含了对VC6链接器的深入探讨和实践资料。 一、链接器的基本功能 1. 符号解析:链接器会检查所有输入的目标文件,确保所有的外部引用(即在某个文件中声明但...

    自己写的smarty小框架

    "自己写的smarty小框架"显然是一种基于原版Smarty理念的简化或定制版本,旨在满足特定项目需求或者教学目的。下面,我们将详细讨论这个迷你Smarty框架可能包含的关键知识点。 1. **模板引擎的概念**:模板引擎允许...

    VC6 链接器-超级迷你版

    这个“超级迷你版”可能是指经过优化或精简后的版本,具有更小的体积和更快的运行速度,但依然保留了基本的链接功能。 链接器在程序构建过程中起着至关重要的作用。它负责以下几个关键任务: 1. **合并代码和数据*...

    基于Vue框架开发的qingyi迷你公益小程序设计源码

    本项目是一款基于Vue框架构建的迷你公益小程序设计源码,涵盖1673个文件,包括695个JavaScript文件、419个Vue组件文件、138个映射文件、106个SCSS样式文件、90个JSON配置文件、63个WXML模板文件、52个WXSS样式文件、...

Global site tag (gtag.js) - Google Analytics