⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pagerrenderer.java

📁 JSF分页控件。真正实现了大容量数据可查询的分页。原创。
💻 JAVA
字号:
package com.m2.jsf.pagination;

import java.io.IOException;
import java.util.Iterator;
import java.util.Map;
import javax.faces.component.NamingContainer;
import javax.faces.component.UIComponent;
import javax.faces.component.UIData;
import javax.faces.component.UIForm;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.el.ValueBinding;
import javax.faces.render.Renderer;

/**
 * 
 * @author http://yuetong.javaeye.com       
 * 
 * 
 */

public class PagerRenderer extends Renderer {
   public void encodeBegin(FacesContext context, UIComponent component) 
      throws IOException {   
      String id = component.getClientId(context);
      UIComponent parent = component;
      while (!(parent instanceof UIForm)) parent = parent.getParent();
      String formId = parent.getClientId(context);
      ResponseWriter writer = context.getResponseWriter();    
      String styleClass = (String) get(context, component, "styleClass");
      String selectedStyleClass = (String) get(context, component, 
            "selectedStyleClass");
      String dataTableId = (String) get(context, component, "dataTableId");
      Integer a = (Integer) get(context, component, "showpages");
      int showpages = a == null ? 0 : a.intValue();      
      // find the component with the given ID
      UIData data = (UIData) findComponent(context.getViewRoot(), 
         getId(dataTableId, id), context);
      
      int first=0;
      int itemcount=0;
      int pagesize=20;
      
      if (data!=null){
        first = data.getFirst();
        itemcount = data.getRowCount();
        pagesize = data.getRows(); 
      }
      
      if (pagesize <= 0) pagesize = itemcount;

      int pages = itemcount / pagesize;
      if (itemcount % pagesize != 0) pages++;

      int currentPage = first / pagesize;
      if (first >= itemcount - pagesize) currentPage = pages - 1;
      int startPage = 0;
      int endPage = pages;
      if (showpages > 0) { 
         startPage = (currentPage / showpages) * showpages;
         endPage = Math.min(startPage + showpages, pages);
      }
      writer.write("共计"+pages+"页"+itemcount+"条记录");
      if (currentPage > 0)
          writeLink(writer, component, formId, id, "<", styleClass);
       
       if (startPage > 0)  
          writeLink(writer, component, formId, id, "<<", styleClass);

       for (int i = startPage; i < endPage; i++) {
          writeLink(writer, component, formId, id, "" + (i + 1), 
             i == currentPage ? selectedStyleClass : styleClass);
       }

       if (endPage < pages) 
          writeLink(writer, component, formId, id, ">>", styleClass);

       if (first < itemcount - pagesize)
          writeLink(writer, component, formId, id, ">", styleClass);
       writeInput(writer,component,formId,id,styleClass);
       // hidden field to hold result
       writeHiddenField(writer, component, id);
       
       
       

   }
   private void writeInput(ResponseWriter writer, UIComponent component, 
		      String formId, String id, String styleClass)throws IOException{
	   writer.writeText(" ", null);
	   writer.write("转到第");
	   writer.startElement("input",component);
	   writer.writeAttribute("id","inputpage",null);
	   writer.writeAttribute("type","text",null);
	   writer.writeAttribute("size","3",null);
	   if (styleClass != null) 
	      writer.writeAttribute("class", styleClass, "styleClass");
	   writer.endElement("input");
	   writer.write("页");
	   writer.startElement("input",component);
	   writer.writeAttribute("type","button",null);
	   writer.writeAttribute("value","GO",null);
	   writer.writeAttribute("onclick", onclickCodeForInput(formId, id, "document.getElementById('inputpage').value"), null);
	   writer.endElement("input");
   }
   
   
   private void writeLink(ResponseWriter writer, UIComponent component, 
      String formId, String id, String value, String styleClass) 
      throws IOException {
      writer.writeText(" ", null);
      writer.startElement("a", component);
      writer.writeAttribute("href", "#", null);
      writer.writeAttribute("onclick", onclickCode(formId, id, value), null);
      if (styleClass != null) 
         writer.writeAttribute("class", styleClass, "styleClass");
      writer.writeText(value, null);
      writer.endElement("a");
   }
   private String onclickCodeForInput(String formId, String id, String value){
	      StringBuffer buffer = new StringBuffer();
	      buffer.append("document.forms[");
	      buffer.append("'");
	      buffer.append(formId);
	      buffer.append("'");
	      buffer.append("]['");
	      buffer.append(id);
	      buffer.append("'].value=");
	      buffer.append(value);
	      buffer.append(";");
	      buffer.append(" document.forms[");
	      buffer.append("'");
	      buffer.append(formId);
	      buffer.append("'");
	      buffer.append("].submit()");
	      buffer.append("; return false;");
	      return buffer.toString();	   
   }

