第一步: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. devise修改密码

    https://ruby-china.org/topics/1314 password/edit不是给你直接改密码用的 这个是忘记密码后,发送重置密码的邮件到你邮箱,同时生成一个token 然后你点那 ...

  2. hdu4758 Walk Through Squares

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=4758 题目: Walk Through Squares Time Limit: 4000/20 ...

  3. pycharm添加git ignore

    pycharm现在提供了git ignore,很方便 从这里下载扩展 https://plugins.jetbrains.com/plugin/7495--ignore 放到pycharm根目录\pl ...

  4. Python tricks(1) -- 动态定义一个新变量

    python是动态语言, 无需声明变量即可使用. 传递一个tuple, list或者dict等等方式, 有时候这种方式的使用不是很好. 对于tuple和list来说都是用下标的访问方式(即使用[]), ...

  5. jQuery源码分析--Event模块(1)

    jQuery的Event模块提供了强大的功能:事件代理,自定义事件,自定义数据等.今天记录一下它实现的原理. 我们都知道,在js的原生事件中,有事件对象和回调函数这两样东西.但是事件对象是只读的,所以 ...

  6. 用通俗的语言解释restful

    实现了REST规范的Web API就叫RESTful API. 简单来说:就是用url定位资源,用http描述来操作资源. web是什么:分布式信息系统为超文本文件和其他对象(资源)提供访问入口. 资 ...

  7. vw 、vh、vmin 、vmax

    转自:https://blog.csdn.net/romantic_love/article/details/80868909 vw.vh.vmin.vmax是一种视窗单位,也是相对单位. 它相对的不 ...

  8. firefox_flash_install_on_kali

    手动安装firefox的flash的步骤 1> 下载flash的tar.gz安装包 firefox http://get2.adobe.com/cn/flashplayer/otherversi ...

  9. IPv4数据报格式

    网络层的分组为数据报,数据报为首部和数据两部分组成,如下图所示. 首部的长度是以4个字节为单位,长度可以是20-60字节,这跟首部的HLEN字段有关. 版本: 这个4位字段定义了IP协议的版本,目前主 ...

  10. BZOJ 1853: [Scoi2010]幸运数字(容斥原理)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1853 题意: 在中国,很多人都把6和8视为是幸运数字!lxhgww也这样认为,于是他定义自己的“幸运 ...