EL表达式与JSTL标签库

来源:互联网 发布:秦淮数据靠谱吗 编辑:程序博客网 时间:2024/05/17 23:29
EL表达式
 
1  EL表达式用于获取数据,在JSP页面中可使用${标识符}的形式,通知JSP引擎调用pageContext.findAttribute()方法,以标识符为关键字从各个域对象中获取对象。如果域对象中不存在标识符所对应的对象,则返回结果为"",(注意不是null)。
  •         从Servlet获取的数据--data
  •         该数据是String类型
              <% 
             String data = "abcd";
             request.setAttribute("data",data);
    %>            
    ${data}<%--显示abcd --%>                   
 <%-- pageContext.findAttribute("data") page-->request-->session-->application--%>
原理: 从这四个域中以data为关键字按顺序查找

  •          从Servlet获取的数据--Person
  •          此数据被封装到了JavaBean
  •          Person拥有 name属性并 getName和setName方法
              <% 
             Person  p  = new person();
             p.setName("张三");
             request.setAttribute("person",p);
    %>            
     ${person.name}<%--显示张三--%>                   
<%--pageContext.findAttribute("person")page-->request-->session->application--%>
原理: 从这四个域中以person为关键字按顺序查找

  •     从Servlet获取的数据--Person(许多)
  •     此数据被封装到了List集合
  •     Person拥有name属性并拥有getName和setName方法
              <% 
             List list = new ArrayList();
             list.add(new person("张三"));
                       list.add(new person("李四")); 
             list.add(new person("王五"));
             request.setAttribute("list",list);
    %>            
     ${list[2].name}<%--显示王五--%>                   
<%--pageContext.findAttribute("list")page-->request-->session->application--%>
原理: 从这四个域中以list为关键字按顺序查找,找到list后以角标为关键字查找

  •     从Servlet获取的数据--Person(许多)
  •     此数据被封装到了Map集合
  •     Person拥有name属性并拥有getName和setName方法
              <% 
             Map map = new HashMap();
             map.put("aa",new person("张三"));
                       map.put("bb",new person("李四")); 
             map.put("11",new person("王五"));
             request.setAttribute("map",map);
    %>            
     ${map.bb.name}<%--显示李四--%> 
     ${map.[ ' 11' ].name}         
<%--EL表达式在取数据时通常用点号(.),点号取不出来时,用方括号([ ])--%>  
<%--pageContext.findAttribute("map")page-->request-->session->application--%>
原理: 从这四个域中以map为关键字按顺序查找,找到map后以bb为关键字查找


2  EL表达式中也可以使用${customerBean.address}的形式来访问JavaBean对象的属性。
  •     从Servlet获取的数据--Person
  •     此数据被封装到了复杂 JavaBean
  •     Person拥有name属性并拥有getName和setName方法
  •     Person拥有Address属性并拥有setAddress和getAddress方法 
  •     Address拥有City属性并拥有setCity和getCity方法 
              <% 
             Person  p  = new person(); 
             Address add = new Address();
                       add.setCity("上海");
             p.setAddress(add);
             request.setAttribute("p",p);
    %>            
     ${p.address.city}<%--显示上海--%>                   
<%--pageContext.findAttribute("p")page-->request-->session->application--%>
原理: 从这四个域中以p为关键字按顺序查找

    
3  结合JSTL的forEach标签,EL表达式也可轻松获取各种集合中的元素(对集合进行迭代操作)。

对List集合中的数据进行迭代操作
  •     从Servlet获取的数据--Person(许多)
  •     此数据被封装到了List集合
  •     Person拥有name属性并拥有getName和setName方法
              <% 
             List list = new ArrayList();
             list.add(new person("张三"));
                     list.add(new person("李四")); 
             list.add(new person("王五"));
             request.setAttribute("list",list);
    %>            
    <c:forEach  var="person" items="${list}">
    ${person.name} <br/>
    </c:forEach>                 
显示:张三<br/>李四<br/>王五<br/>

