Tomcat7上でServlet+JSPしてみる

前回の投稿から大分時間が経ってしまったが、タイトル通り、ServletとJSPを連携させたWebページをやってみた。

前回、前々回と、JSP、ServletでWebページを作成したが、通常はこの二つをそれぞれ単独で使うことはほとんどなく、今回のような連携をさせて動的Webページを作成する。
これらをどのように使い分けるのかというと、おおざっぱに言えば以下の通りである。

  • Servletでさまざまな「処理」を行う。データベースの更新やセッション情報の管理、画面表示に必要な情報の作成などはServletで行う。
  • JSPでは、Servletで処理された情報をつかって画面を作成する。JSPには極力Javaのコードを書かないようにする。(必要な処理は極力Servletでやってしまうようにする。)

こうすることで、「処理」と「画面デザイン」を分離することができるので、アプリケーションのメンテナンスがしやすくなるそうだ。

とりあえずやってみることにする。

■Webアプリケーションのディレクトリ整備
Webアプリケーションは、前回と同じ<Tomcatインストールディレクトリ>\webapp\test とする。
前回のディレクトリ構成に加えて、「WEB-INF」ディレクトリに「jsp」ディレクトリを作成する。
このディレクトリはJSPファイルを格納するためのものである。
servletjsp01

■Servletクラスの作成

TestServletJSP.javaに下記プログラムを書いて適当なところに保存する。

package servlet;
import java.io.IOException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
/**
* テストサーブレットクラス
*/
@WebServlet(description = "サーブレット テスト", urlPatterns = { "/HelloServletJSP" })
public class TestServletJSP extends HttpServlet {
    /**
     * GETリクエスト処理
     */
    protected void doGet(
        HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
        // JSPに渡すメッセージの設定
        request.setAttribute("message", "Servlet Message.");
        // 呼び出すJSPの相対パスを指定して、ディスパッチャを作成
        RequestDispatcher dispatcher =
            request.getRequestDispatcher("WEB-INF/jsp/TestServletJSP.jsp");
        // ディスパッチャを使ってJSPに制御を渡す
        dispatcher.forward(request, response);
    }
}

Servletでディスパッチャを作成すると、それを使ってJSPを呼び出せるようになる。
JSPにデータを渡したいときは、requestの属性設定に入れておけばよい。
setAttribute()メソッドを使用して登録することができる。使い方は、第1引数にデータの名前、第2引数に登録したいデータを指定する。
今回は、データの名前を「message」、データを「Servlet Message.」の文字列としておいた。

あとは、前回と同様、作成したプログラムをコンパイルする。
コンパイルで作成さらたクラスファイルも、前回同様の場所に格納する。

■JSPの作成
次に、JSPを作成する。
JSPは、<Tomcatインストールディレクトリ>\webapp\test\WEB-INF\jspにHelloServletJSP.jspを作成する。
内容は以下の通りにする。


<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<html>
  <head>
  </head>
  <body>
    <h1>Hello Servlet JSP!!</h1>
    <h2>ほげほげ</h2>
    <p>コンテキストパス:<%=request.getContextPath() %></p>
    <-- Servletで設定したメッセージデータを受け取り、表示する. -->
    <p>サーブレットからのメッセージ<%=(String)request.getAttribute("message") %></p>
  </body>
</html>

サーブレットでリクエストの属性に設定しておいたメッセージをとりだすにはgetAttribute()メソッドを使用する。(10行目)
引数には、取り出したいデータ名を指定すればよい。
今回はサーブレットで「message」という名前のデータを設定しておいたので、それを取り出す。

■web.xmlの作成
<Tomcatインストールディレクトリ>\webapp\test\WEB-INFに下記内容のweb.xmlを作成する。(前回と同じもの)

<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns:xsi="http://www.w3c.org/2001/XMLSchema-instance">
<display-name>Test Application</display-name>
</web-app>

■動作テスト
Tomcatを起動し、「http://localhost:8080/test/HelloServletJSP」にアクセスして、下記ページが表示されれば、うまく動いている。
servletjsp02

カテゴリー: プログラミング, Java, Servlet | タグ: , , | コメントをどうぞ

【ラウンドハウス】475系北陸色を手に入れた【ジャンク】

先日秋葉原を徘徊していたところ、475系北陸色を発見。
箱なし、袋詰めのジャンク品ということでちょっと悩んだが、予備校時代にお世話になった電車であることだし、購入することにした。

帰って、袋から出してみたが、外観上気になる箇所はなし。
n475_01

動作確認したいところだが、部屋が散らかっているので、線路がひろげられず断念。
後日動作確認後、各種試験用の編成として活用してみようと思う。

カテゴリー: Nゲージ | タグ: , | コメントをどうぞ

【簡易デバッグ機能付】ATmega88用書き込みボードの作成

