WebサイトやWebサービスを作る場合、Javaではサーブレットを使用します。
サーブレットを使うと、通信処理を考えることなく、サーバーで必要な処理だけを書くことができます。
サーブレットとは・・?
サーバーで動作するプログラムです。
主に、ブラウザでアクセスされたときに動作。記述した処理を行って、ブラウザに処理結果を返します。
ブラウザからアクセスされることをリクエスト(要求)、ブラウザへ処理結果を返すことをレスポンス(応答)と呼びます。
どうやってサーブレットは動くの?
サーブレットは、コンテナ(Webコンテナ、サーブレットコンテナとも呼ばれます)の中で動作します。
コンテナはサーバーで動作していて、ブラウザからアクセスが来るのを待っています。
ブラウザからアクセスが来ると、アクセスされたURLに応じて、あらかじめ指定したサーブレットを呼び出してくれます。
よって、サーブレットを使うには、なんらかのコンテナが必要になります。
代表的なコンテナには、次のようなものがあります。
- Apache Tomcat
- JBoss
- WebSphere Application Server
足し算するサーブレットのサンプル
ここでは、ローカルホストにインストールされたTomcatを前提に進めます。
最初にブラウザでアクセスされたときは、2つのテキストフィールドを持つ画面を表示。
2つのテキストフィールドに数字を入れて、「send」ボタンを押したときは、2つの数字を足し算した結果を表示します。
web.xml
次のテキストを入れたweb.xmlファイルを配置します。
配置先:<Tomcatをインストールしたディレクトリ>/webapps/TestWeb/WEB-INF/web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 | web.xml<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <servlet> <description></description> <display-name>test</display-name> <servlet-name>test</servlet-name> <servlet-class>TestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>test</servlet-name> <url-pattern>/test/*</url-pattern> </servlet-mapping> </web-app> |
TestServlet.java
TestServlet.javaをコンパイルしたTestServlet.classファイルを配置します。
配置先:<Tomcatをインストールしたディレクトリ>/webapps/TestWeb/WEB-INF/classes/TestServlet.class
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 | import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class TestServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter pw = response.getWriter(); pw.append("<html>"); pw.append("<body>"); pw.append("<form action=\"./test\" method=\"POST\" >"); pw.append("x:<input type=\"text\" name=\"param_x\"><br>"); pw.append("y:<input type=\"text\" name=\"param_y\"><br>"); pw.append("<button type=\"submit\">send</button>"); pw.append("</form>"); pw.append("</body>"); pw.append("</html>"); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String x = request.getParameter("param_x"); String y = request.getParameter("param_y"); int ix = 0; if(x != null && x.length() != 0) { ix = Integer.parseInt(x); } int iy = 0; if(y != null && y.length() != 0) { iy = Integer.parseInt(y); } PrintWriter pw = response.getWriter(); pw.append("<html>"); pw.append("<body>"); pw.append("answer:<br>"); pw.append(Integer.toString(ix)).append(" + ").append(Integer.toString(iy)).append(" = ").append(Integer.toString((ix + iy))); pw.append("</body>"); pw.append("</html>"); } } |
実行結果
「http://localhost:8080/TestWeb/test」にアクセスしたとき
「http://localhost:8080/TestWeb/test」で、テキストに「1」と「2」を入れて「send」ボタンを押したとき
サンプルの解説
大きく、doGetメソッドとdoPostメソッドの2つがあります。
doGetメソッド
ブラウザのURLに「http://localhost:8080/TestWeb/test」を入れてアクセスしたときに動作します。
ブラウザに返すHTML(文字列)を、HttpServletResponse#getWriter()に追加していきます。
doPostメソッド
「http://localhost:8080/TestWeb/test」で、「send」ボタンを押したときに動作します。
ブラウザで入力されたパラメータは、HttpServletRequest#getParameter(String)で取得します。
パラメータを取得するには、フォームのテキストフィールドの名前「param_x」、または、「param_y」を指定します。
計算が終わったら、doGetと同じように、ブラウザへ返すHTMLを記述します。