EXT 3.x詳細を使用したExt.Historyブラウザ前進後退機能(二)--gridページングの統合


これは私が以前書いた例についてhistoryの修正を行い、修正後はURLのパラメータ付きリンクに対して具体的なページにアクセスすることができます.例えばhttp://localhost:8080/MyTest/ext/test_history_2.jsp#start-6--limit-3が直接開いているのは3ページ目で、最初から開いているのではなく1ページ目で、拡張してから検索などのキーワードを記録することができます.のもちろん基本的にはブラウザの前進後退機能が追加されていますが、具体的なコード(json関連クラスやext関連jsを自分でインポート)について説明します.
1.test_history_2.jspコード:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ page pageEncoding="UTF-8"%>
<html>
<head>

<style type="text/css">
	
	html,body{
	margin:0px;
	height:100%;
	}
	
	#content{
	height:100%;
	width:100%;
	}
</style>

</head>
	<body style="height:100%">
	<script type="text/javascript">
	//     grid   ajax       
	var grid;
	
	var cm;
	
	var ds;
	//     
	var bbar;
	//      ,      grid   
	var h;
	//      
    var maintokenDelimiter = '--';
    //      
    var tokenDelimiter = '-';
	// history   params  
	var o = {};
	//    
	function renderSex(value) {
		if (value == 'male') {
		return "<span style='color:red;font-weight:bold;'> </span>";
		} else {
		return "<span style='color:green;font-weight:bold;'> </span>";
		}
	}
	//    
	function renderDescn(value, cellmeta, record, rowIndex, columnIndex,store){
		var str = (rowIndex+1)+" |"+(columnIndex+1)+" ";
		return str;
	}
	
	Ext.onReady(function()
		{
	//   history  
 	Ext.History.init();
 
	//     
	cm = new Ext.grid.ColumnModel([
		{header:'<font color="blue">  </font>',width: Ext.get("content").getWidth()/5,sortable:true,dataIndex:'id'},//sortable    ,           
		{header:'<font color="blue">  </font>',width: Ext.get("content").getWidth()/5,dataIndex:'time',renderer:Ext.util.Format.dateRenderer('Y-m-d h:i:s')},
		{header:'<font color="blue">  </font>',width: Ext.get("content").getWidth()/5,dataIndex:'sex',renderer:renderSex},
		{header:'<font color="blue">  </font>',width: Ext.get("content").getWidth()/5,dataIndex:'name'},
		{header:'<font color="blue">  </font>',width: Ext.get("content").getWidth()/5,dataIndex:'descn',renderer:renderDescn}
	]);
	//ajax  
	var proxyParam={  
        url:contextPath + '/search.do?method=SearchAjax',  
        method:'GET'  
   	 }; 
	// ajax   json      ,
	var jsonReaderMeta={  
		root: 'grids',//Json   root  , SearchVO      
		totalProperty: 'totalCount', //       , SearchVO      
   		id: 'id'  //     , GridVO      
     };  
	//  Json     
	var recordType=[  
        {name: 'id', mapping: 'id'}, 
        //       String      date ,      pattern,  pattern  api date 
        {name: 'time', mapping: 'time',type : 'date',dateFormat : 'Y-m-d h:i:s' },   
        {name: 'sex', mapping: 'sex'},  
        {name: 'name', mapping: 'name'},  
        {name: 'desc', mapping: 'desc'}  
      ]; 
	//  dataStore
	ds = new Ext.data.Store({  
        proxy: new Ext.data.HttpProxy(proxyParam),  
        reader: new Ext.data.JsonReader(jsonReaderMeta,recordType),
        remoteSort:true  //         
     });
     //      
	bbar = new Ext.PagingToolbar({
		pageSize: 3,
		store: ds,
		displayInfo: true,
		displayMsg: ' {0}   {1}      {2} ',
		emptyMsg: "    ",
		//  start      history   
		doLoad: function(start){
			/***           
	            var o = {};
	            var pn = this.store.paramNames;  
	         o[pn.start] = start;  
				o[pn.limit] = this.pageSize;  
				this.store.load({params:o});  
			***/	
			
	        var pn = this.store.paramNames;  
			//  history  
			Ext.History.add(pn.start+tokenDelimiter+start+maintokenDelimiter+pn.limit+tokenDelimiter+this.pageSize);
		}  
      }); 
	//  grid  
	grid = new Ext.grid.GridPanel({
		renderTo: 'content',
		width: Ext.get("content").getWidth(),
		store: ds,
		cm: cm,
		loadMask: true,
		bbar: bbar
		//          Grid,    viewConfig    foreceFit
		//viewConfig:{forceFit:true}
	});
	//  dataStore,                 
        //    history   ds.load        ,     
	//ds.load({params:{start:0, limit:3}});
	// dataStore              
	ds.on('load', function(){ 
		h = $('.x-panel-bbar').height()+$('.x-grid3-body').height()+$('.x-grid3-header').height()+20;
		grid.setHeight(h); 
       });
    
     //     hash #      
    Ext.History.on('change', function(token){
        if(token){
        //             
        	var parts = token.split(maintokenDelimiter);
        	for(i=0;i<parts.length;i++){
       			if(!Ext.isEmpty(parts[i])){
        			var keyword = parts[i].split(tokenDelimiter);
        			o[keyword[0]] = parseInt(keyword[1]);  
       			}
        	}
        	bbar.store.load({params:o});
        }
    });
    
    //         url    ,   loadHref()      
    function loadHref(){
    	var href = window.location.href;
    	if(href.indexOf('#')>0){
    	  var o = href.split('#');
    	  //  history change  
		  Ext.History.fireEvent('change',o[1]);     	
    	}else{
    	  //          ,   history change  
    	  Ext.History.add("start-0--limit-"+bbar.pageSize);
    	  Ext.History.fireEvent('change',"start-0--limit-"+bbar.pageSize);     
    	}
    }
	loadHref();
    
	});
	
	
	//           
	window.onresize=function(){
		cm = new Ext.grid.ColumnModel([
			{header:'<font color="blue">  </font>',width: Ext.get("content").getWidth()/5,sortable:true,dataIndex:'id'},
			{header:'<font color="blue">  </font>',width: Ext.get("content").getWidth()/5,dataIndex:'time',renderer:Ext.util.Format.dateRenderer('Y m d h m s ')},
			{header:'<font color="blue">  </font>',width: Ext.get("content").getWidth()/5,dataIndex:'sex',renderer:renderSex},
			{header:'<font color="blue">  </font>',width: Ext.get("content").getWidth()/5,dataIndex:'name'},
			{header:'<font color="blue">  </font>',width: Ext.get("content").getWidth()/5,dataIndex:'descn',renderer:renderDescn}
		]);
		if(grid){
			grid.setWidth(Ext.get("content").getWidth());
			//    dataStore cm,             cm       
	        grid.reconfigure(ds,cm);
        }
	};
	
    </script>
    
