如何从PageClass和PageParameters中获取wicket URL而无需运行wicket应用程序(即无RequestCycle)?
在我的项目中,还有其他(非wicket)应用程序,它们需要知道一些域对象的URL表示(例如,为了编写类似如何从PageClass和PageParameters中获取wicket URL而无需运行wicket应用程序(即无RequestCycle)?,wicket,mount,Wicket,Mount,在我的项目中,还有其他(非wicket)应用程序,它们需要知道一些域对象的URL表示(例如,为了编写类似http://mydomain.com/user/someUserName/,并发送到通知电子邮件中) 现在我想在我的wicket模块中创建一个Springbean,在没有运行wicket上下文的情况下公开我需要的URL,以便使其他应用程序依赖于wicket模块,例如提供一个方法公共字符串getUrlForUser(User u)返回“/User/someUserName/” 我已经在网络和w
http://mydomain.com/user/someUserName/
,并发送到通知电子邮件中)
现在我想在我的wicket模块中创建一个Springbean,在没有运行wicket上下文的情况下公开我需要的URL,以便使其他应用程序依赖于wicket模块,例如提供一个方法公共字符串getUrlForUser(User u)
返回“/User/someUserName/”
我已经在网络和wicket源代码中搜索了整整一天,没有找到一种方法来检索给定PageClass和PageParameters的URL,而没有当前的RequestCycle
有什么办法可以做到这一点吗?实际上,我需要的所有信息都以某种方式存储在我的
WebApplication
中,我在其中定义了装入点和页面类。更新:,因为下面的代码在某些情况下会导致问题(在我们的情况下,由quarz计划的作业随后执行),我潜得更深一点,终于找到了一个更轻的解决方案
优点:
- 无需构造和运行WebApplication的实例
- 无需模拟ServletContext
- 工作完全独立于web应用程序容器
- 需要从WebApplication类中提取实际装载并将其封装在另一个类中,然后独立进程可以使用该类。您不能再使用WebApplication方便的
方法,但您可以轻松构建自己的方便实现,只需查看wicket源代码即可mountPage()
CompoundRequestMapper rm = new CompoundRequestMapper();
// mounting the pages
rm.add(new MountedMapper("mypage",MyPage.class));
// ... mount other pages ...
// create URL from page class and parameters
Class<? extends IRequestablePage> pageClass = MyPage.class;
PageParameters pp = new PageParameters();
pp.add("param1","value1");
IRequestHandler handler = new BookmarkablePageRequestHandler(new PageProvider(MyPage.class, pp));
Url url = rm.mapHandler(handler);
它不需要当前的RequestCycle
,但仍然需要运行MyWebApplication
然而,从Wicket的内部测试类中,我将以下内容组合在一起,以构建MyWebApplication
的虚拟实例:
MyWebApplication dummy = new MyWebApplication();
dummy.setName("test-app");
dummy.setServletContext(new MockServletContext(dummy, ""));
ThreadContext.setApplication(dummy);
dummy.initApplication();
和你需要的足够相似吗?谢谢,但不,一点也不。我需要的是URL,而不是呈现的标记。
MyWebApplication dummy = new MyWebApplication();
dummy.setName("test-app");
dummy.setServletContext(new MockServletContext(dummy, ""));
ThreadContext.setApplication(dummy);
dummy.initApplication();