春天的下拉菜单

时间:2016-10-06 14:35:46

标签: java spring jsp spring-mvc

我检查了很多类似的问题,但在我的案例中没有一个问题有效。

我尝试使用弹簧形式为我的用户注册表单选择下拉列表:select tag。在我的bean中,country设置为ManyToOne,因此我传递了一个用于选择值的映射。

我之间的反弹:BindingResult和bean名称的普通目标对象都没有注册'可用作请求属性。并且:commandName not found blabla ...

帮助我了解正在发生的事情以及如何解决问题。 知道我通过MergedOutputModel(使用两个重定向来挂载视图)来装载我的视图,因此会感兴趣,因此会变量。

以下代码(简化为出现问题的位置)。

控制器类:

@Transactional
@Controller
public class RegisterController {
@Autowired
    public CountryDao cDao;

    @RequestMapping("register")
    public String register(Model model, @ModelAttribute("user") User user, BindingResult result, HttpSession session) {
        session.setAttribute("user", user);
        session.setAttribute("countryList", cDao.getCountryMap());
        return "login/registerForm";
    }}

查看:

<body>
    <h1>
        <spring:message code="register.message" />
    </h1>
    [...]
    <form:form action="addUser" commandName="register" method="post">

        [...]
        <spring:message code="register.country" />
        <form:select path="country" items="${countryList}" />
        [...]
        <input type="submit" value="<spring:message code='register.submit'/>" />
    </form:form>
</body>

1 个答案:

答案 0 :(得分:0)

这可以让您更接近您的需求。您的流程可能略有不同,因此您可以根据需要调整页面名称。

@Controller
@SessionAttributes("countryList") //add whatever session attributes as needed
public class RegisterController {

    @RequestMapping("/registerForm", method = RequestMethod.GET)
    public String registerGet(Model model) {
        model.addAttribute("user", myUserService.createUser());
        model.addAttribute("countryList", countryDao.getCountryMap());
        return "login/registerForm";
    }

    @RequestMapping("/registerVerify", method = RequestMethod.POST)
    public String registerPost(@ModelAttribute("user") User user, 
                               Errors result) {

        if (result.hasErrors()) {
            FormValidationLogger.log(log, result);
            return "login/registerForm";
        }
        //persist, send emails, or do whatever
        return "registerVerify"; //or whatever page
    }

    @Autowired
    private CountryDao countryDao; //put these at the bottom so we don't have to scroll as much to get to the meat of the code

}

我不太清楚您发布的代码中是否需要@Transactional。我希望你的服务或DAO层。

<body>
    <h1>
        <spring:message code="register.message" />
    </h1>
    [...]
    <form:form modelAttribute="user" action="/registerVerify" method="post">

        [...]
        <spring:message code="register.country" />
        <form:select path="country" items="${countryList}" />
        [...]
        <input type="submit" value="<spring:message code='register.submit'/>" />
    </form:form>
</body>

这假设countryuser的属性。您还可以将方法名称更改为getCountries()而不是getCountryMap()