自定义简单的struts2的s标签

一:自定标签前需要了解的知识:

BodyTagSupport类的方法:
编写标签对应的实现类时,需要重载BodyTagSupport类几个方法:doStartTag(), setBodyContent(), doInitBody(), doAfterBody(), doEndTag();

他们执行顺序如下:
doStartTag()→doInitBody()→setBodyContent()→doAfterBody()→doEndTag()

doStartTag()方法可返回EVAL_BODY_INCLUDE或SKIP_BODY,
如果返回EVAL_BODY_INCLUDE则继续执行;
如果返回SKIP_BODY则接下来的doInitBody(),setBodyContent(), doAfterBody()三个方法不会被执行,
而直接执行doEndTag()方法。

setBodyContent()方法用于设置标签体内容,如果在此之前要作一些初始化工作,则在doInitBody()方法中完成。
标签体内容执行完后,会调用doAfterBody()方法,此方法可返回EVAL_BODY_TAG, SKIP_BODY,

EVAL_PAGESKIP_PAGE
如果返回EVAL_BODY_TAG则会再次设置标签体内容,直到返回SKIP_BODY;
如果返回EVAL_PAGE则标签体执行完后会继续执行JSP页面中接下来的部分;
如果返回SKIP_PAGE,则JSP页面的后续内容将不再执行。

标签中静态常量:

EVAL_BODY_INCLUDE:告诉服务器正文的内容,并把这些内容送入输出流
SKIP_BODY:告诉服务器不要处理正文内容
EVAL_PAGE:让服务器继续执行页面
SKIP_PAGE:让服务器不要处理剩余的页面
EVAL_BODY_AGAIN:让服务器继续处理正文内容,只有doAfterBody方法可以返回
EVAL_BODY_BUFFERED:BodyTag接口的字段,在doStartTag()返回
EVAL_BODY_INCLUDE、SKIP_BODY一般由doStartTag()返回,而EVAL_PAPGE、SKIP_PAGE由doEndTag()返回。

