なんかの Log

良い感じで投げっぱなしにしてみせる。

ServletやMySQLさんを使うときのメモ

引越しやらお仕事やらで止まってました。

お仕事でちょっと使うことにしたけど、ぐーぐるさんに聞くと割と古い情報が先にひっかかってしまうので書いておく。

開発環境は以下です。

OS Java IDE コンテナ
Windows 7 x64 Java 7u3 Eclipse 3.7 SR2 Tomcat 7.0.27

Eclipseで開発環境を作る

とりあえずEclipseでプロジェクト作ります。の前にEclipseTomcatサーバ動かせるように設定します。

  • [Window]-[Preference]-[Server]-[Runtime Environment]

AddボタンからTomcat7を選んで[Next]、tomcatを公式からDLしてファイルパスを指定すればOK。次にProject Exploerにサーバプロジェクトを作ります。

  • [File]-[New]-[Other]-[Server]

先程登録したtomcatさんを[Server Runtime Environment]に指定してあげればOKです。これでEclipse上からTomcatさんの起動ができ、ログをコンソールに表示できます。

プロジェクトの作成

んで開発プロジェクトを作りましょう。

  • [File]-[New]-[Project]-[Dynamic Web Project]

適当に名前をつけてあげればOK。

動作確認

とりあえず動かしてみようということでServletをちょっと書いてみる。[Java Resource]-[src]下に適当にServletファイルを作ります。コードは↓な感じで。

@WebServlet("/hello")
public class HelloController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	public IndexController() {
		super();
	}

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter pw = response.getWriter();
		pw.print("はろー");
		pw.close();
	}
}

[Run on Server]で実行するとhttp://localhost:8080/[project name]/helloにブラウザでアクセスすると"はろー"の文字が見えるので動いてるようです。Servlet 3.0でアノテーションで書けるのを今日知りましたorz

MySQLにアクセス

MySQLのほうに適当にDBとテーブルを作っておきましょう。

create database kusoneko;
create table book (id integer, title varchar(64));

DBサーバーにはJNDIを利用します。なんかのインターフェイスらしいです。Eclipseで利用するには[WebContent]-[META-INF]下に[context.xml]を作成して↓みたいに設定します。

<?xml version="1.0" encoding="UTF-8"?>
<Context>
	<Resource name="jdbc/JNDI" auth="Container" type="javax.sql.DataSource"
		driverClassName="com.mysql.jdbc.Driver"
		url="jdbc:mysql://localhost:3306/kusoneko?autoReconnect=true"
		username="username" password="user-password" />
</Context>

JavaMySQLサーバに接続するためにJDBCドライバーを手に入れます。ついでにSQLの実行は素でするとオブジェクトの生成やclose処理が面倒なのでここではDbUtilsというライブラリを使います。

MySQL :: Download Connector/J
Download Commons DbUtils

解凍してそれぞれのjarを[WebContent]-[WEB-INF]-[lib]フォルダに入れます。

データを更新するコードを書いてみます。

@WebServlet("/hello")
public class HelloController extends HttpServlet {
	private static final long serialVersionUID = 1L;

	// アノテーションで接続時にDataSourceを取得してくれる
	@Resource(name = "jdbc/JNDI")
	private DataSource ds;

	public IndexController() {
		super();
	}

	prote
protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		QueryRunner qr = new QueryRunner(ds);
		try {
			int update = qr.update("insert into book values(?, ?)", 0, kusoneko);
			PrintWriter pw = response.getWriter();
			pw.print(update);
			pw.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

context.xmlで設定した"jdbc/JNDI"というname属性をResourceアノテーションに指定しています。これで必要なときにDataSourceオブジェクトを生成してくれるようです。doGetメソッド内はDbUtilsの使い方です。SQLを実行するためにQueryRunnerのインスタンスを作ってupdateメソッドを呼び出しています。SQL文中の"?"はプレースホルダーとして働いてくれます。実行時には"?"に0とkusonekoという値が左から順に置き換えられます。ただ、テーブル名は?による置き換えはできないみたいです(ハマった)。返り値で保存できた行数が帰ってくれるので簡単な確認のために出力してます。

MySQL接続はこれでばっちりなんで適当にデータを入れたらselect文による取り出しもしましょう。

テーブルbookに対応するPOJOを作ります。

public class Book {
	private int id;
	private String title;

	public int getId() { return id;	}

	public void setId(int id) { this.id = id; }

	public String getTitle() { return title; }
	
	public void setTitle(String title) { this.title = title;}

	@Override
	public String toString() {
		return id + " : " + getTitle();
	}
}

Servletにselect文を書きます。

protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		
		QueryRunner qr = new QueryRunner(ds);
		try {		
			Book book = qr.query("select * from book where id = ?", new BeanHandler<>(Book.class), 0);
			
			PrintWriter pw = response.getWriter();
			pw.print(book);
			pw.close();
			
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}

QueryRunnerのqueryメソッドを使うことで綺麗に書くことができます。もちろん、自分で柔軟なコードも書けるのでリファレンスとか見てみてください。