我几天都在努力解决我的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);
这是我的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进行了快速测试:生成defaut GWT Web应用程序(&#34;输入您的名字&#34;)并将其部署在Tomcat上。使用Eclipse,没有问题,但Tomcat无法找到默认的servlet ...
所以,最后,我不能说我的代码是否绝对正常(我是初学者),我不能说问题是否是错误的Tomcat配置(我是研究人员而不是服务器)管理员)。
我希望你能帮助我。
亲切的问候,
奥利弗
编辑:我可能忘了添加一些关于我如何将我的应用添加到Tomcat以及如何启动它的细节。
使用Eclipse,我编译代码,然后移动&#34; war&#34;中包含的所有文件和目录。目录名为&#34; MyApp&#34; (一个例子)。然后我将此目录压缩为.zip文件并更改&#34; .zip&#34; to&#34; .war&#34;。然后将此.war文件复制/过去到&#34; webapps&#34; Tomcat的目录。 Tomcat处理.war文件,我获得了一个目录calle&#34; MyApp&#34;,其中我有另一个&#34; MyApp&#34;包含我所有文件的目录。最后,我启动Firefox并使用以下网址访问我的应用:http://localhost:8080/MyApp/MyApp/Myapp.html
根据Thomas提供的建议,我应该使用Url http://localhost:8080/MyApp/MyApp/upload访问上传功能。但返回的错误是:&#34;状态HTTP 404. MyApp / MyApp / upload请求的资源不可用(在我的计算机上使用法语)。它与我上面发布的代码有点不同......
答案 0 :(得分: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");
或可能
myUploadForm.setAction("upload");
(没有前导斜杠)