JSP自定义标签【上】

简介: JSP自定义标签【上】

1.JSP标签是什么??

JSP是Java Server Pages的缩写,是一种在服务器端使用Java语言编写的动态网页技术。通过JSP,可以在HTML文件中嵌入Java代码和标签,将动态生成的数据合并到HTML页面中,实现动态的内容展示和交互功能


2.JSP标签语言的特点

2.1 标签的格式:

<开始标签  属性="属性值"> 标签体 </结束标签>

 例:<c:if test="true">true</c:if>          

2.2 标签的分类:

   空标签:      br hr    

   控制标签:  if  foreach

   数据标签:  out    保存数据    

   UI标签 :    input,table  (没有标签体也可以输出内容的标签就是UI标签)

点击c:if 跳转到 c.tld 界面  .tld文件是标签库的描述文件 而且必须放在WEB-INF 里


3.自定义标签的开发

先来看看.tld文件是什么样的,大概就是一些配置属性

<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
  <description>JSTL 1.1 core library</description>
  <display-name>JSTL core</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>s</short-name>
  <uri>http://shenyan</uri>
  <tag>
    <!-- 标签库标签的名字 -->
    <name>aa</name>
   <!--  对应的助手类 -->
    <tag-class>com.yinzi.jsp.DomeTag1</tag-class>
   <!--  代表JSP标签 -->
    <body-content>JSP</body-content>
    <!-- 属性 -->
      <attribute>
       <!--  属性名称 -->
       <name>var</name>
        <!-- 是否为必填项 -->
         <required>false</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>true</rtexprvalue> 
   </attribute>
  </tag>
   <tag>
    <!-- 标签库标签的名字 -->
    <name>if</name>
   <!--  对应的助手类 -->
    <tag-class>com.yinzi.jsp.IfTag</tag-class>
   <!--  代表JSP标签 -->
    <body-content>JSP</body-content>
    <!-- 属性 -->
      <attribute>
       <!--  属性名称 -->
       <name>test</name>
        <!-- 是否为必填项 -->
         <required>true</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>true</rtexprvalue> 
   </attribute>
  </tag>
  <tag>
    <!-- 标签库标签的名字 -->
    <name>set</name>
   <!--  对应的助手类 -->
    <tag-class>com.yinzi.jsp.SetTag</tag-class>
   <!--  代表JSP标签 -->
    <body-content>JSP</body-content>
    <!-- 属性 -->
      <attribute>
       <!--  属性名称 -->
       <name>var</name>
        <!-- 是否为必填项 -->
         <required>true</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>false</rtexprvalue> 
   </attribute>
   <attribute>
     <!--  属性名称 -->
       <name>value</name>
        <!-- 是否为必填项 -->
         <required>true</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>true</rtexprvalue> 
   </attribute>
  </tag>
  <tag>
    <!-- 标签库标签的名字 -->
    <name>out</name>
   <!--  对应的助手类 -->
    <tag-class>com.yinzi.jsp.OutTag</tag-class>
   <!--  代表JSP标签 -->
    <body-content>JSP</body-content>
    <!-- 属性 -->
      <attribute>
       <!--  属性名称 -->
       <name>value</name>
        <!-- 是否为必填项 -->
         <required>true</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>true</rtexprvalue> 
   </attribute>
  </tag>
</taglib>

截取了一部分完整的,标注了其意思

3.1 步骤

3.1.1.编写助手类

 可以看到第二个是助手类

助手类实现了JSP标签库中定义的标签,并提供了简单的API来处理标签的属性和输出

助手类将负责处理标签的输出。标签的具体实现可以在助手类中完成,也可以包含在独立的标签处理器类中。

package com.sy.jsp;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
/**
 * 助手类(必须继承BodyTagSupport)
 * @author 86131
 *
 */
public class DomeTag1 extends BodyTagSupport{
  @Override
  public int doStartTag() throws JspException {
    System.out.println("调用了doStartTag方法");
    return EVAL_BODY_INCLUDE;
  }
  @Override
  public int doAfterBody() throws JspException {
    System.out.println("调用了doAfterBody方法");
    return super.doAfterBody();
  }
  @Override
  public int doEndTag() throws JspException {
    System.out.println("调用了doEndTag方法");
    return super.doEndTag();
  }
}

  3.1.2.编写.tld文件

