海水正蓝

面朝大海,春暖花开
posts - 145, comments - 29, trackbacks - 0, articles - 1
  BlogJava :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

2013年3月1日

在用 extjs editorgridpanel 进行输入编辑的时候, 默认情况下只支持使用 tab 键可以实现焦点切换, 如果想让editorgridpanel 在编辑时通过方向键来实现焦点跳转切换,只需加上以下代码:

//让grid支持方向键盘 by liongis@163.com
Ext.override(Ext.grid.CellSelectionModel, {
    onEditorKey : function(field, e) {
        var smodel 
= this;
        var k 
= e.getKey(), newCell, g = smodel.grid, ed = g.activeEditor;
        
switch(k){
            
case e.TAB:
                 e.stopEvent();
                 ed.completeEdit();
                 
if (e.shiftKey) {
                     newCell 
= g.walkCells(ed.row, ed.col-1-1, smodel.acceptsNav, smodel);
                 } 
else {
                     newCell 
= g.walkCells(ed.row, ed.col+11, smodel.acceptsNav, smodel);
                 }
                 
if (ed.col == 1) {
                     
if (e.shiftKey) {
                         newCell 
= g.walkCells(ed.row, ed.col+1-1, smodel.acceptsNav, smodel);
                     } 
else {
                         newCell 
= g.walkCells(ed.row, ed.col+11, smodel.acceptsNav, smodel);
                     }
                 }
                
break;
            
case e.UP:
                 e.stopEvent();
                 ed.completeEdit();
                 newCell 
= g.walkCells(ed.row-1, ed.col, -1, smodel.acceptsNav, smodel);
                
break;
            
case e.DOWN:
                 e.stopEvent();
                 ed.completeEdit();
                 newCell 
= g.walkCells(ed.row+1, ed.col, 1, smodel.acceptsNav, smodel);
                
break;
            
case e.LEFT:
                 e.stopEvent();
                 ed.completeEdit();
                 newCell 
= g.walkCells(ed.row, ed.col-1-1, smodel.acceptsNav, smodel);
                 
break;
             
case e.RIGHT:
                 e.stopEvent();
                 ed.completeEdit();
                 newCell 
= g.walkCells(ed.row, ed.col+11, smodel.acceptsNav, smodel);
                   
break;
        }
       
if (newCell) {
            g.startEditing(newCell[
0], newCell[1]);
       }
     }
});
注意:这里重写的是:CellSelectionModel ,而不是RowSelectionMode
原文出自:
http://www.cnblogs.com/liongis/p/3284620.html

posted @ 2013-08-27 13:10 小胡子 阅读(310) | 评论 (0)编辑 收藏

序言:

   1.本文摘自网络,看控件命名像是4.0以前的版本,但控件属性配置仍然可以借鉴(不足之处,以后项目用到时再续完善)。

Ext.form.TimeField:

  配置项: 
           maxValue:列表中允许的最大时间 
           maxText:当时间大于最大值时的错误提示信息 
           minValue:列表中允许的最小时间 
           minText:当时间小于最小值时的错误提示信息 
           increment:两个相邻选项间的时间间隔,默认为15分钟 
           format:显示格式,默认为“g:i A”。一般使用“H:i:s” 
                H:带前缀0的24小时 
                 i:带前缀0的分钟 
                s:带前缀0的秒 
           invalidText:当时间值非法时显示的提示信息 
           altFormats:多个时间输入格式组成的字符串,不同的格式之间使用“|”进行分割

Ext.form.FieldSet

    animCollapse:动画折叠,默认为false 
           checkboxToggle:设置是否显示字段集的checkbox选择框,默认为false 
           checkboxName:指定字段集中用于展开或隐藏字段集面板的checkbox的名字,该属性只有在checkboxToggle为true时生效 
           labelWidth:字段标签的宽度,可以级联到子容器 
           layout:布局,默认为form

Ext.form.DateFied

    maxValue:允许选择的最大日期 
           maxText:当日期大于最大值时的错误提示信息 
           minValue:允许选择的最小时间 
           minText:当日期小于最小值时的错误提示信息 
           format:日期显示格式,默认为“m/d/y”,一般使用“Y-m-d” 
               Y:四位年份 
               m:带前缀0的月份 
               d:带前缀0的日期 
               y:两位年份 
               n:不带前缀0的月份 
               j:不带前缀0的日期 
               w:星期的数字,0表示星期日,1代表星期一 
           showToday:是否显示今天按钮,默认为true 
           altFormats:多个日期输入格式组成的字符串,不同的格式之间使用“|”进行分割,默认值为'm/d/Y|n/j/Y|n/j/y|m/j /y|n/d/y|m/j/Y|n/d/Y|m-d-y|m-d-Y|m/d|m-d|md|mdy|mdY|d|Y-m-d' 
           disabledDates:禁止选择的日期组成的数组 
           disabledDatesText:选择禁选日期时显示的提示信息 
           disabledDays:禁止选择的星期组成的数组,0代表星期日,1代表星期一 
           disabledDaysText:选择禁选星期时显示的提示信息 
           invalidText:当日期值非法时显示的提示信息 
     方法: 
           getValue():取得日期值

Ext.form.ComboBox

    displayField:被显示在下拉框中的字段名 
           editable:是否可编辑,默认为true 
           forceSelection:输入值是否严格为待选列表中存在的值。如果输入不存在的值,会自动选择第一个最接近的值。 
           hiddenName:隐藏字段的名字,如果提供该参数则一个隐藏字段将被创建,用来存储所选值,当表单提交时在服务器端可以通过该名字取得列表中的所选值 
           listWidth:下拉列表的宽度 
           minListWidth:下拉列表的最小宽度,默认为70像素 
           loadingText:当下拉框加载数据时显示的提示信息,只有当mode='remote'时才会生效 
           maxHeight:下拉列表框的最大高度,默认为300像素 
           minChars:下拉列表框自动选择前用户需要输入的最小字符数量。mode='remote'默认为4,mode='local'默认为0 
           mode:下拉列表框的数据读取模式。remote读取远程数据,local读取本地数据 
           pageSize:下拉列表框的分页大小。该项设置只在mode='remote'时生效 
           queryParam:查询的名字,默认为'query',将被传递到查询字符串中 
           allQuery:一个发往服务器用来查询全部信息的查询字符串,默认为空字符串'' 
           selectOnFocus:当获得焦点时立刻选择一个已存在的列表项。默认为false,此项只有在editable=true时才会生效 
           store:列表框绑定的数据源 
           transform:将页面中已存在的元素转换为组合框 
           lazyInit:延时初始化下拉列表,默认为true 
           lazyRender:延时渲染,默认为false 
           triggerAction:设置单击触发按钮时执行的默认操作,有效值包括all和query,默认为query,如果设置为all则会执行allQuery中设置的查询 
           typeAhead:设置在输入过程中是否自动选择匹配的剩余部分文本(选择第一个满足条件的),默认为false 
           value:初始化组合框中的值 
           valueField:组合框的值字段 
           valueNotFoundText:值不存在时的提示信息 
           tpl:Ext模板字符串或模板对象,可以通过该配置项自定义下拉列表的显示方式 
     方法: 
           clearValue():清空字段当前值 
           doQuery( String query, Boolean forceAll ): 
           getValue(): 
           getStore(): 
           setValue( String value ):

Ext.from.RadioGroup

    allowBlank: 
           blankText:

Ext.form.Radio;

    getGroupValue(): 
           setValue( value {String/Boolean} ):

Ext.form.CheckboxGroup

     allowBlank:是否允许不选择,默认为true 
           blankText: 
           columns:显示的列数,可选值包括:固定值auto、数值、数组(整数、小数) 
           items:对象数组 
           vertical:是否垂直方向显示对象,默认为false

Ext.form.Checkbox

  boxLabel:复选框的文字描述 
           checked:复选框是否被选择,默认为false 
           handler:当checked值改变时触发的函数,函数包含两个参数:checkbox、checked 
           inputValue: 
     方法: 
           getValue():返回复选框的checked状态 
           setValue( Boolean/String checked ):

Ext.form.NumberField

      allowDecimals:是否允许输入小数,默认为true 
           allowNegative:是否允许输入负数,默认为true 
           baseChars:输入的有效数字集合,默认为'0123456789' 
           decimalPrecision:数字的精度,默认保留小数点后2位 
           decimalSeparator:十进制分隔符,默认为'.' 
           maxValue:允许输入的最大数值 
           maxText:超过最大值之后的提示信息 
           minValue:允许输入的最小数值 
           minText:超过最小值之后的提示信息 
           nanText:输入非有效数值之后的提示信息

Ext.form.TextArea

    preventScrollbars:是否禁止出现滚动条,默认为false

Ext.form.TextField

    allowBlank:是否允许为空,默认为true 
          blankText:空验证失败后显示的提示信息 
          emptyText:在一个空字段中默认显示的信息 
          grow:字段是否自动伸展和收缩,默认为false 
          growMin:收缩的最小宽度 
          growMax:伸展的最大宽度 
          inputType:字段类型:默认为text 
          maskRe:用于过滤不匹配字符输入的正则表达式 
          maxLength:字段允许输入的最大长度 
          maxLengthText:最大长度验证失败后显示的提示信息 
          minLength:字段允许输入的最小长度 
          minLengthText:最小长度验证失败后显示的提示信息 
          regex:正则表达式 
          regexText:正则表达式验证失败后显示的提示信息 
          vtype:验证类型的名字 
               alpha:限制只能输入字母 
               alphanum:限制只能输入字母和数字 
               email 
               url 
          vtypeText:验证失败时的提示信息 
          validator:自定义验证函数 
          selectOnFocus:当字段得到焦点时自动选择已存在的文本,默认为false

Ext.form.Field

    name:字段名 
          value:字段的初始化值 
          disabled:字段是否不可用,默认为false 
          fieldLabel:字段标签说明 
          hideLabel:隐藏字段标签,默认为false 
          labelSeparator:字段标签与字段之间的分隔符,默认为':' 
          labelStyle:字段标签样式 
          inputType:默认为text 
          invalidClass:默认为x-form-invalid 
          invalidText:字段非法文本提示 
          msgTarget:错误信息显示的位置,默认为qtip 
              qtip:显示一个浮动的提示信息 
              title:显示一个浏览器的浮动提示信息 
              under:在字段下方显示一个提示信息 
              side:在字段右边显示一个提示信息 
          readOnly:字段是否只读,默认为false 
          validateOnBlur:字段在失去焦点时被验证,默认为true 
     方法: 
          clearInvalid(): 
          getRawValue() 
          setRawValue( Mixed value ) 
          getValue() 
          setValue( Mixed value ) 
          isDirty():字段值在装载后是否被修改过 
          isValid( Boolean preventMark ):当前字段值是否合法 
          markInvalid( [String msg] ) 
          validate() 
          reset()

Ext.form.FormPanel

items:一个元素或元素数组 
          buttons:一个按钮配置对象的数组,按钮将被添加到表单页脚中 
          buttonAlign:按钮的对齐方式,可选值有left、center、right,默认为center 
          labelWidth:表单标签的宽度 
          labelAlign:表单标签的对齐方式,可选值有left、top、right,默认为left 
          labelSeparator:字段标签与字段之间的分隔符,默认为':' 
          minButtonWidth:按钮的最小宽度,默认为75 
     方法: 
          getForm() : Ext.form.BasicForm 
          load( Object options ) 
          startMonitoring() 
          stopMonitoring()

Ext.form.BaseicForm

    baseParams:传递到请求中的参数 
          method:表单的提交方式,有效值包括GET、POST 
          url:表单默认的提交路径 
          fileUpload:表单是否进行文件上传 
          timeout:表单动作的超时时间,默认为30秒 
          trackResetOnLoad:是否在表单初次创建时清楚数据 
    方法: 
          doAction( String/Object actionName, [Object options] ):执行一个预订的动作,可用选项包括: 
              url:动作提交的路径 
              method:表单的提交方式,有效值包括GET、POST 
              params:传递到请求中的参数 
              headers: 
              success:执行成功后回调的函数,包括两个参数:form和action 
              failure:执行失败后回调的函数,包括两个参数:form和action 
              clientValidation:是否客户端验证 
          clearInvalid():清除表单中所有的无效验证信息 
          findField( String id ):查找表单字段 
          getValues( [Boolean asString] ): 
          isDirty():表单数据是否被更改过 
          isValid():客户端验证是否成功 
          load( Object options ):执行表单读取动作 
          loadRecord( Record record ):从一个数据记录中读取数据到表单中 
          markInvalid( Array/Object errors ):成批设置表单字段为验证无效 
          reset():重置表单 
          setValues( Array/Object values ):成批设置表单字段值 
          submit( Object options ):执行表单提交动作 
          updateRecord( Record record ):持久化表单数据到记录集中

Ext.form.Action

    success:执行成功后回调的函数,包括两个参数:form和action 
          failure:执行失败后回调的函数,包括两个参数:form和action 
          method:表单的提交方式,有效值包括GET、POST 
          params:传递到请求中的参数 
          url:动作提交的路径 
          waitMsg:动作执行时显示的等待信息 
     属性: 
          Action.CLIENT_INVALID:客户端验证错误 
          Action.CONNECT_FAILURE:通信错误 
          Action.LOAD_FAILURE:加载数据时,没有包含data属性的字段被返回 
          Action.SERVER_INVALID:服务端验证错误 
          failureType:错误类型 
          result:包含布尔类型的success属性和其他属性,如{success: true, msg: 'ok'} 
          type:动作类型,可选值有submit和load 
               Ext.form.Action.Submit:返回的信息中要包含一个布尔类型的success属性和一个可选的errors属性 
               Ext.form.Action.Load:返回的信息中要包含一个布尔类型的success属性和一个data属性

Ext.grid.EditorGridPanel

    clicksToEdit:设置点击单元格进入编辑模式的点击次数,默认为2 
            autoEncode:是否自动编码/解码HTML内容,默认为false 
            selModel:默认为Ext.grid.CellSelectionModel 
  
      主要方法: 
            startEditing( Number rowIndex, Number colIndex ):开始编辑指定单元格 
            stopEditing( [Boolean cancel] ):结束编辑操作

Ext.grid.GroupinView

    enableGroupingMenu:是否在表头菜单中进行分组控制,默认为true 
            groupByText:表头菜单中分组控制的菜单文字,默认为'Group By This Field' 
  
            enableNoGroups:是否允许用户关闭分组功能,默认为true 
            showGroupsText:在表头菜单中启用分组和禁用分组的菜单文字,默认为'Show in Groups' 
  
            groupTextTpl:用于渲染分组信息的模板,默认为'{text}',常用的可选值有: 
                  text:列标题:组字段值 
                  gvalue:组字段的值 
                  startRow:组行索引 
  
            enableGrouping:是否对数据分组,默认为true 
            hideGroupedColumn:是否隐藏分组列,默认为false 
            ignoreAdd:在向表格中添加数据时是否刷新表格,默认为false 
            showGroupName:是否在分组行上显示分组字段的名字,默认为true 
            startCollapsed:初次显示时分组是否处于收缩状态,默认为false 
  
      主要方法: 
            collapseAllGroups():收缩所有分组行 
            expandAllGroups():展开所有分组行 
            getGroupId( String value ):根据分组字段值取得组id 
            toggleAllGroups( [Boolean expanded] ):切换所有分组行的展开或收缩状态 
            toggleGroup( String groupId, [Boolean expanded] ):切换指定分组行的展开或收缩状态 


