lastaflute / lasta-thymeleaf

Thymeleaf adapter for LastaFlute
Apache License 2.0
0 stars 1 forks source link

Jakarta support (as java21 version) #22

Open jflute opened 2 months ago

jflute commented 2 months ago

// Japanese here

*概要 JakartaサポートしたバージョンをJava21コンパイルでリリースする。 他のLastaFluteプロダクトと足並み合わせてやる。

*課題1

Jakarta対応するためには、Thymeleaf3に対応しないといけないんじゃない? いやぁ、やっぱりそうだよね(><

Thymeleaf 3.1 adds support for the new jakarta. class namespace in the Servlet API since version 5.0, without removing support for the javax. classes in previous versions.

https://www.thymeleaf.org/doc/articles/thymeleaf31whatsnew.html

Thymeleaf3対応は一度挫折しているので、これは厳しいかも...

すでにThymeleaf3対応してリリース済みだった、忘れてた(><

*課題2 でもどのみち、WebContextのコンストラクターの引数が変わっているので、3.1対応をしないといけない。

return new WebContext(request, response, servletContext, locale);

↑これが、IWebExchange 引数に変わっておる。 JakartaServletWebExchangeをnewすれば良いのだろうか?

*課題3 ServletContextTemplateResolverがjavax前提のクラスになっていて利用できない。 ITemplateResolverになる代わりのクラスを利用しないといけないかな?

WebApplicationTemplateResolverかな?

jflute commented 2 months ago

*課題2

JakartaServletWebExchangeをnewすれば良いのだろうか?

JakartaServletWebApplicationはnewできない。パッケージスコープで隠されている。 JakartaServletWebApplicationがnewしているが、このクラスのインスタンスは勝手にnewしていいのか?

お試し実装。果たしてこれでいいのか?

protected WebContext createTemplateContext(RequestManager requestManager) {
    final HttpServletRequest request = requestManager.getRequest();
    final HttpServletResponse response = requestManager.getResponseManager().getResponse();
    final ServletContext servletContext = request.getServletContext();
    final IServletWebExchange exchange = createWebExchange(request, response, servletContext);
    return newWebContext(exchange, requestManager.getUserLocale());
}

protected IServletWebExchange createWebExchange(HttpServletRequest request, HttpServletResponse response,
        ServletContext servletContext) {
    final JakartaServletWebApplication application = JakartaServletWebApplication.buildApplication(servletContext);
    return application.buildExchange(request, response);
}

protected WebContext newWebContext(IServletWebExchange exchange, Locale locale) {
    return new WebContext(exchange, locale);
}
jflute commented 2 months ago

*課題3

ITemplateResolverになる代わりのクラスを利用しないといけないかな? WebApplicationTemplateResolverかな?

これでいいのかな?

protected ITemplateResolver createTemplateResolver() {
    final WebApplicationTemplateResolver resolver = createWebApplicationTemplateResolver();
    resolver.setPrefix(getHtmlViewPrefix());
    resolver.setTemplateMode(getTemplateMode());
    resolver.setCharacterEncoding(getEncoding());
    resolver.setCacheable(isCacheable());
    return resolver;
}

protected WebApplicationTemplateResolver createWebApplicationTemplateResolver() {
    final ServletContext servletContext = LaServletContextUtil.getServletContext();
    final JakartaServletWebApplication webApplication = JakartaServletWebApplication.buildApplication(servletContext);
    return newWebApplicationTemplateResolver(webApplication);
}

protected WebApplicationTemplateResolver newWebApplicationTemplateResolver(IWebApplication webApplication) {
    return new WebApplicationTemplateResolver(webApplication);
}

JakartaServletWebApplicationをまたnewしてるけど、ただのラッパーっぽいから別にインスタンスを共有しなくても問題なさそうではある。