浅谈JSP之JSTL
【摘要】 简介JSTL的英文全称是JavaServer Pages Standard Tag Library,中文全称是JSP标准标识库。JSTL技术标准是由JCP(lava Community Process)组织的JSR052专家组发布,Apache组织将其列入Jakarta项目,Sun公司将JSTL的程序包加入互联网服务开发工具包内(Web Services Developer Pack(WSD...
简介
JSTL的英文全称是JavaServer Pages Standard Tag Library,中文全称是JSP标准标识库。JSTL技术标准是由JCP(lava Community Process)组织的JSR052专家组发布,Apache组织将其列入Jakarta项目,Sun公司将JSTL的程序包加入互联网服务开发工具包内(Web Services Developer Pack(WSDP)),作为JSP技术应用的一个标准。
JSTL标签是基于JSP页面的,这些标签可以插入在JSP代码中,本质上JSTL也是提前定义好的一组标签,这些标签封装了不同的功能,在页面上调用标签时,就等于调用了封装起来的功能。JSTL的目标是简化JSP页面的设计。对于页面设计人员来说,使用脚本语言操作动态数据是比较困难的,而采用标签和表达式语言则相对容易,JSTL的使用为页面设计人员和程序开发人员的分工协作提供了便利。
JSTL标识库的作用是减少JSP文件的Java代码,使Java代码与HTML代码分离,所以JSTL标识库符合MVC设计理念。MVC设计理念的优势是将动作控制、数据处理、结果显示三者分离。
主要组成
JSTL包含了和以下操作相关的标签:
1、核心标签:核心标签库是整个JSTL中最常用的部分,主要由以下几部分组成:基本输入输出、流程控制、迭代操作和URL操作。负责Web应用的常见工作,如:循环、表达式赋值、基本输入输出等。
2、I18N格式标签库:用来格式化显示数据的工作如:对不同区域的日期格式化等。
3、XML标签库:用来访问XML文件的工作,支持JSP对XML文档的处理。
4、数据库标签库:SQL标签库包括了大部分访问数据库的逻辑操作,包括查询、更新、事务处理、设置数据源等。可以做访问数据库的工作。
5、函数标签库:用来读取已经定义的某个函数。
优点
1、简化了JSP和Web应用程序的开发。
2、在应用程序服务器之间提供了一致的接口,最大限度地提高了Web应用在各应用服务器之间的移植。
3、允许JSP设计工具与Web应用程序开发的进一步集成。相信不久就会有支持JSTL的IDE开发工具出现。
4、以一种统一的方式减少了JSP中的Scriptlets代码数量,可以达到程序中没有任何Scriptlest代码。
JSTL封装了JSP开发中的常用功能。比如说,在没有JSTL时,通过Scriptlets来迭代输出某个List(Set),有了JSTL,就可以使用它的一系列的Tag进行迭代输出。由于JSTL是JSP2.0规范的一部分,所以最新的Web容器都会支持它。
使用条件
在JSP中使用JSTL标签需要具备如下两个条件。
条件一:要在JSP页面中使用JSTL标签,需使用taglib指令引用标签库。
条件二:要在JSP中使用JSTL标签,还需要下载安装JSTL实现(Implementation)。
JSTL1.2实现的下载地址为:https:jstl.dev.java.net,下载文件为jstl-impl-1.2.jar,将该文件复制到Web应用程序的WEB-INFlib文件夹中即可使用JSTL。
JSTL1.0实现的下载地址为:http://www.apache.org/dist/jakarta/taglibs/standard/,Windows用户下载jakarta-taglibs-standard-current.zip。下载后解压,在lib文件夹中有两个文件:
·jstl.jar;
·standard.jar.

将这两个文件复制到Web应用程序的WEB-INFlib文件夹中即可使用JSTL 。
一般来说,引入格式如下:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
我这里使用的是老版本的jstl1.0,下面让我们使用jstl的几个核心标签来进行具体的演示:
核心标签
c:out
<c:out>标签用来显示一个表达式的结果,与<%= %>作用相似,它们的区别就是<c:out>标签可以直接通过"."操作符来访问属性。
语法格式<c:out value="<string>" default="<string>" escapeXml="<true|false>"/>
参数:value:要输出的内容值 default:输出的默认值 escapeXml:是否忽略xml特殊字符
注意:<c:out>标签会自动忽略XML标记字符,所以它们不会被当做标签来处理。
下面写个小例子来说明下:
<c:out value="JSTL核心库out标签显示内容"></c:out>
<br>
<c:out value="<a href = 'http://www.baidu.com/'>点击跳转百度</a>"></c:out>
<br>
<c:out value="<a href = 'http://www.baidu.com/'>点击跳转百度</a>" escapeXml="false"></c:out>
<%-- 如果value的值为空,显示默认值里的内容--%>
<c:out value="${null}" default="value值为null"></c:out>
看着上面代码,不妨在大脑里构思一下结果,第一个会输出value 的所有值,第二个因为escapexml默认为true,所以忽略了a标签,不会进行转义,第三个会转义a标签,第四个因为value的值用el表达式绑定的是null值,所以默认输出的是default的值
run一下,看看效果:
c:set
<c:set>标签用于设置变量值和对象属性。
<c:set>标签就是<jsp:setProperty>行为标签的孪生兄弟。
这个标签之所以很有用呢,是因为它会计算表达式的值,然后使用计算结果来设置 JavaBean 对象或 java.util.Map 对象的值。
语法格式:
<c:set
var="<string>"
value="<string>"
target="<string>"
property="<string>"
scope="<string>"/>
参数含义:scope的默认值为page
注意:如果指定了target属性,那么property属性也需要被指定。
举例:
先引入JSTL标签库,引入了一个javabean对象Person
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<jsp:useBean id="person" class="com.hbnu.EL.Person" />
public class Person {
private String username;
private int age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
<h4>将数据保存到page域中<c:set value="生如夏花" var="username" scope="page" /></h4>
<h4>从page域中获取数据:${username}</h4>
<%-- pageScope.username--%>
<hr>
<h4>将数据保存到request域中<c:set value="18" var="age" scope="request" /></h4>
<h4>从request域中获取数据:${age}</h4>
<hr>
<h4>将数据保存到seesion域中<c:set value="湖北武汉" var="address" scope="session" /></h4>
<h4>从seesion域中获取数据:${address}</h4>
<hr>
<h4>将数据保存到application域中<c:set value="男" var="sex" scope="application" /></h4>
<h4>从application域中获取数据:${sex}</h4>
<h4>${username} ${age} ${sex} ${address}</h4>
<hr>
<h4>将数据保存到JavaBean对象中<c:set value="冲击之刃" target="${person}" property="username" /> </h4>
<h4>从JavaBean对象中获取数据:${person.username}</h4>
<%
Map map =new HashMap();
request.setAttribute("mapkey",map);
%>
<c:set property="data" value="yang" target="${mapkey}"></c:set>
<h4>从map对象里获取数据:${mapkey.data}</h4>
这里我示例了四个范围:page,request,seesion,application和javabean、map,通过c:set保存值,然后通过el表达式取值
c:choose和c:when、c:otherwise
<c:choose>标签与Java switch语句的功能一样,用于在众多选项中做出选择,本身只当做<c:when>和<c:otherwise>的父标签。
switch语句中有case,而<c:choose>标签中对应有<c:when>,switch语句中有default,而<c:choose>标签中有<c:otherwise>。
<c:set var ="score" value="95"></c:set>
<c:choose>
<c:when test="${score>=90}">
<c:out value="你是最胖的!"></c:out>
</c:when>
<c:when test="${score<90&&score>=70}">
<c:out value="良好"></c:out>
</c:when>
<c:when test="${score<70&&score>=60}">
<c:out value="及格"></c:out>
</c:when>
<c:otherwise>
<c:out value="你remake吧!"></c:out>
</c:otherwise>
</c:choose>
c:if
<c:if>标签判断表达式的值,如果表达式的值为 true 则执行其主体内容。
<c:if test="<boolean>" var="<string>" scope="<string>">
...
</c:if>
scope的默认值为page
举例:判断输入框是否为admin ,是就输出欢迎登录
<form action="#" method="post">
<input type="text" name="username" value="${param.username}" placeholder="请输入用户名">
<input type="submit" value="提交">
</form>
<c:if test="${param.username=='admin'}" var="result">
<c:out value="欢迎登陆!!!"></c:out>
</c:if>
<br>
if条件判断结果:${result}
c:foreach
<c:forEach>标签是更加通用的标签,因为它迭代一个集合中的对象。
语法:
<c:forEach
items="<object>"
begin="<int>"
end="<int>"
step="<int>"
var="<string>"
varStatus="<string>">
<%
List<String> list =new ArrayList<>();
list.add("element1");
list.add("element2");
list.add("element3");
list.add("element4");
list.add("element5");
request.setAttribute("list",list);
%>
<h5>不指定begin、end遍历集合</h5>
<c:forEach var="element" items="${list}">
<c:out value="${element}"></c:out>
</c:forEach>
<h5>指定begin、end、step</h5>
<c:forEach var="item" items="${list}" begin="1" end="4" step="2">
<c:out value="${item}"></c:out>
</c:forEach>
以上关于JSTL的常用核心标签基础就介绍到这里了
总结:
这里从JSTL的简介、组成、特点、使用条件和常用核心标签进行一一举例介绍,如有不足之处,欢迎指正!
感恩能与大家在华为云遇见!希望能与大家一起在华为云社区共同成长。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)