hatenob

プログラムって分からないことだらけ

一人Web開発~第10夜 JSF

画面はJSFで書きます。JavaEE7のJSF2.2では、よりHTMLに近い書き方ができるようになったとか。HTML5との親和性とかそういったことなんでしょうかねぇ。

画面

先に画面を作ります。単純に、名前とパスワードを入力してそれを登録し、登録完了したら完了画面に飛ぶというただそれだけの画面です。

<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:jsf="http://xmlns.jcp.org/jsf">
<head jsf:id="head">
<title>Customer - register</title>
</head>
<body jsf:id="body">
	<h1>Customer - register</h1>
	<form jsf:id="cust_reg_form" method="post">
		<input type="text" jsf:value="#{customerController.name}" />
		<input type="password" jsf:value="#{customerController.password}" />
		<input type="submit" value="register"
			jsf:action="#{customerController.register()}" />
	</form>
</body>
</html>

JSF2.2の特徴は、これまでのカスタムタグとは違い、通常のHTMLタグの属性をJSFのカスタム属性に変えている点ですね。

コントローラ

なんとなくActionと呼んでしまいそうですが、とりあえずMVCでいうところのコントローラクラスを作ります。単純に、前回作ったEJBを呼ぶだけです。

import javax.enterprise.inject.Model;
import javax.inject.Inject;

import org.oneman.service.CustomerService;
import org.slf4j.Logger;

@Model
public class CustomerController {
	private String name;
	private String password;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	@Inject
	private Logger log;

	@Inject
	private CustomerService service;

	public String register() {
		service.register(name, password);
		
		return "/pages/customer/result.xhtml?faces-redirect=true";
	}
}

登録したらリダイレクトで成功ページへ遷移してます。見ての通り、エラーハンドリングは皆無です。成功しても失敗しても成功ページに飛ぶといういい加減さですが、中身は気にしないという鉄の意志でもってスルーしたいと思います。

テスト

ここもUnit TestはjMockitを使ってテストすることにします。

import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
import mockit.Deencapsulation;
import mockit.Delegate;
import mockit.Expectations;
import mockit.Mocked;

import org.junit.Test;
import org.oneman.service.CustomerService;

public class CustomerControllerTest {
	@Mocked
	private CustomerService service;

	private CustomerController controller = new CustomerController();

	@Test
	public void register_success() {
		controller.setName("test");
		controller.setPassword("pass");

		Deencapsulation.setField(controller, service);

		new Expectations() {
			{
				service.register(anyString, anyString);
				result = new Delegate<Void>() {
					@SuppressWarnings("unused")
					void register(String name, String pass) {
						assertThat(name, is("test"));
						assertThat(pass, is("pass"));
					}
				};

			}
		};

		String forward = controller.register();
		
		assertThat(forward, is("/pages/customer/result.xhtml?faces-redirect=true"));
	}

}

これでひとまず動くものが作れました。

デプロイ

ビルドしたものをWildflyにデプロイすると実行できます。
pom.xmlとかweb.xmlとかはGithubを参照ください。
nobrooklyn/oneman · GitHub

次はここまでの成果物をJenkinsでCIできる環境を作ります。