自定义简单的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 ...
随机推荐
- WebService-WSDL简单介绍
一.什么是WSDL 网络服务描述语言(Web Services Description Language)简称WSDL.作用是通过接口之间的调用实现数据的传输.由于WSDL是基于XML格式的,所以它可 ...
- MapReduce: map读取文件的过程
我们的输入文件 hello0, 内容如下: xiaowang 28 shanghai@_@zhangsan 38 beijing@_@someone 100 unknown 逻辑上有3条记录, 它们以 ...
- Java实现使用位图生成真值组合
摘要: 使用位图生成真值组合. 难度: 初级. /** * 问题描述: 给定 n 个布尔变量,打印所有真值组合. * 例如, n = 2 时 , 所有真值组合为 (true, false),(tr ...
- sqlserver create table
①sql 语句创建(项目使用) use sps_db go if exists(select name from sys.tables where name='event_profile_level2 ...
- 实现Vue-MVVM-step1
一个利用defineProperty实现的MVVM双向数据绑 <!DOCTYPE html> <html lang="en"> <head> & ...
- STM32之独立版USB(Host)驱动+MSC+Fatfs移植
源:STM32之独立版USB(Host)驱动+MSC+Fatfs移植 STM32之USB驱动库详解(架构+文件+函数+使用说明+示例程序)
- 20145311王亦徐 实验三 "敏捷开发与XP实践"
20145311王亦徐 实验三 "敏捷开发与XP实践"程序设计过程 实验内容 使用 git 上传代码 使用 git 相互更改代码 实现代码的重载 git 上传代码 查看代码是否有修 ...
- 20162311 课堂测试 泛型类—Bag
课堂测试 泛型类-Bag 目录 一.题目要求 二.设计思路 三.问题和解决办法 四.代码运行截图 五.代码托管地址 六.总结 一.题目要求 题目:泛型类-Bag 返回目录 二.设计思路 自定义一个Ba ...
- java方法和本地方法
java中的方法有两种,java方法和本地方法. java方法:是由java语言编写,编译成字节码,存储在class文件中的.java方法是与平台无关的. 本地方法:本地方法是由其他语言(如C.C++ ...
- php环境重启
php-fpm mysql nginx 一个lnmp的服务,主要就是靠这三个来维持的. 重启nginx # /usr/local/nginx/sbin/nginx -s stop # /usr/loc ...