Struts2自定义标签3模仿原有的s:if s:elseif s:else自定义自己的if elsif else

时间:2023-03-09 08:52:38
Struts2自定义标签3模仿原有的s:if s:elseif s:else自定义自己的if elsif else

第一步:webroot/web-inf下简历str.tld文件

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib> <!-- 自定义库标签的根 -->
<tlibversion>1.2</tlibversion> <!-- 版本号 -->
<jspversion>1.1</jspversion> <!-- JSP版本号 -->
<shortname>stu</shortname> <!-- prefix="stu"标签名称-->
<uri>StudentTags</uri> <!-- uri="StudentTags" 外界导入标签时,认识的名字,很重要。--> <tag>
<name>selectAll</name> <!-- 标签名称 -->
<tagclass>com.bjsxt.sxf.tag.SeclectAllSt</tagclass> <!-- 对应的java类的全路径 -->
</tag> <!-- 有属性的标签,可以有多个属性 <attribute>并列 -->
<tag>
<name>selectBySex</name> <!-- 标签名称 -->
<tagclass>com.bjsxt.sxf.tag.SeclectStBySex</tagclass>
<attribute> <!-- 对应标签的属性。 -->
<name>sex</name>
<required>true</required> <!-- 是必需写的属性,即没有写属性标签不能被正常使用 -->
</attribute>
</tag>
<!-- 按班级学生id查询出班级集合,存放到属性var指定的变量中,然后利用s标签的迭代标签,将var指定的变量存放的学生集合遍历出来 -->
<tag>
<name>selectByClassId</name> <!-- 标签名称 -->
<tagclass>com.bjsxt.sxf.tag.MyTag</tagclass> <!-- 对应的java类的全路径 -->
<body-content>JSP</body-content><!-- 如果不需要标签体则设置empty,反之设定jsp,内部可以运行jsp所有的语法 -->
<attribute>
<name>classId</name><!--指定属性名 和标签java类一致-->
<required>true</required><!--该属性是否是必须,如果非必须没设置则为空。 -->
<rtexprvalue>true</rtexprvalue><!-- 该属性能不能动态使用表达式为该属性赋值 true可以 false不可以 使用脚本和EL表达式来获取动态的值 -->
</attribute>
<attribute>
<name>var</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>num</name>
<required>false</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
<!-- 自定义的myif标签 -->
<tag>
<name>myif</name>
<tagclass>com.bjsxt.sxf.tag.MyIfTag</tagclass>
<bodycontent>JSP</bodycontent>
<attribute>
<name>flag</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>condition</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<!-- 自定义的myelseif标签 -->
<tag>
<name>myelseif</name>
<tagclass>com.bjsxt.sxf.tag.MyElseIfTag</tagclass>
<bodycontent>JSP</bodycontent>
<attribute>
<name>flag</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>condition</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<!-- 自定义的myelse标签 -->
<tag>
<name>myelse</name>
<tagclass>com.bjsxt.sxf.tag.MyElseTag</tagclass>
<bodycontent>JSP</bodycontent>
</tag> </taglib>

第二步:建立标签类

 package com.bjsxt.sxf.tag;

 import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.struts2.components.Component;
