Job-day13 jstl、el、自定义EL函数、自定义标签、mvc思想及开发流程

1、JSTL标签库概述

  • JSP标准标签库。
    * 作用:和EL表达式一起 取代<% %>
    * 版本:1.0 1.1和1.2(区别不大)
    * 【1.0EL表达式没有纳入规范】
    * 1.1和1.2EL表达式纳入规范

      * 下载jar包,导入到工程中
          jstl.jar
          standard.jar
          
      * 标签库
          c.tld       核心的标签库
          fn.tld      EL表达式标签库
    
  • JSTL的快速入门
    * 导入相应jar包。
    * 新建JSP的文件,引入标签库
    <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    * 直接使用标签库

2、 JSTL的标签---输出的内容都是已经存在于某个域中的。

  • <c:out> 输出内容
    value :输出的内容(常量或者变量)
    default :默认值
    escapeXml:默认是true,进行转义,设置成false,不转义。

          代码:
              <c:out value="Hello"></c:out>
              <c:out value="${name }"></c:out>
              <!-- "" -->
              <c:out value="${ city }" default="北京"></c:out>
              <c:out value="<a href='#'>超链接</a>" escapeXml="false"/>--此时就可正常显示为一个超链接,而非字符串。
    
  • <c:set>
    * 属性
    var :定义属性
    value :存入的值
    scope :域范围

              target  :修改JavaBean对象
              property:修改的属性
              
          * 向4个web域对象存入值
              <c:set var="i" value="10" scope="request" ></c:set>
              
          * 修改JavaBean对象属性的值  
              <c:set target="${ user }" property="username"  value="小凤"></c:set>
    
  • <c:remove>
    * 属性
    var :删除的属性
    scope :在域的范围

          * 代码
              <c:set var="name" value="小凤" scope="page"></c:set>
              ${ name }
    
              <c:remove var="name" scope="page"/>
              ${name }
    
  • <c:catch>
    * 属性:var 把异常的信息保存变量中
    * 代码
    <c:catch var="e">
    <%
    int a = 10/0;
    %>
    </c:catch>
    ${ e.message }

  • <c:if> 没有<c:else>标签
    * 属性
    * test 判断的条件
    * var 计算的结果保存到变量中
    * scope 域的范围

          * 代码
              <c:set var="i" value="10" scope="page"></c:set>
              <c:if test="${ i ge 10 }" var="x" scope="page">
                  i >= 10
              </c:if>
              <c:if test="${ i lt 10 }">
                  i < 10
              </c:if>
              ${ x }
    
  • <c:choose>标签,必须和以下标签同时用。如果当。。。时,否则当。。时。
    <c:when>
    <c:otherwise>

          代码:
              <c:set var="i" value="10" scope="page"></c:set>
              <c:choose>
                  <c:when test="${ i ge 10 }">
                      i >= 10
                  </c:when>
                  <c:when test="${ i lt 10 }">
                      i < 10
                  </c:when>
                  <c:otherwise>
                      其他
                  </c:otherwise>
              </c:choose>
    
  • <c:forEach>(*****)
    * 循环遍历数据(数组,集合,Map集合)
    * 属性
    var :遍历数据的类型
    items :要遍历的内容

              begin   :从哪开始
              end     :到哪结束
              step    :步长
              
              varStatus:记录循环遍历的信息
                  * index
                  * count(常用)
                  * first
                  * last
                  
          * 代码
              <%
                  String [] arrs = {"美美","小凤","芙蓉","小苍"};
                  request.setAttribute("arrs", arrs);
              %>
              <!-- for(String s : arrs){ }  -->
              <c:forEach var="s" items="${ arrs }">
                  ${ s }
              </c:forEach>
    
              <h4>遍历集合</h4>
              <%
                  List<String> list = new ArrayList<String>();
                  list.add("美美");
                  list.add("小凤");
                  list.add("芙蓉");
                  list.add("小泽");
                  request.setAttribute("list", list);
              %>
              <c:forEach var="s" items="${ list }">
                  ${ s }
              </c:forEach>
    
              <h4>遍历Map集合</h4>
              <%
                  Map<String,String> map = new HashMap<String,String>();
                  map.put("aa", "美美");
                  map.put("bb", "小凤");
                  map.put("cc", "芙蓉");
                  request.setAttribute("map", map);
              %>
              <c:forEach var="entry" items="${ map }">--entry可以随意写。
                  ${ entry.key } -- ${ entry.value }
              </c:forEach>
              
              <h4>遍历对象的集合</h4>
              <%
                  List<User> uList = new ArrayList<User>();
                  uList.add(new User("美美","123"));
                  uList.add(new User("小风","234"));
                  uList.add(new User("芙蓉","345"));
                  request.setAttribute("uList", uList);
              %>
              <c:forEach var="user" items="${ uList }">
                  ${ user.username } -- ${ user.password }
              </c:forEach>
              
              
              <h4>迭代数据</h4>
              <h4>迭代从1到10</h4>
              <c:forEach var="i" begin="1" end="10" step="2">
                  ${ i }
              </c:forEach>
    
    
              <h4>计算从1加到100的和</h4>
              <c:set var="sum" value="0" scope="page"></c:set>
              <c:forEach var="i" begin="1" end="100" step="1">
                  <c:set var="sum" value="${ sum + i }"></c:set>
              </c:forEach>
              ${ sum }
              
              <h4>遍历10到100的偶数,每到第3个数,显示红色</h4>
              <c:forEach var="i" begin="10" end="100" step="2" varStatus="status">
                  <c:choose>
                      <c:when test="${ status.first }">
                          <font color="blue">${ i }</font>
                      </c:when>
                      <c:when test="${ status.count % 3 eq 0 }">
                          <font color="red">${ i }</font>
                      </c:when>
                      <c:otherwise>
                          ${ i }
                      </c:otherwise>
                  </c:choose>
              </c:forEach>
    
  • <c:param> 传递参数--与import、redirect等结合使用,
    * 属性
    name :参数名称
    value :参数的值

  • <c:import> 包含页面
    * url :引入页面的地址
    * context :虚拟路径
    * var :引入页面保存到属性中--指的是页面中的内容
    * scope :域的范围

          * 代码
              <c:import url="/jstl/choose.jsp" context="/day13" var="i" scope="page">
                  <c:param name="username" value="meimei"></c:param>
                  可在包含的choose页面中接收该参数
              </c:import>
              ${ i }
    
  • <c:url>
    <c:url>标签用于在JSP页面中构造一个URL地址,其主要目的是实现URL重写。
    URL重写就是将会话标识号以参数形式附加在URL地址后面,如cookie被禁用时的追踪技术:
    http://localhost/day12/demo?jsessionid=xxxxxxxxxxxxxxxxxx;

          * 属性
              * var       :声明属性
              * value     :地址
              * scope     :域范围-可选
              * context   :虚拟路径-可选
              
          * 代码
              <c:url var="i" value="/jstl/choose.jsp" scope="request" context="/day13">
                  <c:param name="username" value="xiaofeng"></c:param>
              </c:url>
    
              <a href="${ i }">choose</a>
    
  • <c:redirect>重定向
    * 属性
    * url :重定向的地址
    * context :虚拟路径
    * 代码
    <c:redirect url="/jstl/choose.jsp" context="/day13">
    <c:param name="username" value="furong"></c:param>
    </c:redirect>

  • <c:forTokens>分隔字符串(了解)
    <h4>分隔字符串</h4>
    <c:set var="i" value="aa,bb,cc" scope="page"></c:set>
    <c:forTokens items="${i }" delims="," var="x">
    ${ x }
    </c:forTokens>

