JSP: JSTL标签详解



一、JSTL标签库
          1.1、 分类:
                      核心标签库:  c:if;  c:forEach
                      国际化标签:  国际化相关类和原理
                      数据库标签      (略)
                      XML标签         (略)
                      JSTL函数(EL函数)
                  
          1.2、  需要的jar包:  standard.jar   jstl.jar


          1.3、  参考核心标签库
          
            
二、编写自定义标签的步骤(自定义EL函数,步骤相同)


          2.1、  JSP中标签继承体系
         
                          JSP: JSTL标签详解_第1张图片


          2.2、 JSP中常用标签接口
          
                        ① Tag接口:其中的方法都是由容器调用的。           
                                常量:
                                        SKIP_BODY:忽略标签的主体内容。只为doStartTag方法服务
                                        EVAL_BODY_INCLUDE:不忽略标签的主体内容。只为doStartTag方法服务
                                        SKIP_PAGE:忽略结束标签之后的内容。只为doEndTag方法服务
                                        EVAL_PAGE:不忽略结束标签之后的内容。只为doEndTag方法服务
                                方法:
                                        int doStartTag():容器调用。遇到自定义标签的开始标签时被调用。
                                        int doEndTag():容器调用。遇到自定义标签的结束时被调用。
                                        void setPageContext(PageContext pc):由容器调用。处理标签之前就会调用。
                                        void setParent(Tag t):由容器调用。处理标签之前就会调用。目标传递进父标签,没有传递null。
                                        void release() :由容器调用,释放标签类占用的资源。
              
              
                        ② IterationTag接口:继承Tag接口。增加重复执行主体内容的方法
                                            int doAfterBody():执行完主体后会被容器调用该方法。
                                              该方法的返回值只能是:
                                                      Tag.SKIP_BODY,忽略主体,进入结束标签处理。
                                                      IterationTag.EVAL_BODY_AGAIN,再执行一次主体内容。
                                              

                                              执行流程  :  

 JSP: JSTL标签详解_第2张图片

                              
              
                        ③   BodyTag接口:继承IterationTag接口。增加了获取主体内容的方法。
                                          常量:
                                                int EVAL_BODY_BUFFERED:给doStartTag()方法用的。只有返回该值,以下2个方法才会被容器调用。
                                          方法:
                                                void doInitBody():初始化主体。容器调用
                                                void setBodyContent(BodyContent b) :设置主体内容。容器调用。BodyContent就代表着主体内容。
                                                
                                           执行流程:

                                              JSP: JSTL标签详解_第3张图片   


                                 
            
                        ④  SimpleTag接口:
                                        void doTag():遇到标签就执行。容器调用。
                                        void setJspBody(JspFragment jspBody):容器调用。传入标签的主体内容。
                                        void setJspContext(JspContext pc):容器调用。传入PageContext对象。
                                        void setParent(JspTag parent):容器调用。传入父标签。
              
         
            
         2.3、  应用: 自定义标签步骤  获取访问的客户机的IP地址
                      --------------------------------------------------------------------------------------------------------------------
                     ①、编写一个类,直接或间接实现javax.servlet.jsp.tagext.Tag接口
                                  //TagSupport实现了Tag接口
                                  public class ShowRemoteIpTag extends TagSupport {
                                          public int doStartTag() throws JspException {
                                                  String remoteIp = pageContext.getRequest().getRemoteAddr();
                                                  try {
                                                          pageContext.getOut().write(remoteIp);
                                                  } catch (IOException e) {
                                                          e.printStackTrace();
                                                  }
                                                  return super.doStartTag();
                                          }
                                  }
                                  
                    ②、在WEB-INF目录下建立一个扩展名为tld(Tag Libary Definition)的xml文件。
                               
                                                                  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">
                                  1.0
                                  itcast
                                  http://www.itcast.cn/jsp/jstl
                                 
                                          Show Remote Address
                                          showRemoteIp
                                          cn.itcast.tag.ShowRemoteIpTag
                                          empty
                                 

                               

                                
                     ③、(可选的)在web.xml中对tld文件和名称空间进行映射对应。
                               
                                     
                                              http://www.itcast.cn/jsp/jstl
                                              /WEB-INF/itcast.tld
                                     

                               

                     ④、在JSP中使用
                                <%@ taglib uri="http://www.itcast.cn/jsp/jstl" prefix="itcast"%>
                               
                                        您的IP地址为:
                               
                      --------------------------------------------------------------------------------------------------------------------
                                
                                
                                
