`
pf_miles
  • 浏览: 134263 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

给大伙儿preview一个有意思的东西

阅读更多
用了一段时间的seam,感觉seam有很多先进的思想值得发扬,但这段时间内我正一步一步地变得不喜欢JSF;因为它的组件开发很困难,还因为JSF本身许多已实现的组件——像richFaces或iceFaces——也有很多很多让人眼花缭乱的属性在使用的过程中需要学习,熟悉,感觉还是很麻烦,不如直接使用HTML和JS的知识来作view方便。
我在这里没有带任何感情色彩地针对JSF,我只是实话实说我认为的JSF的缺点;
并且,更重要的,我想让seam脱离JSF也能使用,而且因为比较着急,我从上个星期开始,就在抽时间做一件事情——Seam-Velocity;并且到现在,这个工具(我暂且叫它工具吧),已经能胜任大部分的seam-web开发工作了,虽然可能会有一些bug;seam手册自带的前几个例子是没问题的;
好了,说说这个seam-velocity到底是个什么东西吧:
它当然是一个抛弃JSF,转而使用velocity,用传统的HTML、JS来开发seam应用的东西,彻底替换seam中view的开发技术,算是个小小的表现层——控制层框架。

介绍一些大致的信息:

首先,请求处理流程:


那么,front-controller的代码骨架就差不多是这样:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
            IOException {
        /*
         * if value binding exists, update values in contexts, except
         * conversationId, 'action' param and converter setting params
         */
        
        this.updateValue(req, exList);

        // if action event exists, execute the action
        if (StringUtils.isNotEmpty(req.getParameter(FORM_ACTION_PARAM))) {

            // invoke action
            String target = this.doAction(req);

            // action invoke returned non-null value
            if (StringUtils.isNotEmpty(target)) {

                // need redirect, doing redirect
                if (target.startsWith(REDIRECT_PREFIX)) {
                    resp.sendRedirect(StringUtils.substringAfter(target, REDIRECT_PREFIX));
                    return;
                    // end request
                } else {
                    /*
                     * need no redirect, merge returned page and context vars,
                     * send out conversation id, write response
                     */
                    try {
                        this.mergeContextVarsAndConversationIdAndWriteResponse(target, req, resp);
                    } catch (Exception e) {
                        log.error(e);
                    }
                    return;
                    // end request
                }
            }

            /*
             * action invoke returned empty, doing the same as
             * 'no-action-event-request'
             */
        }

        /*
         * no action event, merge requesting page and context vars, send out
         * conversation id, write response.
         */
        String requestingPageVm = this.getRequestingPageVm(req);
        try {
            this.mergeContextVarsAndConversationIdAndWriteResponse(requestingPageVm, req, resp);
        } catch (Exception e) {
            log.error("Write response failed!");
            log.error(e);
        }
        return;
        // end request
    }


也就是在一个SeamVelocityController的Servlet中描述了上图中所画出的请求处理流程。

以及我简单实现的一个小例子,跟手册里的第一个例子——registration差不多:





这个例子的页面写起来就是这样——完全是velocity的页面,没有JSF:
#set($entries=$pullTool.pull("entries"))
<html>
<head>
  <title>Seam Without JSF Demo</title>
  <script language="javascript">
  	function deleteEntry(id){
		document.form1.entry_id.value = id;
		form1.submit();
	}
  </script>
</head>
<body>
	#if(${cid})
		<h1>ConversationId: ${cid}</h1>
	#end
	<hr />
	Add new entry: 
	<form>
		<lable for="title">Entry Title:</lable>
		<input id="title" type="text" name="entry_title" value=""><br />
		<lable for="entryContent">Entry Content:</lable>
		<TEXTAREA id="entryContent" name = "entry_content"></TEXTAREA>
		<input type="hidden" name="action" value="entryAction_createNewEntry"><br />
		<input type="submit" value="Add">
	</form>
	#if(${entries}&&${entries.size()}!=0)
		<table border="1" cellpadding="0" cellspacing="0" width="500">
			<tr>
				<td>
					<h6>Id</h6>
				</td>
				<td>
					<h6>Title</h6>
				</td>
				<td>
					<h6>Action</h6>
				</td>
			</tr>
			<form name="form1">
    			#foreach(${e} in ${entries})
    				<tr>
    					<td>
    						${e.id}
    					</td>
    					<td>
    						${e.title}
    					</td>
    					<td>
    						<input type="hidden" name="action" value="entryAction_deleteEntry">
    						<input type="button" value="Delete" onclick="deleteEntry(${e.id})">
    					</td>
    				</tr>
				#end
				<input type="hidden" name="entry_id" value="">
			</form>
		</table>
	#else
		<h2>There are no entries.</h2>
	#end
</body>
</html>


可以从页面源码里面看到,已经支持了表单值绑定、action方法提交、pullTool工具;

这个例子很简单,以后我会用它实现更多手册里的示例;
这个小框架的目标是保留seam的所有功能,但砍掉JSF;

对于这个表现层本身,这里列一下我想要让他支持的功能:
1)数据单向绑定,提交时更新
2)表单提交时,可执行action方法
3)提供“拉(pullTool)”工具,让velocity页面里也能写EL表达式从服务端“拉”数据
4)表单提交值转换(converter),以及自定义converter
5)分模块开发,seam-velocity并不会因为失去了Facelets而失去了分页面模块开发的功能

以后可能会再增加;

目前在googleCode上的项目地址:http://code.google.com/p/seam-velocity/

svn中有一个毛坯实现,基本能用,不过可能会有一些bug;暂不提供release下载,还需成熟。

接下来这段时间要忙论文的事情,所以要等到7月初的时候我再来推这个项目;
也正好,在这段停滞时间中可以听听圈子里的意见,我相信还有人跟我有类似的想法,想用别的东西来代替JSF。

欢迎大家讨论,最好能多提点意见。
分享到:
评论
2 楼 fly.net.cn 2008-10-21  
能留个msn吗?
1 楼 fly.net.cn 2008-10-21  
你好,我们也正在研究seam,但是不太喜欢jsf,但是又享用seam

相关推荐

    Code::Blocks天龙八部之C++实现(下),大伙儿著。

    Code::Blocks天龙八部之C++实现(下),大伙儿著。

    非常好用的取颜色小工具,奉献给大伙

    颜色是我们日常设计、编程或网页制作中不可或缺的一部分,精准选取颜色对于作品的视觉效果至关重要。今天分享的是一款非常好用的取颜色小工具,它能够帮助我们轻松获取屏幕上的任何颜色值,大大提升工作效率。 首先...

    使用UEditor实现富文本编辑图片上传附件上传实例

    1、内含两个文件:①、UEditor...4、需要一个资源分只是为了能下载东西,往大伙儿见谅; 5、最后一点是提示:如果要把UEditor使用在struts中,要重写web.xml中所有过滤.jsp或者.*的过滤器,不然上传图片和文件会失败。

    Android真实翻书效果

    1. **自定义View**:为了实现翻页效果,开发者通常会创建一个自定义的`View`类,覆盖`onDraw()`方法,用以绘制每一页的内容。在翻页过程中,页面会根据用户的滑动操作进行扭曲、折叠等变形动画,以模拟真实的翻页...

    sql 经典语句信息共享给大伙

    - **EXCEPT ALL**:返回在第一个查询中但不在第二个查询中的所有行,包括重复行。 - **INTERSECT**:返回同时存在于两个查询中的行。 - **INTERSECT ALL**:返回同时存在于两个查询中的所有行,包括重复行。 12....

    dubbo-monitor-simple-2.6.0-assembly.tar.gz

    我实在是搞不懂,就这官网一拉,maven一打包的东西为啥值十几个积分,程序员的开源精神哪儿去了?大伙儿可以直接去https://github.com/apache/dubbo/tree/dubbo-2.6.0 拉取压缩包,解压后找到dubbo-simple\dubbo-...

    先上传一个线切割教程,大伙用的着用不着?

    大家看一看,先上传一个线切割教程,不知大伙能不能用的着。

    Java软件架构师所要需的东西

    作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,... 最后,跟大伙儿说声抱歉。最近小弟比较穷,急需用钱,所以4页的Word文档,收大家2分钱,对不住了。有钱的捧个钱场,没钱的捧个人场。谢过了啊!!!

    ASP 使用jqGrid实现读写删的代码(json)

    jqGrid是一个优秀的基于jQuery的DataGrid框架,想必大伙儿也不陌生,网上基于ASP的资料很少,我提供一个,数据格式是json的: 、一个针对jqGrid的json类:这段代码似乎是由官网论坛的一些PHP中转化而来,我们存为...

    SQL必知必会(第3版).part2.rar

    非常不错的数据库书籍,推荐大伙儿读 非常不错的数据库书籍,推荐大伙儿读

    算法导论——算法经典

    算法导论,关于算法最权威最全面最深入的书籍,分享给大伙儿~

    懒人原生移动网页侧滑栏滑动效果

    闲来无事,给大家写了一个首页网页常见的侧栏滑动效果 点击左上角按钮,侧栏可以显示或者隐藏 本效果主要采用CSS3中的transform预计translate属性实现,点击按钮分别给侧栏增加或者删除对应的class名称,然后...

    给大伙分享一下unix面试的常见题目

    在UNIX下没有象WIN32平台下visual studio 那样的集成开发环境,都需要自己安装文本编辑器,编译器,debugger等,进行许多的复杂设置

    Anaconda3-5.1.0-Windows-x86_64 最新版

    anaconda最最新版本,5.1.0,奉献给大伙儿,官网网速100k以下,实在太慢了

    HTML5+Canvas调用手机拍照功能实现图片上传(上)

    因为最近一段时间,一直...这些都只是大伙儿理论上的猜测而已,而在我查了两天的资料之后,发现这个问题原来是可以解决的,而且实现的过程居然也很简单。只是用到了HTML5的file文件上传功能,再配合canvas即可。下面附

    运行Eclipse生成的Java项目

    Eclipse是一个很好的java项目开发平台,但是,好多人不知道在命令行下如何运行Eclipse生成的Java项目。本作者为了给大伙儿排忧,特献上此资料。

    一篇文章让你认识并读懂大数据.doc

    究其缘故,一是因为大伙儿对新技术有着相同的原始渴求,至少知其然在谈天时可不能显得专门“土鳖”;二是在工作和生活环境中真正能参与实践大数据的案例实在太少了,因此大伙儿没有必要花时刻去知其因此然。 我希望...

    30分钟快速实现小程序语音识别功能

    前言 为了参加某个作秀活动,研究了一波如何结合小程序、科大讯飞...架构比较简单,大伙儿可以先看下图。除了小程序,需要提供 3 个服务,文件上传、音频编码及对接科大讯飞的服务。 node.js 对接科大讯飞的 api,npm

    dafuwen.rar_Author_ Author_dafuw_dafuwen

    革命尚未成功,大伙儿还要努力哦。。。 JAVA代码和API文档我先发上来,UML我有时间再给大家做。。。。 希望大家通过修改代码,共同打造6688上完美的大富翁。。 希望大家修改过的代码也能把修改过的源代码发上来,...

    STM32F103+W5500_MQTT.zip

    MQTT 协议+W5500EVB+DHT11模拟实现了手机端可以在外网控制板载LED 灯的亮灭和实时接收 DHT11 采集到的数据,其中 W5500EVB 作为以太网网关,负责将采集 到的温湿度数据加上设定的主题按照 MQTT ...法给大伙儿分享下。

Global site tag (gtag.js) - Google Analytics