【问题标题】:Servlet not found from a GWT web application从 GWT Web 应用程序中找不到 Servlet
【发布时间】:2015-05-13 06:38:04
【问题描述】:

几天以来,我一直在努力解决有关我的 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。访问 /upload 时出现问题。原因: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 做了一个快速测试:生成默认的 GWT Web 应用程序(“输入你的名字”)并将其部署在 Tomcat 上。用 Eclipse 没问题,但是 Tomcat 找不到默认的 servlet ...

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

希望你能帮助我。

亲切的问候,

奥利维尔

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

使用 Eclipse,我编译代码,然后将“war”目录中包含的所有文件和目录移动到名为“MyApp”的目录(示例)。然后我将此目录压缩为 .zip 文件并将“.zip”更改为“.war”。然后将此 .war 文件复制/粘贴到 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 请求的资源不可用(在我的计算机上使用法语)。它与我上面发布的代码有点不同......

【问题讨论】:

    标签: java tomcat servlets gwt


    【解决方案1】:

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

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

    你会想要使用:

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

    或者可能

    myUploadForm.setAction("upload");
    

    (没有前导斜杠)

    【讨论】:

    • 您好 Thomas,感谢您的回答。我尝试了您的两种解决方案,但没有运气,404错误。我也尝试根据您的建议修改 web.xml 文件,但结果是一样的......
    • 您能否将表单的操作 URL 从源视图发布到 HTML 页面中,或者在您的浏览器中发布更好的 DOM 检查器?这将显示实际调用的真实地址,然后我们可以比较您的配置。
    • 我不确定你的要求是什么......我是真正的 web 开发和 java 初学者 ^^'。如何在 HTML 页面中查看表单的操作 URL?如果我查看源代码视图(firefox 之一),我只有我的应用程序 html 文件的源代码(带有指向 javascript 代码的链接)。我下载了 DOM Inspector,以防万一,但我(还)不知道如何使用它...
    • 我在原始帖子中放了一些 cmets,以展示我如何将我的应用程序放入 Tomcat 服务器以及如何启动它。我现在不能做更多的事情,因为我在休假几天..
    • 你的WEB-INF应该在你的WAR文件的根目录下;您似乎在 WAR 中的 MyApp 文件夹中拥有所有内容。换句话说,当您打开 WAR(或 ZIP,在重命名之前)时,您应该会在那里看到您的 MyApp.html 文件和 WEB-INF 文件夹,而不是包含它们的 MyApp 文件夹。因为它位于子文件夹中,所以您的 WEB-INF/web.xml 会被 Tomcat 忽略。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2011-02-02
    • 2014-03-14
    • 1970-01-01
    相关资源
    最近更新 更多