论坛首页 Java版

对jsf的怨念

浏览 7990 次
锁定老贴子 主题:对jsf的怨念
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2007-03-19 关键字: jsf
前一段时间看上了JSF所以就试着用jsf来写我的个人网站,写到现在一半多了,对他的怨念越来越强了!希望有哪一位高人可以帮我解脱下。

首先,jsf号称组件化编程,但在页面生成的阶段跟本没办法根据我的要求来增删改组件,这是我最大的怨念。jsf在生命周期的最前端“restore view”时生成了一个组件树,可这个组件树和后来的生命周期“render response”根本就不是相同的组件树,所以,你在组件树中的操作最多只能带到“invoke appllication”中,根本就对他的显现没什么关系,因为在组件树生成阶段他根本就不知道要显现的页面,他只会生成用户请求的组件树。这个组件树,应该是已经被序列化在HTML中的一个"hidden input"中。我在许多应用中还挺想用这个特性的,例如:对权限的设计的时候,想根据配制来显示和不显示组件,目前看来,这种方法也不能实现了。想根据一个配制文件去动态生成一个页面,这种应用,也不知要如何下手了。

其次,在标准的实现在,他的校验的组件,竟然没有javascript校验也没有ajax的方式来做校验,他只能根据用户的提交做服务器端的校验,在一此非业务逻辑的校验,在客户端能较验出来就好,因为一个EMAIL格式不对,再从,服务那里返回来,这好像说不过去点。这一点还好,我看到 了“ADF”他的组件库里,可以实然在客户端的较验,可我还没有把他加到我的应用中来。所以好不好用还不好说。

第三,以前,总觉得,asp.net有一个state view自动在客户端保存着让人很不爽(这是我个人觉得,以前刚用的时候不惯吧),现在没想到jsf 比asp.net更狠,用了两个hidden input。一个放state,一个放组件树,晕死,虽然可以放在session中,但总得还是有点不爽。

第四,在标准实现在,jsf竟然没有办法和jslt混用,jsf的运行期和jsp的,有很多地方不同,所以没有办法,在使用jslt的时候使用jsf自带的标签。想想jslt多常用啊,在许多不能用标准组件,又不想自己写组件时是十分有用的。在当时我没有使用facelets时,为了使用jstl还做了还用了很土的方法,用自己写的一段javascript来代替jsf组件。不过,如果你用的是jsf1.2那你就不会有这个怨念了。

总之,这就是我对JSF的怨念,除了第一个没有办法解决以外,其他的都已经有很好的解决办法。
   
最后更新时间:2007-03-19
有空我的话,我会再写一下,jsf让我爽的地方
   
0 请登录后投票
最后更新时间:2007-03-19
guoshiguan 写道
有空我的话,我会再写一下,jsf让我爽的地方

期待你的推出
   
0 请登录后投票
最后更新时间:2007-03-19
为什么大家都盯着JSF?推荐大家去看一下wicket,就知道JSF是多么的不好用。。。
   
0 请登录后投票
最后更新时间:2007-03-21
zhlmmc 写道
为什么大家都盯着JSF?推荐大家去看一下wicket,就知道JSF是多么的不好用。。。

主要是比较关心oracle adf faces
   
0 请登录后投票
最后更新时间:2007-03-21
现在JSF各种各样组件太多了,最大的问题是不兼容!就MyFaces来说吧,它也不是100%兼容sun的官方实现啊。而且JSF的标签真的很恶心,如果没有Seam的话,JSF根本没法用。。。。
   
0 请登录后投票
最后更新时间:2007-03-25
Hi,guoshiguan
对于第一个问题,JSF是可以通过Tag的binding属性来动态生成UI组件的

JSP:
<h:panelGroup id="dynamicGroup" binding="#{dynaHandler.dynamicPanelGroup}"></h:panelGroup>


Java code
	
private HtmlPanelGroup panelGroup;

public HtmlPanelGroup getDynamicPanelGroup(){
		Application application = FacesContext.getCurrentInstance().getApplication();
		if (this.panelGroup == null) {
			this.panelGroup = (HtmlPanelGroup) application
					.createComponent(HtmlPanelGroup.COMPONENT_TYPE);
		}
		List children = this.panelGroup.getChildren();
		children.clear();
		HtmlOutputText outputText = (HtmlOutputText) application
				.createComponent(HtmlOutputText.COMPONENT_TYPE);
		outputText.setValue("JSF");
		children.add(outputText);
		
		return this.panelGroup;
	}


这样就可以在页面中动态生成一段Text文本

JSF动态组件生成能力,确实值的高级用户关注.但目前来看,好象JSF在这块缺乏足够的支持.
以前有一个叫做smile的工程,可以在服务端生成整个页面,但这个项目已经停掉了,据说捐给
了MyFaces. 我在MyFaces里死活没找到.
   
0 请登录后投票
最后更新时间:2007-03-27
天之魔神 写道
不知他和STRUTS标签有什么区别,期待你的作品

struts 1.2里和jsp的标签一样只是简单的生成html的作用,他不直接处理用户的返回值,当然,也不会管事件和效验,还有数值的转换
这是我的一篇关于组件的开发,有兴趣的可以看下,
http://www.javaeye.com/topic/65794
   
0 请登录后投票
最后更新时间:2007-03-27
JJYAO 写道
Hi,guoshiguan
对于第一个问题,JSF是可以通过Tag的binding属性来动态生成UI组件的

JSP:
<h:panelGroup id="dynamicGroup" binding="#{dynaHandler.dynamicPanelGroup}"></h:panelGroup>


Java code
	
private HtmlPanelGroup panelGroup;

public HtmlPanelGroup getDynamicPanelGroup(){
		Application application = FacesContext.getCurrentInstance().getApplication();
		if (this.panelGroup == null) {
			this.panelGroup = (HtmlPanelGroup) application
					.createComponent(HtmlPanelGroup.COMPONENT_TYPE);
		}
		List children = this.panelGroup.getChildren();
		children.clear();
		HtmlOutputText outputText = (HtmlOutputText) application
				.createComponent(HtmlOutputText.COMPONENT_TYPE);
		outputText.setValue("JSF");
		children.add(outputText);
		
		return this.panelGroup;
	}


这样就可以在页面中动态生成一段Text文本

JSF动态组件生成能力,确实值的高级用户关注.但目前来看,好象JSF在这块缺乏足够的支持.
以前有一个叫做smile的工程,可以在服务端生成整个页面,但这个项目已经停掉了,据说捐给
了MyFaces. 我在MyFaces里死活没找到.

你说的这种方式我也想过,但,他没有办法更改组件的值,这个才是让人郁闷的地方
   
0 请登录后投票
最后更新时间:2007-03-27
zhlmmc 写道
现在JSF各种各样组件太多了,最大的问题是不兼容!就MyFaces来说吧,它也不是100%兼容sun的官方实现啊。而且JSF的标签真的很恶心,如果没有Seam的话,JSF根本没法用。。。。

的确有这种事情发生,我也遇到过,但,现在的JSF的组件,已经完善了,应该不用一次性有太多种的组件库
   
0 请登录后投票
论坛首页 Java版

跳转论坛:
JavaEye推荐