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模式和案例(下一天)

12 自定义标签/JSTL标签库/web国际化/java web之设计模式和案例的更多相关文章

  1. JavaWeb学习篇之----自定义标签&&JSTL标签库详解

    今天来看一下自定义标签的内容,自定义标签是JavaWeb的一部分非常重要的核心功能,我们之前就说过,JSP规范说的很清楚,就是Jsp页面中禁止编写一行Java代码,就是最好不要有Java脚本片段,下面 ...

  2. java-自定义标签&&JSTL标签库详解

    自定义标签是Jav aWeb的一部分非常重要的核心功能,我们之前就说过,JSP规范说的很清楚,就是Jsp页面中禁止编写一行Java代码,就是最好不要有Java脚本片段,下面就来看一下自定义标签的简介: ...

  3. javaEE(7)_自定义标签&JSTL标签(JSP Standard Tag Library)

    一.自定义标签简介 1.自定义标签主要用于移除Jsp页面中的java代码,jsp禁止出现一行java脚本. 2.使用自定义标签移除jsp页面中的java代码,只需要完成以下两个步骤: •编写一个实现T ...

  4. JSP常用标签——JSTL标签和EL表达式

    一.JSTL简介 1.什么是JSTL JSTL是Java中的一个定制标记库集.(这个标记库集不需要自己编写,可以直接使用) 2.为什么要使用JSTL 实现了JSP页面中的代码复用(基于标签库原理,重复 ...

  5. [Web Service] Java Web Services Tutorial

    两种主要的java web services api: JAX-WS 和JAX-RS. Java web service application 之间通过WSDL来交互. 有两种方法来书写java w ...

  6. java web(五):java web三大组件之另外两个和八大监听器

    java的三大组件指Servlet.Filter.Listener.八大监听器指八个接口.前面介绍了Servlet,现在介绍一下Filter拦截器以及拦截地址的设置, Listener监听那些事件. ...

  7. Jsp页显示时间标签JSTL标签 <fmt:formatDate/> 实例大全

    <fmt:formatDate value="${isoDate}" type="both"/>2004-5-31 23:59:59 <fmt ...

  8. 【Elasticsearch】【WEB】java web服务连接es elasticsearch始终报错,无法正常连接使用的错误解决历程

    前情提要: web服务往华为云上迁移 ================内网的好环境,相关配置=================== 1.web服务关于ES的集群配置如下: elasticAddress ...

  9. Java实战之04JavaWeb-04JSP、EL表达式、JSTL标签库

    一.jsp部分 只要是与页面显示相关的都是重点 1.jsp的脚本 <%java代码%>:被翻译到service方法内部,局部变量,局部的功能 <%=表达式或变量%>:翻译成se ...

随机推荐

  1. JQuery 实现标题与内容相呼应样式

    效果图如下:鼠标移到标题上,标题下面显示标题对应的内容.实现的方法如下: 1.引入css和js文件 <link href="public/CSS/StyleSheet.css" ...

  2. mysql备份脚本,每天执行一次全量备份,三次增量备份

    线上一个小业务的mysql备份 全量备份 #!/bin/bash #crete by hexm at -- #scripte name : full_backup.sh #descriptioni : ...

  3. 自然语言25_nltk.book

    测试NLTK数据包 导入nltk.book包中所有的东西: 能使用以下函数的是nltk.text.Text对象 from nltk.book import * text1.concordance(&q ...

  4. 探索ASP.NET MVC框架之路由系统

    引言 对于ASP.NET MVC的路由系统相信大家肯定不陌生.今天我们就深入ASP.NET的框架内部来看一下路由系统到底是怎么通过我们给出的地址(例如:/Home/Index)解析出Controlle ...

  5. [CentOs7]搭建ftp服务器

    摘要 vsftpd 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点.vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux. ...

  6. PHP计算两个时间段是否有交集(边界重叠不算)

    优化前的版本: /** * PHP计算两个时间段是否有交集(边界重叠不算) * * @param string $beginTime1 开始时间1 * @param string $endTime1 ...

  7. html嵌入样式表

    1.针对文件中的字体还有属性进行设置主要设置文字的大小及其颜色问题,未涉及div飘操作 处理页面CSS 先检测该内容部分是否已经设定了样式,如果没有单独设定再按照总体设计进行限定. eg:  h1 h ...

  8. poj 1239

    二次dp,还算好想. 先第一遍dp找出最后一个数字最小是几. dpf[i]=max{j}+1(dpf[j],dpf[j]+1,…,j位组成的数字小于j+1,j+2,…,i位组成的数字. 在第二遍dp, ...

  9. java13

    1:登录注册案例(理解) 2:Set集合(理解) (1)Set集合的特点 无序,唯一 (2)HashSet集合(掌握) A:底层数据结构是哈希表(是一个元素为链表的数组) B:哈希表底层依赖两个方法: ...

  10. 我常用的Vi命令

    Vi对于linux的重要性和受欢迎的程度在此一律不表.此刻互联网上不少介绍vi的文章和博客,相信写得比我好的也不在少数.然而为什么我依然写这样一篇文章呢?我对linux知识和了解也都来自于互联网,很难 ...