第一步:webroot/web-inf下的str.tld文件css
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> 3 <taglib> <!-- 自定義庫標籤的根 --> 4 <tlibversion>1.2</tlibversion> <!-- 版本號 --> 5 <jspversion>1.1</jspversion> <!-- JSP版本號 --> 6 <shortname>stu</shortname> <!-- prefix="stu"標籤名稱--> 7 <uri>StudentTags</uri> <!-- uri="StudentTags" 外界導入標籤時,認識的名字,很重要。--> 8 9 <tag> 10 <name>selectAll</name> <!-- 標籤名稱 --> 11 <tagclass>com.bjsxt.sxf.tag.SeclectAllSt</tagclass> <!-- 對應的java類的全路徑 --> 12 </tag> 13 14 <!-- 有屬性的標籤,能夠有多個屬性 <attribute>並列 --> 15 <tag> 16 <name>selectBySex</name> <!-- 標籤名稱 --> 17 <tagclass>com.bjsxt.sxf.tag.SeclectStBySex</tagclass> 18 <attribute> <!-- 對應標籤的屬性。 --> 19 <name>sex</name> 20 <required>true</required> <!-- 是必需寫的屬性,即沒有寫屬性標籤不能被正常使用 --> 21 </attribute> 22 </tag> 23 <!-- 按班級學生id查詢出班級集合,存放到屬性var指定的變量中,而後利用s標籤的迭代標籤,將var指定的變量存放的學生集合遍歷出來 --> 24 <tag> 25 <name>selectByClassId</name> <!-- 標籤名稱 --> 26 <tagclass>com.bjsxt.sxf.tag.MyTag</tagclass> <!-- 對應的java類的全路徑 --> 27 <body-content>JSP</body-content><!-- 若是不須要標籤體則設置empty,反之設定jsp,內部能夠運行jsp全部的語法 --> 28 <attribute> 29 <name>classId</name><!--指定屬性名 和標籤java類一致--> 30 <required>true</required><!--該屬性是不是必須,若是非必須沒設置則爲空。 --> 31 <rtexprvalue>true</rtexprvalue><!-- 該屬性能不能動態使用表達式爲該屬性賦值 true能夠 false不能夠 使用腳本和EL表達式來獲取動態的值 --> 32 </attribute> 33 <attribute> 34 <name>var</name> 35 <required>true</required> 36 <rtexprvalue>false</rtexprvalue> 37 </attribute> 38 <attribute> 39 <name>num</name> 40 <required>false</required> 41 <rtexprvalue>false</rtexprvalue> 42 </attribute> 43 </tag> 44 <!-- 自定義的myif標籤 --> 45 <tag> 46 <name>myif</name> 47 <tagclass>com.bjsxt.sxf.tag.MyIfTag</tagclass> 48 <bodycontent>JSP</bodycontent> 49 <attribute> 50 <name>flag</name> 51 <required>true</required> 52 <rtexprvalue>true</rtexprvalue> 53 </attribute> 54 <attribute> 55 <name>condition</name> 56 <required>true</required> 57 <rtexprvalue>true</rtexprvalue> 58 </attribute> 59 </tag> 60 <!-- 自定義的myelseif標籤 --> 61 <tag> 62 <name>myelseif</name> 63 <tagclass>com.bjsxt.sxf.tag.MyElseIfTag</tagclass> 64 <bodycontent>JSP</bodycontent> 65 <attribute> 66 <name>flag</name> 67 <required>true</required> 68 <rtexprvalue>true</rtexprvalue> 69 </attribute> 70 <attribute> 71 <name>condition</name> 72 <required>true</required> 73 <rtexprvalue>true</rtexprvalue> 74 </attribute> 75 </tag> 76 <!-- 自定義的myelse標籤 --> 77 <tag> 78 <name>myelse</name> 79 <tagclass>com.bjsxt.sxf.tag.MyElseTag</tagclass> 80 <bodycontent>JSP</bodycontent> 81 </tag> 82 <!-- 自定義的分頁標籤 --> 83 <tag> 84 <name>page</name> 85 <tagclass>com.bjsxt.sxf.tag.PageTag</tagclass> 86 <body-content>empty</body-content><!-- 若是不須要標籤體則設置empty,反之設定jsp,內部能夠運行jsp全部的語法 --> 87 <attribute> 88 <name>pageNo</name><!--當前頁碼數--> 89 <required>false</required><!--該屬性是不是必須,若是非必須沒設置則爲空。 --> 90 <rtexprvalue>true</rtexprvalue><!-- 該屬性能不能動態使用表達式爲該屬性賦值 true能夠 false不能夠 使用腳本和EL表達式來獲取動態的值 --> 91 <type>int</type> 92 </attribute> 93 <attribute> 94 <name>pageSize</name><!--當前頁碼數--> 95 <required>false</required><!--該屬性是不是必須,若是非必須沒設置則爲空。 --> 96 <rtexprvalue>true</rtexprvalue><!-- 該屬性能不能動態使用表達式爲該屬性賦值 true能夠 false不能夠 使用腳本和EL表達式來獲取動態的值 --> 97 <type>int</type> 98 </attribute> 99 <attribute> 100 <name>rowCount</name><!--當前頁碼數--> 101 <required>false</required><!--該屬性是不是必須,若是非必須沒設置則爲空。 --> 102 <rtexprvalue>true</rtexprvalue><!-- 該屬性能不能動態使用表達式爲該屬性賦值 true能夠 false不能夠 使用腳本和EL表達式來獲取動態的值 --> 103 <type>int</type> 104 </attribute> 105 </tag> 106 107 108 </taglib>
第二步:pageTag.java標籤類和PageComponent.java標籤邏輯類html
1 package com.bjsxt.sxf.tag; 2 3 import javax.servlet.http.HttpServletRequest; 4 import javax.servlet.http.HttpServletResponse; 5 6 import org.apache.struts2.components.Component; 7 import org.apache.struts2.views.jsp.ComponentTagSupport; 8 9 import com.bjsxt.sxf.tag.compant.PageComponent; 10 import com.opensymphony.xwork2.util.ValueStack; 11 /** 12 * 自定義分頁標籤的標籤類 13 * @ClassName: PageTag 14 * @Description: TODO(這裏用一句話描述這個類的做用) 15 * @author 尚曉飛 16 * @date 2014-10-23 下午4:39:01 17 * 18 */ 19 public class PageTag extends ComponentTagSupport{ 20 21 //標籤中屬性,往這傳值(本示例沒有用屬性傳值,而是在標籤邏輯類中經過獲取值棧,獲取分頁標籤所需的對象和請求地址) 22 private Integer pageNo;//當前頁 23 private Integer pageSize;//每頁顯示記錄數 24 private Integer rowCount;//總記錄數 25 26 @Override 27 public Component getBean(ValueStack arg0, HttpServletRequest arg1, 28 HttpServletResponse arg2) { 29 30 return new PageComponent(arg0, arg1, arg2); 31 } 32 33 @Override 34 protected void populateParams() { 35 super.populateParams(); 36 PageComponent pageComponent=(PageComponent) getComponent(); 37 pageComponent.setPageNo(pageNo); 38 pageComponent.setPageSize(pageSize); 39 pageComponent.setRowCount(rowCount); 40 41 } 42 43 public Integer getPageNo() { 44 return pageNo; 45 } 46 47 public void setPageNo(Integer pageNo) { 48 this.pageNo = pageNo; 49 } 50 51 public Integer getPageSize() { 52 return pageSize; 53 } 54 55 public void setPageSize(Integer pageSize) { 56 this.pageSize = pageSize; 57 } 58 59 60 public Integer getRowCount() { 61 return rowCount; 62 } 63 64 public void setRowCount(Integer rowCount) { 65 this.rowCount = rowCount; 66 } 67 68 69 70 71 } 72 73 74 package com.bjsxt.sxf.tag.compant; 75 76 import java.io.IOException; 77 import java.io.Writer; 78 import java.util.List; 79 import java.util.Map; 80 81 import javax.servlet.http.HttpServletRequest; 82 import javax.servlet.http.HttpServletResponse; 83 84 import org.apache.struts2.StrutsStatics; 85 import org.apache.struts2.components.Component; 86 import org.apache.struts2.dispatcher.StrutsRequestWrapper; 87 88 import com.bjsxt.sxf.util.Page; 89 import com.opensymphony.xwork2.util.ValueStack; 90 91 /** 92 * 分頁標籤集合類。 93 * 本示例直接從值棧中獲得本次請求的分頁對象,以及請求action的地址信息。因此本示例沒有采用jsp頁面標籤屬性,日後臺傳遞信息 94 * 95 * 也能夠經過標籤日後臺傳遞值。則須要創建一個全部action都會繼承的pageAction,每次請求,頁碼當前頁,總記錄數,每頁顯示記錄數,以及查詢條件等等,都要在pageAction中創建 96 * 相應屬性。並且全部的請求地址的參數都必須與pageAction中的屬性對應。jsp頁面上自定義分頁標籤的屬性從本次請求的值棧中取出頁碼當前頁,總記錄數,每頁顯示記錄數,而後傳遞給 97 * pageTag的標籤類,標籤類在傳遞給pageComponent中,而後再邏輯類中編寫分頁代碼(本示例沒用這種狀況,但標籤創建了相應的屬性) 98 * 99 * 100 * @ClassName: PageComponent 101 * @Description: TODO(這裏用一句話描述這個類的做用) 102 * @author 尚曉飛 103 * @date 2014-10-23 下午4:20:17 104 * 105 */ 106 public class PageComponent extends Component { 107 private Integer pageNo;//當前頁 108 private Integer pageSize;//頁面顯示記錄數 109 private Integer rowCount;//總記錄數 110 private String reqUrl;//標籤所在頁面的請求地址url 111 112 113 public PageComponent(ValueStack stack,HttpServletRequest request,HttpServletResponse response) { 114 super(stack); 115 116 } 117 118 @Override 119 public boolean end(Writer writer, String body) { 120 // TODO Auto-generated method stub 121 return super.end(writer, body); 122 } 123 124 @Override 125 public boolean start(Writer writer) { 126 127 128 129 //獲取值棧 130 ValueStack stack=this.getStack(); 131 Map cont= this.getStack().getContext(); 132 StrutsRequestWrapper req=(StrutsRequestWrapper)cont.get(StrutsStatics.HTTP_REQUEST); 133 //獲取請求action的地址 134 //示例:/Struts2HibernateSpring/StudentAction!queryStudent 135 String url=(String)req.getAttribute("javax.servlet.forward.request_uri"); 136 //獲取請求參數的地址 137 //示例:seachName=%E5%B0%9A%E6%99%93%E9%A3%9E&pageNo=1 138 //若是不存在請求參數,則返回是null 也就是說paramString是null 139 String paramString=(String) req.getAttribute("javax.servlet.forward.query_string"); 140 //從值棧中獲取分頁對 141 Page page=(Page) stack.findValue("page"); 142 //獲取頁碼傳遞的參數 此處每頁顯示記錄數爲後臺默認控制,因此不用拼接pageSize(每頁顯示多少條記錄)的參數傳遞。 143 //將頁碼數參數,放在url的最後 144 String newUrl=""; 145 if(paramString!=null&&!paramString.equals("")){ 146 //有請求參數 147 Integer index=paramString.lastIndexOf("pageNo"); 148 paramString=paramString.substring(0,index); 149 newUrl=url+"?"+paramString; 150 151 }else{ 152 newUrl=url+"?"; 153 } 154 155 //拼接分頁代碼 156 StringBuffer sb=new StringBuffer(""); 157 158 /** 159 * 簡單的頁面分頁html代碼 160 * <table border="2"> 161 <tr> 162 <td>總共頁數<td> 163 <td>10</td> 164 <td>當前頁數</td> 165 <td>2</td> 166 <td>》》</td> 167 </tr> 168 <tr> 169 <td>首頁</td> 170 <td>上一頁</td> 171 <td>1,<b style="color: red;">2</b>,3,4,5</td> 172 <td>下一頁</td> 173 <td>尾頁</td> 174 </tr> 175 </table> 176 */ 177 sb.append("<table border=\"2\">"); 178 sb.append("<tr>"); 179 sb.append("<td>總共頁數</td>"); 180 sb.append("<td>"+page.getPageCount()+"</td>"); 181 sb.append("<td>當前頁數</td>"); 182 sb.append("<td>"+page.getPageNum()+"</td>"); 183 sb.append("<td>》》</td>"); 184 sb.append("</tr>"); 185 sb.append("<tr>"); 186 sb.append("<td><a href=\""+newUrl+"pageNo="+page.getFirstPage()+"\">首頁</a></td>"); 187 sb.append("<td><a href=\""+newUrl+"pageNo="+page.getPreviousPage()+"\">上一頁</a></td>"); 188 List<Integer> pageList=page.getPageList(); 189 if(pageList!=null&&pageList.size()>0){ 190 sb.append("<td>"); 191 //有頁碼列表 192 for(int i=0;i<pageList.size();i++){ 193 Integer num=pageList.get(i); 194 Integer pageNum=page.getPageNum(); 195 if(pageNum==num){ 196 sb.append("<a href=\""+newUrl+"pageNo="+num+"\"><b style=\"color: red;\">"+num+"</b></a>,"); 197 }else{ 198 sb.append("<a href=\""+newUrl+"pageNo="+num+"\">"+num+"</a>,"); 199 } 200 201 } 202 sb.append("</td>"); 203 }else{ 204 sb.append("<td>0</td>"); 205 } 206 sb.append("<td><a href=\""+newUrl+"pageNo="+page.getNextPage()+"\">下一頁</a></td>"); 207 sb.append("<td><a href=\""+newUrl+"pageNo="+page.getLastPage()+"\">尾頁</a></td>"); 208 sb.append("</tr>"); 209 sb.append("</table>"); 210 211 try { 212 writer.write(sb.toString()); 213 } catch (IOException e) { 214 // TODO Auto-generated catch block 215 e.printStackTrace(); 216 } 217 218 return false; 219 } 220 221 222 223 public Integer getPageNo() { 224 return pageNo; 225 } 226 227 public void setPageNo(Integer pageNo) { 228 this.pageNo = pageNo; 229 } 230 231 public Integer getPageSize() { 232 return pageSize; 233 } 234 235 public void setPageSize(Integer pageSize) { 236 this.pageSize = pageSize; 237 } 238 239 public Integer getRowCount() { 240 return rowCount; 241 } 242 243 public void setRowCount(Integer rowCount) { 244 this.rowCount = rowCount; 245 } 246 247 public String getReqUrl() { 248 return reqUrl; 249 } 250 251 public void setReqUrl(String reqUrl) { 252 this.reqUrl = reqUrl; 253 } 254 255 256 }
第三步:jsp頁面測試java
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <%@ taglib uri="/struts-tags" prefix="s"%> 3 <%@ taglib uri="StudentTags" prefix="stu" %> 4 <% 5 String path = request.getContextPath(); 6 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 7 %> 8 9 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 10 <html> 11 <head> 12 <base href="<%=basePath%>"> 13 14 <title>My JSP 'list.jsp' starting page</title> 15 16 <meta http-equiv="pragma" content="no-cache"> 17 <meta http-equiv="cache-control" content="no-cache"> 18 <meta http-equiv="expires" content="0"> 19 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 20 <meta http-equiv="description" content="This is my page"> 21 <!-- 22 <link rel="stylesheet" type="text/css" href="styles.css"> 23 --> 24 25 </head> 26 27 <body> 28 <h1>學生表</h1> 29 <table border="2"> 30 <tr> 31 <td>id</td> 32 <td>姓名</td> 33 <td>性別</td> 34 <td>班級</td> 35 </tr> 36 <s:iterator value="#root.list" var="stu"> 37 <tr> 38 <td><s:property value="#stu.id"/></td> 39 <td><s:property value="#stu.name"/></td> 40 <td><s:property value="#stu.sex"/></td> 41 <td><s:property value="#stu.classRoom.name"/></td> 42 </tr> 43 </s:iterator> 44 </table> 45 <h1>分頁列表</h1> 46 <!-- 自定義的分頁標籤,本示例沒有用自定義標籤中的屬性往標籤類中傳遞值 --> 47 <stu:page/> 48 49 </body> 50 </html>
第四步:顯示效果web