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コード:
2.バックグラウンドsearch.doセクション(jsonデータ型が実用化されていることに注意し、json関連パッケージを追加してください):
3.ResultTokenDelegateクラスのコード.listオブジェクトのソートに使用されます.
4.GridVOクラスのコード:
5.SearchVOのコード:
6.具体的な効果は直接アクセスすることによって例えば:http://localhost:8080/MyTest/ext/test_history_2.jsp#start-6--limit-3
このようなURLは直接ページgridが第3ページの内容を表示することができて、もちろん前進して後退することができて、ほほほ
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ページの内容を表示することができて、もちろん前進して後退することができて、ほほほ