/**
* 获取指定包路径下的控制器列表
* @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::缺省事件]
---------------------------------
找到控制器
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源文件好看啊....
可能我比较懒,所以.... 我对自己很无语...