2024/09/15 Updated by

Tomcat

実数データ をまとめて upload/download するサーブレット


[Up] Japanese English

実数データをまとめて upload/download するサーブレット


前提条件


Webアプリケーション proj を作成する

  1. 自分の Web Application のフォルダを用意する。ここでは proj とする。
  2.       ${CATALINA_HOME}/webapps/proj/WEB-INF/src/
          ${CATALINA_HOME}/webapps/proj/WEB-INF/classes/
    
    フォルダを生成する
    % mkdir -p ${CATAKLINA_HOME}/webapps/proj/WEB-INF/src 
    % mkdir -p ${CATAKLINA_HOME}/webapps/proj/WEB-INF/classes 
    
  3. XML ファイルを用意する
  4. ${CATALINA_HOME}/webapps/proj/WEB-INF/web.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                          http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
      version="4.0"
      metadata-complete="false">
    
     </web-app>
    
  5. サーブレットのソースファイル NetData.java を用意する。
  6. ${CATALINA_HOME}/webapps/proj/src/NetData.java
    import java.io.*;
    import java.util.*;
    import java.util.concurrent.*;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import javax.servlet.annotation.*;
    
    @WebServlet(name="NetData",urlPatterns={"/NetData"})
    public class NetData extends HttpServlet {
        ArrayBlockingQueue<Double> queue;
        public void doGet(HttpServletRequest request,
    		      HttpServletResponse response)
    	throws ServletException, IOException {
    	request.setCharacterEncoding("utf-8");
    	response.setContentType("text/plain; charset=utf-8");
    	PrintWriter out= response.getWriter();
    
    	if (queue == null) queue = new ArrayBlockingQueue<Double>(100);
    
    	String data = request.getParameter("data"); // 入力データを受け取る
    	if (data != null) {
    	    Scanner sc = new Scanner(data);
    	    while (sc.hasNext()) {
    		double d = sc.nextDouble();
    		queue.offer(d);
    	    }
    	    out.println(Integer.toString(queue.size()));
    	    return;
    	}
    
    	// 20 以上データが溜まると、古いデータを捨てる
    	while (queue.size() > 20) {
    	    queue.poll();
    	}
    
    	// アップロードされたデータを空白で区切って返す
    	StringBuilder sb = new StringBuilder();
    	sb.append(queue.size()); sb.append(" ");
    	while (queue.size() > 0) {
    	    sb.append(queue.poll());
    	    sb.append(" ");
    	}
    	out.println(sb.toString());
        }
    }
    
  7. コンパイルして NetData.class ファイルを生成する
  8. NetData.java をコンパイルする
    ~ % cd ${CATALINA_HOME}/webapps/proj/WEB-INF  
    ~/Documents/tomcat9/webapps/proj/WEB-INF % javac -encoding utf8 src/NetData.java -d classes -sourcepath src  
    ~/Documents/tomcat9/webapps/proj/WEB-INF % ls -lR  
    total 8
    drwxr-xr-x  3 nitta  staff   96  9 15 14:53 classes
    drwxr-xr-x  3 nitta  staff   96  9 15 14:53 src
    -rw-r--r--  1 nitta  staff  336  9 15 10:27 web.xml
    
    ./classes:
    total 8
    -rw-r--r--  1 nitta  staff  2078  9 15 14:53 NetData.class
    
    ./src:
    total 8
    -rw-r--r--  1 nitta  staff  1347  9 15 14:52 NetData.java
    -rw-r--r--  1 nitta  staff  2096  9 15 13:55 NetData.class     ← classes/ フォルダの下に生成される
    
    ./src:
    total 8
    -rw-r--r--  1 nitta  staff  1367  9 15 10:21 NetData.java
    
  9. tomcat を再起動する。これで /proj/NetData という WebApplication が tomcat に認識される。
  10. tomcat を再起動する
    ~/Documents/tomcat9/webapps/proj/WEB-INF % ${CATALINA_HOME}/bin/shutdown.sh   ← tomcat を一旦停止する
    Using CATALINA_BASE:   /Users/nitta/Documents/tomcat9
    Using CATALINA_HOME:   /Users/nitta/Documents/tomcat9
    Using CATALINA_TMPDIR: /Users/nitta/Documents/tomcat9/temp
    Using JRE_HOME:        /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home
    Using CLASSPATH:       /Users/nitta/Documents/tomcat9/bin/bootstrap.jar:/Users/nitta/Documents/tomcat9/bin/tomcat-juli.jar
    Using CATALINA_OPTS:   
    NOTE: Picked up JDK_JAVA_OPTIONS:  --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED \
        --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.util.concurrent=ALL-UNNAMED \
        --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
    ~/Documents/tomcat9/webapps/proj/WEB-INF % ${CATALINA_HOME}/bin/startup.sh    ← tomcat を起動する
    Using CATALINA_BASE:   /Users/nitta/Documents/tomcat9
    Using CATALINA_HOME:   /Users/nitta/Documents/tomcat9
    Using CATALINA_TMPDIR: /Users/nitta/Documents/tomcat9/temp
    Using JRE_HOME:        /Library/Java/JavaVirtualMachines/zulu-17.jdk/Contents/Home
    Using CLASSPATH:       /Users/nitta/Documents/tomcat9/bin/bootstrap.jar:/Users/nitta/Documents/tomcat9/bin/tomcat-juli.jar
    Using CATALINA_OPTS:   
    Tomcat started.
    
  11. ブラウザでアクセスする。(データをuploadする)
  12. 4個の実数データをアップロードして、4個という数字が返される。
    [ブラウザでアクセスするURL]
      http://localhost:8080/proj/NetData?data=1.1+2.2+3.3+4.4
    



  13. ブラウザでアクセスする。(データをuploadする)
  14. 2個の実数データをアップロードして、2個という数字が返される。
    [ブラウザでアクセスするURL]
      http://localhost:8080/proj/NetData?data=-5.0+-6.7
    



  15. ブラウザでアクセスする。(データをdownloadする)
  16. data パラメータ無しでアクセスすると、これまでアップロードされたデータが返される。 最初の整数はデータの個数で、1個の空白文字で区切られながら実数データが続く。 Webサーバ側のキューは初期化される。
    [ブラウザでアクセスするURL]
      http://localhost:8080/proj/NetData
    



  17. ブラウザでアクセスする。(データをuploadする)
  18. 2個の実数データをアップロードして、2個という数字が返される。
    [ブラウザでアクセスするURL]
      http://localhost:8080/proj/NetData?data=1.0+-2.0
    



  19. ブラウザでアクセスする。(データをdownloadする)
  20. data パラメータ無しでアクセスすると、これまでアップロードされたデータが返される。 Webサーバ側のキューは初期化される。
    [ブラウザでアクセスするURL]
      http://localhost:8080/proj/NetData
    



  21. 作成した ${CATALINA_HOME}/webapps/proj/ の内容は以下の通り。
  22. proj.zip