Gradle的官方tutorial介绍了构建Java Web应用的基本方法。不过在使用Servlet做上传的时候会碰到问题。这里分享下如何通过Servlet上传文件,以及如何使用Gradle来构建相应的Java Web工程。

参考原文:How to Build Web Scanning Application with Gradle

Servlet文件上传

使用Servlet文件上传,可以参考Oracle的官方文档The fileupload Example Application。这里需要注意的一个问题就是要接收multipart/form-data数据,在Servlet中必须申明:

  1. @WebServlet(name = "FileUploadServlet", urlPatterns = {"/upload"})
  2. @MultipartConfig

不然,getPart()会返回空。Servlet接收上传文件可以这样写:

  1. /*
  2.  * To change this license header, choose License Headers in Project Properties.
  3.  * To change this template file, choose Tools | Templates
  4.  * and open the template in the editor.
  5.  */
  6.  
  7. package com.dynamsoft.upload;
  8.  
  9. import java.io.File;
  10. import java.io.FileNotFoundException;
  11. import java.io.FileOutputStream;
  12. import java.io.IOException;
  13. import java.io.InputStream;
  14. import java.io.OutputStream;
  15. import java.io.PrintWriter;
  16. import java.util.logging.Level;
  17. import java.util.logging.Logger;
  18. import javax.servlet.ServletException;
  19. import javax.servlet.annotation.MultipartConfig;
  20. import javax.servlet.annotation.WebServlet;
  21. import javax.servlet.http.HttpServlet;
  22. import javax.servlet.http.HttpServletRequest;
  23. import javax.servlet.http.HttpServletResponse;
  24. import javax.servlet.http.Part;
  25.  
  26. @WebServlet(name = "DWTUpload", urlPatterns = {"/DWTUpload"})
  27. @MultipartConfig
  28. public class DWTUpload extends HttpServlet {
  29.     private final static Logger LOGGER =
  30.             Logger.getLogger(DWTUpload.class.getCanonicalName());
  31.     /**
  32.      * Processes requests for both HTTP <code>GET</code> and <code>POST</code>
  33.      * methods.
  34.      *
  35.      * @param request servlet request
  36.      * @param response servlet response
  37.      * @throws ServletException if a servlet-specific error occurs
  38.      * @throws IOException if an I/O error occurs
  39.      */
  40.     protected void processRequest(HttpServletRequest request,
  41.         HttpServletResponse response)
  42.         throws ServletException, IOException {
  43.     response.setContentType("text/html;charset=UTF-8");
  44.  
  45.     // Create path components to save the file
  46.     final Part filePart = request.getPart("RemoteFile");
  47.     final String fileName = getFileName(filePart);
  48.  
  49.     OutputStream out = null;
  50.     InputStream filecontent = null;
  51.     final PrintWriter writer = response.getWriter();
  52.  
  53.     String realPath = getServletContext().getRealPath("/");
  54.     if (realPath == null)
  55.         realPath = "f:\\web_upload"; // modify the default uploading dir accordingly
  56.  
  57.     String uploadPath = realPath + File.separator + "upload";
  58.  
  59.     File uploadDir = new File(uploadPath);
  60.     if (!uploadDir.exists())
  61.         uploadDir.mkdir();
  62.  
  63.     try {
  64.         out = new FileOutputStream(new File(uploadPath + File.separator
  65.                 + fileName));
  66.         filecontent = filePart.getInputStream();
  67.  
  68.         int read = 0;
  69.         final byte[] bytes = new byte[1024];
  70.  
  71.         while ((read = filecontent.read(bytes)) != -1) {
  72.             out.write(bytes, 0, read);
  73.         }
  74.         writer.println("New file " + fileName + " created at " + uploadPath);
  75.         LOGGER.log(Level.INFO, "File{0}being uploaded to {1}",
  76.                 new Object[]{fileName, uploadPath});
  77.     } catch (FileNotFoundException fne) {
  78.         writer.println("You either did not specify a file to upload or are "
  79.                 + "trying to upload a file to a protected or nonexistent "
  80.                 + "location.");
  81.         writer.println("<br/> ERROR: " + fne.getMessage());
  82.  
  83.         LOGGER.log(Level.SEVERE, "Problems during file upload. Error: {0}",
  84.                 new Object[]{fne.getMessage()});
  85.     } finally {
  86.         if (out != null) {
  87.             out.close();
  88.         }
  89.         if (filecontent != null) {
  90.             filecontent.close();
  91.         }
  92.         if (writer != null) {
  93.             writer.close();
  94.         }
  95.     }
  96. }
  97.  
  98. private String getFileName(final Part part) {
  99.     final String partHeader = part.getHeader("content-disposition");
  100.     LOGGER.log(Level.INFO, "Part Header = {0}", partHeader);
  101.     for (String content : part.getHeader("content-disposition").split(";")) {
  102.         if (content.trim().startsWith("filename")) {
  103.             return content.substring(
  104.                     content.indexOf('=') + 1).trim().replace("\"", "");
  105.         }
  106.     }
  107.     return null;
  108. }
  109.  
  110.     // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
  111.     /**
  112.      * Handles the HTTP <code>GET</code> method.
  113.      *
  114.      * @param request servlet request
  115.      * @param response servlet response
  116.      * @throws ServletException if a servlet-specific error occurs
  117.      * @throws IOException if an I/O error occurs
  118.      */
  119.     @Override
  120.     protected void doGet(HttpServletRequest request, HttpServletResponse response)
  121.             throws ServletException, IOException {
  122.         processRequest(request, response);
  123.     }
  124.  
  125.     /**
  126.      * Handles the HTTP <code>POST</code> method.
  127.      *
  128.      * @param request servlet request
  129.      * @param response servlet response
  130.      * @throws ServletException if a servlet-specific error occurs
  131.      * @throws IOException if an I/O error occurs
  132.      */
  133.     @Override
  134.     protected void doPost(HttpServletRequest request, HttpServletResponse response)
  135.             throws ServletException, IOException {
  136.         processRequest(request, response);
  137.     }
  138.  
  139.     /**
  140.      * Returns a short description of the servlet.
  141.      *
  142.      * @return a String containing servlet description
  143.      */
  144.     @Override
  145.     public String getServletInfo() {
  146.         return "Short description";
  147.     }// </editor-fold>
  148.  
  149. }

