原因:
最近我的SSH老项目使用的编码格式还是GBK,经常有反应说不支持生僻字。那咋办,升级呗,果断把项目中的GBK修改为了UTF-8。
升级编码思路:
1、在web.xml中有编码拦截器,这个首当其冲要修改的。
2、jsp文件格式都是GBK的,需要升级UTF-8,这么多文件能不能统一管理编码,不能把所有jsp页面中的
<%@ page contentType="text/html; charset=GBK" pageEncoding="GBK" language="java" %>
// 第一想法是把上面的代码直接修改为:
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" language="java" %>
// 后来又要求,这个系统能随时修改编码格式,咋办!!!
// 所有我做了以下试验,结果都失败;重点!!! 下面的代码是错误,不要尝试;
// 定义常量类文件:MyChar.java
package com.dali.common;
public class MyChar{
public static final String CHARSET = "UTF-8";
}
// 于是修改jsp的page指令中的编码格式
<%@ page contentType="text/html; charset=<%=com.dali.common.MyChar%>" pageEncoding="<%=com.dali.common.MyChar%>" language="java" %>
// 结果运行失败了,编码解析错误
// 再经过其他方案都是无效的,说明page指令不能这么修改的。放弃该方案吧,在想其他的。
// 后来查看jsp编译的***_jsp.java文件后,突发奇想如下:
// 经查看***—jsp.java文件内如:
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
JspFactory _jspxFactory = null;
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
try {
_jspxFactory = JspFactory.getDefaultFactory();
response.setContentType("text/html;charset=GBK");//重点是这个地方,如果我可以重写会怎么样?于是我尝试怎么重写。
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
以下代码省略**************
}
//我经过多次尝试后,发下可以使用下面代码替换
把:<%@ page contentType="text/html; charset=GBK" pageEncoding="GBK" language="java" %>
替换为:
<%
request.setCharacterEncoding(com.dali.common.MyChar);
response.setContentType("text/html; charset="+ com.dali.common.MyChar);
response.setCharacterEncoding(com.dali.common.MyChar);
%>
//再去查看***_jsp.java
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
JspFactory _jspxFactory = null;
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
try {
_jspxFactory = JspFactory.getDefaultFactory();
response.setContentType("text/html;charset=GBK");//重点是这个地方,如果我可以重写会怎么样?于是我尝试怎么重写。
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("rnrnrnrn");
request.setCharacterEncoding(com.dali.common.MyChar);
response.setContentType("text/html; charset="+com.dali.common.MyChar);
response.setCharacterEncoding(com.dali.common.MyChar);
以下代码省略**************
}
上面终于解决了通过常量来,继续优化,怎么方便把下面代码写一遍,其他jsp文件引用就行了。
于是找了关于
// 新增commonChar.jsp 内容如下:
<%
request.setCharacterEncoding(com.dali.common.MyChar);
response.setContentType("text/html; charset="+ com.dali.common.MyChar);
response.setCharacterEncoding(com.dali.common.MyChar);
%>
// 在***.jsp中把
<%@ page contentType="text/html; charset=GBK" pageEncoding="GBK" language="java" %>
// 替换为
<%@ include file="/common/charset.jsp"%>
!!!!!! 此处不要以为解决完了,还没有呢,结果发现运行的时候,在jsp页面中的中文内容,在编译后乱码了,我的天啊,咋回事呢,
经多次测试发现:
// 经查看这样编辑后的***_jsp.java 发现中文确实是乱码的。
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
以上代码省略**************
out.write("'; //?????????????ywlxdmrn var isGroup = '");
以下代码省略**************
}
// 然后就在***.jsp页面中增加了
<%@ page pageEncoding="GBK" %>
// 在查看编辑后的***_jsp.java
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
以上代码省略**************
out.write("'; //这是中文测试代码内容rn var isGroup = '");
以下代码省略**************
}
这时我再向,能不能通过什么配置,不用在每个jsp页面增加
<%@ page pageEncoding="GBK" %>
于是搜索好多资料终于找到了
是让在web.xml中增加以下代码:
*.jsp GBK
后来发现不生效,那很奇怪啊,人家说的应该没有问题。
再去查资料,才发现:jsp-property-group 是要求web.xml 2.4版本以上才支持的。什么是web.xml 2.4呢,资料大致是这样的:
web.xml v2.3
XXXXXXX应用
web.xml v2.4
XXXXXXX应用
web.xml v2.5
XXXXXXX应用
web.xml v3.0
XXXXXXX应用
以上不同的版本,对jdk版本的要求和jsp-api.jar版本不同。
web.xml v2.4 要求:jdk版本1.5及以上(再低的版本没有试过),jsp-api中的jsp_2_0.xsd 的
其他的可以咋IDEA中,一个个都能试。
jsp-property-group 要求最低的jsp_2_0.xsd是满足的。
所以此处需要更新web.xml,把web.xml升级2.4即可。
----------------- 完结 --------------------



