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()をやっているってことは毎回リソースを取得しているのだろうか。読み間違い?