基于easyui的CMS系统的小结
Posted yuhaiqiang_123
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于easyui的CMS系统的小结相关的知识,希望对你有一定的参考价值。
前言
这两天摸索了使用easyui完成一个小的页面,从数据库中读取一部分数据,以表格形式分页显示在前台。总体上easyui很方便的,但是有一些小的细节不注意的话会让你耽误一点时间。
1.使用步骤
1.加载js
<span style="white-space:pre"> </span><link rel="stylesheet" type="text/css" href=<span style="color:#ff0000;">"js</span>/jquery-easyui-1.4.4/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href=<span style="color:#ff0000;">"js</span>/jquery-easyui-1.4.4/themes/icon.css">
<link rel="stylesheet" type="text/css" href=<span style="color:#ff0000;">"</span><span style="background-color: rgb(192, 192, 192);"><span style="color:#ff0000;">js</span>/</span>jquery-easyui-1.4.4/demo/demo.css">
<script type="text/javascript" src="<span style="color:#ff0000;">js/</span>jquery-easyui-1.4.4/jquery.min.js"></script>
<script type="text/javascript" src="<span style="color:#ff0000;">js/</span>jquery-easyui-1.4.4/jquery.easyui.min.js"></script>
2.注意
我用红色标出的部分,由于我没有注意,在js前加了一个“/”反斜线,所以这些文件一直没有加载上,但是我用ctrl+鼠标, 可以定位到这些文件,我用的 是 myeclipse8.5,而且去掉斜线后,反而无法定位到制定文件了,貌似很矛盾,很纠结。 js,所在目录在webroot下。但是还是去掉斜线,否则部署后找不到这些js文件,至于原因不详。 下 下面个问题更神奇了,我定义了一个eaysui的table控件,一直显示不出来漂漂亮亮的格式,原因是我所加的eaysui的table在 我之前定义的普通table之中。一开始还是使不得删除之前的界面。一狠心删掉了。结果显示正常了。而且比以前更好看了。3.定义组件
我定义的是datagrid也就是数据表格,先来一段代码 <div><span style="white-space: pre;"> <table id="listdata" title="My Users" <span style="color:#ff0000;"><strong><em>class="easyui-datagrid"</em></strong></span> style="width:100%;height:100%"
<span> </span>>
<span> </span><thead>
<span> </span><tr>
<span> </span><th field="download_id">下载ID</th>
<span> </span><th field="user_id" width="10%">用户ID</th>
<span> </span><th field="username" width="15%">用户昵称</th>
<span> </span><th field="resource_name" width="30%">资源名称</th>
<span> </span><th field="resource_label" width="15%">用户标签</th>
<span> </span><th field="resource_download_times" width="5%">下载次数</th>
<span> </span><th field="time" width="25%">时间</th>
<span> </span></tr>
<span> </span></thead>
<span> </span></table>
<span> </span><!-- <div id="toolbar">
<span> </span><a href="#" class="easyui-linkbutton" iconCls="icon-add" plain="true" οnclick="newUser()">New User</a>
<span> </span><a href="#" class="easyui-linkbutton" iconCls="icon-edit" plain="true" οnclick="editUser()">Edit User</a>
<span> </span><a href="#" class="easyui-linkbutton" iconCls="icon-remove" plain="true" οnclick="destroyUser()">Remove User</a>
<span> </span></div> -->
<span> </span><div id="detailsMsg" <span style="color:#ff0000;"><strong><em>class="easyui-dialog" </em></strong></span>style="background-color: #eee;padding:20px;">
<span> </span></div>
</span></div><div><span style="white-space: pre;">
</span></div>
注意我加上红色的部分,就是一个声明。声明为一个数据表格,一个为对话框。展示下效果
还很不错的。有点意思了。但是数据是不会平白无故跑上去的,至少得加个url吧。还有添加,修改,删除在哪里加的? 好,继续上源代码
function createListData()
$('#listdata').datagrid(
title:'文件下载列表' ,
iconCls:'icon-edit',//图标
striped: true,
<span style="color:#ff0000;"><strong><em>/*url:"DownloadList!queryByPage.action",*/</em></strong></span>
nowrap:"true",
loadMsg:"数据正在加载,请稍候",
fitColumns:"true",
singleSelect:"false",
collapsible:false,//是否可折叠的
fit: true,//自动大小
remoteSort:false,
idField:'fldId',
rownumbers:true,//行号
pagination:true,<em><strong><span style="color:#ff0000;">//分页</span></strong></em>
border:true,
onDblClickRow:function(rowIndex,rowData)
openDetailsMsgDia(rowData);
,
/*onBeforeLoad:function(param)
,*/
frozenColumns:[[
field:'ck',checkbox:true
]],
toolbar: [
text: '添加',
iconCls: 'icon-add',
handler: function()
openDialog("add_dialog","add");
, '-',
text: '修改',
iconCls: 'icon-edit',
handler: function()
openDialog("add_dialog","edit");
, '-',
text: '删除',
iconCls: 'icon-remove',
handler: function()
deleteRecord();
],
);
$("#listdata").datagrid('hideColumn', 'download_id');//设置隐藏域
//设置分页控件
var p = $('#listdata').datagrid('getPager');
$(p).pagination(
pageSize: 5,//每页显示的记录条数,默认为10
pageList: [5,10,15],//可以设置每页记录条数的列表
beforePageText: '第',//页数文本框前显示的汉字
afterPageText: '页 共 pages 页',
displayMsg: '当前显示 from - to 条记录 共 total 条记录'
,<span style="color:#ff0000;">onSelectPage:function(pageNumber,pageSize)
getData(pageNumber,pageSize);
</span>
);
<span style="color:#ff0000;">getData(1,5);</span>
这个js函数就是初始化datagrid的。
我捡重点的说一下
1.url <span style="color:#ff0000;"><strong><em><span style="white-space:pre"> </span>url:"DownloadList!queryByPage.action"</em></strong></span>
<span style="color:#ff0000;"><strong><em><span style="white-space:pre"> </span>加上这句,在datagrid初始化时,就会自动去执行这个url,也就是去执行这个action,后面可以通过&加参数</em></strong></span>
<em><span style="color:#ff0000;"> </span>至于数据如何传回来。以什么格式。一会说</em>
2.分页实现
<span style="color:#ff0000;"><strong><em><span style="white-space:pre"> </span>url:"DownloadList!queryByPage.action"</em></strong></span>
<span style="color:#ff0000;"><strong><em><span style="white-space:pre"> </span>加上这句,在datagrid初始化时,就会自动去执行这个url,也就是去执行这个action,后面可以通过&加参数</em></strong></span>
<em><span style="color:#ff0000;"> </span>至于数据如何传回来。以什么格式。一会说</em>
pagination:true,这句话制定,这个table具有分页功能。
同时需要初始化分页
var p = $('#listdata').datagrid('getPager');
$(p).pagination(
pageSize: 5,//每页显示的记录条数,默认为10
pageList: [5,10,15],//可以设置每页记录条数的列表
beforePageText: '第',//页数文本框前显示的汉字
afterPageText: '页 共 pages 页',
displayMsg: '当前显示 from - to 条记录 共 total 条记录'
,<span style="color:#ff0000;">onSelectPage:function(pageNumber,pageSize)
getData(pageNumber,pageSize);
</span>
);
listdata也就是datagrid数据表格的id.定义分页:
那么分页是否还需要做什么呢。需要后台的支持,也就是说,每一次更改页码,都要向后台传即将显示的页数, 以及每页的个数,同时,由于后台每次向前台只传送了一页的数据,那么前台如何知道总页数,总条数是多少呢 ,同样后台需要告诉前台,总条数多少。由于每页个数由前台指定,所以后台不用传总页数。那么数据交换的格 式是什么。json
上后台代码:
<span style="white-space:pre"> </span>System.out.println("pageSize:"+pageSize+"pageNumber"+pageNumber);
List list = downloadService.queryByPage(pageNumber, pageSize);
HttpServletResponse response = ServletActionContext.getResponse();
response.setCharacterEncoding("UTF-8");
PrintWriter out;
try
//json
out = response.getWriter();
<span style="white-space:pre"> </span> <span style="font-size:24px;color:#ff0000;">JsonConfig jsonConfig = new JsonConfig();
// 设置javabean中日期转换时的格式
jsonConfig.registerJsonValueProcessor(Date.class,
new JsonDateValueProcessor("yyyy-MM-dd HH:mm:ss"));
// 获取json数组
JSONArray jsonList = JSONArray.fromObject(list, jsonConfig);
JSONObject jsonObject = new JSONObject();
</span><span style="font-size:24px;color:#3333ff;">jsonObject.put("total", downloadService.getCountsAll());
jsonObject.put("rows", jsonList);</span><span style="font-size:24px;color:#ff0000;">
//jsonObject.
out.print(jsonObject);</span>
out.flush();
out.close();
catch (IOException e)
//
e.printStackTrace();
先看蓝色的部分:total指定总条数。rows指定 表格显示的数据
那么其他代码是干啥用的。可以看到其中有date.class 这个date就是java.util.date,为什么单独把他提出来,因为这个类在转换成json时,和其他的基础类,不一样 他可以分割成 年,时区,月,天,周,小时,等等非常麻烦的json格式 而我想要的只是简单的 yyyy-MM-dd HH:mm:ss .怎么办呢。json为我们提供了自定义解析的 方法。实现 JsonValueProcessor这个接口
package util;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Locale;
//import java.util.Arrays.ArrayList;
import java.util.Date;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonBeanProcessor;
import net.sf.json.processors.JsonValueProcessor;
import demo.entities.User;
import demo.entities.view.download;
*/public class JsonDateValueProcessor implements JsonValueProcessor
private String datePattern = "yyyy-MM-dd HH:mm:ss";// 日期格式
public JsonDateValueProcessor()
super();
// 构造函数
public JsonDateValueProcessor(String format)
super();
this.datePattern = format;
public Object processArrayValue(Object value, JsonConfig jsonConfig)
// TODO Auto-generated method stub
return process(value);
public Object processObjectValue(String key, Object value,
JsonConfig jsonConfig)
// TODO Auto-generated method stub
return process(value);
private Object process(Object value)
<span style="color:#ff0000;"> try
if (value instanceof Date)
SimpleDateFormat sdf = new SimpleDateFormat(datePattern,
Locale.UK);
return sdf.format((Date) value);
return value == null ? "" : value.toString();
catch (Exception e)
return "";
</span>
public String getDatePattern()
return datePattern;
public void setDatePattern(String datePaterns)
this.datePattern = datePaterns;
public static void main(String[] args)
ArrayList list = new ArrayList();
download download = new download();
download.setTime(new Date());
list.add(download);
JsonConfig jsonConfig = new JsonConfig();
// 设置javabean中日期转换时的格式
jsonConfig.registerJsonValueProcessor(Date.class,
new JsonDateValueProcessor("yyyy-MM-dd HH:mm:ss"));
// 获取json数组
JSONArray jsonArray = JSONArray.fromObject(list, jsonConfig);
System.out.println(jsonArray.toString());
通过这个自定义的类实现转换。这样date转化就更方便了,可以看到jsonArray直接可以将一个bean的list转化为json,
json的键名就是javabean的属性名称。实现原理是java反射机制。很简单有兴趣的可以去看看。
这样就可以通过respose.getWirter,输出到前台,ajax就可以接受了。注意:刚才我们第一步为每一列定义的属性名一定要和 json传回的
键值对的键名对应。否则不会显示。完成了吗?还没有。分页功能还没有完成。可以看到我的createListData()函数最后还有一个
getData()函数调用,而且貌似还有这么一句话
<span style="color:#ff0000;">onSelectPage:function(pageNumber,pageSize)
getData(pageNumber,pageSize);
</span>
这个函数是在页数改变时,easyui自动调用的,getdata()是我们自定义的函数。没改变一下页码,我们都要向后台要数据
function getData(pageNumber,pageSize)
$.ajax(
dataType:'json',
url:'DownloadList!queryByPage.action',
<span style="color:#ff0000;">data:pageSize:pageSize,pageNumber:pageNumber,</span>
type:'post',
success:function(data,status)
<span style="color:#ff0000;">$('#listdata').datagrid('loadData',data);
$("#listdata").datagrid('reload');</span>
,
error:function(data,status)
$.messager.alert('系统提示','对不起,登录超时请重新登录'+data+status,'error',function()
/*location.href = '/index.jsp';*/
);
);
我们是用ajax异步获取数据。
这个data中就有我们需要的从后台传回来的json。然后,loaddata加载,reload重新加载。显示给用户。如果失败则调用错误处理函数, 告诉用户出现什么错误。我加红的地方,是我们从前台向后台传json的格式。
为什么我要在createListData()处调用一遍getData()呢,是因为如果指定url,每一次加载,包括分页加载 无法指定页数,和每页个数, 所以放弃了url,而是采用,初始化的时候,调用getData(1,5),这个1指的是页数,5指的是每页的个数。而后每一次改编页码都是调 用onselectpages(),这个函数。这样就实现了分页功能。非常稳定,后台和前台充分解耦。我之前自定义的分页实现。很是麻烦,老 是出错。考虑很对逻辑。什么下一次传哪个页码,向前向后能不能翻页,跳转到指定页码怎么翻,好繁琐。前台界面很乱,后台的 逻辑与前台交叉。维护相当困难。一个url需要写好多次。哎呀,烦死个人了。我写完之后从来不敢看我写的代码,我害怕我又发现哪里有错误。 有个这个控件,再也不用担心分页了。
3.实现双击记录 弹出对话框显示详细信息:
onDblClickRow:function(rowIndex,rowData)
openDetailsMsgDia(rowData);
,
初始化datagrid时指定了这个属性。当双击记录时调用自定义函数
function openDetailsMsgDia(rowData)
//alert();
$('#detailsMsg').html("<br><br><font size='3' color='black'>"+
"下载记录ID:"+rowData.download_id+"<br><br>"+
"用户名:"+rowData.username+"<br><br>"+
"用户ID:"+rowData.user_id+"<br><br>"+
"文件名称:"+rowData.resource_name+"<br><br>"+
"文件类别:"+rowData.resource_label+"<br><br>"+
"下载次数:"+rowData.resource_download_times+"<br><br>"+
"下载时间:"+rowData.time+"<br>"+
"</font>");
//alert();
//$.messager.alert($('#detailsMsg').html());
<pre name="code" class="html">$('#detailsMsg').dialog('open');
//alert();
这个detailMsg就是前面定义的
<div id="detailsMsg"
class="easyui-dialog"
style="background-color: #eee;padding:20px;">
</div>
这个div,通过
$('#detailsMsg').dialog('open');
弹出这个窗体。同时可以看到<pre name="code" class="html">onDblClickRow:function(rowIndex,rowData)
openDetailsMsgDia(rowData);
,
这有两个参数,index,和rowData,分别代表单击的 记录的行号,和数据。rowData是数组,通过rowData,属性名,获取该行该属性列的数据。
然后就完了吗?没有。如何关闭,如何初始化这个dialog呢,你只是告诉他里面有啥东西,但是这个对话框是什么样子,在哪显示还需要我们定义
function createDetailsMsg()
$('#detailsMsg').dialog(
title:'详细信息',
width:400,
height:400,
left: 250,
top:10,
collapsible:true,
closed:true
,buttons:[
text:'关闭',
iconCls:'icon-cancel',
<span style="color:#ff0000;">handler:function()
$('#detailsMsg').dialog('close');
</span>
]
);
那么谁来执行这个初始化函数呢,由window.onload来执行。
window.onload = function()
createDetailsMsg();
createListData();
把对控件的初始化放在这里面.
4.实现删除功能:
toolbar: [
text: '添加',
iconCls: 'icon-add',
handler: function()
openDialog("add_dialog","add");
, '-',
text: '修改',
iconCls: 'icon-edit',
handler: function()
openDialog("add_dialog","edit");
, '-',
text: '删除',
iconCls: 'icon-remove',
<span style="color:#ff0000;"> handler: function()
deleteRecord();
</span>
],
细心地朋友会发现,我们还为这个数据表格定义了几个工具,增删改。就拿最简单的删除做一个例子吧。首先当用户单击删除时,会调用deleteRecord()
</pre><div><pre name="code" class="html">function deleteRecord()
<span style="color:#ff0000;">var row = $("#listdata").datagrid('getSelected');</span>
/*for(var i=0;i<hasSelectedRows.length-1;i++)
idList += hasSelectedRows[i].download_id+",";
idList += hasSelectedRows[hasSelectedRows.length-1].download_id;*/
if(row)
var download_id = row.download_id;
$.messager.confirm('系统提示','你确定要删除这一条记录吗',function(btn)
if(btn)
$.ajax(
dataType:'json',
url:'DownloadList!deleteRecord.action',
data:download_id: download_id,
type:'post',
success:function(data,status)
$.messager.alert('系统提示',data.msg,'info');
$("#tt2").datagrid('reload');
,
error:function(data,status)
$.messager.alert('系统提示',data.msg+status,'warning'/*,function()
location.href = '/index.jsp';
*/);
);
);
else
$.messager.alert('系统提示','请选择要删除的用户','warning');
<span style="color:#ff0000;">var row = $("#listdata").datagrid('getSelected');</span>
获取到用户点击的项的记录。目前只支持单行选择。
然后ajax异步删除,成功后告诉用户data.msg,这个msg同样是json的键名,data是程序员从后台传回的数据,data.msg,就是查找json中,键名为msg的数据。
失败调用失败处理函数
$.messager.alert('系统提示','删除失败,回到登录界面','warning',function()
location.href = '项目名称/index.jsp';
*/);
2.技术没有尽头,步骤永远有后续!
以上是关于基于easyui的CMS系统的小结的主要内容,如果未能解决你的问题,请参考以下文章