Gradle构建Java Web工程

在使用Gradle构建这个Web工程的时候,如果按照官方文档,getPart这个方法是找不到的,用到的依赖可以换成:

  1. dependencies {
  2.    providedCompile "javax:javaee-api:6.0"
  3. }

另外一个问题就是使用jetty插件了,同样会失败。因为jetty不支持Servlet 3.0。官方论坛里有回复: Unable to use servlet 3.0 api in jetty plugin。替代方法可以使用Gradle Tomcat plugin 。在build.gradle文件中添加:

  1. buildscript {
  2.     repositories {
  3.         jcenter()
  4.     }
  5.  
  6.     dependencies {
  7.         classpath 'com.bmuschko:gradle-tomcat-plugin:2.1'
  8.     }
  9. }
  10.  
  11. subprojects {
  12.    apply plugin : "java"
  13.    repositories {
  14.       mavenCentral()
  15.    }
  16. }

然后在子工程的build.gradle文件中添加tomcat插件:

  1. apply plugin: "war"
  2. apply plugin: 'com.bmuschko.tomcat'
  3.  
  4. dependencies {
  5.    providedCompile "javax:javaee-api:6.0"
  6.  
  7.    def tomcatVersion = '7.0.59'
  8.    tomcat "org.apache.tomcat.embed:tomcat-embed-core:${tomcatVersion}",
  9.     "org.apache.tomcat.embed:tomcat-embed-logging-juli:${tomcatVersion}",
  10.       "org.apache.tomcat.embed:tomcat-embed-jasper:${tomcatVersion}"
  11. }
  12.  
  13. tomcat {
  14.     httpPort = 8080
  15.     httpsPort = 8091
  16.     enableSSL = true
  17. }

最后构建运行工程:

  1. gradle build
  2. gradle tomcatRunWar

源码

https://github.com/Dynamsoft/Dynamic-Web-TWAIN/tree/master/samples/gradle

  1. git clone https://github.com/Dynamsoft/Dynamic-Web-TWAIN.git

http://my.oschina.net/yushulx/blog/401888

