Gradle构建Java Web应用:Servlet依赖与Tomcat插件

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
2
@WebServlet (name =  "FileUploadServlet" , urlPatterns = { "/upload" })
@MultipartConfig

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

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

Gradle构建Java Web工程

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

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

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

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

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

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

最后构建运行工程:

?
1
2
gradle build
gradle tomcatRunWar

源码

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

?
1
git clone https: //github.com/Dynamsoft/Dynamic-Web-TWAIN.git
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值