2、Ext.data.GroupingStore 
      groupField:分组字段 

      groupOnSort:是否在分组字段上排序,默认为false 
      remoteGroup:是否远程分组数据,默认为false。如果是远程分组数据,则通过groupBy参数发送分组字段名

Ext.grid.GridPanel:

    store:表格的数据集 
          columns:表格列模式的配置数组,可自动创建ColumnModel列模式 
          autoExpandColumn:自动充满表格未用空间的列,参数为列id,该id不能为0 
          stripeRows:表格是否隔行换色,默认为false 
  
          cm、colModel:表格的列模式,渲染表格时必须设置该配置项 
          sm、selModel:表格的选择模式,默认为Ext.grid.RowSelectionModel 
          enableHdMenu:是否显示表头的上下文菜单,默认为true 
          enableColumnHide:是否允许通过标题中的上下文菜单隐藏列,默认为true 
          loadMask:是否在加载数据时显示遮罩效果,默认为false 
          view:表格视图,默认为Ext.grid.GridView 
          viewConfig:表格视图的配置对象 
  
          autoExpandMax:自动扩充列的最大宽度,默认为1000 
          autoExpandMin:自动扩充列的最小宽度,默认为50 
          columnLines:是否显示列分割线,默认为false 
          disableSelection:是否禁止行选择,默认为false 
          enableColumnMove:是否允许拖放列,默认为true 
          enableColumnResize:是否允许改变列宽,默认为true 
          hideHeaders:是否隐藏表头,默认为false 
          maxHeight:最大高度 
          minColumnWidth:最小列宽,默认为25 
          trackMouseOver:是否高亮显示鼠标所在的行,默认为true 
  
      主要方法: 
          getColumnModel():取得列模式 
          getSelectionModel():取得选择模式 
          getStore():取得数据集 
          getView():取得视图对象 
          reconfigure( Ext.data.Store store, Ext.grid.ColumnModel colModel ):使用一个新的数据集和列模式重新配置表格组件 

2、Ext.grid.Column 
      主要配置项: 
          id:列id 
          header:表头文字 
          dataIndex:设置列与数据集中数据记录的对应关系,值为数据记录中的字段名称。如果没有设置该项则使用列索引与数据记录中字段的索引进行对应 
          width:列宽 
          align:列数据的对齐方式 
  
          hidden:是否隐藏列,默认为false 
          fixed:是否固定列宽,默认为false 
          menuDisabled:是否禁用列的上下文菜单,默认为false 
          resizable:是否允许改变列宽,默认为true 
          sortable:是否允许排序,默认为true 
          renderer:设置列的自定义单元格渲染函数 
                传入函数的参数有: 
                    value:数据的原始值 
                    metadata:元数据对象,用于设置单元格的样式和属性,该对象包含的属性有: 
                          css:应用到单元格TD元素上的样式名称 
                          attr:一个HTML属性定义字符串,例如'style="color:blue"' 
                    record:当前数据记录对象 
                    rowIndex:单元格的行索引 
                    colIndex:单元格的列索引 
                    store:数据集对象 
    
          xtype:列渲染器类型,默认为gridcolumn,其它可选值有booleancolumn、numbercolumn、datecolumn、templatecolumn等 
  
          editable:是否可编辑,默认为true 
          editor:编辑器 
  
          groupName: 
          emptyGroupText: 
          groupable: 

3、Ext.grid.ColumnModel 
      主要配置项: 
          columns:字段数组 
          defaultSortable:是否进行默认排序,默认为false 
          defaultWidth:默认宽度 
  
      主要方法: 
          findColumnIndex( String col ):根据给定的dataIndex查找列索引 
          getColumnById( String id ):取得指定id对应的列 
          getColumnCount( Boolean visibleOnly ):取得列总数 
          getColumnHeader( Number col ):取得列的表头 
          getColumnId( Number index ):取得列id 
          getDataIndex( Number col ):取得列对应的数据字段名 
          getIndexById( String id ):取得列索引 
          getTotalWidth( Boolean includeHidden ) 
          isCellEditable( Number colIndex, Number rowIndex ) 
          isFixed() 
          isHidden( Number colIndex ) 
          setColumnHeader( Number col, String header ) 
          setColumnWidth( Number col, Number width, Boolean suppressEvent ) 
          setDataIndex( Number col, String dataIndex ) 
          setEditable( Number col, Boolean editable ) 
          setEditor( Number col, Object editor ) 
          setHidden( Number colIndex, Boolean hidden ) 
          setRenderer( Number col, Function fn ) 
4、Ext.grid.AbstractSelectionModel 
      主要方法: 
            lock():锁定选择区域 
            unlock():解锁选择区域 
            isLocked():当前选择区域是否被锁定 
5、Ext.grid.CellSelectionModel 
      主要方法: 
            clearSelections( Boolean preventNotify ):清除选择区域 
            getSelectedCell():取得当前选择的单元格,返回一数组,其格式:[rowIndex, colIndex] 
            hasSelection():当前是否有选择区域 
            select( Number rowIndex, Number colIndex, [Boolean preventViewNotify], [Boolean preventFocus], [Ext.data.Record r] ):选择指定单元格 
6、Ext.grid.RowSelectionModel 
      主要配置项: 
            singleSelect:是否单选模式,默认为false,即可以选择多条数据 

      主要方法: 
            clearSelections( [Boolean fast] ):清除所有选择区域 
            deselectRange( Number startRow, Number endRow ):取消范围内的行选择 
            deselectRow( Number row, [Boolean preventViewNotify] ):取消指定行的选择状态 
            each( Function fn, [Object scope] ):遍历所有选择行,并调用指定函数。当前被选行将传入该函数中 
            getCount():得到选择的总行数 
            getSelected():得到第一个被选记录 
            getSelections():得到所有被选记录的数组 
            hasNext():判断当前被选行之后是否还有记录可以选择 
            hasPrevious():判断当前被选行之前是否还有记录可以选择 
            hasSelection():是否已选择了数据 
            isIdSelected( String id ):判断指定id的记录是否被选择 
            isSelected( Number/Record index ):判断指定记录或记录索引的数据是否被选择 
            selectAll():选择所有行 
            selectFirstRow():选择第一行 
            selectLastRow( [Boolean keepExisting] ):选择最后行 
                  keepExisting:是否保持已有的选择 
            selectNext( [Boolean keepExisting] ):选择当前选择行的下一行 
            selectPrevious( [Boolean keepExisting] ):选择当前选择行的上一行 
            selectRange( Number startRow, Number endRow, [Boolean keepExisting] ):选择范围内的所有行 
            selectRecords( Array records, [Boolean keepExisting] ):选择一组指定记录 
            selectRow( Number row, [Boolean keepExisting], [Boolean preventViewNotify] ):选择一行 
                  row:行索引 
            selectRows( Array rows, [Boolean keepExisting] ):选择多行 
                  rows:行索引数组 
7、Ext.grid.CheckboxSelectionModel 
      主要配置项: 
            singleSelect:是否单选模式,默认为false,即可以选择多条数据 
            checkOnly:是否只能通过点击checkbox列进行选择,默认为false 
            sortable:是否允许checkbox列排序,默认为false 
            width:checkbox列的宽度,默认为20 
8、Ext.grid.RowNumberer 
      主要配置项: 
            header:行号列表头显示的内容 
            width:列宽,默认为23
9、Ext.grid.GridView 
      主要配置项: 
            enableRowBody:是否包含行体 
            sortAscText:表格标题菜单中升序的文字描述 
            sortDescText:表格标题菜单中降序的文字描述 
            columnsText:表格标题菜单中列对应的文字描述 
            autoFill:是否自动扩展列以充满整个表格,默认为false 
            forceFit:是否强制调整表格列宽以适用表格的整体宽度,防止出现水平滚动条,默认为false 

      主要方法: 
            focusCell( Number row, Number col ):将焦点移到指定单元格 
            focusRow( Number row ):将焦点移动指定行 
            getCell( Number row, Number col ):取得指定单元格对应的td元素 
            getHeaderCell( Number index ):取得指定表头对应的td元素 
            getRow( Number index ):取得指定行对应的tr元素 
            getRowClass( Record record, Number index, Object rowParams, Store store ):得到附加到表格行上的样式名 
                  record:当前行的数据记录对象 
                  index:当前行的索引 
                  rowParams:渲染时传入到行模板中的配置对象,通过它可以为行体定制样式,该对象只在enableRowBody为true时才生效,可能的属性如下: 
                        body:渲染到行体中的HTML代码片段 
                        bodyStyle:应用到行体tr元素style属性的字符串 
                        cols:应用到行体td元素colspan属性的值,默认为总列数 
                  store:表格数据集 
            refresh( [Boolean headersToo] ):刷新表格组件 
            scrollToTop():滚动表格到顶端

Ext.TabPanel:

  activeTab:初始激活的tab,索引或者id值,默认为none 
      autoTabs:是否自动将带有'x-tab'样式类的div转成tabs添加到TabPanel中,默认为false。 
            当该配置项设为true时,需要设置deferredRender为false,还必须使用applyTo。 
      deferredRender:是否延迟渲染,默认为true。 
      autoTabSelector:默认为'div.x-tab'。 

      resizeTabs:是否可以改变tab的尺寸,默认为false。 
      minTabWidth:tab的最小宽度,默认为30。 
      tabWidth:每个新增加的tab宽度,默认为120。 
      tabTip:tab的提示信息 

      tabPosition:tab位置,可选值有top、bottom,默认为top。 
      enableTabScroll:是否允许Tab溢出时可以滚动,默认为false。 
      closable:tab是否可关闭,默认为false 

      scrollDuration:每次的滚动时长,默认为0.35毫秒。 
      scrollIncrement:每次的滚动步长,默认为100像素。 
      wheelIncrement:每次鼠标滑轮的滚动步长,默认为20像素。 
2、主要方法: 
      activate( String/Panel tab ) 
      getActiveTab():获取当前活动的tab 
      get( String/Number key ):根据组件id或者索引获取组件 
      getItem(String id):根据tab id获取tab 
      setActiveTab( String/Number item ) 
      remove( Component/String component, [Boolean autoDestroy] ) 
      removeAll( [Boolean autoDestroy] )
在使用TabPanel时需要注意: 

 

       1、在创建Ext.TabPanel时deferredRender配置项经常会被忽略。该配置项的默认值是true。true表示只有在用户第一次访问 选项卡时,该选项卡的panel才会被渲染。 所以当我们有可能使用脚本操作选项卡时,谨记将该配置项设置为false。 

       2、在FormPanel中使用TabPanel,如果在TabPanel中不定义deferredRender的值为false,那么,当你使用 Load方法为Form加载数据,或使用setValue为没有激活过的Panel的控件赋值时,将会发生错误。原因是,在默认设置下 deferredRender为true,TabPanel并不会渲染所有Panel上的控件,只有在该Panel被激活时才渲染控件,所以当你为这些控 件设置数据时,将会找不到这些控件,会出现错误。因而,在FormPanel中使用TabPanel,一定要在TabPanel中设置 deferredRender的值为false,强制TabPanel在Layout渲染时同时渲染所有Panel上的控件。




本文转自:
http://www.cnblogs.com/knowledgesea/p/3284404.html

posted @ 2013-08-27 12:42 小胡子 阅读(2132) | 评论 (2)编辑 收藏

     摘要: 前言:最近公司有个Web要发布,但是以前都是由实施到甲方去发布,配置,这几天有点闲,同事让我搞一个一键发布,就和安装软件那样的程序,好让实施直接 配置一下数据库就可以了,然后到网上搜了下,找到一些相关的教程,现在整理了一下,花了一个下午的时间来写笔记,写好了,首先奉献给博客园的小伙伴们,和 大伙儿分享一下,好了,下面进入主题~~~ 1,首先打开VS2010,新建一个项目,如图1-1所示: &nbs...  阅读全文

posted @ 2013-08-27 12:37 小胡子 阅读(1307) | 评论 (0)编辑 收藏

大家可以参考下这个网站http://eoffice.im.fju.edu.tw/phpbb/viewtopic.php?p=28685


1.先启动项目上的h2/bin下的h2.bat或h2w.bat文件,把h2数据库启动起来

2.SSH2框架和h2数据库整合方法
2.1先在数据库下创建 schema目录(相当于一个数据库实例)

  create schema fdrkftcode

目的是解决这种异常org.h2.jdbc.JdbcSQLException: Schema "fdrkftcode" not found; ...

2.2在schema目录下创建表,如创建系统用户表admin
  create table fdrkftcode.admin(
      id int primary key,
      adminname varchar(50),
      username varchar(50),
      userpwd varchar(50),
      adminrights varchar(50),
      createdate datetime,
      usedtimes int,
      lastlogin datetime,
      curstatus int,
      remark varchar(200)
  )
 
3.为了使用hibernate操作h2,需要作如下设置,在sql编辑窗口输入下面这些脚本
对于实体pojo对象的映射,我是用的annotation,关键是id主键的映射,如下:
@Column(name = "ID", nullable = false)

@Id

@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ABC_ID_SEQ")

@SequenceGenerator(name = "ABC_ID_SEQ", sequenceName = "ABC_ID_SEQ")

protected Long id;

 注意这里的GeneratedValue和SequenceGenerator的使用,这属于JPA规范,全部来自javax.persisten

4.配置applicationContext.xml文件,主要有三个地方要注意:
4.1修改连接数据库的JDBC驱动 driverClass的值为org.h2.Driver
4.2修改连接数据库所用的URL字符串 jdbcUrl的值为jdbc:h2:tcp://localhost/~/FDRKFTCODE;MODE=MySQL;AUTO_SERVER=TRUE
4.3修改Hibernate的数据库方言hibernate.dialect为org.hibernate.dialect.H2Dialect

5.h2数据库一些常用操作
5.1帮助命令help
5.2表中某字段重命名  ALTER TABLE  fdrkftcode.admin ALTER COLUMN usepwd rename to userpwd
5.3表中新增字段  ALTER TABLE fdrkftcode.admin ADD IF NOT EXISTS abc varchar(50)
5.4表中删除字段  ALTER TABLE fdrkftcode.admin DROP COLUMN IF EXISTS abc
5.5查找表中记录 SELECT * from fdrkftcode.admin
5.6往表中插入记录 INSERT INTO fdrkftcode.admin VALUES (1,'管理员','admin','admin','10000000000000000000','2013-05-1 00:12:34',3,'2013-05-1 15:32:57',1,'超过级管理员')
5.7修改表中某记录 UPDATE fdrkftcode.admin SET fdrkftcode.admin.adminname='超级管理员' where fdrkftcode.admin.id=1

