【问题标题】:Mounted mapper with named parameters also receives requests for image带有命名参数的挂载映射器也接收图像请求
【发布时间】:2013-05-06 14:02:30
【问题描述】:

在我的应用程序中,我安装了以下 URL:

this.mountPage("/details/${site}", MerchantDetailPage.class);

因此,对例如 ../details/anything 的请求将创建一个带有页面参数的 MerchantDetailPage 实例:site=anything。

MerchantDetailPage的构造函数:

public MerchantDetail(final PageParameters parameters) {
    super();

    org.apache.wicket.util.string.StringValue storeParameter = parameters.get("site");
    if (!storeParameter.isEmpty()) {
        this.store = this.service.getStoreByQBonSiteWithCategoriesDescriptionsRegionAndAddress(storeParameter.toString());
    }

    if (store == null) {
        throw new RestartResponseAtInterceptPageException(Application.get().getHomePage());
    }

    // Build the page
    this.createPage(this.store, null);
}

这似乎工作正常,直到我注意到构造函数被调用了 4 次。 经过一番挖掘,我发现构造函数被调用了一次,参数为 site=anything,但随后又调用了 3 次,用于页面上的 3 个图像;例如:

<img wicket:id="store_no_image" src="./images/shop_no_logo_big.png" alt="logo" />

因此,对于此资源,Wicket 也在调用此页面,但参数为:site=images。

因此,商店是null,因此对图像的请求被重定向到主页 => 找不到图像。

为什么会这样?为什么 wicket 试图通过页面装载来处理资源请求?

一些侧面的cmets:

  • MerchantDetailPage 还有另一个构造函数,它直接从代码中调用并接受商店 ID 作为参数。在这种情况下,问题不会发生。
  • 如果我对图片使用绝对 URL,它确实可以工作(不会进入 MerchantDetailPage 进行图片请求)

【问题讨论】:

    标签: wicket wicket-1.6 wicket-6


    【解决方案1】:

    嗯...您的页面位于

    /detail/anything
    

    已正确映射到您的商家详情页面...

    您的图片位于

    /detail/images/shop_no_logo_big.png
    

    和类似的,已正确映射到您的商家详细信息页面... 挂载路径不知道也不关心是页面请求还是资源请求。值得一提的是,您可能正在使用挂载路径动态创建资源...

    因此,解决方案是将您的图像移动到与您的安装路径不匹配的位置。

    【讨论】:

    • Tx,但不知道该怎么做。我帖子中的图像位于webapp/images 中,因此被称为./images/shop_no_logo_big.png,因此是相对的。那么要把它移到哪里呢?我可以通过为其使用检票口图像组件来解决此图像的问题(因此不再在标记中)。然而,其他 2 个图像在 JavaScript(谷歌地图标记图像)中被引用,所以我不能在那里使用相同的方法。目前,我通过计算(在 JavaScript 中)标记图像的绝对 URL 来解决它。这可行(但不知道为什么),但我认为这是一种肮脏且临时的解决方法。
    • 如果你的图片在webapp/images,那么相对链接是错误的,因为它是相对于/detail/anything的。
    • 你到底是什么意思? &lt;img src="./images/shop_no_logo_big.png"/&gt; 正确显示图像,因此路径正常。对我来说,这里的问题是 Wicket 会寻找 /detail/images/shop_no_logo_big.png
    • 从哪个baseurl调用时正确显示图像? Wicket 不是在寻找 /details/images/and_so_on。浏览器是因为浏览器正在访问位于/detailsanything 资源,并且您告诉它查找位于dot/images/imagename 的图像,即wherever_you_are_right_now/images/imagename
    • 好的,我想我现在明白你的意思了。今晚我会尝试一下......
    猜你喜欢
    • 2012-10-26
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多