<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
    version="2.0">
  <description>JSTL 1.1 core library</description>
  <display-name>JSTL core</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>s</short-name>
  <uri>http://shenyan</uri>
  <tag>
    <!-- 标签库标签的名字 -->
    <name>aa</name>
   <!--  对应的助手类 -->
    <tag-class>com.yinzi.jsp.DomeTag1</tag-class>
   <!--  代表JSP标签 -->
    <body-content>JSP</body-content>
    <!-- 属性 -->
      <attribute>
       <!--  属性名称 -->
       <name>var</name>
        <!-- 是否为必填项 -->
         <required>false</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>true</rtexprvalue> 
   </attribute>
  </tag>
   <tag>
    <!-- 标签库标签的名字 -->
    <name>if</name>
   <!--  对应的助手类 -->
    <tag-class>com.yinzi.jsp.IfTag</tag-class>
   <!--  代表JSP标签 -->
    <body-content>JSP</body-content>
    <!-- 属性 -->
      <attribute>
       <!--  属性名称 -->
       <name>test</name>
        <!-- 是否为必填项 -->
         <required>true</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>true</rtexprvalue> 
   </attribute>
  </tag>
  <tag>
    <!-- 标签库标签的名字 -->
    <name>set</name>
   <!--  对应的助手类 -->
    <tag-class>com.yinzi.jsp.SetTag</tag-class>
   <!--  代表JSP标签 -->
    <body-content>JSP</body-content>
    <!-- 属性 -->
      <attribute>
       <!--  属性名称 -->
       <name>var</name>
        <!-- 是否为必填项 -->
         <required>true</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>false</rtexprvalue> 
   </attribute>
   <attribute>
     <!--  属性名称 -->
       <name>value</name>
        <!-- 是否为必填项 -->
         <required>true</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>true</rtexprvalue> 
   </attribute>
  </tag>
  <tag>
    <!-- 标签库标签的名字 -->
    <name>out</name>
   <!--  对应的助手类 -->
    <tag-class>com.yinzi.jsp.OutTag</tag-class>
   <!--  代表JSP标签 -->
    <body-content>JSP</body-content>
    <!-- 属性 -->
      <attribute>
       <!--  属性名称 -->
       <name>value</name>
        <!-- 是否为必填项 -->
         <required>true</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>true</rtexprvalue> 
   </attribute>
  </tag>
</taglib>

最后导入:


4.标签的生命周期

1.有标签体的情况下,默认调用doStartTag,doAfterBody,doEndTag方法

   2.如果将doStartTag返回值改为skip_body,则doAfterBody不会执行(路线1)

   3.如果将doStartTag返回值改为eval_body_include ,则doAfterBody会执行(路线2)

   4.如果将doAfterBody返回值改为EVAL_BODY_AGAIN,则会进入循环(路线3)

5.if标签

案例

如果满足条件就输出标签体 ,返回值为eval_body_include 否则返回值为skip_body
需要获取一个是否满足条件的结果值,则会有一个属性为boolean类型

package com.sy;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class IfTag extends BodyTagSupport{
  private boolean text;
  @Override
  public int doStartTag() {
    if(this.text) {
      return EVAL_BODY_INCLUDE;
    }
    return SKIP_BODY;
  }
  public boolean isText() {
    return text;
  }
  public void setText(boolean text) {
    this.text = text;
  }
}

6.set和out标签

 6.1 Set

package com.sy;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class Set extends BodyTagSupport{
  private String var;
  private Object value;
  public String getVar() {
    return var;
  }
  public void setVar(String var) {
    this.var = var;
  }
  public Object getValue() {
    return value;
  }
  public void setValue(Object value) {
    this.value = value;
  }
  @Override
  public int doStartTag() throws JspException {
    pageContext.setAttribute(var, value);
    return super.doStartTag();
}
}
<tag>
    <!-- 标签库标签的名字 -->
    <name>set</name>
   <!--  对应的助手类 -->
    <tag-class>com.yinzi.jsp.SetTag</tag-class>
   <!--  代表JSP标签 -->
    <body-content>JSP</body-content>
    <!-- 属性 -->
      <attribute>
       <!--  属性名称 -->
       <name>var</name>
        <!-- 是否为必填项 -->
         <required>true</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>false</rtexprvalue> 
   </attribute>
   <attribute>
     <!--  属性名称 -->
       <name>value</name>
        <!-- 是否为必填项 -->
         <required>true</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>true</rtexprvalue> 
   </attribute>
  </tag>

