用了一段时间的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或者.*的过滤器,不然上传图片和文件会失败。
我实在是搞不懂,就这官网一拉,maven一打包的东西为啥值十几个积分,程序员的开源精神哪儿去了?大伙儿可以直接去https://github.com/apache/dubbo/tree/dubbo-2.6.0 拉取压缩包,解压后找到dubbo-simple\dubbo-...
这是一个关于jsp环境变量的全解教程‘很全,希望能给大伙儿带来一点方便
github下载太慢,给大伙儿下载下来共享使用
关于PID,是否了解,一看便知,分享给大伙儿。
大家看一看,先上传一个线切割教程,不知大伙能不能用的着。
作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,... 最后,跟大伙儿说声抱歉。最近小弟比较穷,急需用钱,所以4页的Word文档,收大家2分钱,对不住了。有钱的捧个钱场,没钱的捧个人场。谢过了啊!!!
包含 数据库的相关操作 如创建库 备份库 创建表 修改表
Source Insight 4.0仿Boxy的Solarized-Dark主题。因为个人喜欢Solarized dark的颜色风格。所以鼓捣出一个分享给大伙儿。
数据结构课程设计,传给大伙儿阅览一下,希望对你有用.
非常不错的数据库书籍,推荐大伙儿读 非常不错的数据库书籍,推荐大伙儿读
算法导论,关于算法最权威最全面最深入的书籍,分享给大伙儿~
闲来无事,给大家写了一个首页网页常见的侧栏滑动效果 点击左上角按钮,侧栏可以显示或者隐藏 本效果主要采用CSS3中的transform预计translate属性实现,点击按钮分别给侧栏增加或者删除对应的class名称,然后...
很不错的flash个人网站模板,比较了很多,觉得这个最好,推荐给大伙儿试试~真的很不错
在UNIX下没有象WIN32平台下visual studio 那样的集成开发环境,都需要自己安装文本编辑器,编译器,debugger等,进行许多的复杂设置
物流管理系统开题报告 为了弄点儿积分 大伙儿给个机会吧
anaconda最最新版本,5.1.0,奉献给大伙儿,官网网速100k以下,实在太慢了
因为最近一段时间,一直...这些都只是大伙儿理论上的猜测而已,而在我查了两天的资料之后,发现这个问题原来是可以解决的,而且实现的过程居然也很简单。只是用到了HTML5的file文件上传功能,再配合canvas即可。下面附