前面咱们已经完成了条件查询的功能,能够根据用户给出的条件进行查询数据。可是呢,仍是有一些小毛病的。咱们来看看:java
当咱们查询数据时候,对查询出来的数据进行操做。操做完毕后,它回到的不是咱们查询后的数据,而是咱们的初始化数据。这明显是不合适的,当用户操做完后,咱们应该返回的仍是条件查询出来的数据。sql
还有一点的就是:咱们的分页还没写……所以,本文主要解决这两个问题。apache
首先,咱们来分析一下为何咱们操做完毕后,获得的是初始化的数据。咱们按照用户的操做来看看到底哪里出了问题。数组
那么在这个过程,咱们遇到什么问题呢???ruby
在Action中使用一个变量封装着查询条件markdown
/************获取查询条件的值*************************/ private String selectCondition; public String getSelectCondition() { return selectCondition; } public void setSelectCondition(String selectCondition) { this.selectCondition = selectCondition; }
当请求到Action时,咱们将查询条件的值取出来,发给对应的JSP页面jsp
public String editUI() { //获得全部的信息类型 ActionContext.getContext().getContextMap().put("infoTypeMap", Info.INFO_TYPE_MAP); //外边已经传了id过来了,咱们要找到id对应的Info if (info != null && info.getInfoId() != null) { //把查询条件发给JSP页面 ActionContext.getContext().getContextMap().put("selectCondition", info.getTitle()); //直接获取出来,后面JSP会根据Info有getter就能读取对应的信息! info = infoServiceImpl.findObjectById(info.getInfoId()); } return "editUI"; }
JSP页面把发送过来的值存储好,经过隐藏域发送给Actionpost
<%--把查询条件带过去给Action--%> <s:hidden name="selectCondition"/>
从新抵达到Action的时候,因为Struts2有自动封装的功能,因此能够把查询条件封装到selectCondition变量中。最后操做完重定向到listUI界面this
因为是重定向,因此咱们须要在struts配置文件中把咱们的查询条件带过去:编码
<result name="list" type="redirectAction"> <param name="actionName">info_listUI</param> <!--重定向回去的时候,把查询条件带上--> <param name="info.title">${selectCondition}</param> </result>
固然啦,在删除的时候,把查询条件记录下来就好了。
//删除 public String delete() { selectCondition = info.getTitle(); String id = info.getInfoId(); infoServiceImpl.delete(id); return "list"; }
上面咱们的确解决了查询后数据回显的状况,可是若是咱们的查询条件是中文的话,会怎么样??
变成了乱码了…..在解决它以前,咱们又来分析一下为何出现乱码了….
那就是在重定向的时候,中文参数的数据搞乱了。
咱们在配置文件上,要传递参数的时候,设置编码:
<!--传输数据的时候须要编码--> <param name="encode">true</param>
if (info != null) { if (StringUtils.isNotBlank(info.getTitle())) { selectCondition = URLDecoder.decode(info.getTitle(),"UTF-8"); info.setTitle(selectCondition); queryHelper.addCondition(" i.title like ? ", "%" + info.getTitle() + "%"); } }
分页对咱们来讲也不是陌生的事情了,我曾经在写JDBC博文的时候就讲解过度页了:http://blog.csdn.net/hon_3y/article/details/53790092
分页的复用代码http://blog.csdn.net/hon_3y/article/details/70051541
咱们这一次仍是使用回咱们的分页复用代码,具体不一样的需求,在上面修改便可了。
/** * * @param queryHelper 查询助手,条件查询都交给查询助手来干 * @param currentPage 当前页数 * @return */ PageResult getPageResult(QueryHelper queryHelper, int currentPage);
/** * * @return 返回查询总记录数的sql语句 */ public String getTotalRecordSql() { return "SELECT COUNT(*) " + fromClause + whereClause; }
daoImpl实现:
先查询总记录数
public PageResult getPageResult(QueryHelper queryHelper, int currentPage) { //查询总记录数 Query queryCount = getSession().createQuery(queryHelper.getTotalRecordSql()); if (queryHelper.getObjectList() != null) { int i =0; for (Object o : queryHelper.getObjectList()) { queryCount.setParameter(i, o); i++; } } Long totalRecord = (Long) queryCount.uniqueResult(); //初始化PageResult对象 PageResult pageResult = new PageResult(currentPage, totalRecord); //查询具体模块的数据【有查询条件的也能够处理】 Query query = getSession().createQuery(queryHelper.returnHQL()); if (queryHelper.getObjectList() != null) { int i =0; for (Object o : queryHelper.getObjectList()) { query.setParameter(i, o); i++; } } //设置分页开始和末尾 query.setFirstResult(pageResult.getStartIndex()); query.setMaxResults(pageResult.getLineSize()); List dataList = query.list(); //将条件查询出来的数据设置到Page对象中 pageResult.setList(dataList); return pageResult; }
PageResult getPageResult(QueryHelper queryHelper, int currentPage);
public PageResult getPageResult(QueryHelper queryHelper, int currentPage) { return baseDao.getPageResult(queryHelper, currentPage); }
设置咱们须要用到的分页属性。
private int currentPageCount; private PageResult pageResult; public int getCurrentPageCount() { return currentPageCount; } public void setCurrentPageCount(int currentPageCount) { this.currentPageCount = currentPageCount; } public PageResult getPageResult() { return pageResult; } public void setPageResult(PageResult pageResult) { this.pageResult = pageResult; }
判断咱们的当前页是否为0【若是为0,就表明着刚初始化值,咱们设置为1】,调用service的方法获得分页对象
//当前页数没有值,那么赋值为1 if (currentPageCount == 0) { currentPageCount = 1; } pageResult = infoServiceImpl.getPageResult(queryHelper,currentPageCount);
在JSP页面中,咱们遍历分页对象的集合就能够获取分页的数据了。
<s:iterator value="pageResult.list" status="st">
咱们的分页属性和查询条件数据不仅仅只有Info模块用的,因而咱们将分页数据抽取到BaseAction中
/************分页属性*************************/ protected int currentPageCount; protected PageResult pageResult; public int getCurrentPageCount() { return currentPageCount; } public void setCurrentPageCount(int currentPageCount) { this.currentPageCount = currentPageCount; } public PageResult getPageResult() { return pageResult; } public void setPageResult(PageResult pageResult) { this.pageResult = pageResult; } /************获取查询条件的值*************************/ protected String selectCondition; public String getSelectCondition() { return selectCondition; } public void setSelectCondition(String selectCondition) { this.selectCondition = selectCondition; }
修改其余的模块,也可以拥有条件查询和分页查询这两个功能:以用户模块为例。
//抛出Action异常 public String listUI() throws ServiceException, UnsupportedEncodingException { QueryHelper queryHelper = new QueryHelper(User.class, "u"); //根据info是否为null来判断是不是条件查询。若是info为空,那么是查询全部。 if (user != null) { if (org.apache.commons.lang.StringUtils.isNotBlank(user.getName())) { selectCondition = URLDecoder.decode(user.getName(),"UTF-8"); user.setName(selectCondition); queryHelper.addCondition(" u.name like ? ", "%" + user.getName() + "%"); } } //当前页数没有值,那么赋值为1 if (currentPageCount == 0) { currentPageCount = 1; } pageResult = userServiceImpl.getPageResult(queryHelper,currentPageCount); return "listUI"; }
<s:iterator value="pageResult.list"> <jsp:include page="/common/pageNavigator.jsp"/>
处理查询后数据回显的问题:
public String editUI() { //把全部的角色查询出来,带过去给JSP页面显示 ActionContext.getContext().getContextMap().put("roleList", roleServiceImpl.findObjects()); //外边已经传了id过来了,咱们要找到id对应的User if (user != null &&user.getId() != null ) { //获得查询条件 selectCondition = user.getName(); //直接获取出来,后面JSP会根据User有getter就能读取对应的信息! user = userServiceImpl.findObjectById(user.getId()); //经过用户的id获得所拥有UserRole List<UserRole> roles = userServiceImpl.findRoleById(user.getId()); //把用户拥有角色的id填充到数组中,数组最后回显到JSP页面 int i=0; userRoleIds = new String[roles.size()]; for (UserRole role : roles) { userRoleIds[i++] = role.getUserRoleId().getRole().getRoleId(); } } return "editUI"; }
<%--把查询条件经过隐藏域带过去给Action--%> <s:hidden name="selectCondition"></s:hidden>
<action name="user_*" class="zhongfucheng.user.action.UserAction" method="{1}"> <result name="{1}" >/WEB-INF/jsp/user/{1}.jsp</result> <!--返回列表展现页面,重定向到列表展现--> <result name="list" type="redirectAction"> <param name="actionName">user_listUI</param> <param name="user.name">${selectCondition}</param> <param name="encode">true</param> </result> </action>
//删除 public String delete() { if (user != null && user.getId() != null) { //记载着查询条件 selectCondition = user.getName(); userServiceImpl.delete(user.getId()); } return "list"; }