ConversationScopedについて

` @ConversationScoped `はブラウザとサーバー間で何往復かする間だけオブジェクト（バッキングビーン）が存続します
そのため、開始と終了をプログラマが指定する必要があります  
今回は簡単に会話スコープを試せるサンプルを紹介します

##サンプルの画面遷移

![画面関係図.png](https://qiita-image-store.s3.amazonaws.com/0/136533/549a74c1-7029-0666-a1fa-884a88aeae3a.png "画面関係図.png")

「start」ボタンを押した時、会話スコープが開始します
商品選択、顧客情報入力画面で注文情報を入力し、注文確認画面で確認します
「購入」ボタンを押すと会話処理を終了してトップページへ戻ります

##会話処理の開始と終了

バッキングビーンのソースコード

```
import java.io.Serializable;

import javax.enterprise.context.Conversation;
import javax.enterprise.context.ConversationScoped;
import javax.inject.Inject;
import javax.inject.Named;

@SuppressWarnings("serial")
@Named
@ConversationScoped
public class SampleConversation implements Serializable {
	//商品名
	private String product;
	//数量
	private Integer quantity;
	//氏名
	private String name;
	//住所
	private String address;

	@Inject
	Conversation conv;
	
	public String toProduct() {
		if (conv.isTransient()) {
			conv.begin();
		}
		return "product.xhtml";
	}
	
	public String toClient() {
		return "client.xhtml";
	}
	
	public String toConfirmation() {
		return "confirmation.xhtml";
	}
	
	public String toTop() {
		conv.end();
		return "top.xhtml";
	}
	
	//Getter と Setter (省略)	
}

```

会話スコープでは、クラスに`@ConversationScoped`アノテーションをつけます
会話スコープは会話スコープマネージャーを使って、プログラムの開始と終了を行います
CDIサービスから会話スコープマネージャーをインジェクトで取得します

```
   @Inject
   Conversation conv;
```
トップページで「start」ボタンが押されるとtoProduct()メソッドを実行し、会話スコープが開始されます

```
   if (conv.isTransient()) {
       conv.begin();
   }
   return "product.xhtml";
```
conv.isTransient()ですでに会話スコープが始まっていないことを確かめてからスタートします
注文確認画面までは会話スコープの中なので、入力したデータは継続して使用できます
前の画面に戻ってもデータが保持されていることを確認してください
そして注文確認画面の「購入」ボタンを押すと、会話スコープが終了します

```
   conv.end();
   return "top.xhtml";
```

endメソッドは会話スコープを終了します
それによりトップページへ遷移するとバッキングビーンは廃棄されます

##JSFページの内容

top.xhtml

```
<?xml version='1.0' encoding='UTF-8' ?>
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:jsf="http://xmlns.jcp.org/jsf"
	xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
	<title>会話スコープ</title>
</h:head>
<h:body>
	<h1>TOP</h1>
	<h:form>
		<h:commandButton action="#{sampleConversation.toProduct()}" value="start" />
	</h:form>
</h:body>
</html>
```

product.xhtml

```
<?xml version='1.0' encoding='UTF-8' ?>
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:jsf="http://xmlns.jcp.org/jsf"
	xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
	<title>会話スコープ</title>
</h:head>
<h:body>
	<h1>商品選択</h1>
	<h:form>
		<h:panelGrid columns="2">
			商品名<h:inputText value="#{sampleConversation.product}" />
			数　量<h:inputText value="#{sampleConversation.quantity}" />
			<h:commandButton action="#{sampleConversation.toTop()}" value="キャンセル" />
			<h:commandButton action="#{sampleConversation.toClient()}" value="顧客情報入力へ" />
		</h:panelGrid>
	</h:form>
</h:body>
</html>
```

client.xhtml

```
<?xml version='1.0' encoding='UTF-8' ?>
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:jsf="http://xmlns.jcp.org/jsf"
	xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
	<title>会話スコープ</title>
</h:head>
<h:body>
	<h1>顧客情報入力</h1>
	<h:form>
		<h:panelGrid columns="2">
			お名前<h:inputText value="#{sampleConversation.name}" />
			ご住所<h:inputText value="#{sampleConversation.address}" />
			<h:commandButton action="#{sampleConversation.toProduct()}" value="戻る" />
			<h:commandButton action="#{sampleConversation.toConfirmation()}" value="注文確認へ" />
		</h:panelGrid>
	</h:form>
</h:body>
</html>
```

confirmation.xhtml

```
<?xml version='1.0' encoding='UTF-8' ?>
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:jsf="http://xmlns.jcp.org/jsf"
	xmlns:h="http://xmlns.jcp.org/jsf/html">
<h:head>
	<title>会話スコープ</title>
</h:head>
<h:body>
	<h1>注文確認</h1>
	<h:form>
		<h:panelGrid columns="2">
			商品名<h:outputText value="#{sampleConversation.product}" />
			数　量<h:outputText value="#{sampleConversation.quantity}" />
			お名前<h:outputText value="#{sampleConversation.name}" />
			ご住所<h:outputText value="#{sampleConversation.address}" />
			<h:commandButton action="#{sampleConversation.toClient()}" value="戻る" />
			<h:commandButton action="#{sampleConversation.toTop()}" value="購入" />
		</h:panelGrid>
	</h:form>
</h:body>
</html>
```