用了一段时间的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。
欢迎大家讨论,最好能多提点意见。
分享到:
相关推荐
Code::Blocks天龙八部之C++实现(下),大伙儿著。
颜色是我们日常设计、编程或网页制作中不可或缺的一部分,精准选取颜色对于作品的视觉效果至关重要。今天分享的是一款非常好用的取颜色小工具,它能够帮助我们轻松获取屏幕上的任何颜色值,大大提升工作效率。 首先...
1、内含两个文件:①、UEditor...4、需要一个资源分只是为了能下载东西,往大伙儿见谅; 5、最后一点是提示:如果要把UEditor使用在struts中,要重写web.xml中所有过滤.jsp或者.*的过滤器,不然上传图片和文件会失败。
1. **自定义View**:为了实现翻页效果,开发者通常会创建一个自定义的`View`类,覆盖`onDraw()`方法,用以绘制每一页的内容。在翻页过程中,页面会根据用户的滑动操作进行扭曲、折叠等变形动画,以模拟真实的翻页...
- **EXCEPT ALL**:返回在第一个查询中但不在第二个查询中的所有行,包括重复行。 - **INTERSECT**:返回同时存在于两个查询中的行。 - **INTERSECT ALL**:返回同时存在于两个查询中的所有行,包括重复行。 12....
我实在是搞不懂,就这官网一拉,maven一打包的东西为啥值十几个积分,程序员的开源精神哪儿去了?大伙儿可以直接去https://github.com/apache/dubbo/tree/dubbo-2.6.0 拉取压缩包,解压后找到dubbo-simple\dubbo-...
大家看一看,先上传一个线切割教程,不知大伙能不能用的着。
作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,... 最后,跟大伙儿说声抱歉。最近小弟比较穷,急需用钱,所以4页的Word文档,收大家2分钱,对不住了。有钱的捧个钱场,没钱的捧个人场。谢过了啊!!!
jqGrid是一个优秀的基于jQuery的DataGrid框架,想必大伙儿也不陌生,网上基于ASP的资料很少,我提供一个,数据格式是json的: 、一个针对jqGrid的json类:这段代码似乎是由官网论坛的一些PHP中转化而来,我们存为...
非常不错的数据库书籍,推荐大伙儿读 非常不错的数据库书籍,推荐大伙儿读
算法导论,关于算法最权威最全面最深入的书籍,分享给大伙儿~
闲来无事,给大家写了一个首页网页常见的侧栏滑动效果 点击左上角按钮,侧栏可以显示或者隐藏 本效果主要采用CSS3中的transform预计translate属性实现,点击按钮分别给侧栏增加或者删除对应的class名称,然后...
在UNIX下没有象WIN32平台下visual studio 那样的集成开发环境,都需要自己安装文本编辑器,编译器,debugger等,进行许多的复杂设置
anaconda最最新版本,5.1.0,奉献给大伙儿,官网网速100k以下,实在太慢了
因为最近一段时间,一直...这些都只是大伙儿理论上的猜测而已,而在我查了两天的资料之后,发现这个问题原来是可以解决的,而且实现的过程居然也很简单。只是用到了HTML5的file文件上传功能,再配合canvas即可。下面附
Eclipse是一个很好的java项目开发平台,但是,好多人不知道在命令行下如何运行Eclipse生成的Java项目。本作者为了给大伙儿排忧,特献上此资料。
究其缘故,一是因为大伙儿对新技术有着相同的原始渴求,至少知其然在谈天时可不能显得专门“土鳖”;二是在工作和生活环境中真正能参与实践大数据的案例实在太少了,因此大伙儿没有必要花时刻去知其因此然。 我希望...
前言 为了参加某个作秀活动,研究了一波如何结合小程序、科大讯飞...架构比较简单,大伙儿可以先看下图。除了小程序,需要提供 3 个服务,文件上传、音频编码及对接科大讯飞的服务。 node.js 对接科大讯飞的 api,npm
革命尚未成功,大伙儿还要努力哦。。。 JAVA代码和API文档我先发上来,UML我有时间再给大家做。。。。 希望大家通过修改代码,共同打造6688上完美的大富翁。。 希望大家修改过的代码也能把修改过的源代码发上来,...
MQTT 协议+W5500EVB+DHT11模拟实现了手机端可以在外网控制板载LED 灯的亮灭和实时接收 DHT11 采集到的数据,其中 W5500EVB 作为以太网网关,负责将采集 到的温湿度数据加上设定的主题按照 MQTT ...法给大伙儿分享下。