第一步: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的更多相关文章

  1. JAVA POI替换EXCEL模板中自定义标签(XLSX版本)满足替换多个SHEET中自定义标签

    个人说明:为了简单实现导出数据较少的EXCEL(根据自定义书签模板) 一.替换Excel表格标签方法```/** * 替换Excel模板文件内容 * @param map * 需要替换的标签建筑队形式 ...

  2. Java Web 自定义标签

    1.   自定义标签 由于在JSP页面中直接嵌入Java代码会导致页面开起来非常混乱,不方便和美工等配合工作,为此,JSP提供了自定义标签技术,可以代替直接嵌入Java代码的方式提供动态逻辑,但自定义 ...

  3. 使用自定义标签模拟jstl的<c:for each>标签

    一.自定义标签的基本编写 下面编写一个自定义标签,它可以输出当前的时间. 1.编写标签类 类可以通过继承SimpleTagSupport类实现一个标签类编写.父类为我们提供了一些编写自定义标签的快捷的 ...

  4. JSP自定义标签/自定义标签打包

    有这样一个业务需求: 当我们在编辑某个用户时,需要设置该用户的角色,在转到编辑页面时,就需要自动勾选上该用户已经选择的角色,如下图: 当我们点击编辑时,会查询用户详细信息,以及角色集合传到编辑页面. ...

  5. 【JSP】自定义标签开发入门

    JSP 自定义标签 自定义标签是用户定义的JSP语言元素.当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时We ...

  6. ssm+jsp+自定义标签实现分页,可以通用(前端实现)

    近期做了一些分页方面的开发,大致梳理一下 1 jsp页面上关于分页的代码 <tr> <td colspan="9"> <ule1:pagination ...

  7. JSP自定义标签——简单标签(1)

    前面一篇博客介绍了自定义标签的传统标签使用方式,但是我们会发现,使用传统标签非常的麻烦,而且接口还多,现在传统标签基本都没用了,除了一些比较久的框架.Sun公司之后推出了一个新的标签使用方式,称之为简 ...

  8. 剖析html对标准标签和自定义标签闭合与不闭合渲染问题

    昨天在修改去年写的系统的时候无意中看到了当时写的一个利用标准标签未闭合在单元格内把整个单元格颜色渲染成红色的效果,如下: 当时的问题是从后台返回来的是个int整数而%是写在页面上的如图 这 时候就出现 ...

  9. Spring源码学习-容器BeanFactory(四) BeanDefinition的创建-自定义标签的解析.md

    写在前面 上文Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签对Spring默认标签的解析做了详解,在xml元素的解析中,Spri ...

随机推荐

  1. #C++初学记录(阶乘#递归)

    练习题目三 用递归进行阶乘 运行代码 #include<iostream> using namespace std; int f(int n); int n; int main() { c ...

  2. F题:等差区间(RMQ||线段树)

    原题大意:原题链接  题解链接 给定一个长为n的数组元素和q次区间[l,r]询问,判断区间[l,r]内元素排序后能否构成等差数列 #include<cmath> #include<c ...

  3. ruby中的预定义变量(Predifined Variables)

  4. EditPlus 4.3.2487 中文版已经发布(11月12日更新)

    新的版本修复了粘贴多重选择文本的问题,以及增加了横向扩展列选模式选择范围的快捷键(Ctrl+Alt+→/←).

  5. 独家揭秘,106岁的IBM靠什么完成了世纪大转型|钛度专访

    IBM大中华区董事长陈黎明 到2017年2月,陈黎明就担任IBM大中华区董事长整整两年了. 五年前,IBM历史上首位女CEO也是第9位CEO罗睿兰上任,三年前,IBM在罗睿兰的带领下以数据与分析.云. ...

  6. 解决android studio 模拟器取法启动声音的错误

    Emulator: dsound: Reason: No sound driver is available https://jingyan.baidu.com/article/a65957f4348 ...

  7. linux_一些shell命令分析记录

    一.用于shell脚本的界面命令交互 echo "请输入css-dist下载地址:" read addcss echo "开始下载css的zip包"( wget ...

  8. php-fpm开启报错-ERROR: An another FPM instance seems to already listen on /tmp/php-cgi.sock

    在升级了php7.2.0版本之后,重新启动php-fpm过程中遇到一个报错. An another FPM instance seems to already listen on /tmp/php-c ...

  9. 20145105 《Java程序设计》第3周学习总结

    20145105 <Java程序设计>第3周学习总结 教材学习内容总结 第四章 认识对象 一.类与对象 要产生对象必须先定义类,类是对象的设计图,对象是类的实例. (一)定义类 1.类定义 ...

  10. 【日志过滤】Nginx日志过滤 使用ngx_log_if不记录特定日志

    ngx_log_if是Nginx的一个第三方模块.它在Github上的描述是这样介绍的:ngx_log_if是一个独立的模块,允许您控制不要写的访问日志,类似于Apache的"CustomL ...