二:自定义标签调用的SeclectAllSt.java类,SeclectStBySex.java类继承TagSupport类

  1 package com.bjsxt.sxf.tag;
  2
  3 import java.io.IOException;
  4 import java.util.List;
  5
  6 import javax.servlet.jsp.JspException;
  7 import javax.servlet.jsp.JspWriter;
  8 import javax.servlet.jsp.tagext.TagSupport;
  9
 10 import org.apache.struts2.ServletActionContext;
 11 import org.springframework.context.ApplicationContext;
 12 import org.springframework.web.context.support.WebApplicationContextUtils;
 13
 14 import com.bjsxt.sxf.dao.StudentDao;
 15 import com.bjsxt.sxf.po.Student;
 16 /**
 17  * 简单的自定义Struts2标签,没有属性的
 18 * @ClassName: SeclectAllSt
 19 * @Description: TODO(这里用一句话描述这个类的作用)
 20 * @author 尚晓飞
 21 * @date 2014-10-21 下午3:21:16
 22 *
 23  */
 24 public class SeclectAllSt extends TagSupport {
 25     private static final long serialVersionUID = 1L;
 26
 27     //空构造
 28     public SeclectAllSt(){
 29         System.out.println("SeclectAllSt.SeclectAllSt(构造函数)");
 30     }
 31
 32     //标签执行顺序 doStartTag()→doInitBody()→setBodyContent()→doAfterBody()→doEndTag()
 33     //标签开始访问
 34     @Override
 35     public int doStartTag() throws JspException {
 36         // TODO Auto-generated method stub
 37         System.out.println("SeclectAllSt.doStartTag(开始运行标签函数)");
 38         return SKIP_BODY;//则接下来的doInitBody(),setBodyContent(), doAfterBody()三个方法不会被执行,而直接执行doEndTag()方法
 39     }
 40
 41     //标签结束访问
 42     @Override
 43     public int doEndTag() throws JspException {
 44         // TODO Auto-generated method stub
 45         System.out.println("SeclectAllSt.doEndTag(标签结束运行函数)");
 46         //查询出所有学生的信息
 47         //获取ioc容器(ssh中spring)
 48         ApplicationContext app = WebApplicationContextUtils.getWebApplicationContext(ServletActionContext.getServletContext());
 49         //获取与数据库交互的dao
 50         StudentDao dao=(StudentDao) app.getBean("StudentDao");
 51         //查询出所有的学生信息
 52         List<Student> students=dao.queryAll();
 53         //通过父类TagSupport的属性值pageContext 取得相关的内置对象
 54         //=============pageContext还可以get更多的内置对象。
 55         //     pageContext.getRequest();
 56         //     pageContext.getResponse();
 57         //     pageContext.getSession();
 58         //     pageContext.getServletContext();
 59         JspWriter out=pageContext.getOut();
 60         //遍历循环打印
 61
 62         try {
 63             out.print("<table border=\"1\">");
 64                 out.print("<tr>");
 65                     out.print("<td>id</td>");
 66                     out.print("<td>姓名</td>");
 67                     out.print("<td>性别</td>");
 68                     out.print("<td>班级</td>");
 69                         out.print("</tr>");
 70                 for(int i=0;i<students.size();i++){
 71                     Student student=students.get(i);
 72                     out.print("<tr>");
 73                             out.print("<td>"+student.getId()+"</td>");
 74                             out.print("<td>"+student.getName()+"</td>");
 75                             out.print("<td>"+student.getSex()+"</td>");
 76                             out.print("<td>"+student.getClassRoom().getName()+"</td>");
 77                     out.print("</tr>");
 78                 }
 79
 80            out.print("</table>");
 81         } catch (IOException e) {
 82             // TODO Auto-generated catch block
 83             e.printStackTrace();
 84         }
 85
 86         return EVAL_PAGE;
 87     }
 88
 89
 90
 91
 92
 93
 94 }
 95
 96
 97
 98 package com.bjsxt.sxf.tag;
 99
100 import java.io.IOException;
101 import java.util.List;
102
103 import javax.servlet.jsp.JspException;
104 import javax.servlet.jsp.JspWriter;
105 import javax.servlet.jsp.tagext.TagSupport;
106
107 import org.apache.struts2.ServletActionContext;
108 import org.springframework.context.ApplicationContext;
109 import org.springframework.web.context.support.WebApplicationContextUtils;
110
111 import com.bjsxt.sxf.dao.StudentDao;
112 import com.bjsxt.sxf.po.Student;
113 /**
114  * 有属性的标签(根据性别)
115 * @ClassName: SeclectStBySex
116 * @Description: TODO(这里用一句话描述这个类的作用)
117 * @author 尚晓飞
118 * @date 2014-10-21 下午3:56:48
119 *
120  */
121 public class SeclectStBySex extends TagSupport{
122     private static final long serialVersionUID = 1L;
123     private String sex;//标签属性传递的值,会通过set get方法
124
125     //标签开始执行的方法
126     @Override
127     public int doStartTag() throws JspException {
128         System.out.println("SeclectStBySex.doEndTag(标签开始)");
129         return SKIP_BODY;
130     }
131
132     //最后执行的方法
133     @Override
134     public int doEndTag() throws JspException {
135         // TODO Auto-generated method stub
136                 System.out.println("SeclectAllSt.doEndTag(标签结束运行函数)");
137                 //查询出所有学生的信息
138                 //获取ioc容器(ssh中spring)
139                 ApplicationContext app = WebApplicationContextUtils.getWebApplicationContext(ServletActionContext.getServletContext());
140                 //获取与数据库交互的dao
141                 StudentDao dao=(StudentDao) app.getBean("StudentDao");
142                 //查询出指定性别的学生集合
143                 List<Student> students=dao.queryBySex(sex);
144                 //通过父类TagSupport的属性值pageContext 取得相关的内置对象
145                 //=============pageContext还可以get更多的内置对象。
146                 //     pageContext.getRequest();
147                 //     pageContext.getResponse();
148                 //     pageContext.getSession();
149                 //     pageContext.getServletContext();
150                 JspWriter out=pageContext.getOut();
151                 //遍历循环打印
152
153                 try {
154                     out.print("<table border=\"1\">");
155                         out.print("<tr>");
156                             out.print("<td>id</td>");
157                             out.print("<td>姓名</td>");
158                             out.print("<td>性别</td>");
159                             out.print("<td>班级</td>");
160                                 out.print("</tr>");
161                         for(int i=0;i<students.size();i++){
162                             Student student=students.get(i);
163                             out.print("<tr>");
164                                     out.print("<td>"+student.getId()+"</td>");
165                                     out.print("<td>"+student.getName()+"</td>");
166                                     out.print("<td>"+student.getSex()+"</td>");
167                                     out.print("<td>"+student.getClassRoom().getName()+"</td>");
168                             out.print("</tr>");
169                         }
170
171                    out.print("</table>");
172                 } catch (IOException e) {
173                     // TODO Auto-generated catch block
174                     e.printStackTrace();
175                 }
176         return EVAL_PAGE;
177     }
178
179
180     public String getSex() {
181         return sex;
182     }
183
184     public void setSex(String sex) {
185         this.sex = sex;
186     }
187
188
189 }