三、标签执行步骤和原理
            传统标签
                    JSP: JSTL标签详解_第4张图片
            简单标签
                   JSP: JSTL标签详解_第5张图片 
                
                


四、传统标签实现的附属功能
              4.1、 控制jsp页面某一部分内容是否执行。(被标签包围的部分不显示,包括html标签)
                            --------------------------------------------------------------------------------------------------------------
                            <%@ taglib uri="http://www.itcast.cn/jsp/jstl" prefix="itcast"%>
                             
                                      我喜欢你
                                      芙蓉姐姐    
                           
                            
                            public class Demo2Tag extends TagSupport {
                                    @Override
                                    public int doStartTag() throws JspException {
                                            return Tag.SKIP_BODY;
                                    }
                            }
                            
                           
                                demo2
                                cn.itcast.tag.Demo2Tag
                                JSP
                           

                            --------------------------------------------------------------------------------------------------------------  
              
              4.2、 控制结束标签后的JSP内容是否执行
                            --------------------------------------------------------------------------------------------------------------
                            <%@ taglib uri="http://www.itcast.cn/jsp/jstl" prefix="itcast"%>
                           
                                      他喜欢你
                                      芙蓉姐姐a     
                           
                            
                            public class Demo3Tag extends TagSupport {
                                    @Override
                                    public int doEndTag() throws JspException {
                                            return Tag.SKIP_PAGE;
                                    }                              
                            }
                            
                             
                                    demo3
                                    cn.itcast.tag.Demo3Tag
                                    empty
                           
                         
                            --------------------------------------------------------------------------------------------------------------
                           
              4.3、 控制jsp页面内容重复执行。
                            --------------------------------------------------------------------------------------------------------------
                            <%@ taglib uri="http://www.itcast.cn/jsp/jstl" prefix="itcast"%>
                           
                                 
                                 

                           
                            
                            public class Demo4Tag extends TagSupport {
                                    private int count;
                                    private int temp;
                                    
                                    // 在调用doStartTag之前,容器会把属性的值自动传进来
                                    public void setCount(int count) {
                                            this.count = count;
                                            this.temp = count;
                                    }


                                    @Override
                                    public int doStartTag() throws JspException {
                                            return Tag.EVAL_BODY_INCLUDE;
                                    }
                                                                    
                                    @Override
                                    public int doAfterBody() throws JspException {
                                            count--;
                                            // 如果count>0,再执行一次主体内容
                                            if(count>0){
                                                    return IterationTag.EVAL_BODY_AGAIN;
                                            }else{
                                                    // 否则,进入结束标签
                                                    count = temp; // 重新定为3,防止下次访问时内存中为0
                                                    return Tag.SKIP_BODY;
                                            }
                                    }
                            }
                            
                           
                                demo4
                                cn.itcast.tag.Demo4Tag
                                JSP
                               
                                    count
                                    true  
                                    true 
                                            
                               

                           

                            --------------------------------------------------------------------------------------------------------------
                                                        
              4.4、 修改页面内容输出
                            --------------------------------------------------------------------------------------------------------------
                            <%@ taglib uri="http://www.itcast.cn/jsp/jstl" prefix="itcast"%>
                           
                                 
                                  asdafsdf
                           
                                                       
                            public class Demo5Tag extends BodyTagSupport {
                                    // 要保证主体内容被容器传递进来
                                    @Override
                                    public int doStartTag() throws JspException {
                                            return BodyTag.EVAL_BODY_BUFFERED;
                                    }
                                    
                                    // 把修改后的主体内容输出到页面上
                                    @Override
                                    public int doEndTag() throws JspException {
                                            // 得到主体内容
                                            String content = bodyContent.getString();
                                            try {
                                                    pageContext.getOut().write(content.toUpperCase());
                                            } catch (IOException e) {
                                                    e.printStackTrace();
                                            }
                                            return super.doEndTag();
                                    }
                            }
                            
                           
                                  demo5
                                  cn.itcast.tag.Demo5Tag
                                  JSP
                           

                            --------------------------------------------------------------------------------------------------------------
              
              
              
              
