当前位置: 首页 > 知识库问答 >
问题:

将列表从Thymeleaf传递给Spring控制器

谭裕
2023-03-14

我正在尝试在更改选项后将我的Thymeleaf超文本标记语言中已经提供的List传回控制器。我尝试过隐藏输入,但不幸的是,它还不起作用。

我的表单如下所示(控制器已经提供了“电影”列表)

<form action="/movies" method="POST">
    <input type="hidden" th:field="*{movies}" name="movies"/>
    <select name="myselect" id="myselect" onchange="this.form.submit()">
        <option value="1">Sort by Name (A-Z)</option>
        <option value="2">Sort by Name (Z-A)</option>
        <option value="3">Newest First</option>
        <option value="4">Oldest First</option>
    </select>
</form>

我的控制器看起来像这样:

package at.spengergasse.omdbspring.controller;

import at.spengergasse.omdbspring.domain.Movie;
import at.spengergasse.omdbspring.service.MovieService;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.Collections;
import java.util.Comparator;
import java.util.List;

@RequiredArgsConstructor

@Controller
public class MoviesController {
    private final MovieService movieService;

    @GetMapping("/")
    public String greeting(Model model) {
        model.addAttribute("movies", movieService.findAll());
        return "movies";
    }

    @PostMapping("/movies")
    public String getMoviesOrdered(@RequestAttribute List<Movie> movies, @RequestParam String myselect, Model model){
        model.addAttribute(movieService.findCustomListSorted(movies,myselect));
        return "movies";
    }
}

期待有人能帮助我!

共有3个答案

水睿
2023-03-14

如果我正确理解了你的问题,你想在单击选择字段时调用电影列表,并将电影添加到某个div?这可以通过对控制器的AJAX调用来实现,因此在完成后,它将用内容填充div,如果这样做有意义的话:

    function getMoviesOrdered(myselect){
    var prep = {};
    prep['movies'] = myselect;

    var data = JSON.stringify(prep);
    $.ajax({
  url:"/movies",
  type:"POST",
  data:data,
  contentType:"application/json; charset=utf-8",
  dataType:"json",
  error:function(){},
  complete:function(data){
  document.getElementById("#someDivId").innerHTML = data;
  }
    });
}
李鸿
2023-03-14

由于您的电影列表是通过您的表单发送的,因此它将在HTTP POST正文中提供。因此,您必须使用@RequestBody而不是@RequestAttribute

@PostMapping("/movies")
public String getMoviesOrdered(@RequestBody List<Movie> movies, @RequestParam String myselect, Model model){
    model.addAttribute(movieService.findCustomListSorted(movies,myselect));
    return "movies";
}
单于庆
2023-03-14

我在我的项目中遇到了同样的问题,其中隐藏列表值已经由控制器提供,然后需要将相同的值进一步传递给控制器。我已经使用@modeldattribute注释解决了这个问题(我正在根据您的要求粘贴相同的代码):---

1)在要发送电影的控制器上创建表单对象(表单提交后需要进一步发送到控制器):-

    model.addAttribute("some_value", new YourDesiredJavaClass());

2)在表单上创建同名的Thymeleaf对象,在本例中为“some_value”:--

<form action="/movies" th:object="${some_value}" method="POST">
    <input th:field="${movies}" type="hidden" ></input>
</form>

3)从Thymleaf获取列表到控制器:--

 @PostMapping("movies")
         public String getMovies(@ModelAttribute("some_value") YourDesiredJavaClass requestClass, Model model) {

//进一步的代码...

}

4.)使用setter创建Request类

  public class YourDesiredJavaClass{

       private List<String> movies;

      //setter & getter methods

    }
 类似资料:
  • 给定以下代码: 和一个jsp: 如何将在下拉列表中选择的值传递回Spring控制器?目前,当我尝试执行此操作时,得到的请求参数无效。

  • 我正在尝试将一个对象(或只是ID)传递给我的控制器,我从下拉列表中选择它。有2个类:产品和类别(产品包含一个外键,这是类别的ID)这是我如何将其加载到: 如您所见,我正在将对象类别传递到我的. jsp中。在那里我显示了用户可以选择的所有类别。 该值应该传递给我的控制器,但我不知道如何传递它。

  • 我想通过使用javascript或jquery或不使用javascript或jquery将thymeleaf下拉选择的值传递给spring boot控制器

  • 如果对象为NULL,则无法传递对象项目。如何将对象从HTML传递给spring控制器?

  • 我正在javascript上对消息进行加密和解密,并希望将结果消息发送到Spring控制器mvc。 因此,令牌应该保存来自javascript的值。我没有使用jquery。如何将javascript中的值传递给Spring mvc控制器。 我想在java控制器类中使用这个变量(即encryptedFinally)。

  • 因此,在我的Javascript中,我使用的是表单序列化,输出是正确的 (issubmit=1) 当我试图将其传递给我的控制器时,我什么也得不到,。我做错了什么? Jquery: 控制器: