15193


springで、web.xmlの代わりにWebApplicationInitnializerを使用する方法があると思いますが、  
共通ヘッダを自動読み込みするための設定である

[code]

    <jsp-config>
    
[/code]

の設定方法がわかりません。

たとえばweb.xmlでは

[code]

    <jsp-config>
        <jsp-property-group>
            <url-pattern>*.jsp</url-pattern>
            <el-ignored>false</el-ignored>
            <page-encoding>UTF-8</page-encoding>
            <scripting-invalid>false</scripting-invalid>
            <include-prelude>/WEB-INF/view/header.jsp</include-prelude>
        </jsp-property-group>
    </jsp-config>
    
[/code]

と設定するところを、  
WebApplicationInitializerでは

[code]

    public void onStartup(ServletContext servletContext) throws ServletException  {
        JspConfigDescriptor jspConfigDescriptor = new JspConfigDescriptor() {
    
            public Collection<TaglibDescriptor> getTaglibs() {
                return null;
            }
    
            public Collection<JspPropertyGroupDescriptor> getJspPropertyGroups() {
                Collection<JspPropertyGroupDescriptor> propertyGroup = new ArrayList<JspPropertyGroupDescriptor>();
                JspPropertyGroupDescriptorImpl pgDescriptor = new JspPropertyGroupDescriptorImpl();
                pgDescriptor.setUrlPatterns(Arrays.asList("*.jsp"));
                pgDescriptor.setElIgnored(Boolean.FALSE.toString());
                pgDescriptor.setPageEncoding("UTF-8");
                pgDescriptor.setIncludePreludes(Arrays.asList("/WEB-INF/view/common.jsp"));
                propertyGroup.add(pgDescriptor);
                return propertyGroup;
            }
        };
        ((ServletContextHandler.Context)servletContext).setJspConfigDescriptor(jspConfigDescriptor);
    }
    
[/code]

という感じになると思います(JspPropertyGroupDescriptorImplは、JspPropertyGroupDescriptorを継承したゲッターセッタークラスを実装しました。)が

[code]

    ((ServletContextHandler.Context)servletContext).setJspConfigDescriptor(jspConfigDescriptor);
    
[/code]

は、jettyのservletライブラリでしか実装されていませんでした。  
本番ではtomcatで動かしたいのですが、同じServletContextを継承しているだけの別クラスはtomcat8から生成してくれないのか、フレームワークレベルでエラーが発生してしまいます。

何か解決方法はあるのでしょうか？


CC BY-SA 3.0
2015-09-01T15:54:27.430
15124
2015-09-03T09:29:01.673
8396
question
java spring tomcat
Springのweb.xml代替クラスでServletContextの初期化関数が用意されていない


結論としては、Tomcat8ではソースでJspConfigDescriptorをセットする方法はなさそうです。

TomcatにもServletContext実装クラスが`org.apache.catalina.core.StandardContext`オブジェクトを保持しており、`StandardContext#setJspConfigDescriptor(JspConfigDescriptor)`メソッドがあります。このメソッドを呼び出せれば、Jetty同様にJspConfigDescriptorオブジェクトをセットできるのですが、残念ながらTomcatが生成したStandardContextオブジェクトを取得する方法がなさそうです。

`WebApplicationInitializer#onStartup(ServletContext)`で引数として渡されるServletContextは、Tomcatでは`org.apache.catalina.core.ApplicationContextFacade`オブジェクトというServletContext実装クラスです。さらに、ApplicationContextFacadeはApplicationContextオブジェクトを保持しており、ApplicationContextがStandardContextオブジェクトを保持している構造なのですが、たとえ`ApplicationContextFacade#getContext(String)`しても、つねにApplicationContextFacadeオブジェクトが返されるだけでStandardContextオブジェクトまでたどり着けないのです…

  * JDK8
  * Tomcat 8.0.24


CC BY-SA 3.0
2015-09-03T09:29:01.673
15193
2015-09-03T09:29:01.673
4464
15124
answer