Sự khác biệt giữa servlet 3.0 và 3.1trong java [Non-blocking I/O, HTTP protocol (WebSocket)]

Servlet 3.0 đã được phát hành như một phần của Java EE 6 và đã thực hiện các thay đổi lớn tập trung vào tính dễ sử dụng. Ý tưởng là tận dụng các tính năng ngôn ngữ mới nhất, chẳng hạn như chú thích annotation và khái quát, và hiện đại hóa cách thức Servlets có thể được viết. Một trong những thay đổi trong version servlet 3.1 chính là Async Servlets. Servlet 3.1, được phát hành như một phần của Java EE 7, tập trung vào tính năng Non-blocking I/O.

Bài viết này tập trung đi vào ví dụ theo Oracle .

Có thể bạn quan tâm: 

Sự khác biệt servlet 2.5 và 3.0 trong java

Các bạn làm theo ví dụ dưới đây để hiểu hơn về tính năng Non-blocking I/O:

Tạo file index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Upload File Using Servlet 3.1, Non Blocking IO</title>
</head>
<body>
	<h1>Upload File Using Servlet 3.1, Non Blocking IO</h1>
	<form enctype="multipart/form-data" method="post"
		action="<%=request.getContextPath()%>/UploadServlet">

		<label for="fileToUpload">Select a File to Upload</label><br /> <input
			type="file" name="fileToUpload" id="fileToUpload"
			onchange="fileSelected();" />
		<div id="fileName"></div>
		<div id="fileSize"></div>
		<div id="fileType"></div>

		<div>
			<input type="submit" value="Upload" />
		</div>
	</form>

	<script type="text/javascript"> 
		function fileSelected() {
			var file = document.getElementById('fileToUpload').files[0];
		  	if (file) {
		  	var fileSize = 0;
		  	if (file.size > 1024 * 1024) {
		  		fileSize = (Math.round(file.size * 100 / (1024 * 1024)) / 100).toString() + 'MB';
		  	} else {
		  		fileSize = (Math.round(file.size * 100 / 1024) / 100).toString() + 'KB';
		  		document.getElementById('fileName').innerHTML = 'Name: ' + file.name;
		  		document.getElementById('fileSize').innerHTML = 'Size: ' + fileSize;
		  		document.getElementById('fileType').innerHTML = 'Type: ' + file.type;
		  	}
		  }
	  }
    </script>
</body>
</html>

File ReadListenerImpl.java

package com.example;

import java.io.IOException;
import java.util.Queue;

import javax.servlet.AsyncContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;

public class WriteListenerImpl implements WriteListener {
	private ServletOutputStream output = null;
	private Queue queue = null;
	private AsyncContext context = null;

	WriteListenerImpl(ServletOutputStream sos, Queue q, AsyncContext c) {
		output = sos;
		queue = q;
		context = c;
	}

	@Override
	public void onError(final Throwable t) {
		context.complete();
		t.printStackTrace();
	}

	@Override
	public void onWritePossible() throws IOException {
		while (queue.peek() != null && output.isReady()) {
			String data = (String) queue.poll();
			output.print(data);
		}
		if (queue.peek() == null) {
			context.complete();
		}
	}

}

File WriteListenerImpl.java

package com.example;

import java.io.IOException;
import java.util.Queue;

import javax.servlet.AsyncContext;
import javax.servlet.ServletOutputStream;
import javax.servlet.WriteListener;

public class WriteListenerImpl implements WriteListener {
	private ServletOutputStream output = null;
	private Queue queue = null;
	private AsyncContext context = null;

	WriteListenerImpl(ServletOutputStream sos, Queue q, AsyncContext c) {
		output = sos;
		queue = q;
		context = c;
	}

	@Override
	public void onError(final Throwable t) {
		context.complete();
		t.printStackTrace();
	}

	@Override
	public void onWritePossible() throws IOException {
		while (queue.peek() != null && output.isReady()) {
			String data = (String) queue.poll();
			output.print(data);
		}
		if (queue.peek() == null) {
			context.complete();
		}
	}

}

Tạo file servlet: UploadServlet.java

package com.example;

import java.io.IOException;

import javax.servlet.AsyncContext;
import javax.servlet.AsyncEvent;
import javax.servlet.AsyncListener;
import javax.servlet.ReadListener;
import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet(name = "UploadServlet", urlPatterns = { "/UploadServlet" }, asyncSupported = true)
public class UploadServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public UploadServlet() {
		super();
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		AsyncContext context = request.startAsync();
		// set up async listener
		context.addListener(new AsyncListener() {
			public void onComplete(AsyncEvent event) throws IOException {
				event.getSuppliedResponse().getOutputStream().print("Complete");
			}

			public void onError(AsyncEvent event) {
				System.out.println(event.getThrowable());
			}

			public void onStartAsync(AsyncEvent event) {
			}

			public void onTimeout(AsyncEvent event) {
				System.out.println("my asyncListener.onTimeout");
			}
		});
		ServletInputStream input = request.getInputStream();
		ReadListener readListener = new ReadListenerImpl(input, response, context);
		input.setReadListener(readListener);
	}

}

Trên là ví dụ của oracle đưa ra cho một ví dụ cụ thể non-blocking.

Các bạn có thể đọc và tìm hiểu thêm tại:

Link:

  1. https://en.wikipedia.org/wiki/Java_servlet#History
  2. https://www.oracle.com/webfolder/technetwork/tutorials/obe/java/HTML5andServlet31/HTML5andServlet%203.1.html#section6
0 0 đánh giá
Đánh giá bài viết
Theo dõi
Thông báo của
guest
0 Góp ý
Phản hồi nội tuyến
Xem tất cả bình luận
x