Java Web JSTL标签库
我们之前讲过使用EL表达式来简化获取对象及其属性,但是对于那些复杂的逻辑,仍然需要使用这样的脚本代码,网页中充斥太多这样的代码会导致结构不清晰,可维护性非常差,那么有没有更好的方式来实现这些功能呢?
这就是今天要讲到的JSTL标签库。
以往我们要在jsp页面中输出一个table,就需要通过for循环来输出,比如
姓名 | 年龄 |
List list=(List)request.getAttribute("stus");
for(int i=0;i
Student stu=list.get(i);
%>
}
%>
这还只是一个最简单的循环,对于更复杂的嵌套循环,需要更多的类似代码。
而通过JSTL的标签,就可以使用如下的方式实现:
${stu.name}${stu.age}这样看起来清晰多了。
我们先不用深入这个标签具体的含义,只需记住,使用标签可以简化更多的java脚本代码,下面我们系统的学习JSTL常用标签。
一JSTL简介
JSTL是官网标准的标签库,它提供了一系列的jsp标签,实现了最常用的功能,比如数组,集合的遍历,日期格式化,if-else判断等。
JSTL标签库包括core标签库,fmt标签库,fn标签库等等。
二JSTL之core标签库
core标签库是JSTL的核心库,实现了最基本的功能。在使用之前,需要在页面顶部导入标签,如下:
1,标签,用于在jsp中进行逻辑判断,可以代替脚本中的if条件判断语句,这个标签有个test属性,用于接收判断表达式
示例1:
正确
在这里,使用el表达式来计算一个布尔值,然后根据这个布尔值来作为判断的依据;
我们之前讲过,el里面可以获取某个作用域中的属性或对象,所以我们还可以这样做
示例2:
不是兰赛普的学生
在这里,通过el表达式获取了存在request域中的username属性,然后判断是否等于'lsp',不等于则输出中间那句话
2, 标签只能代替if语句,如果需要if else这样的流程怎么做。
很可惜,jstl没有这样的标签,但是有个标签组可以实现类似功能,那就是标签,具体用法如下:
是兰赛普的学生
其他
本身没有多大作用,但是它里面有两种标签可以模拟if-else:标签用于条件判断,类似if,而标签类似else。
3,是循环标签,可以代替脚本中的for循环。支持数组,List,Set,Map等结构
${stu.name}${stu.age}这个标签有两个重要的属性,var属性用于定义每个元素的变量名,以便在循环体中使用,items属性指定数组或集合,这个一般都会从脚本中定义的变量或者某个作用域中获得。
在循环体内,就可以直接用el表达式输出具体的对象属性,其中${stu.name}表示取得stu对象的name属性,这里的stu就是forEach中var定义的变量名,类似于
for(int i=0;i
Student stu=list.get(i);
}
标签在循环数组,List,Set时没有任何区别,但是循环Map时有点不一样,Map结构是键值对的结构,在获取的时候,也需要分别获取键和值,代码如下:
${data.key}:${data.value}
这里的key和value是两个关键字,分别表示键和值。
${requestScope.map['key']}
4,标签可以循环被某些字符分割的字符串,比如"java,net,c"这个字符串,在java类中,我们可以通过String对象的split()方法来
拆分这个字符串,比如:
Stringname="lsp1,lsp2,lsp3";
String[]names=name.split(",");
for(inti=0;i
Stringnm=names[i];
System.out.println(nm);
}
这段代码中,我们通过逗号把字符串拆分了,变成了一个String数组,然后通过循环来取得每个元素。
在jsp中,可以使用标签来达到同样效果,它的用法如下:
${str}
var是定义每个循环项的变量,相当于上面的nm,items是指定被循环的数组或集合,在循环体内,就可以直接引用这个变量了。
5,标签可以定义一个作用域内的变量,也可以修改某个作用域已有的值。比如:
这样就在定义了一个变量,变量名称是count,值是34,作用域是request。
其实相当于request.setAttribute("count",34);
scope这个属性可选值有:
page,request,session,application
如:
设置之后,就可以使用el表达式获取了
${sessionScope.uname}
三JSTL之fmt标签库
fmt标签是格式化标签,比如日期,国际化等等。在使用之前,需要导入标签库,
1,标签。
在以往我们想在jsp中打印日期的时候会这样去做:
Date date=new Date();
%>
这样可以打印一个日期,但是格式不是我们想要的,然后我们会想到使用SimpleDateFormat对象来格式化输出日期。
代码如下:
Date date=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-ddHH:ss:mm");
%>
这种方法确实可以,但是现在我们有更简单的方法实现,那就是标签,使用方法如下:
value属性就是将要格式化的日期对象,pattern属性用于指定具体格式