Tomcat 中的 GWT 2.5 应用程序部署?

Posted

技术标签:

【中文标题】Tomcat 中的 GWT 2.5 应用程序部署?【英文标题】:GWT 2.5 Application Deployment in Tomcat? 【发布时间】:2013-02-12 16:24:49 【问题描述】:

我正在使用 GWT 2.5。我有一个使用 gwt-rpc 的应用程序。我已经编译了项目并使用 ant 脚本制作了 war 文件。当我将项目部署在 tomcat 上时,它成功加载但不显示任何控制。只是一个简单的空白 html 页面。这是我的文件。 模块

<?xml version="1.0" encoding="UTF-8"?>
<!--
  When updating your version of GWT, you should also update this DTD reference,
  so that your app can take advantage of the latest GWT module capabilities.
-->
<!DOCTYPE module PUBLIC "-//Google Inc.//DTD Google Web Toolkit 2.5.0//EN"
  "http://google-web-toolkit.googlecode.com/svn/tags/2.5.0/distro-source/core/src/gwt-module.dtd">
<module rename-to='interviewscheduler'>
  <!-- Inherit the core Web Toolkit stuff.                        -->
  <inherits name='com.google.gwt.user.User'/>

  <!-- Inherit the default GWT style sheet.  You can change       -->
  <!-- the theme of your GWT application by uncommenting          -->
  <!-- any one of the following lines.                            -->
  <inherits name='com.google.gwt.user.theme.clean.Clean'/>
  <!-- <inherits name='com.google.gwt.user.theme.standard.Standard'/> -->
  <!-- <inherits name='com.google.gwt.user.theme.chrome.Chrome'/> -->
  <!-- <inherits name='com.google.gwt.user.theme.dark.Dark'/>     -->

  <!-- Other module inherits                                      -->
  <inherits name="com.smartgwt.SmartGwt"/>
  <!-- Specify the app entry point class.                         -->
  <entry-point class='interviewscheduler.client.InterViewScheduler'/>

  <!-- Specify the paths for translatable code                    -->
  <source path='client'/>
  <source path='shared'/>

</module>

远程服务

package interviewscheduler.client;

import interviewscheduler.shared.Interview;
import interviewscheduler.shared.Teacher;

import java.util.LinkedHashMap;
import java.util.List;

import com.google.gwt.user.client.rpc.RemoteService;
import com.google.gwt.user.client.rpc.RemoteServiceRelativePath;

@RemoteServiceRelativePath("interviewScheduler")
public interface InterviewSchedulerService extends RemoteService
    Boolean loadStudentData() throws IllegalArgumentException;
    Boolean loadParentData() throws IllegalArgumentException;
    Boolean loadTeacherData() throws IllegalArgumentException;
    Boolean loadClassData() throws IllegalArgumentException;
    Boolean loadClassMemberShipData() throws IllegalArgumentException;
    Boolean loadRoomData() throws IllegalArgumentException;
    Boolean loadSessionData() throws IllegalArgumentException;
    Boolean loadInterviewData() throws IllegalArgumentException;
    LinkedHashMap<String, String> getStudentNames() throws IllegalArgumentException;
    String getParentName(String studentKey) throws IllegalArgumentException;
    List<Teacher> getAvailableTeachers(String studentKey) throws IllegalArgumentException;
    List<Teacher> getRequestedTeachers(String studentKey) throws IllegalArgumentException;
    List<Interview> getInterviewByStudent(String studentKey) throws IllegalArgumentException;
    List<Interview> getInterviewByTeacher(String teacherCode) throws IllegalArgumentException;
    List<Object> getInterviewsForGrid(List<Interview> list) throws IllegalArgumentException;
    String addInterview(Interview obj) throws IllegalArgumentException;
    String removeInterview(String studentId, String teacherId) throws IllegalArgumentException;

Web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
              http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5"
         xmlns="http://java.sun.com/xml/ns/javaee">

  <!-- Servlets -->

  <servlet>
    <servlet-name>interviewSchedulerServlet</servlet-name>
    <servlet-class>interviewscheduler.server.InterviewSchedulerServiceImpl</servlet-class>
  </servlet>

   <servlet-mapping>
    <servlet-name>interviewSchedulerServlet</servlet-name>
    <url-pattern>/interviewscheduler/interviewScheduler</url-pattern>
  </servlet-mapping>
  <!-- Default page to serve -->

  <welcome-file-list>
    <welcome-file>InterViewScheduler.html</welcome-file>
  </welcome-file-list>

</web-app>

任何想法我做错了什么。?很紧急。

