日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 url中传递对象参数_在URL参数中传递复杂对象 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

url中傳遞對(duì)象參數(shù)

假設(shè)您想傳遞原始數(shù)據(jù)類型,例如復(fù)雜的Java對(duì)象
java.util.Data,java.lang.List,泛型類,數(shù)組以及通過URL參數(shù)所需的所有內(nèi)容,以便在頁面加載后在任何網(wǎng)頁上預(yù)設(shè)默認(rèn)值。 共同的任務(wù)? 是的,但是可用的解決方案主要限于java.lang.String的編碼/解碼。 我將展示的方法對(duì)數(shù)據(jù)類型沒有任何限制。 URL大小的限制只有一個(gè)限制。 長度超過2083個(gè)字符的URL在舊的IE版本中可能無法正常工作。 現(xiàn)代Firefox,Opera和Safari可以處理URL中的至少80000個(gè)字符。

如果我們將對(duì)象序列化為JSON并在服務(wù)器端反序列化它們,則可以通過URL參數(shù)傳遞任何類型的對(duì)象。 編碼的JSON字符串具有有效的

格式,這是一種方法! 好吧,但是有一個(gè)問題。 如果對(duì)象是非通用類型,則從JSON格式序列化/反序列化可以正常工作。 但是,如果對(duì)象屬于通用類型,則通用類型信息會(huì)由于Java Type Erasure而丟失。 在這種情況下該怎么辦? 我要演示的解決方案不僅僅限于JSF,而是在開發(fā)Java / Web前端時(shí),我正在這個(gè)圈子中旋轉(zhuǎn)……所以,讓我們開始吧。 首先,我們需要一個(gè)適當(dāng)?shù)霓D(zhuǎn)換器來接收J(rèn)SON格式的URL參數(shù),并將其轉(zhuǎn)換回Java。 PrimeFaces擴(kuò)展提供了一個(gè)– JsonConverter.java。 這個(gè)怎么運(yùn)作? 以下示例顯示如何將JsonConverter應(yīng)用于f:viewParam,以將JSON格式的字符串列表轉(zhuǎn)換為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之類的原語提供數(shù)據(jù)類型信息。 但是通常,類型信息是必要的屬性。 它指定值對(duì)象的數(shù)據(jù)類型。 支持任何原始類型,數(shù)組,非通用或通用類型。 該類型由完全限定的類名(原始類型除外)組成。 例子:

'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>>'

該類型的字符串在運(yùn)行時(shí)進(jìn)行解析。 JsonConverter的代碼在這里可用 (供有興趣的讀者使用)。 JsonConverter基于其他三個(gè)類: ParameterizedTypeImpl.java ,
GsonConverter.java和DateTypeAdapter.java 。 最后一個(gè)是用于日期的特殊適配器,因?yàn)閖ava.util.Date應(yīng)該轉(zhuǎn)換為毫秒長,然后再轉(zhuǎn)換回java.util.Date。 到目前為止,一切都很好。 但是,如何在Java端將值準(zhǔn)備為URL參數(shù)呢? 我將展示一個(gè)可用于該目的的實(shí)用程序類。 請(qǐng)閱讀評(píng)論,它們是不言自明的。

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通過調(diào)用paramJson(…)或param(…)提供參數(shù)化的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>

一旦用戶單擊鏈接并以相對(duì)路徑/視圖/示例/params.jsf登陸目標(biāo)頁面,他/她將看到一個(gè)預(yù)先檢查的h:selectManyCheckbox。 現(xiàn)實(shí)世界更加復(fù)雜。 事實(shí)上,我已經(jīng)寫了很多內(nèi)置JsonConverter的自定義轉(zhuǎn)換器。 因此,附加了自定義轉(zhuǎn)換器,而不是<pe:convertJson type ='…'/>。 這個(gè)話題超出了這個(gè)職位。

參考:來自JCG合作伙伴 Oleg Varaksin的URL參數(shù)中的復(fù)雜對(duì)象的傳遞,來自“軟件開發(fā)思想”博客。

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

url中傳遞對(duì)象參數(shù)

總結(jié)

以上是生活随笔為你收集整理的url中传递对象参数_在URL参数中传递复杂对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。