【JAVA项目GBK升级UTF-8】流浪记

【JAVA项目GBK升级UTF-8】流浪记,第1张

【JAVA项目GBK升级UTF-8】流浪记

原因:

        最近我的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文件引用就行了。

于是找了关于 和<@include>的使用与区别 相关内容。

// 新增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即可。

-----------------  完结  --------------------

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5563884.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-14

发表评论

登录后才能评论

评论列表(0条)

保存