一个礼拜开发出一个栏目(总结/反思)
架构:JEECMS+三大框架
开发人员:1人
1. 数据库设计
涉及到的数据库:nubb_movie(电影)/nubb_movie_type(电影类型)/nubb_movie_year(电影年份)/nubb_movie_area(电影地区)/nubb_movie_tag(电影标签)/nubb_actor(明星)
我不知道该怎么评价自己这一个礼拜的开发效率,尽管在投入编码之前,一再告诉自己,设计好一个数据库非常重要,但是事情做得不尽人意。
对电影栏目这一块的东西,在网上很常见,自己平时看网页的时候也去想怎样去设计这方面的数据库表、怎样去建立表与表之间的关联,这样就按照我自己脑子里想的方式去执行,但是到了整理/编写前台数据时,自己却发现有很多信息没有涉及到,导致回过头来重新加表,加字段! 原因在于自己没和编辑部沟通好,在对方的详细页面出来之后,应该要第一时间去分析功能需求,提出疑问。
数据库设计总结: 在把握整个功能需要之后,宁可多花时间来设计数据库,也不能跟着自己的感觉走,否则可能导致设计得不够全面,让开发工作断断续续。
2. 开发阶段
中间出现的问题:
# 映射文件 第一行声明class,其中有个catelog="test" 起初是用的MyEclipse自动生成的实体类和映射文件,多出这么个属性,我就没怎么管。但是到后台操作时,发现插入数据后列表有显示,但在数据表中没有任何记录! 重启服务器也没有用! 通过这一属性值test直面意思就是测试用的,也就是将存储的数据存入本地临时文件中,而并没有存入数据表中。
# struts 对实体bean的操作,至于简单的set/get赋值,取值的操作我就不细说了,为了减少对数据库的请求次数,我们在对有关联关系的实体类,通常的做法是:
public String add() { try { if(year_id > 0 && area_id > 0){ try { bean.setYear(myMng.findById(year_id)); bean.setMovieArea(areMng.findById(area_id)); this.setNubbMovieSet(); mMng.save(bean); } catch (Exception e) { e.printStackTrace(); } }else{ addActionError("添加失败!年度信息、地区未选择!"); return SHOW_ERROR; } } catch (Exception e) { e.printStackTrace(); } return this.list(); }
在one-to-many的关联中,many的那一方这样做大可不必,直接利用传主键ID的构造,new 出一个新的对象,如:
bean.setYear(new Year(year_id)); bean.setMovieArea(new Area(area_id)); this.setNubbMovieSet(); mMng.save(bean);
这样会不会很好用呢! :) 同理,我们都知道many-to-many从查询到插入、更新的效率都很慢,我们可以添加第三方表转换为one-to-many的关联关系,也能用到上述方法!
# 多项选择select组件
最近遇到一个新的需求,需要在明星添加页面中,关联多个电影,这样让想到了struts2中有个select多选组件。于是派上用场了:
<tr> <td width="20%" class="pn-flabel pn-flabel-h"> 电影电视剧: </td> <td width="80%" class="pn-fcontent"> <table border="0"> <tr> <td> <label for="leftTitle">全部明星</label><br/> 搜索:<input type="text" id="search" size="15"/><input type="button" value="搜索" id="searchActors"/><br/> <select size="15" id="leftSideCartoonCharacters" multiple="multiple"> <option value="-1">--- 全部影片 ---</option> <#list mlist as t> <option value="${t.id!}" class="search">${t.zhName!}</option> </#list> </select> <input type="button" onclick="moveOptionDown(document.getElementById('leftSideCartoonCharacters'), 'key', 'headerKey');" value="v" /> <input type="button" onclick="moveOptionUp(document.getElementById('leftSideCartoonCharacters'), 'key', 'headerKey');" value="^" /> </td> <td valign="middle" align="center"> <input type="button" value="<-" onclick="moveSelectedOptions(document.getElementById('rightSideCartoonCharacters'), document.getElementById('leftSideCartoonCharacters'), false, 'doubleHeaderKey', '');" /><br /><br /> <input type="button" value="->" onclick="moveSelectedOptions(document.getElementById('leftSideCartoonCharacters'), document.getElementById('rightSideCartoonCharacters'), false, 'headerKey', '');" /><br /><br /> <input type="button" value="<<--" onclick="moveAllOptions(document.getElementById('rightSideCartoonCharacters'), document.getElementById('leftSideCartoonCharacters'), false, 'doubleHeaderKey', '');" /><br /><br /> <input type="button" value="-->>" onclick="moveAllOptions(document.getElementById('leftSideCartoonCharacters'), document.getElementById('rightSideCartoonCharacters'), false, 'headerKey', '');" /><br /><br /> <input type="button" value="<*>" onclick="selectAllOptionsExceptSome(document.getElementById('leftSideCartoonCharacters'), 'key', 'headerKey');selectAllOptionsExceptSome(document.getElementById('rightSideCartoonCharacters'), 'key', 'doubleHeaderKey');" /><br /><br /> </td> <td> <label for="rightTitle">已选影片</label><br /> <select name="movie_ids" size="15" multiple="multiple" id="rightSideCartoonCharacters"> <option value="-1">--- 已选影片 ---</option> </select> <input type="button" onclick="moveOptionDown(document.getElementById('rightSideCartoonCharacters'), 'key', 'doubleHeaderKey');" value="v" /> <input type="button" onclick="moveOptionUp(document.getElementById('rightSideCartoonCharacters'), 'key', 'doubleHeaderKey');" value="^" /> </td> </tr> </table> </td> </tr>
在提交表单时,将选取项以一个数组的形式给Action操作,如下代码:
function checkForm(){ var selectedComs = document.getElementById("rightSideCartoonCharacters"); for(var i=0;i<selectedComs.length;i++){ selectedComs.options[i].selected = true; } $("#jvForm").submit; } $("#searchActors").bind("click",function(){ var $sou = $("#search").val(); if($sou == ""){ alert("搜索内容不能为空!"); return ; } $.post("/admin/auxiliary/movieactor/Com_search.htm", { val: $sou }, function(data){ $(".search").remove(); $("#leftSideCartoonCharacters").append(data); },"html"); }); </script> <script type="text/javascript" src="/script/optiontransferselect.js"></script> </body>
页面如下:
3. 反思
# 代码重构
简单来说将共用、重用性较高的代码抽取出来。 当然我们也不能觉得重构这东西很方便,一味的借助它。 我觉得:
1. 在找到目前最好的解决方案之后,适当使用重构
2. 可使用常用的设计模式处理业务逻辑,完了以后你再回头看看,有些方法大可不必使用重构的!
3. 利用继承体系来处理,有效的替代重构,比如:咱们对后台数据的增删改查,这就设置一个基类 存在公用的方法,让各个Action子类调用,如果有什么特殊的操作,也能扩展。
# 前台添加、编辑页面合并公用。
# 善于利用现有插件提升网页友好度