• 12 自定义标签/JSTL标签库/web国际化/java web之设计模式和案例


    EL应用 
         自定义一个标签,实现两个字符串的相加

    1回顾
         1.1servlet生命周期
              init(ServletConfig)
              service(ServletRequest,ServletResponse)
              destory()
     
    1.2回话技术
         cookie:浏览器端 (服务器需要浏览器保存少量的数据)
              服务器创建对象:new Cookie(name,value)
                   cookie.setMaxage(秒);  有效时间
                   cookie.setMaxage(0)  删除cookie
                   cookie.setPath(“/”) 路径
                   cookie.setDomain() 设置域名,默认:localhost
              发送到浏览器:response.addCookie(cookie)
              服务器接收:request.getCookies()  Cookie[]     如果没有返回null
     
          session:服务器端
              获得或创建session:request.getSession();  没有创建,有返回
              request.getSession(boolean) ,true 没有创建,有返回; false:没有不操作,有返回
              作用域(属性attribute)操作:setAttribute getAttribute removeAttribute  (xxxAttribute)
     
    1.3 JSP
         脚本元素:
              声明:<%!  ….  %>
              代码片段:<%  java代码 %>
              表达式:<%= 表达式输出到浏览器端 %>
         注释:<%-- 内容 --%>
         指令:<%@指令名称 。。。。%>
              page:给当前jsp页面配置
              include:静态包含,ABjsp,AB合并生成一个servlet,编译,运行
              taglib:标签库引用
     
         jsp内置对象:9个
              page
              config
              application(ServletContext)
              request
              session
              response
              out
              exception
              pageContext--  jsp上下文对象(jsp管理者)
        启用其他8个内置对象:getXxx()   例如:getOut()
        方便操作不同的作用域:xxxAttribute(name,value,scope)
        依次获得不同域:findAttribute()
     
    jsp动作标签
         <jsp:forward> 转发
         <jsp:include>  动态包含:ABjsp,单独生成ABservlet,单独编译AB 字节码,运行时合并
         <jsp:param>    给以上设置参数,URL编码  /helloServlet?usename=%20%23

    2 el表达式
         格式:${ …  }
              获得用户自定义数据 -- 注意:作用域中的数据
                   <% pageContext.setAttribute(“user”,”sdfsd”,PageContext.REQUEST_SCOPE)%>
                   ${user}
     
              使用不同对象的api --通过对象的属性(property)操作
                   ${pageContext.request.contextPath}  
     
              操作对象的方法(java ee 6.0提供)
                   作用域有list集合
                   ${list.size()}
     
    el内置对象:11个
         域:pageScope、requestScope、sessionScope、applicationScope
         管理者:pageContext  
              el : ${pageContext.request.contextPath}   获得发布到tomcat下的web项目的项目名称  
              或嵌入java代码获得((HttpServletRequest)pageContext.getRequest()).getContextPath()
         请求头:header 、headerValues
         请求参数:param、paramValues
         cookie : cookie
         初始化参数:initParam

    3 JSTL
         JavaServer Pages Standard Tag Library , 由JCP(Java Community Process)指定标准(规范、接口)
              提供给 Java Web 开发人员一个标准通用的标签函数库
              和 EL 来取代传统直接在页面上嵌入 Java 程序(Scripting)的做法,以提高程序可读性、维护性和方便性
              jstl 和 el表达式取代 jsp脚本
     
         apache 提供标准的实现
              手动导入jar包(eclipse需要)
                   
              myeclipse自动导入
                   

    3.2标签库分类
           
    3.3核心标签库
         3.3.1域操作
              out标签:将value的内容输出到浏览器,支持el表达式
                   escapeXml属性:设置是否进行转义,默认值true
                   default属性, 默认为true, 指定如果value属性的值为null时所输出的默认值
              set标签:给指定的作用域设置属性值,等价于: pageContext.setAttribute(var,value,scope)
                            或用来将变量储存至JavaBean和Map的属性中
                   * var: 指定要设置的Web域属性的名称
                   * value:用于指定属性值,value为null则移除
                   * scope:作用域,(取值:page/request/session/application)
              remove标签:
                   * var : 指定要设置的Web域属性的名称
                   * scope:作用域
         3.3.2逻辑操作
              if标签:与if语句等效
                   * test : 逻辑条件,支持el表达式
              choose标签:相当于switch,必须使用break
                   when子标签:相当于case
                   otherwise子标签:相当于default
                        
         3.3.3其他
              url标签:在jsp页面处理路径
                   * value : 需要处理的路径,如果只有value,处理的结果将输出到浏览器端
                   * var : 如果使用了var,处理的结果将存放在作用域中
                   * scope : 作用域
                   * param 子标签:给url设置请求参数
                   * 进行URL编码
              redirect 标签:用于进行重定向,如果/开头,自动添加web项目的名称
         3.3.4foreach
              forEach标签:用于对集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容。
                   * items:将要迭代的集合对象,或数组,支持el表达式
                   * var : 遍历的每一个数据,在标签体中可以通过el表达式获得,指定将当前迭代到的元素保存到page这个Web域中的属性名称
                   * begin :开始
                   * end : 介绍
                   * step :步长,默认值1
         
         

    4自定义JSTL
    4.1自定义标签编写流程
         1.编写一个是实现tag接口的类
         2.tld配置文件
         3.jsp引入并使用
     
    4.2实现类
         
    1.传统标签:实现接口:Tag,或继承类:TagSupport
    2.简单标签:jsp2.0提供,实现接口:SimpleTag,或继承类:SimpleTagSupport 

    自定义标签的主要接口类
         TagSupport            使用最为频繁的类,可设置属性。
         BodyTagSupport     可以处理body体部分的内容,使用不是很多。
         SimpleTagSupport   简单标签实现类,是JSP2.0以后添加的新类,可以快速开发自定义标签。
     
    JspTag接口:
         所有的标签处理类,都要实现JspTag接口。这个接口只是一个标识接口,它里面没有定义任何方法。
     
    Tag接口:定义了所有传统标签处理类要实现的基本方法。
         setPageContext(PageContext ctx)由Servlet容器调用。向当前的标签处理类传递当前PageContext对像。
         setParent(Tag t) – 由Servlet容器调用此方法,向当前Tag对象传递父标签的Tag对象。
         doStartTag() – 当遇到标签体开始标记时执行的方法,需要用户实现。
         doEndTag() – 当遇到标签体结束标记时执行的方法。需要用户实现。
     
         其中doStartTag和doEndTag方法都要求用户返回一个int类型的值,此值决定标签的后续部分如何处理。
              doStartTag的两个返回值是:
                   Tag.SKIP_BODY:表示标签的主体部分将被忽略。
                        If the TagLibraryDescriptor file indicates that the action must always have an empty action, by an <body-content> entry of "empty", then the doStartTag() method must return SKIP_BODY.
                   Tag.EVAL_BODY_INCLUDE:表示标签的主体部分将被正常执行。
                        Otherwise, the doStartTag() method may return SKIP_BODY or EVAL_BODY_INCLUDE
              doEndTag的两个返回值是:
                   Tag.SKIP_PAGE:表示停止标签后面的JSP代码的执行。
                   Tag.EVAL_PAGE:表示按正常顺序执行标签的后续JSP代码。
     
    IterationTag接口
         EVAL_BODY_AGAIN 
              Request the reevaluation of some body
          int doAfterBody()  //特有方法
              Process body (re)evaluation. 
         If doAfterBody returns EVAL_BODY_AGAIN, a new evaluation of the body will happen (followed by another invocation of doAfterBody). If doAfterBody returns SKIP_BODY, no more body evaluations will occur, and the doEndTag method will be invoked. 
    If this tag handler implements BodyTag and doAfterBody returns SKIP_BODY, the value of out will be restored using the popBody method in pageContext prior to invoking doEndTag. 
     
    BodyTag接口
         static int EVAL_BODY_BUFFERED 
              Request the creation of new buffer, a BodyContent on which to evaluate the body of this tag. 
    void setBodyContent(BodyContent b) 
              Set the bodyContent property. 

    TagSupport类添加了默认的实现,在实际的开发,基本上都是使用此类来开发自定义的标签。
         在使用此类进行开发时,只需要实现部分方法即可。
         此类支持自定义的属性。
     
    BodyTagSupport

    使用标签控制标签体是否输出
         Tag下doStartTag()方法可以
              返回Tag.SKIP_BODY; 
                    Tag.EVAL_BODY_INCLUDE;
       
    控制整个jsp页面是否执行
           Tag下doEndTag()方法可以
              返回Tag.SKIP_PAGE;
              返回Tag.EVAL_PAGE;
     
    控制jsp页面内容重复执行
    public class Demo3 extends TagSupport {
         private int i =0;   
     
         @Override
         public int doStartTag() throws JspException {
               return Tag.EVAL_BODY_INCLUDE ;
         }
     
         @Override
         public int doAfterBody() throws JspException {
               i++;
               if(i <=4)
                   return IterationTag.EVAL_BODY_AGAIN;
               else{
                   i=0;
                   return Tag.SKIP_BODY ;             
              }
         }
         
    }
    修改jsp页面内容输出
    public class Demo4 extends BodyTagSupport {
     
         @Override
         public int doAfterBody() throws JspException {
               // 得到标签体
              String str = this.getBodyContent().getString().toLowerCase();
               try {
                   this.getPreviousOut().println(str);
              } catch (IOException e) {
                   throw new RuntimeException(e );
              }
               return Tag.EVAL_PAGE ;
         }
    }

    简单标签
         为了简化自定义标签的开发,JSP2.0开始又引入了一种新的标签扩展机制。
    称为“简单标签扩展”:
         1、对于熟悉Java编程语言的开发人员,可以定义实现javax.servlet.jsp.tagext.SimpleTag接口的标签处理类。
         2、SimpleTag的一个子类是:SimpleTagSupport。
                   setJspContext方法:该方法把代表JSP页面的pageContext对象传递给标签处理器对象
                   setParent方法:该方法把父标签处理器对象传递给当前标签处理器对象
                   getParent()方法:该方法用于获得标签的父标签处理器对象
                   setJspBody:方法:由Servlet容器调用此方法,用于设置标签的主体部分。JspFrgment类代表JSP的部分代码,
                        它的方法有:invoke方法用于执行body体部分的内容。将内容输出到IE上。
                   doTag() 方法:负责标签的处理过程,完成所有的标签逻辑。与doStartTag和doEndTag方法不同的是doTag方法没有返回值。该方法可以抛出javax.servlet.jsp.SkipPageException 异常,用于通知web容器不在执行JSP页面中位于结束标记后面的内容。
         
    使simpletag标签控制标签体是否输出
    控制整个jsp页面是否执行
    控制jsp页面内容重复执行
    修改jsp页面内容输出
     
    4.3TLD配置文件
         EMPTY JSP scriptless tagdepentend
    基于xml的配置文件
    扩展名:tld
    内容:xml
    位置:
    位置1: WEB-INF目录任意,但除classes和lib目录外
    位置2:WEB-INF/lib/*.jar/META-INF目录
     
    基本类型的一维数组,是对象(Object),但不是对象数组(Oject[])
    5EL函数
    el表达式中可以使用已经声明好的函数(方法)
    格式:${前缀:函数(…..)}

    6案例:用户登录

    7模式和案例(下一天)
    ---------thinking、architecture、code、treasure---------
  • 相关阅读:
    人人都是 Serverless 架构师 | 现代化 Web 应用开发实战
    KubeDL HostNetwork:加速分布式训练通信效率
    独家下载!阿里云云原生携 10+ 技术专家带来《云原生与云未来的新可能》
    国内唯一!阿里云容器服务进入 Forrester 领导者象限
    函数abs的隐式声明 gcc5.1.0 Implicit declaration of function abs gcc5.1.0
    Vue Design Patterns All In One
    linux 中 tar.lzma 文件的解压、压缩
    linux 中删除除第一次匹配特定字符串所在行之外的所有行
    linux 系统中输出匹配特定字符至末尾的行
    根据位点的物理位置、重组率计算遗传距离
  • 原文地址:https://www.cnblogs.com/elaa/p/4067774.html
Copyright © 2020-2023  润新知