求处理含有占位符(Placeholder)的字符串的工具类库!

阿凡达哥 2011-12-27 08:03:54
本人想未来把自己的产品进行国际化,所以把程序给外部系统做出的所有提示信息都存放到文件messages.properties。
Example:
messages.properties

web.services.members.response.msg.notfound=\u5bf9\u4e0d\u8d77\uff0c\u6ca1\u6709\u53d1\u73b0\u4e0e[${username}]\u76f8\u5339\u914d\u7528\u6237\uff01
web.services.members.response.msg.found=\u5171\u627e\u5230\u4e0e[${username}]\u76f8\u5339\u914d\u7684\u7528\u6237${count}\u4e2a\uff01
web.services.members.response.msg.exception=\u670d\u52a1\u5668\u51fa\u73b0\u5f02\u5e38\uff0c\u8bf7\u7a0d\u540e\u518d\u8bd5\uff01
web.services.members.response.msg.error=\u670d\u52a1\u5668\u51fa\u73b0\u5185\u90e8\u9519\u8bef\uff01

messages.properties实际内容如下:
web.services.members.response.msg.notfound=没有发现与[${username}]相匹配用户!
web.services.members.response.msg.found=共找到与[${username}]相匹配的用户${count}个!
web.services.members.response.msg.exception=服务器出现异常,请稍后再试!
web.services.members.response.msg.error=服务器出现内部错误!

稍后,我新创建一个类MessageBundle:

package com.dongantech.eshop.web.util;

import java.util.*;
import java.io.*;

public class MessageBundle {
public static Properties PROPS = null ;

private Map bundle = null;

static {
InputStream propertiesInputStream = MessageBundle.class.getResourceAsStream("/messages.properties");
PROPS = new Properties();
try {
PROPS.load(propertiesInputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
public MessageBundle(){
bundle = new HashMap();
}
public void setBundle(Map theBundle){
bundle = theBundle;
}
public Map getBundle(){
return bundle ;
}
public String getMessage(String theMsgKey){
return (String)bundle.get(theMsgKey);
}
public void putIntoBundle(String theMsgKey){
String msgFrame = MessageBundle.PROPS.getProperty(theMsgKey);
bundle.put(theMsgKey,msgFrame);
}
}

这样,我的Servlet就自己去打包所需要的信息成一个MessageBundle对象,由于信息反馈对于系统来说是很频繁的活动,如果每一个这样的对象(Servlet)都包含一个MessageBundle对象,就会避免了多个Servlet间对某信息集合对象(使用单例模式方式)请求占用所带来的执行延时。

public class MemberManagerServlet extends HttpServlet{
public static final String MSG_KEY_NOT_FOUND = "web.services.members.response.msg.notfound" ;
public static final String MSG_KEY_FOUND = "web.services.members.response.msg.found" ;
public static final String MSG_KEY_EXCEPTION = "web.services.members.response.msg.exception" ;
public static final String MSG_KEY_ERROR = "web.services.members.response.msg.error" ;

private Map requestHandlers = null ;
private PageLocator pageLocator = null ;
private MessageBundle messageBundle = null ;

public MemberManagerServlet(){
requestHandlers = new HashMap();
pageLocator = new PageLocator();

pageLocator.registerPage(SimpleResponse.TYPE_FOUND,MemberManagerServlet.PAGE_FOUND );
pageLocator.registerPage(SimpleResponse.TYPE_NOT_FOUND,MemberManagerServlet.PAGE_NOT_FOUND);
pageLocator.registerPage(SimpleResponse.TYPE_EXCEPTION,MemberManagerServlet.PAGE_EXCEPTION);
pageLocator.registerPage(SimpleResponse.TYPE_ERROR,MemberManagerServlet.PAGE_ERROR);

messageBundle.putIntoBundle(MemberManagerServlet.MSG_KEY_NOT_FOUND);
messageBundle.putIntoBundle(MemberManagerServlet.MSG_KEY_FOUND);
messageBundle.putIntoBundle(MemberManagerServlet.MSG_KEY_EXCEPTION);
messageBundle.putIntoBundle(MemberManagerServlet.MSG_KEY_ERROR);
}
public void init(ServletConfig config){
try {
super.init(config);
} catch (ServletException e) {
e.printStackTrace();
}
}
public void doGet(HttpServletRequest httpReq,HttpServletResponse httpResp){
Response response = processRequest(httpReq,httpResp);
try {
deliver(response);
} catch (Exception e) {
e.printStackTrace();
}
}

public void doPost(HttpServletRequest httpReq,HttpServletResponse httpResp){
Response response = processRequest(httpReq,httpResp);
try {
deliver(response);
} catch (Exception e) {
e.printStackTrace();
}
}

public Response processRequest(HttpServletRequest httpReq,HttpServletResponse httpResp){
Response response = null ;
String handlerName = httpReq.getParameter("request");
RequestHandler handler = getHandler(handlerName);
Request request = buildRequest(httpReq);
try {
response = handler.process(request);
response.getContext().put("page",getPage(response.getType()));
} catch (Exception e) {
response = new SimpleResponse(SimpleResponse.TYPE_ERROR);
e.printStackTrace();
}
return response ;
}

}

接下来,我就不晓得使用什么工具类库(Util Lib)来处理含有占位符的字符串了。因为没有用过。大家帮我推荐个~谢谢!
不好意思,比较啰嗦~只想分享一下设计心得~
...全文
275 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
MessageFormat
阿凡达哥 2011-12-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 magong 的回复:]

楼主如果将占位符写成%d和%s之类的东西,就可以用String.format方法处理了
如:
String.format("共找到与[%s]相匹配的用户%d个!", "Tom", 5);//共找到与[Tom]相匹配的用户5个!
[/Quote]
每个占位符都有其语义的。使用%s及%d的话,可能手动编辑messages.properties的话会出现误编辑的情况!
阿凡达哥 2011-12-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 magong 的回复:]

楼主如果将占位符写成%d和%s之类的东西,就可以用String.format方法处理了
如:
String.format("共找到与[%s]相匹配的用户%d个!", "Tom", 5);//共找到与[Tom]相匹配的用户5个!
[/Quote]
哈哈。很多时候我是逆向思维来做事件的。我是先写messages.properties,才去想怎么去处理含点位符的方法!
结果发现,String的replace方法本来就可以完成。
到底是一年多没编过码了,什么什么的,都忘了~
阿凡达哥 2011-12-27
  • 打赏
  • 举报
回复
晕,真笨。String本来就有replace来完成!
magong 2011-12-27
  • 打赏
  • 举报
回复
楼主如果将占位符写成%d和%s之类的东西,就可以用String.format方法处理了
如:
String.format("共找到与[%s]相匹配的用户%d个!", "Tom", 5);//共找到与[Tom]相匹配的用户5个!
阿凡达哥 2011-12-27
  • 打赏
  • 举报
回复
好像String对象本来就有replace方法来完成。晕~
阿凡达哥 2011-12-27
  • 打赏
  • 举报
回复
好像String对象本来就有replace方法来完成。晕~
阿凡达哥 2011-12-27
  • 打赏
  • 举报
回复
好像String对象本来就有replace方法来完成。晕~

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