一人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できる環境を作ります。