9.4.6 <fmt:requestEncoding>标签

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

<fmt:requestEncoding>标签用于设置请求消息的字符集编码。实际上,在该标签内部通过调用request.setCharacterEncoding来设置请求消息的字符集编码。<fmt:requestEncoding>标签的语法格式如下:

<fmt:requestEncoding [value="charsetName"]/>

其中value属性表示请求消息的字符集编码,该属性是String类型,并且支持动态属性值。

在使用<fmt:requestEncoding>标签时应注意如下几点:

1 <fmt:requestEncoding>标签和request.setCharacterEncoding方法一样,必须在获得任何请求参数之前调用。

2 如果未指定value属性,或value属性值为null,并且从HTTP请求消息头中Content-Type字段无法确定字符集编码,<fmt:requestEncoding>标签会在session域中查找属性名为javax.servlet.jsp.jstl.fmt.request.charset的属性值,如果session域中存在该属性,<fmt:requestEncoding>标签就会使用该属性值设置字符集编码。如果session域中不存在该属性,<fmt:requestEncoding>标签会采用ISO-8859-1字符集编码。

requestEncoding.jsp页面是一个使用<fmt:requestEncoding>标签设置HTTP请求消息的字符集编码的例子,代码如下:

<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<fmt:requestEncoding value="UTF-8"/>
${param.product}
<form method="post">
    商品:<input type="text" name="product"/><br>
  <input type="submit" value="提交" />
</form>

在浏览器地址栏中输入如下的URL:

http://localhost:8080/demo/chapter9/requestEncoding.jsp

在页面中的文本框中输入“自行车”,单击【提交】按钮,浏览器显示的结果如图9.24所示。

24

图9.24 使用<fmt:requestEncoding>标签设置HTTP请求消息的字符集编码


如果将requestEncoding.jsp页面中的<fmt:requestEncoding>标签注释掉,在文本框中输入“自行车”后,单击【提交】按钮,在页面中将会显示乱码。

如果读者使用的是Tomcat5.x及以后的版本,如果使用HTTP GET方法提交请求消息,Tomcat并不会考虑用户设置的HTTP请求消息的字符集编码,而只会采用ISO-8859-1字符集编码。因此,在这种情况下,通过<fmt:requestEncoding>标签或request.setCharacterRequest方法设置HTTP请求消息的字符集编码是没有任何意义的。要解决这种情况下的乱码问题,需要使用如下的代码:

String product = new String(request.getParameter("product").getBytes("ISO-8859-1"), "UTF-8");

读者可以将requestEncoding.jsp页面中<form>标签的method属性值改成“get”,看看会发生什么事情。