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,测试一下!

好了,完是完了,不知道大家看懂没有了。呵呵。多多指点。下面附上两个反射的代码。

 

 

 

  • com.rar (7.5 KB)
  • 描述:
  • 下载次数: 40
评论
terryang 2008-05-08
V 的话我用的是jstl,M的话就比较自由了,就是自定义的一些类。有数据库的话,可以使用dao进行封装。
stworthy 2008-05-07
前面只讨论到MVC中的C,剩下的MV怎么没说
nickcen 2008-05-06
azllza 写道
建议:
xxx.do,在servlet中解析出xxx来。xxx通过spring配置具体处理这个请求的class
xxx.do?cmd=xxoo 同理在servlet中解析出xxoo来,发射就得到目标类的目标处理方法了。


现在不都流行CoC了吗,这里没有太大必要把xxx和对应的class用Spring配起来,不直接建一个XXX类来处理xxx不就完了吗。
terryang 2008-05-06
呵呵,azllza 说的没错。我就是用它来做同一个业务层的操作。
更好的建议可以拿出来大家一起讨论一下啊。
要联系怎么个联系法啊?
azllza 2008-05-05
这样一个类 就可以实现对同一个业务对象 实现他的增,删,改,查等操作了。


我还有一些好的建议 也不知道该怎么说 可以联系
azllza 2008-05-05
建议:
xxx.do,在servlet中解析出xxx来。xxx通过spring配置具体处理这个请求的class
xxx.do?cmd=xxoo 同理在servlet中解析出xxoo来,发射就得到目标类的目标处理方法了。
terryang 2008-05-04
呵呵,谢谢两位的指点。的确实有很多要改进的地方。
SteveGY 2008-04-30
如果改一下servlet的url mapping,比如 /action/*,这样就可以和/action/下任意的url玩了,比如楼上讲的 /action/user.login,甚至也可以是 /action/user/login ,这样的url需要解析pathinfo,大概的意思就是这样的,如果你愿意,也可以使用这样的url /module/action/id :D,够rails风格了吧,呵呵。
我有一个用了4年的url导航的架子,基本上就是这个路子,不过那时还没有rails那套,还是用的xml配置,把uri映射到jsp和对应的java bean,servlet里面可以做很多手脚,比如:使用反射,给已经实例化的javabean设置request中的form值,调用bean提供的校验数据的函数,然后再调用特定的入口函数,让bean去处理包含在内部的业务逻辑,最后检查bean的状态,适当处理异常,etc.
nickcen 2008-04-30
你要做的其实就是一个URL转发的功能,不用加那么多hidden域,直接把URL写成user.login不就完了吗。
如果你想以后支持正则之类的东东,可以看看Rails里面的Route是怎么做的。
发表评论

提醒: 该博客已发表在公共论坛,博客所有留言会成为论坛回贴,留言请注意遵守论坛发贴规则

您还没有登录,请登录后发表评论

terryang
搜索本博客
最近加入圈子
存档
最新评论