`

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
分享到:
评论

相关推荐

    struts1.3.jar

    Struts 1.3 是一个历史悠久的Java Web应用程序框架,由Apache软件基金会开发。这个"struts1.3.jar"文件是Struts 1.3版本的核心库,它集成了框架的各种组件,使得开发者能够构建基于Model-View-Controller (MVC)设计...

    struts1.3用户指南

    9. **国际化与本地化**:Struts1.3支持多语言环境,通过资源包(properties文件)可以轻松实现应用的国际化。 10. **ActionServlet**:作为Struts1.3的核心组件,ActionServlet负责拦截HTTP请求,根据配置文件将...

    struts1.3 入门级例子

    7. **国际化与本地化**: Struts1.3支持多语言环境,可以在Struts-config.xml中配置资源文件,根据用户浏览器的设置提供相应的文本内容。 8. **错误与异常处理**: 通过在Struts-config.xml中定义全局异常处理,可以...

    struts1.3 jar包

    Struts1.3 jar包是Apache软件基金会的Jakarta Struts项目中的一个核心组件,它是一个基于MVC(Model-View-Controller)设计模式的Java Web应用框架。这个框架极大地简化了开发人员在构建动态、数据驱动的Web应用程序...

    struts是1.3API

    Struts 1.3 API 是一个用于构建基于Java的企业级Web应用程序的重要框架。这个API文档是开发者学习和理解Struts框架核心功能的关键资源,虽然它提供了英文版本,但其丰富的信息对于深入理解Struts的工作原理至关重要...

    struts1.3+spring3.0+hibernate3.3简单项目示例

    Struts1.3是Apache软件基金会下的一个开源MVC(模型-视图-控制器)框架,用于构建基于Java Servlet的Web应用。它提供了良好的架构模式,使得开发者可以将业务逻辑、控制流和表示层分离。在Struts1.3中,ActionForm...

    Struts1.3API

    API文档(Struts1.3.chm)通常包含了框架的所有核心组件、接口、类以及方法的详细说明,是开发者理解和使用Struts1.3的关键资源。以下是Struts1.3 API中的一些重要知识点: 1. **ActionServlet**:这是Struts框架的...

    struts1.3jar包

    struts1.3jar包

    Struts1.3+Spring4.x+Hibernate4.x框架整合实现对书籍的增删改查(含分页)

    在本项目中,Struts1.3的动作类(Action)会接收到前端发来的请求,然后调用业务逻辑层(Service)的方法,处理完业务后,再返回相应的结果到JSP页面展示。 Spring4.x则是一个全面的轻量级应用框架,它提供了依赖...

    配置 struts1.3

    Struts 1.3 是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,由Apache软件基金会开发并维护。这个框架为开发者提供了一种组织和控制Web应用程序的方式,使得代码更加结构化,易于维护。在本文中,...

    struts1.3实现的Validator简单验证

    Struts1.3是Apache Struts框架的一个版本,它是一个基于MVC(Model-View-Controller)设计模式的Java Web应用程序开发框架。Validator是Struts框架中的一个关键组件,用于处理用户输入验证,确保数据的有效性和一致...

    学习Struts1.3的相关jar包和API

    Struts1.3是Apache软件基金会的Jakarta项目下的一个开源框架,主要用于构建基于Java的Web应用程序。这个框架提供了一种结构化的应用开发方式,它将业务逻辑、控制流程和表现层进行了分离,使得开发过程更为高效且...

    Struts1.3全部架包

    Struts1.3的全部架包,非常全,包含:struts-core-1.3.10.jar,struts-tiles-1.3.10.jar,struts-taglib-1.3.10.jar,struts-faces-1.3.10.jar,struts-extras-1.3.10.jar........

    Ibatis2.3+Struts1.3+Spring2.5 整合实例代码

    本示例代码涉及的是一个经典的技术栈:Ibatis2.3、Struts1.3和Spring2.5的整合。这三个框架各自都有其独特的功能和优点,组合在一起能够提供灵活的数据访问、高效的MVC架构以及全面的应用管理。 Ibatis,作为一款轻...

    Struts1.3+2.0+Hibernate3.1+Spring3.1全套API及教程

    内含Struts1.3 API、Struts2.0 API、Struts1.3标签、Hibernate3.1教程、Hibernate3.1API、Spring3.0 API、Spring3.1API。SSH应有尽有,API均是CHM格式,方便使用。教程为pdf格式。

    struts1.3 api文档

    Struts 1.3 API 文档是 Apache Struts 框架的一个重要组成部分,它为开发者提供了详尽的函数库接口、类和方法的参考信息。这个框架是用于构建基于模型-视图-控制器(MVC)架构的 Java Web 应用程序。API 文档通常以 ...

    Struts1.3 api函数

    7. **Interceptor拦截器**:Struts1.3引入了拦截器的概念,它们在Action调用前后执行,提供了一种扩展框架功能的方式,如日志记录、权限检查等。 8. **Validator验证框架**:Struts1.3包含了内置的验证框架,用于...

    Struts1.3源代码

    6. **国际化与本地化**:Struts1.3支持多语言环境,通过资源包(Properties文件)管理不同语言的文本,可以根据用户的浏览器设置动态切换。 7. **Exception Handling**:框架提供了统一的异常处理机制,可以捕获和...

    struts1.3页面跳转问题

    Struts1.3是一个经典的Java Web框架,用于构建企业级应用程序。在Struts1.3中,页面跳转是常见的需求,它涉及到Action类、配置文件(struts-config.xml)以及JSP页面间的交互。本篇文章将深入探讨Struts1.3中的页面...

Global site tag (gtag.js) - Google Analytics