🐥

ITスクールのWEB開発まとめーServletについて

2023/09/11に公開

前書き

ITスクールでJAVAの勉強が終わってから、コンピューターだけで終わらないDBやWEBなどを扱う作業を学に始め、そのためにSQL->HTML->CSSに繋がる言語もどんどん学んでいっている。

今週になって、その進みの速さが少しは怖くなっているが(先週の金曜日~月曜日でJAVA-SQLを終えて、火曜日1日でHTMLを終えて、水曜日1日でCSSを終えて...)、とにかく木曜日である今日は「サーブレット(Servlet)」というものをまた学び始めることになった。

とりあえずServletもWEB開発に使うことらしいので、詳しいことは本文で書いていきたいと思う。WEBについての知識はほぼないので、今回の本文には注釈がすごく多くなると思う。


サーブレット(Servlet)の前に、ちょっと背景について。

すこし急な話になると思うかもしれないが、サーブレットがなぜ登場したのかを簡単にまとめてみる。なぜなら、サーブレットが何であるかについて話そうとした私に、なぜサーブレットが登場したのかを理解することが充分役に立つと思ったからだ。

HTMLとCSSを学びながら作ったウェブページを見ると1つ分かることがある。それは私が作ったページは、どんなことをしても全く同じページばっかり見せてくれる。

なんと当然な話をするのかと思うかもしれないが、実際私たちが使ってるWEBはそうではないこと(同じページであっても、人によって違う物事を見せること)が分かるはずだ。

例えば、google広告は人によって、その人が好むような広告を見せてくれる。韓国で1番使われている、日本のyahooと同じレベルのサイトである「Naver」では、ログインしたアカウントごとによく使われたメニューがより先に出力される。このような作動を動的WEBと呼ぶ。

上記した動的WEBは、HTMLだけではできなさそう。入力しておいたコードのないようが変わることがないからだ。しかし、HTMLが発展しつつ、「JAVAを使えば、変数も関数も使えるのではないか」という理由でHTMLでJAVAを使えるようになり、そのために開発されたのが「Servlet」である。

Servletを使えば、動的に作動するページが作れる。HTMLの中でJAVAのコードを適応するのが可能になるからだ。下でServletの基本的な形を見てみよう。

Servletの基本コード

EclipseでServletのファイルを生成すると、最初にこのようなページが出る。

ServletBasic.java
package com.inchel.aug312.main;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Test
 */
@WebServlet("/Test")
public class Test extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Test() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

ServletファイルはJAVAで作られてある。色々コードが長くなっているが、JAVAの文法を考えてみると、基本的に使えるコードだけを残せる。残した後のコードは下記のようになる。

ServletArrange.java
package com.inchel.aug312.main;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Test")
public class Test extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
	}

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

}

HttpServletを継承している、作った名前のクラス(CLASS)があって、その中に「doGet」と「doPost」というメソッドがある。実際Servletで使うことはあの2つのメソッドである。急なことになるが、すぐ上記のコードをそのまま実行してみよう。

javaを学んだ人ならすごいおかしい提案である。なぜなら、クラスの中に「main」メソッドがないからだ。しかし、実行はできるのでしてみよう。(実行するにはTomcatというプログラムが設置されてあり、EclipseがTomcatと繋がってある必要がある。このめとめでは、残念ながらも繋げる方法はスキップする。)

すると、「Served at: /プロジェクト名」と書いてあるWEBページが開く。Servletのコードの内容はまだ分からないが、これは「doGet」という関数のコードが実行したのである。

「doGet」と「doPost」の違いはもっと下で説明して、とりあえずHTMLファイルを1個作ってみよう。そのHTMLで、データを入力して作ったServletに伝送してみる予定である。

HTMLで、Servletにデータを送ってみよう

HTMLファイルを作って、他のページにデータを送ってみよう。HTMLファイルに、下記のようにコードを作成した。データを伝送する方法は3つ学んだが、今回は「<form>」タッグを使って伝送をしてみ予定である。下記はコードを見る前に、簡単にまとめた<form>タッグでの伝送方法である。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- <form>タッグでデータを他のページに送る方法-->

<!-- formでinputで入力されたされたデータを「name」値としてServletに伝送し、それをServletから受ける。-->
<!--下記のコード参考-->

<form action = "Calculator"> <!--「Calculator」ファイルネームのServletに、データを入れて要請をする。-->
		x : <input name = "a"> <br> <!--Servletに「a」という名前で、「Calculator」Servletにデータを送る。-->	
		y : <input name = "b"> <p>  <!--Servletに「b」という名前で、「Calculator」Servletにデータを送る。-->
		<button>「Calculator」Servletで出力</button>
</form>

