`
jander
  • 浏览: 9364 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

一个简单web的构想,即将又一个山寨

阅读更多
动机:现在的web框架大都是庞然大物,学习曲线陡峭,难道就不能有5分钟能熟练应用的框架?我想做一个这样的。

大致思路: 根据url映射为各个Action类的method,进行控制器的调用,这样的好处是省略了view的配置。

框架的使用
1.实现一个具体的Action(见下面的Class Blog),并对其进行标记(只对Action类标记一个值)。
2.将标记的Action注入到Guice容器,就是要实现自己的Guice Module。
3.在web启动后,进行Guice注入,在ServeletContextListener中实现。
4.好像没有需要做的了。。。。除了写jsp\javascript\

实现
1.Action类大概的设计
Action类都implements Action 接口。Action接口是一个空接口,紧紧用于标识。
每个Action类都标记一个名称,Action的标记与method一起用于与url匹配.
每个Action可以实现多个方法.

@ActionAnnotation("blogs")
class Blog implements Action{
   ....
   
   public View new(HttpServeletRequest req,HttpServeletResponse resp){

    }

   //Action中的方法,模仿spring.
   public View list(HttpServeletRequest req,HttpServeletResponse resp){
         Map model=new HashMap();
         model.put("list",service.findAll());
         return new JstlView("/blogList.jsp",model);
    }
   ....
}


2.url路径转换器
//将url路径转换成MethodInvocation.
public class PathTranslator {
   public static MethodInvocation translate(String requestPath);
}

public class MethodInvocation{
   private Object object; //invocate action.
   private Method method; //invocate method of the action
   public Object inovate(Object... params);
}


3.建立一个MainServelet,将PathTranslator转化来的MethodInvocation进行调用.调用结果将返回一个View的对象.

4.View 表示框架视图.可以有JstlView,JsonView,RedirectView等等,不过暂时准备实现这三个。

流程
1.Client发出http://jander.iteye.com/admin/blogs/list请求;
2.该请求由MainServelet接收,发给PathTranslator翻译;
3.翻译结果出来是一个MethodInvocation对象,隐含我们要调用的Action Object和  method Object;
4.调用MethodInocation.innvocate方法,这将导致调用Action.method();
5.action.method()返回一个View。


就这样,应该没有问题,争取这两天做出来。
分享到:
评论
30 楼 funcreal 2009-06-17  
再补充一点,所有已经匹配过的url都进行缓存,这样就在下次调用的时候,就可以从缓存读取,加快速度。
29 楼 funcreal 2009-06-17  
你好,我已经实现过你说的东西,只不过我的controller,就是你所说的action,都是静态方法。

再有,我的方法的匹配是通过包名,类名,方法名来实现的。

举个例子:http://www.abc.com/a/b/TestCtrl.test.do
调用的是com.abc.controller.a.b.TestCtrl.class 的test方法。

目前该框架用于若干大型项目,半天上手。
28 楼 jander 2009-05-27  
to starfeng:
你想象的事情不会发生,这个框架就是基于url map class.method的,这个不会变。
变得只能是Action的实现方式,View的实现方式,就像前面rtm提出的那样。
27 楼 jander 2009-05-27  
to sslaowan:
你说的对,思路是一样的。不过我这个基于guice。而且,spring使用惯例优先原则(convention over configuration),就不能使用基于注解的控制器配置,这两个在spring中是矛盾体。DefaultAnnotationHandlerMapping和 ControllerClassNameHandlerMapping是 AbstractHandlerMapping的不同实现。

其时,不应该这样。
sslaowan 写道

我在想能不能自动扫描某个Package下的所有类,看其是否继承自Spring的控制类,如果继承了,就把其当成控制器加载到上下文里。

应该可以实现,混合DefaultAnnotationHandlerMapping和 ControllerClassNameHandlerMapping这两个,实现一个新的AbstractHandlerMapping。

其实,不用spring很幸福。不用趴在屏幕前,一个一个的bean查错。

另外,je好像有问题,我取你给的url(copy paste),结果浏览器直接转到http://till.iteye.com/blog/39633去了。
26 楼 starfeng 2009-05-27  
jander 写道
rtm 写道
可能你还是局限在springmvc里面

这个我承认。
rtm 写道
比方说Action返回值是否必须是View类型呢,其他类型可以吗?File?List?

这个觉得太难解决,其他类型?那就不是没有View了。

rtm 写道

如何以Action响应页面的ajax请求,整合普通的请求与ajax请求?

这个已经解决了,框架中有JsonView.

rtm 写道

当然我指的不是在action里面再手动输出流写出去,再比如你所响应页面请求是否必须是java代码呢,脚本可以吗?比如beanshell?

你太厉害了,这都能想,不过用脚本作Action倒是不错,哪天有时间试试。不过,我们有人测试过beanshell效率太低了,改成jpython还行。(可惜,我不会python)

我现在的View是这样的:
View
  |->DispatcherView
  |  |
  |  |-->JstlView
  | 
  |->JsonView
  |
  |->RedirectView
  |
  |->TextView   这个可以返回文本:html,text,javacript都可以。

View 的接口:
public interface View {
	public void render(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException;

}


不知道rtm有什么改进意见?真诚请教。



恩,你慢慢开始复杂了, 然后你接着要考虑, 是不是支持velocity view, freemarker view, jsp view.
接着,你还想考虑,是不是在转view前要注入一些instance到context中去增强view的功能
然后又又会考虑,view是不是要cache机制或是view要不要支持tag编写....

做完view,你又发现,哦,view都功能这么多了,是不是url的mapping功能要加强呢,毕竟不是所有的请求都可以直接用url mapping到class这么简单
然后,你再次引入annotation或xml支持用户自定义的mapping
然后,又以发现这种mapping还是不够灵活,再次引入interceptor机制....

最后,当你完成这些功能后, 你终于发现, 你所做的,不过是另一个spring mvc或struts之类的, 只是呢, 他们还是做得更好一点.
25 楼 sslaowan 2009-05-27  
jander 写道
mccxj 写道
jander 写道
对大家说一句:
希望大家对设计思路提意见,而不是冷嘲热讽和无声的新手票。

springmvc2.5的annotation,coc配置
等多就用xml配点bean,还麻烦么?
我是怎么看你的思路都和springmvc不是大同小异的么?
另外,2天弄出来的东西,功能真的够的上项目需求么?

ps:无冷嘲热讽之意思


我的思路是与spring mvc差不多,毕竟大部分时间就是用它。但也有不同点:
1.我使用guice作为ioc容器。spring和guice谁好,在于个人选择,我也不好说什么,个人不喜欢spring那种以字符串表示对象的方式。
2.因为使用url映射Action的method,比spring少了@RequestMapping这个标签。一个Controller一个这样的标签,项目一大,数量也是惊人不是,麻烦。

另外,我这个框架是不成熟的,我也没有说它是成熟的,只是想把自己的想法表达出来,作为交流的目的,我认为2天时间够了。

Spring MVC+CoC不就是这样?对比一下我写的http://sslaowan.iteye.com/blog/39633
你不用注解映射,不需要加@RequestMapping标签,由于Command继承了Spring的控制器类,我在想能不能自动扫描某个Package下的所有类,看其是否继承自Spring的控制类,如果继承了,就把其当成控制器加载到上下文里。
24 楼 jander 2009-05-27  
rtm 写道
零配置应该指的是 没有针对每个Action的配置,但是可以配置 符合规则的请求,比如说
你现在实现的零配置只是将action请求映射到guice,你可以再抽象一下,不就是根据一个请求的url找到 一个action吗,只是这个action配置在guice里面而已,你当然可以定义另外一种action查找方式,比如在spring中配置,或者其他更灵活的规则(注意你可以定义查找Action的规则)

可以考虑下。
不过对于传统的DispatcherView,RedirectView,实现起来很困难,搞不好又是一大坨配置文件。
23 楼 rtm 2009-05-26  
零配置应该指的是 没有针对每个Action的配置,但是可以配置 符合规则的请求,比如说
<rule pattern="*.ajax" type="beanshell/java" view="ajax">
比如 一个url, XX.Action 与 /user/XX.html 以及 XX.ajax 都可以是一个Action请求,你可以配置以 XX.ajax请求的就是ajax请求,这样就不需要在Action里面指定返回的view类型,导致你必须在Action里面new一个view返回,老实说这样不够优雅

你现在实现的零配置只是将action请求映射到guice,你可以再抽象一下,不就是根据一个请求的url找到 一个action吗,只是这个action配置在guice里面而已,你当然可以定义另外一种action查找方式,比如在spring中配置,或者其他更灵活的规则(注意你可以定义查找Action的规则)
22 楼 jander 2009-05-26  
rtm 写道
可能你还是局限在springmvc里面

这个我承认。
rtm 写道
比方说Action返回值是否必须是View类型呢,其他类型可以吗?File?List?

这个觉得太难解决,其他类型?那就不是没有View了。

rtm 写道

如何以Action响应页面的ajax请求,整合普通的请求与ajax请求?

这个已经解决了,框架中有JsonView.

rtm 写道

当然我指的不是在action里面再手动输出流写出去,再比如你所响应页面请求是否必须是java代码呢,脚本可以吗?比如beanshell?

你太厉害了,这都能想,不过用脚本作Action倒是不错,哪天有时间试试。不过,我们有人测试过beanshell效率太低了,改成jpython还行。(可惜,我不会python)

我现在的View是这样的:
View
  |->DispatcherView
  |  |
  |  |-->JstlView
  | 
  |->JsonView
  |
  |->RedirectView
  |
  |->TextView   这个可以返回文本:html,text,javacript都可以。

View 的接口:
public interface View {
	public void render(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException;

}


不知道rtm有什么改进意见?真诚请教。
21 楼 mikeandmore 2009-05-26  
sdh5724 写道
投你新手, 是因为你没有规模开发的经验导致你什么都想简单。 实际上现有的框架你可以不用复杂的功能的么。


不同意。。。
定位问题,有些东西就是轻量为好。
不是什么东西强大就好。比如我想在虚拟主机上部署我的个人主页,我想没有必要用那种大型的分布式数据库吧。(你可以认为节点数目为1啊)

我的意思,很多问题并不复杂。没有必要什么都把enterprise级别的东西弄上来。。。
Python社区很久很久以前就有成熟稳定的Zope。为什么还要有Django/Pylons。。。就是这个原因。
没有必要企业级别的问题我们为什么要Go Enterprise?
20 楼 mikeandmore 2009-05-26  
类似于某框架里面的@expose???
忘了是哪个了。。。
19 楼 rtm 2009-05-26  
可能你还是局限在springmvc里面,比方说Action返回值是否必须是View类型呢,其他类型可以吗?File?List?如何以Action响应页面的ajax请求,整合普通的请求与ajax请求?当然我指的不是在action里面再手动输出流写出去,再比如你所响应页面请求是否必须是java代码呢,脚本可以吗?比如beanshell?
至于springmvc,webwork2,struts2等所谓的传统web框架,完全可以一脚踢开他们,实现更灵活更优雅的结构,别被这些烂货忽悠了,一个web框架而已
18 楼 jander 2009-05-26  
iaimstar 写道
jander 写道
iaimstar 写道
waf就很简单

能给个链接吗?恕我孤陋寡闻。


- -不是吧

sun 的pet-store,链接的木有,老框架了

晕死,太老了,从来没用过。只看过strut1.0和spring的petstore。呵呵。
17 楼 iaimstar 2009-05-26  
jander 写道
iaimstar 写道
waf就很简单

能给个链接吗?恕我孤陋寡闻。


- -不是吧

sun 的pet-store,链接的木有,老框架了
16 楼 jander 2009-05-26  
findhappy7 写道
我都是感觉实际上某些MVC框架是很繁琐的,一个框架总是想做超多的事情(页面展现,页面构件,数据验证,action转向,到后台数据处理,),一开始某些MVC也很轻巧(可能就和你这个一样,那时候应该还没出名),后来,不断的扩展、伸张到web开发的各个环节,,对其他 方案框架等,支持也越来越多,于是就变得很笨重了,,
所以,如果不想用现有的mvc,,自己写个也无妨,,
----
不过,个人认为自己写得mvc可能也会有走有流行MVC框架一样的路,先是一开始很简单,就是一个拦截调用相关业务流程的,并返回的过程,,但慢慢也是不断的加上对其他各个方案的支持,也就不断的容重起来,,


深有感触,现在好多开源项目都大包大揽。
我这个只是表达想法的练习项目,不会去支持各种各样的功能。有时间把核心优化好就不错了。
也许呢,我会用它做一些小项目。

15 楼 jander 2009-05-26  
iaimstar 写道
waf就很简单

能给个链接吗?恕我孤陋寡闻。
14 楼 iaimstar 2009-05-26  
waf就很简单
13 楼 jander 2009-05-26  
sdh5724 写道
投你新手, 是因为你没有规模开发的经验导致你什么都想简单。 实际上现有的框架你可以不用复杂的功能的么。

我这个主要是要解决视图映射的自动处理,不要标记或者配置。
嗯,你喜欢复杂,是不是专门用一个人来管理视图配置,你才觉得项目够规模?
12 楼 sdh5724 2009-05-26  
投你新手, 是因为你没有规模开发的经验导致你什么都想简单。 实际上现有的框架你可以不用复杂的功能的么。
11 楼 lw223 2009-05-26  
既然想搞简单web,那就不要用java了,java真的不适合。

几分钟搞定的web框架还是动态语言最适合。

相关推荐

    Web移动应用框架构想.docx

    【Web移动应用框架构想】 Web移动应用框架是专门为移动设备设计和开发的,它们旨在提供高效、轻量级的解决方案,以优化在智能手机和平板电脑上的用户体验。这些框架允许开发者构建具有桌面级功能和流畅交互的Web...

    基于Web-GIS的森林资源管理信息系统构想

    《基于Web-GIS的森林资源管理信息系统构想》是一篇探讨如何利用现代信息技术提升森林资源管理效率和质量的学术文章。Web-GIS(Web Geographic Information System)是将地理信息系统(GIS)与互联网技术相结合,实现...

    web3.0-PPt简介.ppt 文档

    Web 3.0 是一个正在兴起的概念,它将互联网转化为数据库,并朝向人工智能和语义网络的方向发展。以下是 Web 3.0 的一些关键特点和技术: 1. 数据网络:Web 3.0 的第一步是将互联网转化为数据库,即结构化数据集以可...

    数据库设计构想

    数据库设计是IT领域中至关重要的一个环节,它关乎到系统的性能、可扩展性和数据的一致性。本资料“数据库设计构想”深入探讨了在构建高效数据库时应考虑的关键因素和设计方法。以下是对这些核心知识点的详细阐述: ...

    PythonWeb开发实战(董伟明著)

    作者董伟明在序言中强调,Python Web开发不仅仅局限于会使用某个框架进行简单的代码编写,而是需要更多的技能和知识来构建一个具有可扩展性、高效性和高可用性的Web系统。因此,这本书为读者展示了Python Web开发...

    Web3.0视角下的地方志信息化平台建设构想.pdf

    【标题】:Web3.0视角下的地方志信息化平台建设构想 【描述】:本文并未直接涉及Web3.0技术或地方志信息化平台建设,而是关于小小说标题艺术的探讨。 【标签】:Web开发 开发技术 互联网 网页技术 专业指导 ...

    规划管理系统构想

    根据给定文件的信息,我们可以提炼出关于“规划管理系统构想”的相关知识点,主要涉及规划管理系统的构架设计、系统功能以及实现目标等几个方面。 ### 规划管理系统构想 #### 一、系统概述 规划管理系统是针对...

    web_asp程序设计及网页设计

    尽管这与我们现在使用的万维网大不相同,但是它们有许多相同的核心思想,甚至还包括一些伯纳斯-李的万维网之后的下一个项目语义网中的构想。 1989年3月,伯纳斯-李撰写了《关于信息化管理的建议》一文,文中提及 ...

    方配WMS框架快速Web应用开发教程

    很多的同学认为学习.NET 开发要比学习 JAVA 做项目要容易吧,不过用.NET 做一个小程序很简单, 但要你开发一个商业化系统就没那么容易了,而这套框架的目的就是让新手开发一个系统,就像他 们开发一个“计算器”小...

    电商发展思路构想.pptx

    电商发展思路构想.pptx

    特斯拉的_异端_世界无线充电构想

    特斯拉,作为交流电的先驱,不仅在电力系统方面做出了革命性的贡献,还设想了一个无需物理连接的全球无线充电网络。他的核心理念是利用电磁波来传输能量,类似于现代的无线电广播,但特斯拉构想的系统更为高效,能够...

    网站架构建议及构想

    网站架构设计是构建高效、可扩展且易于维护的web应用程序的关键。本文主要探讨了网站架构的基本需求、目标、...通过合理划分层次,明确职责,以及灵活、简单的设计原则,可以构建出适应不断变化需求的高质量web系统。

    web原型设计工具

    Web原型设计工具是用于创建网页或应用程序交互模型的软件,它们帮助设计师在开发过程中快速构建出界面布局和功能流程的初步构想。这些工具通常强调易用性,以手绘风格呈现,给予用户自然、直观的体验。...

    Web Application Development with Yii and PHP(第二版)

    本书的重点在于通过实际操作来学习Yii框架,具体方法是通过构建一个基于Web的项目任务跟踪系统,从项目构想到生产部署的整个过程中逐步深入地讲解。项目任务跟踪系统是一个典型的Web应用程序,它可以帮助团队组织、...

    智慧城市实施路径构想.pdf

    智慧城市实施路径构想.pdf

    大型企业总部网络构想、设计、实施

    构想阶段,我们需要考虑如何支持大量的信息点(500-1000个),确保网络的稳定性和高效性,同时预留足够的扩展空间,以适应企业的持续增长。 设计是网络建设的关键环节。首先,网络拓扑的选择至关重要,常见的有星型...

Global site tag (gtag.js) - Google Analytics