用shale解决jsf中的几个问题
vblvbl
2007-03-29
转载: http://www.blogjava.net/steady/archive/2006/03/07/33995.html
好久都没有去写点东西了,不过最近也没有太多的时间去专门研究一些东西,就把我在实践中的一些经验拿出来和大家分享。因为 iCustomer 这个使用 JSF 的项目,最近一直在尝试解决一些过去遗留下来的问题,比如说验证之类的,还有防止重复提交页面,最后加上一个日期转换的问题。 先说一下验证碰到的一些问题了,验证的时候我使用的是 Shale 的 <s:commonsValidator> 组件,按照它提供的标准方法的话在应用中会碰到一些问题。按照标准的方法,我们应该在 <h:form> 中写这样的东西,<h:form onsubmit="return validateForm(this);">,但是这样在 JSF 中会存在问题,当表单中有一个以上的 Action 事件或者 ValueChange 事件,我们知道,JSF的事件触发时会提交表单,这是就会触发<h:form>这个onsubmit里面的方法,所以这样的话,任何事件都会触发验证,但我们的表单里只有一个保存的 Action,需要验证输入,而其它的 Action 或 ValueChange 并不要求执行验证,这样的话,标准的方法就不太适用了,我看公司项目组的方法是写个方法,在不需要的时候调一个 JavaScript 把这个方法 Cancel 掉,但这样也比较麻烦,我目前采用的方法就是在需要验证的 Action 里面加上这样的方法来进行验证,也就是这样 <t:commandButton id="save" value="#{msg['system.button.save']}" action="#{parameterBean.save}" onclick="return validateForm(this.form)"/> ,这样的话,就只在我们需要验证的几个地方进行验证。 不过总的来说,Shale 提供的这种验证方式有时候可能会显得不够灵活,我们过去在 struts 中有两种方式,一种是针对 form 的验证,另一种是针对 action 的验证,如果我们要对某些表单元素在不同的 action 时执行不同的验证规则,就可以使用 action 验证了,但Shale 的这种方式就无能为力了。 然后要介绍一个防止重复提交的方法。在网上找了很久,好像就是没有人关注这个问题似的,不过这个问题在 struts 中有很不错的方法,就是使用 token,其实我要介绍的也是和这个完全相同的解决办法,很简单,一句话解决问题。我们如果看了 Shale 的一些文档的话,会注意到 Shale 里面有 <s:token> 这个标签,对就是这个,我们只要在 form 里加入这个标签的话,就可以了,如果重复提交的话,会提示出错的,不过出错信息是英文的,找了个比较暴力的方法,把信息改成中文的了,分享一下了,用 WinRAR 打开 shale-core.jar\org\apache\shale\resources,里面有一个 Bundle.properties 文件,把这个文件拿出来,把 token.invalid 改成你需要的信息,再把这个文件塞回去就可以了,比较暴力了,仅供应急使用,不推荐。 刚才出去帮人家看一个问题,经过做 JSF 那个项目组,想起来一个关于日期格式化的问题,拿出来说明一下了,对于中国用户,要把日期转换的 timeZone 设置成GMT+8才能转换正确,也就是这么写 <f:convertDateTime pattern="dd/MM/yyyy" timeZone="GMT+8"/>。 |