在上一篇有关新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