第一步: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. [LeetCode]160.Intersection of Two Linked Lists(2个链表的公共节点)

    Intersection of Two Linked Lists Write a program to find the node at which the intersection of two s ...

  2. hdu 5140 主席树

    这题说的是每个员工有工资 水平 在公司待的年限这几个属性,有大量的查询 查的是在一定的水平和工作年限的工人总工资是多少 这个思路是比较简单的我们按照他们的水平排序,排完后,使用主席树不断地往里面插,然 ...

  3. MyEclipse优化,解决MyEclipse运行慢、卡顿问题

    工具: myeclipse2015 2.0 最近想用myeclipse做一下测试,发现myeclipse运行非常卡,直接影响代码的开发,而且还出现软件卡退的情况,让我十分恼火.   一.加大JVM的非 ...

  4. javascript日期字符串和日期对象相互转换

    HTML页面间需要传递日期和时间参数的时候,如果需要对日期字符串进行时间的运算,就需要先将日期字符串转换成JS日期对象. 在js中,yyyy-MM-dd HH:mm:ss格式的日期字符串不能用来直接构 ...

  5. react 修改循环列表的当前单个子项状态:思路 拿原始state数据更改,再做请求

    handleLike(item,index){ var id = item.id; _ENV.post( _ENV.HOST+'/communion/video-up', {'user_id':loc ...

  6. BootStrap一页通(样式+组件+插件)

    bootstrap是一种前端框架,实现美观的页面效果.使用BootStrap的前期工作(注意顺序): <!DOCTYPT html>:因为Bootstrap用到了h5的特性,所以需要此步. ...

  7. JS地址自动返填技术

    系统设计地址为省市县三级联动,规范是规范了,但是无形中增加了系统操作的时间成本,因此设计地址自动返填技术,只要把地址拷贝到详细地址框中,可以自动返填到省市县三级联动的下拉框中. 还好洒家的大学不是混过 ...

  8. 20145219《网络对抗技术》PC平台逆向破解之逆向与Bof基础

    20145219<网络对抗技术>PC平台逆向破解之逆向与Bof基础 实践目标 实践对象:一个名为pwn1的linux可执行文件. pwn1正常执行流程:main调用foo函数,foo函数会 ...

  9. POJ 1122 FDNY to the Rescue!(最短路+路径输出)

    http://poj.org/problem?id=1122 题意:给出地图并且给出终点和多个起点,输出从各个起点到终点的路径和时间. 思路: 因为有多个起点,所以这里反向建图,这样就相当于把终点变成 ...

  10. python有木有哪些必须要学习的高级模块

    python有木有哪些必须要学习的高级模块 字母表