我有一个gwt应用程序,并且在某个时刻打开了一个applet,当这个applet执行一个动作时它会调用一个servlet。 从这个servlet,我需要将应用程序重定向到令牌“#Home”。
我试图调用History.newItem(“#home”),但它返回一个异常“服务器端的Unsuported操作”。
我尝试从servlet再次返回applet,并在applet中调用jnsi导出的javascript重定向到home,但它也不起作用,导航器(google chrome)可以看到我的导出函数,但是在调用时applet它给出了一个错误“找不到功能”
感谢您的帮助。
答案 0 :(得分:2)
散列片段(#home)永远不会访问服务器,浏览器不会在http请求中发送它,因此您无法从servlet中执行此操作。你应该在客户端这样做,所以试着找出你为什么得到“找不到功能”。
以下是如何从applet修改哈希片段的一个示例:http://standardcode.eu/programming/java/applet-interaction-with-url-hash.html
答案 1 :(得分:1)
我猜测,通过Applet你实际上并不是指Java applet,而是GWT从客户端Java代码生成的HTML和Javascript。确保不要混淆这些概念。您的GWT项目具有客户端Java代码(在编译时转换为HTML和CSS)和服务器Java代码,它按原样部署在服务器上。在服务器端调用History.newItem(...)是没有意义的,那就是应该放在客户端Java中的代码,这样它就会被转换为Javascript并在浏览器中调用(导航历史记录只在浏览器)。
此外,您要在此处执行的操作不是进行HTTP重定向,而只是通过使用附加到其上的锚点导航到不同的GWT页面/小部件。而且我猜你也想把它放在浏览器导航的历史中,以便用户可以正确使用浏览器的“后退”和“前进”按钮。为此,您需要在GWT主类上简单地实现ValueChangeHandler<String>
接口,实现public void onValueChange(ValueChangeEvent<String> event)
并从事件中解析收到的锚点并相应地更改您的视图。然后,当用户单击某个按钮或其他内容时,您可以使用History类来设置新事件,如下所示:
History.newItem("Home", true);
(true表示将生成一个事件。否则您只需将“home”标记添加到浏览器的历史堆栈中。)
这将使用包含“home”标记的事件调用onValueChange(...)
,然后您可以解析该标记并执行任何操作。