跟我一起学extjs5(37--单个模块的设计[5取得模块列表数据])


        写了几个月,总算有点盼头了,最终要从后台取得数据了。后台的spring mvc 和 service 仅仅能简单的说说了,里面加了几十个类。有兴趣的下载了源代码自己看。以下画张通用的模块列表取数据的流程,这个流程是适用于全部的模块。我这个后台处理程序也是对全部的模块进行统一处理,包含数据查找,新增,改动,删除都是同样的。


watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamZvaw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">



        绘图不是强项。看得懂即可。
        1、grid在渲染好后就会通过Stroe来取得数据;
        2、Stroe会发送ajax请求至后台server,spring mvc 会依据请求找到 ModuleController 中的对应取得数据的函数;
        3、控制器中调用ModuleService中的函数取得数据。
        4、Service再调用 ModuleDAO的函数从数据库中取得数据,然后一级级的返回到Store中。再显示在Grid之中。


        如今我们先做extjs5端的改动。原来的Store使用的是本地数据,如今要改成远程调用的数据,

1、先改动model的生成函数ModelFactory.js。这个函数依据传入的module的定义来生成model,主要生成的有fields属性和proxy。另一些以后要用到的函数。比方推断此条记录能否改动、删除等的函数。

另一个是取得本条记录的标志字段的函数。

  1. /**
  2. * 依据module的数据来生成模块的model
  3. */
  4. Ext.define('app.view.module.factory.ModelFactory', {
  5.  
  6. statics : {
  7. getModelByModule : function(module) {
  8.  
  9. var model = Ext.define('app.model.' + module.tf_moduleName, {
  10. extend : 'Ext.data.Model',
  11. module : module,
  12. idProperty : module.tf_primaryKey,
  13. nameFields : module.tf_nameFields,
  14. titleTpl : module.tf_titleTpl,
  15. titleTemplate : null,
  16. fields : this.getFields(module),
  17. proxy : {
  18. type : 'rest',
  19. batchActions : true,
  20. extraParams : {
  21. moduleName : module.tf_moduleName
  22. },
  23. api : {
  24. // 在这里加rest/是由于在web.xml中
  25. // <url-pattern>/rest/*</url-pattern>这一句。spring会依据rest
  26. // 后面的參数去进行匹配
  27. read : 'rest/module/fetchdata.do',
  28. update : 'rest/module/update.do',
  29. create : 'rest/module/create.do',
  30. destroy : 'rest/module/remove.do'
  31. },
  32. actionMethods : {
  33. create : 'POST',
  34. read : 'GET',
  35. update : 'PUT',
  36. destroy : 'DELETE'
  37. },
  38. reader : {
  39. type : 'json',
  40. root : 'records',
  41. totalProperty : 'totalCount'
  42. },
  43. writer : {
  44. type : 'json',
  45. writeRecordId : true,
  46. writeAllFields : false
  47. // 没有改动过的字段不增加到update和delete的json中去
  48. },
  49. listeners : {
  50. exception : function(proxy, response, operation) {
  51. // 将出错信息加到proxy中去,传递到store的sync中显示出错信息。显示后将此属性删除
  52. proxy.errorInfo = Ext.decode(response.responseText, true);
  53. // 假设出错信息解析出错,则增加一个缺省的
  54. if (!proxy.errorInfo)
  55. proxy.errorInfo = {
  56. resultCode : -1,
  57. errorMessage : '未知原因:' + response.responseText
  58. }
  59. }
  60. }
  61. },
  62.  
  63. getTitleTpl : function() {
  64. if (!this.titleTemplate) {
  65. if (this.titleTpl)
  66. this.titleTemplate = new Ext.Template(this.titleTpl);
  67. else
  68. this.titleTemplate = new Ext.Template('{' + this.nameFields + '}');
  69. }
  70. return this.titleTemplate.apply(this.getData())
  71. },
  72.  
  73. // 此条记录能否够改动
  74. canEdit : function() {
  75. if (this.module.tf_hasAuditing && this.get('tf_auditinged'))
  76. return false;
  77. if (this.module.tf_hasApprove && this.get('tf_shNowCount') > 0)
  78. return false;
  79. return true;
  80. },
  81.  
  82. // 此条记录能否够进行操作
  83. canOperate : function() {
  84. if (this.module.tf_hasAuditing && this.get('tf_auditinged'))
  85. return false;
  86. return true;
  87. },
  88.  
  89. // 此条记录能否够删除
  90. canDelete : function() {
  91. if (this.module.tf_hasAuditing && this.get('tf_auditinged'))
  92. return {
  93. canDelete : false,
  94. message : '【' + this.getTitleTpl() + '】已进行过审核,不同意进行删除操作!'
  95. };
  96. if (this.module.tf_hasApprove && this.get('tf_shNowCount') > 0)
  97. return {
  98. canDelete : false,
  99. message : '【' + this.getTitleTpl() + '】正在审批或已经审批完毕,不同意进行删除操作!'
  100. };
  101. return true;
  102. },
  103.  
  104. // 取得主键值
  105. getIdValue : function() {
  106. return this.get(this.idProperty);
  107. },
  108.  
  109. // 取得当前记录的名字字段
  110. getNameValue : function() {
  111. if (this.nameFields)
  112. return this.get(this.nameFields);
  113. else
  114. return null;
  115. }
  116.  
  117. });
  118. return model;
  119. },
  120. // String("String"), Boolean("Boolean"), Integer("Integer"),
  121. // Date("Date"), Double("Double"), Float("Float"); Percent
  122.  
  123. getFields : function(module) {
  124. var fields = [];
  125.  
  126. for (var i in module.moduleFields) {
  127. var fd = module.moduleFields[i];
  128.  
  129. var field = {
  130. name : fd.tf_fieldName,
  131. title : fd.tf_title,
  132. type : this.getTypeByStr(fd.tf_fieldType)
  133. };
  134. if (field.type == 'string') {
  135. field.useNull = true;
  136. field.serialize = this.convertToNull;
  137. }
  138.  
  139. if (fd.tf_fieldType == 'Date') {
  140. field.dateWriteFormat = 'Y-m-d';
  141. field.dateReadFormat = 'Y-m-d';
  142. }
  143. if (fd.tf_fieldType == 'Datetime')
  144. field.dateReadFormat = 'Y-m-d H:i:s';
  145. field.tf_haveAttachment = fd.tf_haveAttachment;
  146. fields.push(field);
  147. }
  148.  
  149. return fields;
  150.  
  151. },
  152.  
  153. getTypeByStr : function(str) {
  154. console.log(str);
  155. switch (str) {
  156. case 'String' :
  157. return 'string';
  158. case 'Boolean' :
  159. return 'boolean';
  160. case 'Integer' :
  161. return 'int';
  162. case 'Date' :
  163. return 'date';
  164. case 'Datetime' :
  165. return 'date';
  166. case 'Double' :
  167. case 'Float' :
  168. case 'Percent' :
  169. return 'float';
  170. default :
  171. return 'string';
  172. }
  173. },
  174.  
  175. // 假设是空字符串,返回null
  176. convertToNull : function(v) {
  177. return v ?
  178.  
  179. v : null;
  180. }
  181.  
  182. }
  183.  
  184. });

