そもそもサーブレットでは時間のかかる処理を書いたり、スレッドを作りバックグラウンドで処理をしてはいけないという決まりがあるらしい。しかしTomcatなど特にチェックなどしておらずやろうと思えばできてしまうため結構使っている人も多いのではないでしょうか?(自分もそうです)
そういう場合にServlet3.0からはAsyncContextを別スレッドを使って実行することができるようです。
そもそもサーブレットでは時間のかかる処理を書いたり、スレッドを作りバックグラウンドで処理をしてはいけないという決まりがあるらしい。しかしTomcatなど特にチェックなどしておらずやろうと思えばできてしまうため結構使っている人も多いのではないでしょうか?(自分もそうです)
そういう場合にServlet3.0からはAsyncContextを別スレッドを使って実行することができるようです。
package test; // import文は省略 public class MyWrapperServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { // パラメータの書き換えを行うHttpServletRequestを設定して // myServlet.doにforward RequestDispatcher dispatcher = req.getRequestDispatcher("/myServlet.do"); MyServletRequestWrapper _req = new MyServletRequestWrapper(req); dispatcher.forward(_req, res); } public static class MyServletRequestWrapper extends HttpServletRequestWrapper { public MyServletRequestWrapper(HttpServletRequest request) { super(request); } @Override public String getParameter(String name) { if ("p1".equals(name)) { name = "p2"; } return getRequest().getParameter(name); } @Override public String[] getParameterValues(String name) { if ("p1".equals(name)) { name = "p2"; } return getRequest().getParameterValues(name); } } }
<servlet> <servlet-name>myServlet</servlet-name> <servlet-class>test.MyServlet</servlet-class> </servlet> <servlet> <servlet-name>myWrapperServlet</servlet-name> <servlet-class>test.MyWrapperServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>myServlet</servlet-name> <url-pattern>/myServlet.do</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>myWrapperServlet</servlet-name> <url-pattern>/myWrapperServlet.do</url-pattern> </servlet-mapping>
http://{server}:{port}/myapp/myWrapperServlet.do?p2=abcdefg
http://{server}:{port}/myapp/myServlet.do?p1=abcdefg