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

Buf*_*ort 2 java gwt tomcat servlets

我几天都在努力解决我的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);
Run Code Online (Sandbox Code Playgroud)

这是我的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());
    }
}   
}
Run Code Online (Sandbox Code Playgroud)

这是我的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>
Run Code Online (Sandbox Code Playgroud)

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

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

我希望你能帮助我.

亲切的问候,

奥利维尔

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

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

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

Tho*_*yer 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");
Run Code Online (Sandbox Code Playgroud)

或者可能

myUploadForm.setAction("upload");
Run Code Online (Sandbox Code Playgroud)

(没有前导斜线)