2014-10-04 71 views
0

我有我的控制器Servlet創建一個對象並將其放入HashMap中,並將其作爲屬性轉發給我的JSP,在我的JSP中我希望將此HashMap設置爲變量,我怎麼能做到這一點?爲JSP中的變量分配HashMap

見下面的代碼:

ControllerServlet中

Map<Integer, Post> posts = new HashMap<Integer, Post>(); 

// Needs refactoring to a DB query 
Post p = new Post(); 
p.setId(1); 
p.setTitle("Hello World!"); 
p.setBody("This is my first blog post!"); 
p.setAuthor("Jacob Clark"); 
p.setPublished(new Date()); 

posts.put(p.getId(), p); 

getServletContext().setAttribute("posts", posts); 

RequestDispatcher rd = getServletContext().getRequestDispatcher("/WEB-INF/index.jsp"); 
rd.forward(request, response); 

JSP

getServletContext().getAttribute("posts") 
+0

爲什麼你把它放到HashMap而不是ArrayList(然後索引會是你的鍵在數組中)?而且你確定要使用servletContext(它會被許多請求共享),而不是請求? – Gas 2014-10-04 15:09:07

回答

1

請不要使用ServletContext的一個servlet和JSP頁面之間的溝通!您最好使用該請求的請求屬性,ServletContext屬性對所有servlet和所有會話都是通用的。

在你的控制器使用:

request.setAttribute("posts", posts); 

RequestDispatcher rd = getServletContext().getRequestDispatcher("/WEB-INF/index.jsp"); 
rd.forward(request, response); 

然後在JSP:

<jsp:useBean name="posts" scope="request" class="java.util.Map"/> 
${posts["1"].title} 

您可以<c:foreach> JSTL標記在地圖上迭代,但我除非地圖中是LinkedHashMapTreeMap迭代次序是未指定的。例如:

<table><tr><th>Title</th><th>Author</th><tr> 
<c:forEach var="entry" items="${posts}"> 
    <!-- Key is ${entry.key} Value is ${entry.value} --> 
    <tr><td>${entry.value.title}</td><td>${entry.value.author}</td></tr> 
</c:forEach> 
</table>