Как передать данные в контроллер в виде карты ha sh из формы чабреца - PullRequest
0 голосов
/ 23 января 2020

Здравствуйте, дорогие пользователи stackoverflow, пожалуйста, помогите мне решить следующую проблему: я понятия не имею как передать данные из представления тимелист в контроллер, которые ожидают данные в виде карты ha sh? Итак, позвольте мне объясним более подробно.

У меня есть следующее pojo, которое используется в качестве оболочки для моих данных hashMap. Выглядит это так:

public class DTDays {
  private Map<Driver, String> driversDays = new HashMap<>();

  public Map<Driver, String> getDriversDays() {
      return driversDays;
  }

  public void setDriversDays(Map<Driver, String> driversDays) {
      this.driversDays = driversDays;
  }
}

Контроллер имеет метод с атрибутом модели параметров и еще одно pojo:

@RequestMapping(value = "/go", method = RequestMethod.POST)
public String advanced(@ModelAttribute DTDays dtDays,
                       @RequestParam(name = "tourId") Long tourId, Model model){
    // make some bussiness logic with provided data 
    return "redirect:/tours/advanced";
}

здесь я debbuged и dtDays не ноль, но свойство карты также пусто TourId работает, как и ожидалось, я могу получить правильное значение. Теперь к проблеме, вид:

<body>
<div style="margin-left: 20px;">
    <h1 th:text="${tour.tittle}"></h1>
    <p>Add tour interval for drivers</p>
    <form id="driverIntervals" th:action="@{/advanced/go}" th:object="${driversDays}" method="post">
        <table>
            <tr>
                <td>Drivers:</td>
                <td>Date:</td>
            </tr>
            <tr th:each="d: ${attachedDrivers}">
                <td th:text="${d.id+' '+d.fullName}" >
                    <input type="hidden" th:value="${d.id}" >
                </td>
                <td>
                    <input type="text" placeholder="Pick days" th:name="days"/>
                </td>
            </tr>
        </table>
        <input type="hidden" th:name="tourId" th:value="${tour.id}"/>
        <button type="submit">Confirm</button>
    </form>
</div>
</body>

Вид выглядит следующим образом:

view

Что я должен написать для представления данных? В моем случае драйвер - это ключ карты, а введенные пользователем данные в соответствующем поле ввода будут значением карты

Я уже знаю, как отправить Список, используя опцию select в представлении. :

<select th:name="drivers2attach" multiple="multiple" id="attachDrivers">
    <!--/*@thymesVar id="drivers" type="java.util.List<stanislav.tun.novinomad.picasso.persistance.pojos.Driver>"*/-->
    <option th:each="d : ${drivers}" th:value="${d.id}"
            th:text="${d.getId()+' '+d.fullName}">
    </option>
</select>

и список списков @RequestParam в контроллере:

@RequestMapping(value = "/save", method = RequestMethod.POST)
public ModelAndView addTourAction(@ModelAttribute("tour") Tour tour,
@RequestParam(required = false, name = "drivers2attach") List<Long> drivers2attach) 

Но как обращаться с картой?

В случае со списком данные заполняются автоматически. В карте предварительно заполнены только ключи, это количество драйверов, и теперь я ожидаю, что пользовательский ввод для каждого драйвера будет иметь значение ключа.

При изучении ответов я уже читал следующие источники: Как связать список объектов с тимелистом?

Отправить объект списка из тимелиста в контроллер

Как загрузить значения объектов HashMap и ModelandView с помощью Thymeleaf в приложении Spring Boot?

Привязка формы карты Thymeleaf

http://forum.thymeleaf.org/How-to-use-Map-lt-String-String-gt-with-Spring-and-Thymeleaf-forms-td4028666.html

http://forum.thymeleaf.org/How-to-use-method-POST-with-a-complex-Hashmap-lt-Object-list-lt-Object-gt-gt-td4031257.html

Переплет формы карты тимелина

Используйте HashMap в качестве бобовой пружины формы MVC + ThymeLeaf et c.

Но не помогло. Где-то в этих ссылках я узнал, что я должен использовать какую-то обертку, чтобы сделать это, но опять же не знаю, почему это не работает, или что я должен сделать дополнительно, чтобы это работало. Может быть, я вообще неправильно пишу logi c и для передачи данных в виде hashmap сначала преобразую данные в список, а затем каким-то образом получу карту из него в контроллере?

1 Ответ

0 голосов
/ 23 января 2020

Извините за создание дублирующего вопроса, наконец-то я нашел решение, следуя этому ответу на stackoverflow

Я написал небольшой проект для его проверки, и он работает. Так что я был на правильном пути в контроллере с оберткой. Я пропустил только представление карты и синтаксис;

Наконец, представление будет выглядеть так: представление

вот исходный код представления:

<form th:action="@{/save}" th:object="${form}" method="post">
<h1>Welcome</h1>
<div th:each="property : ${form.properties.entrySet()}">
    <div class="form-group">
        <label th:for="*{properties['__${property.key}__']}" th:text="${property.key}">Property</label>
        <input type="text" class="form-control" th:field="*{properties['__${property.key}__']}" />
    </div>
</div>
<button type="submit">send to controller</button>

и контроллер:

 @PostMapping("/save")
public ModelAndView save(@ModelAttribute(name = "form") MapWrapper form){
    var mav = new ModelAndView();
    mav.setViewName("index");
    mav.addObject("mapWrapper", form);
    var map = form.getProperties();

    System.out.println("Size of map = "+map.size());
    for (Long id : map.keySet()) {
        System.out.println("Key: "+id+"; Value: "+map.get(id));
    }

    return mav;
}

и вывод: вывод

PS Причиной здесь является то, что я застрял на этой проблеме около 2 недель, я отчаялся, но нашел решение после создать вопрос.

...