Java 如何模仿Wicket 1.5中的杂交编码策略?
我们现有的Java Wicket 1.4应用程序广泛使用HybridUrlCodings策略:Java 如何模仿Wicket 1.5中的杂交编码策略?,java,wicket,Java,Wicket,我们现有的Java Wicket 1.4应用程序广泛使用HybridUrlCodings策略: mount(new HybridUrlCodingStrategy("/myurl", MyPage.class)); 这导致我们的URL看起来像: http://host/myurl/paramName1/paramValue1/paramName2/paramValue2 我希望在Wicket 1.5中保持此URL格式,但是HybridUrlCodings策略已被删除。在wicket 1.5中
mount(new HybridUrlCodingStrategy("/myurl", MyPage.class));
这导致我们的URL看起来像:
http://host/myurl/paramName1/paramValue1/paramName2/paramValue2
我希望在Wicket 1.5中保持此URL格式,但是HybridUrlCodings策略已被删除。在wicket 1.5中,页面的安装方式如下:
mountPage("/myurl", MyPage.class);
这会产生传统的URL,如:
http://host/myurl?paramName1=paramValue2¶mName2=paramValue2
我已经读到我们应该使用MountedMapper类,但是看看Wicket 1.5示例、API文档和源代码,我仍然不清楚如何使用MountedMapper获得与HybridUrlCodingStrategy相同的行为
有人知道怎么做吗?可能是这样的:
mountPage("/myurl/paramName1/${paramValue1}/paramName2/${paramValue2}", MyPage.class)
行吗?当然,您必须手动指定参数,这可能需要更多的工作。
类javadoc解释了如何使用参数
我能想到的另一个选项是(注意:这是未经测试的):
类MyPageParametersEncoder实现IPageParametersEncoder(){
公共页面参数decodePageParameters(请求)
{
PageParameters=新的PageParameters();
int i=0;
for(迭代器段=request.getUrl().getSegments().Iterator();段.hasNext()){
字符串键=段。下一步();
字符串值=段。下一步();
参数。添加(键、值);
}
返回参数。isEmpty()?null:参数;
}
公共Url encodePageParameters(PageParameters PageParameters)
{
Url=新Url();
对于(PageParemeters.NamedPair对:pageParameters.getAllNamed(){
url.getSegments().add(pair.getKey());
url.getSegments().add(pair.getValue());
}
返回url;
}
}
mount(新mountedapper(“/myurl/”,MyPage.class,新MyPageParametersEncoder());
无需定制IPageParametersEncoder 使用mountPage(“/myurl/paramName1/${paramValue1}/paramName2/${paramValue2}”,MyPage.class)时,URL将与1.4中的URL类似,但可以通过StringValue value1=parameters.get(“paramValue1”)访问这些值。与value2类似 对于mountPage(“/myurl/${paramValue1}/${paramValue2}”,MyPage.class)根据提取的值是相同的,只会使用更短的URL
它还支持可选的参数-#{optionalValue3}。注意:Wicket 1.5.2中添加了一个新类,以向后兼容1.4样式的URL编码。它被称为UrlPathPageParametersEncoder-如果您要将Wicket 1.4应用程序迁移到1.5,并且您具有该样式的可书签页面链接,请使用该类: www.mysite.com/name1/value1/name2/value2 从1.4迁移到1.5时,我们遇到了完全相同的问题。任何1.4应用程序在运行一段时间后,都可能会有一组指向它的链接,这些链接来自web上的外部站点。您真的希望Wicket 1.5版本的应用程序能够处理这些现有的混合链接,而不会产生错误 在迁移到1.5时,如果没有兼容1.4的IPageParametersEncoder实现,您需要在每次装载中包含完整的参数规范,以避免对读取参数的每个页面类进行更改。下面的实现意味着不再需要这样做。只需按照livid的建议装载页面即可e 我将这个.java文件作为补丁提交给Wicket开发人员-他们将来可能会将其包含在Wicket中,以便为其他1.4迁移程序实现向后兼容的URL参数编码 我在上面使用了luniv的示例代码,并对其进行了一些小的更改以使其能够编译/工作
package org.apache.wicket.request.mapper.parameter;
import java.lang.*;
import org.apache.wicket.request.mapper.parameter.IPageParametersEncoder;
import java.util.Iterator;
import org.apache.wicket.request.Request;
import org.apache.wicket.request.Url;
import org.apache.wicket.request.mapper.parameter.PageParameters;
public
class HybridPageParametersEncoder implements IPageParametersEncoder
{
/**
* Encodes a URL in the form:
*
* /mountpoint/paramName1/paramValue1/paramName2/paramValue2
*
* (i.e. a URL using the pre wicket 1.5 Hybrid URL strategy)
*/
public Url encodePageParameters(PageParameters pageParameters)
{
Url url = new Url();
for (PageParameters.NamedPair pair : pageParameters.getAllNamed())
{
url.getSegments().add(pair.getKey());
url.getSegments().add(pair.getValue());
}
return url;
}
/**
* Decodes a URL in the form:
*
* /mountpoint/paramName1/paramValue1/paramName2/paramValue2
*
* (i.e. a URL using the pre wicket 1.5 Hybrid URL strategy)
*/
public PageParameters decodePageParameters(Request request)
{
PageParameters parameters = new PageParameters();
int i = 0;
for (Iterator<String> segment = request.getUrl().getSegments().iterator(); segment.hasNext(); )
{
String key = segment.next();
String value = segment.next();
parameters.add(key, value);
}
return parameters.isEmpty() ? null : parameters;
}
}
package org.apache.wicket.request.mapper.parameter;
导入java.lang.*;
导入org.apache.wicket.request.mapper.parameter.IPageParametersEncoder;
导入java.util.Iterator;
导入org.apache.wicket.request.request;
导入org.apache.wicket.request.Url;
导入org.apache.wicket.request.mapper.parameter.PageParameters;
公开的
类HybridPageParametersEncoder实现IPageParametersEncoder
{
/**
*将URL编码为以下格式:
*
*/mountpoint/paramName1/paramValue1/paramName2/paramValue2
*
*(即使用pre-wicket 1.5混合URL策略的URL)
*/
公共Url encodePageParameters(PageParameters PageParameters)
{
Url=新Url();
对于(PageParameters.NamedPair对:PageParameters.GetAllName())
{
url.getSegments().add(pair.getKey());
url.getSegments().add(pair.getValue());
}
返回url;
}
/**
*解码以下格式的URL:
*
*/mountpoint/paramName1/paramValue1/paramName2/paramValue2
*
*(即使用pre-wicket 1.5混合URL策略的URL)
*/
公共页面参数decodePageParameters(请求)
{
PageParameters=新的PageParameters();
int i=0;
for(迭代器段=request.getUrl().getSegments().Iterator();段。hasNext();)
{
字符串键=段。下一步();
字符串值=段。下一步();
参数。添加(键、值);
}
返回参数。isEmpty()?null:参数;
}
}
自定义编码器是一个避免为每个页面手动构建整个URL的想法。但除此之外,您所说的:)如果没有自定义编码器,您必须手动将页面装载到所有可能的参数排列中,并处理先前生成的URL。@biziclop-没错。幸运的是,Wicket 1.5.2中添加了一个名为UrlPathPageParametersEncoder的自定义编码器,因此不再需要自定义编码器。这基本上实现了客户编码器的功能上面有,但有一些修正来处理一些特殊情况。@Volksman Th
package org.apache.wicket.request.mapper.parameter;
import java.lang.*;
import org.apache.wicket.request.mapper.parameter.IPageParametersEncoder;
import java.util.Iterator;
import org.apache.wicket.request.Request;
import org.apache.wicket.request.Url;
import org.apache.wicket.request.mapper.parameter.PageParameters;
public
class HybridPageParametersEncoder implements IPageParametersEncoder
{
/**
* Encodes a URL in the form:
*
* /mountpoint/paramName1/paramValue1/paramName2/paramValue2
*
* (i.e. a URL using the pre wicket 1.5 Hybrid URL strategy)
*/
public Url encodePageParameters(PageParameters pageParameters)
{
Url url = new Url();
for (PageParameters.NamedPair pair : pageParameters.getAllNamed())
{
url.getSegments().add(pair.getKey());
url.getSegments().add(pair.getValue());
}
return url;
}
/**
* Decodes a URL in the form:
*
* /mountpoint/paramName1/paramValue1/paramName2/paramValue2
*
* (i.e. a URL using the pre wicket 1.5 Hybrid URL strategy)
*/
public PageParameters decodePageParameters(Request request)
{
PageParameters parameters = new PageParameters();
int i = 0;
for (Iterator<String> segment = request.getUrl().getSegments().iterator(); segment.hasNext(); )
{
String key = segment.next();
String value = segment.next();
parameters.add(key, value);
}
return parameters.isEmpty() ? null : parameters;
}
}