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

url中传递对象参数

假设您想传递原始数据类型,例如复杂的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中传递对象参数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348683.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++两天一个程序(一)

#include  using namespace std;  main()   {    int  i 7;    int* ip &i;    int** ipp &ip;    cout << "Address " << ip << " contains " << *ip << endl;    cout << "A…

两个迭代器的故事

当您查看最受欢迎的Java面试问题时&#xff0c;可能会遇到有关快速故障和故障安全迭代器的问题&#xff1a; 故障快速迭代器和故障安全迭代器之间有什么区别&#xff1f; 简化的答案是&#xff1a; 如果在迭代过程中修改了集合&#xff0c;则快速失败迭代器将引发ConcurrentM…

数据库系统内部体系结构与外部体系结构

数据库系统的内部和外部体系结构 (1)内部体系结构模式&#xff1a;概念视图&#xff0c;概念级数据库&#xff0c;整个数据库的实际存储的抽象。一个数据库只有一个模式。 外模式&#xff1a;子模式&#xff0c;用户模式&#xff0c;最外层&#xff0c;是模式的子集&#xff0c…

三个世界及其有关概念

三个世界及其有关概念 数据库管理的对象(数据)存在于现实世界中&#xff0c;即现实世界中的事物及其各种联系。从现实世界的事物到存储到计算机的数据库中的数据,要数经历现实世界、信息世界和计机世界三个不同的世界,经历两级抽象和转换完成。 认识抽象&#xff0c;概念模型 1…

将文件拆分为流

上周&#xff0c;我讨论了类Pattern新的&#xff08;since 1.8&#xff09;方法splitAsStream可以处理字符序列&#xff0c;仅从流中读取该字符序列&#xff0c;并且不进行模式匹配以创建所有可能的元素并返回它作为流。 这种行为是流的本质&#xff0c;它是支持高性能应用程序…

数据模型

数据模型 现实世界中的事物及其联系,经过两级抽象和转换后形成了计算机世界中的数据及其联系,而数据模型就是用来描述数据及其联系的。 数据库中存放数据的结构是由数据模型决定的,数据模型是数据库的框架&#xff0c;是数据库系统的核心和基础。 数据模型是描述数据、数据联系…

activemq优先级_ActiveMQ消息优先级:工作原理

activemq优先级在邮件列表中 &#xff0c;通常会围绕ActiveMQ的消息优先级支持不断提出一些问题&#xff0c;以及有关观察到的行为和“真正支持什么”的好问题&#xff1f; 我希望可以帮助您了解幕后情况以及可以支持的优先级。 详细信息可能会有些麻烦。 如果您对这些细节不感…

移动通信

通信: 信源和信宿间信息的传输和交换构成了通信。 2)分类通信&#xff1a;固定通信&#xff0c;移动通信移动通信通信双方至少有-方在移动中(或者临时停留在某一非预定的位置 上)进行信息传输和交换。 这包括移动体(车辆、船舶、飞机和行人)和移动体之间的通信&#xff0c;移动…

移动通信(2)

二 移动通信系统工作方式 1)通信系统传输方式: 传输方式&#xff1a;单向&#xff0c;双向&#xff08;单工&#xff0c;半双工&#xff0c;双工&#xff09; 注意移动通信系统中所定义的工作方式与通信原理中并不一致。 2)工作方式类别 (1)单工通信:通信双方电台仅能交替地进行…

Java 9概览

对于许多Java 9来说&#xff0c;它似乎是一个维护版本&#xff0c;它推动了不能在Java 8中实现的项目Jigsaw。但是&#xff0c;随着JDK中的新模块系统以及与之相关的许多内部更改&#xff0c;Java 9也带来了开发人员工具箱中一些很棒的新内容。 以下是重点内容&#xff1a; JS…

数据库(3)——关系

关系的形式化定义和概念 &#xff08;1&#xff09;关系上域的定义Domain1)域是一组具有相同数据类型的值的集合,又称为值域。(用D表示)2)域中所包含的值的个数称为域的基数(用m表示)。 在关系中用域表示属性的取值范围。 D1{李力,王平&#xff0c;刘伟} , m3 ; &#xff08;2&…

数据库(4)——候选码和主键

候选码或候选键&#xff08;Candidate Key&#xff09; 如果在一个关系中&#xff0c;存在一个或一组属性的值能唯一地标识该关系的一个元组&#xff0c;则这个属性或属性组称为该关系的候选码或候选键&#xff0c;一个关系可能存在多个候选码。 候选码性质&#xff1a;唯一性&…

adf开发_了解ADF Faces clientComponent属性

adf开发我相信大多数ADF开发人员都知道ADF Faces属性clientComponent 。 在本文中&#xff0c;我将展示该属性实际上如何影响组件渲染以及它如何改变其行为。 让我们开始考虑一个非常简单的示例&#xff1a; <af:inputText label"Label 1" id"it1" /&g…

通信原理

绪论 1&#xff09;信息&#xff0c;消息&#xff0c;信号通信&#xff1a;利用电&#xff08;或者光&#xff09;信号传输消息中所包含的信息。信息&#xff1a;消息的内涵。 消息&#xff1a;信息的物理表现形式。&#xff08;可分为两类连续消息语音&#xff0c;音乐&#x…

Picocli 2.0:事半功倍

介绍 Picocli是一个单文件命令行解析框架&#xff0c;它使您几乎不需要任何代码即可创建命令行应用程序。 使用Option或Parameters注释应用程序中的字段&#xff0c;picocli将分别使用命令行选项和位置参数填充这些字段。 例如&#xff1a; Command(name "Greet", …

通信原理—通信系统组成

通信系统的组成 1一般模型信源——>发送设备——>信道&#xff08;噪声源&#xff09;——>接收设备——>信宿 通信系统是指传递信息所需的一切设备和信道的总体。 信源 &#xff1a;把消息变化原始电信号&#xff08;基带信号&#xff09;&#xff0c;非电量转化为…

无线通信(补充)

长波通信 长波通信是波长为1 000&#xff5e;10 000m&#xff08;频率为30&#xff5e;300kHz&#xff09;的无线电通信。 主要用于军事上&#xff0c;如潜艇通信、地下通信及导航等。 在一定范围内&#xff0c;长波通信以地波传播为主&#xff0c;当通信距离大于地波的最大传播…

Java 20年

二十年前&#xff0c;在苏黎世的一间公寓里发生了两件事。 我的女儿迈出了第一步&#xff0c;一位年轻的博士后研究员&#xff08;她的父亲&#xff09;迈出了使用Java的第一步。 很难完全理解当时的Java。 在这些时代&#xff0c;TCL盛行&#xff0c;Java时代与冰箱和烤面包机…

数据库设计()

数据库设计1 数据库设计的任务数据库设计是指根据用户需求研制数据库结构和行为的过程。对于一个给定的应用环境&#xff0c;构造最优的数据库模式&#xff0c;建立数据库及其应用系统;有效地存储数据&#xff0c;满足用户的信息要求和处理要求。 2数据库设计的特点 结构源于行…

移动通信—无线波传播

无线波传播 发射天线或自然辐射源所辐射的无线电波,通过自然条件下的媒质到达接受天线的过程称为无线电波传播。无线电波与可见光、X射线与γ射线-.样同属于电磁波,它们都是以电场和磁场为其特征的- -种电场震动。电磁波的频谱范围很宽,从几赫到3X 1023Hz(波长从几十兆米到10-9…