假设您要传递原始数据类型,例如复杂的Java对象
java.util.Data,java.lang.List,泛型类,数组以及通过URL参数所需的所有内容,以便在页面加载后在任何网页上预设默认值。 共同的任务? 是的,但是可用的解决方案主要限于java.lang.String的编码/解码。 我将展示的方法对数据类型没有任何限制。 URL大小的限制只有一个限制。 长度超过2083个字符的URL在旧的IE版本中可能无法正常工作。 现代Firefox,Opera和Safari可以处理URL中的至少80000个字符。

如果我们将对象序列化为JSON并在服务器端反序列化它们,则可以通过URL参数传递任何类型的对象。 编码的JSON字符串具有有效的
格式,这是一种方法! 好吧,但是有一个问题。 如果对象是非通用类型,则从JSON格式序列化/反序列化可以正常工作。 但是,如果对象属于通用类型,则通用类型信息会因为Java Type Erasure而丢失。 在这种情况下该怎么办? 我要演示的解决方案不仅仅限于JSF,而是在开发Java / Web前端时,我正在这个圈子中旋转……所以,让我们开始吧。 首先,我们需要一个适当的转换器来接收JSON格式的URL参数,并将其转换回Java。 PrimeFaces扩展提供了一个– JsonConverter.java。 怎么运行的? 以下示例显示如何将JsonConverter应用于f:viewParam,以将JSON格式的字符串列表转换为Java中的列表。

<f:metadata><f:viewParam name='subscriptions' value='#{subscriptionController.subscriptions}'><pe:convertJson type='java.util.List<java.lang.String>' /></f:viewParam>
</f:metadata><h:selectManyCheckbox value='#{subscriptionController.subscriptions}'><f:selectItem id='item1' itemLabel='News' itemValue='1' /><f:selectItem id='item2' itemLabel='Sports' itemValue='2' /><f:selectItem id='item3' itemLabel='Music' itemValue='3' />
</h:selectManyCheckbox>

JsonConverter具有一种可选的属性类型。 我们不需要为诸如boolean或int之类的原语提供数据类型信息。 但是通常,类型信息是必要的属性。 它指定值对象的数据类型。 支持任何原始类型,数组,非通用或通用类型。 该类型由完全限定的类名(原始类型除外)组成。 例子:

'long[]'
'java.lang.String'
'java.util.Date'
'java.util.Collection<java.lang.Integer>'
'java.util.Map<java.lang.String, com.prime.FooPair<java.lang.Integer, java.util.Date>>'
'com.prime.FooNonGenericClass'
'com.prime.FooGenericClass<java.lang.String, java.lang.Integer>'
'com.prime.FooGenericClass<int[], com.prime.FooGenericClass<com.prime.FooNonGenericClass, java.lang.Boolean>>'

该类型的字符串在运行时进行解析。 JsonConverter的代码在这里可用 (供有兴趣的读者使用)。 JsonConverter基于其他三个类: ParameterizedTypeImpl.java ,
GsonConverter.java和DateTypeAdapter.java 。 最后一个是用于日期的特殊适配器,因为java.util.Date应该转换为毫秒长,然后再转换回java.util.Date。 到目前为止,一切都很好。 但是,如何在Java端准备这些值作为URL参数呢? 我将展示一个可用于该目的的实用程序类。 请阅读评论,它们是不言自明的。