5.8删除表中某记录 DELETE FROM fdrkftcode.admin WHERE fdrkftcode.admin.id=1


6.下面是我项目的applicationContext.xml配置方法,大家可以参考下

<?xml version="1.0" encoding="UTF-8"?>
<beans
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
    
    <!-- 定义使用C3P0连接池的数据源 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <!-- 指定连接数据库的JDBC驱动 -->
        <property name="driverClass">
             <value>org.h2.Driver</value>
         </property>
        <!-- 连接数据库所用的URL -->
        <property name="jdbcUrl">
            <value>jdbc:h2:tcp://localhost/~/FDRKFTCODE;MODE=MySQL;AUTO_SERVER=TRUE</value>
        </property>
        <!-- 连接数据库的用户名 -->
        <property name="user">
            <value>sa</value>
        </property>
        <!-- 连接数据库的密码 -->
        <property name="password">
            <value></value>
        </property>
        <!-- 设置数据库连接池的最大连接数 -->
        <property name="maxPoolSize">
            <value>50</value>
        </property>
        <!-- 设置数据库连接池的最小连接数 -->
        <property name="minPoolSize">
            <value>5</value>
        </property>
        <!-- 设置数据库连接池的初始化连接数 -->
        <property name="initialPoolSize">
            <value>5</value>
        </property>
        <!-- 设置数据库连接池的连接的最大空闲时间,单位为秒 -->
        <property name="maxIdleTime">
            <value>20</value>
        </property>
    </bean>
    
    <!-- 定义Hibernate的SessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <!-- 依赖注入上面定义的数据源dataSource -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 注册Hibernate的ORM映射文件 -->
        <property name="mappingResources">
            <list>
               <value>com/sungoal/ORM/Admin.hbm.xml</value>
            </list>
        </property>
        <!-- 设置Hibernate的相关属性 -->
        <property name="hibernateProperties">
            <props>
                <!-- 设置Hibernate的数据库方言 -->
                <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
                <!-- 设置Hibernate是否在控制台输出SQL语句,开发调试阶段通常设为true -->
                <prop key="show_sql">true</prop>
                <!-- 设置Hibernate一个提交批次中的最大SQL语句数 -->
                <prop key="hibernate.jdbc.batch_size">50</prop>
            </props>
        </property>
    </bean>
    
     <!--定义Hibernate的事务管理器HibernateTransactionManager -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <!-- 依赖注入上面定义的sessionFactory -->
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    <!-- 装配通用数据库访问类BaseDAOImpl -->    
    <bean id="dao" class="com.sungoal.DAO.BaseDAOImpl">
        <!-- 依赖注入上面定义的sessionFactory -->
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>
    <!-- 部署系统用户管理业务控制器AdminAction -->
    <bean id="adminAction" class="com.sungoal.struts.action.AdminAction" scope="prototype">
        <property name="dao" ref="dao"/>
    </bean>
</beans>

posted @ 2013-08-14 09:33 小胡子 阅读(361) | 评论 (0)编辑 收藏

hibernate.properties

######################
### Query Language ###
######################

## define query language constants / function names

hibernate.query.substitutions yes 'Y', no 'N'


## select the classic query parser

#hibernate.query.factory_class org.hibernate.hql.classic.ClassicQueryTranslatorFactory


#################
### Platforms ###
#################

## JNDI Datasource

#hibernate.connection.datasource jdbc/test
#hibernate.connection.username db2
#hibernate.connection.password db2


## HypersonicSQL

hibernate.dialect org.hibernate.dialect.HSQLDialect
hibernate.connection.driver_class org.hsqldb.jdbcDriver
hibernate.connection.username sa
hibernate.connection.password
hibernate.connection.url jdbc:hsqldb:./build/db/hsqldb/hibernate
#hibernate.connection.url jdbc:hsqldb:hsql://localhost
#hibernate.connection.url jdbc:hsqldb:test

## H2 (www.h2database.com)
#hibernate.dialect org.hibernate.dialect.H2Dialect
#hibernate.connection.driver_class org.h2.Driver
#hibernate.connection.username sa
#hibernate.connection.password
#hibernate.connection.url jdbc:h2:mem:./build/db/h2/hibernate
#hibernate.connection.url jdbc:h2:testdb/h2test
#hibernate.connection.url jdbc:h2:mem:imdb1
#hibernate.connection.url jdbc:h2:tcp://dbserv:8084/sample;
#hibernate.connection.url jdbc:h2:ssl://secureserv:8085/sample;
#hibernate.connection.url jdbc:h2:ssl://secureserv/testdb;cipher=AES

## MySQL

#hibernate.dialect org.hibernate.dialect.MySQLDialect
#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
#hibernate.connection.driver_class com.mysql.jdbc.Driver
#hibernate.connection.url jdbc:mysql:///test
#hibernate.connection.username gavin
#hibernate.connection.password


## Oracle

#hibernate.dialect org.hibernate.dialect.OracleDialect
#hibernate.dialect org.hibernate.dialect.Oracle9Dialect
#hibernate.connection.driver_class oracle.jdbc.driver.OracleDriver
#hibernate.connection.username ora
#hibernate.connection.password ora
#hibernate.connection.url jdbc:oracle:thin:@localhost:1521:orcl
#hibernate.connection.url jdbc:oracle:thin:@localhost:1522:XE


## PostgreSQL

#hibernate.dialect org.hibernate.dialect.PostgreSQLDialect
#hibernate.connection.driver_class org.postgresql.Driver
#hibernate.connection.url jdbc:postgresql:template1
#hibernate.connection.username pg
#hibernate.connection.password


## DB2

#hibernate.dialect org.hibernate.dialect.DB2Dialect
#hibernate.connection.driver_class com.ibm.db2.jcc.DB2Driver
#hibernate.connection.driver_class COM.ibm.db2.jdbc.app.DB2Driver
#hibernate.connection.url jdbc:db2://localhost:50000/somename
#hibernate.connection.url jdbc:db2:somename
#hibernate.connection.username db2
#hibernate.connection.password db2

## TimesTen

#hibernate.dialect org.hibernate.dialect.TimesTenDialect
#hibernate.connection.driver_class com.timesten.jdbc.TimesTenDriver
#hibernate.connection.url jdbc:timesten:direct:test
#hibernate.connection.username
#hibernate.connection.password

## DB2/400

#hibernate.dialect org.hibernate.dialect.DB2400Dialect
#hibernate.connection.username user
#hibernate.connection.password password

## Native driver
#hibernate.connection.driver_class COM.ibm.db2.jdbc.app.DB2Driver
#hibernate.connection.url jdbc:db2://systemname

## Toolbox driver
#hibernate.connection.driver_class com.ibm.as400.access.AS400JDBCDriver
#hibernate.connection.url jdbc:as400://systemname


## Derby (not supported!)

#hibernate.dialect org.hibernate.dialect.DerbyDialect
#hibernate.connection.driver_class org.apache.derby.jdbc.EmbeddedDriver
#hibernate.connection.username
#hibernate.connection.password
#hibernate.connection.url jdbc:derby:build/db/derby/hibernate;create=true


## Sybase

#hibernate.dialect org.hibernate.dialect.SybaseDialect
#hibernate.connection.driver_class com.sybase.jdbc2.jdbc.SybDriver
#hibernate.connection.username sa
#hibernate.connection.password sasasa
#hibernate.connection.url jdbc:sybase:Tds:co3061835-a:5000/tempdb


## Mckoi SQL

#hibernate.dialect org.hibernate.dialect.MckoiDialect
#hibernate.connection.driver_class com.mckoi.JDBCDriver
#hibernate.connection.url jdbc:mckoi:///
#hibernate.connection.url jdbc:mckoi:local://C:/mckoi1.0.3/db.conf
#hibernate.connection.username admin
#hibernate.connection.password nimda


## SAP DB

#hibernate.dialect org.hibernate.dialect.SAPDBDialect
#hibernate.connection.driver_class com.sap.dbtech.jdbc.DriverSapDB
#hibernate.connection.url jdbc:sapdb://localhost/TST
#hibernate.connection.username TEST
#hibernate.connection.password TEST
#hibernate.query.substitutions yes 'Y', no 'N'


## MS SQL Server

#hibernate.dialect org.hibernate.dialect.SQLServerDialect
#hibernate.connection.username sa
#hibernate.connection.password sa

## JSQL Driver
#hibernate.connection.driver_class com.jnetdirect.jsql.JSQLDriver
#hibernate.connection.url jdbc:JSQLConnect://1E1/test

## JTURBO Driver
#hibernate.connection.driver_class com.newatlanta.jturbo.driver.Driver
#hibernate.connection.url jdbc:JTurbo://1E1:1433/test

## WebLogic Driver
#hibernate.connection.driver_class weblogic.jdbc.mssqlserver4.Driver
#hibernate.connection.url jdbc:weblogic:mssqlserver4:1E1:1433

## Microsoft Driver (not recommended!)
#hibernate.connection.driver_class com.microsoft.jdbc.sqlserver.SQLServerDriver
#hibernate.connection.url jdbc:microsoft:sqlserver://1E1;DatabaseName=test;SelectMethod=cursor

## The New Microsoft Driver
#hibernate.connection.driver_class com.microsoft.sqlserver.jdbc.SQLServerDriver
#hibernate.connection.url jdbc:sqlserver://localhost

## jTDS (since version 0.9)
#hibernate.connection.driver_class net.sourceforge.jtds.jdbc.Driver
#hibernate.connection.url jdbc:jtds:sqlserver://1E1/test

## Interbase

#hibernate.dialect org.hibernate.dialect.InterbaseDialect
#hibernate.connection.username sysdba
#hibernate.connection.password masterkey

## DO NOT specify hibernate.connection.sqlDialect

## InterClient

#hibernate.connection.driver_class interbase.interclient.Driver
#hibernate.connection.url jdbc:interbase://localhost:3060/C:/firebird/test.gdb

## Pure Java

#hibernate.connection.driver_class org.firebirdsql.jdbc.FBDriver
#hibernate.connection.url jdbc:firebirdsql:localhost/3050:/firebird/test.gdb


## Pointbase

#hibernate.dialect org.hibernate.dialect.PointbaseDialect
#hibernate.connection.driver_class com.pointbase.jdbc.jdbcUniversalDriver
#hibernate.connection.url jdbc:pointbase:embedded:sample
#hibernate.connection.username PBPUBLIC
#hibernate.connection.password PBPUBLIC


## Ingres

## older versions (before Ingress 2006)

#hibernate.dialect org.hibernate.dialect.IngresDialect
#hibernate.connection.driver_class ca.edbc.jdbc.EdbcDriver
#hibernate.connection.url jdbc:edbc://localhost:II7/database
#hibernate.connection.username user
#hibernate.connection.password password

## Ingres 2006 or later

#hibernate.dialect org.hibernate.dialect.IngresDialect
#hibernate.connection.driver_class com.ingres.jdbc.IngresDriver
#hibernate.connection.url jdbc:ingres://localhost:II7/database;CURSOR=READONLY;auto=multi
#hibernate.connection.username user
#hibernate.connection.password password

## Mimer SQL

#hibernate.dialect org.hibernate.dialect.MimerSQLDialect
#hibernate.connection.driver_class com.mimer.jdbc.Driver
#hibernate.connection.url jdbc:mimer:multi1
#hibernate.connection.username hibernate
#hibernate.connection.password hibernate


## InterSystems Cache

#hibernate.dialect org.hibernate.dialect.Cache71Dialect
#hibernate.connection.driver_class com.intersys.jdbc.CacheDriver
#hibernate.connection.username _SYSTEM
#hibernate.connection.password SYS
#hibernate.connection.url jdbc:Cache://127.0.0.1:1972/HIBERNATE


#################################
### Hibernate Connection Pool ###
#################################

hibernate.connection.pool_size 1


###########################
### C3P0 Connection Pool###
###########################

#hibernate.c3p0.max_size 2
#hibernate.c3p0.min_size 2
#hibernate.c3p0.timeout 5000
#hibernate.c3p0.max_statements 100
#hibernate.c3p0.idle_test_period 3000
#hibernate.c3p0.acquire_increment 2
#hibernate.c3p0.validate false


##############################
### Proxool Connection Pool###
##############################

## Properties for external configuration of Proxool

hibernate.proxool.pool_alias pool1

## Only need one of the following

#hibernate.proxool.existing_pool true
#hibernate.proxool.xml proxool.xml
#hibernate.proxool.properties proxool.properties


#################################
### Plugin ConnectionProvider ###
#################################

## use a custom ConnectionProvider (if not set, Hibernate will choose a built-in ConnectionProvider using hueristics)

#hibernate.connection.provider_class org.hibernate.connection.DriverManagerConnectionProvider
#hibernate.connection.provider_class org.hibernate.connection.DatasourceConnectionProvider
#hibernate.connection.provider_class org.hibernate.connection.C3P0ConnectionProvider
#hibernate.connection.provider_class org.hibernate.connection.ProxoolConnectionProvider


#######################
### Transaction API ###
#######################

## Enable automatic flush during the JTA beforeCompletion() callback
## (This setting is relevant with or without the Transaction API)

#hibernate.transaction.flush_before_completion


## Enable automatic session close at the end of transaction
## (This setting is relevant with or without the Transaction API)

#hibernate.transaction.auto_close_session


## the Transaction API abstracts application code from the underlying JTA or JDBC transactions

#hibernate.transaction.factory_class org.hibernate.transaction.JTATransactionFactory
#hibernate.transaction.factory_class org.hibernate.transaction.JDBCTransactionFactory


## to use JTATransactionFactory, Hibernate must be able to locate the UserTransaction in JNDI
## default is java:comp/UserTransaction
## you do NOT need this setting if you specify hibernate.transaction.manager_lookup_class

#jta.UserTransaction jta/usertransaction
#jta.UserTransaction javax.transaction.UserTransaction
#jta.UserTransaction UserTransaction


## to use the second-level cache with JTA, Hibernate must be able to obtain the JTA TransactionManager

#hibernate.transaction.manager_lookup_class org.hibernate.transaction.JBossTransactionManagerLookup
#hibernate.transaction.manager_lookup_class org.hibernate.transaction.WeblogicTransactionManagerLookup
#hibernate.transaction.manager_lookup_class org.hibernate.transaction.WebSphereTransactionManagerLookup
#hibernate.transaction.manager_lookup_class org.hibernate.transaction.OrionTransactionManagerLookup
#hibernate.transaction.manager_lookup_class org.hibernate.transaction.ResinTransactionManagerLookup