2、在app.store的文件夹下生成文件GridStore.js。这是grid的Store的类的定义。

  1. Ext.define('app.store.GridStore', {
  2. extend : 'Ext.data.Store',
  3.  
  4. modulePanel : null,
  5. remoteSort : true,
  6. autoLoad : true,
  7. autoSync : true,
  8. leadingBufferZone : 100,
  9. buffered : false, // buffered=true能够无限下拉。可是删除和新增,reload都有问题,临时不用
  10.  
  11. config : {
  12. extraParams : {},
  13. navigates : []
  14. // 导航属性选中的情况
  15. },
  16.  
  17. constructor : function(param) {
  18. var me = this;
  19. this.pageSize = 20;
  20. this.extraParams = {};
  21. this.navigates = [];
  22. // 有创建时加进来的导航约束
  23. if (param.modulePanel.param) {
  24. var dnv = param.modulePanel.param.defaultNavigateValues;
  25. this.setDefaultNavigates(dnv);
  26. }
  27. // ///////////
  28. this.callParent(arguments);
  29. },
  30.  
  31. listeners : {
  32. // 调用proxy进行ajax的时候。将參数加进 store.proxy中,在调用完毕后。删除掉全部的extraParams參数
  33. // 这样model.proxy就能够多store,互相不干扰了
  34. beforeprefetch : function(store) {
  35. for (var i in store.extraParams)
  36. store.proxy.extraParams[i] = store.extraParams[i];
  37. },
  38. // buffered = true ,运行的是 prefetch
  39. prefetch : function(store, records, successful) {
  40. for (var i in store.extraParams)
  41. delete store.proxy.extraParams[i];
  42. },
  43.  
  44. // buffered = false ,运行的是 load
  45. beforeload : function(store) {
  46. // console.log(store);
  47. for (var i in store.extraParams)
  48. store.proxy.extraParams[i] = store.extraParams[i];
  49.  
  50. },
  51.  
  52. load : function(store) {
  53. for (var i in store.extraParams)
  54. delete store.proxy.extraParams[i];
  55. }
  56.  
  57. }
  58.  
  59. });

