This tutorial demonstrates maintaining state within the HTTP session.
The example application for this tutorial will show a simple list of postings as follows:
The template for displaying the posts and adding posts is as follows:
<html>
	<body>
		<table border="1">
			<!-- ${posts -->
			<tr>
				<td>${text}</td>
			</tr>
			<!-- $} -->
		</table>
		<form action="#{post}" method="POST">
			<input name="text" type="text" />
			<input type="submit" value="Post" />
		</form>
	</body>
</html>
This is similar HTML as per previous tutorials.
Session objects within WoOF are dependency injected. The following shows the @HttpSessionStateful annotation necessary to identify the dependency as a HTTP session bound object. Note HTTP session objects must also be serializable.
public class TemplateLogic {
	@HttpSessionStateful
	public static class Posts implements Serializable {
		private static final long serialVersionUID = 1L;
		private final List<Post> posts = new ArrayList<Post>();
		public void addPost(Post post) {
			this.posts.add(post);
		}
		public Post[] getPosts() {
			return this.posts.toArray(new Post[this.posts.size()]);
		}
	}
	@Data
	@HttpParameters
	public static class Post implements Serializable {
		private static final long serialVersionUID = 1L;
		private String text;
	}
	/**
	 * Provides values from the HTTP session.
	 * 
	 * @param posts {@link Posts} being the session bound object.
	 * @return {@link Posts} to contain values to render to page.
	 */
	public Posts getTemplateData(Posts posts) {
		return posts;
	}
	/**
	 * Handles the post form submission.
	 * 
	 * @param post  {@link Post} that is dependency injected with HTTP parameters
	 *              loaded onto it.
	 * @param posts {@link Posts} that is dependency injected from the HTTP session.
	 */
	public void post(Post post, Posts posts) {
		posts.addPost(post);
	}
}
WoOF will do the following:
The dependency injection provides compile safe code without requiring to:
WoOF will provide a unique name based on the object's type to bind the object within the HTTP session. This can however be overridden by providing a name to the annotation.
WoOF again allows easy unit testing by it's dependency injection into methods:
	@Test
	public void testTemplateLogic() {
		Posts session = new Posts();
		TemplateLogic logic = new TemplateLogic();
		// Add post to session via template logic
		Post post = new Post();
		post.setText("Test post");
		logic.post(post, session);
		assertSame(post, session.getPosts()[0], "Ensure post added");
		// Ensure post provided from template logic
		assertSame(post, logic.getTemplateData(session).getPosts()[0], "Ensure post available");
	}
The next tutorial looks at rendering generated HTML.