##############################
### Miscellaneous Settings ###
##############################

## print all generated SQL to the console

#hibernate.show_sql true


## format SQL in log and console

hibernate.format_sql true


## add comments to the generated SQL

#hibernate.use_sql_comments true


## generate statistics

#hibernate.generate_statistics true


## auto schema export

#hibernate.hbm2ddl.auto create-drop
#hibernate.hbm2ddl.auto create
#hibernate.hbm2ddl.auto update
#hibernate.hbm2ddl.auto validate


## specify a default schema and catalog for unqualified tablenames

#hibernate.default_schema test
#hibernate.default_catalog test


## enable ordering of SQL UPDATEs by primary key

#hibernate.order_updates true


## set the maximum depth of the outer join fetch tree

hibernate.max_fetch_depth 1


## set the default batch size for batch fetching

#hibernate.default_batch_fetch_size 8


## rollback generated identifier values of deleted entities to default values

#hibernate.use_identifer_rollback true


## enable bytecode reflection optimizer (disabled by default)

#hibernate.bytecode.use_reflection_optimizer true


#####################
### JDBC Settings ###
#####################

## specify a JDBC isolation level

#hibernate.connection.isolation 4


## enable JDBC autocommit (not recommended!)

#hibernate.connection.autocommit true


## set the JDBC fetch size

#hibernate.jdbc.fetch_size 25


## set the maximum JDBC 2 batch size (a nonzero value enables batching)

#hibernate.jdbc.batch_size 5
#hibernate.jdbc.batch_size 0


## enable batch updates even for versioned data

hibernate.jdbc.batch_versioned_data true


## enable use of JDBC 2 scrollable ResultSets (specifying a Dialect will cause Hibernate to use a sensible default)

#hibernate.jdbc.use_scrollable_resultset true


## use streams when writing binary types to / from JDBC

hibernate.jdbc.use_streams_for_binary true


## use JDBC 3 PreparedStatement.getGeneratedKeys() to get the identifier of an inserted row

#hibernate.jdbc.use_get_generated_keys false


## choose a custom JDBC batcher

# hibernate.jdbc.factory_class


## enable JDBC result set column alias caching
## (minor performance enhancement for broken JDBC drivers)

# hibernate.jdbc.wrap_result_sets


## choose a custom SQL exception converter

#hibernate.jdbc.sql_exception_converter


##########################
### Second-level Cache ###
##########################

## optimize chache for minimal "puts" instead of minimal "gets" (good for clustered cache)

#hibernate.cache.use_minimal_puts true


## set a prefix for cache region names

hibernate.cache.region_prefix hibernate.test


## disable the second-level cache

#hibernate.cache.use_second_level_cache false


## enable the query cache

#hibernate.cache.use_query_cache true


## store the second-level cache entries in a more human-friendly format

#hibernate.cache.use_structured_entries true


## choose a cache implementation

#hibernate.cache.provider_class org.hibernate.cache.EhCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.EmptyCacheProvider
hibernate.cache.provider_class org.hibernate.cache.HashtableCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.TreeCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.OSCacheProvider
#hibernate.cache.provider_class org.hibernate.cache.SwarmCacheProvider


## choose a custom query cache implementation

#hibernate.cache.query_cache_factory


############
### JNDI ###
############

## specify a JNDI name for the SessionFactory

#hibernate.session_factory_name hibernate/session_factory


## Hibernate uses JNDI to bind a name to a SessionFactory and to look up the JTA UserTransaction;
## if hibernate.jndi.* are not specified, Hibernate will use the default InitialContext() which
## is the best approach in an application server

#file system
#hibernate.jndi.class com.sun.jndi.fscontext.RefFSContextFactory
#hibernate.jndi.url file:/

#WebSphere
#hibernate.jndi.class com.ibm.websphere.naming.WsnInitialContextFactory
#hibernate.jndi.url iiop://localhost:900/

posted @ 2013-08-14 09:29 小胡子 阅读(381) | 评论 (0)编辑 收藏

     摘要: 这几天学习了一下Spring Security3.1,从官网下载了Spring Security3.1版本进行练习,经过多次尝试才摸清了其中的一些原理。本人不才,希望能帮助大家。还有,这次我第二次写博客啊,文体不是很行。希望 能让观看者不产生疲惫的感觉,我已经心满意足了。 一、数据库结构      先来看一下数据库结构,采用的是基于角色-资源-用户的权限...  阅读全文

posted @ 2013-08-13 17:49 小胡子 阅读(317) | 评论 (0)编辑 收藏

我们知道,EXT的全部js是比较大的,一个ext-all-debug.js就达2m多,它的压缩版(去掉js中的换行及空格),也达600多k,这对于在网速不太快的时,下载js就得漫长的等待。
JOffice中的日历任务控件,js多达四五个,每个js大小都达70多k,尽管我们采用了后加载的方式,则当用户点击我的任务功能时,才下载该js,但这样仍然很慢,因为下载的js很慢
,鉴于此,在互联网上使用类似Joffice类似的程序,速度会使很多开发商不敢选用ext作为开发技术。据本人当时参与移动一个内部采购平台的开发,就是因为其运行程序慢,遭到移动的终端用户的弃骂,
所以,要想用EXT来开发应用,需要解决其运行慢的特点。


我们可以从以下几种方法来提高应用程序的运行速度:

一.前期尽量少加载js.

   这点在Joffice中有比较好的运用,采用的是由ScriptMgr.load方法来完成,加载完成后,其会在body中插入一个div,只要当前页面不被刷新,下次再访问该功能时,不需要再加载js

   function $ImportJs(viewName,callback) {
    var b 
= document.getElementById(viewName+'-hiden');
    
if (b != null) {
        var view 
= eval('new ' + viewName + '()');
        callback.call(
this, view);
    } 
else {
        var jsArr 
= eval('App.importJs.' + viewName);
        
if(jsArr==undefined){
            var view 
= eval('new ' + viewName + '()');
            callback.call(
this, view);
            
return ;
        }
        ScriptMgr.load({
                    scripts : jsArr,
                    callback : function() {
                        
                        Ext.DomHelper.append(document.body,
"<div id='"
                                                
+ viewName
                                                
+ "-hiden' style='display:none'></div>");
                        var view 
= eval('new ' + viewName + '()');
                        callback.call(
this, view);
                    }
        });
    }
}


    package com.htsoft.core.web.filter;  
        
import java.io.IOException;  
        
import java.util.HashMap;  
        
import java.util.Iterator;  
        
import java.util.Map;  
        
import javax.servlet.Filter;  
        
import javax.servlet.FilterChain;  
        
import javax.servlet.FilterConfig;  
        
import javax.servlet.ServletException;  
        
import javax.servlet.ServletRequest;  
        
import javax.servlet.ServletResponse;  
        
import javax.servlet.http.HttpServletRequest;  
        
import javax.servlet.http.HttpServletResponse;  
          
        
public class GzipJsFilter implements Filter {  
            Map headers 
= new HashMap();  
            
public void destroy() {  
            }  
            
public void doFilter(ServletRequest req, ServletResponse res,  
                    FilterChain chain) 
throws IOException, ServletException {  
                
if(req instanceof HttpServletRequest) {  
                    doFilter((HttpServletRequest)req, (HttpServletResponse)res, chain);  
                }
else {  
                    chain.doFilter(req, res);  
                }  
            }  
            
public void doFilter(HttpServletRequest request,  
                    HttpServletResponse response, FilterChain chain)  
                    
throws IOException, ServletException {  
                    request.setCharacterEncoding(
"UTF-8");  
                    
for(Iterator it = headers.entrySet().iterator();it.hasNext();) {  
                        Map.Entry entry 
= (Map.Entry)it.next();  
                        response.addHeader((String)entry.getKey(),(String)entry.getValue());  
                    }  
                    chain.doFilter(request, response);  
            }  
          
            
public void init(FilterConfig config) throws ServletException {  
                String headersStr 
= config.getInitParameter("headers");  
                String[] headers 
= headersStr.split(",");  
                
for(int i = 0; i < headers.length; i++) {  
                    String[] temp 
= headers[i].split("=");  
                    
this.headers.put(temp[0].trim(), temp[1].trim());  
                }  
            }  
        } 

3.在WEB.xml 文件中,添加以下配置:

<filter>    
    
<filter-name>GzipJsFilter</filter-name>    
    
<filter-class>com.htsoft.core.web.filter.GzipJsFilter</filter-class>    
    
<init-param>    
        
<param-name>headers</param-name>    
        
<param-value>Content-Encoding=gzip</param-value>    
    
</init-param>  
</filter>  
<filter-mapping>  
<filter-name>GzipJsFilter</filter-name>  
<url-pattern>*.gzjs</url-pattern>  
lt;
/filter-mapping>  
<servlet-mapping> 
4.在index.jsp中引入该压缩文件:
  <script type="text/javascript" src="<%=request.getContextPath()%>/ext3/ext-all.gzjs"></script>
 

可以看到浏览器解压后,其代码是一样的:

 

 

大家可以看到以上,这块是在外网使用的,其速度是比较快的。当然,浏览器解压这个文件需要一点时间,不过在本地解压是非常快的,可以不用管。

 

 

三、通过Js缓存,更加可以提高EXT的加载速度,关于缓存,本文不作讨论。

原文出自:
http://man1900.iteye.com/blog/515058

posted @ 2013-08-13 16:48 小胡子 阅读(338) | 评论 (0)编辑 收藏

我们常常在代码中读取一些资源文件(比如图片,音乐,文本等等)。在单独运行的时候这些简单的处理当然不会有问题。但是,如果我们把代码打成一个jar包以后,即使将资源文件一并打包,这些东西也找不出来了。看看下面的代码:

//源代码1:
package edu.hxraid;
import java.io.*;
public class Resource {
    
public  void getResource() throws IOException{
        File file
=new File("bin/resource/res.txt");
        BufferedReader br
=new BufferedReader(new FileReader(file));
        String s
="";
        
while((s=br.readLine())!=null)
            System.out.println(s);
    }
}   
这段代码写在Eclipse建立的java Project中,其目录为:(其中将资源文件res.txt放在了bin目录下,以便打成jar包)
      1、src/
              src/edu/hxraid/Resource.java
      2、bin/
              bin/resource/res.txt
              bin/edu/hxraid/Resource.class

      很显然运行源代码1是能够找到资源文件res.txt。但当我们把整个工程打成jar包以后(ResourceJar.jar),这个jar包内的目录为:
              edu/hxraid/Resource.class
              resource/res.txt

 

         而这时jar包中Resource.class字节 码:ldc <String "bin/resource/res.txt"> [20] 将无法定位到jar包中的res.txt位置上。就算把bin/目录去掉:ldc <String "resource/res.txt"> [20] 仍然无法定位到jar包中res.txt上。


这主要是因为jar包是一个单独的文件而非文件夹,绝对不可能通过"file:/e:/.../ResourceJar.jar/resource /res.txt"这种形式的文件URL来定位res.txt。所以即使是相对路径,也无法定位到jar文件内的txt文件(读者也许对这段原因解释有些费解,在下面我们会用一段代码运行的结果来进一步阐述)。
那么把资源打入jar包,无论ResourceJar.jar在系统的什么路径下,jar包中的字节码程序都可以找到该包中的资源。这会是幻想吗?


      当然不是,我们可以用类装载器(ClassLoader)来做到这一点:

         (1) ClassLoader 是类加载器的抽象类。它可以在运行时动态的获取加载类的运行信息。 可以这样说,当我们调用ResourceJar.jar中的Resource类时,JVM加载进Resource类,并记录下Resource运行时信息 (包括Resource所在jar包的路径信息)。而ClassLoader类中的方法可以帮助我们动态的获取这些信息:
          ● public URL getResource(String name)
            查找具有给定名称的资源。资源是可以通过类代码以与代码基无关的方式访问的一些数据(图像、声音、文本等)。并返回资源的URL对象。
          ● public InputStream getResourceAsStream(String name);
             返回读取指定资源的输入流。这个方法很重要,可以直接获得jar包中文件的内容。

         

          (2) ClassLoader是abstract的,不可能实例化对象,更加不可能通过ClassLoader调用上面两个方法。所以我们真正写代码的时候,是通过Class类中的getResource()和getResourceAsStream()方法,这两个方法会委托ClassLoader中的getResource()和getResourceAsStream()方法 。好了,现在我们重新写一段Resource代码,来看看上面那段费解的话是什么意思了:


//源代码2:
package edu.hxraid;
import java.io.*;
import java.net.URL;
public class Resource {
    
public  void getResource() throws IOException{    
              
//查找指定资源的URL,其中res.txt仍然开始的bin目录下 
        URL fileURL=this.getClass().getResource("/resource/res.txt"); 
        System.out.println(fileURL.getFile());
    }
    
public static void main(String[] args) throws IOException {
        Resource res
=new Resource();
        res.getResource();
    }
}

运行这段源代码结果:/E:/Code_Factory/WANWAN/bin/resource/res.txt  (../ Code_Factory/WANWAN/.. 是java project所在的路径)

           我们将这段代码打包成ResourceJar.jar ,并将ResourceJar.jar放在其他路径下(比如 c:\ResourceJar.jar)。然后另外创建一个java project并导入ResourceJar.jar,写一段调用jar包中Resource类的测试代码:


import java.io.IOException;
import edu.hxraid.Resource;
public class TEST {
    
public static void main(String[] args) throws IOException {
        Resource res
=new Resource();
        res.getResource();
    }
}
这时的运行结果是:file:/C:/ResourceJar.jar!/resource/res.txt
我们成功的在运行时动态获得了res.txt的位置。然而,问题来了,你是否可以通过下面这样的代码来得到res.txt文件?
                      File f=new File("C:/ResourceJar.jar!/resource/res.txt");
            当然不可能,因为".../ResourceJar.jar!/resource/...."并不是文件资源定位符的格式 (jar中资源有其专门的URL形式:
jar:<url>!/{entry} )。所以,如果jar包中的类源代码用File f=new File(相对路径);的形式,是不可能定位到文件资源的。这也是为什么源代码1打包成jar文件后,调用jar包时会报出FileNotFoundException的症结所在了。

 

          (3) 我们不能用常规操作文件的方法来读取ResourceJar.jar中的资源文件res.txt,但可以通过Class类的getResourceAsStream()方法来获取 ,这种方法是如何读取jar中的资源文件的,这一点对于我们来说是透明的。我们将Resource.java改写成:


//源代码3:
package edu.hxraid;
import java.io.*;
public class Resource {
    
public void getResource() throws IOException{
        
//返回读取指定资源的输入流
        InputStream is=this.getClass().getResourceAsStream("/resource/res.txt"); 
        BufferedReader br
=new BufferedReader(new InputStreamReader(is));
        String s
="";
        
while((s=br.readLine())!=null)
            System.out.println(s);
    }
}

