2008-04-30
原创----我的一个小框架
关键字: 框架 java 反射这里写出我自己的一个框架。希望多多指正。我觉得应该也算是一个mvc了吧,是不断的完善到现在,觉得可以拿出来丑丑了,呵呵。这里将主要的部分,如果需要源码的可以给我留言。好了,开始。
先从中间层讲起,也就是mvc中的c,也叫控制器,是整个框架的核心。在前台发送来请求先到web.xml中映射,这个和普通的servlet配置是一样的。
<servlet> <servlet-name>Servlets</servlet-name> <!--映射到Servlets.java这个控制器上面--> <servlet-class>com.servlets.Servlets</servlet-class> </servlet> <servlet-mapping> <servlet-name>Servlets</servlet-name> <url-pattern>*.do</url-pattern> <!--接受.do的请求--> </servlet-mapping>
和普通的servlet配置一样吧。
因为下面要用到一些前台传过来的参数,所以先把前台的参数说明一下:
以一个form传递为例子:
user.do是action请求,"user"是下面要用到的类名
invokeMethod是类中的方法名,即"login"
<form name="login" action="user.do" method="post"> <input type="hidden" name="invokeMethod" value="login"> <input type="text" name="uesrname" /> <input type="submit" value="登录" /> </form>
关键的地方就在Servlets.java这个文件里面
String urlstr=request.getRequestURL().toString(); //获得请求的url
String str = urlstr.substring(urlstr.lastIndexOf("/") + 1, urlstr.length());//获得 "*.do" 这个action参数,上面form传过来的话就是得到 "user.do"
String filename = str.substring(0, str.lastIndexOf("."));//获得 ".do" 前面的字符串即:"user"
String actionName=Utils.toUpperCaseFirst(filename)+"Action";
/**
将user首字母大写后加上"Action" 得到类名,就是学要到达的地方-->"UserAction.java"
到达这个类以后,前台页面form那个hidden参数 "invokeMethod" 是这个类其中的一个方法,
根据java的反射机制调用这个方法进行相应的操作。两次反射就是整个框架的核心。
总体来说,就是前台的action是一个类名,"invokeMethod"是这个类的方法,根据java的反射
调用这个类的方法,实现mvc中的m,即action操作
**/
List params = new ArrayList();
params.add(request);//params
params.add(response);
Object object[] = { params };//params 是两个参数,即:request 和 response
CommandUtils.invoke(object, "com.actions." + actionName);
反射的代码见下面的附件。
现在就剩action的具体操作了,在这个例子中也就是UserAction.java中login这个方法的具体操作:
/**
这个类必须继承自ActionCommand (见附件)
类名中的User即为前台action请求".do"前的参数,在servlet中转化为UserAction
login即为前台页面form中的hidden参数invokeMethod
**/
public class UserAction extends ActionCommand {
/*
* 用户登录验证
*/
public void login(List args) throws IOException {
HttpServletRequest request = (HttpServletRequest) args.get(0);//获得request
HttpServletResponse response = (HttpServletResponse) args.get(1);//获得response
String uername = request.getParameter("username");//测试获得用户名
//下面就是可进行你的登录具体操作了
}
}
再说说怎么使用这个框架:
前台的话就是一个".do"的action的请求, 比如说上面的“use.do” ,在后台建立一个action类,UserAction.java继承ActionCommand,首字母必须大写
在该类中建一个名字为前台invokeMethod参数的方法名,并带入一个List参数。OK,测试一下!
好了,完是完了,不知道大家看懂没有了。呵呵。多多指点。下面附上两个反射的代码。


评论
xxx.do,在servlet中解析出xxx来。xxx通过spring配置具体处理这个请求的class
xxx.do?cmd=xxoo 同理在servlet中解析出xxoo来,发射就得到目标类的目标处理方法了。
现在不都流行CoC了吗,这里没有太大必要把xxx和对应的class用Spring配起来,不直接建一个XXX类来处理xxx不就完了吗。
更好的建议可以拿出来大家一起讨论一下啊。
要联系怎么个联系法啊?
我还有一些好的建议 也不知道该怎么说 可以联系
xxx.do,在servlet中解析出xxx来。xxx通过spring配置具体处理这个请求的class
xxx.do?cmd=xxoo 同理在servlet中解析出xxoo来,发射就得到目标类的目标处理方法了。
我有一个用了4年的url导航的架子,基本上就是这个路子,不过那时还没有rails那套,还是用的xml配置,把uri映射到jsp和对应的java bean,servlet里面可以做很多手脚,比如:使用反射,给已经实例化的javabean设置request中的form值,调用bean提供的校验数据的函数,然后再调用特定的入口函数,让bean去处理包含在内部的业务逻辑,最后检查bean的状态,适当处理异常,etc.
如果你想以后支持正则之类的东东,可以看看Rails里面的Route是怎么做的。