Chinaunix首页 | 论坛 | 博客
  • 博客访问: 418374
  • 博文数量: 79
  • 博客积分: 2886
  • 博客等级: 少校
  • 技术积分: 968
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-16 10:33
文章分类

全部博文(79)

文章存档

2013年(7)

2012年(17)

2011年(28)

2010年(25)

2009年(1)

2008年(1)

我的朋友

分类: 系统运维

2010-10-14 15:19:39

Test.jsp


  
    My JSP 'Test.jsp' starting page
  
 
  
    This is my JSP page.

    Date : <%= new java.util.Date().toString() %>

    File :  
  

为了将这个这个Test.jsp改成自定义标签方法,我们分别使用简单标签和内容标签两种不同的方式实现。

1. 简单标签

由于我们需要输出两个内容(日期和文件名),因此我们为标签创建一个参数。具体代码:

DemoTag.java
package com.mycompany;

import java.util.Date;

import javax.servlet.http.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

public class DemoTag extends TagSupport {
  
  public int doStartTag() throws JspException {    
    try {
      HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
      JspWriter out = pageContext.getOut();      
      
      if (parameter.compareToIgnoreCase("filename") == 0)
        out.print(request.getServletPath());
      else 
        out.print(new Date());
      
    } catch (java.io.IOException e) {
      throw new JspTagException(e.getMessage());
    }
    
    return SKIP_BODY;
  }
  
  private String parameter = "date";
  
  public void setParameter(String parameter) {
    this.parameter = parameter;
  } 
  
  public String getParameter() {
    return parameter;
  }
}

接下来,我们创建标签文件 MyTagLib.tld。标签文件其实只是一个XML格式的说明文件,内容也很简单。

MyTagLib.tld


1.0
1.2


  demo
  com.mycompany.DemoTag
  empty
  
    parameter
    false
    true
  




在这个标签文件中,我们将我们创建的标签取名 demo,并声明了类型和参数(parameter)。将该文件保存在 /WEB-INF 下面。
当然,我们还需要将我们自定义的标签添加到 web.xml 中,否则还是无法使用。

web.xml



  
    
      /WEB-INF/MyTagLib
      /WEB-INF/MyTagLib.tld
    

  



你可能在别处看到过类似的声明,只是没有外面的 jsp-config,但是我们使用的是DTD 2.4,如果不加,Eclipse 会提示出错。

到此为止,我们的自定义标签算是创建完毕。接下来,我们可以开始改写那个JSP文件来分离代码了。

Test.jsp

<%@taglib uri="/WEB-INF/MyTagLib" prefix="mytag"%>

  
    My JSP 'Test.jsp' starting page
  
 
  
    This is my JSP page.

    Date :

    File :
  

上面这些想必你已经很熟悉,我就不做多说了。

2. 内容标签

创建过程和上面大抵相同,只是程序文件和配置内容有些差异。

DemoTag2.java
package com.mycompany;

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

import javax.servlet.http.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;

public class DemoTag2 extends BodyTagSupport {
  
  public int doStartTag() throws JspTagException {    
    return EVAL_BODY_BUFFERED;
  }
  
  public int doEndTag() throws JspTagException {
    String body = this.getBodyContent().getString();
    HttpServletRequest request = (HttpServletRequest)pageContext.getRequest();
    
    body = body.replace("$date", new Date().toString());
    body = body.replace("$filename", request.getServletPath());
    
    try {
      pageContext.getOut().print(body);
    }
    catch (IOException e) {
      throw new JspTagException(e.getMessage());
    }
    
    return SKIP_BODY;
  }
}

我们将新的标签 DemoTag2 加入到上面的标签文件中。

MyTagLib.tld


1.0
1.2


  demo
  com.mycompany.DemoTag
  empty
  
    parameter
    false
    true
  




  demo2
  com.mycompany.DemoTag2
  jsp



web.xml 文件无需修改。

看看同时使用两种标签的Test.jsp效果。

Test.jsp

<%@taglib uri="/WEB-INF/MyTagLib" prefix="mytag"%>

  
    My JSP 'Test.jsp' starting page
  
 
  
    This is my JSP page.

    Date :

    File :

    


    
    Date: $date

    File: $filename
    

  

Tag 中定义:

SKIP_BODY = 0;          // 不处理标签体,直接调用doEndTag()方法

EVAL_BODY_INCLUDE = 1;   // 解析标签体,但绕过 doInitBody ()  setBodyContent () 方法

SKIP_PAGE = 5;          // 不解析标签后面的JSP内容

EVAL_PAGE = 6;          // 解析标签后,继续解析标签后面的JSP内容

阅读(1545) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

冰女乐2013-09-04 23:35:55

请问运行的时候要用什么地址呢?