我们将java工程下/bin目录中的edu/hxraid /Resource.class和资源文件resource/res.txt一并打包进ResourceJar.jar中,不管jar包在系统的任何目录 下,调用jar包中的Resource类都可以获得jar包中的res.txt资源,再也不会找不到res.txt文件了。

原文出自:
http://www.iteye.com/topic/483115

posted @ 2013-08-12 15:19 小胡子 阅读(273) | 评论 (0)编辑 收藏

编辑代码常用快捷键

格式化代码的快捷键 Ctrl + Shift + F

格式化缩进的快捷键是 Ctrl + I,只能对选中的文本进行缩进

删除一行的快捷键是 Ctrl + D

当前窗口最大化最小化切换 Ctrl + M

转到最后进行修改的位置 Ctrl + Q

快速查找选中的字符 Ctrl + K(向下) Ctrl + Shift + K(向上)

光标放到一个括号,切换到另一个成对的括号 Ctrl + Shirt + P

在编辑过的位置进行切换 Alt + 左右方向键

阅读代码常用的快捷键

F3不解释(一些人喜欢用Ctrl + 鼠标左键)

选中方法或者变量 Ctrl + Alt + H,查找在哪些地方调用,快速阅读代码和评估代码修改必须要用到的

继承关系 F4,了解代码的框架

快速查找函数和变量 Ctrl + O,输入函数或变量的名字,比在Outline中一个一个找要快很多,但是要对代码有了解

全工程查找 Ctrl + H,代码巨多的情况下必不可少。

由于水平有限,笔者只用到了这些快捷键

如果想知道其他的快捷键 Ctrl + Shift + L

自定义格式化代码

在Preference中打开Java的Format

内建的模版是不能修改的,点击New...,随便输入一个名字,新建一个自己的模板,弹出自定义Edit窗口

可以定义的项目非常丰富,在右边还可以进行预览,就算对英文不感冒,也可以捉摸出大致的意思。对代码进行格式化的好处是不仅仅是美观,便于阅读,在 进行团队开发的时候,使用统一的格式,在合并代码的时候可以避免许多的冲突。修改完成的模版就是使用Ctrl + Shift + F格式化时的模板

自动去除无用的import,自动补全@Override和@deprecated,eclipse的Clean up

在Code Style中,除了Format还有Clean Up

和Format进行同样的操作,新建一个模板,有几个地方我决定有必要改一下

Code Organizing标签选择Remove trailing whitespace(移除尾部的空格)

Organzie imports

选择Organzie imports前效果

import org.model.*;

选择Organzie imports后效果

import org.model.Engine;

切换到Code Style标签

 

Use blocks in if/while/for/do statements if/while/for/do自动添加括号,这个因人而异,我决定即使只用一行,也应该添加括号。

点击菜单里的Source - Clean up,可以对代码进行清理,清理代码最大的好处是——移除没用的import,自动添加@Deprecated和@Override


特别是自动添加@Override,可以很清楚的明白那些函数是继承的。

代码提示

用过visual assistx的一定非常系统它的代码提示功能,我是个没有代码提示就无法Coding的人,点击菜单Windows-Preference,切换到以下窗口

找到Auto Activation,也就是红色方框中的部分,将Auto activation delay(ms): 修改为 50

Auto activation triggers for Java:修改为 .abcdefghigklmnoprstuvwxyz,这样就能随时提示了。

 

最后介绍两个工具,Search Everything 根据文件名快速查找文件,ClipX剪贴板历史记录。


原文出自:http://www.cnblogs.com/sw926/p/3209615.html

posted @ 2013-07-25 01:00 小胡子 阅读(957) | 评论 (0)编辑 收藏

 1 @Entity
 2 @Table(name="T_ADM_USER")
 3 public class User extends GenericEntity implements Serializable {
 4     
 5     @OneToOne(cascade = CascadeType.PERSIST)
 6     @JoinColumn(name="grade_id")
 7     public Grade getGrade() {
 8         return grade;
 9     }
10     public void setGrade(Grade grade) {
11         this.grade = grade;
12     }
13     @Column(name="user_name", insertable = true, updatable = true, nullable = true)
14     public String getUsername() {
15         return username;
16     }
17     public void setUsername(String username) {
18         this.username = username;
19     }
20 
21 }

 1 public class TableUtil {
 2 
 3     public static void main(String[] args) {
 4         try{
 5             
 6             AnnotationConfiguration cfg = new AnnotationConfiguration();
 7             cfg.addAnnotatedClass(com.mygogo.grade.user.entity.User.class);                        
 9             SchemaExport se = new SchemaExport(cfg);
10             se.setDelimiter(";");
11             se.drop(truetrue);
12             se.create(truetrue);
13         }catch(Exception e){
14             e.printStackTrace();
15         }
16         
17     }
18 }













posted @ 2013-07-11 14:13 小胡子 阅读(298) | 评论 (0)编辑 收藏

     

Servlet和Filter的url匹配以及url-pattern详解


     Servlet和filter是J2EE开发中常用的技术,使用方便,配置简单,老少皆宜。估计大多数朋友都是直接配置用,也没有关心过具体的细节,今天 遇到一个问题,上网查了servlet的规范才发现,servlet和filter中的url-pattern还是有一些文章在里面的,总结了一些东西, 放出来供大家参考,以免遇到问题又要浪费时间。

一 servlet容器对url的匹配过


当一个请求发送到servlet容器的时候,容器先会将请求的url减去当前应用上下文的路径作为servlet的映射url,比如我访问的是http://localhost/test/aaa.html,我的应用上下文是test,容器会将http://localhost/test去掉,剩下的/aaa.html部分拿来做servlet的映射匹配。这个映射匹配过程是有顺序的,而且当有一个servlet匹配成功以后,就不会去理会剩下的servlet了(filter不同,后文会提到)。其匹配规则和顺序如下:<o:p></o:p>