import org.apache.log4j.Logger;
import org.primefaces.extensions.converter.JsonConverter;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpServletRequest;/*** Builder for request parameters.*/
public class RequestParameterBuilder {private Logger LOG = Logger.getLogger(RequestParameterBuilder.class);private StringBuilder buffer;private String originalUrl;private JsonConverter jsonConverter;private String encoding;private boolean added;/*** Creates a builder instance by the current request URL.*/public RequestParameterBuilder() {this(((HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest()).getRequestURL().toString());}/*** Creates a builder instance by the given URL.** @param url URL*/public RequestParameterBuilder(String url) {buffer = new StringBuilder(url);originalUrl = url;jsonConverter = new JsonConverter();encoding = FacesContext.getCurrentInstance().getExternalContext().getRequestCharacterEncoding();if (encoding == null) {encoding = 'UTF-8';}}/*** Adds a request parameter to the URL without specifying a data type of the given parameter value.* Parameter's value is converted to JSON notation when adding. Furthermore, it will be encoded* according to the acquired encoding.** @param name name of the request parameter* @param value value of the request parameter* @return RequestParameterBuilder updated this instance which can be reused*/public RequestParameterBuilder paramJson(String name, Object value) throws UnsupportedEncodingException {return paramJson(name, value, null);}/*** Adds a request parameter to the URL with specifying a data type of the given parameter value. Data type is sometimes* required, especially for Java generic types, because type information is erased at runtime and the conversion to JSON* will not work properly. Parameter's value is converted to JSON notation when adding. Furthermore, it will be encoded* according to the acquired encoding.** @param name name of the request parameter* @param value value of the request parameter* @param type data type of the value object. Any primitive type, array, non generic or generic type is supported.*             Data type is sometimes required to convert a value to a JSON representation. All data types should be*             fully qualified.* @return RequestParameterBuilder updated this instance which can be reused*/public RequestParameterBuilder paramJson(String name, Object value, String type)throws UnsupportedEncodingException {jsonConverter.setType(type);String jsonValue;if (value == null) {jsonValue = 'null';} else {jsonValue = jsonConverter.getAsString(null, null, value);}if (added || originalUrl.contains('?')) {buffer.append('&');} else {buffer.append('?');}buffer.append(name);buffer.append('=');buffer.append(URLEncoder.encode(jsonValue, encoding));// set a flag that at least one request parameter was addedadded = true;return this;}/*** Adds a request parameter to the URL. This is a convenient method for primitive, plain data types.* Parameter's value will not be converted to JSON notation when adding. It will be only encoded* according to the acquired encoding. Note: null values will not be added.** @param name name of the request parameter* @param value value of the request parameter* @return RequestParameterBuilder updated this instance which can be reused*/public RequestParameterBuilder param(String name, Object value) throws UnsupportedEncodingException {if (value == null) {return this;}if (added || originalUrl.contains('?')) {buffer.append('&');} else {buffer.append('?');}buffer.append(name);buffer.append('=');buffer.append(URLEncoder.encode(value.toString(), encoding));// set a flag that at least one request parameter was addedadded = true;return this;}/*** Builds the end result.** @return String end result*/public String build() {String url = buffer.toString();if (url.length() > 2083) {LOG.error('URL ' + url + ' is longer than 2083 chars (' + buffer.length() +'). It may not work properly in old IE versions.');}return url;}/*** Resets the internal state in order to be reused.** @return RequestParameterBuilder reseted builder*/public RequestParameterBuilder reset() {buffer = new StringBuilder(originalUrl);jsonConverter.setType(null);added = false;return this;}
}

通常,使用RequestParameterBuilder的bean通过调用paramJson(…)或param(…)提供参数化的URL。

import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;/*** UrlParameterProvider bean.*/
@ManagedBean
@SessionScoped
public class UrlParameterProvider implements Serializable {private String parametrizedUrl;@PostConstructprotected void initialize() {RequestParameterBuilder rpBuilder = new RequestParameterBuilder('/views/examples/params.jsf');try {List<String> subscriptions = new ArrayList<String>();tableBlockEntries.add('2');tableBlockEntries.add('3');// add the list to URL parameters with conversion to JSONrpBuilder.paramJson('subscriptions', subscriptions, 'java.util.List<java.lang.String>');// add int values to URL parameters without conversion to JSON (just for example)rpBuilder.param('min', 20);rpBuilder.param('max', 80);   } catch (UnsupportedEncodingException e) {throw new RuntimeException(e);}parametrizedUrl = rpBuilder.build();}public String getParametrizedUrl() {return parametrizedUrl;}
}

在XHTML中使用– h:outputLink示例

<h:outputLink value='#{urlParameterProvider.parametrizedUrl}'>Parametrized URL
</h:outputLink>

一旦用户单击链接并以相对路径/视图/示例/params.jsf登陆目标页面,他/她将看到一个预先检查的h:selectManyCheckbox。 现实世界更加复杂。 实际上,我已经写了很多内置JsonConverter的自定义转换器。 因此,附加了自定义转换器,而不是<pe:convertJson type ='…'/>。 这个主题超出了这篇文章。

参考:来自JCG合作伙伴 Oleg Varaksin的URL参数中的复杂对象传递, 位于软件开发博客上。

翻译自: https://www.javacodegeeks.com/2013/03/passing-complex-objects-in-url-parameters.html

在URL参数中传递复杂对象相关推荐

  1. url中传递对象参数_在URL参数中传递复杂对象

    url中传递对象参数 假设您想传递原始数据类型,例如复杂的Java对象 java.util.Data,java.lang.List,泛型类,数组以及通过URL参数所需的所有内容,以便在页面加载后在任何 ...