<hr><hr>

</body>
</html>

HTMLの作成が終わったら、HTMLで伝送したデータを受けて処理するServletファイルのコードも作成する。

Calculator.java
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/Calculator")
public class Calculator extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
		response.setCharacterEncoding("UTF-8"); // 「もらったデータを、ページでUTF-8という方式で出力せよ」と示すコード
		PrintWriter out = response.getWriter(); // データを受けたあと、ページに何かを書くために必要なインスタンス
		
//上記のHTMLでの「input」 タッグで、「a」として指名したnameのデータをパラメータにする「getParameter」メソッドでデータを受ける(String型になる。)
		int x = Integer.parseInt(request.getParameter("a")); //Stringをintに変換
//上記のHTMLでの「input」 タッグで、「a」として指名したnameのデータをパラメータにする「getParameter」メソッドでデータを受ける(String型になる。)
		int y = Integer.parseInt(request.getParameter("b"));
		
		//out.print("")のなかに、HTML文を書く。
		out.print("<html>");
		out.print("<head><title>四則演算結果</title><meta charset='UTF-8'></head>"); //ここの「charset='UTF-8'」は分かち書きにしないようにする。適応されない場合がある。
		out.print("<body>");
		
		out.print("<h1>四則演算</h1>");
		out.print("<table border = '1'>");

		out.printf("<tr><td> %d + %d = %d</tr></td>", x, y, x + y);
		out.printf("<tr><td> %d - %d = %d</tr></td>", x, y, x - y);
		out.printf("<tr><td> %d x %d = %d</tr></td>", x, y, x * y);
		out.printf("<tr><td> %d / %d = %.2f</tr></td>", x, y, x / (double)y);
		
		out.print("</table>");
		out.print("</body>");
		out.print("</html>");
	}

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

}

Servletへの伝送方式、「GET」と「POST」について

上のServlet例文を見ると、「doGet」メソッドでコードを書き、「doPost」の法にはなにも書かたかったのがわかる。これはHTMLでServletに要請をするときに、「GET」と「POST」方式をどっちか選んで送るからである。

<form>タッグでServletに要請をすると、基本的には「GET」という方式で伝送する。「GET」方式は、要請するとき伝送するデータがURL(ページの住所)に表示する。

先のデータはURLに表示されても問題ないが、どんなデータが伝送されたか表示したくない場合もあるはずだ。たとえば、ログインをするとき入力したパスワードなどがある。

そのときは「POST」方式を使う。POSTはデータをURLで表示されず、内部的に伝送する。あとファイルを伝送するためにはGET方式ができないので、必ずPOST方式を使う。

「POST」方式を使うために必要なことは下記である。

今回はPOST方式でデータを伝送して受けて処理してみよう。HTMLとServletコード2つを使う。まずはHTMLから。

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<form action = "StringOutput" method = "post"> // 属性でmethod="post"を追加。
	文字列を入力 : <input name = "String"> <br>//Stringという名前で、文字列データを伝送
	<button> 「StringOutPut」Servletで出力 </button>
</form>

</body>
</html>	

そして、<form>タッグの「action」属性にいれな「StringOutput」Servletのコードになる。GET方式と比べて追加されるコードがあることに注目しよう。

Stringoutput.java

	request.setCharacterEncoding("UTF-8"); // 追加したコード。「データをここに伝送するとき、送るデータを「UTF-8」方式に変換して送れ」と示すコード。
	response.setCharacterEncoding("UTF-8"); // 「送ったデータを受けて画面に出力するとき、UTF-8方式に出力せよ」と示すコード。
	PrintWriter out = response.getWriter(); // 受けたデータをページに見せるために使うインスタンス。
	String string = request.getParameter("String"); // HTMLで「String」という名前(name属性)で送ったデータを受ける。
	
	//下記はServletでページに表すHTMLを作成
	out.print("<html>");
	out.print("<head><title>文字列出力</title><meta charset='UTF-8'></head>");
	out.print("<body>");
		
	out.print("<h1>POST方式で文字列を出力</h1>");
	out.printf("入力した文字列 : %s", string);
		
	out.print("</table>");
	out.print("</body>");
	out.print("</html>");


以上で、Servletは何であるかと、HTMLからServletにデータを送って、そのデータをJAVA言語を使ってHTMLではできない演算などをして出力する例文をまとめてみた。ServletでHTMLだけではできないいろいろな作業、特にJAVA言語でできる様々な文法を使って動的なWEBを作ることができる。しかし、逆に言うとServletは難しい文法のJAVAで作られてある問題があって、他のServletファイルが必要である短所もある。

そのせいで、次はHTMLとJAVAを並行する他の方法を調べてみる予定である。

Discussion