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.