Java Servlet 不能在 Tomcat 上运行

标签 java gwt tomcat servlets

我写了一个Servlet来上传文件到服务器并存储它们。只要我运行 DevelopmentMode(它是一个 GWT 项目)一切正常。但是由于我在 Tomcat 上部署了 webapp,所以甚至没有调用 servlet..

public class ImageService extends HttpServlet {

/**
 * 
 */
private static final long serialVersionUID = 1L;
private static final long MAX_FILE_SIZE = 1024 * 1024 * 1024; //1GB

@Override
protected void doPost(final HttpServletRequest request,
        final HttpServletResponse response) {

    slog("SERVLET STARTED");

    boolean isMultipart = ServletFileUpload.isMultipartContent(request);

    if (isMultipart) {
        slog("REQUEST IS MULTIPART");
        response.setStatus(HttpServletResponse.SC_OK);
        response.setContentType("text/html");

        FileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        upload.setFileSizeMax(MAX_FILE_SIZE);
        try {
            List<FileItem> items = upload.parseRequest(request);
            Iterator<FileItem> iterator = items.iterator();
            while (iterator.hasNext()) {

                FileItem item = iterator.next();

                if (!item.isFormField()) {
                    String fileName = item.getName();
                    slog("TROVATO FILE " + item.getName());
                    String root = getServletContext().getRealPath("/");
                    File path = new File(root + "/fileuploads");
                    slog("SALVO FILE IN " + path.getAbsolutePath());
                    if (!path.exists()) {
                        path.mkdirs();
                    }

                    File uploadedFile = creaFileNonAmbiguo(path, fileName);
                    slog("NOME ASSEGNATO AL FILE " + uploadedFile.getName());
                    item.write(uploadedFile);
                    response.getWriter().write(uploadedFile.getName() + ";");

                }
            }

            response.getWriter().flush();
            slog("RISPOSTA INVIATA");

        } catch (Exception e) {
            e.printStackTrace();

        }
    } else {
        slog("LA RICHIESTA NON E' MULTIPART");
        response.setStatus(HttpServletResponse.SC_NO_CONTENT);
    }   
    slog("SERVLET TERMINATA");
}

@Override
protected void doGet(final HttpServletRequest request,
        final HttpServletResponse response) {


    response.setContentType("image/jpeg");
    String root = getServletContext().getRealPath("/").concat(
            "fileuploads/");
    String path = root.concat(request.getParameter("src"));

    File file = new File(path);
    response.setContentLength((int) file.length());
    FileInputStream in;
    try {
        in = new FileInputStream(file);
        OutputStream out = response.getOutputStream();
        byte[] buf = new byte[1024];
        int len = 0;
        while ((len = in.read(buf)) >= 0) {
            out.write(buf, 0, len);
        }
        in.close();
        out.close();
    } catch (IOException e) {

        e.printStackTrace();
    }

}

private File creaFileNonAmbiguo(File path, String fileName) {

    File res = new File(path + "/" + fileName);
    if (!res.exists())
        return res;
    else {
        return creaFileNonAmbiguo(path, "c".concat(fileName));
    }
}

private void slog(String s) {
    System.out.println("FILE SERVLET: " + s);
}

}

我的代码有什么问题?为什么它在 devmode 而不是在 Tomcat 上工作?

这是我的 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>dataLayerServlet</servlet-name>
    <servlet-class>com.tesi.server.DataLayerServiceImpl</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>dataLayerServlet</servlet-name>
    <url-pattern>/segnalazioni_degrado/dataLayer</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>loginServlet</servlet-name>
    <servlet-class>com.tesi.server.LoginServiceImpl</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>loginServlet</servlet-name>
    <url-pattern>/segnalazioni_degrado/login</url-pattern>
</servlet-mapping>

<servlet>
    <servlet-name>mailServlet</servlet-name>
    <servlet-class>com.tesi.server.MailServiceImpl</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>mailServlet</servlet-name>
    <url-pattern>/segnalazioni_degrado/mail</url-pattern>
</servlet-mapping>


<servlet>
    <servlet-name>imageServlet</servlet-name>
    <servlet-class>com.tesi.server.ImageService</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>imageServlet</servlet-name>
    <url-pattern>/segnalazioni_degrado/imageUpload</url-pattern>
</servlet-mapping>


<!-- Default page to serve -->
<welcome-file-list>
    <welcome-file>Segnalazioni_Degrado.html</welcome-file>
</welcome-file-list>

最佳答案

首先,根据您的 web.xml,imageServlet 映射到:

/segnalazioni_degrado/imageUpload

其次,您应该从 url 中删除问号,尝试将其更改为:

localhost:8080/Segnalazioni_Degrado/imageUpload

看看会发生什么。

关于Java Servlet 不能在 Tomcat 上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18683966/

相关文章:

java - JAXB 解码问题

java - 内容是否可能发生变化,但 hashcode 仍然为 xml 中的节点返回相同的值

java - JPA/Eclipselink @Cache 过期被忽略

java - 构造函数 Random() 不可见

java + google web 工具包(google apps 引擎)

tomcat - 如何解决动态公共(public) IP 地址问题以在我的个人服务器上托管网站

java - 数组唯一元素和移动应用程序数据结构

java - GWT+Jetty JSP 编译器问题的解决方法? (Java 1.5 源代码级别无法识别)

java - Tomcat 7 和 Oracle 连接池

java - https 请求没有从 apache web 服务器发送到 tomcat