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前缀
Corehttp://java.sun,com/jsp/jstl/corec
I18Nhttp://java.sun.com/jsp/jstl/fmtfmt
SQLhttp://java.sun.com/jsp/jstl/sqlsql
XMLhttp://java.sun.com/jsp/jstl/xmlxml
Functionshttp://java.sum.com/jsp/jstl/functionsfn

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表达式辨析

JSP学习-标准标签库

JSP标准标签库:JSTL

JSP标准标签库:JSTL

复习整理1:jsp标准标签库jstl

EL(表达式语言)与JSTL(JSP标准标签库)