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

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类

 package com.bjsxt.sxf.tag;

 import java.io.IOException;
import java.util.List; import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport; import org.apache.struts2.ServletActionContext;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils; import com.bjsxt.sxf.dao.StudentDao;
import com.bjsxt.sxf.po.Student;
/**
* 简单的自定义Struts2标签,没有属性的
* @ClassName: SeclectAllSt
* @Description: TODO(这里用一句话描述这个类的作用)
* @author 尚晓飞
* @date 2014-10-21 下午3:21:16
*
*/
public class SeclectAllSt extends TagSupport {
private static final long serialVersionUID = 1L; //空构造
public SeclectAllSt(){
System.out.println("SeclectAllSt.SeclectAllSt(构造函数)");
} //标签执行顺序 doStartTag()→doInitBody()→setBodyContent()→doAfterBody()→doEndTag()
//标签开始访问
@Override
public int doStartTag() throws JspException {
// TODO Auto-generated method stub
System.out.println("SeclectAllSt.doStartTag(开始运行标签函数)");
return SKIP_BODY;//则接下来的doInitBody(),setBodyContent(), doAfterBody()三个方法不会被执行,而直接执行doEndTag()方法
} //标签结束访问
@Override
public int doEndTag() throws JspException {
// TODO Auto-generated method stub
System.out.println("SeclectAllSt.doEndTag(标签结束运行函数)");
//查询出所有学生的信息
//获取ioc容器(ssh中spring)
ApplicationContext app = WebApplicationContextUtils.getWebApplicationContext(ServletActionContext.getServletContext());
//获取与数据库交互的dao
StudentDao dao=(StudentDao) app.getBean("StudentDao");
//查询出所有的学生信息
List<Student> students=dao.queryAll();
//通过父类TagSupport的属性值pageContext 取得相关的内置对象
//=============pageContext还可以get更多的内置对象。
// pageContext.getRequest();
// pageContext.getResponse();
// pageContext.getSession();
// pageContext.getServletContext();
JspWriter out=pageContext.getOut();
//遍历循环打印 try {
out.print("<table border=\"1\">");
out.print("<tr>");
out.print("<td>id</td>");
out.print("<td>姓名</td>");
out.print("<td>性别</td>");
out.print("<td>班级</td>");
out.print("</tr>");
for(int i=0;i<students.size();i++){
Student student=students.get(i);
out.print("<tr>");
out.print("<td>"+student.getId()+"</td>");
out.print("<td>"+student.getName()+"</td>");
out.print("<td>"+student.getSex()+"</td>");
out.print("<td>"+student.getClassRoom().getName()+"</td>");
out.print("</tr>");
} out.print("</table>");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return EVAL_PAGE;
} } package com.bjsxt.sxf.tag; import java.io.IOException;
import java.util.List; import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport; import org.apache.struts2.ServletActionContext;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils; import com.bjsxt.sxf.dao.StudentDao;
import com.bjsxt.sxf.po.Student;
/**
* 有属性的标签(根据性别)
* @ClassName: SeclectStBySex
* @Description: TODO(这里用一句话描述这个类的作用)
* @author 尚晓飞
* @date 2014-10-21 下午3:56:48
*
*/
public class SeclectStBySex extends TagSupport{
private static final long serialVersionUID = 1L;
private String sex;//标签属性传递的值,会通过set get方法 //标签开始执行的方法
@Override
public int doStartTag() throws JspException {
System.out.println("SeclectStBySex.doEndTag(标签开始)");
return SKIP_BODY;
} //最后执行的方法
@Override
public int doEndTag() throws JspException {
// TODO Auto-generated method stub
System.out.println("SeclectAllSt.doEndTag(标签结束运行函数)");
//查询出所有学生的信息
//获取ioc容器(ssh中spring)
ApplicationContext app = WebApplicationContextUtils.getWebApplicationContext(ServletActionContext.getServletContext());
//获取与数据库交互的dao
StudentDao dao=(StudentDao) app.getBean("StudentDao");
//查询出指定性别的学生集合
List<Student> students=dao.queryBySex(sex);
//通过父类TagSupport的属性值pageContext 取得相关的内置对象
//=============pageContext还可以get更多的内置对象。
// pageContext.getRequest();
// pageContext.getResponse();
// pageContext.getSession();
// pageContext.getServletContext();
JspWriter out=pageContext.getOut();
//遍历循环打印 try {
out.print("<table border=\"1\">");
out.print("<tr>");
out.print("<td>id</td>");
out.print("<td>姓名</td>");
out.print("<td>性别</td>");
out.print("<td>班级</td>");
out.print("</tr>");
for(int i=0;i<students.size();i++){
Student student=students.get(i);
out.print("<tr>");
out.print("<td>"+student.getId()+"</td>");
out.print("<td>"+student.getName()+"</td>");
out.print("<td>"+student.getSex()+"</td>");
out.print("<td>"+student.getClassRoom().getName()+"</td>");
out.print("</tr>");
} out.print("</table>");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return EVAL_PAGE;
} public String getSex() {
return sex;
} public void setSex(String sex) {
this.sex = sex;
} }

