2012-09-28 71 views
1

我试图分开GWT客户端&服务器。如果我没有错,GWT客户端代码通过连接到我们在GWT Project的web.xml中提到的servlet获取服务器响应。如果是这样,我可以托管我的GWT Servlets在一个Tomcat服务器& GWT客户端代码在其他tomcat服务器..?GWT客户端文件在一个服务器和GWT Servlets在其他服务器

它会工作..?如果是这样的话,我已经在GWT客户端文件中尝试了一些与hosted.html一起工作的东西。但它没有奏效

回答

0

过去一直提出同样的问题。

gwt-split-client-and-server

你可以做的是使用servlet作为代理到另一台服务器,在那里你已经实现了模型的逻辑。

+0

对不起,我已经发布了这个问题之前,其他计算器岗位检查,但没有弹出。无论如何感谢 –

1

是的,你可以在任何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 { 
    } 

} 
+0

这个例子中的eventBus是什么?我正在寻找类似的东西,这个示例代码可能就是我正在寻找的东西。 – timwoj

+0

请求工厂(RF)需要gwt事件总线实例才能工作,通常它由所有gwt应用共享,这就是RF初始化需要它的原因。在这种情况下,EventBus eventBus = new SimpleEventBus(); –