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的更多相关文章
- JAVA POI替换EXCEL模板中自定义标签(XLSX版本)满足替换多个SHEET中自定义标签
个人说明:为了简单实现导出数据较少的EXCEL(根据自定义书签模板) 一.替换Excel表格标签方法```/** * 替换Excel模板文件内容 * @param map * 需要替换的标签建筑队形式 ...
- Java Web 自定义标签
1. 自定义标签 由于在JSP页面中直接嵌入Java代码会导致页面开起来非常混乱,不方便和美工等配合工作,为此,JSP提供了自定义标签技术,可以代替直接嵌入Java代码的方式提供动态逻辑,但自定义 ...
- 使用自定义标签模拟jstl的<c:for each>标签
一.自定义标签的基本编写 下面编写一个自定义标签,它可以输出当前的时间. 1.编写标签类 类可以通过继承SimpleTagSupport类实现一个标签类编写.父类为我们提供了一些编写自定义标签的快捷的 ...
- JSP自定义标签/自定义标签打包
有这样一个业务需求: 当我们在编辑某个用户时,需要设置该用户的角色,在转到编辑页面时,就需要自动勾选上该用户已经选择的角色,如下图: 当我们点击编辑时,会查询用户详细信息,以及角色集合传到编辑页面. ...
- 【JSP】自定义标签开发入门
JSP 自定义标签 自定义标签是用户定义的JSP语言元素.当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时We ...
- ssm+jsp+自定义标签实现分页,可以通用(前端实现)
近期做了一些分页方面的开发,大致梳理一下 1 jsp页面上关于分页的代码 <tr> <td colspan="9"> <ule1:pagination ...
- JSP自定义标签——简单标签(1)
前面一篇博客介绍了自定义标签的传统标签使用方式,但是我们会发现,使用传统标签非常的麻烦,而且接口还多,现在传统标签基本都没用了,除了一些比较久的框架.Sun公司之后推出了一个新的标签使用方式,称之为简 ...
- 剖析html对标准标签和自定义标签闭合与不闭合渲染问题
昨天在修改去年写的系统的时候无意中看到了当时写的一个利用标准标签未闭合在单元格内把整个单元格颜色渲染成红色的效果,如下: 当时的问题是从后台返回来的是个int整数而%是写在页面上的如图 这 时候就出现 ...
- Spring源码学习-容器BeanFactory(四) BeanDefinition的创建-自定义标签的解析.md
写在前面 上文Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签对Spring默认标签的解析做了详解,在xml元素的解析中,Spri ...
随机推荐
- SQL group by的使用
①定义 "group by" 从字面上理解是根据“by"指定的规则对数据进行分组 ②简单示例 ③group by 中的select字段是受限制的 select指定的字段要 ...
- Hmtl5 <input>中placeholder属性(新属性)
Hmtl5 <input>中placeholder属性(新属性) 一.定义和用法 placeholder 属性提供可描述输入字段预期值的提示信息(hint). 该提示会在输入字段为空时显示 ...
- Python3.x:os.listdir和os.walk(获取路径方法)的区别
Python3.x:os.listdir和os.walk(获取路径方法)的区别 1,os.listdir 使用情况:在一个目录下面只有文件,没有文件夹,这个时候可以使用os.listdir: 例如:d ...
- Tomcat 启动图解
Tomcat server.xml结构 startup.bat执行流程 catalina.bat执行流程 Tomcat Server处理一个http请求的过程
- HDU 6156 Palindrome Function(数位DP)题解
思路: 数位dp的操作是dfs+记忆化,我们dp开四维:位置,长度,进制,是否回文.然后每次暴搜记录下每个位置的数字是什么,搜到对称轴另一边需要检查是否符合回文. 终于把友谊赛的题目都补完了...没做 ...
- luogu p3366 最小生成树模板
倒腾了一个小时 自己也没去看网上的 总算自己能写出来模板了 kruskal //最小生成树 每次找最短的边 #include<bits/stdc++.h> using namespace ...
- mysql的隔离性和锁
INNODB的隔离性质 INNODB的事务支持4种隔离机制,分别是 READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ, and SERIALIZABL ...
- 详解Python中re.sub--转载
[背景] Python中的正则表达式方面的功能,很强大. 其中就包括re.sub,实现正则的替换. 功能很强大,所以导致用法稍微有点复杂. 所以当遇到稍微复杂的用法时候,就容易犯错. 所以此处,总结一 ...
- python 列表元素替换以及删除
>>> letters = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] >>> letters ['a', 'b', 'c', 'd', ...
- Sql Server 开放4399端口命令行
netsh advfirewall firewall add rule name="Open Port 80" dir=in action=allow protocol=TCP l ...