JSF 2 @ConversationScoped-Beispiel

JavaServer Faces wird mit verschiedenen Arten von Bereichen geliefert; Bereiche, die bereits zum Definieren verwendet wurden Verwaltete Bohnen. Die meisten JSF-Entwickler waren mit Bereichen wie vertraut Anfrage, Ansicht, Sitzung und Anwendungaber neu hinzugefügte Bereiche wie z Konversation, Ansicht, Benutzerdefiniert und neu für JSF 2.2 Flow Ich habe im Internet und insbesondere in den JSF-Blogs aus einem bestimmten Grund nicht für eine breite Diskussion gesorgt; es wird selten verwendet.

Der Konversationsbereich erstreckt sich über eine Reihe verwandter Seiten, sodass die Daten bestehen bleiben, bis ein bestimmtes Ziel erreicht wurde, ohne dass der Sitzungsbereich verwendet werden muss. Das heißt, eine einzelne Sitzung kann mehrere Konversationen auf verschiedenen Seiten umfassen.

Lesen Sie auch:

  • JSF 2-Tutorials
  • JSF-Tutorials
  • Einführung in JSF

Für die Verwendung des Konversationsbereichs müssen Sie die folgenden Schritte ausführen:

  • Benutze einen Kontexte und Abhängigkeitsinjektion für Java EE (CDI) Bean, da diese Funktion CDI-basiert und nicht auf JSF basiert.
  • Benutzen Sie die @ConversationScoped Anmerkung.
  • Instanzvariable hinzufügen privates @Inject Conversation-Gespräch. Diese Instanzvariable wird automatisch mit a initialisiert Conversation-Objekt, wenn die Bean erstellt wird.
  • Ruf den Konversation.begin() um den Umfang der Bean vom Anforderungsbereich bis zum Konversationsbereich auszuwerten.
  • Ruf den Konversation.end() um die Bean aus dem Konversationsbereich zu entfernen.

In diesem Tutorial wird die in Tomcat 7 integrierte CDI-Implementierung von JBoss verwendet, um die Verbindung zwischen JSF und CDI-Kontext zu erreichen.

1. Verwaltete Bohne

IndexBean.java

package net.javabeat.jsf;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

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

@Named(value="indexBean")
@ConversationScoped
public class IndexBean implements Serializable{

	private static final long serialVersionUID = 1L;
	private int index = 1;
	private String answer;
	private String question;
	private Map<String,String> questions = new HashMap<String,String>();
	private Map<String,String> answers = new HashMap<String,String>();
	private @Inject Conversation conversation;
	private boolean transientVal = true;

	public IndexBean(){
		this.questions.put("1", "What's the most tutorial that you loved on the JavaBeat site ?");
		this.questions.put("2", "What's the most example that you loved on the JavaBeat site ?");
		this.question = this.questions.get("1");
	}

	public int getIndex() {
		return index;
	}

	public void setIndex(int index) {
		this.index = index;
	}

	public String getAnswer() {
		return answer;
	}

	public void setAnswer(String answer) {
		if(this.index == 1){
			this.answers.put(String.valueOf(index), this.answer);
			this.question = questions.get(String.valueOf(index));
			this.answer = "";
		}
		else if(this.index == 2){
			this.answers.put(String.valueOf(index), this.answer);
			this.question = questions.get(String.valueOf(index));
			this.answer = "";
		}
		this.answer = answer;
	}

	public String getQuestion() {
		return question;
	}

	public void setQuestion(String question) {
		this.question = question;
	}

	public Map<String, String> getQuestions() {
		return questions;
	}

	public void setQuestions(Map<String, String> questions) {
		this.questions = questions;
	}

	public Map<String, String> getAnswers() {
		return answers;
	}

	public void setAnswers(Map<String, String> answers) {
		this.answers = answers;
	}

	public Conversation getConversation() {
		return conversation;
	}

	public void setConversation(Conversation conversation) {
		this.conversation = conversation;
	}

	public boolean isTransientVal() {
		return transientVal;
	}

	public void setTransientVal(boolean transientVal) {
		this.transientVal = transientVal;
	}

	public String next(){
		if(index != 2){
			index++;
			return null;
		}
		else{
			this.conversation.end();
			this.transientVal = this.conversation.isTransient();
			this.question = "Thanks For Your Time";
			return "";
		}

	}

	public String stopQuestionare(){
		this.question = "Thanks For Your Time";
		this.conversation.end();
		this.transientVal = this.conversation.isTransient();
		return "questionare";
	}

	public String startQuestionare(){
		this.conversation.begin();
		this.transientVal = this.conversation.isTransient();
		return "questionare";
	}
}

2. Die Ansichten

index.xhtml

<!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:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core">
	<f:view>
		<h:form>
			<h1>JavaBeat JSF 2.2 Examples</h1>
			<h2>JSF2 ConversationScoped Example</h2>
			<h:commandButton value="Start New Questionare"
					action="#{indexBean.startQuestionare}"
						disabled="#{!indexBean.transientVal}"/>
		</h:form>
	</f:view>
</html>

questionsare.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:f="http://java.sun.com/jsf/core">
<h:head>
	<h:outputScript library="javax.faces" name="jsf.js"/>
</h:head>
<h:body>
	<f:view afterPhase="#{indexBean.phaseListener}">
		<h1>JavaBeat JSF 2.2 Examples</h1>
		<h2>JSF2 ConversationScoped Example</h2>
		<h:form prependId="false">
			<h:outputText value="JavaBeat Questionare"/>
			<br/>
			<br/>
			<h:outputText value="Please Answer Questions Below:"
					rendered="#{indexBean.transientVal == false}"/>
			<br/>
			<br/>
			<h:outputText value="Question #"
					rendered="#{indexBean.transientVal == false}"/>
			#{' '}
			<h:outputText value="#{indexBean.index}"
					rendered="#{indexBean.transientVal == false}"/>
			<br/>
			<br/>
			<h:outputText value="#{indexBean.question}"/>
			<br/>
			<br/>
			<h:inputText value="#{indexBean.answer}"/>
			<h:commandButton value="Next Question" action="#{indexBean.next}"
				disabled="#{indexBean.transientVal}"/>
			<h:commandButton value="End Questionare"
				action="#{indexBean.stopQuestionare}"
					disabled="#{indexBean.transientVal}"/>
			<h:commandButton value="Start New Questionare"
				action="#{indexBean.startQuestionare}"
				disabled="#{indexBean.transientVal == false}"/>
		</h:form>
	</f:view>
</h:body>
</html>

3. Faces-Konfigurationsdatei

faces-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<faces-config xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"
	version="2.2">
<application>
	<resource-bundle>
		<base-name>net.javabeat.jsf.application</base-name>
		<var>msg</var>
	</resource-bundle>
</application>
</faces-config>

4. webapp/META-INF/context.xml

context.xml

<Context>
   <Resource name="BeanManager"
      auth="Container"
      type="javax.enterprise.inject.spi.BeanManager"
      factory="org.jboss.weld.resources.ManagerObjectFactory"/>
</Context>

5. webapp/WEB-INF/beans.xml

Beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="
      http://java.sun.com/xml/ns/javaee
      http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"></beans>
  • Sogar die Beans.xml ist leer, aber sie ist für die Initialisierung des CDI-Kontexts zwingend erforderlich

6. Abhängigkeit für die Schweißimplementierung

Abhängigkeit zu pom.xml hinzufügen

<dependency>
 <groupId>org.jboss.weld.servlet</groupId>
 <artifactId>weld-servlet</artifactId>
 <version>1.1.18.Final</version>
</dependency>

7. Die Verzeichnisstruktur

JSF 2-Konversationsumfang Beispiel 1

8. Der Bereitstellungsdeskriptor

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
	id="WebApp_ID" version="2.5" metadata-complete="true">
	<context-param>
		<description>State saving method: 'client' or 'server'
						(=default). See JSF Specification 2.5.2
		</description>
		<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
		<param-value>server</param-value>
	</context-param>
	<context-param>
		<param-name>javax.faces.application.CONFIG_FILES</param-name>
		<param-value>/WEB-INF/faces-config.xml</param-value>
	</context-param>
	<servlet>
		<servlet-name>Faces Servlet</servlet-name>
		<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>/faces/*</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>Faces Servlet</servlet-name>
		<url-pattern>*.xhtml</url-pattern>
	</servlet-mapping>
	<listener>
		<listener-class>org.jboss.weld.environment.servlet.Listener</listener-class>
	</listener>
	<listener>
		<listener-class>com.sun.faces.config.ConfigureListener</listener-class>
	</listener>
	<resource-env-ref>
	   <resource-env-ref-name>BeanManager</resource-env-ref-name>
	   <resource-env-ref-type>
	      javax.enterprise.inject.spi.BeanManager
	   </resource-env-ref-type>
	</resource-env-ref>
</web-app>
  • Beachten Sie das Hinzufügen des Schweiß-Listeners Vor die Gesichter Zuhörer (Diese Vereinbarung ist obligatorisch)

9. JSF 2 ConversationScoped-Demo

Die folgenden Schnappschüsse zeigen Ihnen das vollständige Szenario von Questionare für eine JavaBeat-Site, in der der Benutzer den Questionare durch Klicken auf gestartet hat Neue Frage starten das auf der gezeigt index.xhtml Sicht. Sobald der Fragebogen gestartet wurde, wurde der Konversationsbereich für die Speicherung der erforderlichen Daten initialisiert. Der Benutzer hat die Möglichkeit, die Frage jederzeit zu beenden oder die Frage bis zum Ende zu beenden. Entweder hat der Benutzer auf geklickt Stoppen Sie die Frage oder beenden, wird der Konversationsumfang beendet und die verwalteten Beans werden zerstört.

Beispiel 2 für den JSF 2-Konversationsumfang

  • Das Starten der Frage bedeutet, dass der Konversationsumfang begonnen hat (Konversationsumfang ist lang andauernd).

Beispiel 3 für den JSF 2-Konversationsumfang

  • Der Fragebogen wurde gestartet und die Fragen konnten durch navigiert werden Nächste Frage.
  • End questionsare beendet den Konversationsbereich, sodass alle Beans, die sich in diesem Bereich befinden, irgendwann zerstört werden.
  • Beachten Sie die Art und Weise, wie die Neue Frage starten wurde deaktiviert (Verwenden von conversation.isTransient).

Beispiel 4 für den JSF 2-Konversationsumfang

  • Die zweite Frage wurde mithilfe des angezeigt Nächste Frage.
  • Wenn Sie die Frage beendet haben, sollte die Dankesnachricht anstelle der Frage angezeigt werden.
  • Sobald die Frage beendet ist, wird die Frage beantwortet Neue Frage starten Wurde aktiviert.

JSF 2-Konversationsumfang Beispiel 5

  • Sie haben die Möglichkeit, diese Stufe zu erreichen, indem Sie durch die gesamten Fragen navigieren oder End Questionare verwenden.
  • „Neue Frage starten“ wurde aktiviert. Sobald der Benutzer sie aktiviert hat, wurde eine neue Konversation begonnen.

(wpdm_file id=49)

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen