Thymleaf Spring MVC按钮执行Java方法



所以这就是我在html文件中拥有的:

<ul>
    <th:block th:object="${Post}">
        <li class="post" th:each="Post : ${Posts}">
            <p  th:text ="${Post.getPostText()}"></p>
            <button th:onclick = "${Post.upvote()}">Upvote</button>
            <button th:onclick = "${Post.downvote()}">Downvote</button>
            <p th:text = "${Post.getPostVotes()}"></p>
        </li>
    </th:block>
</ul>

我希望按钮在邮政类中执行方法。我不确定我是否正在使用正确的百里叶"标签"。现在,当页面加载时,它将执行后投票和降价方法。谁能帮忙?我感觉我正在使用错误的胸腺标签。

您需要执行帖子或获取请求以调用这些方法。这只能在JSF中起作用,但是您可以在将DE PAGE呈现为HTML之前执行该方法。

例如,此行

<p  th:text ="${post.getPostText()}"></p>

将在渲染页面之前执行。

我在这里要做的是隐藏一个针对两个操作的表单,两个具有名称属性的按钮并传递某种标识符以了解我正在更新的女巫实体。在我的控制器中,将有两种方法可以响应每个参数并返回视图或JSON。

,所以他们推理我无法做我想做的是因为胸腺像加载之前一样生成HTML。它不会位于HTML等待触发的HTML中。我最终更改了HTML,以转到帖子所独有的其他URL。

<ul>
    <th:block th:object="${Post}">
        <li class="post" th:each="Post : ${Posts}">
            <p th:text ="${Post.getPostText()}"></p>
            <a th:href = "@{/post?id={id}&vote=1(id=${Post.getPostId()})}">Upvote</a>
            <a th:href = "@{/post?id={id}&vote=0(id=${Post.getPostId()})}">Downvote</a>
            <p th:text = "${Post.getPostVotes()}"></p>
        </li>
    </th:block>
</ul>

这是我的控制器中的相应Java代码,它将更新对象:

@RequestMapping(value = "/post", params = {"id", "vote"})
public String PostVoting(@RequestParam("id") Long id, @RequestParam("vote") int vote)
{
    if (currentUser.voteOnPost(id.toString())){
        return "redirect:/home";
    }
    if(vote == 1){
        int votes = thePostRepository.findById(id).get().getPostVotes() + 1; 
        thePostRepository.updateVotes(votes, id);
    }
    else{
        int votes = thePostRepository.findById(id).get().getPostVotes() - 1; 
        thePostRepository.updateVotes(votes, id);
    }
    return "redirect:/home";
}

另外,如果您想更新我所做的事情,那么下一部分很重要:

@Transactional
@Modifying
@Query("UPDATE Post SET votes = :votes WHERE id = :id")
void updateVotes(@Param("votes") int votes, @Param("id") Long id);

最新更新