JSP标准标签库
Posted shi_zi_183
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSP标准标签库相关的知识,希望对你有一定的参考价值。
JSP标准标签库
JSP中可以通过Java代码来获取信息,但是过多的Java代码会使JSP页面非常复杂。为此,Sun公司制定了一套标准标签库JSTL。
JSTL入门
什么是JSTL
从JSP1.1规范开始,JSP就支持使用自定义标签,使用自定义标签大大降低了JSP页面的复杂度,同时增强了代码的重用性。为此,许多Web应用厂商都定制了自身应用的标签库,然而同一功能的标签由不同的Web应用厂商制定可能是不同的,这就导致市面上出现了很多功能相同的标签,令网页制作者无从选择,为了解决这个问题,Sun公司制定了一套标准标签库(Java Server Pages Standard Tag Library),简称JSTL。
JSTL虽然被称为标准标签库,而实际上这个标签库是由5个不同功能的标签库共同组成的。在JSTL1.1规范中,为这5个标签库分别指定了不同的URI以及建议使用的前缀。
标签库 | 标签库的URI | 前缀 |
---|---|---|
Core | http://java.sun,com/jsp/jstl/core | c |
I18N | http://java.sun.com/jsp/jstl/fmt | fmt |
SQL | http://java.sun.com/jsp/jstl/sql | sql |
XML | http://java.sun.com/jsp/jstl/xml | xml |
Functions | http://java.sum.com/jsp/jstl/functions | fn |
1、Core
Core是一个核心标签库,它包括实现Web应用中通用操作的标签。例如,用于输出文本内容的<c:out>
标签、用于条件判断的<c:if>
标签、用于迭代循环的<c:forEach>
标签。
2、I18N
I18N是一个国际化/格式化标签库,它包括实现Web应用程序的国际化标签和格式化标签。例如,设置JSP页面的本地信息、设置JSP页面的时区、使日期按照本地格式显示等。
3、SQL
SQL是一个数据库标签库,它包括用于访问数据库和对数据库操作的标签。例如,从数据库中获取数据库连接、从数据库表中检索数据等。由于在软件分层开发模型中,JSP页面仅作为表示层,一般不会在JSP页面中直接操作数据库,因此JSTL中提供的这套标签库不经常用。
4、XML
XML是一个操作XML文档的标签库,它包括对XML文档中的数据进行操作的标签。例如,解析XML文件、输出XML文档中的内容、以及迭代处理XML文档中的元素。XML广泛应用于Web开发,使用XML标签库处理XML文档更加简单。
5、Functions
Functions是一个函数标签库,它提供了一套自定义EL函数,包括JSP页面制作者经常要用到的字符串操作。例如,提取字符串的子字符串、获取字符串的长度。
安装和测试JSTL
1、下载JSTL包
从apache网站下载JSTL的jar包。
http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/
解压可以看到lib文件夹下有两个jar文件
其中jstl.jar文件包含JSTL规范中定义的接口和相关类,standard.jar文件包含用于实现JSTL的.class文件以及JSTL中5个标签库描述符文件(TLD)
2、安装JSTL
将这两个文件复制到项目的WEB-INF下lib下
3、测试JSTL
test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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>Insert title here</title>
</head>
<body>
<c:out value="Hello World!"></c:out>
</body>
</html>
JSTL中的Core标签库
<c:out>标签
在JSP页面中,最常见的操作就是向页面输出一段文本信息,为此,Core标签库提供了一个<c:out>
标签,该该标签可以将一段文本内容或表达式的结果输出到客户端。如果<c:out>
标签输出的文本内容中包括需要进行转义的特殊字符,例如>,<,&,’,"等,<c:out>
标签会默认对它们进行HTML编码转换后再输出。
<c:out>
有两种语法
语法1:没有标签体的情况
<c:out value="value" [default="defaultValue"] [escapeXml="{true|falue}"]/>
语法2:有标签体的情况,在标签体中指定输出的默认值。
<c:out value="value" [escapeXml="{true|falue}"]>
defaultValue
</c:out>
1)value属性用于指定输出的文本内容
2)default属性用于指定当value属性为null时所输出的默认值,该属性是可选的(方括号中的属性都是可选的)。
3)escapeXml属性用于指定是否将>,<,&,’,"等特殊字符进行HTML编码转换后再输出,默认值为true。需要注意的是,只有当value属性值为null时,<c:out>
标签才会输出默认值,如果指定默认值,则默认值输出空字符串。
1、使用<c:out>标签输出默认值
使用<c:out>
标签输出默认值有两种方式,一是通过使用<c:out>
标签地default属性输出默认值,二是通过使用<c:out>
标签地标签体输出默认值。
c_out1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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>Insert title here</title>
</head>
<body>
username属性值为:
<c:out value="${param.username }" default="unknown"/><br>
username属性值为:
<c:out value="${param.username }">
unknown
</c:out>
</body>
</html>
因为参数中没有username属性所有输出了默认值
get传递username
2、使用<c:out>标签的escapeXml属性对特殊字符进行转义
c_out2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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>Insert title here</title>
</head>
<body>
<c:out value="${param.username }" escapeXml="false">
<meta http-equiv="refresh" content="0;url=http://www.baidu.com"/>
</c:out>
</body>
</html>
escapeXml的属性值设置是false,所以标签不会为特殊字符进行HTML转换。
将escapeXml的属性值设置是为true。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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>Insert title here</title>
</head>
<body>
<c:out value="${param.username }" escapeXml="true">
<meta http-equiv="refresh" content="0;url=http://www.baidu.com"/>
</c:out>
</body>
</html>
可以看到字符串被转换了。
value属性识别的相关实验
value中输出空字符串
<c:out value="" escapeXml="false">
1231
</c:out>
显示了空字符串,没有视为null
value中输出"null"字符串
显示了"null"字符串,没有视为null
value中是用EL表达式和字符串混合输出
<c:out value="${param.username} " escapeXml="false">
1231
</c:out>
EL表达式后增加一个空格,${param.username}获取到的是null,null与” “做字符串连接得到的是” “,不是null所有没有输出默认值。
value中使用<%=%>标签输出null
<c:out value="<%=null%>" escapeXml="false">
1231
</c:out>
输出了默认值。
value中的<%=%>
标签可以使用隐式对象。
<c:out value="<%= request.getParameter(\\"name\\")%>" escapeXml="false">
1231
</c:out>
观察jsp翻译的Servlet可以看到,当value值使用<%=%>
标签时,业务逻辑直接放在了”主函数“中(_jspService()中),而没有像value值为EL表达式或字符串时,”主函数“中调用自定义函数,在自定义函数中实现业务逻辑,这样的好处是可以使用原本JSP提供的JSP隐式对象。
value中使用<%=%>标签输出null并拼接字符串
<c:out value="<%=null%> " escapeXml="false">
1231
</c:out>
后接字符串报错。
<c:out value=" <%=null%>" escapeXml="false">
1231
</c:out>
前接字符串,视为字符串输出。
value中使用<% %>标签
<c:out value="<%int i=0;%>" escapeXml="false">
1231
</c:out>
视为字符串输出。
综上,<c:out>
的value的属性值只能识别EL表达式,和<%= %>
标签,且只有输出为null时才能输出默认值。
<c:set>标签
在程序开发时,通常需要设置一些属性信息,为了方便设置这些信息,Core标签库提供了一个<c:set>标签,该标签用于设置域对象属性的值,或者设置对象中用于存储数据的Map对象、JavaBean对象属性的值。标签有4种语法。
语法1:使用value属性设置域对象某个属性的值
<c:set value="value" var="varName" [scope="{page|request|session|application}"]/>
语法2:标签体设置指定域中某个属性的值
<c:set var="varName" [scope="{page|request|session|application}"]>
body content
</c:set>
语法3:使用value属性设置某个域对象属性的值
<c:set value="value" target="target" property="propertyName"/>
语法4:使用标签体设置某个域对象属性的值
<c:set target="target" property="propertyName">
body content
</c:set>
1)value属性用于设置属性的值
2)var属性用于指定要设置的域对象属性的名称
3)scope属性用于指定属性所在的域对象
4)target属性用于指定要指定要设置属性的对象,这个对象必须是JavaBean对象或Map对象
5)property属性用于指定要为当前对象设置属性名称(访问途径是JavaBean的setXxxx()方法)
1、使用<c:set>标签设置域对象中某个属性的值
c_set1.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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>Insert title here</title>
</head>
<body>
session域中username属性的值为:
<c:set var="userName" value="root" scope="session"/>
<c:out value="${userName }"/>
<hr/>
session域中bookname属性的值为:
<c:set var="bookName" scope="session">
Java web
</c:set>
<c:out value="${bookName }"/>
</body>
</html>
2、使用<c:set>标签设置UserBean对象和Map对象中某个属性的值
在使用<c:set>
标签设置UserBean对象中某个属性的值之前,需要先创建一个User.java程序,用于封装一个User对象
package JCTL;
public class User {
public String username;
public String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
c_set2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="JCTL.User,java.util.*"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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>Insert title here</title>
</head>
<body>
<jsp:useBean id="user" class="JCTL.User"/>
<c:set value="root" target="${user}" property="username"/>
User对象的username属性的值为:<c:out value="${user.username }"/><br>
<c:set value="123" target="${user}" property="password"/>
User对象的password属性的值为:<c:out value="${user.password }"/>
<hr>
<%
HashMap map=new HashMap();
request.setAttribute("preferences", map);
%>
<c:set target="${preferences}" property="color" value="green"/>
Map对象中color关键字的值为:<c:out value="${preferences.color }"/>
</body>
</html>
注:1、访问jsp之前一定要重新部署Web应用,虽然jsp修改不需要重新部署也可生效,但是User类需要重新编译,这个问题卡了半天,太冤了!
2、一个<c:set>
标签不能同时设置servlet域对象和自定义域对象设置值。
当同时设置时
<jsp:useBean id="user" class="JCTL.User"/>
<c:set var="username" value="root" target="${user}" property="username"/>
User对象的username属性的值为:<c:out value="${user.username }"/><br>
默认page域中的username属性的值:${username},${pageScope.username }
可以看到set忽略了对User对象的username属性进行设置。
3、当value的值设置为null时,会将原本的属性删除。
<jsp:useBean id="user" class="JCTL.User"/>
<c:set var="username" scope="session" value="root"/>
<c:set var="username" scope="session" value="<%=null %>"/>
User对象的username属性的值为:
<c:out value="${user.username }">
默认值
</c:out><br>
可以看到默认值被输出了。
<c:remove>标签
要在JSP页面中删除域对象中的属性,就需要使用Core标签库提供的<c:remove>
标签。
<c:remove var="varName" [scope="{page|request|session|application}"]/>
1)var属性用于指定要删除的属性名称
2)scope属性用于指定要删除属性所属的域对象,它们的值都不能接收动态值。实际上,<c:reomve>
标签与<c:set>
标签将value属性的值设置为null的作用是相同的。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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>Insert title here</title>
</head>
<body>
<c:set value="root" var="username" scope="session"/>
username:<c:out value="${username }"/><hr>
<c:remove var="username"/>
username:<c:out value="${username }"/><hr>
</body>
</html>
注:当<c:remove>
标签不设置scope时会删除page、request、session中所有符合属性名的属性。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!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>Insert title here</title>
</head>
<body>
<c:set value="root1" var="username" scope="page"/>
<c:set value="root2" var="username" scope="request"/>
<c:set value="root3" var="username" scope="session"/>
<c:set valueJSP标签语法JSTL标签库EL表达式辨析