package interviewscheduler.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.RootLayoutPanel;
import com.smartgwt.client.widgets.layout.VLayout;

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
public class InterViewScheduler implements EntryPoint 
    /**
     * This is the entry point method.
     */
    private InterviewSchedulerServiceAsync remoteObject=GWT.create(InterviewSchedulerService.class);
    private VLayout wrapper=new VLayout();
    private VLayout headerArea=new Header();
    private VLayout contentArea=new ContentArea();

    public void onModuleLoad() 
        Window.enableScrolling(true);
        Window.setMargin("0px");
        remoteObject.loadStudentData(new AsyncCallback<Boolean>() 
            @Override
            public void onSuccess(Boolean result) 

            RootLayoutPanel.get().add(drawWrapper());
            
            @Override
            public void onFailure(Throwable caught) 
                System.out.println("Failed*****************");
            
        );


    

    /** 
     * initialize the wrapper of the web site which holds all other content------Main Container 
     */

    public VLayout drawWrapper()
        wrapper.setWidth100();
        wrapper.setHeight100();
        wrapper.setMargin(0);
        wrapper.addMember(drawHeaderArea());
        wrapper.addMember(drawContentArea());
        return wrapper;
    
    /** 
     * initialize the Header Area of the web site which contains Logo with Title and a logout button
     */
    public VLayout drawHeaderArea()
        headerArea.redraw();
        return headerArea;
    

    /** 
     * initialize the Content Area of the web site which holds a main TabSet
     */

    public VLayout drawContentArea()
        contentArea.redraw();
        return contentArea;
    


【问题讨论】:

InterViewScheduler 长什么样子? 我使用这个 url "localhost:8089/InterViewScheduler" 访问应用程序,页面看起来是空白的。 javascript 控制台出现一些错误。例如 [22:46:37.071] 解析“背景图像”的值时出错。声明被放弃。 @localhost:8089/InterViewScheduler/interviewscheduler/sc/skins/… [22:46:37.071] 预期颜色,但发现“正确”。解析“背景图像”的值时出错。声明被放弃。 @localhost:8089/InterViewScheduler/interviewscheduler/sc/skins/… 【参考方案1】:

您必须以某种方式在您的应用程序中显示您的数据。你现在所做的只是调用一堆服务。这实际上很令人困惑。您应该在一次调用服务器时完成所有这些操作。它将为您节省大量往返行程,并且很可能会使您免于遇到一些失败的呼叫。

【讨论】:

对不起,我似乎不明白您要做什么。您正在进行所有这些不使用任何返回值的 RPC 调用。不管“无用”的 RPC 调用如何,如果第一个 RPC 调用成功,您应该让RootPanel.get().add(drawWrapper) 运行,但我不知道它会显示什么,因为使用我可以看到的代码,它将是空白的(当然,除非这里没有显示一些 CSS 或其他内容)。 Enrybo,感谢您的帮助。我已经在两个类中编写了所有 GUI 代码。内容和标题。我在 InterviewScheduler.java 中初始化它们,分别在 drawHeader 和 drawContent 中调用它们,并在 drawWrapper 方法的帮助下将它们添加到根面板。所有这些都在开发模式下运行良好。在使用 Eclipse 时。如果它在jetty中工作正常(嵌入式服务器带有google eclipse插件),它不应该在tomcat中工作吗? 我以前见过的一个错误是没有正确设置Tomcat web-app。确保编译您的项目,将 war 文件复制到 webapps 并将 war 名称更改为您想要在 URL 中键入的任何名称。不要忘记将您导入的库添加到war/WEB-INF/lib。我认为你做的都是对的,但你永远不知道。我能想到的唯一另一件事就是调试一下。尝试在 onSuccess() 方法中添加 Window.alert('FOO'); 并在 onFailure() 中添加 Window.alert(caught); 以查看实际发生的情况。我认为您的服务调用由于某种原因失败了。 调试技术奏效了...我的服务调用由于某种原因失败...这里是消息“500 服务器上的调用失败;有关详细信息,请参阅服务器日志” blog.elitecoderz.net/… 。请访问链接...这是我构建 .war 文件的方式。谢谢【参考方案2】:

愚蠢的错误...我没有在 WEB-INF/lib 目录中包含必要的库。这导致我的 RPC 调用失败。无论如何。特别感谢 Enrybo。调试技术非常有用。

【讨论】:

以上是关于Tomcat 中的 GWT 2.5 应用程序部署?的主要内容,如果未能解决你的问题,请参考以下文章

在eclipse中将GWT应用程序部署到tomcat

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

使用 Tomcat (Eclipse) 调试 GWT 应用程序

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

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

尝试从GWT-RPC项目获取的Tomcat 7上的部署战争