web.xmlとは?
web.xmlは、JavaのWebアプリケーションにおけるデプロイメント記述子。
デプロイメント?
アプリケーションやシステムを実際に利用できる環境に配置・展開すること。
中に何を書くの?
主に
filter
servlet
error-page
jsp-config
session-config
などを設定する。
その前に、springでweb.xmlが使えるの?
springプロジェクトでは、web.xmlがあっても良いけど、最近のSpringアプリケーションでは、Java ConfigやSpring Bootの導入によりweb.xmlは不要。web.xmlを使わない設定方法が主流になっている。
主流に合わせたいので、
従来のweb.xmlの設定が必要な場合に、どうやってその内容をSpringに設定するか?を調べた。
私の環境はspring boot 2.7.18で、jspを使っている。
方法1:application.properties
例えば、
jspのサイズが大きすぎて、tomcatからjsp 65535 bytes limitsエラーが出た。
The code of method _jspService(HttpServletRequest, HttpServletResponse) is exceeding the 65535 bytes limit Stacktrace:
これの解決策としては、web.xmlに以下の設定をのinit-paramとして記載すること。
- genStringAsCharArray = true
- mappedFile = false
- trimSpaces = true
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>ここにgenStringAsCharArrayとかの設定名</param-name>
<param-value>ここに設定値</param-value>
</init-param>
しかし、私のプロジェクトにはweb.xmlがない。
なのでspringのapplication.propertiesで、同じ設定を1ラインで書くことが出来る。
server.servlet.jsp.init-parameters.ここにgenStringAsCharArrayとかの設定名 = ここに設定値
これで解決。
方法2:ConfigurableServletWebServerFactory
例えば、
全てのjspに自動で含まれる部品のjspを設定したい時。
これは従来のweb.xmlではこんな感じで設定できる。
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
...
<include-prelude>/WEB-INF/jsp/部品のjsp.jsp</include-prelude>
...
</jsp-property-group>
</jsp-config>
しかし、私のプロジェクトにはweb.xmlがない。
なのでspringでBeanを一個作って対応する。
@SpringBootApplicationタグが付いているクラスが対象。
...
@Bean
public ConfigurableServletWebServerFactory configurableServletWebServerFactory ( ) {
return new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
super.postProcessContext(context);
JspPropertyGroup jspPropertyGroup = new JspPropertyGroup();
jspPropertyGroup.addUrlPattern("*.jsp");
...
jspPropertyGroup.addIncludePrelude("/WEB-INF/jsp/base.jspf");
...
JspPropertyGroupDescriptorImpl jspPropertyGroupDescriptor = new JspPropertyGroupDescriptorImpl(jspPropertyGroup);
context.setJspConfigDescriptor(new JspConfigDescriptorImpl(Collections.singletonList(jspPropertyGroupDescriptor), Collections.emptyList()));
}
};
}
...
( ・。。・ )🖐
間違っている内容がありましたら、教えて頂ければ喜びます。