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.