JSP標准標簽庫(JSTL)是一個JSP標簽集合,它封裝了JSP應用的通用核心功能。
JSTL支持通用的、結構化的任務,比如迭代,條件判斷,XML文檔操作,國際化標簽,SQL標簽。 除了這些,它還提供了一個框架來使用集成JSTL的自定義標簽。
這里說一下核心標簽的使用
核心標簽:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
上述代碼復制在新建的jsp文件頂部(只要放在上面,哪都行).如果沒有tomcat的servlet包的話是不能用jsp的,建議看Javaweb章節。
重點來說一下<c:foreach> 配合<c:if test="">的使用。
對jsp有了解的都知道從各個scope中取出一些值,回顯到頁面上。存儲的值可以是對象,list,string等類型。通過復雜類型在這里作簡要的介紹:
首先將一個CompleteForumPage對象存到springmvc的model中,相當於Javaweb中普通的request域,struts的servletContext域。作用范圍都是一次請求redirect后內容消失,不同的是springmvc的model域的值可以改變,此處不擴展。
來看一下CompleteForumPage
1 public class CompleteForumPage implements Serializable{ 2
3 /** 4 * 5 */
6 private static final long serialVersionUID = 1L; 7 private Forum forum; 8 private Integer currentPage; 9 private Integer pageSize; 10 private Integer totalCount; 11 private Integer totalPage; 12 private List<Comment>comments; 13 //省略get set construct方法 實際中是一定要的
14
15 }
容易看出CompleteForumPage對象中除了有簡單JavaInteger類型還有List<object>類型還有一個Forum類型
1 public class Forum implements Serializable{ 2
3 /** 4 * 5 */
6 private static final long serialVersionUID = 1L; 7 //主鍵生成 用uuid
8 private String forum_id; 9 private String forum_title; 10 private String forum_header; 11 private String forum_description; 12 private Date create_time; 13 private Institution institution; 14 private User author 15 };
以上是Forum對象 然后里面還有User類和Institution類。。就不展開了,這大概也是關系型數據庫的優點和缺點吧。
關於CompleteForumPage中List<Comment>的Comment對象
1 public class Comment implements Serializable{ 2
3
4 /** 5 * 6 */
7 private static final long serialVersionUID = 1L; 8 //數據庫中是varchar 主鍵生成用uuid 吧
9 private String comment_id; 10 private String comment_details; 11 private Forum forum; 12 private User responser; 13 private Date create_time; 14 }
將CompleteForumPage存入model中然后放在jsp頁面中回顯。首先注意到有個Comment的List。通過
model.addAttribute("pageBean", forumCommentPage);
將一個forumCommentPage對象存在model中
再在jsp中取出回顯
<c:forEach items="${pageBean.comments }" var="comment" varStatus="s" >
${comment.responser.username }
</c:forEach>
類似於上面的這種操作可以將數據取出 取出時回顯到頁面的就是html數據 ,你對其作屬性類型對應的操作如:Integer的pageSize 你可以做++ 和-- 前提是在jsp的翻譯標簽內。之外就變成html的字符了。解釋下上述:
items:期望在foreach中遍歷的對象可以是map set list 操作時一樣的。這里我存了是List<Comment>對象,參照上述實體代碼理解。 var表示每一個for 循環的對象類似Java中
for(Comment comment : comments){ }
varStatus這里看不出有什么作用,我們可以通過${s.index}查看遍歷到第幾個list中的對象了 重點:${ }一定要用這個c標簽的符號包起來
在<c:foreach></c:foreach>內部可以取出你遍歷的對象的屬性。由於我List中的object是Comment 對應的Comment有 String類型 Forum類型 和User類型
上面我取出的是 User類型 重點:我使用的是responser 而不是User 這是因為你只能你var的是Comment 而User只是Comment的一個屬性,c標簽正是取出屬性。接着我又取出了User 的username屬性。
但是我這樣做是有點問題的,這會在后台消耗大量的資源來連接查詢對應的對象。看起來問題不大,但是在高並發的情況下大批量的sql查詢語句幾乎能讓你的服務器掛掉。這也算是關系型數據庫的一個不好的地方。
其他如Comment 的comment_id可用${comment.comment_id} .如需其他的請參照前述代碼,不做贅述。
再就是取CompleteForumPage的屬性。我們在model域中存儲的名字叫pageBean 所以 CompleteForumPage對象的名字即是pageBean,如想取出其屬性可直接${pageBean.currentPage}這樣。很簡單。
核心標簽庫中還有一個<c:if>也很重要 很常用 如
1 <c:if test="${ss==pageBean.totalPage&&pageBean.currentPage<pageBean.totalPage }">
完整的是這樣的
1 <c:forEach begin="1" end="${pageBean.totalPage }" var="ss" >
2 <c:if test="${ss==1&&pageBean.currentPage>1 }">
3 <li><a href="#">Previous</a></li>
4 </c:if>
5
6 <li class="active"><a href="#">${ss } </a></li>
7 <c:if test="${ss==pageBean.totalPage&&pageBean.currentPage<pageBean.totalPage }">
8 <li><a href="#">Next</a></li>
9 </c:if>e'l
10 </c:forEach>
這個foreach有點不同 ,這個類似於我們用的for(;;;)就是從1到end值 然后ss會記錄每次循環的index,ss從你設置的begin開始初始值也就是你的begin。可以靈活使用。上述代碼是我做的一個分頁判斷 第一頁不顯示Previous最后一頁不顯示next。
其中這個是個判斷語句類似if但是它沒有else所以使用起來有點麻煩 需要判斷== 和!=才能做到if else 的效果
<c:if test="${ss==pageBean.totalPage&&pageBean.currentPage<pageBean.totalPage }">
<li><a href="#">Next</a></li>
</c:if>