• 1_Jsp标签_简单自定义


    一 简介                                                      

      主要用于移除jsp页面中的java代码

    1. 编写一个实现Tag接口的Java类,为避免需要实现不必要的方法,只需继承TagSupport类,
          把页面java代码移到这个标签处理类中,
    2. 然后编写标签库描述符文件:*.tld
    3. 在jsp页面导入标签库即可使用

    二 原理                                                      

      1. JSP的执行过程主要可以分为以下几点:

    1  客户端发出请求。
    2  Web容器将JSP转译成Servlet源代码。
    3  Web容器将产生的源代码进行编译。
    4  Web容器加载编译后的代码并执行。
    5  把执行结果响应至客户端

      2. 没有标签时:

        JSP页面中的位于<% %>外面的每行和紧临<%%>两边的每段文本被转换成以这些文本作为参数的一条条out.write语句,

        JSP脚本片断(位于<%%>内的 一段java代码)中的java代码被原封不动地搬移进了_jspService方法中的相应位置处,

        JSP表达式(位于<%=和%>之中的内容)则是被转换成以其 中的变量或表达式作为参数的out.print语句。


      3. 加入标签库:

      1. 根据tld文件找到对应的标签处理类;
      2. doStartTag() -> 显示本体文字 -> doAfterBodyTag()->doEndTag()->执行接下来的JSP网页
      3. ---------------------------------------------
        • 当JSP容器在解释JSP页面时,如果遇到自定义标签,将利用标签处理类建立一个标签处理对象。于此同时,JSP容器自动调用setPageContext()方法,将自定义标签的属性值存入标签处理对象,初始化标签处理对象
        • JSP容器运行doStartTag()方法,根据该方法返回值决定后续动作。
          1.  如果返回SKIP_BODY常量,JSP容器忽略该标签主题内容,运行doEndTag()方法
          2.    若返回EVAL_BODY_INCLUDE常量,JSP容器执行标签主体内容,并将结果包括在响应中,然后运行doAfterBody()方法
          3.    返回EVAL_BODY_AGAIN常量,JSP容器会再次执行标签体内容
        • 若doEndTag()方法返回EVAL_PAGE常量,JSP容器运行自定义标签后面的JSP内容;若返回SKIP_PAGE常量
          JSP容器忽略自定义标签后面的JSP内容

       4. 类之间的关系:

    -

    三 步骤                                                      

    1. 编写HelloWorldTag.java
      package com.tag;
      
      import java.io.IOException;
      
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.jsp.JspException;
      import javax.servlet.jsp.JspWriter;
      import javax.servlet.jsp.tagext.TagSupport;
      
      public class HelloWorldTag extends TagSupport {
      	private static final long serialVersionUID = 1L;
      	private String name;
      	public void setName(String name) 
      	{ 
      		this.name = name; 
      	} 
      
      	@Override
      	public int doStartTag() throws JspException {
      		JspWriter out = this.pageContext.getOut();
      		 HttpServletRequest hreq = (HttpServletRequest) this.pageContext.getRequest();
      		try {
      			out.print("Hello-World-"+name+"<br/>");
      		} catch (IOException e) {
      			e.printStackTrace();
      			throw new RuntimeException(e);
      		}
      		return super.doStartTag();
      	}
      
      	
      }
      
    2. 标签库描述符文件
      <?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>A tag library exercising SimpleTag handlers.</description>
          <tlib-version>1.0</tlib-version>
          <short-name>SimpleTagLibrary</short-name>
          <uri>http://self-tag-with-hello</uri>
          
          <tag>
              <name>helloWorld</name>
      
              <tag-class>com.tag.HelloWorldTag</tag-class>
              <body-content>empty</body-content>
                <attribute> 
                      <name>name</name> 
                      <required>true</required> 
                      <rtexprvalue>true</rtexprvalue> 
                </attribute> 
          </tag>
          
      </taglib>  
    3. jsp页面显示
      <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
      <%@ taglib uri="http://self-tag-with-hello" prefix="i" %>
      <html>
        <head>
          <title>helllo</title>
        </head>
        <body>
                <i:helloWorld name="小呵"/>
        </body>
      </html>
    4. 结果
  • 相关阅读:
    vector容器
    CSS3文字与字体 text-overflow 与 word-wrap
    div 居中
    C# 邮件发送
    SD详解-销售过程
    js 常用
    finereport报表--动态格间运算 二
    finereport报表--动态格间运算 一
    CSS 渐变色
    CSS3 box-shadow 属性 紧跟在 -webkit-, -ms- 或 -moz-
  • 原文地址:https://www.cnblogs.com/foreverzd/p/3831473.html
Copyright © 2020-2023  润新知