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

Servlet not found from a GWT web application

几天来我一直在为我的 GWT 应用程序和从该应用程序调用的 servlet 的问题而苦苦挣扎。

我实际上正在为我的研究所编写一个使用 Java 和 GWT 的网络应用程序。目标是在飞行活动之后生成一个包含来自用户输入的元数据的 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 访问了网络应用程序。 但是当我尝试访问 servlet(上传 xml 文件)时,返回的答案是 "HTTP ERROR 404. Problem accessing /upload. Reason: NOT_FOUND" 我尝试使用 google 找到解决方案,但我发现很少有关于同一主题的帖子,但所有已发布的解决方案都不适用于我的情况...

这是我调用 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 做了一个快速测试:生成默认的 GWT Web 应用程序 ("Enter your name") 并将其部署到 Tomcat。使用 Eclipse,没问题,但是 Tomcat 找不到默认的 servlet ...

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

希望你能帮到我。

亲切的问候,

奥利维尔

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

我使用 Eclipse 编译代码,然后将 "war" 目录中包含的所有文件和目录移动到名为 "MyApp" 的目录(示例)。然后我将这个目录压缩成.zip 文件并将“.zip”更改为“.war”。这个 .war 文件然后 copy/past 到 Tomcat 的 "webapps" 目录。 Tomcat 处理 .war 文件,我获得了一个名为 "MyApp" 的目录,其中我有另一个包含我所有文件的 "MyApp" 目录。最后,我启动 Firefox 并使用以下 Url 访问我的应用程序:http://localhost:8080/MyApp/MyApp/Myapp.html

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

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

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

您将要使用:

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

或者可能

myUploadForm.setAction("upload");

(没有前导斜杠)