JSTL does not know of the Java variables you set, therefore in the following code the variable 'posts' cannot be used as is:
<% ArrayList<PostBean> posts = new ArrayList<PostBean>(Posts.getPosts()); %>
<% //System.out.println(posts); %>
<c:forEach var="post" items="${posts}">
<h2>${post.title}</h2>
<p>${post.text}</p>
</c:forEach>
In this case c:forEach tries to find a variable called 'posts' in the session. So, if you had used
session.setAttribute("posts",posts")
right after the variable definition, it would work.
However, none of the above is necessary.
JSTL already has access to Post.getPosts, because of the "jsp:useBean" you have declared earlier.
So, this should do the trick:
<c:forEach var="post" items="${Posts.posts}">
Note that in JSTL the dot notation accounts for the getter of the specified property, so ${Posts.posts} is equal to "Posts.getPosts()".