ModelAttribute Doesn't return any value from front end to back end

578 Views Asked by At

I'm using spring boot and thymeleaf to create a form to collect the data from front-end and update the database at back-end. I'm having trouble to pass the object value by using ModelAttribute. I can almost guaranty my repository and my bean work fine because I have written Junit test case against it and I can see the update from DB. I tried to use th:field at the html page, but it doesn't give me any default value in the field, so I have to use th:value. The print out statements in the controller just keep return 0. It feels like (@ModelAttribute("city") CityBean city) just never pass any data into the variable city. I can't really tell where the problem is after hours of the debugging. I will attach my code here. Thank you very much for helping.

My bean:

public class CityBean {
int cityID;
int population;
String cityName;
String state;

My Repository/DAO:

    public int updatePopulation(CityBean city) {
    String sql = "UPDATE CITY SET population = ? WHERE cityID = ?";
    Object[] args = {city.getPopulation(), city.getCityID()};
    int[] types = {Types.VARCHAR, Types.INTEGER};

    return jdbcTemplate.update(sql, args, types);
}

My controller:

@RequestMapping(value = "/action", method = RequestMethod.POST)
public String updatePopulation(@ModelAttribute("city") CityBean city) {

    System.out.println("This is city ID " + city.getCityID());
    System.out.println("This is city population " + city.getPopulation());

    cityRepository.updatePopulation(city);

    return "redirect:/cityInfo";
}

My Front-end HTML:

    <!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>CS6400 Fall 2020 Team 017 Project</title>
    <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" integrity="sha384-TX8t27EcRE3e/ihU7zmQxVncDAy5uIKz4rEkgIXeMed4M0jlfIDPvg6uqKI2xXr2" crossorigin="anonymous">
</head>
<body>
<h1 style="text-align:center">City Population Update Form</h1>
<br>
<form action="#" th:action="@{/action}" th:object="${city}" method="post" modelAttribute="city">
    >
<table class="table">
    <thead>
    <tr>
        <th scope="col">City ID</th>
        <th scope="col">City Name</th>
        <th scope="col">State</th>
        <th scope="col">Population</th>
        <th scope="col">Action</th>
    </tr>
    </thead>
    <tbody>
    <tr >
        <td><input type="text=" th:value="*{cityID}" readonly="readonly"></td>
        <td><input type="text=" th:value="*{cityName}" readonly="readonly"></td>
        <td><input type="text=" th:value="*{state}" readonly="readonly"></td>
        <td><input type="text=" th:value="*{population}" ></td>
        <td>
            <button type="submit" class="btn btn-primary">Update Population</button>
        </td>
    </tr>
    </tbody>
</table>
</form>


</body>
</html>
1

There are 1 best solutions below

0
Bryce Yiqin Yin On

Problem solved, I added name="pramName" in the input tag then everything works fine.