您的位置:首页 > Web前端 > JavaScript

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

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中来的。

以上两种方法,并不局限于只使用其中一种。你可以根据项目的状况,要求,选择性地使用其中的一种或者多种共用都是可以的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: