Java EE 6のリリースに伴い、JPA 2.0仕様の大幅な変更に加えて、サーブレット3.0仕様にも多くの改善が加えられました。開発およびデプロイメント手順の簡素化、構成がより便利になり、非同期リクエストのサポートが登場し、セキュリティモデルが改善されました。 次に、APIの主な変更点を強調します。
主に、サーブレット(@WebServlet)、フィルター(@WebFilter)、リスナー(@WebListener)、およびセキュリティ制限(@ServletSecurity)を宣言するための注釈を導入することにより、サーブレットのプログラミングとデプロイメントが簡素化されました。 したがって、デプロイメント記述子web.xmlはオプションの要素になりました。 Servlet APIのコンポーネント自体はPOJOにならず、インターフェイスとクラスの通常の階層をキャンセルした人はいないという事実に注目します。 @MultipartConfigファイルのダウンロードをサポートし、@ WebInitParam初期化パラメーターを設定するための注釈も追加されました。
Hello Worldサーブレットの例
package net.ismailov.tests;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(name= "hw" , urlPatterns = "/hello_world" )
public class HelloWorld extends HttpServlet{
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PrintWriter writer = response.getWriter();
writer.println( "<h1>Hello, World!</h1>" );
}
}
良いニュースは、サーブレットを動的に登録できることです。
ServletRegistration.Dynamic dynamic =
servletContext.addServlet( “DynamicTestServlet” , “net.ismailov.DynamicTestServlet” )
dynamic.addMapping( “/dynamicServlet” );
長時間実行される操作をサポートするために、非同期サーブレット操作のオプションが追加されました。 この機能を有効にするには:
//
@WebServlet(asyncSupported= true )
//
dynamic.setAsyncSupported( true );
その後、メソッドの最後で応答が存在しなくなります。 電話する必要があります
AsyncContext ctx = ServletRequest.startAsync(req, res)
これで、リクエストとレスポンスのインスタンスが保存され、非同期メソッドの完了時に、AsyncContext.dispatchメソッドの1つをユーザーに出力するために使用できます(/ *さまざまなパラメーター* /)
@WebServlet( "/MyAsyncTestServlet" asyncSupported= true )
public class TestServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) {
...
AsyncContext aCtx = request.startAsync(req, res);
ScheduledThreadPoolExecutor executor = new ThreadPoolExecutor(10);
executor.execute( new MyAsyncService(aCtx));
}
}
public class MyAsyncService implements Runnable {
private AsyncContext ctx;
public MyAsyncService(AsyncContext ctx) {
this .ctx = ctx;
}
public void run() {
//
ctx.dispatch( "/result.jsp" );
}
既に述べたように、新しいAPIでは、アクセス制限を設定することが可能になりました。たとえば:
@WebServlet(name= "hw" , urlPatterns = "/hello_world" )
@ServletSecurity(@HttpConstraint(rolesAllowed = { "admin" }))
public class HelloWorld extends HttpServlet{
当然、ロール/ユーザーを割り当てるタスクと認証はベンダー固有です。 たとえば、glassfishは基本的なhttp認証フォームを発行します。
アクセス方法に制限を課すことも可能です:
@ServletSecurity(httpMethodConstraints={ @HttpMethodConstraint( "GET" ),
@HttpMethodConstraint( value = "POST" , rolesAllowed={ "user_group_1" })})
API 3.0の主な革新を反映しようとしましたが、昨年12月以降、Java EE6仕様の「リファレンス実装」であるGlassfish 3.0が利用可能になったことに注意してください。