全国咨询/投诉热线:400-618-4000

JAVA培训之pageEncoding与contentType的区别

更新时间:2016年09月21日17时53分 来源:传智播客JAVA培训学院 浏览次数:

1.JSP指令

JSP中有三大指令,分别是以下三个:
  • page
  • include
  • taglib
其中这三个指令中,page是最复杂的,后面我们会详细讲解;include指令表示静态包含,我们之前学习的请求包含属于动态包含;taglib指令是用来导入标签库,后面会学习一些标签库,在这里只做简单介绍。
JSP指令的格式如下:
<%@指令名 attr1=”” attr2=””%>
其中attr1和attr2表示指令中的属性,通常我们将JSP指令写在JSP文件的的最上方,但是这不是必须的。
在JSP文件中,任何指令都是可以重复的,例如在一个jsp页面中可以存在三个page指令:
  • <%@ page language=”java”%>
  • <%@ page import=”java.util.*”%>
  • <%@ page pageEncoding=”utf-8”%>

2.page指令

page指令是最常用的指令,也是属性最多的指令。并且它的这些属性都是可选的属性而不是必须的属性,例如<%@page%>,没有给出任何属性也是可以的。
2.1pageEncoding属性
在jsp文件中有如下page指令:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
其中pageEncoding属性的值是UTF-8,该属性的作用是:指定当前jsp页面的编码。这个编码是给服务器看的,服务器需要知道当前页面的编码,否则服务器无法正确的把jsp翻译成Java文件。所以说这个编码只要和页面的真实编码保持一致,在浏览器端就不会出现乱码。可以通过在myeclipse中,在jsp文件上点击右键,选择【Properties】选项查看和设置当前页面的真实编码。例如:
(1)在一个web工程中,当前index.jsp页面的真实编码是utf-8,如图1-1所示:

图1-1 页面编码
(2)图1-1中,index.jsp页面的真实编码是utf-8,现在在index.jsp页面中写入中文“我是不是乱码”,然后将页面的page指令中的pageEncoding属性的值设置为“gbk”,如图1-2所示:

图1-2 index.jsp页面
(3)现在将该应用发布到服务器中,然后启动服务器,在浏览器端访问index.jsp页面,浏览器显示结果如图1-3所示:

图1-3 浏览器显示结果
由图1-3可知,浏览器端并没有出现乱码,但是页面的真实编码和pageEncoding的值不一致为什么没有出现乱码呢?下面我们再来查看index.jsp页面的真实编码,如图1-4所示:

图1-4 真实编码
由图1-4可知,当我们改变了pageEncoding属性的值,页面的真实编码也会随之改变,所以一般情况下出现乱码不会是由pageEncoding属性的设置导致的,但是如果选择图1-4中的【Other】单选框,那么对pageEncoding进行设置就不会再使页面的真实编码随之改变了。默认情况下,page指令的pageEncoding的值是iso-8859-1,我们只需要将这个设置修改一下,那么以后新建的jsp文件中的pageEncoding的值就不再是iso-8859-1。
2.2contentType属性
在jsp文件中有如下指令:
<%@page language="java" import="java.util.*"  contentType="text/html; charset=ISO-8859-1"%>
其中contentType属性的作用等同于response.setContentType(“text/html;charset=ISO-8859-1”)的作用。response的setContentType()方法这里我们就不再多说,当我们在jsp文件中提供了contentType属性,那么jsp对应的java文件中就会存在response.setContentType(“text/html;charset=ISO-8859-1”)这句代码。
contentType属性的默认值就是“text/html; charset=ISO-8859-1”,但是我们知道iso-8859-1并不支持中文,所以我们需要将charset的值修改为“utf-8“。
2.3pageEncoding与contentType的区别与联系
pageEncoding与contentType都是page指令的属性,它们都是用来设置编码,有如下联系:
  • 如果这两个属性只提供了其中一个,那么没有提供的那个属性的编码值就是提供的这个属性的编码值,例如:在jsp页面中设置了contentType=”text/html;charset=utf-8”,那么没有设置的pageEncoding的值就为utf-8,反之亦然;
  • 如果两个属性都没有提供,那么两者的默认编码就是ISO-8859-1。
根据对这两个属性的讲解,它们有如下区别:
  • pageEncoding是设置当前页面的编码,该编码是给服务器看的,可以让服务器正确的将jsp文件翻译成Java文件;
  • contentType有两个作用:一是设置响应字符流的编码,二是设置Content-Type响应头,即通知浏览器使用什么编码方式解码响应信息。

本文版权归传智播客Java培训学院所有,欢迎转载,转载请注明作者出处。谢谢!
作者:传智播客Java培训学院
首发:http://www.itcast.cn/javaee