本文共 11937 字,大约阅读时间需要 39 分钟。
一 ext.direct 有点象DWR,但跨平台,根据后台暴露的功能生成前台的JS 1)支持类库下载:directjngine http://code.google.com/p/directjngine 2)配置服务端功能 比如首先formaction处理表单的读取和提交 @DirectMethod public ExtFormDirectResult loadProductServer(String productId){ ExtFormDirectResult result = new ExtFormDirectResult(); if("001".equals(productId)){ //获取产品信息 Product product = new Product(); product.setProductName("笔记本"); product.setIntroduction("本产品美观实用,售后服务优秀。"); //将产品信息放入结果对象中 result.setData(product); result.setSuccess(true); }else{ //设置错误信息 result.setErrorMessage("读取的产品id不存在"); result.setSuccess(false); } return result; } /** * 表单提交处理方法 * @param params 表单参数集合 * @param files 文件集合 * @return 结果对象 */ @DirectFormPostMethod public ExtFormDirectResult submitProductServer(Map<String,String> params, Map<String, FileItem> files){ ExtFormDirectResult result = new ExtFormDirectResult(); //获取表单参数 String productName = params.get("productName"); if("笔记本".equals(productName)){ result.setSuccess(true); }else{ result.addError("productName", "产品名称必须是:笔记本"); //设置错误信息 result.setErrorMessage("提交产品名称错误"); result.setSuccess(false); } return result; } 配置WEB.XML <!-- DirectJNgine servlet --> <servlet> <servlet-name>DjnServlet</servlet-name> <servlet-class> com.softwarementors.extjs.djn.servlet.DirectJNgineServlet</servlet-class> <init-param> <param-name>providersUrl</param-name> <param-value>djn/directprovider</param-value> </init-param> <init-param> <param-name>apis</param-name> <param-value>form,data</param-value> </init-param> <init-param> <param-name>form.apiFile</param-name> <param-value>form/api.js</param-value> </init-param> <init-param> <param-name>data.apiFile</param-name> <param-value>data/api.js</param-value> </init-param> <init-param> <param-name>form.apiNamespace</param-name> <param-value>Ext.form.app</param-value> </init-param> <init-param> <param-name>data.apiNamespace</param-name> <param-value>Ext.data.app</param-value> </init-param> <init-param> <param-name>form.classes</param-name> <param-value> com.sample.ext4.direct.form.action.FormAction </param-value> </init-param> <init-param> <param-name>data.classes</param-name> <param-value> com.sample.ext4.direct.data.action.DataAction </param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>false</param-value> </init-param> <init-param> <!-- 指定gson的配置类 --> <param-name>gsonBuilderConfiguratorClass</param-name> <param-value>com.sample.ext4.direct.config.GsonBuilderConfiguratorCustom</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>DjnServlet</servlet-name> <url-pattern>/djn/directprovider/*</url-pattern> </servlet-mapping> 3 前端脚本引入 <script type="text/javascript" src="../../form/api.js"></script> Ext.onReady(function(){ Ext.QuickTips.init();//初始化提示; //注册api Ext.Direct.addProvider( Ext.form.app.REMOTING_API ); var productForm = Ext.create('Ext.form.Panel',{ title:'在表单中使用Direct技术', width : 300, frame : true, fieldDefaults:{//统一设置表单字段默认属性 labelSeparator :':',//分隔符 labelWidth : 80,//标签宽度 width : 270,//字段宽度 msgTarget : 'under' }, api: { load: FormAction.loadProductServer,//加载数据的远程方法 submit: FormAction.submitProductServer//提交数据的远程方法 }, paramOrder: ['productId'], renderTo: Ext.getBody(), bodyPadding: 5, defaultType: 'textfield',//设置表单字段的默认类型 items:[{ fieldLabel:'产品名称', name : 'productName' },{ fieldLabel:'产品简介', name : 'introduction', xtype : 'textarea' }], buttons:[{ text : '数据加载', handler : loadData },{ text : '数据提交', handler : submitData }] }); //表单数据加载 function loadData(){ productForm.form.load({ params:{productId:'001'},//以产品id作为参数 success:function(form,action){//加载成功的处理函数 Ext.Msg.alert('提示','表单数据加载成功'); }, failure:function(form,action){//加载失败的处理函数 Ext.Msg.alert('提示','表单数据加载失败<br>失败原 因:'+action.result.errorMessage); } }); } //表单数据提交 function submitData(){ productForm.form.submit({ success:function(form,action){//加载成功的处理函数 Ext.Msg.alert('提示','表单数据提交成功'); }, failure:function(form,action){//加载失败的处理函数 Ext.Msg.alert('提示','表单数据提交失败<br>失败原 因:'+action.result.errorMessage); } }); } }); 二 图形部分 1) ext.draw为ext js 4中的新的图形包 2)绘制基本图形 Ext.onReady(function() { //创建图形组件 Ext.create('Ext.draw.Component', { width: 600, height: 400, viewBox : false,//使图形保持原始大小 renderTo: 'container', items: [{ type: 'rect',//矩形 x: 50,//矩形左上角的横坐标 y: 20,//矩形左上角的纵坐标 height: 150,//矩形的高度 width: 150,//矩形的宽度 stroke : "#CCFFFF",//边线的填充颜色 fill : "#FF99CC"//填充的颜色 },{ type: 'circle',//圆形 x: 280,//圆心的横坐标 y: 95,//圆心的纵坐标 radius: 70,//半径 stroke : "#FF0000",//边线的填充颜色 fill : "#FFCC66"//填充的颜色 },{ type: 'ellipse',//椭圆形 x: 430,//圆心的横坐标 y: 95,//圆心的纵坐标 radiusX:50,//水平半径 radiusY:30,//垂直半径 stroke : "#000000",//边线的填充颜色 fill : "#CC00FF"//填充的颜色 }] }); }); 3)线性渐变 //创建图形组件 Ext.create('Ext.draw.Component', { width: 600, height: 400, viewBox : false,//使图形保持原始大小 renderTo: 'container', //定义线性渐变 gradients: [{ id: 'grad1',//渐变id angle: 90,//角度 stops: {//渐变层次 0: { color: '#FF0000'//红色 }, 50: { color: '#00FF00'//绿色 }, 100: { color: '#0000FF'//蓝色 } } },{ id: 'grad2',//渐变id angle: 135,//角度 stops: {//渐变层次数组 0: { color: '#CC33FF'//黑色 }, 100: { color: '#FFFFFF'//白色 } } },{ id: 'grad3',//渐变id angle: 45,//角度 stops: {//渐变层次数组 50: { color: '#000000'//黑色 } } }], items: [{ type: 'rect',//矩形 x: 50,//矩形左上角的横坐标 y: 20,//矩形左上角的纵坐标 height: 150,//矩形的高度 width: 150,//矩形的宽度 stroke : "#CCFFFF",//边线的填充颜色 fill: 'url(#grad1)'//使用渐变填充 },{ type: 'circle',//圆形 x: 280,//圆心的横坐标 y: 95,//圆心的纵坐标 radius: 70,//半径 stroke : "#FF0000",//边线的填充颜色 fill: 'url(#grad2)'//使用渐变填充 },{ type: 'ellipse',//椭圆形 x: 430,//圆心的横坐标 y: 95,//圆心的纵坐标 radiusX:50,//水平半径 radiusY:30,//垂直半径 stroke : "#000000",//边线的填充颜色 fill : "url(#grad3)"//使用渐变填充 }] 三 CHART图表 1)坐标轴 Ext.onReady(function(){ var dataStore = new Ext.data.JsonStore({ fields:['name', 'percentage'], data: [ {name :'小于30岁', percentage : 2}, {name :'30-40岁', percentage : 4}, {name :'40-50岁', percentage : 3}, {name :'50岁以上', percentage : 3} ] }); Ext.create('Ext.panel.Panel', { title : '员工年龄分布图', width: 400, height: 400, renderTo: Ext.getBody(), layout: 'fit', items : [{ xtype : 'chart', store : dataStore, axes: [{ type: 'Numeric',//配置坐标轴类型为数值坐标 dashSize : 10,//坐标轴前导线条长度,默认为3 position: 'left',//配置坐标在左侧 fields: ['percentage'],//指定坐标对应的字段 title: '百分比',//配置坐标轴标题 grid: { //奇数行 odd : { opacity: 1,//不透明 fill: '#FFFF99',//表格内的填充色 stroke: '#FF3300',//表格线颜色 'stroke-width': 0.5//表格线宽度 }, //偶数行 even : { opacity: 0,//透明 stroke: '#6600CC',//表格线颜色 'stroke-width': 0.5//表格线宽度 } }, majorTickSteps : 10,//主区间数 minorTickSteps : 3//副区间数 }, { type: 'Category',//配置坐标轴类型为目录坐标 position: 'bottom',//配置坐标在底部 fields: ['name'],//指定坐标对应的字段 grid : true,//启用表格 title: '年龄段'//配置坐标轴标题 }], series : [{ type: 'line', axis: 'left', xField: 'name',//横轴字段 yField: 'percentage'//纵轴字段 }] }] }); }); 2) 饼状图 Ext.onReady(function(){ var dataStore = new Ext.data.JsonStore({ fields:['age', 'percentage', 'growing'], data: [ {age :'小于30岁', percentage : 10, growing : 35}, {age :'30-40岁', percentage : 40, growing : 30}, {age :'40-50岁', percentage : 30,growing : 30}, {age :'50岁以上', percentage : 20, growing : 30} ] }); Ext.create('Ext.panel.Panel', { title : '员工年龄分布图', width : 400, height : 400, renderTo: Ext.getBody(), layout : 'fit', items : [{ xtype : 'chart', store : dataStore, animate : true,//是否启用动画效果 legend : { position : 'bottom' //图例位置 }, shadow : true, series : [{ type : 'pie',//图表序列类型 field : 'percentage',//对应饼状图角度的字段名 showInLegend : true,//是否显示在图例当中 colorSet : ['#FFFF00','#669900','#FF6699','#66CCCC'],//颜色 label : { field : 'age',//标签字段名 contrast : true, color : '#FFFF00', renderer : function(v){//自定义标签渲染函数 return "["+v+"]"; }, display : 'middle',//标签显现方式 font : '18px "Lucida Grande"'//字体 }, highlight : { segment : { margin: 10 //空白区域宽度 } }, tips : { trackMouse : true, //是否启用鼠标跟踪 width : 50, height : 28, renderer : function(storeItem) {//自定义渲染函数 var title = storeItem.get('percentage') + '%'; this.setTitle(title); } } }] }] }); }); 3 BAR条型图 Ext.onReady(function(){ var dataStore = new Ext.data.JsonStore({ fields:['ageRange', 'proportion', 'growing'], data: [ {ageRange :'小于30岁', proportion : 10, growing : 35}, {ageRange :'30-40岁', proportion : 40, growing : 30}, {ageRange :'40-50岁', proportion : 30,growing : 30}, {ageRange :'50岁以上', proportion : 20, growing : 30} ] }); Ext.create('Ext.panel.Panel', { title : '员工年龄分布图', width: 400, height: 400, renderTo: Ext.getBody(), layout: 'fit', items : [{ xtype : 'chart', store : dataStore, axes: [{ type: 'Numeric', position: 'bottom', minimum : 0,//数轴最小值 maximum : 60,//数轴最大值 fields: ['proportion','growing'],//同时展示2个数据 title: '百分比' }, { type: 'Category', position: 'left', fields: ['ageRange'], title: '年龄段' }], legend : { position : 'bottom' //图例位置 }, series : [{ type: 'bar', gutter : 20,//配置条形图矩形之间的间距 groupGutter : 10,//配置条形图相邻两组矩形之间的距离是矩形宽度的10% //column : true,//配置条形图的模式(true垂直false水平) xPadding : 10,//配置左右坐标轴距图形的空隙 yPadding : 20,//配置上下坐标轴距图形的空隙 axis: 'bottom', xField: 'ageRange',//左侧坐标轴字段 yField: ['proportion','growing'],//底部坐标轴字段 title : ['人员比例','增长速度'],//配置图例字段说明 label : { field : ['proportion','growing'],//标签字段名 display : 'outside',//标签显现方式 font : '18px "Lucida Grande"',//字体 renderer : function(v){//自定义标签渲染函数 return v + '%'; } } }] }] }); }); 4 柱状图 Ext.onReady(function(){ var dataStore = new Ext.data.JsonStore({ fields:['ageRange', 'proportion', 'growing'], data: [ {ageRange :'小于30岁', proportion : 10, growing : 35}, {ageRange :'30-40岁', proportion : 40, growing : 30}, {ageRange :'40-50岁', proportion : 30,growing : 30}, {ageRange :'50岁以上', proportion : 20, growing : 30} ] }); Ext.create('Ext.panel.Panel', { title : '员工年龄分布图', width: 400, height: 400, renderTo: Ext.getBody(), layout: 'fit', items : [{ xtype : 'chart', store : dataStore, axes: [{ type: 'Numeric', position: 'left', minimum : 0,//数轴最小值 maximum : 60,//数轴最大值 fields: ['proportion','growing'],//同时展示2个数据 title: '百分比' }, { type: 'Category', position: 'bottom', fields: ['ageRange'], title: '年龄段' }], legend : { position : 'bottom' //图例位置 }, series : [{ type: 'column', axis: 'left', xField: 'ageRange',//x轴字段 yField: ['proportion','growing'],//y轴字段 title : ['人员比例','增长速度'],//配置图例字段说明 label : { field : ['proportion','growing'],//标签字段名 display : 'outside',//标签显现方式 font : '18px "Lucida Grande"',//字体 renderer : function(v){//自定义标签渲染函数 return v + '%'; } } }] }] }); }); 5 图表中使用主题 items : [{ xtype : 'chart', store : dataStore, //theme: 'Base',//基本主题 //theme: 'Blue',//蓝色主题 theme: 'Category1',//彩色主题1 (有1-30个) 6 自定义主题 //创建自定义图表主题类Ext.chart.theme.Cust Ext.define('Ext.chart.theme.Cust', { //扩展基本主题 extend : 'Ext.chart.theme.Base', constructor: function(config) { Ext.chart.theme.Base.prototype.constructor.call(this, Ext.apply({ //统一定义坐标轴样式 axis: { stroke: '#444',//指定坐标轴轴线颜色 'stroke-width': 1//0表示无轴线,1表示有轴线 }, //定义左侧坐标标签样式 axisLabelLeft: { fill: '#FF0000',//指定标签字体填充颜色 font: '12px "Lucida Grande", sans-serif', padding: 3,//指定标签距离坐标轴的间距 renderer: function(v) { return v; }//标签渲染函数 }, //axisLabelTop:{}顶部左边标签样式 //axisLabelRight:{}顶部左边标签样式 //axisLabelBottom:{}顶部左边标签样式 //自定义底部坐标标题样式 axisTitleBottom: { font: 'bold 18px "Lucida Grande", sans-serif',//指定坐标轴标题字体 fill: '#6600CC'//指定坐标轴标题文字填充色 }, //axisTitleTop:{}顶部坐标标题样式 //axisTitleRight:{}右侧坐标标题样式 //axisTitleLeft:{}左侧坐标标题样式 //统一定义图表序列边线样式 series: { 'stroke-width': 0//0表示无边线,1表示有边线 }, //按顺序自定义图表序列颜色,colorSet属性会覆盖该主题 colors: [ "#FF0000", "#FFFF00"], //按顺序定义图表序列填充染色,colors 优先级高于seriesThemes seriesThemes: [{ fill: "#66FF00",//fill 优先级高于stroke stroke:"#FF3300" }, { fill: "#66FFFF", stroke:"#FF33FF" }], //统一自定义图表节点标志样式,markerCfg:属性会覆盖该主题 marker: { stroke: '#FFFF00',//指定标志边线颜色 fill: '#660000',//指定标志填充色 radius: 10//指定标志半径 }, //按顺序自定义图表节点标志样式,markerCfg:属性会覆盖该主题 //markerThemes的优先级高于marker中的配置 markerThemes: [{ fill: "#115fa6",//指定标志填充色 type: 'circle' //指定标志类型 }, { fill: "#94ae0a", type: 'cross' }, { type: 'plus' }] }, config)); } });转载地址:http://nwnf.baihongyu.com/