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表达式取域的值。
收藏
评论加载中...