自定义简单的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 ...
随机推荐
- 141. Linked List Cycle(判断链表是否有环)
141. Linked List Cycle Given a linked list, determine if it has a cycle in it. Follow up:Can you sol ...
- Linux centos7 redis安装教程
1.下载解压 #下载至/home/install(或windows系统下载后上传) mkdir /home/install cd /home/install wget http://124.205.6 ...
- bzoj1407 / P2421 [NOI2002]荒岛野人(exgcd)
P2421 [NOI2002]荒岛野人 洞穴数不超过1e6 ---> 枚举 判断每个野人两两之间是否发生冲突:exgcd 假设有$m$个洞穴,某两人(设为1,2)在$t$时刻发生冲突 那么我们可 ...
- bzoj1622 / P2908 [USACO08OPEN]文字的力量Word Power
P2908 [USACO08OPEN]文字的力量Word Power 第一眼:AC自动机(大雾) 直接暴力枚举即可. 用<cctype>的函数较方便(还挺快) $isalpha(a)$:$ ...
- 图像添加logo水印函数
<?php //图像添加水印函数 /** *为一张图片添加上一个logo水印(以保存新图片的方式实现) *@param string $picname 被缩放的处理图片源 *@param int ...
- 【Jmeter】配置不同业务请求比例,应对综合场景压测
背景 在进行综合场景压测时,遇到了如何实现不同的请求所占比例不同的问题. 有人说将这些请求分别放到单独的线程组下,然后将线程组的线程数按照比例进行配置. 这种方法不是很好,因为服务器对不同的请求处理能 ...
- poj1459网络流之多源点最大流
这题想了好久,一直认为应该bfs更新后求最小值把发电站最大发电加进去,但是又发现这样求增广路的时候会导致用户更新出错, 加源点和汇点也考虑到了,没想到居然发电量就是超级源到源点的v,居然这么简单@.@ ...
- Less开发指南(三)- 代码文件跟踪调试
案例背景:在大型网站中,css样式划分为多个模块文件,如reset.css,layout.css,skin.css等等(颗粒化越小,样式重用率越高),页面需要的时候引入它们即可! 回到less项目中这 ...
- IOS-CoreData(增删改查、表关联、分页和模糊查询、多个数据库)
1>什么是CoreData Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数 ...
- BZOJ2314 士兵的放置
树形DP,恩然后就不会了... 先写了个错的离谱程序...果然WA了 然后开始乱搞,欸,对了! 令f[i], g[i], h[i]分别表示i号节点自己放士兵,被儿子上的士兵控制,不被儿子上的士兵控制但 ...