3、改动app.view.module.Module类。把store 和 model的生成方式都改一下。

  1. initComponent : function() {
  2. console.log(this.moduleName + ' 正在创建');
  3. // 从MainModel中取得当前模块的定义数据。包含字段和各种设置的信息
  4.  
  5. var mainmodel = this.up('app-main').getViewModel();
  6. this.module = mainmodel.getModuleDefine(this.moduleName);
  7. var viewmodel = new Ext.create('app.view.module.ModuleModel', {
  8. // 将该模块的定义信息传递给本模块的viewModel
  9. module : this.module
  10. });
  11. this.setViewModel(viewmodel);
  12.  
  13. this.glyph = this.getViewModel().get('tf_glyph'); // 因为上面的glyph的bind无效,因此须要在这里增加glyph的设置
  14. this.model = app.view.module.factory.ModelFactory.getModelByModule(this.module);
  15. this.store = Ext.create('app.store.GridStore', {
  16. module : this.module,
  17. model : this.model,
  18. modulePanel : this
  19. });
  20. this.items = [{
  21. xtype : 'navigate', // 导航区域
  22. region : 'west',

4、后台服务器端在com.jfok.server.controller下增加ModuleController.java,这是spring mvc 的控制类。

  1. package com.jfok.server.controller;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.List;
  6. import java.util.Map;
  7. import javax.annotation.Resource;
  8. import javax.servlet.http.HttpServletRequest;
  9.  
  10. import org.apache.commons.logging.Log;
  11. import org.apache.commons.logging.LogFactory;
  12. import org.hibernate.exception.ConstraintViolationException;
  13. import org.springframework.dao.DataAccessException;
  14. import org.springframework.stereotype.Controller;
  15. import org.springframework.web.bind.annotation.PathVariable;
  16. import org.springframework.web.bind.annotation.RequestBody;
  17. import org.springframework.web.bind.annotation.RequestMapping;
  18. import org.springframework.web.bind.annotation.RequestMethod;
  19. import org.springframework.web.bind.annotation.ResponseBody;
  20.  
  21. import com.jfok.server.DAO.SystemBaseDAO;
  22. import com.jfok.server.DAO.module.ModuleDAO;
  23. import com.jfok.server.DAO.module.SqlModuleFilter;
  24.  
  25. import com.jfok.server.common.ModuleServiceFunction;
  26.  
  27. import com.jfok.server.hibernate.system._Module;
  28. import com.jfok.server.service.ApplicationService;
  29. import com.jfok.server.service.ModuleService;
  30.  
  31. import com.jfok.shared.module.DataDeleteResponseInfo;
  32. import com.jfok.shared.module.DataFetchResponseInfo;
  33. import com.jfok.shared.module.DataInsertResponseInfo;
  34. import com.jfok.shared.module.DataUpdateResponseInfo;
  35.  
  36. @Controller
  37. @RequestMapping(value = "/module")
  38. /**
  39. * 所有模块的的CRUD都是调用这个类的函数来完毕的Controller里面完毕的
  40. *
  41. * @author jiangfeng
  42. *
  43. */
  44. public class ModuleController {
  45.  
  46. @Resource
  47. private SystemBaseDAO systemBaseDAO;
  48.  
  49. @Resource
  50. private ModuleService moduleService;
  51.  
  52. @Resource
  53. private ModuleDAO moduleDAO;
  54.  
  55. private static final Log log = LogFactory.getLog(ModuleController.class);
  56.  
  57. /**
  58. * 依据前台的请求取得数据
  59. */
  60. @RequestMapping(value = "/fetchdata.do", method = RequestMethod.GET)
  61. public @ResponseBody
  62. Map<String, Object> fetchData(String moduleName, Integer start, Integer limit, String sort,
  63. String query, String columns, String navigates, String parentFilter,
  64. HttpServletRequest request) {
  65. DataFetchResponseInfo response = moduleService.fetchDataInner(moduleName, start, limit, sort,
  66. query, columns, navigates, parentFilter, (SqlModuleFilter) null, request);
  67. Map<String, Object> result = new HashMap<String, Object>();
  68. result.put("records", response.getMatchingObjects());
  69. result.put("totalCount", response.getTotalRows());
  70. return result;
  71. }
  72.  
  73. /**
  74. * 新增记录的时候,在后台取得缺省值
  75. *
  76. * @param moduleName
  77. * @param parentFilter
  78. * @param navigates
  79. * @param request
  80. * @return
  81. */
  82.  
  83. @RequestMapping(value = "/getnewdefault.do", method = RequestMethod.POST)
  84. public @ResponseBody
  85. Object getRecordNewDefault(String moduleName, String parentFilter, String navigates,
  86. HttpServletRequest request) {
  87.  
  88. return moduleService.getRecordNewDefault(moduleName, parentFilter, navigates, request);
  89.  
  90. }
  91.  
  92. @RequestMapping(value = "/fetchdata.do/{id}", method = RequestMethod.GET)
  93. public @ResponseBody
  94. Object getRecordById(String moduleName, @PathVariable("id") String id, HttpServletRequest request) {
  95. log.debug("依据主键取得模块的一条记录:" + moduleName + "," + id);
  96. Map<String, Object> result = new HashMap<String, Object>();
  97. result.put("totalCount", 1);
  98. List<Object> records = new ArrayList<Object>();
  99. try {
  100. records.add(moduleDAO.getModuleRecord(moduleName, id, request).toString());
  101. } catch (Exception e) {
  102. e.printStackTrace();
  103. }
  104. result.put("records", records);
  105. log.debug("getRecordById返回值:" + result.toString());
  106. return result;
  107. }
  108.  
  109. /**
  110. * 创建一条记录
  111. *
  112. * @param moduleName
  113. * @param inserted
  114. * @param request
  115. * @return
  116. */
  117. @RequestMapping(value = "/create.do", method = RequestMethod.POST)
  118. public @ResponseBody
  119. DataInsertResponseInfo addWithNoPrimaryKey(String moduleName, @RequestBody String inserted,
  120. HttpServletRequest request) {
  121.  
  122. return add(moduleName, inserted, request);
  123. }
  124.  
  125. @RequestMapping(value = "/create.do/{id}", method = RequestMethod.POST)
  126. public @ResponseBody
  127. DataInsertResponseInfo add(String moduleName, @RequestBody String inserted,
  128. HttpServletRequest request) {
  129. DataInsertResponseInfo result = null;
  130. try {
  131. result = moduleService.add(moduleName, inserted, request);
  132. if (result.getKey() != null) // 假设是空的话,那么就没有保存,错误原因已经在errorMessage里了
  133. result.getRecords().add(
  134. moduleDAO.getModuleRecord(moduleName, result.getKey(), request).toString());
  135. } catch (DataAccessException e) {
  136. e.printStackTrace();
  137. if (result == null)
  138. result = new DataInsertResponseInfo();
  139. result.setResultCode(ModuleService.STATUS_VALIDATION_ERROR);
  140. } catch (Exception e) {
  141. e.printStackTrace();
  142. if (result == null)
  143. result = new DataInsertResponseInfo();
  144. result.getErrorMessage().put("error", e.getMessage());
  145. result.setResultCode(ModuleService.STATUS_FAILURE);
  146. }
  147. return result;
  148. }
  149.  
  150. /**
  151. * 改动记录
  152. *
  153. * @param moduleName
  154. * @param id
  155. * @param oldid
  156. * @param operType
  157. * @param updated
  158. * @param request
  159. * @return
  160. */
  161. @RequestMapping(value = "/update.do/{id}", method = RequestMethod.PUT)
  162. public @ResponseBody
  163. DataUpdateResponseInfo update(String moduleName, @PathVariable("id") String id, String oldid,
  164. String operType, @RequestBody String updated, HttpServletRequest request) {
  165.  
  166. DataUpdateResponseInfo result = null;
  167. _Module module = ApplicationService.getModuleWithName(moduleName);
  168. // 假设主键值改动了,那么先进行主键的改动
  169. if (oldid != null && (!oldid.equals(id))) {
  170. try {
  171. result = moduleService.changeRecordId(moduleName, id, oldid);
  172. } catch (ConstraintViolationException e) {
  173. e.printStackTrace();
  174. result = new DataUpdateResponseInfo();
  175. if (e.getCause().toString().toLowerCase().indexOf("primary key") >= 0)
  176. result.getErrorMessage().put(module.getTf_primaryKey(), "改动过后的主键与原有的主键值反复!
  177.  
  178. ");
  179. else
  180. result.getErrorMessage().put(module.getTf_primaryKey(), "当前主键与子模块有约束关系。不能够改动!");
  181. result.setResultCode(ModuleService.STATUS_VALIDATION_ERROR);
  182. }
  183. if (!result.getResultCode().equals(0))
  184. return result;
  185. }
  186. // 改动记录
  187. try {
  188. result = moduleService.update(moduleName, id, operType, updated, request);
  189. result.getRecords().add(moduleDAO.getModuleRecord(moduleName, id, request).toString());
  190. } catch (DataAccessException e) {
  191. result = new DataUpdateResponseInfo();
  192. result.setResultCode(ModuleService.STATUS_VALIDATION_ERROR);
  193. } catch (Exception e) {
  194. e.printStackTrace();
  195. result = new DataUpdateResponseInfo();
  196. result.getErrorMessage().put("error", e.getMessage());
  197. result.setResultCode(ModuleService.STATUS_FAILURE);
  198. }
  199. return result;
  200. }
  201.  
  202. /**
  203. * 删除记录
  204. *
  205. * @param moduleName
  206. * @param id
  207. * @param request
  208. * @return
  209. */
  210. @RequestMapping(value = "/remove.do/{id}", method = RequestMethod.DELETE)
  211. public @ResponseBody
  212. DataDeleteResponseInfo remove(String moduleName, @PathVariable String id,
  213. HttpServletRequest request) {
  214. DataDeleteResponseInfo result = null;
  215. try {
  216. result = moduleService.remove(moduleName, id, request);
  217. } catch (DataAccessException e) {
  218. result = new DataDeleteResponseInfo();
  219. String errormessage = ModuleServiceFunction.addPK_ConstraintMessage(e, moduleName);
  220. result.setResultMessage(-1, errormessage != null ? errormessage
  221. : "请检查与本记录相关联的其它数据是否所有清空!<br/>");
  222. } catch (Exception e) {
  223. result = new DataDeleteResponseInfo();
  224. result.setResultMessage(-1, e.getMessage());
  225. }
  226. return result;
  227. }
  228.  
  229. @RequestMapping(value = "/removerecords.do")
  230. public @ResponseBody
  231. DataDeleteResponseInfo removeRecords(String moduleName, String ids, String titles,
  232. HttpServletRequest request) {
  233. DataDeleteResponseInfo result = null;
  234. String[] idarray = ids.split(",");
  235. String[] titlearray = titles.split("~~");
  236.  
  237. result = new DataDeleteResponseInfo();
  238.  
  239. for (int i = 0; i < idarray.length; i++) {
  240. try {
  241. DataDeleteResponseInfo recordDeleteResult = moduleService.remove(moduleName, idarray[i],
  242. request);
  243. if (recordDeleteResult.getResultCode() == 0)
  244.  
  245. result.getOkMessageList().add(titlearray[i]);
  246. else {
  247. if (recordDeleteResult.getErrorMessageList().size() > 0)
  248. result.getErrorMessageList().add(
  249. "【" + titlearray[i] + "】" + recordDeleteResult.getErrorMessageList().get(0));
  250. else
  251. result.getErrorMessageList().add("【" + titlearray[i] + "】" + "未知错误!");
  252. }
  253. } catch (DataAccessException e) {
  254. String errormessage = ModuleServiceFunction.addPK_ConstraintMessage(e, moduleName);
  255.  
  256. result.getErrorMessageList().add(
  257. "【" + titlearray[i] + "】" + (errormessage != null ?
  258.  
  259. errormessage : "关联的数据未清空!"));
  260. } catch (Exception e) {
  261. result.getErrorMessageList().add("【" + titlearray[i] + "】" + e.getMessage());
  262. }
  263. }
  264. result.setResultCode(result.getErrorMessageList().size());
  265. return result;
  266. }
  267.  
  268. }

5、在service包中增加ModuleService.java,用来完毕查询,新增,删除。改动的功能。

        6、增加ModuleDAO.java ,用来依据模块名称。起始行,终止行,筛选条件等来从数据库中取得数据。这些类太多了,就不一一写明了。




跟我一起学extjs5(37--单个模块的设计[5取得模块列表数据])的更多相关文章

  1. 跟我extjs5(38--单个模块的设计[6获得模块列表数据])

    跟我extjs5(38--单个模块的设计[6获得模块列表数据])         在程序的前一个表以及,据的执行过程. 在菜单中选择 "系统管理"--"模块分组" ...

  2. [译文]Domain Driven Design Reference(三)—— 模型驱动设计的构建模块

    本书是Eric Evans对他自己写的<领域驱动设计-软件核心复杂性应对之道>的一本字典式的参考书,可用于快速查找<领域驱动设计>中的诸多概念及其简明解释. 其它本系列其它文章 ...

  3. 跟我一起学extjs5(11--自己定义模块的设计)

    跟我一起学extjs5(11--自己定义模块的设计)        从这一节開始我们来设计并完毕一个自己定义模块.我们先来确定一个独立的模块的所能定义的一些模块信息. 下面信息仅仅是我自己在开发过程中 ...

  4. 跟我一起学extjs5(13--运行菜单命令在tabPanel中显示模块)

    跟我一起学extjs5(13--运行菜单命令在tabPanel中显示模块)         上面设计好了一个模块的主界面,以下通过菜单命令的运行来把这个模块增加到主界面其中. 在MainModule. ...

  5. 跟我一起学extjs5(42--单个模块的数据新增方式)

    跟我一起学extjs5(42--单个模块的数据新增方式)         前面的章节中已经增加了一个自己定义的模块,而且能够进行数据的新增.改动.删除的操作了,在这个基础上就能够大作文章了. 这一节来 ...

  6. 跟我一起学extjs5(22--模块Form的自己定义的设计)

    跟我一起学extjs5(22--模块Form的自己定义的设计)         前面几节完毕了模块Grid的自己定义,模块Form自己定义的过程和Grid的过程类似,可是要更复杂一些.先来设计一下要完 ...

  7. 跟我一起学extjs5(18--模块的新增、改动、删除操作)

    跟我一起学extjs5(18--模块的新增.改动.删除操作)         上节在Grid展示时做了一个金额单位能够手工选择的功能,假设你要增加其它功能.也仅仅要依照这个模式来操作即可了,比方说你想 ...

  8. 跟我一起学extjs5(24--模块Form的自己定义的设计[2])

    跟我一起学extjs5(24--模块Form的自己定义的设计[2])         在本节中将要增加各种类型的字段,在增加字段的时候因为能够一行增加多个字段,因此层次结构又多了一层fieldcont ...

  9. 跟我一起学extjs5(16--各种Grid列的自己定义渲染)

    跟我一起学extjs5(16--各种Grid列的自己定义渲染)         Grid各列已经可以展示出来了.列的类型包含字符型,整型,浮点型,货币型,百分比型,日期型和布尔型,我自己定义了各种类型 ...

随机推荐

  1. Android 上实现非root的 Traceroute -- 非Root权限下移植可运行二进制文件 脚本文件

    作者 : 万境绝尘 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/36438365 演示样例代码下载 : -- CSDN : h ...

  2. Android点滴---ViewHolder通用,优雅写法

    近期在做项目时,又要写 ViewHolder. 突然想到网上看看有没什么好的写法! 不知道你是不是也烦透了写那些没有技术含量的ViewHolder 看看这些.也许会有收获! 然后就找到了以下两篇文章( ...

  3. SpringMVC(转)

    http://www.cnblogs.com/liukemng/p/3725582.html

  4. iOS游戏开发游戏功能之外的东西

    对于一个游戏的开发,我们除了完毕游戏的功能之外,还有多少东西我们须要考虑呢? 非常多.也非常烦! 但做过一遍之后下一次就会非常easy. 都有什么东西我们想加入到游戏其中呢? (1)分享功能 (2)评 ...

  5. HBaseConvetorUtil 实体转换工具

    HBaseConvetorUtil 实体转换工具类 public class HBaseConvetorUtil {        /**    * @Title: convetor    * @De ...

  6. 和学生探讨吉林大学python问题

    学生们真的很强大,我知道玩微信,nodejs.... 我们去学校了解.当时互联网开始64K....

  7. C++ Primer 学习笔记_57_类和数据抽象 --管理指针成员

    复印控制 --管理指针成员 引言: 包括指针的类须要特别注意复制控制.原因是复制指针时.一个带指针成员的指针类 class HasPtr { public: HasPtr(int *p,int i): ...

  8. 使用JustDecompile修改程序集

    原文:使用JustDecompile修改程序集        JustDecompile是Telerik公司推出一个免费的.net反编译工具,支持插件,与Visual Studio 2010,2012 ...

  9. Windows Phone开发(5):室内装修

    原文:Windows Phone开发(5):室内装修 为什么叫室内装修呢?呵呵,其实说的是布局,具体些嘛,就是在一个页面中,你如何去摆放你的控件,如何管理它们,你说,像不像我们刚搬进新住所,要&quo ...

  10. java.lang.OutOfMemoryError: Java heap space错误和方法(集、转)

    错误的方式来解决溢出下面的堆空间是从网上找: java.lang.OutOfMemoryError: Java heap space ================================= ...