JSP/Servlet: TagSupport 类别

简介: 如果在自订标签库时,并不需要对标签本体作处理,则您可以继承TagSupport类别,TagSupport类别实作了Tag与 IterationTag介面,IterationTag介面则是Tag介面的子介面,TagSupport类别替您预先实作了这两个介面中的方法,在继承TagSupport之后,您视需要来改写当中的一些方法(这是 Default Adapter模式)。 Tag介面中与标签处相关
如果在自订标签库时,并不需要对标签本体作处理,则您可以继承TagSupport类别,TagSupport类别实作了 TagIterationTag介面,IterationTag介面则是Tag介面的子介面,TagSupport类别替您预先实作了这两个介面中的方法,在继承TagSupport之后,您视需要来改写当中的一些方法(这是 Default Adapter模式)。

Tag介面中与标签处相关的方法主要有: doStartTag()、doEndTag()。其中doStartTag()方法是遇到标签开始时会呼叫的方法,其合法的回传值是 EVAL_BODY_INCLUDE与SKIP_BODY,前者表示将显示标签间的本体文字,后者表示不显示标签间的本体文字;doEndTag()方法是在遇到标签结束时呼叫的方法,其合法的回传值是 EVAL_PAGE与SKIP_PAGE,传回前者表示处理完标签后继承执行以下JSP网页,传回后者则表示不处理接下来的JSP网页。

IterationTag介面继承Tag介面,在标签处理上增加了 doAfterBody(),这个方法是在显示完标签间文字本体之后呼叫的,其合法的回传值有 EVAL_BODY_AGAIN与SKIP_BODY,如果传回前者,则会再显示一次标签间的文字本体,传回后者则继承执行标签处理的下一步。

TagSupport类别实作了Tag与IterationTag介面,其 预设的回传值是:doStartTag()回传 SKIP_BODY、doAfterBodyTag()回传SKIP_BODY、doEndTag()回传EVAL_PAGE。所以在继承 TagSupport之后,如果没有改写任何的方法,则在标签处理上执行的顺序是:

doStartTag() -> 不显示本体文字 -> doEndTag() -> 执行接下来的JSP网页

如果您改写了doStartTag(),则您必须指定回传值,如果指定了EVAL_BODY_INCLUDE,则预设会照以下的顺序执行:

doStartTag() -> 显示本体文字 -> doAfterBodyTag()->doEndTag()->执行接下来的JSP网页

简单的说,如果您继承了TagSupport并改写了其中的一些方法,则您必须指定方法合法的回传值,如果不改写,则会有其预设的回传值,/以下作个流程整理:
TagSupport流程

如果您在处理标签时,引用了一些资源,例如档案I/O或是资料库连结,则您可以改写release()方法,这个方法会在doEndTag()之后执行,您可以在处理完标签之后用它来释放先前所使用到的资源。

下面这个程式简单的示范如何使用自订标签来对网页内容作一些保护:
  • GuardTag.java
package onlyfun.caterpillar; 



import java.io.*;

import javax.servlet.jsp.*;

import javax.servlet.jsp.tagext.*;



public class GuardTag extends TagSupport {

public int doStartTag() throws JspException {

String valid =

pageContext.getRequest().getParameter("valid");



// 如果flag设定为key,就显示本体文字内容

if(valid.equals("valid_user")) {

return EVAL_BODY_INCLUDE;

}



return SKIP_BODY;

}

}

同样的,程式编译完之后,放置在WEB-INF/classes/之下,然后编译.tld档案,如下:
  • guardtag.tld
<?xml version="1.0" encoding="UTF-8" ?> 



<taglib 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"

version="2.0">



<description>Tag Demo</description>

<tlib-version>1.0</tlib-version>

<jsp-version>2.0</jsp-version>

<short-name>TagDemo</short-name>

<uri>/TagDemo</uri>



<tag>

<description>Cuard BodyText</description>

<name>guard</name>

<tag-class>onlyfun.caterpillar.GuardTag</tag-class>

<body-content>JSP</body-content>

</tag>



</taglib>

