我试图分开GWT客户端&服务器。如果我没有错,GWT客户端代码通过连接到我们在GWT Project的web.xml中提到的servlet获取服务器响应。如果是这样,我可以托管我的GWT Servlets在一个Tomcat服务器& GWT客户端代码在其他tomcat服务器..?GWT客户端文件在一个服务器和GWT Servlets在其他服务器
它会工作..?如果是这样的话,我已经在GWT客户端文件中尝试了一些与hosted.html一起工作的东西。但它没有奏效
我试图分开GWT客户端&服务器。如果我没有错,GWT客户端代码通过连接到我们在GWT Project的web.xml中提到的servlet获取服务器响应。如果是这样,我可以托管我的GWT Servlets在一个Tomcat服务器& GWT客户端代码在其他tomcat服务器..?GWT客户端文件在一个服务器和GWT Servlets在其他服务器
它会工作..?如果是这样的话,我已经在GWT客户端文件中尝试了一些与hosted.html一起工作的东西。但它没有奏效
是的,你可以在任何web服务器托管客户端文件,因为它们是静态的东西,实际上你需要的是挑选你的index.html,.nocache.js和所有* .cache。(js | html )文件,并将它们放在任何Web服务器(Apache,Nginx,iis,jetty等)中。
你甚至可以通过任何其他HTML生成像PHP,JSP等更换的index.html
但当然,服务器端应该在servlet容器中举行。
您必须注意的是,当包含静态文件的服务器位于与servlet服务器不同的域中时,由于安全约束(参见CORS),ajax请求将失败。
为了避免这种限制,gwt中有许多方法(gwtquery-jsonp,gwt-xdm等)。
我正在使用的是一个过滤器(见上面的代码)能够在收到选项请求时启用CORS。
您必须修改客户端代码以正确配置servlet容器的url。以下是使用RequestFactory更改网址的示例。对于RF
客户端代码:
myFactory = GWT.create(MyRFFactory.class);
DefaultRequestTransport transport = new DefaultRequestTransport();
transport.setRequestUrl("http://my.servletcontainer.com/gwtRequest");
myFactory.initialize(eventBus, transport);
web.xml配置
<filter>
<filter-name>CORSFilter</filter-name>
<filter-class>my.namespace.CORSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CORSFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
服务器过滤
public class CORSFilter implements Filter {
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
String o = req.getHeader("Origin");
if ("options".equalsIgnoreCase(req.getMethod())) {
resp.setHeader("Allow", "GET, HEAD, POST, PUT, DELETE, TRACE, OPTIONS");
if (o != null) {
resp.addHeader("Access-Control-Allow-Origin", o);
resp.addHeader("Access-Control-Allow-Methods",
"POST, GET, OPTIONS");
resp.addHeader("Access-Control-Allow-Headers",
"content-type,pageurl,x-gwt-permutation");
resp.setContentType("text/plain");
}
resp.getWriter().flush();
return;
}
if (o != null) {
resp.addHeader("Access-Control-Allow-Origin", o);
}
if (filterChain != null) {
filterChain.doFilter(req, resp);
}
}
@Override public void destroy() {
}
@Override public void init(FilterConfig arg0) throws ServletException {
}
}
这个例子中的eventBus是什么?我正在寻找类似的东西,这个示例代码可能就是我正在寻找的东西。 – timwoj
请求工厂(RF)需要gwt事件总线实例才能工作,通常它由所有gwt应用共享,这就是RF初始化需要它的原因。在这种情况下,EventBus eventBus = new SimpleEventBus(); –
对不起,我已经发布了这个问题之前,其他计算器岗位检查,但没有弹出。无论如何感谢 –