【问题标题】:Display data on HTML using Thymeleaf使用 Thymeleaf 在 HTML 上显示数据
【发布时间】:2020-07-22 20:33:58
【问题描述】:

我想显示我从搜索中获得的数据,并根据我的喜好进行个性化设置。此时,它只是纯文本。

例如,我正在搜索“泰坦尼克号”,我从 IMDB 获得了名称、一些链接和一些信息。

我有以下代码:

search.html

<!DOCTYPE HTML>
<html xmlns:th="https://www.thymeleaf.org">
<head>
    <title>Getting Started: Handling Form Submission</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Form</h1>
<form action="#" th:action="@{/search}" th:object="${search}" method="post">
    <p>Message: <input type="text" th:field="*{content}" /></p>
    <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
</form>
</body>
</html>

result.html

 <!DOCTYPE HTML>
<html xmlns:th="https://www.thymeleaf.org">
<head>
    <title>Getting Started: Handling Form Submission</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Result</h1>
<p th:text="'content: ' + ${main.content}"></p>
<a href="/search">Submit another message</a>
</body>
</html>

SearchController.java

    @Controller
public class SearchController {
    @GetMapping("/search")
    public String greetingForm(Model model) {
        model.addAttribute("search", new Main());
        model.addAttribute("main", new Main().getContent());
        return "search";
    }

    @PostMapping("/search")
    public String greetingSubmit(@ModelAttribute Main main) {
        return "result";
    }
}

Main.java

    private String content;
private List<Result> finalList;
private List<Result> resultList;

public void setContent(String content) throws IOException {
 //code to compute finalList
}

public List<Result> getContent() {
    return this.finalList;
}

主要问题是我不知道该去哪里。 finalList 是“Result”类型的对象列表,其字段包括

private List<String> link = new ArrayList<>();
private String name;
private TitleProp titleProp;

并且TitleProp

private String trailer;
private String rating;
private String description;
private String genre;

我想操纵每个字段以不同的方式显示它,例如具有更多行的表格等。 任何链接或代码示例都会帮助我更多地了解 Thymeleaf 和 Spring Boot。

【问题讨论】:

  • 您将需要在您的一个控制器中公开几个 REST API 端点,然后从您的前端使用 Javascript 调用它们以对您的 API 进行 Ajax 调用。一旦你有了一个响应数据对象,你就可以使用更多的 Javascript 以任何你认为合适的方式将数据注入到你的 DOM 中。所有这一切,调用、响应和内容注入都可以在不刷新页面的情况下完成。
  • 所以你的意思是,在我搜索信息并填充“finalList”之后,我可以公开一些端点,例如“getName”、“getId”等。(使用“GetMapping” ),我可以通过使用 Ajax 调用来访问这些?
  • 差不多。这里有一些很棒的教程:spring.io/guides/gs/consuming-rest-jquerymkyong.com/spring-boot/spring-boot-ajax-example - 它们都是 SpringBoot 教程,但如果您只使用原始 Spring 和 Thymeleaf,您可以稍微调整它们以满足您的需求。
  • 感谢您的链接,@SnakeDoc。我设法通过在这段时间尽可能多地学习 JavaScript 和 ajax 来解决这个问题。我发布了一个答案:)。

标签: java spring thymeleaf


【解决方案1】:

我来回答我的问题。正如 SnakeDoc 建议的那样,我设法使用 Ajax 获得了我想要的结果。这是一条漫长的道路,主要是因为即使我有一个工作代码,我也花了几个小时在 ajax 发布请求上搜索 Forbidden 403 错误

那么,对于js部分:

    function ajaxPost() {
        // Here we prepare data for the JSON
        var formData = {
            moviename: $("#moviename").val()
        }
        $.ajax({
            type: "POST",
            contentType: "application/json",
            url: "MYURL",
            data: JSON.stringify(formData),
            dataType: 'json',
            success: function (result) {
                {
                    $.each(result,
                        function (i, title) {
                            // do whatever you want with what you got from the server
                        });
                    console.log("Success: ", result);
                }
                console.log(result);
            },
            error: function (e) {
                console.log("ERROR: ", e);
            }

        });
    }

如果这看起来令人困惑,我可以通过以下方式访问您在我的问题中可以看到的字段 title.name、title.link、title.titleProp.description 等,在 function (i, title) 的主体内。 对于 HTML,

        <label for="moviename" style="margin-right:5px">Title:</label>
        <input type="text" class="form-control" id="moviename" placeholder="Enter a title"/>

其中 moviename 是您从输入中获得的变量名称。

现在,在后端,我们必须配置我们的路径

    @PostMapping("/MYURL")
public ResponseEntity<Object> addSearch(@RequestBody SearchCriteria searchCriteria)
        throws IOException {
     // do whatever you want to get a result. I used a custom class "SearchCriteria"
     // which has a getter and a setter for the field
     // **private String moviename;**
    return ResponseEntity.ok(THIS GETS SENT TO AJAX);
}

主要问题是我有 web.security,而你有两个选择。第一个,你禁用 csrf。您必须将此行添加到您的安全配置中。

    http.csrf().disable();

protected void configure(HttpSecurity http) 方法中。

或者,您将 csrf 添加到 ajax 请求中。讨论了有关此主题的更多信息here

【讨论】:

    【解决方案2】:

    使用 thymeleaf,您可以像这样在 html 中显示一个列表:

    <tr th:each="student: ${students}">
        <td th:text="${student.id}" />
        <td th:text="${student.name}" />
    </tr>
    

    更多信息:https://www.baeldung.com/thymeleaf-iteration

    【讨论】:

    • 但是当我从后端获取信息时,通过使用 Thymeleaf 我不是只得到字符串,而不是对象吗?
    • 您使用@ModelAttribute 将您的模型传递给模板渲染器。 th:each 然后循环传递给它的对象,并生成在响应中发送的 html。如果您使用异步请求执行此操作,则您的评论是正确的,但是,由于 thymeleaf 在将响应发送回浏览器之前评估表达式,它可以访问您传递给它的对象。
    • 哦,太好了。很高兴知道 Thymeleaf 可以做到这一点。感谢您的回答和澄清!
    • 我最近为一个学校项目制作了一个 spring/thymeleaf 网站。我认为它可能对您有用(因此,如果您愿意,可以复制粘贴一些代码;))。 github.com/martijnmeeldijk/taskmanager-martijn
    • 谢谢!后端部分,我没有任何问题,问题是我从来没有连接过后端和前端,也没有 JavaScript 的先验知识。我不会复制粘贴,这样我学得很辛苦,我推荐给任何人!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 2021-11-17
    • 2020-11-17
    • 2021-07-05
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多