三:在项目webroot/web-inf/下建立自定义标签库的.tld文件 str.tld

 1 <?xml version="1.0" encoding="UTF-8"?>
 2     <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
 3     <taglib>     <!-- 自定义库标签的根 -->
 4     <tlibversion>1.2</tlibversion>     <!-- 版本号 -->
 5     <jspversion>1.1</jspversion>       <!-- JSP版本号 -->
 6     <shortname>stu</shortname>        <!-- prefix="stu"标签名称-->
 7     <uri>StudentTags</uri>   <!-- uri="StudentTags" 外界导入标签时,认识的名字,很重要。-->
 8
 9     <tag>
10      <name>selectAll</name>                            <!-- 标签名称 -->
11      <tagclass>com.bjsxt.sxf.tag.SeclectAllSt</tagclass>          <!-- 对应的java类的全路径 -->
12     </tag>
13
14     <!-- 有属性的标签,可以有多个属性  <attribute>并列 -->
15       <tag>
16            <name>selectBySex</name>  <!-- 标签名称 -->
17             <tagclass>com.bjsxt.sxf.tag.SeclectStBySex</tagclass>
18             <attribute>   <!-- 对应标签的属性。 -->
19                  <name>sex</name>
20                  <required>true</required>  <!-- 是必需写的属性,即没有写属性标签不能被正常使用 -->
21             </attribute>
22        </tag>
23
24     </taglib>  

四:页面上测试jsp

 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%@ taglib uri="StudentTags" prefix="stu" %>
 3 <%
 4 String path = request.getContextPath();
 5 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
 6 %>
 7
 8 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 9 <html>
10   <head>
11   </head>
12
13   <body>
14     This is my JSP page. <br>
15     <a href="<%=request.getContextPath()%>/StudentAction!reportStudent.action">班级表单下载</a>
16     <!-- 查询出所有学生 -->
17        <stu:selectAll></stu:selectAll>
18        <!-- 查询出指定性别的学生 -->
19        <stu:selectBySex sex="男"></stu:selectBySex>
20   </body>
21
22 </html>

五:效果图

时间: 2024-10-10 10:32:56

自定义简单的struts2的s标签的相关文章

Struts2中UI标签之非表单标签

1.非表单标签主要用于在页面生成一些非表单的可视化元素,例如Tab页面,输出HTML页面的树形结构等.当然,非表单标签也包含在页面显示Action里封装的信息,非表单标签主要有如下几个: a:生成一个超级连接(link). actionerror:如果Action实例的getActionError()方法返回不为null,则该标签负责输出该方法返回的系列错误. actionmessage:如果Action实例的getActionMessage()方法返回不为null,则该标签负责输出该方法返回的

