zoukankan      html  css  js  c++  java
  • 自定义简单的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 }
    View Code

    三:在项目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>  
    View Code

    四:页面上测试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>
    View Code

    五:效果图

  • 相关阅读:
    一致性哈希算法
    Discourse 的标签(Tag)只能是小写的原因
    JIRA 链接 bitbucket 提示错误 Invalid OAuth credentials
    JIRA 如何连接到云平台的 bitbucket
    Apache Druid 能够支持即席查询
    如何在 Discourse 中配置使用 GitHub 登录和创建用户
    Apache Druid 是什么
    Xshell 如何导入 PuTTYgen 生成的 key
    windows下配置Nginx支持php
    laravel连接数据库提示mysql_connect() :Connection refused...
  • 原文地址:https://www.cnblogs.com/shangxiaofei/p/4040507.html
Copyright © 2011-2022 走看看