JavaWeb中JSTL标签库

Java Web JSTL标签库

我们之前讲过使用EL表达式来简化获取对象及其属性,但是对于那些复杂的逻辑,仍然需要使用<%%>这样的脚本代码,网页中充斥太多这样的代码会导致结构不清晰,可维护性非常差,那么有没有更好的方式来实现这些功能呢?

这就是今天要讲到的JSTL标签库。

以往我们要在jsp页面中输出一个table,就需要通过for循环来输出,比如

<table>

 <tr><td>姓名</td><td>年龄</td></tr>

 <%

 List list=(List)request.getAttribute("stus");

 for(int i=0;i<list.size();i++){

 Student stu=list.get(i);

 %>

 <tr><td><%=stu.getName()%></td><td><%=stu.getAge()%></td></tr>

 <%

 }

 %>

</table>

这还只是一个最简单的循环,对于更复杂的嵌套循环,需要更多的类似代码。

而通过JSTL的标签,就可以使用如下的方式实现:

<c:forEachvar="stu" items="${requestScope.stus}">

 <tr><td>${stu.name}</td><td>${stu.age}</td></tr>

</c:forEach>

这样看起来清晰多了。

我们先不用深入这个标签具体的含义,只需记住,使用标签可以简化更多的java脚本代码,下面我们系统的学习JSTL常用标签。

JSTL简介

  JSTL是官网标准的标签库,它提供了一系列的jsp标签,实现了最常用的功能,比如数组,集合的遍历,日期格式化,if-else判断等。

  JSTL标签库包括core标签库,fmt标签库,fn标签库等等。

JSTLcore标签库

 core标签库是JSTL的核心库,实现了最基本的功能。在使用之前,需要在页面顶部导入标签,如下:

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

 1<c:if></c:if>标签,用于在jsp中进行逻辑判断,可以代替脚本中的 if条件判断语句,这个标签有个test属性,用于接收判断表达式

示例1 <c:iftest="${2-4==-2}">

正确

         </c:if>

在这里,使用el表达式来计算一个布尔值,然后根据这个布尔值来作为判断的依据;

我们之前讲过,el里面可以获取某个作用域中的属性或对象,所以我们还可以这样做

示例2 <c:iftest="${requestScope.username!='lsp'}">

不是兰赛普的学生

         </c:if>

在这里,通过el表达式获取了存在request域中的username属性,然后判断是否等于'lsp',不等于则输出中间那句话

 2, <c:if></c:if>标签只能代替if语句,如果需要 if else这样的流程怎么做。

很可惜,jstl没有<c:else>这样的标签,但是有个标签组可以实现类似功能,那就是<c:choose>标签,具体用法如下:

   <c:choose>

    <c:whentest="${requestScope.username=='lsp'}">

是兰赛普的学生

    </c:when>

    <c:otherwise>其他</c:otherwise>

   </c:choose>

本身<c:choose>没有多大作用,但是它里面有两种标签可以模拟if-else<c:when>标签用于条件判断,类似if,而<c:otherwise>标签类似else

 3,<c:forEach>是循环标签,可以代替脚本中的for循环。<c:forEach>支持数组,List,Set,Map等结构

 <c:forEach var="stu"items="${requestScope.stus}">

 <tr><td>${stu.name}</td><td>${stu.age}</td></tr>

 </c:forEach>

这个标签有两个重要的属性,var属性用于定义每个元素的变量名,以便在循环体中使用,items属性指定数组或集合,这个一般都会从脚本中定义的变量或者某个作用域中获得。

在循环体内,就可以直接用el表达式输出具体的对象属性,其中${stu.name}表示取得stu对象的name属性,这里的stu就是forEachvar定义的变量名,类似于

  for(int i=0;i<list.size();i++){

    Student stu=list.get(i);

  }

<c:forEach>标签在循环数组,List,Set时没有任何区别,但是循环Map时有点不一样,Map结构是键值对的结构,在获取的时候,也需要分别获取键和值,代码如下:

 <c:forEachvar="data" items="<%=map%>">

  ${data.key}:${data.value}

 </c:forEach>

这里的keyvalue是两个关键字,分别表示键和值。

${requestScope.map['key']}

4,<c:forTokens>标签可以循环被某些字符分割的字符串,比如"java,net,c"这个字符串,在java类中,我们可以通过String对象的split()方法来

拆分这个字符串,比如:

       Stringname="lsp1,lsp2,lsp3";

String[]names=name.split(",");

for(inti=0;i<names.length;i++){

Stringnm=names[i];

System.out.println(nm);

}

这段代码中,我们通过逗号把字符串拆分了,变成了一个String数组,然后通过循环来取得每个元素。

jsp中,可以使用<c:forTokens>标签来达到同样效果,它的用法如下:

       <c:forTokensvar="str" items="lsp1,lsp2,lsp3" delims=",">

         ${str}<br/>

       </c:forTokens>

  var是定义每个循环项的变量,相当于上面的nmitems是指定被循环的数组或集合,在循环体内,就可以直接引用这个变量了。

5<c:set>标签可以定义一个作用域内的变量,也可以修改某个作用域已有的值。比如:

  <c:set var="count" value="34"scope="request"></c:set>

这样就在定义了一个变量,变量名称是count,值是34,作用域是request

其实相当于request.setAttribute("count",34);

  scope这个属性可选值有:

  page,request,session,application

如:

  <c:set var="count" value="34"scope="page"></c:set>

  <c:set var="lsp" value="java"scope="request"></c:set>

  <c:set var="uname" value="afei"scope="session"></c:set>

  <c:set var="visit_count" value="10000"scope="application"></c:set>

设置之后,就可以使用el表达式获取了

  ${sessionScope.uname}

JSTLfmt标签库

  fmt标签是格式化标签,比如日期,国际化等等。在使用之前,需要导入标签库,

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

  1,<fmt:formatDate>标签。

在以往我们想在jsp中打印日期的时候会这样去做:

 <%

   Date date=new Date();

 %>

 <%=date%>

这样可以打印一个日期,但是格式不是我们想要的,然后我们会想到使用SimpleDateFormat对象来格式化输出日期。

代码如下:

 <%

 Date date=new Date();

 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-ddHH:ss:mm");

 %>

 <%=sdf.format(date)%>

这种方法确实可以,但是现在我们有更简单的方法实现,那就是<fmt:formatDate>标签,使用方法如下:

 <fmt:formatDate value="<%=date%>"pattern="yyyy-MM-dd HH:mm:ss" />

 value属性就是将要格式化的日期对象,pattern属性用于指定具体格式


你可能感兴趣的:(javaweb,jstl标签库)