项目目录结构如下:
(1)index.html
<!DOCTYPE html>
<html>
<head>
<title>用户管理</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="ext4/resources/css/ext-all.css">
<script type="text/javascript" src="ext4/ext-all.js"></script>
<script type="text/javascript" src="ext4/ext-lang-zh_CN.js"></script>
<script type="text/javascript" src="app.js"></script>
</head>
<body>
</body>
</html>
(2)app.js
Ext.Loader.setConfig({enabled:true}); Ext.application({
requires: ['Ext.container.Viewport'],
name: 'AM', appFolder: 'app', controllers: [
'Users'
], launch: function(){
Ext.create('Ext.container.Viewport',{
layout: 'fit',
items: {
xtype: 'userlist'
}
});
}
});
(3)controller/Users.js
Ext.define('AM.controller.Users', {
extend: 'Ext.app.Controller', models:[
'User'
], stores: [
'Users'
], views:[
'user.List',
'user.Edit',
'user.Add'
], init: function(){
this.control({
'viewport > userlist': {
itemdblclick: this.editUser
},
'useredit button[action=update]':{
click: this.updateUser
},
'userlist button[action=add]':{
click: this.addUser
},
'useradd button[action=create]':{
click: this.createUser
},
'userlist button[action=destroy]':{
click: this.destroyUser
}
});
}, addUser: function(button){
var view = Ext.widget('useradd');
view.show();
}, createUser: function(button){
var win = button.up('window');
var form = win.down('form'); Ext.Ajax.request({
url:'/extjstest/UserServlet.do',
params: form.getValues(),
method: 'POST',
callback: function(options, success, response) {
if(success){
win.close();
var responsejson = Ext.JSON.decode(response.responseText);
var no = responsejson.no;
Ext.Msg.confirm('操作结果!', responsejson.msg, function(btn) {
if (no === '1' && btn === 'yes') {
Ext.widget('userlist').store.load();
}
});
}else{
Ext.Msg.confirm('操作失败!', '请求超时或网络故障,错误编号:[' + response.status + ']是否要重新发送?', function(btn) {
if (btn === 'yes') {
Ext.Ajax.request(options);
}
});
}
}
});
}, destroyUser: function(button){
var rowSelectionModel = Ext.widget('userlist').getSelectionModel();
if (rowSelectionModel.hasSelection()) {
var records = rowSelectionModel.getSelection();
var len = records.length;
var idarr = new Array();
for(var i=0;i<len;i++){
idarr[i] = records[i].get('id');
}
var idarrjson = Ext.JSON.encode(idarr);//转换成JSON格式 Ext.MessageBox.confirm('提示信息', '<font color=red>您确定删除所选中的信息?</font>', showResult);
function showResult(btn){
if(btn==='yes'){
Ext.Ajax.request({
url: '/extjstest/UserServlet.do',
params: {
oprtype: 'destroy',
idarrjson: idarrjson
},
method: 'POST',
callback: function(options, success, response) {
if (success) {
var responsejson = Ext.JSON.decode(response.responseText);
var no = responsejson.no;
Ext.Msg.confirm('操作结果提醒!', responsejson.msg, function(btn) {
if (no === '1' && btn === 'yes') {
Ext.widget('userlist').store.load();
}
});
} else {
Ext.Msg.confirm('操作失败!', '请求超时或网络故障,错误编号:[' + response.status + ']是否要重新发送?', function(btn) {
if (btn === 'yes') {
Ext.Ajax.request(options);
}
});
}
}
});
}
}
}else{
Ext.MessageBox.alert('信息提示', '<font color=red>请选择您要删除的行!</font>');
}
}, editUser: function(grid,record){
var view = Ext.widget('useredit');
view.down('form').loadRecord(record);
}, updateUser: function(button){
var win = button.up('window');
var form = win.down('form'); var record = form.getRecord(); //取出表单关联的 record
var values = form.getValues(); //取出表单中的值 record.set(values); //把表单值设置到对应的 record win.close();//关闭窗口 //此种方式更新数据将采用json数据格式把参数发送到服务端,服务端接受此种参数时不能使用
//传统的request.getParameter()的方式,其参数是通过Request Payload传递给服务端的,
//服务端只能通过读入request的字符流,通过解析json来获取参数值
this.getUsersStore().sync();
}
});
(4)model/User.js
Ext.define('AM.model.User', {
extend: 'Ext.data.Model',
fields: ['id','name','email']
});
(5)store/Users.js
Ext.define('AM.store.Users', {
extend: 'Ext.data.Store',
model: 'AM.model.User',
autoLoad: true,//Store生成之后会自动让Proxy加载数据 proxy: {
type: 'ajax',
api:{
read: '/extjstest/UserServlet.do?oprtype=read',
update: '/extjstest/UserServlet.do?oprtype=update'
},
reader: {//reader负责将response解码成store能理解的形式
type: 'json',
root: 'users'
}
}
});
(7)view/user/List.js
Ext.define('AM.view.user.List', {
extend: 'Ext.grid.Panel',
alias: 'widget.userlist', title: '用户列表',
columnLines: true,
loadMask: true, store: 'Users', selModel: Ext.create('Ext.selection.CheckboxModel',{ checkOnly :true }),//复选框 initComponent: function(){
this.columns = [
Ext.create('Ext.grid.RowNumberer', {text: '行号', width: 35}),
{header:'ID', dataIndex:'id', flex:1},
{header:'NAME', dataIndex:'name', flex:1},
{header:'EMAIL', dataIndex:'email', flex:1}
]; this.dockedItems = [
{
xtype: 'toolbar',
dock: 'top',
items: [
{
xtype: 'button',
text: '添加',
action:'add'
},
'-',
{
xtype: 'button',
text: '删除',
action: 'destroy'
}
]
}
]; this.callParent(arguments);
}
});
(8)view/user/Add.js
Ext.define('AM.view.user.Add', {
extend: 'Ext.window.Window',
alias: 'widget.useradd', title: '添加用户',
layout: 'fit',
autoShow: true, initComponent: function(){
this.items = [
{
xtype: 'form',
items: [
{
xtype: 'textfield',
name: 'name',
fieldLabel: '名称'
},
{
xtype: 'textfield',
name: 'email',
fieldLabel: '邮箱'
},
{
xtype: 'hidden',
name: 'oprtype',
value: 'create'
}
]
}
]; this.buttons = [
{
text: '保存',
action: 'create'
},
{
text: '取消',
scope: this,
handler: this.close
}
]; this.callParent(arguments);
}
});
(9)view/user/Edit.js
Ext.define('AM.view.user.Edit', {
extend: 'Ext.window.Window',
alias: 'widget.useredit', title: '编辑用户信息',
layout: 'fit',
autoShow: true, initComponent: function(){
this.items = [
{
xtype: 'form',
items: [
{
xtype: 'hidden',
name: 'id'
},
{
xtype: 'textfield',
name: 'name',
fieldLabel: '姓名'
},
{
xtype: 'textfield',
name: 'email',
fieldLabel: '邮箱'
}
]
}
]; this.buttons = [
{
text:'保存',
action:'update'
},
{
text: '取消',
scope: this,
handler: this.close
}
]; this.callParent(arguments);
}
});
(10)UserServlet.java
package com.yan.servlet; import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
*
* @author y
*/
public class UserServlet extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8"); String oprtype = request.getParameter("oprtype");
StringBuilder sb = new StringBuilder(); try (PrintWriter out = response.getWriter()) {
Gson gson = new Gson();
switch(oprtype){
case "read":
sb.append("{\"users\":")
.append(gson.toJson(getUserList(), new TypeToken<List<User>>(){}.getType()))
.append("}");
break;
case "update":
StringBuilder json = new StringBuilder();
String line;
BufferedReader reader = request.getReader();
while((line=reader.readLine())!=null){
json.append(line);
}
User user = gson.fromJson(json.toString(), User.class);
System.out.println("id:"+user.id);
System.out.println("name:"+user.name);
System.out.println("email:"+user.email); sb.append("{\"no\":\"1\",\"msg\":\"成功\"}");
break;
case "create":
System.out.println("name:"+request.getParameter("name"));
System.out.println("email:"+request.getParameter("email")); sb.append("{\"no\":\"1\",\"msg\":\"成功\"}");
break;
case "destroy":
String idarrjson = request.getParameter("idarrjson");
List<String> ids = gson.fromJson(idarrjson, new TypeToken<List<String>>(){}.getType());
System.out.println(ids);
sb.append("{\"no\":\"1\",\"msg\":\"成功\"}");
break;
} out.print(sb.toString());
out.close();
}
} List<User> getUserList(){
List<User> list = new ArrayList<>();
User user = new User(100,"张三","zhangsan@123.com");
list.add(user);
user = new User(101,"李四","lisi@123.com");
list.add(user);
user = new User(102,"王五","wangwu@123.com");
list.add(user);
user = new User(103,"王五","wangwu@123.com");
list.add(user);
return list;
} public static final class User{
public int id;
public String name;
public String email;
public User(int id,String name,String email){
this.id = id;
this.name = name;
this.email = email;
}
} @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
} @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
} }
效果图: