Java 在GWT web应用程序中找不到Servlet
几天以来,我一直在为我的GWT应用程序和从该应用程序调用的servlet的问题而挣扎 实际上,我正在用Java和GWT为我的研究所编写一个web应用程序。目标是在飞行活动结束后生成一个包含用户输入元数据的XML文件。在此之前,我总是用Python或Matlab编写应用程序,两个月前我开始使用Java和GWT(允许用户在线访问这些工具) web应用程序由客户端(GUI)和服务器端组成,服务器端带有servlet,允许用户下载生成的XML文件、打印pdf报告或上载XML文件(再次使用)。不太复杂 使用Eclipse4.4和嵌入式Jetty服务器,完全没有问题!这真的很好,XML文件格式很好,下载和上传功能都很好。 然后我想用Tomcat服务器(ApacheTomcat 7,用于Ubuntu 14.04)在我的笔记本电脑上测试它,我部署了.war(Tomcat已成功解压),并设法从firefox访问了这个web应用程序。 但是,当我尝试访问servlet(上载xml文件)时,返回的anwser是“HTTP错误404。访问/上载时出现问题。原因:未找到” 我试图用谷歌找到一个解决方案,我发现几乎没有关于同一主题的帖子,但所有帖子的解决方案在我的案例中都不起作用 以下是调用servlet的主要代码部分:Java 在GWT web应用程序中找不到Servlet,java,tomcat,servlets,gwt,Java,Tomcat,Servlets,Gwt,几天以来,我一直在为我的GWT应用程序和从该应用程序调用的servlet的问题而挣扎 实际上,我正在用Java和GWT为我的研究所编写一个web应用程序。目标是在飞行活动结束后生成一个包含用户输入元数据的XML文件。在此之前,我总是用Python或Matlab编写应用程序,两个月前我开始使用Java和GWT(允许用户在线访问这些工具) web应用程序由客户端(GUI)和服务器端组成,服务器端带有servlet,允许用户下载生成的XML文件、打印pdf报告或上载XML文件(再次使用)。不太复杂 使
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());
}
}
}
package com.eufar.asmm.server;
导入java.io.IOException;
导入java.util.List;
导入java.util.Iterator;
导入javax.servlet.servlet;
导入javax.servlet.ServletException;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入org.apache.commons.fileupload.FileItem;
导入org.apache.commons.fileupload.FileItemFactory;
导入org.apache.commons.fileupload.disk.DiskFileItemFactory;
导入org.apache.commons.fileupload.servlet.ServletFileUpload;
@抑制警告(“隐藏”)
公共类UploadFunction扩展HttpServlet实现Servlet{
私有静态最终长serialVersionUID=1L;
受保护的void doPost(HttpServletRequest请求、HttpServletResponse响应)引发ServletException、IOException{
setContentType(“text/html;charset=UTF-8”);
@抑制警告(“未使用”)
布尔值isMultipart=ServletFileUpload.isMultipartContent(请求);
FileItemFactory=new DiskFileItemFactory();
ServletFileUpload upload=新的ServletFileUpload(工厂);
试一试{
列表项=upload.parseRequest(请求);
迭代器iter=items.Iterator();
while(iter.hasNext()){
Object obj=iter.next();
如果(obj==null)继续;
org.apache.commons.fileupload.FileItem=(org.apache.commons.fileupload.FileItem)obj;
if(item.isFormField()){
字符串名称=item.getName();
字符串值=”;
if(name.compareTo(“textBoxFormElement”)==0){
value=item.getString();
}
否则{
value=item.getString();
}
response.getWriter().write(name+“=”+value+“\n”);
}
否则{
byte[]fileContents=item.get();
字符串消息=新字符串(文件内容);
响应。setCharacterEncoding(“UTF-8”);
response.setContentType(“text/html”);
response.getWriter().write(消息);
}
}
}捕获(例外情况除外){
response.getWriter().write(“错误:+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>
下载功能
com.eufar.asmm.server.DownloadFunction
下载功能
下载功能
上传功能
com.eufar.asmm.server.UploadFunction
上传功能
/上传
Asmm_eufar.html
关于信息,WEB-INF目录中的所有类、所有需要的库似乎都正常。。。
我用Eclipse做了一个快速测试:生成defaut GWT web应用(“输入您的名字”)并将其部署到Tomcat上。对于Eclipse,没有问题,但是Tomcat找不到默认的servlet
因此,最后,我不能说我的代码是否绝对正确(我是初学者),也不能说问题是否可能是错误的Tomcat配置(我是研究人员,而不是服务器管理员)
我希望你能帮助我
亲切问候,
奥利维尔
编辑:我可能忘了添加一些关于如何将我的应用程序添加到Tomcat以及如何启动它的详细信息
使用Eclipse,我编译代码,然后将“war”目录中包含的所有文件和目录移动到名为“MyApp”的目录中(示例)。然后我将这个目录压缩成一个.zip文件,并将“.zip”改为“.war”。然后将该.war文件复制/通过到Tomcat的“webapps”目录。Tomcat处理.war文件,我得到一个名为“MyApp”的目录,其中我有另一个包含我所有文件的“MyApp”目录。最后,我启动Firefox并使用以下Url访问我的应用程序:
根据Thomas给出的建议,我应该使用Url访问上传功能。但是返回的错误是:“State HTTP 404.MyApp/MyApp/upload请求的资源不可用(在我的计算机上用法语)。它与我上面发布的代码有一点不同…一个可能的区别是webapp的上下文路径。在dev中,web app部署在根目录下(
contextPath=/
)而在Tomcat中,它默认使用war文件的名称(contextPath=/mywebapp/
)
您的表单总是发布到http://:/upload
,但在Tomcat中,您的servlet位于http://:/mywebapp/upload
您将要使用:
myUploadForm.setAction(GWT.getHostPageBaseUrl() + "/upload");
或pos
myUploadForm.setAction("upload");