<div id="content"><div>
	<!-- Ext.History   form  begin-->
		<form id="history-form" class="x-hidden">  
             <input type="hidden" id="x-history-field" />  
             	<iframe id="x-history-frame">  
             </iframe>  
        </form> 
    <!-- Ext.History   form  end -->  
	</body>
</html>

 
 
2.バックグラウンドsearch.doセクション(jsonデータ型が実用化されていることに注意し、json関連パッケージを追加してください):
 
public ActionForward SearchAjax(ActionMapping mapping, ActionForm form,
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		Integer start = Integer.valueOf(request.getParameter("start"));
		Integer limit = Integer.valueOf(request.getParameter("limit"));
		System.out.println("start:" + start + "|limit:" + limit);
		String sort = request.getParameter("sort");
		String dir = request.getParameter("dir");
		if (StringUtils.isBlank(sort)) {
			sort = "id";
		}
		if (StringUtils.isBlank(dir)) {
			dir = "ASC";
		}
		System.out.println("sort:" + sort + "|" + dir);
		List<GridVO> lists = new ArrayList<GridVO>();
		GridVO vo = new GridVO();
		vo.setId(1);
		vo.setTime(dateFormat());
		vo.setSex("male");
		vo.setName("name1");
		vo.setDesc("descn1");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(2);
		vo.setTime(dateFormat());
		vo.setSex("female");
		vo.setName("name2");
		vo.setDesc("descn2");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(3);
		vo.setTime(dateFormat());
		vo.setSex("male");
		vo.setName("name3");
		vo.setDesc("descn3");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(4);
		vo.setTime(dateFormat());
		vo.setSex("female");
		vo.setName("name4");
		vo.setDesc("descn4");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(5);
		vo.setTime(dateFormat());
		vo.setSex("male");
		vo.setName("name5");
		vo.setDesc("descn5");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(6);
		vo.setTime(dateFormat());
		vo.setSex("female");
		vo.setName("name6");
		vo.setDesc("descn6");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(7);
		vo.setTime(dateFormat());
		vo.setSex("male");
		vo.setName("name7");
		vo.setDesc("descn7");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(8);
		vo.setTime(dateFormat());
		vo.setSex("female");
		vo.setName("name8");
		vo.setDesc("descn8");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(9);
		vo.setTime(dateFormat());
		vo.setSex("male");
		vo.setName("name9");
		vo.setDesc("descn9");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(10);
		vo.setTime(dateFormat());
		vo.setSex("female");
		vo.setName("name10");
		vo.setDesc("descn10");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(11);
		vo.setTime(dateFormat());
		vo.setSex("male");
		vo.setName("name11");
		vo.setDesc("descn11");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(12);
		vo.setTime(dateFormat());
		vo.setSex("female");
		vo.setName("name12");
		vo.setDesc("descn12");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(13);
		vo.setTime(dateFormat());
		vo.setSex("male");
		vo.setName("name13");
		vo.setDesc("descn13");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(14);
		vo.setTime(dateFormat());
		vo.setSex("female");
		vo.setName("name14");
		vo.setDesc("descn14");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(15);
		vo.setTime(dateFormat());
		vo.setSex("male");
		vo.setName("name15");
		vo.setDesc("descn15");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(16);
		vo.setTime(dateFormat());
		vo.setSex("female");
		vo.setName("name16");
		vo.setDesc("descn16");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(17);
		vo.setTime(dateFormat());
		vo.setSex("male");
		vo.setName("name17");
		vo.setDesc("descn17");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(18);
		vo.setTime(dateFormat());
		vo.setSex("female");
		vo.setName("name18");
		vo.setDesc("descn18");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(19);
		vo.setTime(dateFormat());
		vo.setSex("male");
		vo.setName("name19");
		vo.setDesc("descn19");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(20);
		vo.setTime(dateFormat());
		vo.setSex("female");
		vo.setName("name20");
		vo.setDesc("descn20");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(21);
		vo.setTime(dateFormat());
		vo.setSex("male");
		vo.setName("name21");
		vo.setDesc("descn21");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(22);
		vo.setTime(dateFormat());
		vo.setSex("female");
		vo.setName("name22");
		vo.setDesc("descn22");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(23);
		vo.setTime(dateFormat());
		vo.setSex("male");
		vo.setName("name23");
		vo.setDesc("descn23");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(24);
		vo.setTime(dateFormat());
		vo.setSex("female");
		vo.setName("name24");
		vo.setDesc("descn24");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(25);
		vo.setTime(dateFormat());
		vo.setSex("male");
		vo.setName("name25");
		vo.setDesc("descn25");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(26);
		vo.setTime(dateFormat());
		vo.setSex("female");
		vo.setName("name26");
		vo.setDesc("descn26");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(27);
		vo.setTime(dateFormat());
		vo.setSex("male");
		vo.setName("name27");
		vo.setDesc("descn27");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(28);
		vo.setTime(dateFormat());
		vo.setSex("female");
		vo.setName("name28");
		vo.setDesc("descn28");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(29);
		vo.setTime(dateFormat());
		vo.setSex("male");
		vo.setName("name29");
		vo.setDesc("descn29");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(30);
		vo.setTime(dateFormat());
		vo.setSex("female");
		vo.setName("name30");
		vo.setDesc("descn30");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(31);
		vo.setTime(dateFormat());
		vo.setSex("male");
		vo.setName("name31");
		vo.setDesc("descn31");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(32);
		vo.setTime(dateFormat());
		vo.setSex("female");
		vo.setName("name32");
		vo.setDesc("descn32");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(33);
		vo.setTime(dateFormat());
		vo.setSex("male");
		vo.setName("name33");
		vo.setDesc("descn33");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(34);
		vo.setTime(dateFormat());
		vo.setSex("female");
		vo.setName("name34");
		vo.setDesc("descn34");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(35);
		vo.setTime(dateFormat());
		vo.setSex("male");
		vo.setName("name35");
		vo.setDesc("descn35");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(36);
		vo.setTime(dateFormat());
		vo.setSex("female");
		vo.setName("name36");
		vo.setDesc("descn36");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(37);
		vo.setTime(dateFormat());
		vo.setSex("male");
		vo.setName("name37");
		vo.setDesc("descn37");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(38);
		vo.setTime(dateFormat());
		vo.setSex("female");
		vo.setName("name38");
		vo.setDesc("descn38");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(39);
		vo.setTime(dateFormat());
		vo.setSex("male");
		vo.setName("name39");
		vo.setDesc("descn39");
		lists.add(vo);
		vo = new GridVO();
		vo.setId(40);
		vo.setTime(dateFormat());
		vo.setSex("female");
		vo.setName("name40");
		vo.setDesc("descn40");
		lists.add(vo);
		//   
		lists = sortObj(lists, sort, dir);

		SearchVO searchVO = new SearchVO();
		searchVO.setTotalCount(lists.size());
		lists = findCurrentPageObj(lists, start, limit);
		searchVO.setGrids(lists);
		JSONObject obj = JSONObject.fromObject(searchVO);
		System.out.println(obj.toString());
		response.setContentType("text/xml;charset=utf-8");
		response.getWriter().print(obj.toString());
		return null;
	}

	private List<GridVO> sortObj(List<GridVO> list, String sort, String dir) {
		Set<ResultTokenDelegate> someSet = new TreeSet<ResultTokenDelegate>();
		List<GridVO> result = new ArrayList<GridVO>();
		for (GridVO res : list) {
			ResultTokenDelegate delegate = new ResultTokenDelegate(res, sort,
					dir);
			someSet.add(delegate);
		}
		Iterator iterator = someSet.iterator();
		while (iterator.hasNext()) {
			ResultTokenDelegate delegate = (ResultTokenDelegate) iterator
					.next();
			result.add(delegate.getResult());
		}
		return result;
	}

	List<GridVO> findCurrentPageObj(List<GridVO> list, int start, int limit) {
		List<GridVO> vos = new ArrayList<GridVO>();
		for (int i = 0; i < list.size(); i++) {
			if (i >= start && i < (start + limit)) {
				vos.add(list.get(i));
			}
		}
		return vos;
	}

	String dateFormat() {
		SimpleDateFormat smf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		Date date = new Date(System.currentTimeMillis());
		return smf.format(date);
	}

 
