【发布时间】: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 请求的资源不可用(在我的计算机上使用法语)。它与我上面发布的代码有点不同......
【问题讨论】: