struts の MessageResources

ActionServlet#protected void initModuleMessageResources(ModuleConfig config)でファクトリ経由でモジュールをServletContextに登録している。キーは「MessageResourcesConfig.key + ModuleConfig.getPrefix」



フレームワーク内では
org.apache.struts.validator.Resources に
public static MessageResources getMessageResources(ServletContext application) {
return (MessageResources) application.getAttribute(Globals.MESSAGES_KEY);
}

public static MessageResources getMessageResources(HttpServletRequest request) {
return (MessageResources) request.getAttribute(Globals.MESSAGES_KEY);
}
の定義があるのでこれ経由で取得可能。



validatorの初期化は
org.apache.struts.validator.Resources#initValidator
で行っている。


ValidatorResources と MessageResources の連携はどこでやってる?

org.apache.struts.action.Action#saveMessages(HttpServletRequest, ActionMessages) で
request.setAttribute(Globals.MESSAGE_KEY, messages);
がある。



org.apache.struts.taglib.html.MessagesTag
にmessageResource取得例あり。


this.application.getAttribute(Globals.MESSAGE_KEY);

org.apache.struts.action.Action.MESSAGE_KEY == Globals.MESSAGE_KEY
org.apache.struts.config.ConfigHelper
public ActionMessages getActionMessages() {
return (ActionMessages) this.application.getAttribute(Globals.MESSAGE_KEY);
}



org.apache.struts.util.RequestUtils#selectModuleで
request.setAttribute(Globals.MESSAGES_KEY, resources);
で登録しているよ。ServletContext に上記キーで登録されていたらrequestにも参照させてやるようだ。
で、org.apache.struts.action.ActionServlet#process(HttpServletRequest request,HttpServletResponse response)とかで
RequestUtils.selectModule(request, getServletContext());
やっているから、context内にあれば毎回リクエストに入る模様。

ActionServletを使用しない(strutsを組み込みで使用するとか?)だと
こーゆー初期化処理を自前でやればいいことになる。

org.apache.struts.action.ActionServlet で
initModuleMessageResources()によりメッセージリソースの初期化とサーブレットコンテキストへの登録を行っている。

org.apache.struts.util.MessageResources
MessageResources#getMessageResources(String config)
defaultFactory.createResources(config);
でconfigを初期化。

impl -> org.apache.struts.util.PropertyMessageResourcesFactory

最終的にメッセージの取得は
org.apache.struts.util.PropertyMessageResources#getMessage()に委譲される。
メッセージオブジェクトの構築は
org.apache.struts.util.PropertyMessageResources#loadLocale()でプロパティからメッセージを構築している。

getMessage()内でloadLocale()をやっているってことは毎回リソースを取得しているのだろうか。読み間違い?