首先做个需求分析。本项目主要是做一个手机抽奖功能,web端和手机端。手机端使用wap页面来实现,所以都是html5来写的,保证能很好的自动适应各种不同型号的手机分辨率。但是兼容性方面并没有太好的心得,在输入手机号界面,苹果手机上测试没用问题,安卓自带的浏览器在点击输入栏后会自动弹出键盘,便会讲图片顶上去,占用了内容的部分。所以就会乱掉。但是在安卓手机上用UC就可以正常。
直接开始代码的分析吧。框架用的是Spring+SpringMVC+Mybatis.前端用的是jquery UI.框架已经很完善了。但是还不算很了解,所以在这里重点分析。
首先是最基本的POJO.这里没什么好讲的,不过有些技巧可以用在这里,到了用到的地方再写吧。
与POJO对应的就是mybatis的配置了吧。虽然一开始学的是mybatis,但是并不是很了解,对于SQL的语句还是有些了解的,但是在这里自己写,很容易出错。之前在自己写的框架中这里经常报错,所以只好用了hibernate。但相对于灵活性来讲,还是感觉mybatis要好一些。
然后会有个Form表,现在还不知道是做什么用的。内容完全与POJO一样,但是在controller中从没调用过POJO,都是调用Form的,这算是分离吗?POJO只用来与mybatis做映射?嗯....还没搞懂。
然后便是Service和BO了,这里和之前学的差别不是很大,类似一个DAO,一个Impl。
再上面就是Controller了。虽然是用的SpringMVC,但是并没有用注解的方式,这里用的是绑定的方式,每家一个POJO类,都需要到Spring-service.xml中做配置,例如
<bean id="aaAnswerService" class="com.shenlan.nxzfw.service.AaAnswerBO"/>
再到Spring-web.xml中做个绑定。
<prop key="/aaAnswer.do">aaAnswerController</prop>
<bean id="aaAnswerController" class="com.shenlan.nxzfw.control.AaAnswerController"/>
这样以后访问地址就可以用aaAnswer.do?method=?
但是感觉还是用注解比较方便。
还有一点是,把JSP页面都放在WEB-INF下面,每个页面的访问都需要controller的处理,不能直接通过路径来访问,这样能增加安全性。
框架方面的事情就这些吧。从基本的页面修改方面来说吧。
首先是create。做一个添加功能,首先是页面的跳转aaAnswer.do?method=create跳转到添加页面。在跳转的时候传递addObject("createAaAnswerForm",new AaAnswerForm());创建一个视图,在页面上可以通过${createAaAnswerForm.字段名}来获取对象内容。相当于之前做的一个查询,把对象全都到页面,方便传值。
create方法只是做一个跳转。添加方法为Save方法,在这里经常用到的是自动设置添加人(当前用户),设置添加时间。先获取session中的用户名:
AaUserForm loginUser = (AaUserForm)request.getSession().getAttribute(Constants.USER_IN_SESSION);
aaQuestionForm.setCreateName(loginUser.getUserNo());
设置时间为当前系统时间只需要new data(); aaQuestionForm.setCreateDate(new Date());
接下来执行封装好的方法就行了。
做好添加下面就是要做显示了,首先也是一个跳转,aaAnswer.do?method=jqlist,跳转到jqlist页面,方法与create基本相同,也是传一个对象集合过去。但是JqGrid通过json放方式获取数据需要一个getdatalist方法。
public ModelAndView getDataList(HttpServletRequest request, HttpServletResponse response,String questionId) throws Exception {
DataRequest dataRequest = new DataRequest();
BindingResult result = bindObject(request, dataRequest);
AaAnswerForm aaAnswerForm= new AaAnswerForm();
result = bindObject(request, aaAnswerForm);
dataRequest.setObj(aaAnswerForm);
DataResponse<AaAnswer> dataResponse = new DataResponse<AaAnswer>();
Page pageData = aaAnswerService.findSinglepageList(dataRequest,dataRequest.getPage(), dataRequest.getRows());
List<AaAnswer> list = (List<AaAnswer>) pageData.getResult();
dataResponse.setPage(dataRequest.getPage());
dataResponse.setTotal(pageData.getTotalPageCount());
dataResponse.setRecord(pageData.getTotalCount());
dataResponse.setRows(list.size());
dataResponse.setSearch(dataRequest.getSearch());
dataResponse.setSidx(dataRequest.getSidx());
dataResponse.setSord(dataRequest.getSord());
request.setAttribute("questionId",questionId);
System.out.println(questionId);
dataResponse.setList(list);
new JqGirdJsonView(request, response, dataResponse);
return null;
}
主要是数据传递分页信息,排序等。在这里service方法中需要再做添加。切记切记!!!!
Page findSinglepageList(DataRequest dataRequest,int pageno, int pagesize);
同时BO
public Page findSinglepageList(DataRequest dataRequest, int pageno,int pagesize) {
PageBean pageBean = new PageBean();
pageBean.setData(dataRequest.getObj());
if(dataRequest.getSidx()!=null&&!dataRequest.getSidx().equals("")){
pageBean.setOrderBySql(" order by "+ dataRequest.getSidx() + " " + dataRequest.getSord());
}
if(dataRequest.getFilters()!=null&&!dataRequest.getFilters().equals("")){
pageBean.setConditionSql(new JqGridParseFilters().constructWhere(dataRequest.getFilters()));
}
Integer count = (Integer)giantdsDAO.getSqlMapClientTemplate().queryForObject("getAaAnswerCount",pageBean);
int begin = PageUtil.getRecordBeginPosition(pageno, count,pagesize);
int end = PageUtil.getRecordEndPosition(pageno, count,pagesize);
pageBean.setBegin(begin);
pageBean.setEnd(end);
List<AaAnswer> list = giantdsDAO.getSqlMapClientTemplate().queryForList("findAaAnswerPageList",pageBean);
return new Page(begin-1,count,pagesize,list);
}
这样才能分类获取数据,例如’aaQuestion.do?method=getDataList&字段名=‘+?
当然,还需要colNames与colModel等长,在每个字段设置好后,最后一个一定不能添加“,”,虽然在chrome中没问题,但是在IE中会出现解析问题。
显示方面就没太多问题了。