   private String onclickCode(String formId, String id, String value) {
      StringBuffer buffer = new StringBuffer();
      buffer.append("document.forms[");
      buffer.append("'");
      buffer.append(formId);
      buffer.append("'");
      buffer.append("]['");
      buffer.append(id);
      buffer.append("'].value='");
      buffer.append(value);
      buffer.append("';");
      buffer.append(" document.forms[");
      buffer.append("'");
      buffer.append(formId);
      buffer.append("'");
      buffer.append("].submit()");
      buffer.append("; return false;");
      return buffer.toString();
   }

   private void writeHiddenField(ResponseWriter writer, UIComponent component, 
      String id) throws IOException {
      writer.startElement("input", component);
      writer.writeAttribute("type", "hidden", null);
      writer.writeAttribute("name", id, null);
      writer.endElement("input");
   }

   public void decode(FacesContext context, UIComponent component) {
      String id = component.getClientId(context);
      Map parameters = context.getExternalContext()
         .getRequestParameterMap();
      String response = (String) parameters.get(id);

      String dataTableId = (String) get(context, component, "dataTableId");
      Integer a = (Integer) get(context, component, "showpages");
      int showpages = a == null ? 0 : a.intValue();      

      UIData data = (UIData) findComponent(context.getViewRoot(), 
         getId(dataTableId, id), context);

      int first = data.getFirst();
      int itemcount = data.getRowCount();
      int pagesize = data.getRows(); 
      if (pagesize <= 0) pagesize = itemcount;

      if (response.equals("<")) first -= pagesize;
      else if (response.equals(">")) first += pagesize;
      else if (response.equals("<<")) first -= pagesize * showpages;
      else if (response.equals(">>")) first += pagesize * showpages;
      else {
    	 int page=0; 
    	 int num=convertNum(response);
    	 if ((num>0)&&(num<=itemcount/pagesize+1)){ 
             page = Integer.parseInt(response);
             first = (page - 1) * pagesize;
    	 }
      }
      if (first < 0) first = 0;
      data.setFirst(first);
   }

   private static Object get(FacesContext context, UIComponent component, 
      String name) {
      ValueBinding binding = component.getValueBinding(name);
      if (binding != null) return binding.getValue(context);
      else return component.getAttributes().get(name);         
   }

   private static UIComponent findComponent(UIComponent component, String id, 
      FacesContext context) {
      String componentId = component.getClientId(context);

      if (componentId.equals(id)) return component;
      Iterator kids = component.getChildren().iterator();
      while (kids.hasNext()) {
         UIComponent kid = (UIComponent) kids.next();
         UIComponent found = findComponent(kid, id, context);
         if (found != null) return found;
      }
      return null;
   } 
   private static int convertNum(String num){
	   try{
		   int n=Integer.parseInt(num);
		   return n;
	   }catch(Exception e){
		   return -1;
	   }
	   
   }
   private static String getId(String id, String baseId) {
      String separator = "" + NamingContainer.SEPARATOR_CHAR;
      String[] idSplit = id.split(separator);
      String[] baseIdSplit = baseId.split(separator);
      StringBuffer buffer = new StringBuffer();
      for (int i = 0; i < baseIdSplit.length - idSplit.length; i++) {
         buffer.append(baseIdSplit[i]);
         buffer.append(separator);
      }
      buffer.append(id);
      return buffer.toString();
   }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -