RPC调用的GWT Tomcat问题

Posted

技术标签:

【中文标题】RPC调用的GWT Tomcat问题【英文标题】:GWT Tomcat problem to RPC call 【发布时间】:2011-04-13 13:34:34 【问题描述】:

当我将我的 war 文件部署到 TOMCAT (tomcat/webapps/ROOT/war) 时,GWT RPC 调用似乎不起作用。

它给了我一个错误:

请求的资源 (/war/myproject/call) 不是 可用。

如果我更改目录结构,然后直接部署战争内容(不是战争目录本身),例如(tomcat/webapps/ROOT/project.html、project.css、project 等... ) 然后它就可以工作了。

谁能解释一下这是怎么回事?

我认为可能有问题:

<servlet>
<servlet-name>callServlet</servlet-name>
<servlet-class>com.myproject.server.dao.Call</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>callServlet</servlet-name>
<url-pattern>/myproject/call</url-pattern>
</servlet-mapping>

【问题讨论】:

【参考方案1】:

问题是单个 Tomcat 服务器可以部署多个应用程序,每个应用程序都在其所谓的 context 中。应用程序部署在webapps 文件夹中,每个文件夹都映射到一个context,而ROOT 文件夹是默认文件夹(无上下文)。

要访问 Tomcat 上的应用程序,您需要在 URL 之后指定 context。例如,如果您在 webapps/Test 文件夹中有一个应用程序(上下文)Test,您可以这样访问它:

http://localhost:8080/Test

ROOT 文件夹中的应用程序没有上下文,只需转到localhost:8080 即可访问。这是你的情况。 Tomcat 直接在 ROOT 文件夹中寻找您的应用程序,但您的应用程序位于 ROOT/war 文件夹中。换句话说,RPC 调用期望myproject 文件夹位于ROOT 文件夹下,而不是ROOT/war 文件夹下。这就是它不起作用的原因。

如果您仍希望将war 文件夹放在ROOT 文件夹中,则必须将url-pattern 更改为/war/myProject/call

【讨论】:

非常好的答案,请告诉我如何更改@RemoteServiceRelative 工作路径。 我想现在您的注释看起来像这样:@RemoteServiceRelativePath("myProject")。我认为您需要将其更改为 @RemoteServiceRelativePath("war/myProject") 以使其符合 url-pattern。但我个人会将应用程序直接放入ROOT 文件夹,或放入不同的上下文中,例如webapps/MyProject. 好吧,情况是我将我的项目部署到 cloudbees。我选择了一个简单的 .war 文件进行上传。它会自动部署 localhost:8080/war/Myproject.html ,不能用 localhost:8080/Myproject.html 访问它 我把它改成@RemoteServiceRelativePath("war/myProject"),它给了我404 not found请求的URI 哦,那就试试把url-pattern改成&lt;url-pattern&gt;/war/myproject/call&lt;/url-pattern&gt;,把注解改成@RemoteServiceRelativePath("myProject")【参考方案2】:

嗯,我找到了解决方案,它与Tomcat的操作方式有关。

    打开你的项目war目录 选择所有文件(html/jsp、图像、WEB-INF 等...) 将所有文件压缩到一个 project.zip 存档中 将 project.zip 重命名为 project.war 将 project.war 复制到 Tomcat/webapps/ 重启 Tomcat 服务器 现在你会注意到在 webapps 目录里面 project.war 已经被解压到一个项目目录中,如果你打开它你会发现所有的 .war 内容(html/jsp, images, WEB-INF, etc...) 从这里访问它 http://localhost/project 或 http://localhost/project/index.html 或 index.jsp。

错误是:我只是将 war 目录(不是内部内容)压缩到 project.war 中。

【讨论】:

和@RemoteServiceRelativePath("call"), /call 我没有更改任何我留下的默认网址。 GWT 设计了它的文件夹结构,以便它与外部服务器部署兼容 很高兴你解决了。我建议使用 Maven 来构建您的应用程序并生成 WAR 包。至少学习基础知识真的很值得,它会为你省去很多麻烦。干杯!【参考方案3】:

看起来,servlet 没有为你初始化战争尝试将 SERVLET 标记更改为 即添加标签

<load-on-startup>1</load-on-startup>

这个标签确保 servlet 应该被加载

 <servlet>
 <servlet-name>callServlet</servlet-name>
 <servlet-class>com.myproject.server.dao.Call</servlet-class>
 <load-on-startup>1</load-on-startup>
 </servlet> 

希望这会奏效

【讨论】:

部署后有没有重启服务器,试试看,应该可以的 @Imran 我做到了,我认为这是一个小错误。我使用将 JAVA 编译为 javascript 的 GWT,我没有重新编译... 再尝试 1 件事不要把战争放在 ROOT 文件夹中,直接放在 webapp 下,即 $tomcat\webapps\yourproject.war

以上是关于RPC调用的GWT Tomcat问题的主要内容,如果未能解决你的问题,请参考以下文章

我在 tomcat 上部署了 GWT,现在 RPC 不起作用

将带有 RPC 的 GWT 部署到 tomcat 的问题(可能是 web.xml 问题)

部署 GWT 项目的问题

Tomcat 和 Objectdb(通过 GWT/Rpc):java.lang.NoClassDefFoundError

GWT Servlet 错误 com.google.gwt.user.client.rpc .StatusCodeException: Tomcat 服务器上的 404

尝试在来自 GWT-RPC 项目的 Tomcat 7 上部署战争