Gradle构建Java Web应用:Servlet依赖与Tomcat插件(转)的更多相关文章

  1. Gradle构建Java Web应用(转)

    转自:http://www.blogjava.net/jiangshachina/archive/2014/02/03/409285.html 本文是发布在java.net上的一篇摘自于<Gra ...

  2. Eclipse中使用Gradle构建Java Web项目

    Gradle是一种自动化建构工具,使用DSL来声明项目设置.通过Gradle,可以对项目的依赖进行配置,并且自动下载所依赖的文件,使得构建项目的效率大大提高. 1. 安装Gradle 下载Gradle ...

  3. 使用Eclipse+Maven+Jetty构建Java Web开发环境(几个教程综合集成2014发行)

    工作需要使用Jetty由于web集装箱,得知Eclipse+Maven+Jetty该组合是非常好的,因此,要在网上找了很多教程,但不写或多或少特定的或过时的内容而导致最终的配置失败,易于配置为未来的同 ...

  4. 使用Gradle创建java web项目

    什么是Gradle? Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具. 它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML ...

  5. 使用 Gradle 构建 Java 项目

    使用 Gradle 构建 Java 项目 这个手册将通过一个简单的 Java 项目向大家介绍如何使用 Gradle 构建 Java 项目. 我们将要做什么? 我们将在这篇文档航中创建一个简单的 Jav ...

  6. Java Web之Servlet中response、request乱码问题解决

    Java Web之Servlet中response.request乱码问题解决   一.request请求参数出现的乱码问题 get请求: get请求的参数是在url后面提交过来的,也就是在请求行中, ...

  7. java web中servlet、jsp、html 互相访问的路径问题

    java web中servlet.jsp.html 互相访问的路径问题 在java web种经常出现 404找不到网页的错误,究其原因,一般是访问的路径不对. java web中的路径使用按我的分法可 ...

  8. 使用Intellij idea新建Java Web项目(servlet) 原理及初步使用

    准备 JDK       (配置JDK_HOME\bin   和 CLASSPATH)   注:JDK8下载已经需要注册了,请使用JDK11(现在是官方长期支持的版本)     对于我们新手来说,JD ...

  9. JAVA WEB 用servlet实现分页,思路比较清晰和简单。

    JAVA WEB 用servlet实现分页,思路比较清晰和简单.借鉴了其他大佬的思路.特别感谢. 是我第一次发表博客,如果有什么错误,欢迎大家指出!,谢谢 一.思路分析 前台一定是有类似这种的界面 点 ...

随机推荐

  1. MVC-03 控制器(5)

    八.动作过滤器 有时在运行Action之前或之后会需要运行一些逻辑运算,以及处理一些运行过程中所生成的异常状况,为了满足这个需求,ASP.NET MVC提供动作过滤器(Action Filter)来处 ...

  2. docker4dotnet

    docker4dotnet #1 – 前世今生 & 世界你好   作为一名.NET Developer,这几年看着docker的流行实在是有些眼馋.可惜的是,Docker是基于Linux环境的 ...

  3. Windows下Python中的中文路径和中文输出问题

    这几天有个项目需要写一点类似于脚本的小程序,就用Python写了,涉及到中文路径和中文输出的问题,整理一下. 有一个问题我觉得需要先强调一下,在写Python程序的时候,一定保证编码是utf-8,然后 ...

  4. WINDOWS硬件通知应用程序的常方法

    摘要:在目前流行的Windows操作系统中,设备驱动程序是操纵硬件的最底层软件接口.为了共享在设备驱动程序设计过程中的经验,给出设备驱动程序通知应用程序的5种方法,详细说明每种方法的原理和实现过程,并 ...

  5. 查看LINUX系统版本和硬件信息

    查看发行版本 # cat /etc/issue Red Hat Enterprise Linux Server release 6.2 (Santiago) 查看内核 # uname -a Linux ...

  6. Java_java多线程下载-断点下载-超详细

    基本原理:利用URLConnection获取要下载文件的长度.头部等相关信息,并设置响应的头部信息.并且通过URLConnection获取输入流,将文件分成指定的块,每一块单独开辟一个线程完成数据的读 ...

  7. C语言实验——一元二次方程Ⅱ

    C语言实验--一元二次方程Ⅱ Time Limit: 1 Sec  Memory Limit: 64 MB Submit: 169  Solved: 131 [Submit][Status][Web ...

  8. php单元測试

    你是否在程序开发的过程中遇到下面的情况:当你花了非常长的时间开发一个应用后,你觉得应该是大功告成了,可惜在调试的时候,老是不断的发现bug,并且最可怕的是,这些bug是反复出现的,你可能发现这些bug ...

  9. hdu1281结题报告

    哎哎...自己刚刚一看到这个题目居然.....什么都想不到...看了一下别人的解题报告说最大匹配...于是就自己开始构思啦... 对于这个棋盘,有K个可以放棋子的位置....那么 首先我们开始可以求出 ...

  10. 关于PagedDataSource分页属性与DataSet和DataTable详解

    Asp.net提供了三个功能强大的列表控件:DataGrid.DataList和Repeater控件,但其中只有DataGrid控件提供分页功能.相对DataGrid,DataList和Repeate ...