zoukankan      html  css  js  c++  java
  • java web标签

        一:国庆结束了,回来上班,结果老大说过两天才出差,所以这两天就用来补自己不太懂的知识或者以前没有熟悉的知识,jsp的标签就是,因为在项目中自己封装了一些标签,但是我自己只是会用,真正的原理性的东西我还是不是很明白,所以今天一天的时间基本上都是在网上找资料来熟悉jsp标签的知识。

        二:标签中tld中的属性rtexprvalue的用处

          rtexprvalue的全称是 Run-time Expression Value,网上说是否可以利用jsp表达式。

          rtexprvalue表示标签中的值是否可以直接指定或者可以动态(使用脚本或者el表达式)指定;

          reruired表示是否是必须的;

    下面说一说具体的用法,先给出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" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
        <description><![CDATA[自定义标签]]]]></description>
        <display-name>my Tags</display-name>
        <tlib-version>0.1</tlib-version>
        <short-name>my</short-name>
        <uri>/mytag</uri>
       <tag>
    <!--此处是有些内容我们不想让xml的解析引擎解析执行,而是当做原始内容处理,此时我们可以把该部分xml的内容放在CDATA区域的内容中,xml解析程序不会处理,而是原封不动的输出,这里我们就是想在jsp页面在给该属性赋值时把鼠标放在该该属性上时显示该提示内容--> 
            <description><![CDATA[显示个人姓名]]></description>
          <!-- 标签的名称--> <name>wh</name> <tag-class>org.wh.gsh.web.tag.PersonTag</tag-class> <body-content>JSP</body-content> <attribute>   <description><![CDATA[显示个人姓名]]></description>
              <!--属性名称-->          <name>personbh</name>
              <!--是否是必须的属性-->          <required>true</required>
              <!--见上面-->          <rtexprvalue>true</rtexprvalue>      </attribute>      <attribute>          <description><![CDATA[所属部门]]</description>          <name>departmen</name>           <required>false</required>          <rtexprvalue>false</rtexprvalue>      </attribute> </tag>

     <body-content>元素可以设置的内容有3种。

    <body-content>

    jsp页面的用法如下:元素主要的功能是指定标签体的类型,可能的取值有以下4种。

    (1)empty:没有标签体

    (2)JSP:标签体可以包含文本、EL、表达式或者JSP标签,但对于简单标签无效。

    (3)scriptless:标签体可以包含文本、EL表达式、JSP标签,但不能包含JSP的脚本元素。

    (4)tagdependent:表示标签体交由标签本身去解析处理。若指定tagdependent,在标签体中的所有代码都会原封不动的交给标签处理器,而不是将执行结果传递给标签处理器。

    上面所说的标签体是这么个意思:如果标签写成这样<my:wh/>---->表示没有标签体,如果写成这样<my:wh></my:wh>则有标签体

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <%@ taglib prefix="my" uri="/mytag" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>个人信息页面</title>
    <body>
        <my:wh  personbh="${p.bh}"  department='1'></my:wh>
    <!-- 这里的personbh的值可以用直接指定或者是动态的绑定(因为<rtexprvalue>true</rtexpvalue>的值为true)-->
    <!-- 而department的值却只能直接指定,不能动态绑定如果写成这样的话就是错误的
     <my:wh  personbh="${p.bh}"  department='"${p.depid}"></my:wh>--> ---->false 
    </body>

    三:标签返回值的效果及意义:

    在TagSupport类中,有如下4个方法最重要:doStartTag(),doEndTag(),doAfterTag(),release()

    (1)doStartTag():此方法是开始执行标签,有如下两种返回值:
        SKIP_BODY:表示忽略标签体的内容,而将执行权交给doEndTag()方法,

        EVAL_BODY_INCLUDE:表示执行标签体的内容。

    (2)doAfterTag():此方法是IterationTag接口与Tag接口的差别所在,用来重复执行标签体的内容,有如下两种返回值

        SKIP_BODY:表示忽略标签体的内容,并且将执行权交给doEndTag()方法;

        EVAL_BODY_AGAIN:表示重复执行标签体内容,会重复调用doAfterBody()方法,一直循环执行下去,直到doAfterBody()方法但会SKIP_BODY为止。

    (3)doEndTag():此方法在标签结束时执行,有如下两种返回值

        SKIP_PAGE:在JSP页面应该立刻停止执行(即是不执行下面的jsp代码),并将所有的输出立刻回传到浏览器上。

        EVAL_PAGE:表示jsp正常的运行

    四:TagSupport和BodyTagSupport的区别

      TagSupport和BodyTagSupport的区别主要是标签处理类是否需要与标签体交互,如果不需要交互的就用TagSupport,否则如果需要交互就用BodyTagSupport。

        交互的意思大概可以理解成标签处理类是否要读取标签体的内容和改变标签体返回的内容。再说明白点就是如果要更改或者处理标签体中的内容则必须实现BodyTagSupport类。(标签里面都可以有内容,但是要更改内容或作其他处理就必须实现BodyTagSupport类);

    下面说说BodyTagSupport新增了的方法

    public static final int EVAL_BODY_BUFFERED :表示该标签体的内容应该被出俩,所有的处理都应该保存到BodyContent类中;

    protected  BodyContent bodyContent  :存放处理结果

    public JspWriter getPreviousOut() :取得JspWriter的输出流对象

    比如下面的代码就是把标签体中的截取一部分进行显示,代码如下

    MyTag.java
    
    package org.wh.demo.Tag;
    
    import javax.servlet.jsp.JspException;
    import javax.servlet.jsp.tagext.BodyContent;
    import javax.servlet.jsp.tagext.BodyTag;
    import javax.servlet.jsp.tagext.BodyTagSupport;
    import javax.servlet.jsp.tagext.Tag;
    
    public class MyTag extends BodyTagSupport {
    
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
        
        public int doStartTag() throws JspException{
            return BodyTag.EVAL_BODY_BUFFERED;
        }
        
        public int doEndTag() throws JspException{
            BodyContent bc=this.getBodyContent();//获取标签体的内容
            String ct=bc.getString();//转换为字符串
            String rt=ct.substring(5,10);
            try{
                this.pageContext.getOut().write(rt);
            }catch(Exception e){
                throw new RuntimeException(e);
            }
            
            return Tag.EVAL_PAGE;
        }
        
    
    }
    mytag.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"
        version="2.0"
        xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
        <description>标签的测试</description>
        <display-name>my tags</display-name>
        <tlib-version>0.0</tlib-version>
        <short-name>my</short-name>
        <uri>/mytags</uri>
        <tag>
            <description><![CDATA[自己定义的标签]]></description>
            <name>wh</name>
            <tag-class>org.wh.demo.Tag.MyTag</tag-class>
            <body-content>scriptless</body-content><!--这里用JSP或者scriptless都行,具体的在上年已经做了说明-->
        </tag>
    </taglib>
    HelloTag.jsp:

    <%@ page language="java" contentType="text/html; charset=GBk" pageEncoding="GBK"%> <%@taglib uri="/mytags" prefix="my" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <h1>Hello Tag!!!</h1> <h2>自己定义的标签使用如下效果</h2> <my:wh>这是我写的第一个标签</my:wh> </body> </html>

    结果如下:

    我现在就是知道怎么用了,以前自己只是只看不做的人,现在自己在边看边实践,即使是最简单的东西,只是还是极少成多的。现在就补下基础薄弱的地方。自己做一遍比看几百遍都强的。自己还是得花时间来学习下源码,最忌就再次温习下java和java web 和linux,好多东西要学,这几天没事情干就总结了这两个月实习学到的东西和补知识点。任重而道远啊。努力,今天看小说看到了一句话”匹夫而为百世师,一言二为天下法“,这气概,没得说啊,收到短信要交一篇3000字的论文,坑爹啊,我还得去找论文凑一篇交上去。努力吧,boys!!!

  • 相关阅读:
    LeetCode Path Sum II
    LeetCode Longest Palindromic Substring
    LeetCode Populating Next Right Pointers in Each Node II
    LeetCode Best Time to Buy and Sell Stock III
    LeetCode Binary Tree Maximum Path Sum
    LeetCode Find Peak Element
    LeetCode Maximum Product Subarray
    LeetCode Intersection of Two Linked Lists
    一天一个设计模式(1)——工厂模式
    PHP迭代器 Iterator
  • 原文地址:https://www.cnblogs.com/wuhao1991/p/4011802.html
Copyright © 2011-2022 走看看