从字段表单获取对象

时间:2017-10-20 16:33:36

标签: java spring-mvc velocity

问题:从字段中获取对象作为参数。

代码: 具有字段的实体用户:

Long id;
String name;
Office office;

有字段的实体办公室:

Long id;
String name;

newuser.vm

<title>NEW USER</title>
<body>
<form method="post" action="/save" property="user">  
    Name:
    <input type="text" name="name" path="name"/>    <br>

    Office:
    <select name="office" path="office">
        #foreach($office in $offices)
            <option value="$office">$office.name</option>
        #end
    </select>    <br>
    <input type="submit" value="SAVE"/>
</form>
</body>

和控制器

@Controller
public class ViewController {

    @Autowired
    private UserService userService;
    @Autowired
    private OfficeService officeService;

@RequestMapping(value = "/newuser", method = RequestMethod.GET)
    public ModelAndView newuser(){

        return new ModelAndView("fragments/newuser.vm","command",new User());
    }
@RequestMapping(value = "/save", method = RequestMethod.POST)
    public ModelAndView save(@ModelAttribute("user") User user){

        userService.create(user);
        return new ModelAndView("redirect:/list");
    }
//Model Attributes
    @ModelAttribute
    public void userTypesList(Model model){
        model.addAttribute("types", userService.getPositions());
    }
    @ModelAttribute
    public void officesList(Model model){
        model.addAttribute("offices", officeService.getAll();
}

因此,在submition的结果中,我必须使用Office作为其中一个字段来获取新用户。但是<option value="$office">$office.name</option>返回对象的字符串表示,但不是对象本身。所以我需要找到一种方法来正确地将其传递给/ save控制器。 当然,我可以从表单中获取字段数据,并创建一个新用户手动从表单获取office.id,然后发送另一个请求到sql获取officeById(id),但这似乎是编码的坏方法。 有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您需要的是:

<option value="$office.id">$office.name</option>

这就是id字段的用途。在提交表单时,只有办公室ID会被传回,这就是在创建新用户时填写连接到办公室桌面所需的全部内容。

$office显示整个对象的字符串表示形式(即其toString()方法)是预期的行为。