Spring-Thymeleaf 如何使用 EL 调用来自 Bean 的操作方法

Posted

技术标签:

【中文标题】Spring-Thymeleaf 如何使用 EL 调用来自 Bean 的操作方法【英文标题】:Spring-Thymeleaf How to invoke with EL an action method from a Bean 【发布时间】:2022-01-18 04:31:44 【问题描述】:

我使用的是 Spring/SpringMVC 5.x 版本,Tomcat 服务器上带有 Thymeleaf 和 Bootstrap。

我需要问一些对你来说可能看起来很“st@pid”的问题。

在我的 html 视图中,我有以下按钮或链接:

<input type="button" .../>
<a .../>

我不需要提交东西,所以我只使用一个简单的按钮,所以我认为我不需要任何表单(除非我需要这个)。

在这个 html 视图中(因为我在 html 标签中添加了 thymeleaf 库),我需要以某种方式添加, (但我不知道如何),对于这个按钮或链接,Spring EL 或 Thymeleaf EL 的表达式,所以我可以从 我通过在控制器中添加的模型在视图中传递的 Spring bean,例如:

$myBean.doSomething()
// or
$myBean.doSomething(parameters)

如果这无法理解,我可以用一些代码更新我的问题(我相信 Spring 开发人员 明白我在说什么)。

我不知道如何传递这个表达式。要使用按钮或链接标签的什么属性? 我为按钮使用了“action”属性:

<input type="button" th:action="$myBean.doSomething()".../>

或链接标签中的“href”属性:

<a th:href= "$myBean.getStringUrlAndDoSomething()"/>

非常重要的信息

当我启动我的 tomcat 运行页面时,EL 中的操作在页面加载时成功运行。当我按下按钮或链接时,什么也没发生。

我知道我不能使用“onclick”属性,因为我们在那里编写 JS 代码。 但我需要运行 Java Spring 代码。

关于解决我的问题有什么想法吗? 提前致谢

【问题讨论】:

你不能。按钮应触发表单提交或 ajax 请求以在服务器上执行操作。使用简单的 EL 表达式是行不通的。 就像@M.Deinum 所说,您需要一个表单或一个ajax 请求。如果您不喜欢为该请求编写 javascript,可以查看htmx.org,它允许从 html 属性触发 ajax 请求。 "当我启动我的 tomcat 运行页面时,EL 中的操作在页面加载时成功运行。当我按下按钮或链接时,没有任何反应。" -> 这是正常的,因为 Thymeleaf 在将模板转换为服务器上的 HTML 时会执行一次该代码。 大家好。谢谢你的cmets。我的问题是我有一个按钮(我可以把它作为一个链接,这不是问题),我想用它作为语言切换器。后台人员就搞定了。语言可以轻松切换。我只需要制作按钮。该按钮具有作为国家国旗背景的图像。好的,我需要使用代码来按下它并切换标志和语言环境。在这种情况下,我将其作为链接,因为我需要使用 从 bean 调用从 "?lang=en" 切换到 " ?lang=el" 反之.... ... 我该如何做这些事情,在这种情况下我无法通过 bean 方法控制它们?谢谢 【参考方案1】:

我听从了@M.Deinum、@Wim Deblauwe 的建议,但我没有使用 此作业的按钮。 Button 需要一个表单才能工作。

这就是我使用链接的原因,其中 bean 中的方法被称为魅力,例如 以下sn-p:

<div class="blabla">
    <div class="blablabla" th:text="|#change_lang EN/GR:|"></div>
    <a class="bla" th:href="$localeService.switchLocale()">
        <div th:class="|$localeService.loadCss()_blabla|"></div>
    </a>
    <span th:text="$#locale.getLanguage()"></span>
</div>

接下来是来自 bean 的 sn-p:

public String switchLocale() 

        locale = LocaleContextHolder.getLocale();

        if (locale.getLanguage().equals("en")) 
            LocaleContextHolder.setLocale(EN_LOCALE);
            return "?lang=el";
         else if (locale.getLanguage().equals("el")) 
            LocaleContextHolder.setLocale(GR_LOCALE);
            return "?lang=en";
         else 
            return "";
        
    

所以,来自 bean 的代码被成功调用。我想这就是我的问题的解决方案。

非常感谢 @M.Deinum 和 @Wim Deblauwe 两位为我提供建议的人。

【讨论】:

以上是关于Spring-Thymeleaf 如何使用 EL 调用来自 Bean 的操作方法的主要内容,如果未能解决你的问题,请参考以下文章

EL表达式中如何隔行变色

如何在表格中添加图片(使用el-table、el-table-column),即在Vue.js中使用ui-element?

如何在 Facelets 的 EL 布尔表达式中使用 &&?

jsp中el表达式如何获取当前输入框的值?

el-mentUI的分页如何插入el-input

在vue中使用elementUI饿了么框架使用el-tabs,切换Tab如何实现实时加载,以及el-table表格使用总结