Struts:把JSP代码中的复杂逻辑转移出去

 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,两个属性。

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;

    }

}

 

JSP上需要有如下的用法,判断当attr1的值为hello,attr2的值为world的时候,就执行什么代码。

< logic:equal  name = "TestActionForm"  property = "attr1"  value = "hello" >

     < logic:equal  name = "TestActionForm"  property = "attr2"  value = "world" >

   ......

   </ logic:equal >

</ logic:equal >

 

那么我们可以在TestActionForm中增加一个方法isAttr3(),代码如下:

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 );

    }

}

 

相应的JSP中的代码就可以改成如下:

< logic:equal  name = "TestActionForm"  property = "attr3"  value = "true" >

     ......

</ logic:equal >

 

以上只是一个简单的示例,有更复杂的内容也完全可以使用类似的方法搞定,把JSP的复杂逻辑代码转移到ActionForm中。

 

至于说把逻辑转移到Action中来,想必很多人都明白是怎么回事。虽然Action是属于Controller的一部分,但是它也要完成对BL(业务逻辑)的调用,并实现页面的跳转等工作。我们一般也会在Action中写一部分与View层相关的代码,比如说对ActionForm进行一些处理啊等等。所以讲,我们也是可以把JSP中的一些逻辑转移到Action中来的。

 

以上两种方法,并不局限于只使用其中一种。你可以根据项目的状况,要求,选择性地使用其中的一种或者多种共用都是可以的。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值