  2. Java黑皮书课后题第7章:*7.12(倒置数组)7.7节中的reverse方法通过复制到新数组实现倒置。改写方法将参数中传递的数组倒置,并返回该数组。编写一个测试程序,输入10个数字,倒置它们并显示

    7.12(倒置数组)7.7节中的reverse方法通过复制到新数组实现倒置.改写方法将参数中传递的数组倒置,并返回该数组.编写一个测试程序,输入10个数字,倒置它们并显示 题目 题目描述 破题 代码 ...

  3. url地址中传递数组参数的方法

    数组参数通过post请求发送很简单,get请求则需要一些特殊的写法,例如要传递的数组参数的参数名为links,则在url地址中传参时可按如下方式进行传递: http://localhost:8080/ ...

  4. 【js操作url参数】获取指定url参数值、取指定url参数并转为json对象

    获取指定url参数值 /* 获取某url中的某参数值 调用:GetUrlQueryString("[url地址]","[参数名]"); */ function ...

  5. formdata 接受参数中带有class 对象_浅析JAVA中的反射机制及对Servlet的优化

    今天来聊聊java中的反射机制,工作以后发现很多东西动不动就要使用反射或者动态代理,如果不能很好的理解反射,那么对于动态代理等一些重要的设计模式就会有种不够通透的感觉. 所谓的反射,就是在运行状态中, ...

  6. formdata 接受参数中带有class 对象_Django(五)- 请求与响应 - request对象

    请求对象 一.客户端传参的几种方式 1. 通过URL路径(path)传递,例如:http://127.0.0.1:8000/news/1/2,两个参数:id和page 2. 通过 query stri ...

  7. liunx 上get 不到url参数 java_URL传递中文参数,大坑一枚,Windows与Linux效果竟然不一致...

    下午,计划2个小时搞定,个人官网第6次升级,就可以干点轻松的事了,结果,下午多搞了2个小时,晚上又搞了2个小时,才搞定.最后一个世界难题是,URL传递中文参数.问题大致是这么出现的:我为"博 ...

  8. MFC 自定义消息四步曲与在参数中传递变量

    今天自己也重学了一下 VC小自定义消息的使用,在网上查阅了相关资料,发现http://hi.baidu.com/atlight/blog/item/11ba969442df6218d21b70cd.h ...

  9. url中传递url参数|url中特殊字符、?、=无法解析问题

    url中传递url参数|url中特殊字符&.?.=无法解析问题 1.微信小程序报错:SyntaxError: Unexpected end of JSON input 2.错误场景复现 3.错 ...

最新文章

  1. 使用jdom.jar心得小结
  2. 我是买家的前世今生,该到了say goodbye的时候了!
  3. AuthFailed at /social-auth/complete/facebook/
  4. 微服务架构的常见问题
  5. P3835 【模板】可持久化平衡树
  6. PyTorch框架学习十二——损失函数
  7. 快速迁移Next.js应用到函数计算
  8. python爬虫获取下一页url_Python爬虫获取页面所有URL链接过程详解
  9. 部署可道云_可道云-快速搭建个人用云网盘
  10. 60-100-030-使用-Docker MySQL 8 主从复制
  11. web service 学习 2 -- 什么时候应该使用web service
  12. element-ui 解决 table 里包含表单验证的问题!
  13. 测测你写了多少行代码【转】
  14. html lt;tablegt;,HTML布局lt;divgt;orlt;tablegt;,
  15. 北京的旅游攻略(持续更新中)
  16. 从《哪吒之魔童降世》票房火爆,看国产动画产业市场化三十年
  17. halcon中如何生成椭圆_Halcon中关于角度计算和测量拟合的算子详解
  18. 酒店管理系统的设计与实现/酒店客房管理系统/酒店预定系统
  19. 图片压缩-speedpdf免费无损在线压缩图片
  20. Java函数式实现替代策略模式解决 if...else代码,Map+函数式接口方法

热门文章

  1. 属性 方法c语言,C语言如何实现C++中对象属性和方法
  2. import openfire4.0.2 source code in eclipse
  3. selenium自动化测试_Selenium测试可实现有效的测试自动化
  4. java isempty_Optional.isEmpty()即将加入Java吗?
  5. 白盒测试方法静态分析_静态分析的教育方面
  6. Apache Camel 3.1 –更多骆驼核心优化(第3部分)
  7. midlet_如何在J2ME中创建MIDlet
  8. Java Enterprise软件与应有的软件
  9. 服务器日志记录_5种改善服务器日志记录的技术
  10. 新的DMN编辑器预览