三:在项目webroot/web-inf/下建立自定义标签库的.tld文件 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> </taglib>

四:页面上测试jsp

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="StudentTags" prefix="stu" %>
<%
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>
<!-- 查询出所有学生 -->
<stu:selectAll></stu:selectAll>
<!-- 查询出指定性别的学生 -->
<stu:selectBySex sex="男"></stu:selectBySex>
</body> </html>

五:效果图

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

  1. Java自定义简单标签

     Java自定义简单标签可以方便的在页面输出信息,并且对于权限的控制,和对于Jsp标签和servlet代码的分离有着很好的作用. 下面将以权限的控制为例自定义一个标签: 一.标签类型 <wxt: ...

  2. JSP自定义简单标签入门之带有属性

    上面写的那个简单标签来控制页面中标签内容的重复次数是固定的,这就是权限"写死了",这是非常不好的行为,因为其灵活性太差.所以下面就介绍一种使用属性来控制标签内容输出次数的方法. 准 ...

  3. 简单理解Struts2中拦截器与过滤器的区别及执行顺序

    简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...

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

    <s:if>判断字符串的问题: 1.判断单个字符:<s:if test="#session.user.username=='c'"> 这样是从session ...

  5. struts2 s:if标签以及 #,%{},%{#}的使用方法等在资料整理

    <s:if>判断字符串的问题: 1.判断单个字符:<s:if test="#session.user.username=='c'"> 这样是从session ...

  6. 如何创建一个简单的struts2程序

    如何创建一个简单的Struts2程序 “计应134(实验班) 凌豪” 1.创建一个新的Web项目test(File->new->Web Project) 2.Struts2框架的核心配置文 ...

  7. 使用maven+eclipse搭建最简单的struts2的helloworld

    使用maven+eclipse搭建最简单的struts2的helloworld 一.web分层结构简介 1.web[细]粒度分层结构: 按细粒度分层可以分为以下6种: 1).表现层:html/css/ ...

  8. struts2(五) s标签和国际化

    坚持就是胜利. --WH 一.s标签 在struts-2.3.15.1/docs/WW/docs/tag-reference.html下,就有着struts2所有标签的参考文献,只能看看其中比较常用的 ...

  9. struts2 if正确标签示例

    下面总结一下struts2 中if标签的使用 (1)判断字符串是否为空 <s:if test="user.username==null or user.username==''&quo ...

随机推荐

  1. MyBatis—mapper.xml映射配置

    SQL文件映射(mapper文件),几个顶级元素的配置: mapper元素:根节点只有一个属性namespace(命名空间)作用: 1:用于区分不同的mapper,全局唯一. 2:绑定DAO接口,即面 ...

  2. 2017ACM/ICPC Guangxi Invitational Solution

    A: A Math Problem 题意:给出一个n,找出有多少个k满足kk  <= n 思路: kk的增长很快,当k == 16 的时候就已经超过1e18 了,对于每一次询问,暴力一下就可以 ...

  3. 20155302 2016-2017-2 《Java程序设计》第八周学习总结

    20155302 2016-2017-2 <Java程序设计>第八周学习总结 教材学习内容总结 在NIO中有几个比较关键的概念:Channel(通道),Buffer(缓冲区),Select ...

  4. C#——文件操作类简单封装

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.IO ...

  5. 通过J2EE Web工程添加Flex项目,进行BlazeDS开发

    http://www.cnblogs.com/noam/archive/2010/07/22/1782955.html 环境:Eclipse 7.5 + Flex Builder 4 plugin f ...

  6. oracle中 start with .. connect by prior.. 用法简介

    我们经常会将一个比较复杂的目录树存储到一个表中.或者将一些部门存储到一个表中,而这些部门互相有隶属关系.这个时候你就会用到connect by prior start with.oracle 提供了s ...

  7. SQL学习笔记一之初识数据库

    阅读目录 一 数据库管理软件的由来 二 数据库概述 三 mysql介绍 四 下载安装 五 mysql软件基本管理 六 初识sql语句 一 数据库管理软件的由来 基于我们之前所学,数据要想永久保存,都是 ...

  8. Sublime Text 3图标更改

    Sublime Text 3图标更改 步骤: 1.下载ico图标 2.然后更改图标 注意:重点讲解下,如何将png文件转换为ico图标: 网络上单独找sublime text 3的ico图标比较不好找 ...

  9. 使用sublime text3配置c++编译运行

    首先我们可以下载一个Dev-c++,这东西可以自己帮你配置好网上提示的那一大堆奇怪的文件... 网上博客大都在说些什么添加各种编译环境,加入sublime-build什么的..然而作为一个喜欢偷懒的人 ...

  10. BZOJ 1042: [HAOI2008]硬币购物(容斥原理)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1042 题意: 思路: 如果不考虑硬币个数的话,这就是一道完全背包的题目. 直接求的话行不通,于是这里 ...