从GWT Web应用程序中找不到Servlet

时间:2015-05-13 06:38:05

标签: java tomcat servlets gwt

我几天都在努力解决我的GWT应用程序和从应用程序调用的servlet的问题。

我实际上正在为我的研究所编写一个带有Java和GWT的Web应用程序。目标是在飞行活动之后生成包含来自用户输入的元数据的XML文件。在那之前,我总是用Python或Matlab编写我的应用程序,两个月前我开始使用Java和GWT(允许用户在线访问这些工具)。

Web应用程序由客户端(GUI)和带有servlet的服务器端组成,允许用户下载生成的XML文件,打印pdf报告或上载XML文件(再次处理它) )。不是很复杂。

使用Eclipse 4.4和嵌入式Jetty服务器,完全没问题!它非常好,XML文件格式良好,下载和上传功能都可以。 然后我想在我的笔记本电脑上用Tomcat服务器(Apache Tomcat 7,Ubuntu 14.04)测试它,我部署了.war(已成功解压缩Tomcat),我设法从firefox访问web应用程序。 但是当我尝试访问servlet(上传xml文件)时,返回的anwser是" HTTP ERROR 404.访问/上传时出现问题。原因:NOT_FOUND" 我试图找到一个使用谷歌的解决方案,我发现同一主题的帖子很少,但所有发布的解决方案在我的案例中都没有...

以下是调用servlet的主要代码部分:

final FileUpload myFileUpload = new FileUpload();
myFileUpload.setName("uploadFormElement");
myFileUpload.getElement().setId("uploadFormElement");
myFileUpload.getElement().setId("myFile");
panel.add(myFileUpload);
final FormPanel myUploadForm = new FormPanel();
myUploadForm.setAction("/upload");
myUploadForm.setEncoding(FormPanel.ENCODING_MULTIPART);
myUploadForm.setMethod(FormPanel.METHOD_POST);

这是我的servlet代码:

package com.eufar.asmm.server;

import java.io.IOException;
import java.util.List;
import java.util.Iterator;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

@SuppressWarnings("hiding")
public class UploadFunction<FileItem> extends HttpServlet implements Servlet {

private static final long serialVersionUID = 1L;

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");

    @SuppressWarnings("unused")
    boolean isMultipart = ServletFileUpload.isMultipartContent(request);

    FileItemFactory factory = new DiskFileItemFactory();
    ServletFileUpload upload = new ServletFileUpload(factory);

    try {
        List items = upload.parseRequest(request);
        Iterator iter = items.iterator();
        while(iter.hasNext()){
            Object obj = iter.next();
            if(obj == null) continue;
            org.apache.commons.fileupload.FileItem item = (org.apache.commons.fileupload.FileItem)obj;
            if(item.isFormField()){
                String name = item.getName();
                String value = "";
                if(name.compareTo("textBoxFormElement")==0){
                    value = item.getString();                       
                } 
                else {
                    value = item.getString();                       
                }
                response.getWriter().write(name + "=" + value + "\n");
             } 
             else {
                byte[] fileContents = item.get();
                String message = new String(fileContents);
                response.setCharacterEncoding("UTF-8");
                response.setContentType("text/html");
                response.getWriter().write(message);                    
             }
        }          
    } catch (Exception ex) {            
        response.getWriter().write("ERROR:" + ex.getMessage());
    }
}   
}

这是我的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>DownloadFunction</servlet-name>
    <servlet-class>com.eufar.asmm.server.DownloadFunction</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>DownloadFunction</servlet-name>
    <url-pattern>DownloadFunction</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>UploadFunction</servlet-name>
    <servlet-class>com.eufar.asmm.server.UploadFunction</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>UploadFunction</servlet-name>
    <url-pattern>/upload</url-pattern>
  </servlet-mapping>

  <!-- Default page to serve -->
  <welcome-file-list>
    <welcome-file>Asmm_eufar.html</welcome-file>
  </welcome-file-list>

</web-app>

有关信息,在所有类,所有需要的库的WEB-INF目录中似乎都可以。 我使用Eclipse进行了快速测试:生成defaut GWT Web应用程序(&#34;输入您的名字&#34;)并将其部署在Tomcat上。使用Eclipse,没有问题,但Tomcat无法找到默认的servlet ...

所以,最后,我不能说我的代码是否绝对正常(我是初学者),我不能说问题是否是错误的Tomcat配置(我是研究人员而不是服务器)管理员)。

我希望你能帮助我。

亲切的问候,

奥利弗

编辑:我可能忘了添加一些关于我如何将我的应用添加到Tomcat以及如何启动它的细节。

使用Eclipse,我编译代码,然后移动&#34; war&#34;中包含的所有文件和目录。目录名为&#34; MyApp&#34; (一个例子)。然后我将此目录压缩为.zip文件并更改&#34; .zip&#34; to&#34; .war&#34;。然后将此.war文件复制/过去到&#34; webapps&#34; Tomcat的目录。 Tomcat处理.war文件,我获得了一个目录calle&#34; MyApp&#34;,其中我有另一个&#34; MyApp&#34;包含我所有文件的目录。最后,我启动Firefox并使用以下网址访问我的应用:http://localhost:8080/MyApp/MyApp/Myapp.html

根据Thomas提供的建议,我应该使用Url http://localhost:8080/MyApp/MyApp/upload访问上传功能。但返回的错误是:&#34;状态HTTP 404. MyApp / MyApp / upload请求的资源不可用(在我的计算机上使用法语)。它与我上面发布的代码有点不同......

1 个答案:

答案 0 :(得分:5)

一个可能的区别是webapp的上下文路径。在开发中,Web应用程序部署在root(contextPath=/),而在Tomcat中,它默认使用war文件的名称(contextPath=/mywebapp/)。

您的表单始终发布到http://<server>:<port>/upload,但在Tomcat中,您的servlet位于http://<server>:<port>/mywebapp/upload

您想要使用:

myUploadForm.setAction(GWT.getHostPageBaseUrl() + "/upload");

或可能

myUploadForm.setAction("upload");

(没有前导斜杠)