TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
相信很多使用jstl的朋友都抱怨过,为什么jstl只有<c:if 而没有elseif、else。当需要判断多个条件的时候,只能写多个<c:if 或者使用<c:choose。
虽然struts有elseif 和 else标签,不过看着就跟多个<c:if 没什么2样,使用如下: <s:if test=""> 1 </s:if> <s:elseif test=""> 2 </s:elseif> <s:else> 3 </s:else>
下面是本人实现的if elseif else。先看看使用代码:
<g:if test="">
1
<g:elseif test="" />
2
<g:else />
3
</g:if>
这样代码结构个人觉得更加清晰简单,类似freemarker的if elseif。
实现:
要实现上面说的if elseif,需要继承BodyTagSupport,利用BodyTagSupport的bodyContent的来实现该功能,这里不具体介绍如何实现jsp tag。直接贴出所有代码,有兴趣的自己看看。
public
class
IfTag
extends
BodyTagSupport{
public
IfTag() {
super
();
init();
}
@Override
public
void
release() {
super
.release();
init();
}
@Override
public
int
doStartTag()
throws
JspException {
if
(test){
this
.succeeded();
}
return
EVAL_BODY_BUFFERED;
}
@Override
public
int
doEndTag()
throws
JspException {
try
{
if
(subtagSucceeded)
pageContext.getOut().write(getBody());
}
catch
(IOException e) {
throw
new
JspException(
"
IOError while writing the body:
"
+
e.getMessage(), e);
}
init();
return
super
.doEndTag();
}
private
String body
=
null
;
//
用于存放成功条件后的内容
public
void
setBody(){
if
(body
==
null
){
body
=
bodyContent.getString().trim();
}
}
private
String getBody(){
if
(body
==
null
)
return
bodyContent.getString().trim();
else
return
body;
}
/**
* 判断if 或者 子 else if是否提交成功
*/
private
boolean
subtagSucceeded;
/**
* 子条件判断成功
*/
public
void
succeeded(){
subtagSucceeded
=
true
;
}
/**
* 是否已经执行完毕
*
@return
*/
public
boolean
isSucceeded(){
return
subtagSucceeded;
}
private
void
init() {
test
=
false
;
subtagSucceeded
=
false
;
body
=
null
;
}
private
boolean
test;
public
void
setTest(
boolean
test) {
this
.test
=
test;
}
}
public
class
ElseIfTag
extends
BodyTagSupport{
public
ElseIfTag() {
super
();
init();
}
@Override
public
int
doStartTag()
throws
JspException {
Tag parent
=
getParent();
if
(parent
==
null
||
!
(parent
instanceof
IfTag)){
throw
new
JspTagException(
"
else tag must inside if tag
"
);
}
IfTag ifTag
=
(IfTag)parent;
if
(ifTag.isSucceeded()){
//
已经有执行成功的条件,保存之前的HTML
ifTag.setBody();
}
else
if
(test){
//
当前条件为true,之前无条件为true
ifTag.succeeded();
//
则清除之前的输出
ifTag.getBodyContent().clearBody();
}
return
EVAL_BODY_BUFFERED;
}
@Override
public
void
release() {
super
.release();
init();
}
private
void
init() {
test
=
false
;
}
private
boolean
test;
public
void
setTest(
boolean
test) {
this
.test
=
test;
}
}
public
class
ElseTag
extends
BodyTagSupport{
public
void
release() {
super
.release();
}
public
int
doStartTag()
throws
JspException {
Tag parent
=
getParent();
if
(parent
==
null
||
!
(parent
instanceof
IfTag)){
throw
new
JspTagException(
"
else tag must inside if tag
"
);
}
IfTag ifTag
=
(IfTag)parent;
if
(ifTag.isSucceeded()){
//
已经有执行成功的条件,保存之前的html
ifTag.setBody();
}
else
{
//
之前没有的判断没有成功条件,则清除之前的输出
ifTag.getBodyContent().clearBody();
ifTag.succeeded();
}
return
EVAL_BODY_BUFFERED;
}
}
tld配置就不贴出来了,因为这个太简单了,大家都知道的。
|
|