我想使用Wicket构建一个应用程序,但我有一些设计师想要编写/维护javascript,他们基本上希望每页有一个JS段,以及一个全局JS文件。 我认为在wicket中添加javascript的最自然的方法是为每个组件添加它(不是每页),这会给那些设计者带来问题(分段javascript,并且必须在java文件中编写它)。有没有更好的方法来解决这个问题? (当然,我希望在部分刷新后能够正常工作。)
他们想要的第二个(相关)事情(我实际上也喜欢)可以通过静态链接以JSON格式请求信息,这在Wicket中是否可行?
答案 0 :(得分:3)
我开始使用JSON,让我的wicket页面返回JSON,但很快意识到有更好的工具,特别是如果你有一个完整的Web服务层。如果您只是需要一个小JSON,那么总是通过GET,然后确定,只需制作一个Wicket页面。
我最终在Wicket旁边使用Jersey和Jackson。 Jersey简化了可以使用不同的http方法(GET / POST / PUT / DELETE)执行不同操作的URL的配置,以及轻松解析查询字符串等。我会考虑使用此路由来满足更重的JSON需求。
您可以使用一些web.xml配置在同一个Web应用程序中轻松运行Wicket和Jersey。
答案 1 :(得分:1)
对第二个问题的快速回答是肯定的。使用bookmarkable links访问返回JSON数据的资源。
答案 2 :(得分:1)
Wicket内置的AJAX支持始终是有状态的,因此可以通过更改URL进行访问。如果您的设计人员不打算使用Wicket的JS库,那么安装JSON页面非常简单:
public class JsonReturningPage extends WebPage {
public JsonReturningPage(PageParameters params) {
String json = "{foo: 4711}";
IRequestTarget t = new StringRequestTarget("application/json", "UTF-8", json);
getRequestCycle().setRequestTarget(t);
}
}
或者,您也可以实现自己的AbstractRequestTargetUrlCodingStrategy
直接从IRequestTarget
返回IRequestTarget decode(RequestParameters params)
并将其挂载到您的应用中。
关于JS文件,我会尝试教他们每个组件使用一个文件。这当然具有更少的复制粘贴代码和更简单的维护的优点。另外,我肯定会在Java代码中阻止JS。通常只需要将数据或配置传递给JS,作为变量定义或方法调用。由于这些数据通常是Java,JS是由设计师编写的,因此设计师和程序员需要合作。
答案 3 :(得分:1)
您可以轻松使用以下代码与Wicket动态通信:
AbstractDefaultAjaxBehavior callme = new AbstractDefaultAjaxBehavior(){
@Override
protected void respond(AjaxRequestTarget target) {
}
};
page.add(callme);
//From any ajaxrequesttarget you can simply append the following code:
target.appendJavascript("wicketAjaxGet('"+callme.getCallbackUrl()+");");
这样你就可以拥有ajaxlink等......将ajaxrequest转移到Wicket端。如果要传递数据(虽然静态链接听起来不像那样),请执行以下操作:
"wicketAjaxGet('"+callme.getCallbackUrl()+"&x='+value_to_pass_back''";
//to Read the value in the respond:
String x = RequestCycle.get().getRequest().getParameter("x");
所以回调的url是动态生成的(因为回调url特定于会话),但它的形成就像任何其他url ....
对我而言,这比在wicket之上构建JSON系统简单10倍,而不是使用内置于其中的JSON系统....我一直使用它,它至少对我很有用。如果您的解决方案不同/更好,我想知道为什么。