2016-11-18 3 views
0

Я совершенно не знаком с html и тем материалом.Java/html тип входного радиосигнала - Параметры missmatch

Я пытаюсь создать веб-страницу (используя загрузку Java/Spring), где пользователь просматривает «Пиццу», выбирает количество и размер и отправляет заказ.

Специфическая часть HTML документа:

<div class="input-group"> 
    <span class="input-group-addon">Bestellmenge:</span> 
    <input type="number" name="amount" class="form-control" placeholder="1"/> 
</div> 
<form> 
    <input type="radio" name="pizzaSize" value="1"> Klein</input> 
    <input type="radio" name="pizzaSize" value="2"> Mittel</input> 
    <input type="radio" name="pizzaSize" value="3"> Gross</input> 
</form> 
<div> 
    <form th:action="@{/saveOrderAndReload(name=${pizza.name}, amount=${amount}, size=${pizzaSize})}" method="post"> 
     <div class="form-group"> 
      <div class="form-group"> 
       <input type="submit" class="btn btn-primary btn-success" value="zur Bestellung hinzufuegen"/> 
      </div> 
     </div> 
    </form> 
</div> 

Таким образом, когда пользователь нажимает на кнопку, следующий метод вызывается:

@RequestMapping("saveOrderAndReload") 
    public String saveOrderAndReload(@RequestParam String name, @RequestParam int size, @RequestParam int amount, Model model) { 
    //Do whateher 
    return "another html page"; 
    } 

Из моего понимания, метод требует String, Int , int как параметры. Веб-страница предоставляет струну (название пиццы), INT (от поля ввода) и INT от входа радио (? Это правильно)

Однако при попытке выполнить метод вызывается так:

http://localhost:8080/saveOrderAndReload?name=SalamiPizza&amount=&size= 

Отсутствует на 2 параметра, получая мне следующую ошибку:

Failed to convert value of type [java.lang.String] to required type [int]; nested exception is java.lang.NumberFormatException: For input string: "" 
+0

Он ничего не сделает. Все ваши элементы формы находятся вне формы ... Ваш 'th: action' должен быть только'/saveOrderAndReload', и все остальное должно появиться из вашей формы. Вы не вызываете метод am, отправляете данные по URL-адресу ... –

ответ

0

Ваше понимание Тимелеафа и того, как работает веб-сайт, является ошибочным.

Прежде всего, все ваши элементы должны находиться внутри одного и того же <form>, которые будут отправлены (если вы не используете JavaScript, но это другой зверь). Из HTML (или Thymeleaf) вы вызовете метод, по которому вы отправляете данные на URL-адрес (который в конечном итоге в вашем случае будет выполнять контроллер).

Теперь с этим знанием сначала исправьте форму.

<div> 
    <form th:action="@{/saveOrderAndReload(name=${pizza.name}, amount=${amount}, size=${pizzaSize})}" method="post"> 
     <div class="input-group"> 
      <span class="input-group-addon">Bestellmenge:</span> 
      <input type="number" name="amount" class="form-control" placeholder="1"/> 
     </div> 
     <div class="input-group> 
      <input type="radio" name="pizzaSize" value="1"> Klein</input> 
      <input type="radio" name="pizzaSize" value="2"> Mittel</input> 
      <input type="radio" name="pizzaSize" value="3"> Gross</input> 
     </div> 
     <div class="form-group"> 
      <div class="form-group"> 
       <input type="submit" class="btn btn-primary btn-success" value="zur Bestellung hinzufuegen"/> 
      </div> 
     </div> 
    </form> 
</div> 

Следующая ваша th:action не нужно включать любые значения (если вы не хотите, чтобы все-таки передать имя). Поэтому измените его на th:action="@{/saveOrderAndReload(name=${pizza.name}), все остальные свойства будут включены в форму.

Вы назвали ваш переключатель pizzaSize и не размер, либо изменить имя параметра в контроллере для pizzaSize или изменить название кнопки радио, чтобы size в любом случае будет работать.

Предполагая, что вы меняете названия своих кнопок, ваша форма должна выглядеть так.

<div> 
    <form th:action="@{/saveOrderAndReload(name=${pizza.name})}" method="post"> 
     <div class="input-group"> 
      <span class="input-group-addon">Bestellmenge:</span> 
      <input type="number" name="amount" class="form-control" placeholder="1"/> 
     </div> 
     <div class="input-group> 
      <input type="radio" name="size" value="1"> Klein</input> 
      <input type="radio" name="size" value="2"> Mittel</input> 
      <input type="radio" name="size" value="3"> Gross</input> 
     </div> 
     <div class="form-group"> 
      <div class="form-group"> 
       <input type="submit" class="btn btn-primary btn-success" value="zur Bestellung hinzufuegen"/> 
      </div> 
     </div> 
    </form> 
</div> 
+0

Имеет смысл. Я сделал все изменения в коде и, похоже, сейчас работает. – Master1114

0

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

public String saveOrderAndReload(@RequestParam String name, @RequestParam String sizeString, @RequestParam String amountString, Model model) { 
    int size = Integer.parseInt(sizeString); 
    int amount = Integer.parseInt(amountString); 

Кроме того, необходима какая-то часть коды, чтобы проверить, если строки пусты - установите 0 для Инта-значений.

+0

Нет, вы этого не делаете. Было бы отвратительно, если бы преобразование не было сделано для вас ... –