Struts:把JSP代码中的复杂逻辑转移出去
2009-06-17 22:11
330 查看
Struts框架为开发者提供了一套标签(html, logic, bean, nested, tile),可以大大简化JSP中的java代码。但是却因此而看到,有的朋友的JSP代码中有很多很复杂的逻辑,比如说多个<logic:equal>嵌套之类的代码。这样的代码不但复杂,代码量大,而且不容易让其他人看懂。
针对于这种情况,特提出以下两种改进方法。
一、使用第三方标签
struts框架本身自带的标签的功能有限,对于一些复杂的逻辑都需要开发者再次进行组合使用,这样很容易导致逻辑的多层嵌套。这不但在JSP,就是在Action等java代码中也是应该尽量避免的。有很多项目都会对嵌套的层次进行限制,但一般仅限于Action等java代码,对于JSP则很难进行限制。(当然,这不等于说JSP不需要限制。相反,对于JSP这种代码更应该进行限制,因为JSP代码写复杂了,反而比java代码难懂得多)
其次,struts自带的标签中,除了html标签是一定要配合struts框架来使用之外,其他的标签都不是必须的。
所以,假如不会受到项目需求的制约,或者版本的限制,推荐使用第三方的标签。
①一个是著名的JSTL标签。这个标签的很多功能与struts自带的logic,bean功能类似,但是要强的多。而且还有一些操作xml,sql等功能的标签。
比如说,使用struts的logic标签来表示两个条件均为真的话,就只能是用一个去套另外一个,而使用JSTL标签中的<c:if test="conditionA && conditionB">则可以同时接受两个条件,而且还可以把判断的结果赋值给一个变量。功能远比logic标签强大的多。
②其他的第三方标签有很多有特色的标签,比如说有一些显示table的标签如displaytag,eXtremeTable等,还有一些显示树形菜单的标签等等。这些都会大大方便开发者。
推荐几个网址:
1. JSTL的官方站点(Sun公司)
2. Apache的taglibs(同时也在开发维护JSTL)
3. 其他的一些第三方标签(开源大全)
二、让Action和ActionForm做些事情
从MVC的角度来讲,Action是属于Controller,ActionForm是属于View层,JSP也是属于View层。所以,最优先的考虑就是让ActionForm为JSP服务。
看到过很多的ActionForm中,只有属性和Getter,Setter,最多可能会有一个reset()方法,其他的任何代码都没有。也许有人会说,ActionForm就是一个DTO(数据传输对象),只要能够保证数据的传输就可以了。
这句话说的确实没错。但是ActionForm本就是View层的一部分,完全可以让它为同属于View层的JSP服务啊。这里举一个简单的例子来说明一下怎么样使ActionForm为JSP服务。
假如说有以下一个ActionForm,两个属性。
JSP上需要有如下的用法,判断当attr1的值为hello,attr2的值为world的时候,就执行什么代码。
那么我们可以在TestActionForm中增加一个方法isAttr3(),代码如下:
相应的JSP中的代码就可以改成如下:
以上只是一个简单的示例,有更复杂的内容也完全可以使用类似的方法搞定,把JSP的复杂逻辑代码转移到ActionForm中。
至于说把逻辑转移到Action中来,想必很多人都明白是怎么回事。虽然Action是属于Controller的一部分,但是它也要完成对BL(业务逻辑)的调用,并实现页面的跳转等工作。我们一般也会在Action中写一部分与View层相关的代码,比如说对ActionForm进行一些处理啊等等。所以讲,我们也是可以把JSP中的一些逻辑转移到Action中来的。
以上两种方法,并不局限于只使用其中一种。你可以根据项目的状况,要求,选择性地使用其中的一种或者多种共用都是可以的。
针对于这种情况,特提出以下两种改进方法。
一、使用第三方标签
struts框架本身自带的标签的功能有限,对于一些复杂的逻辑都需要开发者再次进行组合使用,这样很容易导致逻辑的多层嵌套。这不但在JSP,就是在Action等java代码中也是应该尽量避免的。有很多项目都会对嵌套的层次进行限制,但一般仅限于Action等java代码,对于JSP则很难进行限制。(当然,这不等于说JSP不需要限制。相反,对于JSP这种代码更应该进行限制,因为JSP代码写复杂了,反而比java代码难懂得多)
其次,struts自带的标签中,除了html标签是一定要配合struts框架来使用之外,其他的标签都不是必须的。
所以,假如不会受到项目需求的制约,或者版本的限制,推荐使用第三方的标签。
①一个是著名的JSTL标签。这个标签的很多功能与struts自带的logic,bean功能类似,但是要强的多。而且还有一些操作xml,sql等功能的标签。
比如说,使用struts的logic标签来表示两个条件均为真的话,就只能是用一个去套另外一个,而使用JSTL标签中的<c:if test="conditionA && conditionB">则可以同时接受两个条件,而且还可以把判断的结果赋值给一个变量。功能远比logic标签强大的多。
②其他的第三方标签有很多有特色的标签,比如说有一些显示table的标签如displaytag,eXtremeTable等,还有一些显示树形菜单的标签等等。这些都会大大方便开发者。
推荐几个网址:
1. JSTL的官方站点(Sun公司)
2. Apache的taglibs(同时也在开发维护JSTL)
3. 其他的一些第三方标签(开源大全)
二、让Action和ActionForm做些事情
从MVC的角度来讲,Action是属于Controller,ActionForm是属于View层,JSP也是属于View层。所以,最优先的考虑就是让ActionForm为JSP服务。
看到过很多的ActionForm中,只有属性和Getter,Setter,最多可能会有一个reset()方法,其他的任何代码都没有。也许有人会说,ActionForm就是一个DTO(数据传输对象),只要能够保证数据的传输就可以了。
这句话说的确实没错。但是ActionForm本就是View层的一部分,完全可以让它为同属于View层的JSP服务啊。这里举一个简单的例子来说明一下怎么样使ActionForm为JSP服务。
假如说有以下一个ActionForm,两个属性。
package cn.com.wsf.dims.view; import org.apache.struts.action.ActionForm; public class TestActionForm extends ActionForm { private String attr1 = null ; private String attr2 = null ; public String getAttr1() { return attr1 ; } public void setAttr1(String attr1) { this . attr1 = attr1; } public String getAttr2() { return attr2 ; } public void setAttr2(String attr2) { this . attr2 = attr2; } } |
< logic:equal name = "TestActionForm" property = "attr1" value = "hello" > < logic:equal name = "TestActionForm" property = "attr2" value = "world" > ...... </ logic:equal > </ logic:equal > |
package cn.com.wsf.dims.view; import org.apache.struts.action.ActionForm; public class TestActionForm extends ActionForm { private String attr1 = null ; private String attr2 = null ; public String getAttr1() { return attr1 ; } public void setAttr1(String attr1) { this . attr1 = attr1; } public String getAttr2() { return attr2 ; } public void setAttr2(String attr2) { this . attr2 = attr2; } public boolean isAttr3() { return "hello" .equals( attr1 ) && "world" .equals( attr2 ); } } |
< logic:equal name = "TestActionForm" property = "attr3" value = "true" > ...... </ logic:equal > |
至于说把逻辑转移到Action中来,想必很多人都明白是怎么回事。虽然Action是属于Controller的一部分,但是它也要完成对BL(业务逻辑)的调用,并实现页面的跳转等工作。我们一般也会在Action中写一部分与View层相关的代码,比如说对ActionForm进行一些处理啊等等。所以讲,我们也是可以把JSP中的一些逻辑转移到Action中来的。
以上两种方法,并不局限于只使用其中一种。你可以根据项目的状况,要求,选择性地使用其中的一种或者多种共用都是可以的。
相关文章推荐
- javascript调用在有母版的页面中注意的几点记录
- Javascript--global对象
- extjs 表单验证实例(转)
- javascript 对html内容的关键字高亮显示
- jsp联动菜单
- web 开发实例 ---jsp 代码块
- Javascript判断鼠标在元素外点击
- web 开发实例 ---js 代码块
- js处理ie关闭事件
- javascript获取屏幕,浏览器,网页高度宽度
- javascript中event.keycode大全
- 开始重新系统学习一下javascript
- javascript 常用正则表达式
- 介绍 JSON
- [Tips]:JavaScript命名空间
- JS设置 设为主页 加入收藏(转)
- 一份招聘需求的分析
- js时间倒计时方法(转)
- 真正页面无刷新调用数据原理
- javascript 中数组使用方法汇总