import org.apache.struts2.views.jsp.ComponentTagSupport; import com.bjsxt.sxf.tag.compant.MyIfComponent;
import com.opensymphony.xwork2.util.ValueStack;
/**
* myif的标签类
* @ClassName: MyIfTag
* @Description: TODO(这里用一句话描述这个类的作用)
* @author 尚晓飞
* @date 2014-10-22 下午3:46:45
*
*/
public class MyIfTag extends ComponentTagSupport {
private String flag;//if判断的标示
private String condition;//可以传递的多个参数代表 //生成标签逻辑类的对象。多态。父类引用,指向子类对象
@Override
public Component getBean(ValueStack arg0, HttpServletRequest arg1,
HttpServletResponse arg2) {
return new MyIfComponent(arg0, arg1,arg2);
} //给逻辑类的属性赋值
@Override
protected void populateParams() {
super.populateParams();
MyIfComponent myIfComponent=(MyIfComponent) getComponent();
myIfComponent.setFlag(flag);
myIfComponent.setCondition(condition);
} public String getFlag() {
return flag;
} public void setFlag(String flag) {
this.flag = flag;
} public String getCondition() {
return condition;
} public void setCondition(String condition) {
this.condition = condition;
} } package com.bjsxt.sxf.tag; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.struts2.components.Component;
import org.apache.struts2.views.jsp.ComponentTagSupport; import com.bjsxt.sxf.tag.compant.MyElseIfComponent;
import com.opensymphony.xwork2.util.ValueStack;
/**
* myelseif的标签类
* @ClassName: MyElseIfTag
* @Description: TODO(这里用一句话描述这个类的作用)
* @author 尚晓飞
* @date 2014-10-22 下午3:47:59
*
*/
public class MyElseIfTag extends ComponentTagSupport{
private String flag;//elsif判断的标示
private String condition;//可以传递的多个参数代表 //返回该标签逻辑类的对象
@Override
public Component getBean(ValueStack arg0, HttpServletRequest arg1,
HttpServletResponse arg2) { return new MyElseIfComponent(arg0, arg1, arg2);
} //给该标签逻辑类对象赋值
@Override
protected void populateParams() {
super.populateParams();
MyElseIfComponent myElseIfComponent=(MyElseIfComponent) getComponent();
myElseIfComponent.setFlag(flag);
myElseIfComponent.setCondition(condition);
}
public String getFlag() {
return flag;
}
public void setFlag(String flag) {
this.flag = flag;
}
public String getCondition() {
return condition;
}
public void setCondition(String condition) {
this.condition = condition;
} } package com.bjsxt.sxf.tag; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.struts2.components.Component;
import org.apache.struts2.views.jsp.ComponentTagSupport; import com.bjsxt.sxf.tag.compant.MyElseComponent;
import com.opensymphony.xwork2.util.ValueStack;
/**
* 自定义的else标签
* @ClassName: MyElse
* @Description: TODO(这里用一句话描述这个类的作用)
* @author 尚晓飞
* @date 2014-10-22 下午2:24:30
*
*/
public class MyElseTag extends ComponentTagSupport{ @Override
public Component getBean(ValueStack arg0, HttpServletRequest arg1,
HttpServletResponse arg2) {
// TODO Auto-generated method stub
return new MyElseComponent(arg0, arg1, arg2);
} @Override
protected void populateParams() {
// TODO Auto-generated method stub
super.populateParams();
} }

