在上一篇文章中,我们看到了如何在MVC Controller中访问query , path和form参数 。 这篇文章展示了如何使用@BeanParam批注将多个参数映射到一个对象。
让我们重用关于表单参数的文章中的简单HTML表单:
<form action="submit" method="post"><label>ID:</label><input type="text" name="id" /><label>Name:</label><input type="text" name="name" /><label>Role:</label><select name="role"><option value="admin">Admin</option><option value="reporter">Reporter</option><option value="accountant">Accountant</option></select><input type="submit"/>
</form>
这定义了一个简单的表单,其中包含两个文本输入字段和一个带有三个选项的选择菜单。
在上一篇有关表单参数的文章中 ,我们了解到可以通过使用@FormParam注释控制器参数来访问这些参数。
但是,如果表单具有多个参数,则此方法很麻烦。 在这些情况下,我们通常希望将表单参数映射到单独的对象。 @BeanParams可以帮助我们做到这一点。
使用@BeanParam,我们可以编写:
@POST
@Path("submit")
@Controller
public String submit(@BeanParam User user) {// use user ..
}
User类如下所示:
public class User {@FormParam("id")private long id;@FormParam("name")private String name;@FormParam("role")private Role role;// getters and setters
}
调用controller方法时,将自动创建User的新实例。 创建的对象的字段将使用传递的表单参数填充。
@BeanParam和其他参数注释
与@BeanParam一起使用的类不限于表单参数。 以前的博客文章中显示的所有参数注释( @QueryParam , @PathParam等)都可以在bean参数内部使用。
例如:
@GET
@Path("/date/{year}/{month}")
public String get(@BeanParam RequestData data) {...
}
public class RequestData {@PathParam("year")private int year;@PathParam("month")private int month;@QueryParam("name")private String name;// getters and setters
}
如果我们现在将HTTP GET请求发送到
/date/2016/02?name=john
值2016、2和john将被注入字段Year,month和RequestData名称。
快速总结
使用@BeanParam可以将请求参数注入bean。 如果您有多个参数,这特别有用。 在bean参数内部,可以使用所有其他参数注释。
- 您可以在GitHub上找到示例源代码。
翻译自: https://www.javacodegeeks.com/2016/03/java-ee-8-mvc-working-bean-parameters.html