日期:2014-05-16  浏览次数:20309 次

JSP标签在tomcat中的运行原理


??????? 在网上找了很多关于jsp标签的文章,但大多数都是只是告诉你怎么去使用,怎么去编写一个jsp标签。几乎没有可以从源头上告诉你怎么去理解原理,它在tomcat中又是怎么样的呢?所以我花一点时间整理一编关于jsp标签原理的文章,如有什么不周祥之处还望各位大侠谅解。
?????
??????? 首先我们需要大致了解开发自定义标签所涉及到的接口与类的层次结构(其中SimpleTag接口与SimpleTagSupport类是JSP2.0中新引入的)。

??

???? ??? (一) JSP自定义标签的定义步骤:

??????????? 1? 创建标记处理类

??????????? 2?? 创建TLD文件

??????????? 3?? 在jsp页面通

??????????????? 过指令引入标签库

????

?

?

?

?

1、处理标签的类必须扩展javax.servlet.jsp.TagSupport 或 BodyTagSupport。先来讨论TagSupport

2、TagSupport类的主要属性:

A.parent属性:代表嵌套了当前标签的上层标签的处理类;

B.pageContex属性:代表Web应用中的javax.servlet.jsp.PageContext对象;

3、JSP容器在调用doStartTag或者doEndTag方法前,会先调用setPageContext和setParent方法,设置pageContext和parent。因此在标签处理类中可以直接访问pageContext变量;

4、在TagSupport的构造方法中不能访问pageContext成员变量,因为此时JSP容器还没有调用setPageContext方法对pageContext进行初始化。

?

先写一个扩展javax.servlet.jsp.TagSupport的标签类MyTag :

package com.common.tag;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.TagSupport;

public class MyTag extends TagSupport
{
??? int i=1;
??? String first;
??? String date;
?JspWriter jw;
public int doStartTag() throws JspException {
??? jw=super.pageContext.getOut();
??? try {
??? ??? jw.print("this is first field :"+getFirst() +"<br/>");
??? ??? jw.print("this is first date :"+getDate() +"<br/>");
??? } catch (IOException e) {
??? ??? e.printStackTrace();
??? }
???
??? return TagSupport.EVAL_BODY_INCLUDE;
}
?
? public int doAfterBody() throws JspException {
??? ? try {
??? ??? jw.println(i++ + "???? :我想知道这里doafterbody都做了些什么了呢<br/>");
??? ???
??? } catch (IOException e) {
??? ??? e.printStackTrace();
??? }
??? ? if(5==i)return TagSupport.SKIP_BODY;
??? ?return TagSupport.EVAL_BODY_AGAIN;
??? }
?
? public int doEndTag() throws JspException {
??? ? try {
??? ??? jw.print("最后的结束标签了,doendtag");
??? } catch (IOException e) {