在泽西1. x中,您可以使用ContainerRequest.getFormParameters()
对表单数据进行请求过滤,但我在泽西2. x中没有看到明显的等效项。我已经实现了ContainerRequest estFilter
接口,它让我可以访问ContainerRequest estContext
,但是从那里如何获取表单数据呢?
泽西1. x示例:
public class MyFilter implements ContainerRequestFilter {
public ContainerRequest filter(ContainerRequest request) {
Form f = request.getFormParameters();
// examine form data and filter as needed
}
}
球衣2。x示例:
public class MyFilter implements ContainerRequestFilter {
public void filter(ContainerRequestContext context) {
// how do I get to the Form data now?
}
}
这是一种在不依赖于特定实现类的情况下读取表单实体的方法,即它可以同时使用jer(v2)或CXF(v3)。
@Provider
public class AFilter implements ContainerRequestFilter {
@Context
private Providers providers;
@Override
public void filter(ContainerRequestContext request) throws IOException {
if (!request.hasEntity() || !MediaTypes.typeEqual(APPLICATION_FORM_URLENCODED_TYPE, request.getMediaType())) {
// if not a form ...
return;
}
ByteArrayInputStream resettableIS = toResettableStream(request.getEntityStream());
Form form = providers.getMessageBodyReader(Form.class, Form.class, new Annotation[0], APPLICATION_FORM_URLENCODED_TYPE)
.readFrom(Form.class, Form.class, new Annotation[0], APPLICATION_FORM_URLENCODED_TYPE, null, resettableIS);
// do something with Form
resettableIS.reset();
request.setEntityStream(resettableIS);
}
@Nonnull
private ByteArrayInputStream toResettableStream(InputStream entityStream) throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = entityStream.read(buffer)) > -1) {
baos.write(buffer, 0, len);
}
baos.flush();
return new ByteArrayInputStream(baos.toByteArray());
}
}
这运行良好,并且具有仅使用JAX-RS API的好处,因此是可移植的。
然而,请注意CXF 2。x使用JAX-RS API 2.0-m10,它还没有类。在这种情况下,可以简单地替换形式。通过多值映射分类。以一些未检查/原始类型警告为代价。
表单POST参数在http请求体中发送,因此使用ContainerRequestContext可以执行以下操作:
String q = IOUtils.toString(context.getEntityStream(), Charsets.UTF_8);
String[] params = q.split("&");
Map<String, String> map = new HashMap<>();
for (String param : params)
{
String name = param.split("=")[0];
String value = param.split("=")[1];
map.put(name, value);
}
经过大量的搜索和反复尝试,我在Jersey 2中找到了一种合适的方法。您必须手动使用请求实体主体,但您必须小心使用不会阻止后续过滤器和资源也使用它的方式。下面是一个将实体读入表单对象的简单示例:
@Provider
public class FormDataFilter implements ContainerRequestFilter
{
@Override
public void filter(ContainerRequestContext requestContext) throws IOException
{
if (requestContext instanceof ContainerRequest)
{
ContainerRequest request = (ContainerRequest) requestContext;
if ( requestContext.hasEntity()
&& MediaTypes.typeEqual(MediaType.APPLICATION_FORM_URLENCODED_TYPE,request.getMediaType()))
{
request.bufferEntity();
Form f = request.readEntity(Form.class);
}
}
}
}
关键是调用BufferEntity()。没有这个,实体被标记为关闭,并在任何后续读取尝试中导致IllegalStateExceptions。
我有一个带有键的HashMap,值是字符串。我想通过以字符串“locationid”开头的键值过滤HashMap,并将键中的值返回到字符串数组列表中。HashMap的填充方式如下: 我需要arraylist中的ORG_Id值。 我找不到可以将值放入字符串列表的位置。编译错误是它不识别values()方法。 更新还尝试将筛选后的Hashmap放入另一个Hashmap中,如下所示: 但得到的编译错误是
我正在尝试用Angular 7建立一个动态研究。我正在用多个键从API中获取一个数组:[_id= 我用ngFor显示我所有的结果,我已经用我找到的教程创建了一个过滤管道… 这是我的研究部分: 这是我的过滤管功能: 但是这只会过滤这样的数组:[
在Excel中,根据其他工作表中的列表筛选行非常容易。但是,GoogleSheets没有高级过滤选项。因此,不能像在Excel中那样按列表范围和条件范围过滤列。那么,如何根据Google Sheets中其他工作表的列表筛选行呢? 要筛选的工作表 带有筛选列表的工作表
本文向大家介绍基于jQuery选择器之表单对象属性筛选选择器的实例,包括了基于jQuery选择器之表单对象属性筛选选择器的实例的使用技巧和注意事项,需要的朋友参考一下 注意: 在某些浏览器中,选择器:checked可能会错误选取到<option>元素,所以保险起见换用选择器input:checked,确保只会选取<input>元素 以上这篇jQuery选择器之表单对象属性筛选选择器实例就是小编分享
选择数据表格头部 图标,可以选择表格内字段进行复杂条件筛选; 筛选结果在表格内显示; 选择: 选择图层内字段名称 约束条件: 对选择的该字段指定条件,条件一般有等于、小于、大于等(数值型字段)、或者包含、不包含等(文本型字段)... 约束值:输入需要限制的值 可以支持多种条件同时筛选、或者任选其一条件满足;
我想从一个表中创建一个报告,该表的数据可以根据用户的请求进行排序,我尝试如下 suppliers.blade.php 路线 报告控制器。php 我尝试按Id(Desc)和名称(Z-A)排序,但结果总是按Id(Asc)排序,如下所示