在<body-content>中设定的是JSP,这表示如果本体中包括JSP网页的内容,将会被编译执行,接下来您可以在web.xml中定义uri与.tld的名称对应关系,方法与前一个主题相同,这边就不重复说明了,然后撰写一个测试的JSP网页:
  • test.jsp
<%@taglib prefix="caterpillar" 

uri="http://caterpillar.onlyfun.net/"%>

<html>

<body>

这个网页包括受保护的内容OOOXXXX。。。。。。<p>

<caterpillar:guard>

${ param.user }, 您好,幸运密码是 oooxxx !

</caterpillar:guard>

</body>

</html>

为了要能看到幸运密码,您必须在请求中包括guard参数,假设请求是:
http://localhost:8080/myjsp/test.jsp?valid=valid_user&user=Justin

这样就可以看到幸运密码了:
<html>
<body>
    这个网页包括受包护的内容OOOXXXX。。。。。。<p>
   
        Justin, 您好,幸运密码是: oooxxx !
   
</body>
</html>
 
这是部份防护网页内容的一个简单例子,您还可以在doEndTag()中使用SKIP_PAGE来防护标签以下的整个网页,这使得您不用在JSP网页中包括防护的判断逻辑。 
相关文章
|
2月前
|
Java 容器
【学习笔记】Jsp与Servlet技术
【学习笔记】Jsp与Servlet技术
82 0
|
4月前
|
SQL Java 数据库
jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上
该博客文章介绍了在JSP应用中使用Servlet查询SQL Server数据库的表信息,并通过JavaBean封装图书信息,将查询结果展示在Web页面上的方法。
jsp中使用Servlet查询SQLSERVER数据库中的表的信息,并且打印在屏幕上
|
4月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
Java服务器端技术:Servlet与JSP的集成与扩展
41 3
|
4月前
|
存储 缓存 前端开发
Servlet与JSP在Java Web应用中的性能调优策略
Servlet与JSP在Java Web应用中的性能调优策略
42 1
|
4月前
|
供应链 前端开发 Java
JSP+servlet+mybatis+layui服装库存管理系统(大三上学期课程设计)
这篇文章通过一个服装库存管理系统的实例,展示了在Spring Boot项目中使用Ajax、JSON、layui、MVC架构和iframe等技术,涵盖了注册登录、权限管理、用户管理、库存管理等功能,并提供了系统运行环境和技术要求的详细说明。
JSP+servlet+mybatis+layui服装库存管理系统(大三上学期课程设计)
|
4月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
基于Servlet和JSP的Java Web应用开发指南
79 0
|
4月前
|
前端开发 安全 Java
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
在Java服务器端开发的浩瀚宇宙中,Servlet与JSP犹如两颗璀璨的明星,它们联袂登场,共同编织出动态网站的绚丽篇章。
31 0
|
6月前
|
存储 Java 关系型数据库
基于Servlet和JSP的Java Web应用开发指南
【6月更文挑战第23天】构建Java Web应用,Servlet与JSP携手打造在线图书管理系统,涵盖需求分析、设计、编码到测试。通过实例展示了Servlet如何处理用户登录(如`LoginServlet`),JSP负责页面展示(如`login.jsp`和`bookList.jsp`)。应用基于MySQL数据库,包含用户和图书表。登录失败显示错误信息,成功后展示图书列表。部署到Tomcat服务器测试功能。此基础教程为深入Java Web开发奠定了基础。
130 10
|
6月前
|
缓存 安全 Java
Java服务器端技术:Servlet与JSP的集成与扩展
【6月更文挑战第23天】Java Web开发中,Servlet和JSP是构建动态Web应用的基础。Servlet处理逻辑,JSP专注展示。示例展示了Servlet如何通过`request.setAttribute`传递数据给JSP渲染。JSP自定义标签提升页面功能,如创建`WelcomeTag`显示欢迎消息。Servlet过滤器,如`CacheControlFilter`,用于预处理数据或调整响应头。这些集成和扩展技术增强了应用效率、安全性和可维护性,是Java服务器端开发的关键。
72 7
|
6月前
|
存储 设计模式 搜索推荐
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(下)
早期javeweb技术 JSP JDBC JSTJ Servlet BooStrap(下)
40 1