一:(页面分页控件)页面head标签中引进:???
?
<script type="text/javascript" src="../libs/jquery.pagination_2/jquery.pagination.js"></script>
<link href="../libs/jquery.pagination_2/pagination.css" rel="stylesheet" type="text/css" media="all" />
?
html语句:
<div id="pagination" style="margin-top:5px;float: right;"></div>
?
//分页 var pageSize = 20; var pageIndex = 0; $(function(){ loadFirstNode(); search(true); }); function search(resetPageIndex){ resetPageIndex = resetPageIndex || false; if (resetPageIndex) pageIndex = 0; var url= "/s.do?obj=catalogDaoImpl"; var nodeNamex = $("#nodeNamex").val(); var i=4;//允许从叶子节点开始搜索 while((code=$("#"+i+"Catalog").val())=="" && i>0){ i--; } sendJsonrpcRequest (url,"POST","getPagedList",{ //封装好的jsonrpc方式 query:{ "title":$("#nodeNamex").val(), "lastOperator":$("#modifyPerson").val(), "reservedInt":0, "code":code, "orderBy":"lastUpdateTime", // "pageSize":20, //等待liusan修复abstractDao代码 //改map文件中的"pageSize"为"limit" "reservedField":"common_catalog"//传入表名 }, pageSize:pageSize, pageIndex:pageIndex },null, function(data){ $("#pagination").show(); //返回的data是一个objct,包含一个list(取前面的n个记录用于本页显示)和count(总记录数) nodeNamex = $("#nodeNamex").val(); for(var i=0;i<data.list .length;i++){ //返回的data是根据数据库查询得到的一个PagedList<Catalog> //public class PagedList<T> { // private int count; // private Collection<T> list; } ?getCatalogPath(data.list[i]); //关键字着色 data.list[i].title=data.list[i].title.replaceAll(nodeNamex,"<span style='color: red;'>"+nodeNamex+"</span>"); } if (pageIndex == 0) initPagination(data.count); $("#mainbody").html(""); //alert(TrimPath.processDOMTemplate("template_jst_list", data)); if(data.list.length!=0){ $("#mainbody").append( TrimPath.processDOMTemplate("template_jst_list",data)); }else{ $("#mainbody").append("<tr id='noData'><td colspan='5' align='center'><strong style='color: red'>没找到数据!</strong></td></tr>"); $("#pagination").hide(); } },null); } function getCatalogPath(p){ //alert("GetCatalogPath"); var url= "/s.do?obj=catalogDaoImpl"; sendJsonrpcRequestSync(url,"POST","getCatalogPath",{code:p.code},null, function(data){ p.pathData=data; },null); } function pageselectCallback(page_index, jq) { pageIndex = page_index; search(); return false; } function initPagination(count) { $("#pagination").pagination(count, { callback : pageselectCallback, prev_text : "上一页", next_text : "下一页", items_per_page : pageSize // Show only one item per page }); }
?其中,sendJsonrpcRequest(。。)是对jsopnrpc的一个请求的封装:
function sendJsonrpcRequest(url, httpMethod, method, params, extraParams, callback, errorCallback) { //jsonrpc请求参数 var o = createJsonRpcObject(method,params); sendJsonrpcRequestX(url,httpMethod,o,callback,errorCallback, true); } function createJsonRpcObject(method,params){ var o = {}; o.id = 1; o.method = method; o.params = params; o.jsonrpc = "2.0"; return o; } function sendJsonrpcRequestX(url, method, jsonrpcRequestObject, callback, errorCallback, async){ var d = {}; d["jsonrpcContent"] = JSON.stringify(jsonrpcRequestObject); d["rnd"] = Math.random(); if(!$.browser.msie)//2012-08-14,非IE增加charset=utf-8参数,表示服务器要转码。解决IE下,提交的+号,在服务器端被utf8转换导致丢失的问题 d = "charset=utf-8&jsonrpcContent="+ encodeURIComponent(encodeURIComponent( d.jsonrpcContent )) + "&rnd=" + d.rnd; $.ajax({ async : async, //2012-08-13 type : method,//"GET", url : url, //contentType: "application/x-www-form-urlencoded; charset=gbk", dataType : "json", data : d, //2012-08-10 上面的data两次encodeURIComponent,服务端用java.net.URLDecoder.decode(request.getParameter("jsonrpcContent"), "utf-8"); success : function(data) { if (data.error) { if (errorCallback) errorCallback(data.error); else alert(data.error.message); } else if (callback){ if($.isArray(jsonrpcRequestObject)) callback(data); //2012-04-19增加【|| data】,解决批量请求的问题 else callback(data.result); } }, error : function(data){//2012-02-15 by liusan.dyf //alert("jsonrpc error"); } }); }
? web.xml中有一个配置,对请求进行过滤截获:
<filter>
<filter-name>jsonRpcFilter
</filter-name>
<filter-class>com.taobao.riskm.filter.JsonRpcFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>jsonRpcFilter</filter-name>
<url-pattern>/s.do</url-pattern>
</filter-mapping>
?JsonRpcFilter类中就有对jsonrpc的一个请求处理过程:
?
public class JsonRpcFilter implements Filter {
Map<String, Object> objects = new HashMap<String, Object>();
private static final String DEFAULT_OBJ_KEY = "kv";
private static final String X = "$userName$";
@Override
public void init(FilterConfig filterConfig) throws ServletException {
//提示信息不包括堆栈信息
JsonRpcService.outputErrorStackTrace(false);
// 注册对象
objects.put(DEFAULT_OBJ_KEY, SpringBeanUtil.getBean("keyValueDao"));
objects.put("catalogDaoImpl", SpringBeanUtil.getBean("catalogDao"));
objects.put("httpRequest", new HttpRequest());// 2012-02-20
// objects.put("6catalogDao", SpringBeanUtil.getBean("6catalogDao"));// 2012-05-17
// 注册类的方法
JsonRpcService.registerAllMethods(objects.get(DEFAULT_OBJ_KEY)
.getClass());
JsonRpcService.registerAllMethods(CatalogDaoImpl.class);// 2012-02-27
JsonRpcService
.registerAllMethods(objects.get("httpRequest").getClass());
JsonRpcService.registerAllMethods(CounterDaoImpl.class);// 2012-03-05
// 建立隐射 2012-02-28
// JsonRpcService.mapTo(CatalogDaoImplWrapper.class,
// CatalogDaoImpl.class);
// // 测试
// KeyValueService s = (KeyValueService) o;
// System.out.println("s.getKeyValueClusterCaller()!=null:"
// + (s.getKeyValueClusterCaller() != null));
}
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
// System.out.println(json);
String json = request.getParameter("jsonrpcContent");
// 用参数指定是否转码 2012-08-14
if ("utf-8".equals(request.getParameter("charset")))
json = java.net.URLDecoder.decode(json, "utf-8");
if (!tools.Validate.isBlank(json)) {
tools.web.ServletUtil.addJsonContentType(
(HttpServletResponse) response, "GBK");
// 2012-04-16 by liusan.dyf
User u = Global.getCurrentUser();
if (u != null) {
json = tools.StringUtil.replaceAll(json, X, u.getUserName());
}
// key
String objKey = request.getParameter("obj");
if (tools.Validate.isBlank(objKey))
objKey = DEFAULT_OBJ_KEY;
// 得到调用的对象
Object invokeObject = null;
invokeObject = objects.get(objKey);
// 开始调用
if (invokeObject != null) {
String result = JsonRpcService.invokeToString(invokeObject,
json, true);
// JsonRpcService.invoke(o, json, true);
response.getWriter().append(result);
return;
} else {
String error = JsonRpcService
.toJsonRpcErrorResult(0, -32602,
"错误的objKey");
response.getWriter().append(error);
}
// System.out.println(result);
} else
chain.doFilter(request, response);
}
? JsonRpcService类中的大致处理方法:
private static final ObjectMapper jsonMapper; static { jsonMapper = Json.getObjectMapper(); } public static String invokeToString(Object obj, String request, boolean autoRegister) { InvokeResultList invokeResults = invokeBatch(obj, request, autoRegister);// 执行批量请求 List<String> jsonStringList = new ArrayList<String>(invokeResults .getResults().size()); try { List<SingleInvokeResult> list = invokeResults.getResults(); // 循环拼接json for (SingleInvokeResult item : list) { if (item.getResult() instanceof JsonRpcError) { jsonStringList.add(item.getResult().toString());// 响应error } else {// 正确的响应 Map<String, Object> m = toJsonRpcResultMap(item.getId(), item.getResult()); jsonStringList.add(jsonMapper.writeValueAsString(m)); } } // 输出json if (!invokeResults.isBatch()) return jsonStringList.get(0); else { int left = jsonStringList.size(); StringBuilder builder = new StringBuilder(); builder.append("["); for (String s : jsonStringList) { left--; builder.append(s); if (left > 0) builder.append(","); } builder.append("]"); return builder.toString(); } } catch (Exception e) { LOGGER.error(e); } return null; }
? 废话有点多,下面兄弟我直接上了个分页的能亲眼看见的例子好了,方便大家在web项目开发的过程中参考使用,对你有帮助的时候也顶一下(见附件,如果附件没有了就给我发站内信)。
?? 二: 对web开发,在分页的时候需要把从数据库查到的list数据在页面中也table的方式展现出来,这是又可以用到一个模版插件:
<script type="text/javascript" src="../libs/template/trimpath-template.js"></script>
该插件在附件中已经含有。
其使用方式:
<html> <head> <script type="text/javascript" src="../libs/template/trimpath- template.js"></script> </head> <body> <div class="board"> <table class="niceTab" id="mainBody"> </table> </div> <div id="pagination" style="margin-top:5px;float: right;"></div> 。。。 <textarea name="template_jst_list" id="template_jst_list" style="display: none;" cols="0" rows="0"> <tr> <th scope="col">节点名称</th> <th scope="col">类型路径</th> <th scope="col">修改者</th> <th scope="col">修改时间</th> <th scope="col">操作</th> </tr> {for p in list} <tr id="tr_@{hashCode(p.id)}"> <!--<td class="name1">@{p.code}</td>--> <td class="name2"><a href="../casedetails.action?riskId=@{p.id}" target="_self">@{p.title}</a></td> <td class="name3">@{p.pathData}</td> <td class="name4">@{p.lastOperator}</td> <td class="name6">@{toDate(p.lastUpdateTime)}</td> <td class="name5"><a href="../casemodify.action?riskId=@{p.id}" target="_self">编辑</a> <span onclick="delCase('@{p.id}')"><a href="#">删除</a></span></td> </tr> {/for} </textarea> </body> </html> <script type="text/javascript"> function showTable(){ $. ajax( ajax的post参数和返回参数的xxx的配置,如果没有设置返回的参数类型的限制,就会按照java中设置的response写入的MIME类型。 function(data){ $("#pagination").show(); $("#mainBody").html(""); if(data.list.length!=0){ $("#mainBody").append( TrimPath.processDOMTemplate ("template_jst_list", data)); }else{ $("#mainBody").append("<tr id='noData'><td colspan='5' align='center'><strong style='color: red'>没找到数据!</strong></td></tr>"); $("#pagination").hide(); } }); } // 转换时间 function toDate (timestamp){ var d = new Date(timestamp); return d.format("yyyy-MM-dd hh:mm"); // return d.getFullYear() + "-" + (d.getMonth()+1) + "-" + d.getDate()+" "+d.getHours()+":"+d.getMinutes(); } </script>
?其中有一个时间转换的js函数toDate(。。)也很常用。
用一个封转好的jsonrpc的方式删除表格中的某一条具体值:
?
function delCase(code){
var url = "/s.do?obj=catalogDaoImpl";
if(!confirm("亲,您确定删除这个节点?")) return;
sendJsonrpcRequestSync(url,"POST","deleteItemOnCondition",{catalogCode:code},
null,function(data){
if(data==1){
alert("该风险下有附件,删除失败!");
}else if(data==2){
alert("该风险下有关联处罚案例库,删除失败!");
}else{
$("#tr_"+hashCode
(code)).remove();
}
},null);
}
? 上面的hashCode函数在util.js中已经定义,util.js中定义了很多有用的js函数,可以在需要的时候引用,能增加开发的效率(已经在附件中包含)。
?
?
?
?
?
?