对Map集合中的数据进行迭代操作
  •     从Servlet获取的数据--Person(许多)
  •     此数据被封装到了Map集合
  •     Person拥有name属性并拥有getName和setName方法
              <% 
             Map map = new HashMap();
             map.put("aa",new person("张三"));
                       map.put("bb",new person("李四")); 
             map.put("11",new person("王五"));
             request.setAttribute("map",map);
    %>            
    <c:forEach  var="entry" items="${map}">
    ${entry.key} :  ${entry.value.name} <br/>
    </c:forEach>        
显示:aa   张三<br/>bb   李四<br/>11   王五
迭代原理:使用foreach标签对map集合进行迭代,其实是map调用entrySet()方法得到Set集合,然后对Set集合进行迭代。


4  结合JSTL的if 标签,EL表达式也可使用类如${1==1}的形式进行简单的逻辑判断。
    // 代表用户已登录 
     <c:if  test="${user!=null}">
     欢迎您:${user.username} 
     </c:if>        
               //代表用户未登录
      <c:if  test="${user=null}">
              用户名:<input type="name" value="name">
              密码:<input type="password" value="password">
     </c:if> 
        

5  EL表达式可以动态获取当前WEB应用的路径
    ${pageContext.request.contextPath}
   原理:pageContext.getrequest().getContextPath()

JSTL标签库
JSTL是SUN公司开发的一套标签库,使用JSTL可以在页面中实现一些简单的逻辑,从而替换页面中的脚本代码。
在页面中使用JSTL标签需完成以下2个步骤:
  1.         导入jstl.jarstanderd.jar这两个JSTL的jar文件。
  2.         在JSP页面中使用<%@tablib url="" prifix=""%>元素导入标签库。
                 url地址写法:在standerd.jar包的META-INF目录下的c.tld文件(对标签的描述文件)中有一个url,此url绑定了JSTL标签库中所有的标签,引人这个url即导入了JSTL标签库。
                 prifix(前缀)的名称可以采用引入的url的文件的前缀名(如c).

JSTL标签库主要分为5个部分:
  • 核心标签库                  描述文件:    c.tld
  • 国际化标签                  描述文件:  fnt.tld
  • 数据库标签                  描述文件:  sql.tld
  • XML标签                     描述文件:    x.tld
  • JSTL函数(EL函数) 描述文件:   fn.tld
核心标签库
<c:out>标签
<c:out>标签用于输出一段文本内容到pageContext对象当前保存的“out”对象中。
属性名
是否支持EL
属性类型
属性描述
Value
true
Object
指定要输出的内容
escapeXml
true
Boolean
指定是否将>、<、&、'、"等特殊字符进行HTML编码转换后再进行输出。默认值为true。
default
true
Object 
指定如果Value属性的值为null时所输出的默认值
<c:set>标签
<c:set>标签用于把某一个对象存在指定的域范围内,或者设置Web域中的java.util.Map类型的属性对象或JavaBean类型的属性对象的属性。
属性名
是否支持EL
属性类型
属性描述
Value
true
Object
指定属性值
var
false
String
指定要设置的Web域属性的名称
scope
false
String
指定属性所在的Web域
target
trueObject指定要设置的属性的对象,这个对象必须是JavaBean对象或java.util.Map对象propertytrueString指定当前要为对象设置的属性名称
<c:remove>标签
<c:remove>标签用于删除各种Web域中的属性。
其语法格式如下:
<c:remove var="varName" [scope="{page|request|session|application}"]/>
<c:catch>标签
<c:catch>标签用于捕获嵌套在标签体中的内容抛出的异常,
其语法格式如下:
<c:catch var="varName">nested actions</c:catch>
var属性用于标识<c:catch>标签捕获的异常对象,它将保存在page这个Web域中。
      <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
      <%@ page contentType="text/html;charset=GB2312"%>
      <c:catch var="myex">
      <%
             int x = 10/0;
      %>
      </c:catch>
      异常:<c:out value="${myex}"/> ${myex}<br/>
      异常 myex.getMessage:  <c:out value="${myex.message}"/><br/>
      异常 myex.getCause:  <c:out value="${myex.cause}"/><br/>
      异常 myex.getStackTrace: <c:out value="${myex.stackTrace}"/><br/>
