在quarkus qute模板中插入Java字符串常量?

时间:2020-09-25 05:21:12

标签: java quarkus templating quarkus-qute

我正在研究一个小型quarkus项目,该项目服务于使用qute模板引擎创建的HTML页面。

我想知道是否可以访问一些String常量值到模板,而不必将它们作为.data("key", value)传递到模板。

一个例子,我为查询参数定义了常量,我想在模板引擎生成的HTML中使用它们。

改编自官方指南Qute is a templating engine

我的JAX-RS类/src/main/java/com/company/HelloResource.java看起来像这样:

package com.company

import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

import io.quarkus.qute.Template;
import io.quarkus.qute.TemplateInstance;

@Path("hello.html")
public class HelloResource {

    @Inject
    Template hello;

    private static final String NAME_QUERY_PARAM = "name";

    @GET
    @Produces(MediaType.TEXT_HTML)
    public TemplateInstance get(@QueryParam(NAME_QUERY_PARAM) String name) {
        String helloStatement;
        if (name == null) {
            helloStatement = "Welcome!";
        } else {
            helloStatement = "Hello " + name + "!";
        }
        return hello.data("helloStatement", helloStatement);
    }
}

hello模板/src/main/resources/templates/hello.html如下所示:

<!DOCTYPE html>
<html>
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Test</title>
</head>
<body>

<h1>{helloStatement}</h1>

<form action="./hello.html" method="GET">
  <div>
    <label for="name">The name:</label>
    <input name="name" id="name" value="John">
  </div>
  <div>
    <button>Say hi!</button>
  </div>
</form>

</body>
</html> 

对于<input>标签,我想写:

 <input name="{com.company.HelloResource.NAME_QUERY_PARAM}" id="name" value="John">

在编译时将com.company.HelloResource.NAME_QUERY_PARAM替换为其值。

3 个答案:

答案 0 :(得分:0)

您最近获得的“不传递值”是使用@TemplateExtension,您可以在https://quarkus.io/guides/qute-reference#template_extension_methods上查看有关它的更多详细信息

我准备了一个小例子来说明夸克达到恒定字符串的方式。在html的下方,

    <h1>{item.someVar}</h1>
    <h1>{str:Any1}</h1>
    <h1>{str:g('2')}</h1>
    <h1>{str:g('1')}</h1>

“ str”是quarkus的命名空间方法,而使“ str”在这里工作需要code

您也可以将常量放入模板所用对象旁边的类中,here方式。

在这里,示例在本地显示的样子。 enter image description here

答案 1 :(得分:0)

好像您可以将CDI组件直接注入qute中一样。我创建了一个@ApplicationScoped @Named bean

@ApplicationScoped
@Named 
public class ApplicationBean {
    @ConfigProperty(name = "quarkus.application.name")
    String application;
    
    public String getName() {
        return application;
    }
}

并像这样在我的模板中引用

 <title>{inject:applicationBean.name}</title>

答案 2 :(得分:0)

在 Qute 中还没有直接访问静态字段的内置方法。 Begui 和 özkan 是对的:您可以使用带有命名空间的扩展方法或注入 @Named bean。