iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么入门JSP自定义标签开发
  • 379
分享到

怎么入门JSP自定义标签开发

2023-06-17 12:06:52 379人浏览 薄情痞子
摘要

这期内容当中小编将会给大家带来有关怎么入门jsP自定义标签开发,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一般情况下开发jsp自定义标签需要引用以下两个包import javax.servlet.jsp

这期内容当中小编将会给大家带来有关怎么入门jsP自定义标签开发,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

一般情况下开发jsp自定义标签需要引用以下两个包

import javax.servlet.jsp.*;

import javax.servlet.jsp.tagext.*;

首先我们需要大致了解开发自定义标签所涉及到的接口与类的层次结构(其中SimpleTag接口与SimpleTagSupport类是JSP2.0中新引入的)。

怎么入门JSP自定义标签开发

目标1:自定义一个用表格显示用户信息的简单标签

效果图:

怎么入门JSP自定义标签开发

在jsp页面使用此自定义标签:

假设我们有一个UserInfo的javabean,那么在JSP页面使用此标签只需调用此标签即可

<!-- 创建需要展现UserInfo的实例(用于测试数据) -->     <%      UserInfo user = new UserInfo();      user.setUserName("Xuwei");      user.setAge(33);      user.setEmail("test@test.test");      pageContext.setAttribute("userinfo", user);        %>        <!-- 给标签设置user属性绑定要展现的UserInfo对象  -->     <cc:showUserInfo user="${pageScope.userinfo }" />

开发步骤:

简单标签的开发我们只要实现Tag接口即可,为了简单起见可以直接继承实现了此接口的TagSupport类

1 创建自定义标签类