3.ResultTokenDelegateクラスのコード.listオブジェクトのソートに使用されます.
package com.xuyi.util.sort;

import com.xuyi.vo.GridVO;

public class ResultTokenDelegate implements Comparable {

	private GridVO result;

	private String sort;

	private String dir;

	public ResultTokenDelegate() {
	}

	public ResultTokenDelegate(GridVO result, String sort, String dir) {
		this.result = result;
		this.sort=sort;
		this.dir=dir;
	}

	public GridVO getResult() {
		return result;
	}

	public void setResult(GridVO result) {
		this.result = result;
	}

	public String getDir() {
		return dir;
	}

	public void setDir(String dir) {
		this.dir = dir;
	}

	public String getSort() {
		return sort;
	}

	public void setSort(String sort) {
		this.sort = sort;
	}

	public int compareTo(Object o) {
		ResultTokenDelegate ntd = (ResultTokenDelegate) o;
		if ("id".equals("id")) {
			if ("ASC".equals(dir)) {
				if (this.getResult().getId() < ntd.getResult().getId()) {
					return -1;
				} else if (this.getResult().getId() == ntd.getResult().getId()) {
					return 1;
				} else {
					return 1;
				}
			}else{
				if (this.getResult().getId() < ntd.getResult().getId()) {
					return 1;
				} else if (this.getResult().getId() == ntd.getResult().getId()) {
					return 1;
				} else {
					return -1;
				}
			}
		}else{
			return 1;
		}
	}

}

 
4.GridVOクラスのコード:
package com.xuyi.vo;

public class GridVO {
	
	int id;
	
	String sex;
	
	String name;
	
	String desc;
	
	String time;


	public String getTime() {
		return time;
	}

	public void setTime(String time) {
		this.time = time;
	}

	public String getDesc() {
		return desc;
	}

	public void setDesc(String desc) {
		this.desc = desc;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}
	
	
}

5.SearchVOのコード:
package com.xuyi.vo;

import java.util.ArrayList;
import java.util.List;

public class SearchVO {
	
	int totalCount;
	
	List<GridVO> grids = new ArrayList<GridVO>();

	public List<GridVO> getGrids() {
		return grids;
	}

	public void setGrids(List<GridVO> grids) {
		this.grids = grids;
	}

	public int getTotalCount() {
		return totalCount;
	}

	public void setTotalCount(int totalCount) {
		this.totalCount = totalCount;
	}
	
	
}

 
6.具体的な効果は直接アクセスすることによって例えば:http://localhost:8080/MyTest/ext/test_history_2.jsp#start-6--limit-3
このようなURLは直接ページgridが第3ページの内容を表示することができて、もちろん前進して後退することができて、ほほほ