Spring MVC表单无线电输入未更新模型

时间:2019-04-06 13:25:37

标签: java spring-mvc jsp

我正在使用Spring MVC框架和表单创建一个Web应用程序。

我在获取表单来更新PlayerModel中的字段position时遇到麻烦。提交表单时,它只是不保存值(在commit()函数上检查控制器内联注释)。

如果我选择任一单选按钮(值分别为12)并提交,则模型将以值0到达控制器。

尽管在StackOverflow上阅读了无数类似的问题/答案,但我无法使它正常工作。我在这里做错了什么?

[编辑]

我发现了问题所在。出于某种原因,单选输入中的name属性值被用于与model属性匹配,而不是使用path

<input type="radio" id="index1" value="1" path="position" name="index" />

因此,它正在尝试将index与模型(当然不存在)进行匹配,而不是在path属性中使用position值。 不应该这样吗?

playerView.jsp

<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>

<html>
    <head>
    </head>
    <body>
        <form:form action="/game/playerView" method="POST" modelAttribute="playerModel">
            <table>
                <tr>
                    <th>
                        <input type="radio" id="index1" value="1" path="position" name="index" />
                        <input type="radio" id="index2" value="2" path="position" name="index"/>
                    </th>
                </tr>
                <tr>
                    <td><input type="submit" value="Submit"/></td>
                </tr>
            </table>
        </form:form>
    </body>
</html>

GameController.java

@Controller
@SessionAttributes("playerModel")
public class GameController {

    @RequestMapping(value = "playerView", method = RequestMethod.GET)
    public ModelAndView hello(ModelMap map) {
        PlayerModel playerModel = new PlayerModel();
        playerModel.setPosition(0);
        map.addAttribute("playerModel", playerModel);
        return new ModelAndView("playerView", "playerModel", playerModel);
    }

    @RequestMapping(value = "playerView", method = RequestMethod.POST)
    public ModelAndView submit(@ModelAttribute("playerModel") PlayerModel playerModel, BindingResult result, ModelMap model){
        playerModel.getPosition(); // returns 0
        model.addAttribute("playerModel", playerModel);
        return new ModelAndView("playerView", "playerModel", playerModel);
    }
}

PlayerModel.java

@Resource
public class PlayerModel {
    private int position;

    public int getPosition() {
        return position;
    }

    public void setPosition(int position) {
        this.position = position;
    }
}

1 个答案:

答案 0 :(得分:1)

您正在使用Spring-MVC表单标签,因此请不要使用(For more details)这样的<input type="radio" id="index1" value="1" path="position" name="index" />安装方式

<tr>
    <td>Sex:</td>
    <td>
        Male: <form:radiobutton path="sex" value="M"/> <br/>
        Female: <form:radiobutton path="sex" value="F"/>
    </td>
</tr>

,HTML <input type="radio">中没有 path 变量, 弹簧类型声明中应使用路径。

例如: <form:input path="firstName"/>的代码已由Spring更改为<input name="firstName" type="text"/>