在上一篇有关新Java EE MVC框架的文章中,我们详细介绍了Controllers 。 在本篇和以下文章中,我们将看到如何在MVC控制器中访问各种类型的请求数据。
Java EE MVC大量使用了JAX-RS,我们将在本篇和下一篇文章中看到的大多数内容都是JAX-RS的功能。 因此,如果您熟悉JAX-RS,那么您可能不会在本文中学到很多新知识。
查询参数
 这篇文章着重于查询参数。 如果阅读我的Java EE MVC入门文章,您可能已经知道@QueryParam批注。 @QueryParam最常见的用例是将查询参数映射到控制器方法参数。 
例如:
@Controller
@Path("query-params")
public class QueryParamsController {@GETpublic String queryParams(@QueryParam("name") String name) {...}
}如果我们现在将HTTP GET请求发送到:
/query-params?name=john 字符串“ john ”将作为name参数传递给方法queryParams() 。 
类型转换
 使用@QueryParam可以将查询参数自动转换为各种类型。 
例如:
public enum Role {admin, reporter, accountant
}@Controller
@Path("query-params")
public class QueryParamsController {@GETpublic String queryParams(@QueryParam("id") long id,@QueryParam("name") String name,@QueryParam("role") Role role) {...}
}我们现在可以发送这样的请求:
/query-params?id=42&name=john&role=admin如果目标类型与以下规则之一匹配,则查询参数可以自动转换为类型:
- 它是原始类型
-  该类型具有一个接受单个String参数的构造函数
-  该类型具有一个名为valueOf()或fromString()的静态工厂方法,带有一个String参数
-  类型是List<T>,Set<T>; 或SortedSet<T>,其中T匹配先前的规则之一
 在前面的示例中,查询参数id自动转换为long 。 如果缺少id参数或无法转换为long ,则将引发异常。 也可以使用Long代替long 。 在这种情况下,如果缺少id参数,则会将null传递给controller方法。 
 枚举默认情况下具有valueOf()方法。 因此,查询参数role可以自动转换为相应的枚举值。 
在字段和方法上使用
 @QueryParam不限于方法参数。 也可以将查询参数映射到字段或方法,如以下示例所示: 
@Controller
@Path("query-params-fields")
public class QueryParamsFieldController {@QueryParam("id")private Long id;@QueryParam("role")private Role role;private String name;@QueryParam("name")public void setName(String name) {this.name = name;}@GETpublic String queryParams() {// use id, role and name}
}如果我们现在将HTTP GET请求发送到:
/query-params-fields?name=john&id=42&role=reporter 在调用queryParams()之前,将参数设置为id , role和name字段(通过setName() )。 
不要忘记为每个请求都创建了该类的新实例,因此拥有包含请求信息的字段是安全的。
快速总结
 @QueryParam批注可用于获取查询参数。 @QueryParam可以用于字段,方法和方法参数。 只要目标类型是基本类型,包含String构造函数或包含valueOf()或fromString()工厂方法,查询参数就可以自动转换为各种类型。 
- 您可以在GitHub上找到所有显示示例的源代码。
翻译自: https://www.javacodegeeks.com/2016/01/java-ee-8-mvc-working-query-parameters.html