2.1. 部署運行pss啓動無錯javascript
2.1.1. 記得打勾php
2.1.2. 修改server.xmlcss
2.2. 修改datagrid.jsp集成easyuihtml
2.2.1. 拷貝原來easyui1 webapp下面的easyui文件夾java
2.2.2. 拷貝原來easyui1 webapp下面的common.jsp裏面的內容到datagrid.jspnode
2.2.3. 先寫linkbutton,看有無效果jquery
2.3. 修改execute方法變成分頁查詢web
2.3.1. 原來的代碼沒有分頁ajax
// 專門返回json數據json
// 應該是發出一個ajax請求 http://localhost/datagrid_json.action
public String json() throws Exception {
// <param name="root">#map</param>
// 只拿前10條
putContext("map", employeeService.getAll().subList(0, 10));
// <result name="json" type="json">
return "json";
}
2.3.2. 今天的代碼有分頁
@Controller
@Scope("prototype")
public class DatagridAction extends BaseAction {
@Autowired
private IEmployeeService employeeService;
// 沒有提供getter,setter方法
private EmployeeQuery baseQuery = new EmployeeQuery();
// 顯示一個頁面,不添加數據
// http://localhost/datagrid.action
@Override
public String execute() throws Exception {
return SUCCESS;
}
// 專門返回json數據
// 應該是發出一個ajax請求 http://localhost/datagrid_json.action
public String json() throws Exception {
// <param name="root">#map</param>
PageList<Employee> pageList = employeeService.findPageByQuery(baseQuery);
putContext("map", pageList);
// <result name="json" type="json">
return "json";
}
public EmployeeQuery getBaseQuery() {
return baseQuery;
}
public void setBaseQuery(EmployeeQuery baseQuery) {
this.baseQuery = baseQuery;
}
}
2.4. 處理輸出的json數據
http://localhost:8080/datagrid_json.action
2.4.1. 輸出多餘的數據
2.4.2. 減小json數據輸出
若是輸出的json數據比較少,提升訪問性能
對一些easyui datagrid不須要的屬性進行不輸出:只須要2個屬性total,rows
在Employee標註註解
@JSON(serialize = false)//roles屬性json不輸出
public Set<Role> getRoles() {
return roles;
}
在PageList標註註解
@JSON(serialize = false) 不少屬性都不輸出
public int getTotalPage()
@JSON(name = "rows") 更名
public List getData() {
@JSON(name = "total") 更名
public int getTotalCount() {
2.4.3. 只輸出須要的數據
2.5. 修改datagrid.jsp顯示json數據
直接從
http://localhost:8888/demo/main/index.php?plugin=Application&theme=default&dir=ltr&pitem=
2.5.1. 拷貝datagrid的代碼替換剛纔linkbutton
<table id="dg" title="員工管理" class="easyui-datagrid" fit="true"
style="width: 700px; height: 250px" url="/datagrid_json.action"
toolbar="#toolbar" pagination="true" rownumbers="true"
fitColumns="true" singleSelect="true">
<thead>
<tr>
<th field="id" width="50">編號</th>
<th field="username" width="50">用戶名</th>
<th field="password" width="50">密碼</th>
<th field="age" width="50">年齡</th>
<th field="email" width="50">Email</th>
<th field="headImage" width="50">頭像</th>
<th field="department" width="50">部門名稱</th>
</tr>
</thead>
</table>
2.5.2. 顯示效果
2.6. 進行數據格式化-和原來自定義插件寫的代碼相似
2.6.1. 原來自定義插件代碼
2.6.2. 怎樣看easyui的文檔來處理部門,頭像的效果
2.6.3. 今天的代碼
function ageFormat(value,row,index) {
// 單元格formatter(格式化器)函數,帶3個參數:
// value:字段值。
// row:行記錄數據。
// index: 行索引。
// console.debug(value);
// console.debug(row);
// console.debug(index);
return value < 30 ? '<font color="red">' + value + '</font>' : value;
}
2.6.4. 效果
2.7. 處理分頁
2.7.1. 分析
json數據中已經輸出了總的記錄條
第一次提交參數:沒有分頁條件,默認提交
page 1
rows 10
第二次提交參數,手動改變切換到第二頁
page 2
rows 10
2.7.2. 結論
page==baseQuery.currentPage,當前頁碼
rows=baseQuery.pageSize,一頁顯示的條數
2.7.3. 修改DatagridAction
添加easyui兼容代碼,getter,setter
private int page=1;
private int rows=10;
public String json() throws Exception {
baseQuery.setCurrentPage(page);
baseQuery.setPageSize(rows);
PageList pageList = employeeService.findByQuery(baseQuery);
putContext("map", pageList);
return "jsonResult";// 不能返回頁面,只能返回json視圖===jsonResult
}
2.8. datagrid組件經常使用屬性
<script type="text/javascript">
//會自動由easyui注入3個參數
// value當前列的值,row行的json數據,index索引
function deptFormat(value, row, index) {
// console.debug(value);
// console.debug(row);
// console.debug(index);
return value ? value.name : "";
}
function imageFormat(value, row, index) {
return value ? "<img src='"+value+"'/>" : "沒有頭像";
}
function ageFormat(value, row, index) {
return value < 30 ? "<font color='red'>" + value + "</font>" : value;
}
</script>
<title>Insert title here</title>
</head>
<body>
<!-- url="ajax方式獲取json數據" -->
<!-- pagination="true"顯示分頁條 -->
<!-- rownumbers="true" 顯示行號,數據的索引號 -->
<!-- fitColumns="true" 列佔滿-->
<!-- singleSelect="true"只能選擇一行 -->
<!-- pageSize : 每頁顯示多少條數據; 默認值10-->
<!-- pageList array 在設置分頁屬性的時候 初始化頁面大小選擇列表。 [10,20,30,40,50],pageList="[10,20,50]" -->
<!-- width="10",若是值是同樣的,平分datagrid的寬度,最右邊預留滾動條的寬度,若是此值比其餘小,少佔點寬度 -->
<!-- formatter,對列進行格式化輸出,值寫的是函數名稱或者匿名函數 -->
<!-- 在那個列添加sortable="true",額外提交2個參數, 1.order desc,asc;2.sort:age -->
<!-- hidden boolean 若是爲true,則隱藏列,可是在row行json存在id的· -->
<table id="dg" title="員工管理" class="easyui-datagrid" fit="true"
url="/datagrid_json.action" toolbar="#toolbar" pagination="true"
rownumbers="true" fitColumns="true" singleSelect="true">
<thead>
<tr>
<th field="id" width="10" hidden="true">編號</th>
<th field="username" width="50">用戶名</th>
<th field="password" width="50">密碼</th>
<th field="age" formatter="ageFormat" width="50" sortable="true">年齡</th>
<th field="email" width="50">Email</th>
<th field="headImage" formatter="imageFormat" width="50">頭像</th>
<th field="department" formatter="deptFormat" width="50">部門名稱</th>
</tr>
</thead>
</table>
2.9. 處理datagrid上面工具條
<table toolbar="#toolbar"
不要把下面的div放到table的內部,放到外部
<div id="toolbar">
<a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-add" onclick="addEmployee()">添加</a>
<a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-edit" onclick="editEmployee()">修改</a>
<a href="javascript:void(0)" class="easyui-linkbutton" iconCls="icon-remove" onclick="deleteEmployee()">刪除</a>
</div>
function addEmployee() {
console.debug("add");
}
function editEmployee() {
console.debug("edit");
}
function deleteEmployee() {
console.debug("delete");
}
3.1. 後臺
// 從datagrid頁面發出的ajax請求:刪除方法,單個對象{},集合[{},{}]
public String delete() throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
try {
employeeService.delete(id);
map.put("success", true);
} catch (Exception e) {
map.put("success", false);
map.put("msg", "異常:" + e.getMessage());
}
putContext("map", map);
return "json";// 不能返回頁面,只能返回json視圖===json
}
3.2. 前臺
function deleteEmployee() {
console.debug("delete");
//調用datagrid組件的getSelected方法當前選中的只是一行
//getSelections none 返回全部被選中的行,當沒有記錄被選中的時候將返回一個空數組。
//getSelected none 返回第一個被選中的行或若是沒有選中的行則返回null。
var row = $('#dg').datagrid('getSelected');
if (!row) {//沒有選中
//提示信息
// $.messager.show({
// title : '提示信息',
// msg : '刪除前必須選擇一行',
// showType : 'fade',
// style : {
// right : '',
// bottom : ''
// }
// });
$.messager.alert('提示信息','刪除前必須選擇一行!','info');
return;
}
//row表明選中行的json數據
console.debug(row);
$.get("/datagrid_delete.action?id="+row.id,function(data){
if(data.success){//刪除成功
//從新加載datagrid:調用datagrid組件的reload方法
//reload param 重載行。等同於'load'方法,可是它將保持在當前頁。
$('#dg').datagrid('reload');//相似於原來的$("#domainFrom").submit()
}else{//刪除失敗
$.messager.alert('錯誤提示',data.msg,'error');
}
});
}
4.1. 彈出對話框
modal="true" 定義是否將窗體顯示爲模式化窗口
<div id="dlg" class="easyui-dialog" style="width: 350px" closed="true"
buttons="#dlg-buttons">
<form id="fm" method="post" novalidate
style="margin: 0; padding: 20px 50px">
<input type="hidden" name="id">
<div
style="margin-bottom: 20px; font-size: 14px; border-bottom: 1px solid #ccc">員工信息</div>
<table>
<tr>
<td>用戶名:</td>
<td><input name="username" class="easyui-textbox"
required="true" style="width: 100%"></td>
</tr>
<tr>
<td>密碼:</td>
<td><input name="password" class="easyui-textbox"
required="true" style="width: 100%"></td>
</tr>
<tr>
<td>年齡:</td>
<td><input name="age" class="easyui-textbox" required="true"
style="width: 100%"></td>
</tr>
<tr>
<td>郵箱:</td>
<td><input name="email" class="easyui-textbox" data-options="validType:'email'"
style="width: 100%"></td>
</tr>
</table>
</form>
</div>
<div id="dlg-buttons">
<a href="javascript:void(0)" class="easyui-linkbutton c6"
iconCls="icon-ok" onclick="saveEmployee()" style="width: 90px">保存</a> <a
href="javascript:void(0)" class="easyui-linkbutton c8"
iconCls="icon-cancel" onclick="javascript:$('#dlg').dialog('close')"
style="width: 90px">取消</a>
</div>
4.2. 後臺
// 從datagrid頁面發出的ajax請求:保存方法
public String save() throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
try {
employeeService.saveOrUpdate(employee);
map.put("success", true);
} catch (Exception e) {
map.put("success", false);
map.put("msg", "異常:" + e.getMessage());
}
putContext("map", map);
return "jsonResult";// 不能返回頁面,只能返回json視圖===jsonResult
}
// 不須要prepareInput方法,由於不作頁面跳轉,不作頁面回顯,前臺回顯:xxxForm.form('load',rows);
// public void prepareInput() throws Exception {
// }
// java.lang.IllegalArgumentException: attempt to create saveOrUpdate event
// with null entity
// 沒有employee = new Employee();
public void prepareSave() throws Exception {
if (id == null) {
employee = new Employee();
} else {
employee = employeeService.get(id);//修改的時候防止數據丟失的
}
}
//顯示添加頁面
function addEmployee() {
console.debug("add");
//先把對話框裏面的表單清空
$('#fm').form('clear');
//彈出一個對話框,修改對話框的標題
$('#dlg').dialog('open').dialog('setTitle','添加員工');
}
4.3. 修改保存
4.3.1. 前臺js
//顯示回顯,修改頁面
function editEmployee() {
console.debug("edit");
var row = $('#dg').datagrid('getSelected');
if (!row) {//沒有選中
$.messager.alert('提示信息', '修改前必須選擇一行!', 'info');
return;
}
//row表明選中行的json數據
console.debug(row);
//先把對話框裏面的表單清空
$('#fm').form('clear');
//讀取記錄填充到表單中。數據參數能夠是一個字符串或一個對象類型row,若是是字符串則做爲遠程URL,不然做爲本地記錄。
$('#fm').form('load',row);
//彈出一個對話框,修改對話框的標題
$('#dlg').dialog('open').dialog('setTitle','修改員工');
}
4.3.2. 後臺action
public void prepareSave() throws Exception {
if (id == null) {// 處理新增
employee = new Employee();// 實例化,把employee放到棧頂
} else {// 處理保存
employee = employeeService.get(id);// 實現數據不丟失
}
}
4.4. easyui內置驗證插件
4.4.1. 單獨寫屬性
class="easyui-validatebox" required="true" validType="email"
使用data-options
class="easyui-validatebox" data-options="required:true,validType:'email'"
必填+email格式
4.4.2. 源碼分析
<script type="text/javascript" src="easyui/locale/easyui-lang-zh_CN.js"></script>
$.map(['validatebox','textbox','passwordbox','filebox','searchbox',
'combo','combobox','combogrid','combotree',
'datebox','datetimebox','numberbox',
'spinner','numberspinner','timespinner','datetimespinner'], function(plugin){
if ($.fn[plugin]){
$.fn[plugin].defaults.missingMessage = '該輸入項爲必輸項';
}
});
if ($.fn.validatebox){
$.fn.validatebox.defaults.rules.email.message = '請輸入有效的電子郵件地址';
$.fn.validatebox.defaults.rules.url.message = '請輸入有效的URL地址';
$.fn.validatebox.defaults.rules.length.message = '輸入內容長度必須介於{0}和{1}之間';
$.fn.validatebox.defaults.rules.remote.message = '請修正該字段';
}}
5.1. 效果
5.2. Main2Action
/**
*
* easyui後臺主頁
*
*/
@Controller
@Scope("prototype")
public class Main2Action extends BaseAction {
// 顯示後臺主頁
@Override
public String execute() throws Exception {
return SUCCESS;
}
}
5.3. struts.xml
<action name="main2_*" class="main2Action" method="{1}">
<result>/WEB-INF/views/main2.jsp</result>
</action>
5.4. 頁面
<body class="easyui-layout">
<div data-options="region:'north'" style="height: 50px">1北,圖片logo</div>
<div data-options="region:'south',split:true" style="height: 50px;">2南,底部,公司版權信息</div>
<div data-options="region:'east',split:true" title="East"
style="width: 180px;">3東,通常不要</div>
<div data-options="region:'west',split:true" title="West"
style="width: 150px;">4西,菜單</div>
<div
data-options="region:'center',title:'Main Title',iconCls:'icon-ok'">
5,中,主體內容</div>
</body>
5.5. 顯示左側菜單
5.5.1. 顯示靜態菜單
拷貝easyui1項目裏面11.組件三要素-事件.jsp案例部份內容
而且拷貝json文本文件:tree.text
5.5.2. 後臺
@Autowired
private IMenuService menuService;
// 從後臺主頁發出ajax請求,獲取菜單的json數據
public String menu() throws Exception {
Employee employee = (Employee) ActionContext.getContext().getSession().get(USER_IN_SESSION);
List<Menu> list = menuService.findByLoginUserId(getId());
putContext("map", list);
return "json";
}
5.5.3. Menu.java
@JSON(serialize = false)
public Menu getParent() {
@JSON(name = "iconCls")
public String getIcon() {
@JSON(name = "text")
public String getName() { 必須重啓電腦
5.5.4. 顯示動態菜單
5.6. 使用iframe顯示點擊頁面的內容
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<!-- 默認easyui主題樣式 -->
<link rel="stylesheet" type="text/css"
href="easyui/themes/default/easyui.css">
<!-- 圖標樣式 -->
<link rel="stylesheet" type="text/css" href="easyui/themes/icon.css">
<!-- 顏色的樣式 -->
<link rel="stylesheet" type="text/css" href="easyui/themes/color.css">
<!-- 必須先引入jQuery的核心js -->
<script type="text/javascript" src="easyui/jquery.min.js"></script>
<!-- 在引入easyui的核心js:只須要引入一個就ok -->
<script type="text/javascript" src="easyui/jquery.easyui.min.js"></script>
<!-- 最後引入easyui的國際化的js-->
<script type="text/javascript" src="easyui/locale/easyui-lang-zh_CN.js"></script>
<script type="text/javascript">
$(function() {
$('#menu')
.tree(
{
animate : true,
url : 'main2_menu.action',
onClick : function(node) {
// 在用戶點擊的時候提示
//alert(node.text);
var url = node.url;
if (url) {
//點擊node的名稱
var text = node.text;
//location.href = url;
//exists which 代表指定的面板是否存在,'which'參數能夠是選項卡面板的標題或索引。
if ($('#tt').tabs('exists', text)) {
//顯示點擊的選項卡
//select which 選擇一個選項卡面板,'which'參數能夠是選項卡面板的標題或者索引。
$('#tt').tabs('select', text)
} else {
//增長選項卡
$('#tt')
.tabs(
'add',
{
title : text,
//content: '<div class="easyui-panel" style="padding:10px" href="'+url+'">Content</div>',只能加載body的內容
content : '<iframe src="'
+ url
+ '" frameborder="0" style="width:99%;height:99.5%"></iframe>',
closable : true
});
}
}
}
});
});
</script>
<title>xxxCRM項目小組</title>
</head>
<body class="easyui-layout">
<div data-options="region:'north'" style="height: 80px">北:logo標記</div>
<div data-options="region:'south',split:true" style="height: 50px;">南,底部,公司認證信息</div>
<div data-options="region:'east',split:true" title="East"
style="width: 100px;">東,信息提示</div>
<div data-options="region:'west',split:true" title="West"
style="width: 130px;">
西,菜單
<ul id="menu"></ul>
</div>
<div data-options="region:'center'">
<div id="tt" class="easyui-tabs" fit="true">
<div title="主體" style="padding: 10px">
<p style="font-size: 14px">jQuery EasyUI framework helps you
build your web pages easily.</p>
<ul>
<li>easyui is a collection of user-interface plugin based on
jQuery.</li>
<li>easyui provides essential functionality for building
modem, interactive, javascript applications.</li>
<li>using easyui you don't need to write many javascript code,
you usually defines user-interface by writing some HTML markup.</li>
<li>complete framework for HTML5 web page.</li>
<li>easyui save your time and scales while developing your
products.</li>
<li>easyui is very easy but powerful.</li>
</ul>
</div>
</div>
</div>
</body>
</html>
6.1. 後臺的Action添加方法
注入部門service
public String deptTree() throws Exception {
// <param name="root">#map</param>
putContext("map", departmentService.getAll());
// 必須返回json視圖
// <result name="json" type="json">
return "json";
}
6.2. 頁面下拉列表
<!-- valueField: 'id'傳遞到後臺的值, textField: 'text',頁面看到的內容 -->
<input id="deptCombobox" class="easyui-combobox" name="department.id"
data-options="
url:'datagrid_deptTree.action',
valueField: 'id',
textField: 'name'
">
6.3. 回顯editEmployee
//表單裏面的名稱是department.id,row行json裏面也有row.department.id
//row:{"age":11,"department":{"id":2,"name":"採購部"},"email":"","id":108,"password":"11","username":"111155"}
//額外處理下拉列表
if(row.department){//若是原來有部門
//row["department.id"]=row.department.id;
$('#deptCombobox').combobox('setValue', row.department.id);
}
6.4. prepareSave
public void prepareSave() throws Exception {
if (id == null) {
employee = new Employee();
} else {
employee = employeeService.get(id);//修改的時候防止數據丟失的
employee.setDepartment(null);
}
}
6.5. Save方法
public String save() throws Exception {
Map<String, Object> map = new HashMap<String, Object>();
map.put("success", false);
try {
System.err.println(employee.getDepartment());// not null
System.err.println(employee.getDepartment().getId());// null
Department department = employee.getDepartment();
if (department != null && department.getId() == null) {
employee.setDepartment(null);
}
employeeService.save(employee);
map.put("success", true);
map.put("msg", "保存成功");
} catch (Exception e) {
map.put("msg", "保存出現異常:" + e.getMessage());
}
// <result name="json" type="json">
putContext("map", map);
return "json";// 返回json視圖
}
panel,linkbutton,tree(標準的json字符串,兼容easyui:text,iconCls,children)
dialog,datagrid,form
layout,tabs
8.1. 重點
8.2. 難點
{"msg":"
保存出現異常
:Target object must not be null; nested exception is java.lang.IllegalArgumentException: Target object must not be null","success":false}
若是在進行修改的時候
public void prepareSave() throws Exception {
if (id == null) {// 處理新增
employee = new Employee();// 實例化,把employee放到棧頂
} else {// 處理保存
employee = employeeService.get(id);// 實現數據不丟失
}
}