本文是一篇关于自定义方法的帖子
JSP自定义标签。在自定义标签的起始和结束标签之间的部分为标签体(Body)。
标签处置程序类:定义标签的行为,并在JSP引擎遇到自定义标签时调用执行。
标签库描述符(TLD)文件:描述标签库的XML文档,向JSP引擎提供有关自定义标签的标签处置程序的信息。tag标签相关属性:实现简略标签处置程序标签处置程序是一个在运行时调用的Java类,它包含在 JSP文件中使用的自定义标签的实现代码.标签处置程序必须实现或扩展javax.servlet.jsp.tagext包中的类和接口.javax.servlet.jsp.tagext含有答应标签处置程序类与JSP容器通信的接口和类。
最近在项目中要用到这类技术,所以自己就写一个经典的HelloWorld实例: 其实对自定义标签已经早有接触了(Struts中使用了很多自定义标签,如html、bean等) 使用这类技术的优点:取代了JSP中的Java程序,并且可以重复使用,方便不熟悉Java编程的网页设计职员。
实现步调:
首先启动eclipse,新建一个web项目(废话...)
1、修改web.xml文件,增长自定义标签支持。
Java代码
1. <?xml version="1.0" encoding="UTF-8"?>
2. <web-app version="2.5"
3. xmlns="http://java.sun.com/xml/ns/javaee"
4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5. xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
6. http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
7. <jsp-config>
8. <taglib>
9. <taglib-uri>/tld/helloworld</taglib-uri>
10. <taglib-location>/WEB-INF/tlds/helloworld.tld</taglib-location>
11. </taglib>
12. </jsp-config>
13. </web-app>
2、创立标签库TLD文件 tlds\helloworld.tld 。
Java代码
1. <?xml version="1.0" encoding="UTF-8"?>
2. <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
3. "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
4. <taglib>
5. <tlib-version>1.0</tlib-version><!-- 标签库的版本 -->
6. <jsp-version>1.2</jsp-version><!-- 这个标签库要求的JSP标准版本 -->
7. <short-name>mytag</short-name><!-- JSP页面编写工具可以用来创立助记名的可选名字 -->
8. <tag>
9. <name>helloworld</name><!-- 独一标签名 -->
10. <tag-class>com.yd.mytag.HelloWorldTag</tag-class><!-- 标签HelloWorldTag类的完整限定名 -->
11. <body-content>empty</body-content><!-- 正文内容类型 -->
12. </tag>
13. </taglib>
这里注意:web.xml和xxx.tld这两个XML文件的头信息的版本匹配很主要,否则会致使页面报错找不到标签 。
3、创立标签处置程序类 HelloWorldTag(重写doStartTag和doEndTag方法)。
Java代码
1. package com.yd.mytag;
2.
3. import java.io.IOException;
4. import javax.servlet.jsp.JspException;
5. import javax.servlet.jsp.JspTagException;
6. import javax.servlet.jsp.tagext.TagSupport;
7. /**
8. * TagSupport与BodyTagSupport的区分:
9. * 主要看标签处置类是否要读取标签体的内容和改变标签体返回的内容,如果不需要就用TagSupport,否则就用BodyTagSupport
10. * 用TagSupport实现的标签,都可以用BodyTagSupport来实现,因为BodyTagSupport继承了TagSupport
11. */
12. public class HelloWorldTag extends TagSupport {
13. private static final long serialVersionUID = 3174234039143531070L;
14. @Override
15. public int doStartTag() throws JspException {//这个方法不必所以直接返回值
16. return EVAL_BODY_INCLUDE;
17. }
18. @Override
19. public int doEndTag() throws JspException {//重点在这个方法上
20. try {
21. pageContext.getOut().write("Hello World!");//标签的返回值
22. } catch (IOException ex) {
23. throw new JspTagException("错误");
24. }
25. return EVAL_PAGE;
26. }
27. }
补充:
doStartTag()方法是遇到标签开始时会呼叫的方法,其正当的返回值是EVAL_BODY_INCLUDE与SKIP_BODY,前者表示将表现标签间的文字,后者表示不表现标签间的文字。
doEndTag()方法是在遇到标签结束时呼叫的方法,其正当的返回值是EVAL_PAGE与SKIP_PAGE,前者表示处置完标签后继续执行以下的JSP网页,后者是表示不处置接下来的JSP网页。
doAfterBody(),这个方法是在表现完标签间文字之后呼叫的,其返回值有EVAL_BODY_AGAIN与SKIP_BODY,前者会再表现一次标签间的文字,后者则继续执行标签处置的下一步。
EVAL_BODY_INCLUDE:把Body读入存在的输出流中,doStartTag()函数可用。
EVAL_PAGE:继续处置页面,doEndTag()函数可用。
SKIP_BODY:疏忽对Body的处置,doStartTag()和doAfterBody()函数可用。
SKIP_PAGE:疏忽对余下页面的处置,doEndTag()函数可用。
EVAL_BODY_BUFFERED:请求缓冲区,由setBodyContent()函数失掉的BodyContent对象来处置tag的body,如果类实现了BodyTag,那么doStartTag()可用,否则非法。
EVAL_BODY_AGAIN:请求继续处置body,返回自doAfterBody(),这个返回值在你制造循环tag的时候是很有用的。
预定的处置次序是:doStartTag()返回SKIP_BODY,doAfterBodyTag()返回SKIP_BODY,doEndTag()返回EVAL_PAGE。如果继承了TagSupport之后,如果没有改写任何的方法,标签处置的执行次序是:doStartTag() ->不表现文字 ->doEndTag()->执行接下来的网页 。如果您改写了doStartTag(),则必须指定返回值,如果指定了EVAL_BODY_INCLUDE,则执行次序是:doStartTag()->表现文字->doAfterBodyTag()->doEndTag()->执行上面的网页 。
4、终究测试页面 hello.jsp 。
Java代码
1. <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
2. <%@ taglib uri="/tld/helloworld" prefix="mytag"%><!-- 在页面中加以声明 -->
3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
4. <html>
5. <head>
6. <title>MyJSP</title>
7. </head>
8. <body>
9. <h1>自定义标签:</h1><br>
10. <mytag:helloworld></mytag:helloworld>
11. </body>
12. </html>
实例完成,HelloWorld再现江湖!!!
文章结束给大家分享下程序员的一些笑话语录:
有一天,一个男人穿越森林的时候,听到一个细微的声音叫住他。他低头一看,是一只青蛙。
“如果你亲我一下,我会变成一个美丽的公主哦。”男人一言不发,把青蛙捡起来,放入口袋。
“如果你亲我一下,我会变成一个美丽的公主哦。而且,我会告诉我遇到的每一个人,你是多么聪明和勇敢,你是我的英雄。”男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。
“如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一星期。”男人又把青蛙拿出来,对着它微微一笑,把它放回口袋。
“如果你亲我一下,我会变成一个美丽的公主,然后我愿意成为你的爱人一年,而且你可以对我做任何事。”再一次,男人把青蛙拿出来,对着它微微一笑,又把它放回口袋。
最后,青蛙无力地问:“我开出了这么好的条件,为什么你还不肯吻我?”男人说:“我是一个程序员,我可没时间和什么公主鬼混。不过,拥有一个会说话的青蛙,倒是蛮酷的。”
---------------------------------
原创文章 By
自定义和方法
---------------------------------