9.3.1 <c:out>标签

优质
小牛编辑
153浏览
2023-12-01

<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 特殊字符转换对照表

特殊字符

字符实体编码

&lt;

&gt;

&

&amp;

'

'

''

"

如果将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所示。

02

图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);
%>