第三步:建立标签逻辑类

 package com.bjsxt.sxf.tag.compant;

 import java.io.Writer;

 import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.struts2.components.Component; import com.opensymphony.xwork2.util.ValueStack; /**
* myif标签逻辑类 没有@的标签注解,好像不影响,
* @ClassName: MyIfComponent
* @Description: TODO(这里用一句话描述这个类的作用)
* @author 尚晓飞
* @date 2014-10-22 下午3:49:40
*
*/
public class MyIfComponent extends Component {
protected String flag;
protected String condition;
public static final String MyANSWER = "struts.if.answer";
protected Boolean answer; public MyIfComponent(ValueStack stack,HttpServletRequest req,HttpServletResponse resp) {
super(stack);
} //标签运行开始执行
@Override
public boolean start(Writer writer) {
answer = (Boolean) findValue(flag, Boolean.class);
if (answer == null) {
answer = Boolean.FALSE;
} stack.getContext().put(MyANSWER, answer);
boolean flg=answer.booleanValue();
return flg;
} //标签运行结束执行
@Override
public boolean end(Writer writer, String body) {
stack.getContext().put(MyANSWER, answer);
boolean fd=super.end(writer, body);
return fd;
}
public String getFlag() {
return flag;
} public void setFlag(String flag) {
this.flag = flag;
} public String getCondition() {
return condition;
} public void setCondition(String condition) {
this.condition = condition;
} } package com.bjsxt.sxf.tag.compant; import java.io.Writer;
import java.util.Map; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.struts2.components.Component; import com.opensymphony.xwork2.util.ValueStack; /**
* myelseif的逻辑类
* @ClassName: MyElseIfComponent
* @Description: TODO(这里用一句话描述这个类的作用)
* @author 尚晓飞
* @date 2014-10-22 下午3:50:49
*
*/
public class MyElseIfComponent extends Component {
protected String flag;
protected String condition;
public static final String MyANSWER = "struts.myelseif.answer";
protected Boolean answer; public MyElseIfComponent(ValueStack stack,HttpServletRequest req,HttpServletResponse resp) {
super(stack);
// TODO Auto-generated constructor stub
} @Override
public boolean start(Writer writer) {
boolean myflag=false;
//获取值栈
Map context = stack.getContext();
//先从值栈中获取if标签的flag的值
Boolean ifResult = (Boolean) context.get(MyIfComponent.MyANSWER);
//如果存在elseif 则需要获取该值
Boolean elseIfResult=(Boolean) context.get(MyElseIfComponent.MyANSWER);
context.remove(MyIfComponent.MyANSWER);
context.remove(MyElseIfComponent.MyANSWER); //判断是否存在if=true的情况
if(ifResult!=null&&ifResult==true){
//if=true
myflag=false;
}else{
//if=false
//是否存在else if
if(elseIfResult!=null&&elseIfResult==true){
//else if=true;
myflag=false;
}else{
//else if=false或者不存在上个else if
answer = (Boolean) findValue(flag, Boolean.class);
if (answer == null) {
answer = Boolean.FALSE;
}
stack.getContext().put(MyANSWER, answer);
myflag=answer.booleanValue();
}
}
return myflag;
}
@Override
public boolean end(Writer writer, String body) {
stack.getContext().put(MyANSWER, answer);
return super.end(writer, body);
}
public String getFlag() {
return flag;
}
public void setFlag(String flag) {
this.flag = flag;
}
public String getCondition() {
return condition;
}
public void setCondition(String condition) {
this.condition = condition;
}
public Boolean getAnswer() {
return answer;
}
public void setAnswer(Boolean answer) {
this.answer = answer;
} } package com.bjsxt.sxf.tag.compant; import java.io.Writer;
import java.util.Map; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.struts2.components.Component; import com.opensymphony.xwork2.util.ValueStack; public class MyElseComponent extends Component{ /**
* myelse的逻辑类
*
* @Title: EncodingRequestWrapper
* @Description: 构造函数
* @param stack
* @param req
* @param response
* @author 尚晓飞
* @date 2014-10-22 下午3:51:24
*/
public MyElseComponent(ValueStack stack,HttpServletRequest req,HttpServletResponse response) {
super(stack);
}
//Myelse标签运行开始
@Override
public boolean start(Writer writer) {
boolean myflg=false;
//获取值栈
Map context = stack.getContext();
//获取if的值
Boolean ifResult = (Boolean) context.get(MyIfComponent.MyANSWER);
//获取else的值
Boolean elseifResult=(Boolean) context.get(MyElseIfComponent.MyANSWER);
//移除值栈中的值
context.remove(MyIfComponent.MyANSWER);
context.remove(MyElseIfComponent.MyANSWER); //判断是否存在if
if(ifResult!=null&&ifResult==true){
//存在if,并且为true;
myflg=false;
}else{
//if为false
//判断elseif是否存在
if(elseifResult!=null&&elseifResult==true){
//存在elseif标签,且==true
myflg=false;
}else{
//不存在elseif标签或者为elseif标签==false或者if标签为false
myflg=true;
}
} return myflg;
} @Override
public boolean end(Writer writer, String body) {
// TODO Auto-generated method stub
boolean d=super.end(writer, body);
return d;
} }

第四步:测试页面

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="StudentTags" prefix="stu" %>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head> <body>
This is my JSP page. <br>
<a href="<%=request.getContextPath()%>/StudentAction!reportStudent.action">班级表单下载</a>
<h1>查询出所有学生的标签效果</h1>
<stu:selectAll></stu:selectAll>
<h1>查询出指定性别的学生的标签效果</h1>
<stu:selectBySex sex="男"></stu:selectBySex>
<h1>查询出指定班级id的学生集合的标签效果</h1>
<stu:selectByClassId var="students" classId="1" >
<table border="2">
<tr>
<td>id</td>
<td>姓名</td>
<td>性别</td>
<td>班级</td>
</tr>
<s:iterator value="#students" var="stu">
<tr>
<td><s:property value="#stu.id"/></td>
<td><s:property value="#stu.name"/></td>
<td><s:property value="#stu.sex"/></td>
<td><s:property value="#stu.classRoom.name"/></td>
</tr>
</s:iterator>
</table>
</stu:selectByClassId> <h1>我是中国人</h1>
<stu:myif flag="1==3" condition="shangxiaofei">
<h1>myif是true</h1>
</stu:myif>
<stu:myelseif flag="1==2" condition="first">
<h1>第一个myelseif是false</h1>
</stu:myelseif>
<stu:myelseif flag="1==1" condition="sencod">
<h1>第二个myelseif是true</h1>
</stu:myelseif>
<stu:myelse>
<h1>false</h1>
</stu:myelse>
</body> </html>

第五步:效果图

Struts2自定义标签3模仿原有的s:if s:elseif s:else自定义自己的if elsif else