1.     精确路径匹配。例子:比如servletA 的url-pattern为 /test,servletB的url-pattern为 /* ,这个时候,如果我访问的url为http://localhost/test ,这个时候容器就会先进行精确路径匹配,发现/test正好被servletA精确匹配,那么就去调用servletA,也不会去理会其他的servlet了。<o:p></o:p>

2.     最长路径匹配。例子:servletA的url-pattern为/test/*,而servletB的url-pattern为/test/a/*,此时访问http://localhost/test/a时,容器会选择路径最长的servlet来匹配,也就是这里的servletB。<o:p></o:p>

3.     扩展匹配,如果url最后一段包含扩展,容器将会根据扩展选择合适的servlet。例子:servletA的url-pattern:*.action<o:p></o:p>

4.     如果前面三条规则都没有找到一个servlet,容器会根据url选择对应的请求资源。如果应用定义了一个default servlet,则容器会将请求丢给default servlet(什么是default servlet?后面会讲)。

根据这个规则表,就能很清楚的知道servlet的匹配过程,所以定义servlet的时候也要考虑url-pattern的写法,以免出错。

      对于filter,不会像servlet那样只匹配一个servlet,因为filter的集合是一个链,所以只会有处理的顺序不同,而不会出现只选择一 个filter。Filter的处理顺序和filter-mapping在web.xml中定义的顺序相同。


二 url-pattern详解

  • web.xml文件中,以下语法用于定义映射:
  •  以”/’开头和以”/*”结尾的是用来做路径映射的。
  •  以前缀”*.”开头的是用来做扩展映射的。
  • “/” 是用来定义default servlet映射的。
  • 剩下的都是用来定义详细映射的。比如: /aa/bb/cc.action
所以,为什么定义”/*.action”这样一个看起来很正常的匹配会错?因为这个匹配即属于路径映射,也属于扩展映射,导致容器无法判断

出自:
http://foxty.iteye.com/blog/39332


posted @ 2013-06-06 15:16 小胡子 阅读(304) | 评论 (0)编辑 收藏

oracle监听不能启动的问题及处理过程!

oracle环境如下:

SQL> select * from V$version

2 ;

BANNER

----------------------------------------------------------------

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

PL/SQL Release 10.2.0.1.0 - Production

CORE 10.2.0.1.0 Production

TNS for 32-bit Windows: Version 10.2.0.1.0 - Production

NLSRTL Version 10.2.0.1.0 - Production

出错过程回忆:在此之前用windows优化大师对系统注册表进行了修复!

Q:链接oracle时报错:ORA-12541: TNS: 无监听程序

A:

1〉查看监听有没有启动:

一:运行lsnrctl

C:\Documents and Settings\Admin>lsnrctl

LSNRCTL for 32-bit Windows: Version 10.2.0.1.0 - Production on 20-4月 -2007 09:

1:43

Copyright (c) 1991, 2005, Oracle. All rights reserved.

欢迎来到LSNRCTL, 请键入"help"以获得信息。

二:查看stauts

LSNRCTL> status

正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))

TNS-12541: TNS: 无监听程序

TNS-12560: TNS: 协议适配器错误

TNS-00511: 无监听程序

32-bit Windows Error: 2: No such file or directory

正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=zxt)(PORT=1521)))

TNS-12541: TNS: 无监听程序

TNS-12560: TNS: 协议适配器错误

TNS-00511: 无监听程序

32-bit Windows Error: 61: Unknown error

三:发现监听没有启动,现在启动监听

LSNRCTL> start

启动tnslsnr: 请稍候...

Failed to start service, error 3.

TNS-12560: TNS: 协议适配器错误

TNS-00530: 协议适配器错误

2〉发现监听启动不起来,估计是注册表有点问题,登录注册表

C:\Documents and Settings\Admin>regedit

进入注册表到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\OracleOraDb10g_home1TNSListener

发现ImagePath关键值没有了,增加可扩充字符串值,取名为ImagePathImagePath,编辑字符串的数值数据为:G:\oracle\product\10.2.0\db_2\BIN\TNSLSNR(对应oracle的TNSLSNR的位置) ,退出注册表。

3〉启动监听

LSNRCTL> start

启动tnslsnr: 请稍候...

TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Production

系统参数文件为d:\oracle\product\10.2.0\db_1\network\admin\listener.ora

写入d:\oracle\product\10.2.0\db_1\network\log\listener.log的日志信息

监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1ipc)))

监听: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=zxt)(PORT=1521)))

正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))

LISTENER 的 STATUS

------------------------

别名 LISTENER

版本 TNSLSNR for 32-bit Windows: Version 10.2.0.1.0 - Produ

ction

启动日期 20-4月 -2007 09:41:29

正常运行时间 0 天 0 小时 0 分 3 秒

跟踪级别 off

安全性 ON: Local OS Authentication

SNMP OFF

监听程序参数文件 d:\oracle\product\10.2.0\db_1\network\admin\listener.o

ra

监听程序日志文件 d:\oracle\product\10.2.0\db_1\network\log\listener.log

监听端点概要...

(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC1ipc)))

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=zxt)(PORT=1521)))

服务摘要..

服务 "PLSExtProc" 包含 1 个例程。

例程 "PLSExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...

命令执行成功

4>监听启动成功后尝试登录

C:\Documents and Settings\Admin>sqlplus zxt@orcl

SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 4月 20 09:42:33 2007

Copyright (c) 1982, 2005, Oracle. All rights reserved.

输入口令:

连接到:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

With the Partitioning, OLAP and Data Mining options

登录成功!

总结:估计是windows优化大师或者别的工具在修复注册表时候删掉了ImagePath字段,补上后就可以了!

补充:登录sqlplus时报

ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务错误!

处理办法:

1〉oracle_home\NETWORK\ADMIN\tnsnames.ora中修改(ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))

为(ADDRESS = (PROTOCOL = TCP)(HOST = 本地计算机名)(PORT = 1521)),保存即可。

2〉有的人介绍oracle_home\NETWORK\ADMIN\sqlnet.ora中修改SQLNET.AUTHENTICATION_SERVICES = (NTS)为

SQLNET.AUTHENTICATION_SERVICES = (NONE)

这2种方法,第一个最佳!

posted @ 2013-05-30 14:03 小胡子 阅读(607) | 评论 (0)编辑 收藏

Ext GridPanel实现复选框选择框:

1 var selectModel = new Ext.grid.CheckboxSelectionModel({
2     singleSelect : false
3 });
4 

 但是这样每一行都会有复选框,如果需求为:某行数据的某个列满足什么条件我才有复选框选项就不太好实现了,

这样就需要重写Ext.grid.CheckboxSelectionModel的渲染,行点击涵数来实现.

 1 var selectModel = new Ext.grid.CheckboxSelectionModel({
 2       singleSelect : false,
 3       renderer : function(v, p, record){
 4           if (record.data['结果状态'] == '0'){
 5                return '';
 6           }
 7           return '<div class="x-grid3-row-checker">&#160;</div>';
 8       },
 9       onHdMouseDown : function(e, t) {
10           if (t.className == 'x-grid3-hd-checker') {
11                e.stopEvent();
12                var hd = Ext.fly(t.parentNode);
13                var isChecked = hd.hasClass('x-grid3-hd-checker-on');
14                if (isChecked){
15                   hd.removeClass('x-grid3-hd-checker-on');
16                   this.clearSelections();
17               }else {
18                   hd.addClass('x-grid3-hd-checker-on');
19                   if (this.locked){
20                       return;
21                   }
22                   this.selections.clear();
23                   for (var i = 0, len = this.grid.store.getCount(); i < len; i++ ){
24                       if (this.grid.store.getAt(i).data["结果状态"!= '0'){
25                            this.selectRow(i, true);
26                       }
27                  }
28               }
29          }
30       },
31       handleMouseDown : function(g, rowIndex, e){
32             if (e.button !== 0 || this.isLocked()) {
33                    return;
34             }
35             var view = this.grid.getView();
36             if (e.shiftKey && !this.singleSelect && this.last != false ) {
37                  var last = this.last;
38                  this.selectRange(last, rowIndex, e.ctrlKey);
39                  this.last = last;
40                  view.focusRow(rowIndex);
41             }else{
42                  var isSelected = this.isSelected(rowIndex);
43                  if (e.ctrlKey && isSelected) {
44                       this.deselectRow(rowIndex);
45                  }else if(!isSelected || this.getCount() > 1){
46                       if(this.grid.store.getAt(rowIndex).data["结果状态"!= '0'){
47                           this.selectRow(rowIndex, e.ctrlKey || e.shiftKey);
48                       }
49                       view.focusRow(rowIndex);
50                  }
51             }
52       }
53 });
原文:
http://fordream.iteye.com/blog/1179252



posted @ 2013-05-06 15:34 小胡子 阅读(330) | 评论 (0)编辑 收藏

     摘要: 在学习中Ext.grid.EditorGridPanel 的时候碰到一个知识点,如何用复选框来表示真假值,当然我们可以直接这样 Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->1 {2    heade...  阅读全文

posted @ 2013-05-06 15:32 小胡子 阅读(246) | 评论 (0)编辑 收藏

Ext.grid.GridPanel可以设置stripeRows: true的属性来实现隔行换颜色的效果,如果你想自定义每行的颜色,那么你可以按照下边地方法来实现:
Ext.ux.GridView=Ext.extend(  
       Ext.grid.GridView,  
       {  
           getRowClass:
function(record,index)  
           {  
               
if(index%2==0)  
                   
return 'red';  
               
else  
                  
return 'green';  
          }  
       }  
   ) 

使用自定义的view

var grid = new Ext.grid.GridPanel({
        
//other code
    store: store,
    view:
new Ext.ux.GridView(),
        
//other code
});
样式定义:

.red {
     background
-color:#FF0000;
}
.green {
     background
-color:#00FF00;
}



通过firebug可以看到,给每行的div添加了自定义的样式
原文出自:
http://love4j.iteye.com/blog/516007


posted @ 2013-05-04 21:33 小胡子 阅读(698) | 评论 (0)编辑 收藏

     摘要: 先上图 grid分页:      把grid和page工具绑定在一起     // create the Data Store     var store = new Ext.data.Store...  阅读全文

posted @ 2013-04-29 11:56 小胡子 阅读(331) | 评论 (0)编辑 收藏

http://yourgame.iteye.com/blog/252853

posted @ 2013-04-29 11:53 小胡子 阅读(299) | 评论 (0)编辑 收藏

Ext中的combobox有属性typeAhead:true 可以实现模糊匹配,但是是从开始匹配的,如果需要自定的的匹配,则需要监听beforequery方法,实现自己的匹配查询方法:

代码如下:


var gfxmComb  = new Ext.form.ComboBox({
        id : 'gfxmComb',
        store : gfxmStore,
        typeAhead : 
true,
        mode : 'local',
        editable : 
true,
        displayField :'xmMc',
        valueField :'xmBm',
        triggerAction : 'all',
        selectOnFocus : 
true,
        listeners : {
            'beforequery':
function(e){
                 
                
var combo = e.combo;  
                
if(!e.forceAll){  
                    
var input = e.query;  
                    
// 检索的正则
                    var regExp = new RegExp(".*" + input + ".*");
                    
// 执行检索
                    combo.store.filterBy(function(record,id){  
                        
// 得到每个record的项目名称值
                        var text = record.get(combo.displayField);  
                        
return regExp.test(text); 
                    });
                    combo.expand();  
                    
return false;
                }
            }
        }
    });

原文出自:http://weibaojun.iteye.com/blog/1098731

posted @ 2013-04-29 11:33 小胡子 阅读(415) | 评论 (0)编辑 收藏

Javascript是一门非常灵活的语言,我们可以随心所欲的书写各种风格的代码,不同风格的代码也必然也会导致执行效率的差异,开发过程中零零散散地接触到许多提高代码性能的方法,整理一下平时比较常见并且容易规避的问题

Javascript自身执行效率

Javascript中的作用域链、闭包、原型继承、eval等特性,在提供各种神奇功能的同时也带来了各种效率问题,用之不慎就会导致执行效率低下。

1、全局导入

我们在编码过程中多多少少会使用到一些全局变量(window,document,自定义全局变量等等),了解javascript作用域链的人都 知道,在局部作用域中访问全局变量需要一层一层遍历整个作用域链直至顶级作用域,而局部变量的访问效率则会更快更高,因此在局部作用域中高频率使用一些全 局对象时可以将其导入到局部作用域中,例如:


 1 //1、作为参数传入模块
 2 (function(window,$){
 
3     var xxx = window.xxx;
 
4     $("#xxx1").xxx();
 
5     $("#xxx2").xxx();
 
6 })(window,jQuery);
 
7 
 
8 //2、暂存到局部变量
 9 function(){
10     var doc = document;
11     var global = window.global;
12 }

2、eval以及类eval问题

我们都知道eval可以将一段字符串当做js代码来执行处理,据说使用eval执行的代码比不使用eval的代码慢100倍以上(具体效率我没有测试,有兴趣同学可以测试一下)

JavaScript 代码在执行前会进行类似“预编译”的操作:首先会创建一个当前执行环境下的活动对象,并将那些用 var 申明的变量设置为活动对象的属性,但是此时这些变量的赋值都是 undefined,并将那些以 function 定义的函数也添加为活动对象的属性,而且它们的值正是函数的定义。但是,如果你使用了“eval”,则“eval”中的代码(实际上为字符串)无法预先识 别其上下文,无法被提前解析和优化,即无法进行预编译的操作。所以,其性能也会大幅度降低

其实现在大家一般都很少会用eval了,这里我想说的是两个类eval的场景(new Function{},setTimeout,setInterver)


setTimtout("alert(1)",1000);

setInterver(
"alert(1)",1000);

(
new Function("alert(1)"))();

上述几种类型代码执行效率都会比较低,因此建议直接传入匿名方法、或者方法的引用给setTimeout方法

3、闭包结束后释放掉不再被引用的变量


var f = (function(){
    
var a = {name:"var3"};
    
var b = ["var1","var2"];
    
var c = document.getElementByTagName("li");
    
//****其它变量
    //***一些运算
    var res = function(){
        alert(a.name);
    }
    
return res;
})()

上述代码中变量f的返回值是由一个立即执行函数构成的闭包中返回的方法res,该变量保留了对于这个闭包中所有变量(a,b,c等)的引用,因此这两个变 量会一直驻留在内存空间中,尤其是对于dom元素的引用对内存的消耗会很大,而我们在res中只使用到了a变量的值,因此,在闭包返回前我们可以将其它变 量释放

var f = (function(){
    
var a = {name:"var3"};
    
var b = ["var1","var2"];
    
var c = document.getElementByTagName("li");
    
//****其它变量
    //***一些运算
    //闭包返回前释放掉不再使用的变量
    b = c = null;
    
var res = function(){
        alert(a.name);
        }
    
return res;
})()

在web开发过程中,前端执行效率的瓶颈往往都是在dom操作上面,dom操作是一件很耗性能的事情,如何才能在dom操作过程中尽量节约性能呢?

1、减少reflow

什么是reflow?

当 DOM 元素的属性发生变化 (如 color) 时, 浏览器会通知 render 重新描绘相应的元素, 此过程称为 repaint。

如果该次变化涉及元素布局 (如 width), 浏览器则抛弃原有属性, 重新计算并把结果传递给 render 以重新描绘页面元素, 此过程称为 reflow。

减少reflow的方法

  1. 先将元素从document中删除,完成修改后再把元素放回原来的位置(当对某元素及其子元素进行大量reflow操作时,1,2两种方法效果才会比较明显)

  2. 将元素的display设置为”none”,完成修改后再把display修改为原来的值

  3. 修改多个样式属性时定义class类代替多次修改style属性(for certain同学推荐)
  4. 大量添加元素到页面时使用documentFragment

例如


for(var i=0;i<100:i++){
    
var child = docuemnt.createElement("li");
    child.innerHtml 
= "child";
    document.getElementById(
"parent").appendChild(child);
}

上述代码会多次操作dom,效率比较低,可以改为下面的形式 创建documentFragment,将所有元素加入到docuemntFragment不会改变dom结构,最后将其添加到页面,只进行了一次reflow

var frag = document.createDocumentFragment();
for(var i=0;i<100:i++){
        
var child = docuemnt.createElement("li");
        child.innerHtml 
= "child";
    frag.appendChild(child);
}
document.getElementById(
"parent").appendChild(frag);

2、暂存dom状态信息

当代码中需要多次访问元素的状态信息,在状态不变的情况下我们可以将其暂存到变量中,这样可以避免多次访问dom带来内存的开销,典型的例子就是:


var lis = document.getElementByTagName("li");
for(var i=1;i<lis.length;i++){
    
//***
}
上述方式会在每一次循环都去访问dom元素,我们可以简单将代码优化如下
var lis = document.getElementByTagName("li");
for(var i=1,j=lis.length ;i<j;i++){
    
//***
}

3、缩小选择器的查找范围

查找dom元素时尽量避免大面积遍历页面元素,尽量使用精准选择器,或者指定上下文以缩小查找范围,以jquery为例

  • 少用模糊匹配的选择器:例如$("[name*='_fix']"),多用诸如id以及逐步缩小范围的复合选择器$("li.active")
  • 指定上下文:例如$("#parent .class")$(".class",$el)

4、使用事件委托

使用场景:一个有大量记录的列表,每条记录都需要绑定点击事件,在鼠标点击后实现某些功能,我们通常的做法是给每条记录都绑定监听事件,这种做法会导致页面会有大量的事件监听器,效率比较低下。

基本原理:我们都知道dom规范中事件是会冒泡的,也就是说在不主动阻止事件冒泡的情况下任何一个元素的事件都 会按照dom树的结构逐级冒泡至顶端。而event对象中也提供了event.target(IE下是srcElement)指向事件源,因此我们即使在 父级元素上监听该事件也可以找到触发该事件的最原始的元素,这就是委托的基本原理。废话不多说,上示例


$("ul li").bind("click",function(){
    alert($(
this).attr("data"));
})

上述写法其实是给所有的li元素都绑定了click事件来监听鼠标点击每一个元素的事件,这样页面上会有大量的事件监听器。

根据上面介绍的监听事件的原理我们来改写一下


$("ul").bind("click",function(e){
    
if(e.target.nodeName.toLowerCase() ==="li"){
        alert($(e.target).attr(
"data"));
    }
})

这样一来,我们就可以只添加一个事件监听器去捕获所有li上触发的事件,并做出相应的操作。

当然,我们不必每次都做事件源的判断工作,可以将其抽象一下交给工具类来完成。jquery中的delegate()方法就实现了该功能

语法是这样的$(selector).delegate(childSelector,event,data,function),例如:


$("div").delegate("button","click",function(){
  $(
"p").slideToggle();
});
参数说明(引自w3school)
参数描述
childSelector 必需。规定要附加事件处理程序的一个或多个子元素。
event

必需。规定附加到元素的一个或多个事件。由空格分隔多个事件值。必须是有效的事件。

data 可选。规定传递到函数的额外数据。
function 必需。规定当事件发生时运行的函数。

 

Tips:事件委托还有一个好处就是,即使在事件绑定之后动态添加的元素上触发的事件同样可以监听到哦,这样就不用在每次动态加入元素到页面后都为其绑定事件了

原文出自:
http://www.cnblogs.com/gewei/archive/2013/03/29/2988180.html

posted @ 2013-04-04 23:20 小胡子 阅读(255) | 评论 (0)编辑 收藏

     摘要: 在Java中,它的内存管理包括两方面:内存分配(创建Java对象的时候)和内存回收,这 两方面工作都是由JVM自动完成的,降低了Java程序员的学习难度,避免了像C/C++直接操作内存的危险。但是,也正因为内存管理完全由JVM负责, 所以也使Java很多程序员不再关心内存分配,导致很多程序低效,耗内存。因此就有了Java程序员到最后应该去了解JVM,才能写出更高效,充分利用有 限的内存的程序。 1...  阅读全文

posted @ 2013-03-30 22:39 小胡子 阅读(209) | 评论 (0)编辑 收藏

在设计产品时,要考虑到到很多的因素,其中一个重要的是配色方案。不同的颜色可以使您的产品创造出不同的效果。请务必检查颜色在一般和特定的文化含义,以获得最佳使用效果。

在这篇文章中,我想向大家介绍一些有用的设计工具将帮助您选择合适的调色板为您的设计。这里有15个在线工具分析和收集的色彩组合。

Colllor

Colllor

 

Toucan

巨嘴鸟

ColoRotate

ColoRotate

0to255

0to255

ColorHexa

ColorHexa

 

Color Explorer

颜色资源管理器

 

ColorMunki

ColorMunki的

Pictaculous

Pictaculous

 

Color Combos

颜色组合

 

Kuler

子弹

Colorspire

Colorspire

Copaso

Copaso

 

Sphere

球

GenoPal

GenoPal

Colrd

Colrd




转自:http://www.cnblogs.com/58top/archive/2013/01/15/useful-color-combination-apps-for-designers.html

posted @ 2013-03-20 22:04 小胡子 阅读(211) | 评论 (0)编辑 收藏

当你将鼠标悬停在该元素,可以显示元素有关的信息。当你想显示的额外信息,工具提示是最好的,无需改变你的设计元素。当你把鼠标光标移到元素,比如链接或按钮,出现一个小框,额外的显示有关该元素的信息。工具提示可以更加用户友好的

大多数的网站管理员使用这些工具提示显示他们的Facebook和Twitter的追随者,同样地,你可以利用这些工具提示自己的网站信息。

今天,我已经收集了20个最好的,免费供您使用jQuery的工具提示插件。

jQuery Tooltip Plugins

qTip2

qTip2

More about qTip2

Tooltipster

Tooltipster

More about Tooltipster

Tooltipsy

Tooltipsy

More about Tooltipsy

clueTip

clueTip

More about clueTip

PowerTip

PowerTip

More about PowerTip

wTooltip

wTooltip

More about wTooltip

Tipped

Tipped

More about Tipped

Responsive and Mobile-Friendly Tooltip

Responsive and Mobile-Friendly Tooltip

More about Responsive and Mobile-Friendly Tooltip

tinytooltip

tinytooltip

More about tinytooltip

Tipsy

Tipsy

More about Tipsy

Sticky Tooltip

Sticky Tooltip

More about Sticky Tooltip

jQuery Tools Tooltip

jQuery Tools Tooltip

More about jQuery Tools Tooltip

EZPZ Tooltip

EZPZ Tooltip

More about EZPZ Tooltip

Gips

Gips

More about Gips

JQuery Tooltip Plugin

JQuery Tooltip Plugin

More about JQuery Tooltip Plugin

BsTip

BsTip

More about BsTip

ChillTip

ChillTip

More about ChillTip

TipTip

TipTip

More about TipTip

Colortip

Colortip

More about Colortip

jQuery and CSS3 Simple Tooltip

jQuery and CSS3 Simple Tooltip

More about jQuery and CSS3 Simple Tooltip

转:
http://www.cnblogs.com/58top/archive/2013/01/11/free-jquery-tooltip-plugins.html

posted @ 2013-03-20 22:00 小胡子 阅读(294) | 评论 (0)编辑 收藏

textarea元素已被广泛用于网页Web的IDE。通常网站自带的textarea编辑器不能满足我们的需求,作为一名开发者我们经常需要进行代码的在线编辑,高亮显示代码等,因此,通过其他的开源项目,我们可以添加一些实用的功能, 在这篇文章中,我将使用JavaScriptACE来创建一个输入框效果。这是一个完全开源的脚本。该脚本允许开发人员创建支持语法高亮的输入框。然后你可以代码嵌入到网站中的任何地方

下载库 首先我们需要Github上下载ACE代码。 下载完成后解压缩,在你的header部分引入js文件

 <script src="src-min/ace.js" type="text/javascript" charset="utf-8"></script>

添加代码到编辑器

首先设置一个id为editor的div 然后在script里面调用ace.edit()方法,代码如下

var editor = ace.edit("editor");
  editor.getSession().setMode(
"ace/mode/javascript");

您可以重命名变量,为了方便起见,我定义了var editor作为变量,你也可以定义var demoeditor作为变量。第二行声明使用哪种类型的语言高亮显示。您可以从 src 目录选择其他语言集合。这里是一些支持支持的语言集合:

  • SQL
  • Ruby
  • SASS
  • PHP
  • Objectivec
  • Csharp
  • Java
  • JSON

 使用额外的参数


editor.setTheme("ace/theme/dawn");
  editor.getSession().setTabSize(
2);
  editor.getSession().setUseWrapMode(
true);

这3行代码是关于文本输入效果的,第一行改变代码默认的语法颜色和主题,在src目录下个有几十个新的主题,你可以从中任意选择

另外两个选项是关于用户体验。通常情况下,按一个键盘上的Tab键将输入4个空格,这里我设置成2个空格,此外,该文本在默认情况下将不会自动换行,超了会追加一个水平滚动条向外延伸。但使用这种方法setUseWrapMode(true),我们可以修复自动换行的问题。

还有一些其他的命令,你可以参考ACE向导。这里面包含了改变光标的位置,动态添加新内容,或复制的文本的全部内容。


CSS代码

 


#editor {    
margin
-left: 15px;
margin
-top: 15px;
width: 1000px;
height: 400px; }
原文出自:
http://www.cnblogs.com/58top/archive/2013/01/28/building-a-syntax-highlighted-input-box-with-javascript.html






posted @ 2013-03-20 21:35 小胡子 阅读(332) | 评论 (0)编辑 收藏

Aspect Oriented Programming  面向切面编程。解耦是程序员编码开发过程中一直追求的。AOP也是为了解耦所诞生。

具体思想是:定义一个切面,在切面的纵向定义处理方法,处理完成之后,回到横向业务流。

AOP 在Spring框架中被作为核心组成部分之一,的确Spring将AOP发挥到很强大的功能。最常见的就是事务控制。工作之余,对于使用的工具,不免需要了解其所以然。学习了一下,写了些程序帮助理解。

AOP 主要是利用代理模式的技术来实现的。

1、静态代理:就是设计模式中的proxy模式

a、业务接口


/**
 * 抽象主题角色:声明了真实主题和代理主题的共同接口。
 * 
 * 
@author yanbin
 * 
 
*/
public interface ITalk {

    
public void talk(String msg);

}
b、业务实现

