zoukankan      html  css  js  c++  java
  • Java Web Day7

    本节内容

     1.EL表达式

     2.JSTL核心标签

    一、EL表达式

     EL 全名为Expression Language。EL主要作用:
      1、获取数据
        EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域 中检索java对象、获取数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
      2、执行运算
        利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}
      3、获取web开发常用对象
        EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
      4、调用Java方法
        EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。

    EL表达式语法: ${“标识符”}

    获取数据

    EL表达式语句在执行时,会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、request、session、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回”” (注意,不是null,而是空字符串)。

      EL表达式可以很轻松获取JavaBean的属性,或获取数组、Collection、Map类型集合的数据

    <%@page import="com.xk.bean.Dept"%>
    <%@page import="java.util.*"%>
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%@ page errorPage="error.jsp"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>EL表达式获取数据</title>
    </head>
    <body>
    
      <%
        request.setAttribute("name", "龙之殇");
      %>
       <%--${name}等同于pageContext.findAttribute("name") --%>
             使用EL表达式获取数据:${name}  
      
       <!-- 在jsp页面中,使用el表达式可以获取bean的属性 -->
       
        <hr/>
       <%
         Dept  dept = new Dept();
       dept.setE_id(101);
       dept.setName("龙之殇");
       dept.setSalary(10000);
       
       request.setAttribute("dept", dept);
         
       %>
       <!--取出bean中的属性值  -->
       ${dept.e_id}
       ${dept.name}
       ${dept.salary}
       <!-- 在jsp页面中,使用el表达式获取list集合中指定位置的数据 -->
       <hr/>   
       <% 
       Dept  dept1 = new Dept();
       dept1.setE_id(100);
       dept1.setName("龙之殇1");
       dept1.setSalary(10000);
       Dept  dept2 = new Dept();
       dept2.setE_id(102);
       dept2.setName("龙之殇2");
       dept2.setSalary(10000);
       Dept  dept3 = new Dept();
       dept3.setE_id(103);
       dept3.setName("龙之殇3");
       dept3.setSalary(10000);
       
       List<Dept>  list =new ArrayList<Dept>();
       
       list.add(dept1);
       list.add(dept2);
       list.add(dept3);
       
       request.setAttribute("lists", list);
       
       %>
       <!-- 取list指定位置的数据 -->
       
       ${lists[1].name}
       
       <hr/>
        <!-- 在jsp页面中,使用el表达式获取map集合的数据 -->
       <%
       
         Map<String,Dept> map = new HashMap<String,Dept>();
       
          map.put("a", dept1);
          map.put("b", dept2);
          map.put("c", dept3);
          request.setAttribute("map",map);
       %>
       
       ${map.c.name}
       ${map["a"].name}
       
    </body>
    </html>
    View Code

    执行运算

    1、关系运算符

    2.逻辑运算符

    3、empty运算符:检查对象是否为null(空)

    4、二元表达式:${user!=null?user.name :""}
    5、[ ] 和 . 号运算符

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>El表达式运算</title>
    </head>
    <body>
                             四则运算 
                               ${10+30 }<br/>
                               ${30-10}<br/>
                               ${30*2 }<br/>
                               ${30/2}<br/>
                               
         关系运算符 <br/>
                                       两种写法等价
           ${dept5 ==null}<br/>
           ${dept5 eq null}<br/>
                                     
    <h3>el表达式使用empty运算符检查对象是否为null(空)</h3>
    
         ${empty(list)}
         
         <h3>EL表达式中使用三目运算符</h3>
         
         ${list eq null? "没有这个对象":list[1].name}
    
    </body>
    </html>
    View Code

    获得web开发常用对象

    EL表达式语言中定义了11个隐含对象,使用这些隐含对象可以很方便地获取web开发中的一些常见对象,并读取这些对象的数据

    序号 隐含对象名称 描       述
    1 pageContext 对应于JSP页面中的pageContext对象(注意:取的是pageContext对象。)
    2 pageScope 代表page域中用于保存属性的Map对象
    3 requestScope 代表request域中用于保存属性的Map对象
    4 sessionScope 代表session域中用于保存属性的Map对象
    5 applicationScope 代表application域中用于保存属性的Map对象
    6 param 表示一个保存了所有请求参数的Map对象
    7 paramValues 表示一个保存了所有请求参数的Map对象,它对于某个请求参数,返回的是一个string[]
    8 header 表示一个保存了所有http请求头字段的Map对象,注意:如果头里面有“-” ,例Accept-Encoding,则要header[“Accept-Encoding”]
    9 headerValues 表示一个保存了所有http请求头字段的Map对象,它对于某个请求参数,返回的是一个string[]数组。注意:如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”]
    10 cookie 表示一个保存了所有cookie的Map对象
    11 initParam 表示一个保存了所有web应用初始化参数的map对象
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>el表达式的隐式对象</title>
    </head>
    <body>
      获取JSP页面中的pageContext对象
      ${pageContext.session.id}<br/>
       <%
         pageContext.setAttribute("name", "Drango Wal");
       
       %>
      <h1>pageScope对象:从page域(pageScope)中查找数据</h1>
        ${pageScope.name} 
        
       <h1>requestScope对象:从request域(requestScope)中获取数据</h1>
       <%
         request.setAttribute("name", "龙之殇");
       
       %>
       ${requestScope.name }
       
       <h1>sessionScope对象:从session域(sessionScope)中获取数据</h1>
       <%
         session.setAttribute("name", "session对象");
       
       %>
       
       ${sessionScope.name }
       
       <h1>applicationScope对象:从application域(applicationScope)中获取数据</h1>
         <%
         application.setAttribute("name", "application对象");
         
         %>
         
         
       ${applicationScope.name}
    
    <h1>param对象:获得用于保存请求参数map,并从map中获取数据</h1>
    
      <form action="#" method="get">
      
      <input type="text" name="username"/>
      
      <input type="submit" value="提交"/>
      </form>
       
       
       ${param.username}
       
       <h1>paramValues对象:paramValues获得请求参数(所有的参数)</h1>
       
       <form action="#" method="get">
      
      <input type="text" name="username"/>
       <input type="text" name="username"/>
      <input type="submit" value="提交"/>
      </form>
       ${paramValues.username[0]}
       ${paramValues.username[1]}
       
       <h1>header对象:header获得请求头</h1>
       
        ${header.Accept}<br/>
       <%--${header.Accept-Encoding} 这样写会报错
                    测试headerValues时,如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”]--%>
       
         ${header["Accept-Encoding"]}
         
         <h1>headerValues对象:headerValues获得请求头的值</h1>
         
         <%--headerValues表示一个保存了所有http请求头字段的Map对象,它对于某个请求参数,返回的是一个string[]数组 
               例如:headerValues.Accept返回的是一个string[]数组 ,headerValues.Accept[0]取出数组中的第一个值
              --%>
               ${headerValues.Accept[0]}<br/>
                <%--${headerValues.Accept-Encoding} 这样写会报错
                   测试headerValues时,如果头里面有“-” ,例Accept-Encoding,则要headerValues[“Accept-Encoding”]
                    headerValues["Accept-Encoding"]返回的是一个string[]数组,headerValues["Accept-Encoding"][0]取出数组中的第一个值
               --%>
          ${headerValues["Accept-Encoding"][0]}
         
         
         <h1>cookie对象:cookie对象获取客户机提交的cookie</h1>
         
         ${cookie.cookieName.value}
         
         <h1>initParam对象:initParam对象获取在web.xml文件中配置的初始化参数</h1>
          ${initParam.names}
    </body>
    </html>
    View Code

    二、JSTL核心标签

    JSTL标签库的使用是为弥补html标签的不足,规范自定义标签的使用而诞生的。使用JSLT标签的目的就是不希望在jsp页面中出现java逻辑代码

    EL表达式不能进行循环操作:使用JSTL可以弥补这个缺点,所以EL表达式与JSTL通常配合使用。

    JSTL标签库的分类

    • 核心标签(用得最多)
    • 国际化标签(I18N格式化标签)
    • 数据库标签(SQL标签,很少使用)
    • XML标签(几乎不用)
    • JSTL函数(EL函数)
    • JSTL的核心标签库标签共13个,使用这些标签能够完成JSP页面的基本功能,减少编码工作。

        从功能上可以分为4类:表达式控制标签、流程控制标签、循环标签、URL操作标签。
          (1)表达式控制标签out标签、set标签、remove标签、catch标签。
          (2)流程控制标签if标签、choose标签、when标签、otherwise标签
          (3)循环标签forEach标签、forTokens标签
          (4)URL操作标签import标签、url标签、redirect标签、param标签

    在JSP页面引入核心标签库:使用taglib指令:

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    

    表达式控制标签

    <c:out>标签用来显示一个表达式的结果,与<%= %>作用相似,它们的区别就是<c:out>标签可以直接通过"."操作符来访问属性。

    <c:out value="<string>" default="<string>" escapeXml="<true|false>"/>
    

    <c:set>标签用于设置变量值和对象属性。

     

    <c:set
       var="<string>"
       value="<string>"
       target="<string>"
       property="<string>"
       scope="<string>"/>
    

    <c:remove>标签用于移除一个变量,可以指定这个变量的作用域,若未指定,则默认为变量第一次出现的作用域。

    这个标签不是特别有用,不过可以用来确保JSP完成清理工作。

    <c:remove var="<string>" scope="<string>"/>
    

    <c:catch> 标签主要用来处理产生错误的异常状况,并且将错误信息储存起来

     

    <c:catch var="<string>">
    ...
    </c:catch>
    

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        <!--引入JSTL核心标签库  -->
        <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JSTL标签库</title>
    </head>
    <body>
    <h1>表达式控制标签</h1>
    
    
      out输出标签  <br/>
            直接输出一个字符串<br/>
      <c:out value="out输出不同属性的输出"></c:out>
      <br/>
      <%--escapeXml="false"表示value值中的html标签不进行转义,而是直接输出 --%>
      <c:out value="<a href='http://www.baidu.com/'>点击链接到百度</a>" escapeXml="false"></c:out>
       <%-- 字符串中有转义字符,但在默认情况下没有转换。 --%>
       <br/>
      <c:out value="&lt未使用字符转义&gt" />
      
      <br/>
      
      使用了转义字符&lt和&gt分别转换成<和>符号。
      <c:out value="&lt使用字符转义&gt" escapeXml="false"></c:out>
      
    <br/>
    设定了默认值,从EL表达式${null}得到空值,所以直接输出设定的默认值,没有默认值直接输出空<br/>
    
    <c:out value="${null}"></c:out>
    <br/>
    <c:out value="${null}" default="默认值"/>
    
    
    <h1>set标签</h1>
    
    <%--通过<c:set>标签将data的值放入page范围中。--%>
     
    <c:set var="data" value="Drango wal" scope="page"/>
    <br/>
     从page域中得到值:${pageScope.data}
     
    <br/>
     <%--通过<c:set>标签将data2的值放入request范围中。--%>
    <c:set var="data1" value="Drango wal request" scope="request"/>
    从request域中得到值:${requestScope.data1}
    <br/>
     <%--通过<c:set>标签将值data2的值放入session范围中。--%>
    <c:set value="龙之殇" var="data2" scope="session"></c:set>
    从session域中得到值:${sessionScope.name1}
    <br/>
      <%--把data3放入application范围中。 --%>
    <c:set var="data3" scope="application">大罗金仙</c:set>
    使用标签与EL表达式输出
     <c:out value="${applicationScope.data3}">未得到data3的值</c:out>
    
    
    <h1>remove标签</h1>
    
    <c:set var="name" scope="session">龙之殇</c:set>
    <c:set var="age" scope="session">25</c:set>
    
    <c:out value="${sessionScope.name}"></c:out>
    <br/>
    <c:out value="${sessionScope.age}"></c:out>
    <br/>
     <%--使用remove标签移除age变量 --%>
      <c:remove var="age" />
      
     <c:out value="${sessionScope.name}"></c:out>
     <br/>
    <c:out value="${sessionScope.age}"></c:out>
    <br/>
    <h1>catch标签</h1>
    
    <%--把容易产生异常的代码放在<c:catch></c:catch>中,
         自定义一个变量errorMessage用于存储异常信息 --%>
         
        <c:catch var="errorMessage">
        <!-- 放异常代码 -->
        
        <c:set target="person" property="name" value="龙之殇"></c:set>
        
        </c:catch>
    <%--用EL表达式得到errorMessage的值,并使用<c:out>标签输出 --%>
    
     异常:<c:out value="${errorMessage}" /><br />
    
    <br/>
    <br/>
    <br/>
    <br/>
    <br/>
    <br/>
    
    
    
    
     
    
    
    
    </body>
    </html>
    View Code

    流程控制标签

     <c:if>标签判断表达式的值,如果表达式的值为 true 则执行其主体内容。

     

    <c:if test="<boolean>" var="<string>" scope="<string>">
       ...
    </c:if>
    

      

    <c:choose>, <c:when>, <c:otherwise> 标签

    <c:choose>标签与Java switch语句的功能一样,用于在众多选项中做出选择。

    switch语句中有case,而<c:choose>标签中对应有<c:when>,switch语句中有default,而<c:choose>标签中有<c:otherwise>。

    <c:choose>
        <c:when test="<boolean>">
            ...
        </c:when>
        <c:when test="<boolean>">
            ...
        </c:when>
        ...
        ...
        <c:otherwise>
            ...
        </c:otherwise>
    </c:choose>
    

      

    属性

    • <c:choose>标签没有属性。
    • <c:when>标签只有一个属性,在下表中有给出。
    • <c:otherwise>标签没有属性。

    <c:forEach>, <c:forTokens> 标签 

    这些标签封装了Java中的for,while,do-while循环。

    相比而言,<c:forEach>标签是更加通用的标签,因为它迭代一个集合中的对象。

    <c:forTokens>标签通过指定分隔符将字符串分隔为一个数组然后迭代它们。

    forEach 语法格式
    
    <c:forEach
        items="<object>"
        begin="<int>"
        end="<int>"
        step="<int>"
        var="<string>"
        varStatus="<string>">
    
        ...
    
    
    
    
    
    forTokens 语法格式
    
    <c:forTokens
        items="<string>"
        delims="<string>"
        begin="<int>"
        end="<int>"
        step="<int>"
        var="<string>"
        varStatus="<string>">
    

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
        <%@page import="com.xk.bean.Dept"%>
    <%@page import="java.util.*"%>
    <!--引入JSTL核心标签库  -->
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JSTL流程控制标签</title>
    </head>
    <body>
        <h1>if条件判断</h1>
        <form action="#" method="post">
            <input type="text" name="uname" value="${param.uname}"> <input
                type="submit" value="登录">
        </form>
        <%--使用if标签进行判断并把检验后的结果赋给adminUserName,存储在默认的page范围中。 --%>
        <c:if test="${param.uname=='admin'}" var="adminUserName">
    
            <c:out value="${adminUserName}"></c:out>
        </c:if>
        ${adminUserName}
    
    
    
    
        <h1>choose及其嵌套标签示例</h1>
    
        <%--通过set标签设定score的值为90 --%>
        <c:set var="score" value="90" />
    
        <c:choose>
            <%--使用<c:when>进行条件判断。
              如果大于等于90,输出“您的成绩为优秀”;
             如果大于等于70小于90,输出“您的成绩为良好”;
             大于等于60小于70,输出“您的成绩为及格”;
            其他(otherwise)输出“对不起,您没能通过考试”。
          --%>
            <c:when test="${score>=90}">
              你的成绩为优秀!
         
        </c:when>
            <c:when test="${score>70 && score<90}">
                 您的成绩为良好!
              </c:when>
            <c:when test="${score>60 && score<70}">
                 您的成绩为及格
              </c:when>
            <c:otherwise>
                  对不起,您没有通过考试!
             </c:otherwise>
    
        </c:choose>
    
    
    
      <h1>forEach标签实例</h1>
      
      <% 
       Dept  dept1 = new Dept();
       dept1.setE_id(100);
       dept1.setName("龙之殇1");
       dept1.setSalary(10000);
       Dept  dept2 = new Dept();
       dept2.setE_id(102);
       dept2.setName("龙之殇2");
       dept2.setSalary(10000);
       Dept  dept3 = new Dept();
       dept3.setE_id(103);
       dept3.setName("龙之殇3");
       dept3.setSalary(10000);
       
       List<Dept>  list =new ArrayList<Dept>();
       
       list.add(dept1);
       list.add(dept2);
       list.add(dept3);
       
       request.setAttribute("lists", list);
       
       %>
      不指定begin和end的迭代:<br/>
      <c:forEach var="dept" items="${lists}">
        <c:out value="${dept.name}"></c:out><br/>
      
      
      </c:forEach>
      
      
      <br/>
      指定begin和end的迭代:<br/>
      
      <c:forEach var="dept" items="${lists}" begin="0" end="2" step="2">
      
       <c:out value="${dept.name}"></c:out><br/>
      
      
      </c:forEach>
      
      
      
      
      <h1>forTokens标签</h1>
      
      <c:forTokens items="天、王、盖、地、虎" delims="、" var="str">
      
     ${str}<br/>
      
      </c:forTokens>
      
      
      
      
      
    
    
    </body>
    </html>
    View Code

    URL标签:

    <c:import> 标签

       该标签可以把其他静态或动态文件包含到本JSP页面,与<jsp:include>的区别为:<jsp:include>只能包含同一个web应用中的文件。而<c:import>可以包含其他web应用中的文件,甚至是网络上的资源。

    <c:import
       url="<string>"
       var="<string>"
       scope="<string>"
       varReader="<string>"
       context="<string>"
       charEncoding="<string>"/>
    

      

    <c:param>标签用于在<c:url>标签中指定参数,而且与URL编码相关。

    在<c:param>标签内,name属性表明参数的名称,value属性表明参数的值。

    <c:param name="<string>" value="<string>"/>
    

      

    <c:redirect> 标签

    <c:redirect>标签通过自动重写URL来将浏览器重定向至一个新的URL,它提供内容相关的URL,并且支持c:param标签。  

     

    <c:redirect url="<string>" context="<string>"/>
    

    <c:url> 标签

    <c:url>标签将URL格式化为一个字符串,然后存储在一个变量中。

    这个标签在需要的时候会自动重写URL。

    var属性用于存储格式化后的URL。

    <c:url>标签只是用于调用response.encodeURL()方法的一种可选的方法。它真正的优势在于提供了合适的URL编码,包括<c:param>中指定的参数。

    <c:url
      var="<string>"
      scope="<string>"
      value="<string>"
      context="<string>"/>
    

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!--引入JSTL核心标签库  -->
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>JSTL中URL标签</title>
    </head>
    <body>
    
        <h1>import标签</h1>
        <%--使用绝对路径导入百度首页,--%>
        <c:import url="http://wwww.baidu.com" charEncoding="utf-8" />
    
        <%--使用相对路径导入同一文件夹下的文件--%>
        <c:import url="index.jsp" charEncoding="utf-8" />
    
    
    
    
        <h1>redirect标签</h1>
    
    
        <c:redirect url="http://www.baidu.com">
            <%--在重定向时使用<c:param>标签为URL添加了两个参数:uname=wuzhilong和password=12356 --%>
            <c:param name="uname">wuzhilong</c:param>
            <c:param name="password">12356</c:param>
    
    
        </c:redirect>
    
    
    
        <h1>param标签</h1>
    
    
        <c:url value="http://www.baidu.com" var="paramUrl">
            <c:param name="userName" value="wuzhilong" />
            <c:param name="pwd">123456</c:param>
        </c:url>
        <a href="${paramUrl}">百度首页(带参数)</a>
    </body>
    </html>
    View Code

      

      

      

     

      

  • 相关阅读:
    c#读取Excel并显示出来
    异步编程模型。
    细分线程的等待(WaitAny,WaitAll),区别于Thread.Join
    waitany,waitall在线程池中的使用。from msdn
    SQL SET NOCOUNT ON的含义和作用
    MS ゴシック与MS UI Gothic的区别
    线程的管理1
    HDU 1203 I NEED A OFFER!(背包)
    hdu 1232 畅通工程
    POJ 1088 滑雪
  • 原文地址:https://www.cnblogs.com/wuzhilong/p/9518820.html
Copyright © 2011-2022 走看看