JSF 2 @FlowScoped-Beispiel

Mit JSF 2.2 können Sie mit der JavaServer Faces-Technologie eine Reihe von Seiten mit dem neuen Bereich FlowScoped erstellen. Dieser Bereich ist größer als der Anforderungsbereich und kleiner als der Sitzungsbereich. Der FlowScoped Der Gültigkeitsbereich hängt vom Konzept der Prozedur ab, bei der ein genau definierter Einstiegspunkt und ein Rückgabewert deklariert werden. Der Eintrittspunkt sollte zum Starten des Flusses verwendet werden, während der Rücklauf zum Beenden des Flusses verwendet wird. Dazwischen werden die verwalteten Beans für diesen Bereich definiert. Sobald der Fluss also an seinem Einstiegspunkt eingetreten ist, werden alle verwalteten Beans angezeigt, die als definiert sind FlowScoped für diesen Fluss erstellt haben und sobald der Fluss beendet ist FlowScoped verwaltete Bohnen werden vernichtet.

Mit anderen Worten: Der Flow verfügt über einen Bereich, der es ermöglicht, dass Informationen nur während des Flow-Aufrufs verfügbar sind. Solche Informationen sind außerhalb des Flow-Bereichs nicht verfügbar und verbrauchen keine Ressourcen, sobald der Flow zurückkehrt.

Sie können den Flow mithilfe von drei Konfigurationstypen konfigurieren:

  • Verwendung der faces-config.xml wie in diesem Tutorial vorgestellt.
  • Verwenden Sie die Datei mit demselben Namen wie der Flow, endet jedoch mit .xml.
  • Unter Verwendung einer erstellten und mit @FlowDefinition annotierten Klasse.

Die Verwendung von FlowScoped ist ohne die Verwendung von CDI (Context Dependency Injection) nicht möglich. Um also verwaltete FlowScoped-Beans zu definieren, müssen Sie eine der CDI-Implementierungen einbinden. Zu diesem Zweck haben wir eine JBoss Weld-Implementierung verwendet.

Lesen Sie auch:

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

1. Verwaltete Bohne

RegisterBean.java

package net.javabeat.jsf;

import java.util.ArrayList;
import java.util.List;

import javax.faces.flow.FlowScoped;
import javax.inject.Named;

import net.javabeat.jsf.data.Student;

@Named(value="register")
@FlowScoped(value="register")
public class RegisterBean {
	private int index = 0;
	private String name;
	private String age;
	private String address;

	private String major;
	private String graduateYear;

	private List<Student> students = new ArrayList<Student>();

	public String getName() {
		return name;
	}

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

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}

	public String getMajor() {
		return major;
	}

	public void setMajor(String major) {
		this.major = major;
	}

	public String getGraduateYear() {
		return graduateYear;
	}

	public void setGraduateYear(String graduateYear) {
		this.graduateYear = graduateYear;
	}

	public int getIndex() {
		return index;
	}

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

	public List<Student> getStudents() {
		return students;
	}

	public void setStudents(List<Student> students) {
		this.students = students;
	}

	public String fillBasicInfo (){
		index++;
		return "registera";
	}

	public String fillAcademicInfo(){
		index++;
		return "registerb";
	}

	public String backIntoBasicInfo(){
		index--;
		return "registera";
	}

	public String save(){
		Student student = new Student();
		student.setName(this.name);
		student.setAddress(this.address);
		student.setAge(this.age);
		student.setMajor(this.major);
		student.setGraduateYear(this.graduateYear);
		this.students.add(student);
		this.name = "";
		this.major = "";
		this.graduateYear = "";
		this.address = "";
		this.age = "";
		this.index = 0;
		return "";
	}
}

Student.java

package net.javabeat.jsf.data;

public class Student {
	private String name;
	private String age;
	private String address;

	private String major;
	private String graduateYear;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getAge() {
		return age;
	}
	public void setAge(String age) {
		this.age = age;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getMajor() {
		return major;
	}
	public void setMajor(String major) {
		this.major = major;
	}
	public String getGraduateYear() {
		return graduateYear;
	}
	public void setGraduateYear(String graduateYear) {
		this.graduateYear = graduateYear;
	}
}

2. Faces-Konfigurationsdatei

faces-config.xhtml

<?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>
<flow-definition id="register">
	<flow-return id="endFlow">
		<from-outcome>/index</from-outcome>
	</flow-return>
</flow-definition>
</faces-config>
  • Basierend auf faces-config.xml Sie haben einen Flow namens register
  • Basierend auf dem Namen des Flows muss die Einstiegsseite als Name des Flows (Startknoten) benannt werden.
  • Die Folgenseiten des Flows können einen beliebigen Namen haben
  • Die Rückgabeseite muss sich außerhalb des Flow-Verzeichnisses befinden (siehe index.xhtml). Der Rücklauf dient dazu, den vorgesehenen Vorlauf zu beenden Vor- und Rücklauf Bestimmt das Token, das dazu führt, dass der Fluss beendet und die Ansicht angezeigt wird.
  • Der Flow ruft keinen anderen Flow auf
  • Der Flow übergibt keine Parameter an einen anderen Flow

3. 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 FlowScoped Example</h2>
			<h:commandButton value="Start Flow" action="register"></h:commandButton>
		</h:form>
	</f:view>
</html>

register.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">
	<f:view>
		<h:form>
			<h1>JavaBeat JSF 2.2 Examples</h1>
			<h2>JSF2 FlowScoped Example</h2>
			<br/>
			<br/>
			<h:outputText value="Page # #{register.index}" style="font-size:15px;"/>
			<br/>
			<br/>
			<h:outputText value="JavaBeat Training Center"/>
			<br/>
			<br/>
			<h:outputText value="Start"/>
			#{' '}
			<h:commandButton value="Enter Registration Info" action="#{register.fillBasicInfo}"/>
		</h:form>
	</f:view>
</html>

registera.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">
	<f:view>
		<h:form>
			<h1>JavaBeat JSF 2.2 Examples</h1>
			<h2>JSF2 FlowScoped Example</h2>
			<br/>
			<h:outputText value="Page # #{register.index}" style="font-size:15px;"/>
			<br/>
			<h:outputText value="Basic Information:"/>
			<br/>
			<h:outputText value="Enter Name:"/>#{' '}<h:inputText value="#{register.name}"></h:inputText>
			<br/>
			<h:outputText value="Enter Address:"/>#{' '}<h:inputText value="#{register.address}"></h:inputText>
			<br/>
			<h:outputText value="Enter Age:"/>#{' '}<h:inputText value="#{register.age}"></h:inputText>
			<br/>
			<h:commandButton value="Enter Academic Info" action="registerb"></h:commandButton>
		</h:form>
	</f:view>
</html>

registerb.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">
	<f:view>
		<h:form>
			<h1>JavaBeat JSF 2.2 Examples</h1>
			<h2>JSF2 FlowScoped Example</h2>
			<br/>
			<h:outputText value="Page # #{register.index}" style="font-size:15px;"/>
			<br/>
			<h:outputText value="Academic Information:"/>
			<br/>
			<h:outputText value="Enter Major:"/>#{' '}<h:inputText value="#{register.major}"></h:inputText>
			<br/>
			<h:outputText value="Enter Graduate Year:"/>#{' '}<h:inputText value="#{register.graduateYear}"></h:inputText>
			<br/>
			<h:commandButton value="Back" action="registera"></h:commandButton>
			<h:commandButton value="Save" action="#{register.save}"></h:commandButton>
			<h:commandButton value="New Student" action="register"></h:commandButton>
			<h:commandButton value="End Flow" action="/index"></h:commandButton>
			<br/>
			<h:dataTable value="#{register.students}" var="student" border="1">
				<f:facet name="header">
					<h:outputText value="Registerd Students"></h:outputText>
				</f:facet>
				<h:column>
					<f:facet name="header">
						<h:outputText value="Name"/>
					</f:facet>
					<h:outputText value="#{student.name}"></h:outputText>
				</h:column>
				<h:column>
					<f:facet name="header">
						<h:outputText value="Major"/>
					</f:facet>
					<h:outputText value="#{student.major}"></h:outputText>
				</h:column>
			</h:dataTable>
		</h:form>
	</f:view>
</html>

4. 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>

5. Schweißnahtabhängigkeit

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

6. webapp/META-INF/context.xml

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

7. webapp/WEB-INF/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>

8. Verzeichnisstruktur

JSF 2 FlowScope-Beispiel 1

9. JSF 2 FlowScoped-Demo

  • Die folgenden Schnappschüsse zeigen Ihnen die Verwendung von FlowScoped zur Implementierung eines Registrierungsmoduls. In diesem Modul muss der Administrator einen Flow eingeben, um einen Studenten zu registrieren. In der Zwischenzeit hat der Administrator jedoch die Möglichkeit, den Flow abzubrechen oder den registrierten Studenten zu speichern.
  • „Studenten speichern“ bedeutet, dass sich der Administrator noch im Flow befindet, und er kann auch einen anderen registrieren, aber sobald der Admin den Flow abgebrochen hat, werden alle registrierten Studenten zusammen mit ihren verwalteten Beans, die sie behalten, entfernt.

JSF 2 FlowScope-Beispiel 2

  • Der Benutzer hat den Flow betreten, indem er zu register.xhtml navigiert hat, das den Einstiegspunkt für den definierten Registerflow darstellt.
  • Alle mit dem Flow verknüpften verwalteten Beans werden erstellt.

JSF 2 FlowScope-Beispiel 3

  • Der Benutzer hat zum ersten Knoten des Flows navigiert.
  • Durch die Eingabe der akademischen Informationen gelangt der Benutzer zum zweiten Knoten.

JSF 2 FlowScope-Beispiel 3

  • Wenn der Benutzer das aktiviert hat Zurücksollte der vorherige Knoten des Flusses angezeigt werden.
  • Wenn der Benutzer das aktiviert hat Speichernwird der Student gespeichert und der aktuelle Knoten des Flows bleibt erhalten.
  • Wenn der Benutzer das aktiviert hat Fluss beenden, wird der Fluss beendet und die zugehörigen Beans werden zerstört. Die Indexansicht wurde angezeigt.
  • Wenn der Benutzer das aktiviert hat Neuer Student, wird derselbe Fluss fortgesetzt und es bleibt für die Speicherung der Daten übrig. Die Registeransicht wurde angezeigt.

JSF 2 FlowScope-Beispiel 4

  • Ergebnis von Speichern Aktivierung.

JSF 2 FlowScope-Beispiel 5

  • Die Rückansicht, die angezeigt werden soll, sobald die Fließen ist zurückgekehrt (beendet).
  • Durch die Rückkehr von der Fließenwerden alle diese zugehörigen verwalteten Beans zerstört.
  • Wenn der Benutzer erneut in den Flow eingetreten ist, werden die zugehörigen verwalteten Beans erneut initialisiert, um die Benutzeranforderung zu bedienen.

(wpdm_file id=50)

Kommentar verfassen

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

Nach oben scrollen