Создание ArrayList с помощью отправки формы (Thymeleaf + Spring MVC) - PullRequest
0 голосов
/ 11 апреля 2019

Я хотел знать, как списки связываются весной ... и как получить к ним доступ в Thymeleaf.С и без WrapperClass Как добиться добавления одного / нескольких объектов через форму в ArrayList или обычный Array ..

Я был бы очень благодарен за объяснение.

Вот что я пробовал:Форма

<form action="#" th:action="@{/tests}" th:object="${features}" method="post">



        <input type="text" th:field="*{featureArrayList[0].name}"/>
    <input type="text" th:field="*{featureArrayList[1].name}"/>




    <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
</form>

Класс Wrapper

  ArrayList<Feature> featureArrayList = new ArrayList<Feature>();

    public FeatureWrapper() {

    }

    public ArrayList<Feature> getFeatureArrayList() {
        return featureArrayList;
    }

    public void setFeatureArrayList(ArrayList<Feature> featureArrayList) {
        this.featureArrayList = featureArrayList;
    }

Модель:

   private String name;

    public Feature(String name) {
        this.name = name;
    }

    public Feature() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

Контроллер


      @GetMapping("/tests")
    public String showForm(Model model)
    {
        FeatureWrapper featureWrapper = new FeatureWrapper();

        model.addAttribute("features",  featureWrapper);
        return "Feature";
    }
    @PostMapping("/tests")
    public String proceedForm(@ModelAttribute("features") FeatureWrapper features,Model model)
    {
       for(Feature feature: features.getFeatureArrayList())
       {
           System.out.println(feature.getName());
           System.out.println(features.getFeatureArrayList().size());
       }

        return "Feature";
    }

Edit1: теперь он работает с оболочкойКласс и использование статических индексов ... Как бы я достиг этого без класса-оболочки, я много читал о выражении EL $ {var.index} , но как это работает?И как я должен использовать это для динамического добавления моих объектов.Edit2: теперь я могу добавлять отдельные объекты и несколько объектов в список, но я не использую EL Expression, поэтому я хотел знать, когда мне нужно будет использовать что-то вроде этого:

 <div th:each="feature,stat:*{featureArrayList}">
        <input  id="myInput" type="text" th:field="*{featureArrayList[__${stat.index}__].name}"/>
    </div>

1 Ответ

1 голос
/ 11 апреля 2019
  1. Насколько я знаю, вы не можете связать список без класса-оболочки (как указано в комментариях).

  2. В обычных выражениях ThymeleafВы можете напрямую использовать переменные в качестве индексов.Например, такие выражения:

    <th:block th:with="i=0">
        <span th:text="${array[i]}" />
    </th:block>
    

    Однако th: выражения полей различны.Если вы читаете раздел о динамических полях :

    Проблема в том, что Spring EL не оценивает переменные в скобках индекса массива, поэтому при выполнении вышеприведенного выражения мы получим ошибкуговорит нам, что rows[rowStat.index] (вместо rows[0], rows[1] и т. д.) не является допустимой позицией в коллекции строк.Вот почему здесь необходима предварительная обработка.

    Итак, когда вы используете th:field для привязки входных данных к массивам, вы должны использовать предварительную обработку, поэтому вы видите такие выражения:

    <input type="text" th:field="*{featureArrayList[__${stat.index}__].name}"/>
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...