`

struts1.3 读取资源文件乱码的另一种解决方法

阅读更多
在网上找了一下资料,很多文章推荐使用native2ascii命令。

个人觉得很不方便,因为开发过程中资源文件修改比较频繁,每次都要运行脚本。

用PropertiesEditor插件。

还是很不方便,每个开发客户端都要装,很麻烦。

另外,资源文件,特别是国际化的时候,通常开发人员都喜欢用UTF-8来编码,以方便修改。但调试的时候就会出问题。

解决办法思路:因为struts是使用Classloader.load(InputStream)来加载资源文件的。所以必须继承修改加载资源文件实现类org.apache.struts.util.PropertyMessageResources的loadLocale方法。第二,兼顾资源文件修改的方便性,最好使资源文件xml化。这样只要标准的xml IDE就可以方便修改,从根本上避免的字符集和IDE相关联的问题。而且可以利用JDK1.5的特性:Properties有一个loadFromXML(InputStream)方法可以方便加载。

解决办法:继承和修改资源文件加载相关的两个实现类:
com.yourcompany.struts.util.XMLPropertyMessageResources继承
org.apache.struts.util.PropertyMessageResources
package com.yourcompany.struts.util;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Iterator;
import java.util.Properties;

import org.apache.struts.util.MessageResourcesFactory;
import org.apache.struts.util.PropertyMessageResources;

public class XMLPropertyMessageResources extends PropertyMessageResources {

	/**
	 * 
	 */
	private static final long serialVersionUID = 3701712123553100102L;

	public XMLPropertyMessageResources(MessageResourcesFactory factory,
			String config, boolean returnNull) {
		super(factory, config, returnNull);
	}

	public XMLPropertyMessageResources(MessageResourcesFactory factory,
			String config) {
		super(factory, config);
	}

	@Override
	protected synchronized void loadLocale(String localeKey) {
		if (log.isTraceEnabled()) {
            log.trace("loadLocale(" + localeKey + ")");
        }

        // Have we already attempted to load messages for this locale?
        if (locales.get(localeKey) != null) {
            return;
        }

        locales.put(localeKey, localeKey);

        // Set up to load the property resource for this locale key, if we can
        String name = config.replace('.', '/');

        if (localeKey.length() > 0) {
            name += ("_" + localeKey);
        }

        name += ".xml";//此处修改官方代码,便于IDE环境编辑XML

        InputStream is = null;
        Properties props = new Properties();

        // Load the specified property resource
        if (log.isTraceEnabled()) {
            log.trace("  Loading resource '" + name + "'");
        }

        ClassLoader classLoader =
            Thread.currentThread().getContextClassLoader();

        if (classLoader == null) {
            classLoader = this.getClass().getClassLoader();
        }

        is = classLoader.getResourceAsStream(name);

        if (is != null) {
            try {
                props.loadFromXML(is);//此处修改官方代码,加载XML
            } catch (IOException e) {
                log.error("loadLocale()", e);
            } finally {
                try {
                    is.close();
                } catch (IOException e) {
                    log.error("loadLocale()", e);
                }
            }
            if (log.isTraceEnabled()) {
                log.trace("  Loading resource completed");
            }
        } else {
            if (log.isWarnEnabled()) {
                log.warn("  Resource "+name+" Not Found.");
            }
        }


        // Copy the corresponding values into our cache
        if (props.size() < 1) {
            return;
        }

        synchronized (messages) {
            Iterator names = props.keySet().iterator();

            while (names.hasNext()) {
                String key = (String) names.next();

                if (log.isTraceEnabled()) {
                    log.trace("  Saving message key '"
                        + messageKey(localeKey, key));
                }

                messages.put(messageKey(localeKey, key), props.getProperty(key));
            }
        }
	}
	
}


com.yourcompany.struts.util.XMLMessageResourcesFactory继承
org.apache.struts.util.PropertyMessageResourcesFactory
package com.yourcompany.struts.util;

import org.apache.struts.util.MessageResources;
import org.apache.struts.util.PropertyMessageResourcesFactory;

public class XMLMessageResourcesFactory extends PropertyMessageResourcesFactory {

	 public MessageResources createResources(String config) {
        XMLPropertyMessageResources messageResources =
               new XMLPropertyMessageResources(this, config, this.returnNull);//此处修改官方代码,使用修改后的资源加载类
        String mode = null;
        if (getConfig() != null) {
            mode = getConfig().getProperty("mode");
        }
        messageResources.setMode(mode);
        return messageResources;
    }
}



修改struts-config.xml的此行为:
<message-resources parameter="com.yourcompany.struts.message.ApplicationResources" factory="com.yourcompany.struts.util.XMLMessageResourcesFactory"/>


你的资源文件改为如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
	<comment>Resources for default
	</comment>
	<entry key="commons.validate.notnull">can't be empty</entry>
	
	<entry key="vo.Packageinfo.packageId">Package ID</entry>
	<entry key="vo.Packageinfo.packageAlias">Package Alias</entry>
	<entry key="vo.Packageinfo.packageName">Package Name</entry>
	<entry key="vo.Packageinfo.packagePrices">Package Prices</entry>
	<entry key="vo.Packageinfo.productLimit">Product Limit</entry>
	<entry key="vo.Packageinfotbl.description">Description</entry>
</properties>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
	<comment>Resources for zh_CN
	</comment>
	<entry key="commons.validate.notnull">不能为空</entry>
	
	<entry key="vo.Packageinfo.packageId">套餐ID</entry>
	<entry key="vo.Packageinfo.packageAlias">套餐别名</entry>
	<entry key="vo.Packageinfo.packageName">套餐名</entry>
	<entry key="vo.Packageinfo.packagePrices">套餐价格</entry>
	<entry key="vo.Packageinfo.productLimit">允许发布产品数量</entry>
	<entry key="vo.Packageinfo.description">描述信息</entry>
</properties>


如果已经有经过native2ascii转换过的资源文件的。可以使用一下代码转换:
Properties props = new Properties();
props.load(new FileInputStream(...));
props.storeToXml(new FileOutputStream(...));
.....


总结:如果是团队开发,修改资源文件的加载类,只需要做一次就可以让团队开发人员省却重复的工作。
2
0
分享到:
评论

相关推荐

    java教程我们上课用的

    - `&lt;jsp:forward&gt;`:转发到另一个资源。 - `&lt;jsp:param&gt;`:传递参数。 - **3.4.6 内置对象** - `out`:输出流对象,用于向客户端发送文本。 - `request`:封装客户端请求信息的对象。 - `response`:封装服务器...

    Java学习笔记-个人整理的

    {8.3}创建线程的两种方法}{123}{section.8.3} {8.4}Runnable}{123}{section.8.4} {8.5}Sleep阻塞与打断唤醒}{124}{section.8.5} {8.5.1}sleep与wait的差异}{124}{subsection.8.5.1} {8.6}IO阻塞}{126}{section....

    支持pyramid2.x的kotti web代码

    Kotti 是一个基于 Pyramid 框架的 Python 内容管理系统(CMS),适合用来搭建中小型网站、文档库、企业展示平台、知识库等需要灵活内容结构和权限模型的项目。它本身更像一个可以二次开发的 CMS 框架,比 WordPress、Drupal 这类“一装就用”的系统更倾向于开发者定制和扩展。 这是支持pyramid2.x版本的kotti! tar -xzvf kotti1.0.tar.gz 解压缩 进入目录执行 pip install -e . 来安装, 然后执行pserve app.ini 启动。 用浏览器浏览127.0.0.1:5000 即可浏览。 用户名admin ,口令qwerty

    cmd-bat-批处理-脚本-hello world.zip

    cmd-bat-批处理-脚本-hello world.zip

    知识付费系统自动采集V3.0 跳转不卡顿+搭建教程

    知识付费系统自动采集V3.0 跳转不卡顿+搭建教程,不和外面的一样跳转卡顿,这个跳转不卡顿,支持三级分销。

    基于Matlab实现图像形状纹理颜色特征提取

    在Matlab环境下,对图像进行特征提取时,主要涵盖形状、纹理以及颜色这三大关键特征。其中,对于纹理特征的提取,采用灰度梯度共生矩阵这一方法来实现。通过灰度梯度共生矩阵,可以有效地捕捉图像中像素灰度值之间在不同方向和距离上的相互关系,进而量化地反映出图像的纹理特性,为后续的图像分析、分类等任务提供重要的纹理信息依据。

    实证数据-2010-2023年上市公司-管理层情感语调数据-社科经管.rar

    该数据集为2010-2023年中国A股上市公司管理层情感语调的年度面板数据,覆盖45,320条样本,数据源自年报及半年报的"管理层讨论与分析"部分。通过构建中文金融情感词典(融合《知网情感分析用词典》与L&M金融词汇表),采用文本分析方法计算情感语调指标,包括:正面/负面词汇数量、文本相似度、情感语调1((积极词-消极词)/总词数)和情感语调2((积极词-消极词)/(积极词+消极词))。同时包含盈利预测偏差、审计意见类型等衍生指标,可用于研究信息披露质量、市场反应及代理问题。该数据复刻了《管理世界》《财经研究》等期刊的变量构建方法,被应用于分析语调操纵对债券市场的影响,学术常用度与稀缺度较高。

    cmd-bat-批处理-脚本-FTIME.zip

    cmd-bat-批处理-脚本-FTIME.zip

    1747829038637.png

    1747829038637.png

    2025年自动化X光检查机项目大数据研究报告.docx

    2025年自动化X光检查机项目大数据研究报告.docx

    基于Logisim的原码与补码一位乘法器设计

    在计算机组成原理课程设计中,我全程跟随老师的指导,独立完成了以下两项任务:一是利用Logisim软件进行原码一位乘法器的仿真设计,通过逐步搭建电路、配置逻辑单元,实现了原码乘法运算的完整流程,深入理解了原码乘法的原理和实现机制;二是完成了补码一位乘法器的Logisim仿真,同样按照老师讲解的步骤,精心设计电路,确保补码乘法运算的正确性,进一步掌握了补码乘法的运算规则和电路实现方法。通过这两个项目,我不仅巩固了理论知识,还提升了动手实践能力和逻辑思维能力。

    cmd-bat-批处理-脚本-msvc2017.zip

    cmd-bat-批处理-脚本-msvc2017.zip

    cmd-bat-批处理-脚本-virtualcam-install.zip

    cmd-bat-批处理-脚本-virtualcam-install.zip

    二十四节气之立秋介绍.pptx

    二十四节气之立秋介绍.pptx

    cmd-bat-批处理-脚本-shift.zip

    cmd-bat-批处理-脚本-shift.zip

    二十四节气之小雪介绍.pptx

    二十四节气之小雪介绍.pptx

    java、SpringBoot面试专题,6页面试题

    java、SpringBoot面试专题,6页面试题

    cmd-bat-批处理-脚本-GenerateUnionWinMD.zip

    cmd-bat-批处理-脚本-GenerateUnionWinMD.zip

    二十四节气之大暑节气.pptx

    二十四节气之大暑节气.pptx

    python实现五子棋游戏源码

    python实现五子棋游戏源码

Global site tag (gtag.js) - Google Analytics