AVRISP mkIIからATmega88へ書き込みするための専用ボードを、使い慣れない半田ごてを試行錯誤しながら作った。

筆者が電子工作で使用しているマイコンに、AVRのATmega88がある。
サイズは大きいが多機能で、結構便利なマイコンである。

今までは、AVRISP mkIIをブレッドボードにつなげて、ブレッドボード上でプログラムの書き込みを行っていた。
しかし、書き込みのたびに、ブレッドボードに書き込み用回路を組むのが面倒になってきた。
そこで、ATmega88書き込み専用のボードを作ることにした。

まずは、回路図作成ソフトを利用して、回路を適当に設計。
ATmega88Writer_03

使った部品は以下通り。すべて秋葉原の秋月または千石で購入した。

  • 3端子レギュレータ(L7805CV-DG:¥30)
  • セラミックコンデンサ2個(0.1uF:5個¥30)
  • 電解コンデンサ(470uF:¥20)
  • 電解コンデンサ(47uF:¥15)
  • 1/4W炭素被膜抵抗4個(330Ω:100個¥200)
  • 赤色LED4個(100個¥350)
  • 2列ピンヘッダ(¥50)
  • 丸ピンICソケット(28P)(¥70)
  • ユニバーサル基盤(¥60)
  • 2.1mmDCジャック(¥60)

で、完成したのがこちら。
ATmega88Writer_01
右のユニバーサル基盤が今回作成したATmega88用書き込みボード。
左がターゲットとなるATmega88のICである。

書き込みボードの説明だが、電源は、12V ACアダプタからとることを前提としている。(筆者が使用しているのは秋月の12V1.5A ACアダプタGF18-US1215-T:¥950)
ICへの電源共有には5Vが必要なため、レギュレータを使って降圧している。
AVRISP mkIIはボード左側の6ピンにそのまま指す。
真ん中のソケットにターゲットICをさせば、書き込みができる。

このボードには、簡易デバッグ機能もついている。
といっても、そんな大それたものではなく、プログラムの動作を目で確認できるように、いくつかのポートにLEDやら、ピンをつないだだけである。

右下のLED4つは、PB1~3、PD6につないでおり、PWMの動作確認ができるようにした。
右上の6ピンはA/D変換確認用に可変抵抗をつなげられるようにしている。

動作確認として、LEDを光らせるプログラムを書き込みしてみたところ、うまく書き込みができた。
IMG_0280
この通り、LEDが光っている。

カテゴリー: ATmega88P, AVR | タグ: | コメントをどうぞ

【マイクロエース】485-3000 はくたか編成を手に入れた

前から探していたマイクロエースの485-3000 はくたか編成を中古で手に入れた。

マイクロエースの485-3000 上沼垂色は何回か生産されているが、これはおそらく初期に生産されたものだとおもう。
動力ユニットがフライホイールモデルではないので、店での確認時の走行音が大きかった。
(2000年頃に生産されたモデルか?)

状態の詳細な確認は後日行うとして、とりあえず先頭車 クハ481-3000 を取り出してみた。
N_485-3000_01

ヘッドマークは全オーナーさんが貼り付けされたようなのですが、若干ずれている模様。
貼りなおしたいと思うのだが、シール単品の販売はされているんだろうか?

外観で気になるのはそこぐらいで、パッと見、状態はよさそうに感じられる。

本製品は割と癖があるものであるらしいので、早い段階で走行確認を実施後、TNカプラーへの換装と室内照明ユニットの取り付けをする予定。

カテゴリー: Nゲージ | タグ: | コメントをどうぞ

Raspberry pi の熱対策をしてみた

最近、Raspberry pi をWebサーバとして運用し始めたのだが、常に電源が入っている状態で、CPUの熱とか大丈夫なんだろうか?と疑問に思ってしまった。
Raspberry pi のCPUにはヒートシンクなどが元々ついておらず、電源を付けてしばらくおいたものを触ってみると、にわかに熱い。
測ってみると53.3℃(室温27℃環境下で測定)。70℃くらいまでは大丈夫らしいのだが(どこでそんな情報を見たかは忘れた)ちょっと心配になったので、ヒートシンクを装着して、熱対策してみることにした。

で、装着したものがこれである。
raspberrypi
20mm×20mmのアルミ製銅メッキのものを使用した。
Raspberry pi 上の熱源はCPUのほかにLANコントローラとレギュレータがあるが、今回はCPUにだけヒートシンクを装着した。

結果
装着前後でのCPU温度測定結果は下記の通りである。

ヒートシンク装着前 53.3℃
ヒートシンク装着後 52.0℃

※室温27℃環境下で測定
※測定方法は、電源投入後十分な時間を置いたアイドル状態での温度を測定

