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

34 篇文章 0 订阅
13 篇文章 0 订阅
/**
	 * 获取指定包路径下的控制器列表
	 * @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源文件好看啊....

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值