Struts2自定義標籤4自定義分頁標籤

第一步: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>  
View Code

第二步: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 }
View Code

第三步: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>
View Code

第四步:顯示效果web

相關文章
相關標籤/搜索