五、简单标签实现的附属功能
              5.0  输出客户机的IP地址
                            --------------------------------------------------------------------------------------------------------------
                            <%@ taglib uri="http://www.itcast.cn/jsp/tag/simple" prefix="sitcast" %>
                           
                                      您的IP地址为:                            
                           
                            
                            public class ShowRemoteIpSimpleTag extends SimpleTagSupport {
                                    @Override
                                    public void doTag() throws JspException, IOException {
                                      // pageContest继承于JspContext,在父类JspContest中通过getJspContext()方法可以获得,需要强转    
                                      PageContext pc = (PageContext) getJspContext();
                                      // 再由pageContext获取八大对象
                                      String remoteIp = pc.getRequest().getRemoteAddr();
                                      pc.getOut().write(remoteIp);
                                    }
                            }
                            
                           
                                    Show Remote Address
                                    showRemoteIp
                                    cn.itcast.stag.ShowRemoteIpSimpleTag
                                    empty
                           

                            --------------------------------------------------------------------------------------------------------------
  
              5.1  控制jsp页面某一部分内容是否执行。(被标签包围的部分不显示,包括html标签)
                            --------------------------------------------------------------------------------------------------------------
                            <%@ taglib uri="http://www.itcast.cn/jsp/tag/simple" prefix="sitcast"%>
                           
                                      我喜欢你
                                      芙蓉姐姐    
                           
                            
                            public class Demo2SimpleTag extends SimpleTagSupport {
                                      // 该方法什么都不做,那么主体内容就不显示
                                      @Override
                                      public void doTag() throws JspException, IOException {}
                            }
                            
                            // 若向显示主体内容,则使用该方法
                            @Override
                              public void doTag() throws JspException, IOException {}                   
                                    // 该方法暴力访问设置浏览器显示隐藏的内容,但是源码中仍不显示
                                    // @Override
                                    // public void doTag() throws JspException, IOException {
                                            // // 获取主体内容
                                            // JspFragment jf = getJspBody();
                                            // // 把主体内容输出到指定的流中,输入即可
                                            // PageContext pc = (PageContext) getJspContext();
                                            // JspWriter out = pc.getOut();
                                            // jf.invoke(out);
                                            
                                            //该方法与上面被注释的代码作用完全相同
                                            getJspBody().invoke(null);  
                                    }                              
                            }
                            
                           
                                    demo2
                                    cn.itcast.stag.Demo2SimpleTag
                                    scriptless
                           

                            --------------------------------------------------------------------------------------------------------------
              
               5.2  控制结束标签后的JSP内容是否执行
                            --------------------------------------------------------------------------------------------------------------
                            <%@ taglib uri="http://www.itcast.cn/jsp/tag/simple" prefix="sitcast"%>
                           
                                      他喜欢你
                                       芙蓉姐姐a     
                           
                            
                            public class Demo3SimpleTag extends SimpleTagSupport {
                                    @Override
                                    public void doTag() throws JspException, IOException {
                                            // 扔此异常,则结束标签后的JSP内容不执行
                                            throw new SkipPageException();   
                                    }
                            }


                             
                                  demo3
                                  cn.itcast.stag.Demo3SimpleTag
                                  empty
                             

                            --------------------------------------------------------------------------------------------------------------
                            
                5.3、 控制jsp页面内容重复执行。
                            --------------------------------------------------------------------------------------------------------------
                            <%@ taglib uri="http://www.itcast.cn/jsp/tag/simple" prefix="sitcast"%>
                           
                                     
                                     

                           
                            
                            public class Demo4SimpleTag extends SimpleTagSupport {
                                    private int count; // 自动类型转换仅限基本类型
                                    public void setCount(int count) {
                                      this.count = count;
                                    }
                                    @Override
                                    public void doTag() throws JspException, IOException {
                                            for(int i=0;i                                                     // 输出主体内容
                                                    getJspBody().invoke(null);
                                            }
                                    }                            
                            }
                            
                           
                                  demo4
                                  cn.itcast.stag.Demo4SimpleTag
                                  scriptless
                                 
                                          count
                                          true
                                          true
                                 

                           

                            --------------------------------------------------------------------------------------------------------------
                            
                5.4、 修改页面内容输出
                            --------------------------------------------------------------------------------------------------------------
                            <%@ taglib uri="http://www.itcast.cn/jsp/tag/simple" prefix="sitcast"%>
                           
                                   
                                    asdafsdf
                           
                            
                            public class Demo5SimpleTag extends SimpleTagSupport {
                                    // 必须拿到要修改的主体内容
                                    @Override
                                    public void doTag() throws JspException, IOException {
                                            // 得到缓冲字符串输出流,用来缓存主体内容
                                            StringWriter sw = new StringWriter();
                                            // 获取主体内容
                                            JspFragment jf = getJspBody();
                                            jf.invoke(sw);
                                            String content = sw.toString();
                                            // 输出
                                            PageContext pc = (PageContext) getJspContext();
                                            pc.getOut().write(content.toUpperCase());
                                    }                              
                            }
                            
                           
                                    demo5
                                    cn.itcast.stag.Demo5SimpleTag
                                    scriptless 
                           

                            --------------------------------------------------------------------------------------------------------------