/**
 * 真实主题角色:定义真实的对象。
 * 
 * 
@author yanbin
 * 
 
*/
public class PeopleTalk implements ITalk {

    
public String username;
    
public String age;

    
public PeopleTalk(String username, String age) {
        
this.username = username;
        
this.age = age;
    }

    
public void talk(String msg) {
        System.out.println(msg 
+ "!你好,我是" + username + ",我年龄是" + age);
    }

    
public String getName() {
        
return username;
    }

    
public void setName(String name) {
        
this.username = name;
    }

    
public String getAge() {
        
return age;
    }

    
public void setAge(String age) {
        
this.age = age;
    }

}
c、代理对象

/**
 * 代理主题角色:内部包含对真实主题的引用,并且提供和真实主题角色相同的接口。
 * 
 * 
@author yanbin
 * 
 
*/
public class TalkProxy implements ITalk {

    
private ITalk talker;

    
public TalkProxy(ITalk talker) {
        
// super();
        this.talker = talker;
    }

    
public void talk(String msg) {
        talker.talk(msg);
    }

    
public void talk(String msg, String singname) {
        talker.talk(msg);
        sing(singname);
    }

    
private void sing(String singname) {
        System.out.println(
"唱歌:" + singname);
    }

}
d、测试类

/**
 * 代理测试类,使用代理
 *
 * 
@author yanbin
 * 
 
*/
public class ProxyPattern {

    
public static void main(String[] args) {
        
// 不需要执行额外方法的。
        ITalk people = new PeopleTalk("AOP""18");
        people.talk(
"No ProXY Test");
        System.out.println(
"-----------------------------");

        
// 需要执行额外方法的(切面)
        TalkProxy talker = new TalkProxy(people);
        talker.talk(
"ProXY Test""代理");
    }

}

从这段代码可以看出来,代理模式其实就是AOP的雏形。 上端代码中talk(String msg, String singname)是一个切面。在代理类中的sing(singname)方法是个后置处理方法。

这样就实现了,其他的辅助方法和业务方法的解耦。业务不需要专门去调用,而是走到talk方法,顺理成章的调用sing方法

再从这段代码看:1、要实现代理方式,必须要定义接口。2、每个业务类,需要一个代理类。

2、动态代理:jdk1.5中提供,利用反射。实现InvocationHandler接口。

业务接口还是必须得,业务接口,业务类同上。

a、代理类:


/**
 * 动态代理类
 * 
 * 
@author yanbin
 * 
 
*/
public class DynamicProxy implements InvocationHandler {

    
/** 需要代理的目标类 */
    
private Object target;

    
/**
     * 写法固定,aop专用:绑定委托对象并返回一个代理类
     * 
     * 
@param delegate
     * 
@return
     
*/
    
public Object bind(Object target) {
        
this.target = target;
        
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
    }

    
/**
     * 
@param Object
     *            target:指被代理的对象。
     * 
@param Method
     *            method:要调用的方法
     * 
@param Object
     *            [] args:方法调用时所需要的参数
     
*/
    @Override
    
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object result 
= null;
        
// 切面之前执行
        System.out.println("切面之前执行");
        
// 执行业务
        result = method.invoke(target, args);
        
// 切面之后执行
        System.out.println("切面之后执行");
        
return result;
    }

}
b、测试类

/**
 * 测试类
 * 
 * 
@author yanbin
 * 
 
*/
public class Test {

    
public static void main(String[] args) {
        
// 绑定代理,这种方式会在所有的方法都加上切面方法
        ITalk iTalk = (ITalk) new DynamicProxy().bind(new PeopleTalk());
        iTalk.talk(
"业务说明");
    }
}

输出结果会是:

切面之前执行
people talk业务说法
切面之后执行

说明只要在业务调用方法切面之前,是可以动态的加入需要处理的方法。

从代码来看,如果再建立一个业务模块,也只需要一个代理类。ITalk iTalk = (ITalk) new DynamicProxy().bind(new PeopleTalk());  将业务接口和业务类绑定到动态代理类。

但是这种方式:还是需要定义接口。

3、利用cglib

CGLIB是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强。采用的是继承的方式。不细说,看使用

a、业务类


/**
 * 业务类
 * 
 * 
@author yanbin
 * 
 
*/
public class PeopleTalk {

    
public void talk(String msg) {
        System.out.println(
"people talk" + msg);
    }

}
b、cglib代理类

/**
 * 使用cglib动态代理
 * 
 * 
@author yanbin
 * 
 
*/
public class CglibProxy implements MethodInterceptor {

    
private Object target;

    
/**
     * 创建代理对象
     * 
     * 
@param target
     * 
@return
     
*/
    
public Object getInstance(Object target) {
        
this.target = target;
        Enhancer enhancer 
= new Enhancer();
        enhancer.setSuperclass(
this.target.getClass());
        
// 回调方法
        enhancer.setCallback(this);
        
// 创建代理对象
        return enhancer.create();
    }

    @Override
    
public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        Object result 
= null;
        System.out.println(
"事物开始");
        result 
= methodProxy.invokeSuper(proxy, args);
        System.out.println(
"事物结束");
        
return result;
    }

}
c.测试类

/**
 * 测试类
 * 
 * 
@author yanbin
 * 
 
*/
public class Test {

    
public static void main(String[] args) {
        PeopleTalk peopleTalk 
= (PeopleTalk) new CglibProxy().getInstance(new PeopleTalk());
        peopleTalk.talk(
"业务方法");
        peopleTalk.spreak(
"业务方法");
    }

}

最后输出结果:

事物开始
people talk业务方法
事物结束
事物开始
spreak chinese业务方法
事物结束

由于篇幅有限,这篇主要对AOP的原理简单实现做了演示和阐述,有助自己理解。至于Spring的AOP实现上面无外乎其右,不过实现方面复杂的多。

原文出自:
http://www.cnblogs.com/yanbincn/archive/2012/06/01/2530377.html





posted @ 2013-03-02 22:28 小胡子 阅读(306) | 评论 (0)编辑 收藏

     摘要: 摘要:ComboBox是常用控件之一,但由于其数据来源分两种形式:本地和远程,故写的形式难度并不亚于ExtJS中的TreePanel和 GridPanel。鄙人也经常提醒自己的师弟师妹,ExtJS本身是面向对象写的,不能在应用的时候却不按照面向对象来写,面向对象最起码的好处就是代 码的复用,对于网页来讲,代码复用的好处就是加载的JS会少很多,这样网页渲染时就不会很慢。下面我将分别介绍扩展的四种Co...  阅读全文

posted @ 2013-03-02 21:48 小胡子 阅读(5088) | 评论 (0)编辑 收藏

首先定义一数据源,一般使用simpleStore,jsonStore。需要注意的是simpleStore用于读取二维数组的数据,而jsonStroe用于读取json数据格式。
Combox使用simpleStore 代码如下所示:
var subjectField = new Ext.form.ComboBox({
     fieldLabel : '分类名称',
    hiddenName : 'drug.subjectCode',// 传递到后台的参数
    store : new Ext.data.SimpleStore({
    autoLoad : true,
    url :'xxx',
    fields : ['subjectCode', 'subjectName']
    }),
   valueField : 'subjectCode',// 域的值,对应于store里的fields
   displayField : 'subjectName',// 显示的域,对应于store里的fields
   typeAhead : true,// 设置true,完成自动提示
   mode : 'local', // 设置local,combox将从本地加载数据
   triggerAction : 'all',// 触发此表单域时,查询所有
   selectOnFocus : true,
   anchor : '90%',
   forceSelection : true
   });



服务端返回的数据结构如下所示:
[
["00000003","硬膏剂"],
["00000005","滴眼剂"],
["00000016","栓剂"],
["00000017","注射剂"],
["00000018","软膏剂"]
]

当combox使用jsonStore时,一般运用于分页查询。页面效果如下所示:



示例代码如下所示:
// 药品商品名
 
var itemNameField = new Ext.form.ComboBox({
    width : 
200,
    fieldLabel : '药品商品名',
    hiddenName : 'drug.itemName',
    store : advanceStore,
    valueField : 'itemName',
    displayField : 'itemName',
    typeAhead : 
true,
    mode : 'remote',
// 分页查询必须设置为    remote,当我们点击下一页的时候是从服务端取数据,而不是本地
    triggerAction : 'all',
    emptyText : '请选择一个分类名',
    selectOnFocus : 
true,
    minChars : 
0// 完成自动提示,当mode为‘local’时,默认为0,当mode为‘remote’时候,默认为4,这里设置为0
    pageSize : 10,// 每页显示的记录数字
    queryParam :'drug.itemName' // 在combox内敲入字符时候,combox向后台查询传递的参数,这里设置为'drug.itemName'是为了更好的封装,默认传递参数‘query’
    });

这里还有一个问题,就是Combox设置初始值。
我是采用如下做法的,不知道各位知不知道其他用法?

var subjectField = new Ext.form.ComboBox({
   fieldLabel : '分类名称',
   hiddenName : 'drug.subjectCode',
   store : 
new Ext.data.SimpleStore({
   autoLoad : 
true,
   url : 'xxx',
   fields : ['subjectCode', 'subjectName'],
   listeners : {
      load : 
function(){         subjectField.setValue(record.get("drug.subjectCode"));
   }
   }
   }),
   valueField : 'subjectCode',
   displayField : 'subjectName',
   typeAhead : 
true,
   mode : 'local',
   triggerAction : 'all',
   emptyText : '请选择一个分类名',
   selectOnFocus : 
true,
   anchor : '
90%',
   forceSelection : 
true
   });
原文出自:
http://www.iteye.com/topic/296710

posted @ 2013-03-02 21:43 小胡子 阅读(877) | 评论 (0)编辑 收藏


所有的事件回调函数都有两个参数:eventui,浏览器自有event对象,和经过封装的ui对象  
ui.helper - 表示sortable元素的JQuery对象,通常是当前元素的克隆对象  
ui.position - 表示相对当前对象,鼠标的坐标值对象{top,left}  
ui.offset - 表示相对于当前页面,鼠标的坐标值对象{top,left}  
ui.item - 表示当前拖拽的元素  
ui.placeholder - 占位符(如果有定义的话)  
ui.sender - 当前拖拽元素的所属sortable对象(仅当元素是从另一个sortable对象传递过来时有用)  

·参数(参数名 : 参数类型 : 默认值)  
appendTo : String : 'parent'
Defines where the helper that moves with the mouse is being appended to during the drag (for example, to resolve overlap/zIndex issues).  
初始:$('.selector').sortable({ appendTo: 'body' });  
获取:var appendTo = $('.selector').sortable('option', 'appendTo');  
设置:$('.selector').sortable('option', 'appendTo', 'body');  

axis : String : false   
如果有设置,则元素仅能横向或纵向拖动。可选值:'x', 'y'
初始:$('.selector').sortable({ axis: 'x' });  
获取:var axis = $('.selector').sortable('option', 'axis');  
设置:$('.selector').sortable('option', 'axis', 'x');  

cancel : Selector : ':input,button'   
阻止排序动作在匹配的元素上发生。  
初始:$('.selector').sortable({ cancel: 'button' });  
获取:var cancel = $('.selector').sortable('option', 'cancel');  
设置:$('.selector').sortable('option', 'cancel', 'button');  

connectWith : Selector : false   
允许sortable对象连接另一个sortable对象,可将item元素拖拽到另一个中。  
初始:$('.selector').sortable({ connectWith: '.otherlist' });  
获取:var connectWith = $('.selector').sortable('option', 'connectWith');  
设置:$('.selector').sortable('option', 'connectWith', '.otherlist');  

containment : Element, String, Selector : false   
约束排序动作只能在一个指定的范围内发生。可选值:DOM对象, 'parent', 'document', 'window', 或jQuery对象  
初始:$('.selector').sortable({ containment: 'parent' });  
获取:var containment = $('.selector').sortable('option', 'containment');  
设置:$('.selector').sortable('option', 'containment', 'parent');  

cursor : String : 'auto'
定义在开始排序动作时,如果的样式。  
初始:$('.selector').sortable({ cursor: 'crosshair' });  
获取:var cursor = $('.selector').sortable('option', 'cursor');  
设置:$('.selector').sortable('option', 'cursor', 'crosshair');  