Struts2之控制标签

Struts2的控制标签,主要用于完成流程控制,以及对ValueStack中的控制,控制标签可以完成输出流程的控制,例如循环.分支等操作,也可以完成对集合的合并.排序等操作. 1.常用的控制标签有:if.elseif.else.iterator.append.merge.generator.subset.sort等. 下面分别对这些控制标签进行介绍,并介绍如何使用这些控制标签: (1).if.elseif.else标签:if标签用来控制基本的条件处理流程,通常和else标签或者elseif标签连

修改struts2中UI标签的&lt;s:a&gt;进行权限控制

最近在做学习S2SH时,有一个模块式权限控制,就是对用户的操作存在权限分级操作,即不是所有的用户都可以访问全部数据.下面说一下这次我们的做法. 1.所谓权限控制,就是对URL地址的控制,用户角色中不存在该权限,那么该url地址对用户是不起反应的(用户点击无反应),最好是不可见的.整体的思路就是这样,通过对UI标签的控制而达到对权限的控制. 2.我们使用的是struts2中的a标签,而非使用简单的html中a标签.原因是在<s:a>标签的源码中存在doStartTag()和doEndTag()方

struts2之url标签详解

ognl标签里面有个url标签,该标签和jstl的url标签功能差不多. 不过ognl这个更方便. value值代表生成的url地址,var是个临时变量 <s:url value="/demo" var="url1"></s:url> 使用el表达式把该值打印出来. ${url1} 结果显示. /struts/demo 这里的struts代表项目名,/demo就是上面的value值. 这个是一个最简单的演示. 第二个: <s:url v

struts2 s:if标签以及 #,%{},%{#}的使用方法

<s:if>判断字符串的问题: 1.判断单个字符:<s:if test="#session.user.username=='c'"> 这样是从session中取出username的值,并且判断其是否为c,但是这样判断是不正确的,这样判断的话,根本判断不出来,要改成下面这样: <s:if test="#session.user.username=='c'.toString()"> 这样判断才能正确判断,至于原因我也不知道,在网上看到

Struts2之数据标签(一)

一.Struts2的数据标签主要用于提供各种数据访问相关的功能,包括显示一个Action里的属性,以及生成国际化输出等功能.数据标签主要包括:property.set.push.param.bean.action.include.url.i18n和text.date及debug标签等. 1.property标签:用于输出value属性指定的值.可以与<s:bean>标签结合使用,一个是给bean赋值,一个是从bean中读取值. (1).如果没有指定value属性,默认输出valueStack(

深入分析JavaWeb Item49 -- Struts2中常用标签与主题

一.非UI标签 1.property标签 property标签用于输出指定值: * default:可选属性, 如果需要输出的属性值为null,则显示该属性指定的值 * escape:可选属性,指定是否格式化HTML代码. * value: 可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输出ValueStack栈顶的值. 2.set标签 set标签用于将某个值放入指定范围. var:变量的名字,name,id和var表达的含义是一样的,name,id被var替代 scope:指定变量

深入分析JavaWeb 49 -- Struts2中常用标签与主题

一.非UI标签 1.property标签 property标签用于输出指定值: * default:可选属性, 如果需要输出的属性值为null,则显示该属性指定的值 * escape:可选属性,指定是否格式化HTML代码. * value: 可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输出ValueStack栈顶的值. 2.set标签 set标签用于将某个值放入指定范围. var:变量的名字,name,id和var表达的含义是一样的,name,id被var替代 scope:指定变量

简单的Struts2例子

(1)用MyEclipse建立一个Web Project,项目名称为myStruts2,结构如下图: (2)导入struts2需要的包,我是把解压后的struts-2.3.16.3\apps\struts2-blank\WEB-INF\lib\下面所有的包都导入: (3)修改web.xml,设置filter和filter-mapping: <?xml version="1.0" encoding="GB2312"?> <web-app xmlns=