六、 标签的配置元素详解
              tld文件:
                    taglib:根元素
                          tlib-version:版本号
                          short-name:引用标签时的短名称。一般与tld文件的文件名一致,好找。
                          uri:标签绑定的名称空间。只是一个名字,没有实际的意义。
                          tag:定义标签元素
                                  name:标签的名称。
                                  tag-class:标签的实现类的全名称。
                                  body-content:指示标签的主体内容的类型。
                                          可选值:
                                                empty:没有主体内容。适用于传统和简单标签。
                                                JSP:说明JSP文件中能出现啥,标签主体内容中就能出现啥。适用于传统标签。
                                                scriptless:说明标签的主体内容不能是java脚本。适用于简单标签。
                                                tagdependent:说明标签的主体内容是原封不动的传递给标签处理类的。
                                                                            而不是传递的运算结果
                                  attribute:定义标签的属性
                                              name:属性名。对应标签处理类中的setter方法
                                              required:是否是必须的属性
                                              rtexprvalue:是否支持表达式(EL或java表达式)。默认是false。
        
        
                    
七、标签的实用案例:
                防盗链的开发
                模拟c:if
                模拟c:when c:otherwise c:choose
                模拟c:forEach   熟悉 java.lang.reflect.Array类的使用   
                过滤HTML标记的标签
                
                
                
八、JSTL中的剩余核心标签
                -------------------------------------------------------------------------------------------------------------------------
                <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
               
  
                       
                        <%
                        pageContext.setAttribute("data","hello
");
                        %>
                       


                       


                       


                       
                       

                        
                        
                        
                        
                       
                         
                        ${s}


                       

                        
                       
                       
                       
                        ${p1.name}
                        <%--
                        p1.setName("朱巧玲");   被替代
                         --%>
                       
                        ${p1.name}


                       

                        
                       
                        <%
                        pageContext.setAttribute("map",new HashMap());
                        %>
                       
                       
                       
                          ${me}

                       

                       

                        
                        
                        
                        
                       
                        
                        
                        
                       
                       
                          <%=1/0 %>
                       

                        ${e.message}
                       

                        
                        
                         
                       
                       
                         
                         
                         
                            优秀
                         

                         
                            良好
                         

                         
                            及格
                         

                         
                            差
                         

                         

                         

                         
                         
                         
                         
                         
                          
                          
                         
                         
                         


                         <%--
                         pageContext.setAttribute("uu","/example/bbs.jsp");
                         --%>
                         
                         BBS论坛


                         
                         
                         
                         
                         
                         
                         

                         点击
                         

                        
                        
                        
                         
                         
                          ${s}

                         

                  
                   
                -------------------------------------------------------------------------------------------------------------------------
                


九、国际化的JSTL标签库(略)











你可能感兴趣的:(JAVAWeb)