相信大家在编辑Jsp页面的时候用到过“自定义标签”,
javax.servlet.jsp.tagext
javax.servlet.jsp.tagext
javax.servlet.jsp.tagext
使用了自定义标签后打印出了提交的“人员信息”。
自定义标签主要用于调用Javaean组件中的操作和执行请求分派的标准,JSP标签简化了JSP页面的开发和维护。JSP技术还提供了在
自定义标签中封装其他动态功能的机制,这种自定标签是JSP语言的扩展。自定义标签通常是以
标签库的形式出现的,它定义了一组相关的自定义标签,并包含实现这些标签的对象。
可以由自定义标签执行的任务包括对隐式对象的操作、处理表单、访问数据库和其他企业级服务,如电子邮件和目录、以及执行流程控制。JSP标签库是由精通Java编程语言和对访问数据库和其他服务非常熟悉的开发人员创建的,使用这些标签,Web应用程序开发人员就可以把注意力放到内容的呈现上,而不用费心考虑如何访问企业级服务。就像鼓励将库开发人员和库使用人员的工作分开一样,自定义标签通过封装反复执行的任务使它们可以在多个应用程序中重复使用,从而提高了生产率。
何为自定义标签呢?自定义标签是用户定义的JSP语言元素。当包含自定义标签的JSP页面转换为servlet时,这个标签就转换为一个名为
tag handler的对象上的操作。之后当JSP页面的servlet执行时,Web容器就调用这些操作。
这些太麻烦了,直接看看代码就会明白不少~~
我有是个文件(我觉得可以演示自定义标签作用基本的了),
index.jsp 功能:索引页面,用于提交用户输入的用户名和密码
Logon.jsp 功能:通过一个简单的“自定义标签”现实出用户的用户名和密码
util.tld 功能:配置Jsp引擎该如何处理“自定义标签”
TagUtil.java 功能:真正处理用户信息以及显示用户信息所有功能的类
说道这里我要介绍实现“自定义标签”所需要的类和接口
![10f50069d80.jpg](https://i-blog.csdnimg.cn/blog_migrate/8d172d1b43d81013160537f706fa4b43.jpeg)
好了所需要的类和接口都看到了,大家一起看一下代码来一步一步的分析这些接口和类的作用。
非常简单的index.jsp页面
![10f500b6994.jpg](https://i-blog.csdnimg.cn/blog_migrate/7a315fa19e0240032fd11ab9a464322e.jpeg)
显示用户信息的Logon.jsp(名字是我之前做另外一个试验是的,没有改过来请见谅叫viewinfo.jsp比较好)
![10f50161d36.jpg](https://i-blog.csdnimg.cn/blog_migrate/f2f79da6adbf317b3cbc08ee652cd6d7.jpeg)
其中比较重要的是这一句
![10f501f609e.jpg](https://i-blog.csdnimg.cn/blog_migrate/93cf34bfe6c0dd9f0d5dd57b19c5fee4.jpeg)
下面是util.tld文件,这是“自定义标签”和Jsp引擎通信所必须的文件
下面是实现标签功能的类TagUtil.java
所有的代码都在这里,还要再把关于下面是BodyTagSupport类的方法,这个类实现了Tag、BodyTag和InterationTag接口便于我们直接使用所有功能
![10f50b7415e.jpg](https://i-blog.csdnimg.cn/blog_migrate/56487248b7d931a0af650d7f9fe90325.jpeg)
![10f50c851c1.jpg](https://i-blog.csdnimg.cn/blog_migrate/a522c0d3f5b3db0b9253af3e4e11524f.jpeg)
![10f50c5c477.jpg](https://i-blog.csdnimg.cn/blog_migrate/8bdc5f30a583601bc0e08b06ba104e88.jpeg)
![10f50ca8403.jpg](https://i-blog.csdnimg.cn/blog_migrate/fb8891aaebd3a5b249193957b4e561e4.jpeg)
javax.servlet.jsp.tagext
Class BodyTagSupport
javax.servlet.jsp.tagext.BodyTagSupport
-
All Implemented Interfaces:
- BodyTag, IterationTag, JspTag, Serializable, Tag
一个成员变量bodyContent
Field Summary | |
protected BodyContent | bodyContent The current BodyContent for this BodyTag. |
方法
Method Summary | |
int | doAfterBody() After the body evaluation: do not reevaluate and continue with the page. |
int | doEndTag() Default processing of the end tag returning EVAL_PAGE. |
void | doInitBody() Prepare for evaluation of the body just before the first body evaluation: no action. |
int | doStartTag() Default processing of the start tag returning EVAL_BODY_BUFFERED. |
BodyContent | getBodyContent() Get current bodyContent. |
JspWriter | getPreviousOut() Get surrounding out JspWriter. |
void | release() Release state. |
void | setBodyContent(BodyContent b) Prepare for evaluation of the body: stash the bodyContent away. |
<tony:tag>标签体中的内容</tony:tag>
我们可以调用BodyContent类的getString方法来得到标签体中的内容。
javax.servlet.jsp.tagext
Class BodyContent
javax.servlet.jsp.tagext.BodyContent
BodyContent的方法
Method Summary | |
void | clearBody() Clear the body without throwing any exceptions. |
void | flush() Redefined flush() so it is not legal. |
JspWriter | getEnclosingWriter() Get the enclosing JspWriter. |
abstract Reader | getReader() Return the value of this BodyContent as a Reader. |
abstract String | getString() Return the value of the BodyContent as a String. |
abstract void | writeOut(Writer out) Write the contents of this BodyContent into a Writer. |
javax.servlet.jsp.tagext
Interface DynamicAttributes
这个接口只有一个方法
Method Summary | |
void | setDynamicAttribute(String uri, String localName, Object value) Called when a tag declared to accept dynamic attributes is passed an attribute that is not declared in the Tag Library Descriptor. |
下面看一下运行的结果
![10f50eadb93.jpg](https://i-blog.csdnimg.cn/blog_migrate/324a0d5223e79ca9bb808d7cb5a1eded.jpeg)
![10f50eb0a7f.jpg](https://i-blog.csdnimg.cn/blog_migrate/f9a8cbfe7ba6bae51be48bebfa10559c.jpeg)
在下一篇中我将详细介绍这些功能是如何实现的,并且说明tld文件的属性配置情况。
本文转自 tony_action 51CTO博客,原文链接:http://blog.51cto.com/tonyaction/42034,如需转载请自行联系原作者