<c:if>标签
<c:if test="">标签可以构造简单的"if-then"结构的条件表达式
属性名
是否支持EL
属性类型
属性描述
test
true
boolean
决定是否处理标签体中的内容的条件表达式
var
false
String
指定将test属性的执行结果保存到某个Web域中的某个属性的名称
scope
false
String
指定将test属性的执行结果保存到哪个Web域中
<c:choose>标签
<c:choose>标签用于指定多个条件选择的组合边界,它必须与<c:when>和<c:otherwise>标签一起使用。
使用<c:choose>,<c:when>和<c:otherwise>三个标签,可以构造类似"if--else if--else"的复杂条件判断结构。
      <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
      <%@ page contentType="text/html;charset=GB2312"%>
      <c:set value="${param.count}" var="count"/>pageContext(count,2)
      <c:choose>
             <c:when test="${count==0}">
                         对不起,没有符合您要求的记录。
             </c:when>
             <c:otherwisse>
                          符合您要求的记录共有${count}条
             </c:otherwise>  
      </c:choose>

<c:forEach>标签
<c:forEach>标签用于对一个集合对象中的元素进行循环迭代操作,或者按指定的次数重复迭代执行标签体中的内容。
属性名
是否支持EL
属性类型
属性描述
var
false
String
指定将当前迭代到的元素保存到page这个Web域中的属性名称
varStatus
false
String
记住用于保存迭代信息的对象
items
true
任何支持的类型 
将要迭代的集合对象
begintrueint如果指定items属性,就从集合中的第begin个元素开始进行迭代,begin的元素索引值从0开始编号;
如果没有指定items属性,就从begin指定的值开始迭代,直到end值时结束迭代
endtrueint参看begin属性的描述steptrueint指定迭代的步长,即迭代因子的迭代增量
<style>
          .odd{background-color: red;}
          .even{background-color: blue;}
          tr : hover{background-color: black;}
</style>
<table border="1" width="20%">
          <c: forEach var="str" items="${list}" valStatus="status">
                <tr class="${status.count%2==0?'even':'odd'}">
                       <td>${str}</td>
               </tr>
         </c:forEach>
</table>  
<c:url>标签
<c:url>标签用于在JSP页面中构造一个URL地址,其主要目的是实现URL重写。URL重写就是会将会话标识号以参数形式附加在URL地址后面
属性名
是否支持EL
属性类型
属性描述
Value
true
String
指定要构造的URL
var
false
String
指定将构造出的URL结果保存到Web域中的属性名称
scope
false
String 
指定将构造出的URL结果保存到哪个Web域中
<c:redirect>标签
<c:redirect>标签用于实现请求重定向
属性名
是否支持EL
属性类型
属性描述
url
true
String
指定要转发或重定向到的目标资源的URL
context
true
String
当要使用相对路径重定向到同一个服务器下的其他WEB应用程序中的资源时,
context属性指定其他web程序的名称
<c:param>标签
在JSP页面进行URL的相关操作时,经常要在URL地址后面附加一些参数。
<c:param>标签可以嵌套在<c:import>、<c:url><c:redirect>标签内,为这些标签所使用的URL地址附加参数。
<c:param>标签在为一个URL地址附加参数时,将自动对参数值进行URL编码,例如,如果传递的参数值为“中国”则将其转换为“%d6%d0%b9%fa”后再附加到URL地址后面。
<c:forTokens>标签
<c:forTokens>标签主要用来分割数据
属性名
是否支持EL
属性类型
属性描述
items
true
String
指定需要分割的数据
delims
true
String
指定以什么来分割数据
自定义标签
自定义标签主要用于移除JSP页面中的java代码。
要使用自定义标签移除JSP页面中的java代码,只需要完成以下两个步骤:
  • 编写一个实现Tag接口的java类,把页面java代码移到这个java类中(标签处理器类)
  • 编写标签库描述符(tld)文件,在tld文件中把标签处理器类描述成一个标签。