ヒートシンク装着によって、CPU温度は1.3℃下がった。
5℃くらいは下がってくれるかな、と思っていたが、意外と冷えない。。。
まあ、ケースに入れていて、空気の流れもないから、なのかな。

高負荷状態での測定を行っていないが、70℃とかいう熱い状態にはなっていないようなので、とりあえずは様子見で。

カテゴリー: Raspberry pi | タグ: | コメントをどうぞ

Tomcat7上にServletを設置してHelloWorldしてみる

前回、Tomcat7上にJSPを設置してHelloWorldしてみた。
同じようなことを、今度はServletでやってみようと思う。

■Webアプリケーションのディレクトリ整備
Webアプリケーションは、前回と同じ<Tomcatインストールディレクトリ>\webapp\test とする。
このディレクトリ直下に「WEB-INF」ディレクトリを作成する。
この「WEB-INF」ディレクトリは、アプリケーション起動時は、外側から不可視となる。

「WEB-INF」配下に「classes」ディレクトリを作成する。
このディレクトリは、コンパイル済みの.classファイルを格納するディレクトリである。
Servletのクラスファイルも、当然ここに入れる。

この「classes」配下に、さらに「servlet」ディレクトリを作成する。
これは、今回作成するServletクラスをservletパッケージに入れるためである。
servlet00

■Servletクラスの作成

TestServlet.javaに下記プログラムを書いて適当なところに保存する。

package servlet;

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(description = "サーブレット テスト", urlPatterns = { "/HelloServlet" })
public class TestServlet extends HttpServlet {

/**
* GETリクエスト処理
*/
protected void doGet(
HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// レスポンスヘッダの設定
response.setContentType("text/html; charset=UTF-8");
// ページの描画
PrintWriter writer = response.getWriter();
writer.println("<html>");
writer.println(" <head>");
writer.println(" <title>HelloServlet</title>");
writer.println(" </head>");
writer.println(" <body>");
writer.println(" <h1>Hello Servlet</h1>");
writer.println(" <p>GET Request.</p>");
writer.println(" <p>日本語のテスト</p>");
writer.println(" </body>");
writer.println("</html>");
}
}

コマンドプロンプトを起動し、作成したプログラムをコンパイルする。
Servlet関係のクラスを利用しているため、classpathにTomcat付属のservlet-api.jarを引き込むことを忘れずにする。

javac -classpath <Tomcatインストールディレクトリ>\lib\servlet-api.jar <TestServlet.javaをフルパスで指定>

コンパイルしたクラスファイルは、<Tomcatインストールディレクトリ>\webapp\test\WEB-INF\classes\servlet に格納する。

■web.xmlの作成
<Tomcatインストールディレクトリ>\webapp\test\WEB-INFに下記内容のweb.xmlを作成する。

<?xml version="1.0" encoding="UTF-8" ?>
<web-app xmlns:xsi="http://www.w3c.org/2001/XMLSchema-instance">
<display-name>Test Application</display-name>
</web-app>

■動作テスト
Tomcatを起動し、「http://localhost:8080/test/HelloServlet」にアクセスして、下記ページが表示されれば、うまく動いている。
このアドレスは、TestServlet.java内のアノテーションという機能を使って設定している。(@WebServletの行)
アドレスを変えたいときは、ここを変える。
servlet01

カテゴリー: プログラミング, Java, Servlet | タグ: , , | コメントをどうぞ

JSPでXMLデータを出力する際の注意

Servlet/JSP でXMLデータをレスポンスとして返すプログラムを書こうとしてつまずいた話。
JSPに下記プログラムを書いてFirefoxでテストしてみたところ。。。

<%@ page language="java" contentType="text/xml; charset=UTF-8" %>
<?xml version="1.0" encoding="UTF-8" ?>
<document-root>
<hogehoge1>HOGEHOGE1</hogehoge1>
<hogehoge2>HOGEHOGE2</hogehoge2>
</document-root>

「XML パースエラー: 実体の初めに XML またはテキスト宣言がありません。」

jsp-xml

ちなみに、IE11で開くと真っ白になる。

原因は、レスポンスデータが<?xml ~ ?>で始まっていないため。
ブラウザによっては、データの先頭がこれで始まっていないと、XMLデータとして解釈してくれないらしい。

jsp-xml2

なんでこんなデータになったのかというと、JSPの1行目がコンパイル後は空行として出力されるからである。

解決方法は2つ。
1.<%@ page trimDirectiveWhitespaces=”true” %>の行を追加する。
この1行を追加することで、コンパイル時に<% ~ %>を詰めた状態で出力してくれる。
2.<%@ page language=”java” contentType=”text/xml; charset=UTF-8″ %>を
<?xml ~ ?>以降に書く。

カテゴリー: プログラミング, Java, Servlet | タグ: , , | コメントをどうぞ