6.2out

package com.sy;
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspWriter;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class OutTag extends BodyTagSupport{
private Object value;
  public Object getValue() {
    return value;
  }
  public void setValue(Object value) {
    this.value = value;
  }
@Override
public int doStartTag() throws JspException {
  //输出流
  JspWriter out = pageContext.getOut();
  try {
    out.print(value);
  } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
  return super.doStartTag();
}
}
<tag>
    <!-- 标签库标签的名字 -->
    <name>out</name>
   <!--  对应的助手类 -->
    <tag-class>com.yinzi.jsp.OutTag</tag-class>
   <!--  代表JSP标签 -->
    <body-content>JSP</body-content>
    <!-- 属性 -->
      <attribute>
       <!--  属性名称 -->
       <name>value</name>
        <!-- 是否为必填项 -->
         <required>true</required> 
       <!--  是否支持EL表达式 -->
       <rtexprvalue>true</rtexprvalue> 
   </attribute>
  </tag>

输出结果为:

目录
相关文章
|
Java
JSP自定义标签【下】
JSP自定义标签【下】
65 0
|
Java
jsp自定义标签
jsp自定义标签
75 1
|
5月前
|
Java 容器
JSP 教程 之 JSP 自定义标签 3
JSP自定义标签允许开发人员创建可重用的组件,简化页面逻辑。在JSP 2.0及以上版本,可通过继承`SimpleTagSupport`并覆写`doTag()`方法来创建自定义标签,如`HelloTag`,它有一个`message`属性。属性值通过setter方法`setMessage()`设置。在TLD文件中定义该属性后,可在JSP页面使用`&lt;ex:Hello message=&quot;This is custom tag&quot;/&gt;`来调用,输出定制的文本。
26 0
|
5月前
|
Java 容器
JSP 教程 之 JSP 自定义标签 4
**JSP自定义标签允许创建用户定义的语言元素。它们转换为Servlet中的tag handler,在执行时由Web容器调用。使用SimpleTagSupport继承并重写doTag()方法可创建简单标签。标签可设置属性,如message,通过setter方法访问。TLD文件定义属性元数据,JSP页面则通过prefix和uri引用。例如,&lt;ex:Hello message=&quot;...&quot;/&gt; 显示定制消息。属性可配置为必需、类型、描述及是否为JspFragment。**
27 0
|
5月前
|
搜索推荐 Java 容器
JSP 教程 之 JSP 自定义标签 2
**JSP自定义标签允许用户创建个性化标签,简化页面逻辑。在JSP 2.0中,通过继承`SimpleTagSupport`并重写`doTag()`可创建简单标签处理器。示例展示了一个名为`Hello`的自定义标签,它接收并显示标签体内容。TLD文件配置了标签元数据,JSP页面引用该标签并展示“这是消息主体”。**
24 0
|
5月前
|
Java 容器
JSP 教程 之 JSP 自定义标签 1
**JSP自定义标签简介**:扩展JSP功能,创建用户定义标签,通过Servlet容器调用Tag Handler。在JSP 2.0中,使用SimpleTagHandlers简化定制。以&quot;Hello&quot;标签为例,创建`HelloTag`类继承`SimpleTagSupport`,重写`doTag()`打印消息。编译后,在`custom.tld`定义标签库,JSP页面引用后即可使用。例如 `&lt;ex:Hello/&gt;` 显示 &quot;Hello Custom Tag!&quot;。
28 0
|
前端开发 Java
通用分页进阶之jsp之自定义标签
通用分页进阶之jsp之自定义标签
35 1
|
6月前
|
Java 数据安全/隐私保护
Jsp自定义标签(foreach,dept,select)
Jsp自定义标签(foreach,dept,select)
46 0
|
6月前
|
XML Java 数据格式
JSP自定义标签
JSP自定义标签
69 0
|
存储 Java 开发者
JSP自定义标签(下)
JSP自定义标签(下)
56 0