cursorAt : Object : false   
当开始移动时,鼠标定位在的某个位置上(最多两个方向)。可选值:{ top, left, right, bottom }.  
初始:$('.selector').sortable({ cursorAt: 'top' });  
获取:var cursorAt = $('.selector').sortable('option', 'cursorAt');  
设置:$('.selector').sortable('option', 'cursorAt', 'top');  

delay : Integer : 0  
以毫秒为单位,设置延迟多久才激活排序动作。此参数可防止误点击。  
初始:$('.selector').sortable({ delay: 500 });  
获取:var delay = $('.selector').sortable('option', 'delay');  
设置:$('.selector').sortable('option', 'delay', 500);  

distance : Integer : 1  
决定至少要在元素上面拖动多少像素后,才正式触发排序动作。  
初始:$('.selector').sortable({ distance: 30 });  
获取:var distance = $('.selector').sortable('option', 'distance');  
设置:$('.selector').sortable('option', 'distance', 30);  

dropOnEmpty : Boolean : true   
是否允許拖拽到一個空的sortable对象中。  
初始:$('.selector').sortable({ dropOnEmpty: false });  
获取:var dropOnEmpty = $('.selector').sortable('option', 'dropOnEmpty');  
设置:$('.selector').sortable('option', 'dropOnEmpty', false);  

forceHelperSize : Boolean : false   
If true, forces the helper to have a size.  
初始:$('.selector').sortable({ forceHelperSize: true });  
获取:var forceHelperSize = $('.selector').sortable('option', 'forceHelperSize');  
设置:$('.selector').sortable('option', 'forceHelperSize', true);  

forcePlaceholderSize : Boolean : false
If true, forces the placeholder to have a size.  
初始:$('.selector').sortable({ forcePlaceholderSize: true });  
获取:var forcePlaceholderSize = $('.selector').sortable('option', 'forcePlaceholderSize');  
设置:$('.selector').sortable('option', 'forcePlaceholderSize', true);  

grid : Array : false   
将排序对象的item元素视为一个格子处理,每次移动都按一个格子大小移动,数组值:[x,y]  
初始:$('.selector').sortable({ grid: [50, 20] });  
获取:var grid = $('.selector').sortable('option', 'grid');  
设置:$('.selector').sortable('option', 'grid', [50, 20]);  

handle : Selector, Element : false   
限制排序的动作只能在item元素中的某个元素开始。  
初始:$('.selector').sortable({ handle: 'h2' });  
获取:var handle = $('.selector').sortable('option', 'handle');  
设置:$('.selector').sortable('option', 'handle', 'h2');  

helper : String, Function : 'original'   
设置是否在拖拽元素时,显示一个辅助的元素。可选值:'original', 'clone'
初始:$('.selector').sortable({ helper: 'clone' });  
获取:var helper = $('.selector').sortable('option', 'helper');  
设置:$('.selector').sortable('option', 'helper', 'clone');  

items : Selector : '> *'   
指定在排序对象中,哪些元素是可以进行拖拽排序的。  
初始:$('.selector').sortable({ items: 'li' });  
获取:var items = $('.selector').sortable('option', 'items');  
设置:$('.selector').sortable('option', 'items', 'li');  

opacity : Float : false   
定义当排序时,辅助元素(helper)显示的透明度。  
初始:$('.selector').sortable({ opacity: 0.6 });  
获取:var opacity = $('.selector').sortable('option', 'opacity');  
设置:$('.selector').sortable('option', 'opacity', 0.6);  

placeholderType: StringDefault: false   
设置当排序动作发生时,空白占位符的CSS样式。  
初始:$('.selector').sortable({ placeholder: 'ui-state-highlight' });  
获取:var placeholder = $('.selector').sortable('option', 'placeholder');  
设置:$('.selector').sortable('option', 'placeholder', 'ui-state-highlight');  

revert : Boolean : false
如果设置成true,则被拖拽的元素在返回新位置时,会有一个动画效果。  
初始:$('.selector').sortable({ revert: true });  
获取:var revert = $('.selector').sortable('option', 'revert');  
设置:$('.selector').sortable('option', 'revert', true);  

scroll : Boolean : true
如果设置成true,则元素被拖动到页面边缘时,会自动滚动。  
初始:$('.selector').sortable({ scroll: false });  
获取:var scroll = $('.selector').sortable('option', 'scroll');  
设置:$('.selector').sortable('option', 'scroll', false);  

scrollSensitivity : Integer : 20   
设置当元素移动至边缘多少像素时,便开始滚动页面。  
初始:$('.selector').sortable({ scrollSensitivity: 40 });  
获取:var scrollSensitivity = $('.selector').sortable('option', 'scrollSensitivity');  
设置:$('.selector').sortable('option', 'scrollSensitivity', 40);  

scrollSpeed : Integer : 20  
设置页面滚动的速度。  
初始:$('.selector').sortable({ scrollSpeed: 40 });  
获取:var scrollSpeed = $('.selector').sortable('option', 'scrollSpeed');  
设置:$('.selector').sortable('option', 'scrollSpeed', 40);  

tolerance : String : 'intersect'
设置当拖动元素越过其它元素多少时便对元素进行重新排序。可选值:'intersect', 'pointer'
intersect:至少重叠50%  
pointer:鼠标指针重叠元素  
初始:$('.selector').sortable({ tolerance: 'pointer' });  
获取:var tolerance = $('.selector').sortable('option', 'tolerance');  
设置:$('.selector').sortable('option', 'tolerance', 'pointer');  

zIndex : Integer : 1000  
设置在排序动作发生时,元素的z-index值。  
初始:$('.selector').sortable({ zIndex: 5 });  
获取:var zIndex = $('.selector').sortable('option', 'zIndex');  
设置:$('.selector').sortable('option', 'zIndex', 5);  


·事件  

start  
当排序动作开始时触发此事件。  
定义:$('.selector').sortable({ start: function(event, ui) { ... } });  
绑定:$('.selector').bind('sortstart', function(event, ui) { ... });  

sort  
当元素发生排序时触发此事件。  
定义:$('.selector').sortable({ sort: function(event, ui) { ... } });  
绑定:$('.selector').bind('sort', function(event, ui) { ... });  

change  
当元素发生排序且坐标已发生改变时触发此事件。  
定义:$('.selector').sortable({ change: function(event, ui) { ... } });  
绑定:$('.selector').bind('sortchange', function(event, ui) { ... });  

beforeStop  
当排序动作结束之前触发此事件。此时占位符元素和辅助元素仍有效。  
定义:$('.selector').sortable({ beforeStop: function(event, ui) { ... } });  
绑定:$('.selector').bind('sortbeforeStop', function(event, ui) { ... });  

stop  
当排序动作结束时触发此事件。  
定义:$('.selector').sortable({ stop: function(event, ui) { ... } });  
绑定:$('.selector').bind('sortstop', function(event, ui) { ... });  

update  
当排序动作结束时且元素坐标已经发生改变时触发此事件。  
定义:$('.selector').sortable({ update: function(event, ui) { ... } });  
绑定:$('.selector').bind('sortupdate', function(event, ui) { ... });  

receive  
当一个已连接的sortable对象接收到另一个sortable对象的元素后触发此事件。  
定义:$('.selector').sortable({ receive: function(event, ui) { ... } });  
绑定:$('.selector').bind('sortreceive', function(event, ui) { ... });  

over  
当一个元素拖拽移入另一个sortable对象后触发此事件。  
定义:$('.selector').sortable({ over: function(event, ui) { ... } });  
绑定:$('.selector').bind('sortover', function(event, ui) { ... });  

out  
当一个元素拖拽移出sortable对象移出并进入另一个sortable对象后触发此事件。  
定义:$('.selector').sortable({ out: function(event, ui) { ... } });  
绑定:$('.selector').bind('sortout', function(event, ui) { ... });  

activate  
当一个有使用连接的sortable对象开始排序动作时,所有允许的sortable触发此事件。  
定义:$('.selector').sortable({ activate: function(event, ui) { ... } });  
绑定:$('.selector').bind('sortactivate', function(event, ui) { ... });  

deactivate  
当一个有使用连接的sortable对象结束排序动作时,所有允许的sortable触发此事件。  
定义:$('.selector').sortable({ deactivate: function(event, ui) { ... } });  
绑定:$('.selector').bind('sortdeactivate', function(event, ui) { ... });  


·方法  
destory  
从元素中移除拖拽功能。  
用法:.sortable( 'destroy' )  

disable  
禁用元素的拖拽功能。  
用法:.sortable( 'disable' )  

enable  
启用元素的拖拽功能。  
用法:.sortable( 'enable' )  

option  
获取或设置元素的参数。  
用法:.sortable( 'option' , optionName , [value] )  

serialize  
获取或设置序列化后的每个item元素的id属性。  
用法:.sortable( 'serialize' , [options] )  

toArray  
获取序列化后的每个item元素的id属性的数组。  
用法:.sortable( 'toArray' )  

refresh  
手动重新刷新当前sortable对象的item元素的排序。  
用法:.sortable( 'refresh' )  

refreshPositions  
手动重新刷新当前sortable对象的item元素的坐标,此方法可能会降低性能。  
用法:.sortable( 'refreshPositions' )  

cancel  
取消当前sortable对象中item元素的排序改变。  
用法:.sortable( 'cancel' )


排序后保存有两种方法,一是cookie,二是数据库配置文件等。
这个是cookie  的例子 大家可以参考 http://www.cnblogs.com/tianxiangbing/archive/2010/01/26/jquery_sortable.html

下面是数据库的部分代码 原作:
    $(function() {
        var show = $(".loader"); 
        var orderlist = $(".orderlist");
        var listleft = $("div[id = 'column_left']");
        var listcenter = $("div[id = 'column_center']");
        var listright = $("div[id = 'column_right']");
        $( ".column" ).sortable({
        opacity: 0.5,//拖动的透明度
        revert: true, //缓冲效果
        cursor: 'move', //拖动的时候鼠标样式
        connectWith: ".column",
        //开始用update 结果执行两次,浪费资源,古改成stop
        //但是stop在元素没有改变位置的时候也会执行,
        //用update其他js会有问题,^_^
        stop: function(){
            var new_order_left = []; //左栏布局
            var new_order_center = [];//中栏布局
            var new_order_right = [];//右栏布局
            listleft.children(".portlet").each(function() {
                new_order_left.push(this.title);
             });
            listcenter.children(".portlet").each(function() {
                new_order_center.push(this.title);
             });
            listright.children(".portlet").each(function() {
                new_order_right.push(this.title);
             });
            var newleftid = new_order_left.join(',');
            var newcenterid = new_order_center.join(',');
            var newrightid = new_order_right.join(',');
            $.ajax({
               type: "post",
               url: jsonUrl, //服务端处理程序
               data: { leftid: newleftid, centerid: newcenterid, rightid:newrightid},   //id:新的排列对应的ID,order:原排列顺序
//               beforeSend: function() {
//                    show.html(" 正在更新");
//               },
               success: function(msg) {
                    //alert(msg);
                    show.html("");
               }
            });
       }    
        });

原文出自:
http://hb-keepmoving.iteye.com/blog/1154618

posted @ 2013-03-01 12:44 小胡子 阅读(475) | 评论 (0)编辑 收藏

图片预加载

 1 (function($) {
 2   var cache = [];
 3   // Arguments are image paths relative to the current page.
 4   $.preLoadImages = function() {
 5     var args_len = arguments.length;
 6     for (var i = args_len; i--;) {
 7       var cacheImage = document.createElement('img');
 8       cacheImage.src = arguments[i];
 9       cache.push(cacheImage);
10     }
11   }
12 
13 jQuery.preLoadImages("image1.gif""/path/to/image2.png");

在新窗口打开链接 (target=”blank”)


1 $('a[@rel$='external']').click(function(){
2      this.target = "_blank";
3 });
4 
5 /*
6    Usage:
7    <a href="http://www.catswhocode.com" rel="external">catswhocode.com</a>
8 */

当支持 JavaScript 时为 body 增加 class


1 /* 该代码只有1行,但是最简单的用来检测浏览器是否支持 JavaScript 的方法,如果支持 JavaScript 就在 body 元素增加一个 hasJS 的 class */
2 $('body').addClass('hasJS');

平滑滚动页面到某个锚点


 1 $(document).ready(function() {
 2     $("a.topLink").click(function() {
 3         $("html, body").animate({
 4             scrollTop: $($(this).attr("href")).offset().top + "px"
 5         }, {
 6             duration: 500,
 7             easing: "swing"
 8         });
 9         return false;
10     });
11 });

鼠标滑动时的渐入和渐出


1 $(document).ready(function(){
2     $(".thumbs img").fadeTo("slow"0.6); // This sets the opacity of the thumbs to fade down to 60% when the page loads
3 
4     $(".thumbs img").hover(function(){
5         $(this).fadeTo("slow"1.0); // This should set the opacity to 100% on hover
6     },function(){
7         $(this).fadeTo("slow"0.6); // This should set the opacity back to 60% on mouseout
8     });
9 });

制作等高的列


1 var max_height = 0;
2 $("div.col").each(function(){
3     if ($(this).height() > max_height) { max_height = $(this).height(); }
4 });
5 $("div.col").height(max_height);

在一些老的浏览器上启用 HTML5 的支持


 1 (function(){
 2     if(!/*@cc_on!@*/0)
 3         return;
 4     var e = "abbr,article,aside,audio,bb,canvas,datagrid,datalist,details,dialog,eventsource,figure,footer,header,hgroup,mark,menu,meter,nav,output,progress,section,time,video".split(','),i=e.length;while(i--){document.createElement(e[i])}
 5 })()
 6 
 7 //然后在head中引入该js
 8 <!--[if lt IE 9]>
 9 <script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
10 <![endif]-->

测试浏览器是否支持某些 CSS3 属性


 1 var supports = (function() {
 2    var div = document.createElement('div'),
 3       vendors = 'Khtml Ms O Moz Webkit'.split(' '),
 4       len = vendors.length;
 5 
 6    return function(prop) {
 7       if ( prop in div.style ) return true;
 8 
 9       prop = prop.replace(/^[a-z]/function(val) {
10          return val.toUpperCase();
11       });
12 
13       while(len--) {
14          if ( vendors[len] + prop in div.style ) {
15             // browser supports box-shadow. Do what you need.
16             // Or use a bang (!) to test if the browser doesn't.
17             return true;
18          }
19       }
20       return false;
21    };
22 })();
23 
24 if ( supports('textShadow') ) {
25    document.documentElement.className += ' textShadow';

获取 URL 中传递的参数


1 $.urlParam = function(name){
2     var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);
3     if (!results) { return 0; }
4     return results[1|| 0;
5 }

禁用表单的回车键提交


1 $("#form").keypress(function(e) {
2   if (e.which == 13) {
3     return false;
4   }
5 });

posted @ 2013-03-01 09:53 小胡子 阅读(268) | 评论 (0)编辑 收藏