论坛首页 Java企业应用论坛

java元数据应用 , 自动获取控制器的元数据描述

浏览 2384 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-07-06   最后修改:2009-07-06
OO
/**
	 * 获取指定包路径下的控制器列表
	 * @param packageName
	 * @return
	 */
	public static ArrayList<Class> getControllerListFromPackage(String packageName){
		ArrayList<Class> controllers = new ArrayList<Class>() ;
		Object prolbemObj = null;
		try {
			Class[] classes = ReflectUtil.getClassesFromPackage(packageName);
			for(Class cls : classes){
				prolbemObj = cls ;
				if (SysUtil.isController(cls)){
					controllers.add( cls );
				}
			}				
		}
		catch(Exception e){
			System.out.println("解析控制器时除了问题: " + prolbemObj);
		}
		finally{
			return controllers;
		}		 
	} 
	
	// -------------------------------------------------------
	public static String getAnnoDescription(Anno_Controller anno_ctl){
		if (anno_ctl != null)
			return anno_ctl.description() ;		
		return null ;
	}
	/**
	 * 取控制器的描述字符串,如果当前没有定义,则取其父类或者父接口的描述
	 * @param ctl
	 * @return
	 */
	public static String getControllerAnnoDescription(Class ctl){
		Anno_Controller anno_ctl = ((Anno_Controller) 
				ctl.getAnnotation(Anno_Controller.class)) ;
		String description = getAnnoDescription(anno_ctl);
		if (description != null)
			return description ;
		
		//否则取超类的描述符
		/**
		 * 因为java是单一继承,有可能出现
			 * 父类非控制器 : 未继承控制器接口 
			 * 子类是控制器 : 继承控制器接口
		 * 
		 * 当父类不是控制器时则跳出判断,从而获取控制器接口的元描述
		 */
		Class superClass = ctl.getSuperclass();//获取超类
		if ( isController(superClass)){
			return getControllerAnnoDescription(superClass);
		}
		else {
			//获取控制器接口的元描述
			return getControllerAnnoDescription(Controller.class);
		}
	}
 
写道
运行结果

找到控制器
class com.sinomagazine.fuseblog.controller.D
描述: 类: Default,缺省控制器
[actionIndex::d.do]
[actionIndex::删除帖子事件]
---------------------------------
class com.sinomagazine.fuseblog.controller.Default
描述: 类: Default,缺省控制器
[actionIndex::index.do]
[actionIndex::缺省事件]
---------------------------------

 

编写目的:

不想去配置控制器的配置文件,解决每组CRUD操作都占用至少4个Action类的问题,不想配置控制器文件,

 

使用命名约定,来降低编写的XML的繁琐...

 

有朋友说,使用Struts中的那个DispatcherAction 这个可以通过传入参数来解决每个action为1个类的问题...

但是这个似乎比之前的那种开发方式更繁琐,配置更艰难... 讨厌....

 

想实现一种类似于PHP的那种,无需,或者只需少量配置的开发模式,这里仅仅想实现配置控制器的这块实现自动化,0配置

思路已经大致想通,正在逐步实现的过程中..

 

package com.sinomagazine.fleajava;

import com.sinomagazine.fleajava.core.Interrupt;

/**
 * 单一入口
 *  
 * @author 色色
 * vb2005xu@iteye.com
 * 2009-7-3
 */
public class Runner {

	/**
	 * 运行控制器类
	 */
	public static void main(String[] args) throws Exception {   
		Interrupt interrupt = new Interrupt() ;
		interrupt.setControllerPackage("com.sinomagazine.fuseblog.controller");
		interrupt._do("Default", "index");   
    }
}

 

package com.sinomagazine.fuseblog.controller;

import com.sinomagazine.fleajava.controller.Controller;


import com.sinomagazine.fleajava.core.annotation.Anno_Action;
import com.sinomagazine.fleajava.core.annotation.Anno_Controller;
import com.sinomagazine.fleajava.core.annotation.Anno_View;

@Anno_Controller(description="类: Default,缺省控制器")
public class Default implements Controller {
	
	@Anno_Action(description="缺省事件")
	@Anno_View(url="index.do")
	public void actionIndex(){
		
	}

}

 

package com.sinomagazine.fuseblog.controller;

import com.sinomagazine.fleajava.controller.Controller;


import com.sinomagazine.fleajava.core.annotation.Anno_Action;
import com.sinomagazine.fleajava.core.annotation.Anno_Controller;
import com.sinomagazine.fleajava.core.annotation.Anno_View;

public class D extends Default implements Controller {
	
	@Anno_Action(description="删除帖子事件")
	@Anno_View(url="d.do")
	public void actionIndex(){
		
	}
}

 

package com.sinomagazine.fleajava.controller;

import com.sinomagazine.fleajava.core.annotation.Anno_Controller;

@Anno_Controller(description="接口: Controller,每个控制器都必须实现此接口")
public interface Controller {
	/**
	 * 当前控制的名字
	 */
	public static String controllerName = null;
	/**
	 * 当前调用的动作名
	 */
	public static String actionName = null;
	
}

 

 

希望以后java的开发不再编程XML编程... XML是好,但是不要盲目崇拜吧...

 

前些时候看了国内某个 大唱快速开发的JAVA框架,我日,都是XML配置文件,一个接一个,我不想说什么?请问java程序员,是XML好看,还是java源文件好看啊....

 

可能我比较懒,所以.... 我对自己很无语...

   发表时间:2009-07-06  
所谓的0配置,就是约定和习惯用法优先的一种实现方式。在一个大家都统一惯用法优先的项目里面,搞这个还是有用的。
0 请登录后投票
   发表时间:2009-07-06  
对于JAVA的缺省XML配置,有朋友说我通过配置文件可以对每个控制器每个事件都进行权限控制,你现在搞这个完全是浪费时间,并且降低了安全性...

他说的也很对...

不过我向实现的东西他没有理解:
1. 我不仅仅不愿意配置action,我也不想配置控制器.就像上面的代码,我希望给他加上一个元数据标识就声明它是个控制器,对每个控制器里面的方法加上元标识就让他成为action方法,这些都有程序自动获取,无需通过配置文件一个个的设置,只需要告诉程序控制器在哪里找到即可

2. 对于效率,我实在不知道改怎么解答,因为这个东西还没有做完,即使是做完了,也是大量用到反射,可能效率也不高,我不知道Spring这些框架中是怎么实现高想念反射操作的,有空一定好好看看... 不过个人认为java解析XML文件占用的资源和效率不比直接解析类要少,对于解析,我也仅仅想在开始的解析一下,然后储存到内存中...这样效率是不是高一些呢

3. 我确实很懒,所以想少写东西,如果你不喜欢,也尽量不要恶意的去说我,(*^__^*) 嘻嘻…… 我脸皮毕竟还是不很厚

4. 对于安全性,我现在想的是 应该实现一个RBAC机制,我之前在做PHP项目时弄了一套RBAC系统,不也就是三张表么?PHP能轻易实现,这个我觉得也可以...

5. 畅想: 做成一个Spring的小插件,炒到其MVC框架中,通过自己实现一个Servlet类
... (*^__^*) 嘻嘻……

技术不够... 之前说的fuseblog已经摆到了自己线下的开发列表中... 希望通过这些东西来更好的学习学习 好好学习 天天向上
0 请登录后投票
   发表时间:2009-07-06  
当前已经解决:
1. 指定路径下 存在多少个控制器类

正在解决:
1.每个控制器中有多少个action方法
0 请登录后投票
   发表时间:2009-07-06  
public static ArrayList<String> getActionListFromController(Class ctl) {
		ArrayList<String> actions = new ArrayList<String>(); 
		try {
			Method[] mets = ReflectUtil.getMethodsFromClass(ctl);
			for(Method m : mets){
				/**
				 * action 方法必须为public 或者 protected 方法
				 * 可以开启私有方法的访问,不过最好是不开启
				 * m.setAccessible(flag)
				 */
				if (m.getModifiers() == Modifier.PUBLIC || m.getModifiers() == Modifier.PROTECTED )
				{					
					if (SysUtil.isAction(m)) {						
						actions.add(m.getName());
					}
				}					
			}			
		} 
		catch (SecurityException e) {
			System.out.println("不允许访问该类中的已经声明的方法: " + ctl );
		}
		return actions ;
	}


每个控制器中有多少个action方法解决了一半,尚未解决从父类中继承的,应该很好解决... 对每个控制器做了限制,仅仅声明为共有或者保护并且使用了@Anno_Action来声明的才算是action
0 请登录后投票
   发表时间:2009-07-06  
出现的问题:
1. 类自身定义的
2. 从父类继承的
3. 子类覆盖父类的同名方法
4. 多态方法

这里对于前三个作为一个整体来解决

对于第四个,不予考虑,这里遵循如下约定:
1. action名字唯一,不允许多态
2. 仅仅public或者protected,并且使用@Anno_Action声明的,且遵循action命名规范的 如 : actionXxx 这样的才算action方法

对于前三个,很好实现.. 因为定义了action的唯一性,麻烦的只是父类中的同名方法,做了轮询即可
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics