Over a million developers have joined DZone.

Spring Web Flow CRUD Tutorial

DZone's Guide to

Spring Web Flow CRUD Tutorial

· Java Zone
Free Resource

Download Microservices for Java Developers: A hands-on introduction to frameworks and containers. Brought to you in partnership with Red Hat.

I'm currently studying Spring Web Flow (SWF). I want to share my experience in creating a simple CRUD Web application.

Technologies used:
  • JPA 1.0
  • Spring Framework 2.5
  • JSF 1.2
  • Facelets 1.1
  • Spring Web Flow 2.0
  • Maven 2 for build tool
  • Any IDE you want (I use Eclipse and IntelliJ for this tutorial)

I know it's overwhelming for a simple project, but don't worry, everything should be easy :-)

You can download the project here. The following are some information about the project.

1. Domain model

The tutorial has a Person class, this is the only model we're dealing with. Since we'll be using JPA, we need to add suitable annotations. Don't forget to implement Serializable, it's required for SWF. Here's the final Person class (package name, imports, getters and setters are removed for brevity):

@Table(uniqueConstraints = {@UniqueConstraint(columnNames = {"first"})})
public class Person implements Serializable {
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

private Integer version;

private PersonName name = new PersonName();

private String email;

private int workExperience;

private Boolean female;

private MaritalStatus status;

As you can see from the code above, the tutorial demonstrates the use of embedded class (PersonName) and enumeration (MaritalStatus).

2. Data access and service
public class PersonServiceImpl implements PersonService {
private EntityManager em;

public void setEntityManager(EntityManager em) {
this.em = em;

@Transactional(readOnly = true)
public List<Person> getList() {
return em.createQuery("select o from Person o").getResultList();

@Transactional(readOnly = true)
public Person get(Long id) {
return em.find(Person.class, id);

public void save(Person person) {

public void remove(Person person) {

public Person prepare(Person person) {
if (person != null) {
return person;
return new Person();

You can see that we're using Spring annotation, and we're combining the DAO (@Repository) and Service (@Service) in one class for the sake of simplicity.

3. web.xml

Here's what you need to add:

<!-- Use JSF view templates saved as *.xhtml, for use with Facelets -->

<!-- Just here so the JSF implementation can initialize, *not* used at runtime -->

<!-- The front controller of this Spring Web application, responsible for handling all application requests -->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</ servlet-class>
4. faces-config.xml

We won't use the JSF lifecycle, but we still need to enable Facelets in faces-config.xml:

<!-- Enables Facelets -->

You can download the file, extract it and browse the contents to get "the feel" on how the application works. Pay attention to the files in /WEB-INF/flows since it's where the "flows" are defined. Take a look inside config.xml to see the Spring wirings.

Assuming you already installed Maven 2, to make war-file, type "mvn". To run the application directly from the project directory using maven-jetty-plugin, type "mvn jetty:run". It might take a while for Maven to download all dependencies.

Feel free to ask questions in the comment box below.

Download Building Reactive Microservices in Java: Asynchronous and Event-Based Application Design. Brought to you in partnership with Red Hat


Opinions expressed by DZone contributors are their own.

{{ parent.title || parent.header.title}}

{{ parent.tldr }}

{{ parent.urlSource.name }}