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

标签 java tomcat servlets gwt

几天来,我一直在努力解决与我的 GWT 应用程序和从应用程序调用的 servlet 相关的问题。

我实际上正在为我的研究所使用 Java 和 GWT 编写一个 Web 应用程序。目标是在航类 Activity 结束后生成一个包含来自用户输入的元数据的 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 进行了快速测试:生成默认的 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 请求的资源不可用(在我的计算机上为法语)。它与我上面发布的代码有点不同......

最佳答案

一个可能的区别是网络应用的上下文路径。在 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");

(不带前导斜杠)

关于java - 未从 GWT Web 应用程序中找到 Servlet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30207362/

相关文章:

java - 重复验证错误

java - 在Android中扩展应用程序和扩展 Activity 有什么区别?

java - 如何部署 SpringBoot webapp : war or jar?

java - Spring boot 未格式化的 BadCredentialsException

Java 序列化异常消息

java - Spring 3 : task namespace: How to find out time of next execution?

java - 从证书文件中获取 key 用于 AES 算法加密和解密

tomcat - GGTS 用于运行哪个服务器?

java - Ajax 不将表单数据发送到 servlet

java - 重写 servlet() 中的 doPost 方法