自定义简单的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_PAGE或SKIP_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标签的更多相关文章
- Java自定义简单标签
Java自定义简单标签可以方便的在页面输出信息,并且对于权限的控制,和对于Jsp标签和servlet代码的分离有着很好的作用. 下面将以权限的控制为例自定义一个标签: 一.标签类型 <wxt: ...
- JSP自定义简单标签入门之带有属性
上面写的那个简单标签来控制页面中标签内容的重复次数是固定的,这就是权限"写死了",这是非常不好的行为,因为其灵活性太差.所以下面就介绍一种使用属性来控制标签内容输出次数的方法. 准 ...
- 简单理解Struts2中拦截器与过滤器的区别及执行顺序
简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...
- struts2 s:if标签以及 #,%{},%{#}的使用方法
<s:if>判断字符串的问题: 1.判断单个字符:<s:if test="#session.user.username=='c'"> 这样是从session ...
- struts2 s:if标签以及 #,%{},%{#}的使用方法等在资料整理
<s:if>判断字符串的问题: 1.判断单个字符:<s:if test="#session.user.username=='c'"> 这样是从session ...
- 如何创建一个简单的struts2程序
如何创建一个简单的Struts2程序 “计应134(实验班) 凌豪” 1.创建一个新的Web项目test(File->new->Web Project) 2.Struts2框架的核心配置文 ...
- 使用maven+eclipse搭建最简单的struts2的helloworld
使用maven+eclipse搭建最简单的struts2的helloworld 一.web分层结构简介 1.web[细]粒度分层结构: 按细粒度分层可以分为以下6种: 1).表现层:html/css/ ...
- struts2(五) s标签和国际化
坚持就是胜利. --WH 一.s标签 在struts-2.3.15.1/docs/WW/docs/tag-reference.html下,就有着struts2所有标签的参考文献,只能看看其中比较常用的 ...
- struts2 if正确标签示例
下面总结一下struts2 中if标签的使用 (1)判断字符串是否为空 <s:if test="user.username==null or user.username==''&quo ...
随机推荐
- VS2010/MFC编程入门之十五(对话框:一般属性页对话框的创建及显示)
属性页对话框包括向导对话框和一般属性页对话框两类,上一节鸡啄米讲了如何创建并显示向导对话框,本节将继续介绍一般属性页对话框的创建和显示. 实际上,一般属性页对话框的创建和显示过程和向导对话框是很类似的 ...
- python面向对象编程基础
演示了 Python 类与对象的编程基础, 包括属性.方法.继承.组合.动态创建类. python 版本: 2.7.5 class SimpleClass(object): ''' a simple ...
- 【转】为什么我的DIV块前总有空隙?
在做网站项目时,博主爱吾所爱(爱生活=爱技术)很偶然地碰到一个奇怪的事情.我的DIV嵌套在另一个DIV里,总是出现这样一行空隙: Firebug查看内外两层DIV的margin, padding, l ...
- package 'orocos-bfl' not found
-- ==> add_subdirectory(bp_fusion) -- checking for module 'orocos-bfl' -- package 'orocos-bfl' no ...
- 如何借助 OVN 来提高 OVS 在云计算环境中的性能
众所周知,OpenvSwitch 以其丰富的功能和不错的性能,已经成为 Openstack 部署中最受欢迎的虚拟交换机.由于 Openstack Neutron 的架构引入了一些性能问题,比如 neu ...
- 装完RHEL之后,活用CentOS的Repository
RHEL的Repository好像要帐号. 所以yum几乎就不能用了. 在 /etc/yum.repos.d 里新建个文件,就可以用CentOS的Repository了 [CentOS6] name= ...
- Less开发指南(三)- 代码文件跟踪调试
案例背景:在大型网站中,css样式划分为多个模块文件,如reset.css,layout.css,skin.css等等(颗粒化越小,样式重用率越高),页面需要的时候引入它们即可! 回到less项目中这 ...
- 部分函数依赖 && 完全函数依赖
部分函数依赖:若x->y 并且,存在X的真子集x1,使得x1->y,则 y部分依赖于x. 完全函数依赖:若x->y并且,对于x的任何一个真子集x1,都不存在x1->y,则称y完 ...
- 【hive】时间段为五分钟的统计
问题内容 今天遇到了一个需求,需求就是时间段为5分钟的统计.有数据的时间戳.对成交单量进行统计. 想法思路 因为数据有时间戳,可以通过from_unixtime()来获取具体的时间. 有了具体的时间, ...
- Informatica存储库和集成服务的配置
1.配置存储库 首先登陆informatica的管理界面: 这里的用户名不区分大小写(注意后面配置集成服务是区分的,后面会提到)