使用自定义标签实现JSP页面和代码的分离

js|页面

Test.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title>My JSP 'Test.jsp' starting page</title>
  </head>
 
  <body>
    This is my JSP page. <br>
    Date : <%= new java.util.Date().toString() %> <br>
    File : <input value="<%= request.getServletPath() %>" />
  </body>
</html>

为了将这个这个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
<?xml version="1.0" encoding="ISO-8859-1"?>
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>

<tag>
  <name>demo</name>
  <tag-class>com.mycompany.DemoTag</tag-class>
  <body-content>empty</body-content>
  <attribute>
    <name>parameter</name>
    <required>false</required>
    <rtexprvalue>true</rtexprvalue>
  </attribute>
</tag>

</taglib>

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

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

  <jsp-config>
    <taglib>
      <taglib-uri>/WEB-INF/MyTagLib</taglib-uri>
      <taglib-location>/WEB-INF/MyTagLib.tld</taglib-location>
    </taglib>
  </jsp-config>

</web-app>

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

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

Test.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@taglib uri="/WEB-INF/MyTagLib" prefix="mytag"%>
<html>
  <head>
    <title>My JSP 'Test.jsp' starting page</title>
  </head>
 
  <body>
    This is my JSP page. <br>
    Date : <mytag:demo parameter="date" /><br>
    File : <mytag:demo parameter="filename" />
  </body>
</html>

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

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
<?xml version="1.0" encoding="ISO-8859-1"?>
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.2</jsp-version>

<tag>
  <name>demo</name>
  <tag-class>com.mycompany.DemoTag</tag-class>
  <body-content>empty</body-content>
  <attribute>
    <name>parameter</name>
    <required>false</required>
    <rtexprvalue>true</rtexprvalue>
  </attribute>
</tag>

<tag>
  <name>demo2</name>
  <tag-class>com.mycompany.DemoTag2</tag-class>
  <body-content>jsp</body-content>
</tag>

</taglib>

web.xml 文件无需修改。

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

Test.jsp
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%@taglib uri="/WEB-INF/MyTagLib" prefix="mytag"%>
<html>
  <head>
    <title>My JSP 'Test.jsp' starting page</title>
  </head>
 
  <body>
    This is my JSP page. <br>
    Date : <mytag:demo parameter="date" /><br>
    File : <mytag:demo parameter="filename" />

    <hr>

    <mytag:demo2>
    Date: $date<br>
    File: $filename
    </mytag:demo2>
  </body>
</html>

至此,两种标签方式都完成。
本文并没有就相关技术细节做出说明,建议您看看Sun有关JSP自定义标签的官方文档。

无论是用自定义标签,还是使用JavaBean,都没有太大的区别,各人或者团队可以根据自己的习惯使用。如果需要在独立类库中封装一些供页面使用的单元,自定义标签应该更适合些。不过现在的IDE环境(MyEclipse)在编写自定义标签的时候可能有些不太舒服的情况,界面开发人员使用JavaBean方式可能更方便些,免得莫名其妙的提示干扰您的工作。

时间: 2024-08-31 22:12:18

使用自定义标签实现JSP页面和代码的分离的相关文章

java-如何完美个格式化jsp页面的代码?

问题描述 如何完美个格式化jsp页面的代码? MyEclipse 10 格式化jsp,出现错行,如何解决这个问题? 我按照网上说的去调整宽度但是没有效果 解决方案 下载安装AdobeDreamweaver

tomcat-访问含有自定义标签的jsp文件,出现错误提示:标签处理类不能解析为类型

问题描述 访问含有自定义标签的jsp文件,出现错误提示:标签处理类不能解析为类型 1.该文件使用tomcat 发布 2.标签处理类已经过编译,没有错误,并且放到了WEB-INF/classes下面 我的思考:已经提示处理类can't be resolved,说明tld文件设置没有问题,路径也都正确,那请问,有什么原因会出现这样的情况? 解决方案 确定下web.xml中是否定义了该自定义标签

为什么用struts2.0的iterator标签,JSP页面中无法显示?

问题描述 查询方法:publicvoidtoDelete(String[]teskId){StringsqlString="deletefromTTeskwhereTeskId='"+teskId+"'";System.out.println("---------------------"+sqlString+"-----------------------------");//Queryquery=session.creat

maven打war 自定义properties 到jsp页面

问题描述 在maven打war包时,pom.xml自定义的properites 可以打到*.properties文件中,但是在*.jsp中引用自定义变量无法打入,求一份可以打到jsp中的pom.xml自定义变量是在pom.xml的 profile properties 中定义的,比如以下域名:图片域名.样式域名等等.在jsp页面中有引入样式形如<link href="${profile.xxx.domain}/a/b/c.css" rel="stylesheet&quo

JSP页面中的自定义标签

js|页面 JSP页面中的自定义标签 JSP页面中的自定义标签 Stephanie Bodoff 用于调用Javaean组件中的操作和执行请求分派的标准JSP标签简化了JSP页面的开发和维护.JSP技术还提供了在自定义标签中封装其他动态功能的机制,这种自定标签是JSP语言的扩展.自定义标签通常是以标签库的形式出现的,它定义了一组相关的自定义标签,并包含实现这些标签的对象. 可以由自定义标签执行的任务包括对隐式对象的操作.处理表单.访问数据库和其他企业级服务,如电子邮件和目录.以及执行流程控制.J

JSP页面中的自定义标签2

js|页面 JSP页面中的自定义标签2 带属性的标签 在标签handler中定义属性对于每一个标签属性,都必须在标签handler中定义一个属性以及符合JavaBean结构规范的get和set方法.例如,logic:present标签的标签handler <logic:present parameter="Clear"> 包含下列声明和方法: protected String parameter = null;public String getParameter() { r

JSP自定义标签实现数据字典

1.关于JSP标签的好处就不再罗嗦 数据字典就是使用的下拉框,只要定义使用那个字典就会将这个字典可用的内容显示出来 显示字典时只要定义那个字典和属性值就可以显示出字典的显示值          2.首先在web.xml中定义自定义标签加载的引用,两个属性分别是引用的URI和加载路径 <?xml version="1.0" encoding="UTF-8"?>     <web-app version="2.5" xmlns=&q

JSP自定义标签简单入门教程_JSP编程

在sun官方文档上有下面这样一段话. 官方文档声明 public interface SimpleTag extends JspTag Interface for defining Simple Tag Handlers. Simple Tag Handlers differ from Classic Tag Handlers in that instead of supporting doStartTag() and doEndTag(), the SimpleTag interface pr

web.xml-关于JSP自定义标签的问题

问题描述 关于JSP自定义标签的问题 刚刚接触jsp,有些问题想请教一下: 1.tld文件那里为什么找不到handler class,是那里写错了吗?应该怎么改? 2.tld里面的是不是要跟web.xml里<%@taglib ....%>里prefix的值一样? 3.web.xml里的值是不是从WEB-INF开始一层一层往下写就行? 4.web.xml里的值是随便定义就行还是有固定的格式(比如从WEB-INF一层一层往下写)?还有这里的值应该是跟jsp页面里面<%@taglib uri.