加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 如何从Thymeleaf模板访问库JAR文件中的样式表?

发布时间:2020-12-15 02:20:21 所属栏目:Java 来源:网络整理
导读:我有一组基于 Spring的 Java Web应用程序和一个通过JAR文件可用的公共框架库.我正在使用Thymeleaf来表达观点. 我有一个常见的Thymeleaf模板,由几个Web应用程序使用.模板HTML文件及其关联的样式表都在库JAR文件中.当Web应用程序基于框架模板显示视图时,Thymel
我有一组基于 Spring的 Java Web应用程序和一个通过JAR文件可用的公共框架库.我正在使用Thymeleaf来表达观点.

我有一个常见的Thymeleaf模板,由几个Web应用程序使用.模板HTML文件及其关联的样式表都在库JAR文件中.当Web应用程序基于框架模板显示视图时,Thymeleaf会找到并处理该模板.

我的问题是我无法弄清楚如何导入样式表,以便它被加载并传递回浏览器.最终结果是未设置样式(尽管是正确的)HTML.

我正在使用Gradle作为我的构建工具.

这是我的框架的相关项目结构:

common-framework/src/main
    ../java                        - contains the framework code
    ../resources                   - contains the framework resources
       ../static
           ../css
               example.css         - Style sheet for use in templates
       ../templates
           ../fwk
               example.html        - Thymeleaf template

这是我的示例应用程序的相关项目结构:

app/src/main
    ../java                        - contains the application code
    ../resources                   - contains the application resources
       ../templates
           ../app
               start.html          - Thymeleaf template
    ../webapp
        ../resources
            ../css
               app.css             - Style sheet for use in the app

这是应用程序和框架用于查找模板的ViewResolver bean:

@Bean
public ViewResolver viewResolver()
{
    ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
    templateResolver.setTemplateMode("HTML5");
    templateResolver.setPrefix("templates/");
    templateResolver.setSuffix(".html");
    templateResolver.setCharacterEncoding("UTF-8");
    templateResolver.setOrder(1);

    SpringTemplateEngine engine = new SpringTemplateEngine();
    engine.setTemplateResolver(templateResolver);

    ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
    viewResolver.setTemplateEngine(engine);
    viewResolver.setCharacterEncoding("UTF-8");
    viewResolver.setOrder(1);

    return viewResolver;
}

这是我的资源处理程序配置(来自我的WebMvcConfigurerAdapter):

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
    registry.addResourceHandler("/resources/**")
            .addResourceLocations("/resources/");
}

这是框架Thymeleaf模板(fwk / example.html)

<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">

<head>
    <meta charset="utf-8" />
    <title th:text="${title}"></title>
    <link rel="stylesheet" type="text/css" th:href="@{/resources/static/css/framework.css}" />   <!-- *** PROBLEM IS HERE *** -->
</head>
<body>
    ...
</body>
</html>

这是一个应用程序Thymeleaf模板(app / start.html)

<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring4-4.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">

<head>
    <meta charset="utf-8" />
    <title th:text="${title}"></title>
    <link rel="stylesheet" type="text/css" th:href="@{/resources/css/app.css}" />   <!-- *** This works correctly. *** -->
</head>
<body>
    ...
</body>
</html>

这是来自Web应用程序的示例控制器.注意:这是一个依赖于框架库的独立项目.

@Controller
public class ExampleController
{
    @GetMapping(path = "/start")
    public String start(Model model,HttpServletRequest request)
    {
        ...
        return "app/start"; // Uses an application template
    }

    @GetMapping(path = "/example")
    public String example(Model model)
    {
        ...
        return "fwk/example"; // Uses a framework template
    }
}

Web应用程序在Tomcat下运行,框架库JAR文件可供它使用.当我测试控制器URL时,两者都正确加载.也就是说,在这两种情况下,都会找到,加载和显示模板.

但是,正如我上面提到的,框架模板(由/ example URL触发)是非样式的,因为找不到框架CSS文件并将其传递给浏览器.我该如何实现这一目标?

(我的框架结构是否正常?我的ViewResolver配置正确吗?我的资源处理配置是否正确?我应该在框架模板中使用什么href路径来引用同一JAR中的样式表?)

解决方法

在example.html中尝试替换:

<link rel="stylesheet" type="text/css" th:href="@{/resources/static/css/framework.css}" />

通过:

<link rel="stylesheet" type="text/css" th:href="@{/css/framework.css}"/>

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读