在网上找了一下资料,很多文章推荐使用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(...));
.....
总结:如果是团队开发,修改资源文件的加载类,只需要做一次就可以让团队开发人员省却重复的工作。
分享到:
相关推荐
Struts 1.3 是一个历史悠久的Java Web应用程序框架,由Apache软件基金会开发。这个"struts1.3.jar"文件是Struts 1.3版本的核心库,它集成了框架的各种组件,使得开发者能够构建基于Model-View-Controller (MVC)设计...
9. **国际化与本地化**:Struts1.3支持多语言环境,通过资源包(properties文件)可以轻松实现应用的国际化。 10. **ActionServlet**:作为Struts1.3的核心组件,ActionServlet负责拦截HTTP请求,根据配置文件将...
7. **国际化与本地化**: Struts1.3支持多语言环境,可以在Struts-config.xml中配置资源文件,根据用户浏览器的设置提供相应的文本内容。 8. **错误与异常处理**: 通过在Struts-config.xml中定义全局异常处理,可以...
Struts1.3 jar包是Apache软件基金会的Jakarta Struts项目中的一个核心组件,它是一个基于MVC(Model-View-Controller)设计模式的Java Web应用框架。这个框架极大地简化了开发人员在构建动态、数据驱动的Web应用程序...
Struts 1.3 API 是一个用于构建基于Java的企业级Web应用程序的重要框架。这个API文档是开发者学习和理解Struts框架核心功能的关键资源,虽然它提供了英文版本,但其丰富的信息对于深入理解Struts的工作原理至关重要...
Struts1.3是Apache软件基金会下的一个开源MVC(模型-视图-控制器)框架,用于构建基于Java Servlet的Web应用。它提供了良好的架构模式,使得开发者可以将业务逻辑、控制流和表示层分离。在Struts1.3中,ActionForm...
API文档(Struts1.3.chm)通常包含了框架的所有核心组件、接口、类以及方法的详细说明,是开发者理解和使用Struts1.3的关键资源。以下是Struts1.3 API中的一些重要知识点: 1. **ActionServlet**:这是Struts框架的...
struts1.3jar包
在本项目中,Struts1.3的动作类(Action)会接收到前端发来的请求,然后调用业务逻辑层(Service)的方法,处理完业务后,再返回相应的结果到JSP页面展示。 Spring4.x则是一个全面的轻量级应用框架,它提供了依赖...
Struts 1.3 是一个基于MVC(Model-View-Controller)设计模式的Java Web框架,由Apache软件基金会开发并维护。这个框架为开发者提供了一种组织和控制Web应用程序的方式,使得代码更加结构化,易于维护。在本文中,...
Struts1.3是Apache Struts框架的一个版本,它是一个基于MVC(Model-View-Controller)设计模式的Java Web应用程序开发框架。Validator是Struts框架中的一个关键组件,用于处理用户输入验证,确保数据的有效性和一致...
Struts1.3是Apache软件基金会的Jakarta项目下的一个开源框架,主要用于构建基于Java的Web应用程序。这个框架提供了一种结构化的应用开发方式,它将业务逻辑、控制流程和表现层进行了分离,使得开发过程更为高效且...
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的整合。这三个框架各自都有其独特的功能和优点,组合在一起能够提供灵活的数据访问、高效的MVC架构以及全面的应用管理。 Ibatis,作为一款轻...
内含Struts1.3 API、Struts2.0 API、Struts1.3标签、Hibernate3.1教程、Hibernate3.1API、Spring3.0 API、Spring3.1API。SSH应有尽有,API均是CHM格式,方便使用。教程为pdf格式。
Struts 1.3 API 文档是 Apache Struts 框架的一个重要组成部分,它为开发者提供了详尽的函数库接口、类和方法的参考信息。这个框架是用于构建基于模型-视图-控制器(MVC)架构的 Java Web 应用程序。API 文档通常以 ...
7. **Interceptor拦截器**:Struts1.3引入了拦截器的概念,它们在Action调用前后执行,提供了一种扩展框架功能的方式,如日志记录、权限检查等。 8. **Validator验证框架**:Struts1.3包含了内置的验证框架,用于...
6. **国际化与本地化**:Struts1.3支持多语言环境,通过资源包(Properties文件)管理不同语言的文本,可以根据用户的浏览器设置动态切换。 7. **Exception Handling**:框架提供了统一的异常处理机制,可以捕获和...
Struts1.3是一个经典的Java Web框架,用于构建企业级应用程序。在Struts1.3中,页面跳转是常见的需求,它涉及到Action类、配置文件(struts-config.xml)以及JSP页面间的交互。本篇文章将深入探讨Struts1.3中的页面...