java - 如何创建隐藏其参数的 Wicket URL?

标签 java url wicket url-encoding url-parameters

我目前正在使用如下代码创建一组链接:

BookmarkablePageLink<CheeseMain> havarti =
    new BookmarkablePageLink<CheeseMain>("havarti", CheeseMain.class);
havarti.setParameter("Title", "Havarti");
havarti.setParameter("Group", "cheeseName");
add(havarti);

出来的URL有格式 https://mysite.com/;jsessionid=B85EE5CB0349CCA2FE37AF76AB5C30C1?wicket:bookmarkablePage=:com.mycompany.cheese.CheeseMain&Title=Havarti&group=cheeseName

我的问题是我不再希望此链接的 URL 可 Collection 。理想情况下,我希望它像 https://mysite.com/cheese 这样简单,但我可以接受丑陋的 URL。重要的是参数不可见。

我应该如何更改生成链接的方式?我查看了 Wicket 提供的不同 URL 编码策略,但它们都没有删除参数;他们只是以不同的方式显示它们。

最佳答案

仅当页面可添加书签或特定链接可添加书签时,参数才会出现在 URL 中。

如果您创建一个 Link使用 setResponsePage(Page) 导航到页面(传递 Page 实例)而不是 setResponsePage(Class<Page>, PageParameters) (传递 Page 类),创建的链接不会指向页面的可 Collection 版本,而是指向有状态实例。

不过,要使其正常工作,您不能调用 super(PageParameters)构造函数(这样页面就没有足够的信息来构建无状态 URL)。

在此示例中,您可以导航到 SecretPage通过两种不同的链接,一种是无状态的、可 Collection 的,另一种是有状态的。

SecretPage也有两个构造函数。一个收到 PageParameters并调用 super通过它。另一个直接通过构造参数接收值,而不将其传递给 super (如果它调用了 super(new PageParameters().add("message",message) ,就像在注释行中一样,它会自动重定向到一个可 Collection 的 URL)。

主页.java:

public class HomePage extends WebPage {
    public HomePage(final PageParameters parameters) {
        add(new BookmarkablePageLink<Void>("bookmarkable", SecretPage.class,
            new PageParameters().add("message", "This message will appear in the URL")));
        add(new Link<Void>("instance") {
            @Override
            public void onClick() {
                setResponsePage(new SecretPage("This message will NOT appear in the URL"));
            }
        });
    }
}

主页.html:

<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" >
<body>
  <p><a wicket:id="bookmarkable">Bookmarkable link (stateless)</a></p>
  <p><a wicket:id="instance">Hidden parameters link (stateful)</a></p>
</body>
</html>

secret 页面.java

public class SecretPage extends WebPage {
    public SecretPage(PageParameters parameters) {
        super(parameters);
        init(parameters.get("message").toString("No message!"));
    }
    public SecretPage(String message) {
        // super(new PageParameters().add("message", message)); // COMMENTED!
        init(message);
    }
    private void init(String message) {
        info(message);
        add(new FeedbackPanel("feedback"));
        add(new BookmarkablePageLink<Void>("back", getApplication().getHomePage()));
    }
}

secret 页面.html

<html xmlns:wicket="http://wicket.apache.org/dtds.data/wicket-xhtml1.4-strict.dtd" >
<body>
  <p wicket:id="feedback"></p>
  <p><a wicket:id="back">BACK</a></p>
</body>
</html>

并且,要有一个简单的 URL,比如 http://host/app/secret ,您必须安装它。你可以在你的 WebApplication 中完成类。

WicketApplication.java

public class WicketApplication extends WebApplication {
    @Override
    protected void init() {
        super.init();
        mountPage("home", getHomePage());
        mountPage("secret", SecretPage.class);
    }
    public Class<HomePage> getHomePage() {
        return HomePage.class;
    }
}

此示例使用 Wicket 1.5(仍然是 RC4.2),需要进行一些修改才能与 1.4.x 一起使用(一些方法和类已重命名,或移至不同的包),但思想是相同的。

关于java - 如何创建隐藏其参数的 Wicket URL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6390953/

相关文章:

c# - 获取 Html.RouteLink 结果的 URL 地址

html - 在 OCaml 中读取 URL 的 HTML 内容

java - Wicket 和多线程业务对象

java - Wicket - 使用 AJAX 和 Wicket 模型更新 ListView

java - 如何检查mysql中的blob列是否为null或为空

java - 从 ArrayList 中删除某个字符串找到的第一个元素?

java - 即使线程终止后锁也不会释放

java - 使用 jcalender 时,我无法通过 MySQL 从 java 应用程序中按日期搜索?

swift - 如果让 url = URL(string :"") 对于 .JPEG 图像总是失败

java - wicket 1.5 新网址