3、* EL函数(操作字符串的)

  • 自定义EL函数(入门)
    * 编写一个类,方法必须是【静态】方法。
    * 在【WEB-INF目录】下创建tld的文件,配置。
    * 选择2.0

      * 完成配置
          <!-- 配置自定义的EL函数 -->
           <function>
              <!-- 配置方法名称 -->
              <name>【sayHi】</name>
              <!-- 方法所在的类 -->
              <function-class>cn.itcast.el.ElDemo1</function-class>
              <!-- 配置方法的签名 -->
              <function-signature>java.lang.String sayHello(java.lang.String)</function-signature> 即 返回值的类型 【方法名】(参数类型)
           </function>
    
  • 自定义标签
    * 实现SimpleTag接口
    * 编写一个类,继承SimpleTagSupport类。
    * 重写5个方法
    * void setJspContext(JspContext pc)
    * void setParent(JspTag parent)
    * void setJspBody(JspFragment jspBody)
    * void doTag()

          * JspTag getParent() 
    
  • 快速入门的步骤(自定义没有标签体的标签)
    * 编写一个类,继承SimpleTagSupport。
    * 选择重写的方法,doTag()必须有的。
    * 需要配置

    <tag>

    <name>print</name>

    <tag-class>cn.itcast.tag.TagDemo1</tag-class>

    <body-content>empty</body-content>
    </tag>
    * 在JSP页面上,引入标签库
    <%@ taglib uri="http://www.itcast.cn/1110/myc" prefix="myc" %>
    * 使用标签了。

  • 带有标签主体的标签
    * 编写类,继承SimpleTagSupport。
    * 重写doTag()
    * 获取标签主体对象
    JspFragment jf = getJspBody();
    jf.invoke(null);
    * 配置

    <tag>

    <name>out</name>

    <tag-class>cn.itcast.tag.TagDemo2</tag-class>

    <body-content>scriptless</body-content>
    </tag>

              <body-content>元素的可选值有:
                  empty:不能有标签体内容。
                  JSP:标签体内容可以是任何东西:EL、JSTL、<%=%>、<%%>,以及html;但不建议使用Java代码段,SimpleTag已经不再支持使用<body-content>JSP</body-content>;
                  scriptless:标签体内容不能是Java代码段,但可以是EL、JSTL等;
                  tagdependent:标签体内容不做运算,由标签处理类自行处理,无论标签体内容是EL、JSP、JSTL,都不会做运算。
    
  • 带有属性的标签
    * * 编写类,继承SimpleTagSupport。
    * 重写doTag()
    * 编写一个属性,属性必须和标签中的属性是相同
    * 提供set方法
    * 获取标签主体对象
    JspFragment jf = getJspBody();
    jf.invoke(null);
    * 配置

    <tag>

    <name>if</name>

    <tag-class>cn.itcast.tag.TagDemo3</tag-class>

    <body-content>scriptless</body-content>

    <attribute>

    <name>test</name>

    <required>true</required>

    <rtexprvalue>true</rtexprvalue>

    <type>boolean</type>
    </attribute>
    </tag>

  • JSP开发的模式(MVC),一种分层思想

  • 完成注册的需求

      * 注册表单(案例)
      * 数据库(没有)
          * 使用xml来代替。
          
      * 架构
          Servlet + JSP + JavaBean
          
      * 技术
          * 解析XML使用DOM4J技术
          * Servlet技术
          * BeanUtils技术
          * JSTL+EL表达式
      
      * 创建新的项目
      * 导入jar包
      * 创建包结构
      
      
      * 开发的步骤
          * 编写注册的页面,
              用户名,密码,确认密码,别名,邮箱,验证码   
              
          * 先完成数据的校验  onsubmit()
              * 都不能为空,密码和确认密码一致
              * 邮箱格式正确(正则表达式)
              
          * 发送请求,请求Servlet,接收数据,封装,处理数据
              
          * 显示到JSP上。
    
  • 课程回顾:
    • 完成注册和登陆的功能。

    • 准备的工作

      • 技术、开源jar包
    • 开发的功能使用MVC模式

    • C:控制层(接收请求和从客户端发送过来的参数)

      • 接收参数(request对象)
      • 为了操作方便(封装数据,内省,BeanUtils开源的工具)
      • 自己new User(); user.setXXX数据
      • 完成业务逻辑的代码(不推荐写在Servlet) new UserService();
      • 接收结果,通过结果把显示的数据发送给JSP。(把结果存入域对象)
    • M:模型层(JavaBean封装数据,其他JavaBean处理业务)

      • 处理业务逻辑根据注册的功能。(用户名不能重名,邮箱不能重名)
      • 需要把结果返回去。
    • V:视图层(完成数据的显示)

      • 到JSP的页面,通过EL表达式取域的值。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335

推荐阅读更多精彩内容

  • 1什么是JSTLJSTL是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言!JSTL...
    TY_阅读 368评论 0 1
  • JSP 基本结构JSP 页面组成:模板文本(HTML,XML,纯文本),JSP 元素;JSP 元素:脚本元素,指令...
    jslancer阅读 819评论 0 11
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,513评论 18 399
  • 一、JSP基础 1.1什么是JSP JSP(Java ServerPage)是Java服务器端动态页面技术。是su...
    晨星资源阅读 1,135评论 0 6
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,510评论 18 139