9.3.1 <c:out>标签
<c:out>标签用于向客户端输出文本内容。该标签的语法格式如下:
语法1:没有标签体的情况
<c:out value="value"
[escapeXml="{true|false}"]
[default="defaultValue"] />
语法2:有标签体的情况,使用标签体设置默认值
<c:out value="value" [escapeXml="{true|false}"]>
defaultValue
</c:out>
<c:out>标签的属性的详细说明如表9.2所示。
表9.2 <c:out>标签的属性
属性名 |
是否支持动态属性值 |
属性类型 |
属性描述 |
value |
true |
Object |
指定要输出的表达式。 |
escapeXML |
true |
boolean |
指定是否将特殊字符<,>,&,’,”转换成相应的字符实体编码再进行输出。默认值是true。 |
default |
true |
Object |
指定如果value属性值为null时输出的默认值。 |
如果value属性值是java.io.Reader对象实例,则<c:out>标签会使用Reader类的read方法读取Reader对象中的数据,每次读取4K字节,直到将Reader对象中的数据读完。如果value属性值是其他的对象,<c:out>标签会调用该对象的toString方法来获得要输出的文本内容。不管value属性值是Reader对象还是其他的对象,<c:out>标签都会将要输出的文本内容写到out对象中(JSP的隐含对象),实际上,这个out对象是通过pageContext对象获得的。从上面的描述可以看出,如果输出的文本内容较大时,使用Reader对象将会大大提高系统的性能。
在默认情况下(escapeXML属性值为true),<c:out>标签在输出文本内容时会将特殊字符<,>,&,’,”进行HTML编码转换。表9.3是这些特殊字符和相应的字符实体编码对照表。
表9.3 特殊字符转换对照表
特殊字符 |
字符实体编码 |
< |
< |
> |
> |
& |
& |
' |
' |
'' |
" |
如果将escapeXML属性值设为false,则<c:out>标签并不会对这些特殊字符进行转换,而是按着原样输出文本内容。
只有在value属性值为null时,才会输出default属性的值或<c:out>标签体的内容。如果未指定默认值,则输出空串。当value属性值不为null,即使default属性或<c:out>标签体即使有值,<c:out>标签也不会输出这些值。
value属性值为null,并不是指将value属性值直接设为null,如下面的代码所示:
<c:out value="null" default="abcd"/>
上面的代码输出的并不是“abcd”,而是“null”。如果要将value属性值设为null,需要使用JSP表达式或EL,代码如下:
<c:out value = "<%= null %>" default = "JSP表达式" />
<c:out value = "${null}" default = "EL" />
上面的两个<c:out>标签都会输出default属性的值。
要注意的是,default属性和<c:out>的标签体不能同时指定默认值(也就是说,default属性和标签体不能同时存在),否则<c:out>标签将抛出异常。
out.jsp是一个演示<c:out>标签的例子,代码如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
request.setAttribute("test", "在value属性值中使用EL");
String jspPath=application.getRealPath(request.getServletPath());
// 读取out.jsp文件的内容
java.io.Reader isr = new java.io.InputStreamReader(
new java.io.FileInputStream(jspPath), "UTF-8");
// 将Reader对象保存在request域中
request.setAttribute("reader", isr);
%>
<c:out value="输出文本内容:abcd" /><hr>
<c:out value="${null}" default = "输出默认值(EL)"/><hr>
<c:out value="<%= null %>" default = "输出默认值(JSP表达式)"/><hr>
<c:out value="${test}"/> <hr>
<!-- escapeXML属性值为true,进行编码转换 -->
<c:out value="${null}">
<input type = "text" name = "txtName"/>
</c:out>
<hr>
<!-- escapeXML属性值为false,未进行编码转换 -->
<c:out value="${null}" escapeXml="false">
<input type = "text" name = "txtName"/>
</c:out>
<hr>
<!-- 输出out.jsp文件的内容,进行编码转换 -->
<c:out value="${reader}" escapeXml="true"/>
在浏览器地址栏中输入如下的URL:
http://localhost:8080/demo/chapter9/out.jsp
浏览器显示的效果如图9.2所示。
图9.2 <c:out>标签的演示效果
使用<c:out>标签输出Reader对象时,如果要读取的文件内容使用了非西欧字符集编码(如UTF-8、GBK等),应使用InputStreamReader类的构造方法指定读取文件内容时所采用的字符集编码(应和要读取的文件内容的字符集编码保持一致)。在本例中由于out.jsp文件使用了UTF-8编码格式,因此,在读取out.jsp文件的内容时应指定UTF-8编码格式。如果读者使用如下的代码输出out.jsp文件的内容,将会输出乱码:
<%
String jspPath=application.getRealPath(request.getServletPath());
java.io.Reader fr = new java.io.FileReader(jspPath);
// 输出Reader对象使用的字符集编码,如果不是UTF-8,<c:out>标签将输出乱码
System.out.println(fr.getEncoding());
request.setAttribute("reader", fr);
%>