public class UserInfoTag extends TagSupport {           private UserInfo user;         @Override      public int doStartTag() throws JspException {          try {              JspWriter out = this.pageContext.getOut();              if(user == null) {                  out.println("No UserInfo Found...");                  return SKIP_BODY;              }              out.println("<table width='500px' border='1' align='center'>");              out.println("<tr>");              out.println("<td width='20%'>Username:</td>");              out.println("<td>" + user.getUserName() + "</td>");              out.println("</tr>");              out.println("<tr>");              out.println("<td>Age:</td>");              out.println("<td>" + user.getAge() + "</td>");              out.println("</tr>");              out.println("<tr>");              out.println("<td>Email:</td>");              out.println("<td>" + user.getEmail() + "</td>");              out.println("</tr>");              out.println("</table>");          } catch(Exception e) {              throw new JspException(e.getMessage());          }          return SKIP_BODY;      }           @Override      public int doEndTag() throws JspException {          return EVAL_PAGE;      }         @Override      public void release() {          super.release();          this.user = null;      }           //getter and setters      public UserInfo getUser() {          return user;      }      public void setUser(UserInfo user) {          this.user = user;      }  }

2 在WEB-Inf创建标签库描述文件.tdl(Tag Library Description)

<?xml version="1.0" encoding="UTF-8"?> <taglib version="2.0" xmlns="Http://java.sun.com/xml/ns/j2ee"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee web-jsptaglibrary_2_0.xsd"> <tlib-version>1.0</tlib-version> <jsp-version>2.0</jsp-version> <short-name>cc</short-name> <uri>/mytaglib</uri> <tag>     <name>showUserInfo</name>     <tag-class>com.mytags.UserInfoTag</tag-class>     <body-content>empty</body-content>     <attribute>         <name>user</name>          <required>false</required>          <rtexprvalue>true</rtexprvalue>     </attribute>  </tag> </taglib>

3 配置web.xml

<jsp-config>     <taglib>         <taglib-uri>/mytaglib</taglib-uri>         <taglib-location>/WEB-INF/mytaglib.tld</taglib-location>     </taglib>   </jsp-config>

4 在需要使用此标签的jsp页面头部引入

<%@ taglib uri="/mytaglib" prefix="cc"%>

5 使用(参照上面的使用步骤)

此致,一个简单的JSP标签开发完成

标签类说明:

怎么入门JSP自定义标签开发

我们创建的UserInfoTag类继承了TagSupport类,而它又实现了Tag接口,Tag接口的生命周期由其所在的容器控制,如下图:

setPageContext() 将所在jsp页面的pageContext注入进来,目的是为了在后面的方法中可以访问到jsp页面对象的pageContext属性

setParent() 设置此标签的父标签

setAttribute() 将标签中的属性注入到此class的属性,不需要自己实现但要提供属性的get与set方法

doStartTag() 在开始标签属性设置后调用,如果返回SKIP_BODY则忽略标签之中的内容,如果返回EVAL_BODY_INCLUDE则将标签体的内容进行输出

doEndTag() 在结束标签之前调用,返回SKIP_PAGE跳过整个jsp页面后面的输出,返回EVAL_PAGE执行页面余下部分

release() 生命周期结束时调用

特别说明:在Tomcat4.1之后的版本中默认开启了标签缓冲池(websphere和weblogic并不会这么做),所以执行完标签后并不会执行release()方法(_jspDestroy()时才释放),也就是说同一个jsp页面自定义标签不管使用多少次只会存在一个实例,但也并不是每一个标签都会为其创建一个缓冲池,要根据参数来判断,例如:

<cc:UserInfoTag user=”&hellip;” /> <cc:UserInfoTag />

上面例子中由于参数不同就会创建两个标签缓冲池。

这个问题可以通过设定tomcat的配置文件加以解决:

在%tomcat%\conf\web.xml加入enablePooling参数,并设置为false(不缓存自定义标签)。

<init-param>   <param-name>enablePooling</param-name>   <param-value>false</param-value> </init-param>

清空%tomcat%\conf\目录

TagSupport类已经为我们实现并扩展了一些方法(比如在上述方法中我们可以直接使用pageContext对象,调用父标签getParent()等),所以一般情况下我们只需重写doStartTag(),doEndTag() 即可

TLD文件说明:

<!--版本号-->
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>cc</short-name>
<tag>
<!&mdash;指定标签名 -->
<name>showUserInfo</name>
<!&mdash;指定标签类文件的全路径 -->
<tag-class>com.mytags.UserInfoTag</tag-class>
<!--如果不需要标签体则设置empty,反之设定jsp -->
<body-content>empty</body-content>
<!&mdash;设定属性(如果有的话) -->
<attribute>
<!&mdash;指定标签名 -->
<name>user</name>
<!&mdash;是否是必须,如果非必须没设置则为空 -->
<required>false</required>
<rtexprvalue>true</rtexprvalue><!&mdash;是否可在属性中使用表达式 -->
</attribute>
</tag>

Web.xml文件说明:

<jsp-config>
<taglib>
<!--

标签库的uri路径
即jsp头文件中声明<%@ taglib uri="/mytaglib" prefix="cc"%>
的uri
-->
<taglib-uri>/mytaglib</taglib-uri>
<!&mdash;tld文件所在的位置-->
<taglib-location>/WEB-INF/mytaglib.tld</taglib-location>
</taglib>
</jsp-config>

目标2:自定义一个类似于asp.net中的Reapter控件的标签

效果图:

怎么入门JSP自定义标签开发

在jsp页面使用此自定义标签:

<!-- 创建需要展现javabean(UserInfo)集合的实例(用于测试数据) --> <%      List<UserInfo> users = new ArrayList<UserInfo>();         users.add(new UserInfo("Zhangsan", 12, "Zhangsan@163.com"));      users.add(new UserInfo("Lisi", 22, "Lisi@sina.com"));      users.add(new UserInfo("Wangwu", 33, "Wangwu@qq.com"));      pageContext.setAttribute("users", users);  %>    <!-- 给标签绑定数据源  --> <table width='500px' border='1' align='center'>     <tr>         <td width='20%'>UserName</td>         <td width='20%'>Age</td>         <td>Email</td>     </tr>     <cc:repeater var="item" items="${pageScope.users }">         <tr>             <td>${item.userName }</td>             <td>${item.age }</td>             <td>${item.email }</td>         </tr>     </cc:repeater> </table>

开发步骤:

要完成此控件我们需要实现一个迭代接口,即IterationTag,由于TagSupport同样实现了此接口,所以我们继承此类

1 创建自定义标签类

public class Repeater extends TagSupport {      private Collection items;      private Iterator it;      private String var;         @Override      public int doStartTag() throws JspException {          if(items == null || items.size() == 0) return SKIP_BODY;          it = items.iterator();            if(it.hasNext()) {              pageContext.setAttribute(var, it.next());          }          return EVAL_BODY_INCLUDE;      }           @Override      public int doAfterBody() throws JspException {          if(it.hasNext()) {              pageContext.setAttribute(var, it.next());              return EVAL_BODY_AGAIN;          }          return SKIP_BODY;      }           @Override      public int doEndTag() throws JspException {          return EVAL_PAGE;      }           public void setItems(Collection items) {          this.items = items;      }           public void setVar(String var) {          this.var = var;      }  }

2在Web-Inf创建标签库描述文件.tdl(Tag Library Description)由于目标1种已经创建了此文件,我们只需增加此标签的配置即可

<tag>     <name>repeater</name>     <tag-class>com.mytags.Repeater</tag-class>     <body-content>jsp</body-content>     <attribute>         <name>items</name>         <required>false</required>         <rtexprvalue>true</rtexprvalue>     </attribute>     <attribute>         <name>var</name>         <required>true</required>         <rtexprvalue>true</rtexprvalue>     </attribute>  </tag>

3 配置web.xml (目标1中已完成,无需修改)



4 在需要使用此标签的jsp页面头部引入

<%@ taglib uri="/mytaglib" prefix="cc"%>

5 使用(参照上面的使用步骤)

标签类说明:

我们用到了迭代接口,以下是容器处理此接口的流程

怎么入门JSP自定义标签开发

作为目标1中的补充: 在doAfterBody()如果返回值是EVAL_BODY_AGAIN那么将重新执行此方法

目标3:使用BodyTagSupport

此目标并不会使用实际例子进行显示,主要是说明为什么,什么情况下需要使用到BodyTag接口或者BodyTagSupport类?

如果我们需要在&hellip;. 之间的标签体的头部和尾部加上一些标记或者是其他处理,一般的处理方法是在doStartTag和doEndTag方法中进行, 但是如果是个迭代标签,标签体的每段内容在循环输出时每次都需要在头部和尾部加上一些标记,我们使用BodyTagSupport就很方便了,

此接口在doStartTag()方法返回值多了一个EVAL_BODY_BUFFERED,它将对主体进行计算,并输出到缓冲区(注:此处是缓冲区并非直接输出到客户端,需要我们手动(this.bodyContent.getEnclosingWriter().write(this.bodyContent.getString());)进行输出客户端的调用,否则主体内容不会进行显示)

标签类说明:

关于BodyTagSupport接口的说明

怎么入门JSP自定义标签开发

目标4:自定义的函数库

1 创建函数库类

public class MyFunctions {      public static String fORMatMyName(String name) {         return "your name is " + name;      }      public static int add(int a, int b) {         return a+b;      }  }

2 在TLD文件中配置 (引用于目标1中的tld文件)

<function>     <name>formatMyName</name>     <function-class>com.taglib.MyFunctions</function-class>     <function-signature>java.lang.String formatMyName(java.lang.String)</function-signature>  </function>    <function>     <name>add</name>     <function-class>com.taglib.MyFunctions</function-class>     <function-signature>java.lang.String add(int, int)</function-signature>  </function>

3 JSP中调用

${cc:formatMyName("wangfei") }  ${cc:add(12, 34) }

上述就是小编为大家分享的怎么入门JSP自定义标签开发了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: 怎么入门JSP自定义标签开发

本文链接: https://www.lsjlt.com/news/288762.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么入门JSP自定义标签开发
    这期内容当中小编将会给大家带来有关怎么入门JSP自定义标签开发,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。一般情况下开发jsp自定义标签需要引用以下两个包import javax.servlet.jsp...
    99+
    2023-06-17
  • JSP怎么自定义标签
    这篇文章主要讲解了“JSP怎么自定义标签”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JSP怎么自定义标签”吧!创建”Hello”标签接下来,我们想创建一个自定义标签叫作,标签格式为:要创建...
    99+
    2023-06-27
  • Spring开发中如何实现自定义标签
    今天就跟大家聊聊有关Spring开发中如何实现自定义标签,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Spring框架是现在Java最流行的开源框架之一,并且Spring下的各种子项...
    99+
    2023-05-31
    spring 标签
  • Django零基础入门之自定义标签及模板中的使用
    目录自定义标签:第一部分(1)视图函数编写:(2)编写模板文件:(3)自定义标签实现:(4)效果展示:第二部分(1)视图函数编写:(2)编写模板文件:(3)自定义标签实现:第三部分紧...
    99+
    2022-11-12
  • java怎么自定义标签实现类
    要自定义一个标签实现类,需要按照以下步骤进行操作: 创建一个类,该类需要实现javax.servlet.jsp.tagext.T...
    99+
    2023-10-28
    java
  • DEDECMS系统分页标签自定义二次开发实例
    本文实例讲述了DEDEcms系统分页标签自定义二次开发的方法。分享给大家供大家参考。具体实现方法如下: 自定搜索结果页面文章分页,在/plus文件夹中新建一个search.php文件,代码如下:复制代码代码如下:<...
    99+
    2022-06-12
    DEDECMS 系统 分页标签 自定义 二次开发
  • Django5中怎么自定义过滤器和标签
    这篇文章将为大家详细讲解有关Django5中怎么自定义过滤器和标签,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。  目录结构  1.(创建)在主目录下创建名为common的python包(自...
    99+
    2023-06-02
  • FineReport中怎么利用JavaScript自定义地图标签
    这期内容当中小编将会给大家带来有关FineReport中怎么利用JavaScript自定义地图标签,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。 <span >'+ FR.cont...
    99+
    2023-06-04
  • winform怎么自定义控件开发
    在WinForms中自定义控件开发,可以按照以下步骤进行:1. 创建新的类,继承自现有的控件类,比如`UserControl`或`C...
    99+
    2023-10-10
    winform
  • win7开始图标怎么自定义形状?
    Windows7自带的开始图标是个圆形的windows logo,如果想换种心情,可以自定义图标。win8的蓝色正方形logo不错,以这个为例。当然,你也可以用自己的头像! 软媒魔方电脑大师 V6.25 绿色免费版类型...
    99+
    2023-06-10
    win7 开始图标 自定义 形状
  • IE 8 分组标签颜色怎么自定义设置
    这篇文章主要介绍“IE 8 分组标签颜色怎么自定义设置”,在日常操作中,相信很多人在IE 8 分组标签颜色怎么自定义设置问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”IE 8 分组标签颜色怎么自定义设置”的疑...
    99+
    2023-06-14
  • Android中怎么自定义View实现标签流效果
    本篇内容主要讲解“Android中怎么自定义View实现标签流效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android中怎么自定义View实现标签流效果”吧!一、概述Android自定义...
    99+
    2023-06-29
  • Java Web开发中怎么自定义Session
    今天小编给大家分享一下Java Web开发中怎么自定义Session的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下...
    99+
    2022-10-19
  • 小程序怎么自定义开发组件
    这篇文章主要讲解了“小程序怎么自定义开发组件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“小程序怎么自定义开发组件”吧!    第一种方式,下面是一个组件的基本组成部分,样式表就不写了,  ...
    99+
    2023-06-26
  • Android开发中怎么自定义时间轴
    今天就跟大家聊聊有关Android开发中怎么自定义时间轴,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。具体内容如下 时间轴效果,实际上非常简单,就是listView中一个又一个的条目...
    99+
    2023-05-31
    android 时间轴 roi
  • 在Android开发中怎么实现一个自定义输入法功能
    在Android开发中怎么实现一个自定义输入法功能?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前面两个输入框使用了自定义的输入法:第三个输入框没有进行任何设置...
    99+
    2023-05-31
    android roi
  • 怎么使用Python开发自定义Web框架
    开发自定义Web框架接收web服务器的动态资源请求,给web服务器提供处理动态资源请求的服务。根据请求资源路径的后缀名进行判断:如果请求资源路径的后缀名是.html则是动态资源请求, 让web框架程序进行处理。否则是静态资源请求,让web服...
    99+
    2023-05-17
    Python web
  • Android开发中怎么样实现自定义toast
    这篇文章将为大家详细讲解有关Android开发中怎么样实现自定义toast,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。具体方法如下://自定义布局的toastcustomViewToast...
    99+
    2023-05-31
    android roi toast
  • Android开发怎么自定义实时图表控件
    本文小编为大家详细介绍“Android开发怎么自定义实时图表控件”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android开发怎么自定义实时图表控件”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。演示环境开发工...
    99+
    2023-07-02
  • uniapp怎么自定义验证码输入框并隐藏光标
    这篇文章主要讲解了“uniapp怎么自定义验证码输入框并隐藏光标”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“uniapp怎么自定义验证码输入框并隐藏光标”吧!一. 前言点击输入框唤起键盘,...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作