SSH项目--国税(六)

来源:互联网 发布:漫画美图软件 编辑:程序博客网 时间:2024/05/16 02:15
11条件查询
11.1条件查询信息列表
1、在baseDao、baseDaoImpl中编写和实现findObjects(String hql,Listparameters)
//条件查询
public List findObjects(String hql, Listparameters)throws Exception;


@Override
public List findObjects(String hql, Listparameters){
Query query = getSession().createQuery(hql);
if(parameters != null){
for(int i = 0; i < parameters.size(); i++){
query.setParameter(i, parameters.get(i));
}
}
return query.list();
}

2、在service、serviceImpl中调用baseDao中的条件查询方法
3、在action中用service中新写的findObjects(String hql,Listparameters)进行条件查询
SSH项目--国税(六)
4、添加listUI.jsp中的查询方法。
var list_url = "${basePath}nsfw/info_listUI.action";
  //搜索
  function doSearch(){
  document.forms[0].action = list_url;
  document.forms[0].submit();
  }

11.2优化查询-查询工具类QueryHelper
设计一个查询工具类QueryHelper,里面需要对将要查询的hql和参数进行组装,然后将此对象传递给service运用并返回结果。该工具类主要方法有:
①QueryHelper(Class clazz, String alias) 构造器,主要组装from 子句
②addCondition(String condition, Object... param)组装where子句
③addOrderByProperty(String property, String order) 组装order by子句
④getListQueryHql() 返回查询列表的hql
⑤getCountQueryHql() 返回统计总记录数的hql
⑥getParameters() 返回参数列表

具体类实现:
package cn.itcast.core.utils;

import java.util.ArrayList;
import java.util.List;

public class QueryHelper {
//from 子句
private String fromClause = "";
//where 子句
private String whereClause = "";
//order by 子句
private String orderByClause = "";
//where 子句中?对应的参数值
private List《Object》 parameters;
public static String ORDER_BY_ASC = "ASC";//升序
public static String ORDER_BY_DESC = "DESC";//降序
public QueryHelper(Class clazz, String alias){
fromClause = "FROM " + clazz.getSimpleName() + " " +alias;
}
public QueryHelper addCondition(String condition,Object...params){
if(whereClause.length() 》 0){
whereClause += " AND " + condition;
} else {
whereClause = " WHERE " + condition;
}
if(parameters == null){
parameters = new ArrayList《Object》();
}
for(Object param: params){
parameters.add(param);
}
return this;
}
public QueryHelper addOrderByProperty(String property, Stringorder){
if(orderByClause.length() 》 0){
orderByClause += "," + property + " " + order;
} else {
orderByClause += " ORDER BY " + property + " " + order;
}
return this;
}

//返回列表查询hql语句
public String getListQueryHql(){
return fromClause + whereClause + orderByClause;
}
//返回查询总记录数的hql
public String getCountHql(){
return "SELECT Count(*) " + fromClause + whereClause;
}
public List《Object》 getParameters() {
return parameters;
}
}

利用新的查询工具类QueryHelper在baseDao中新编写一个findObjects(QueryHelperqh)方法进行页面的条件查询。
baseDao
//条件查询
public List findObjects(QueryHelper queryHelper) throwsException;

@Override
public List findObjects(QueryHelper queryHelper) {
Query query =getSession().createQuery(queryHelper.getQueryListHql());
Listparameters =queryHelper.getParameters();
if(parameters != null){
for(int i = 0; i < parameters.size(); i++){
query.setParameter(i, parameters.get(i));
}
}
return query.list();
}

对应的service/serviceImpl也添加此方法提供给action调用。

在对应的action中查询可以使用查询助手进行:

public String listUI() throws Exception{
try {
QueryHelper queryHelper = new QueryHelper(Info.class,"i");
if(info != null){
if(StringUtils.isNotBlank(info.getTitle())){
info.setTitle(URLDecoder.decode(info.getTitle(),"utf-8"));
queryHelper.addCondition("i.title like ?", "%" +info.getTitle() + 

"%");
}
}
//根据创建时间降序排序
queryHelper.addOrderByProperty("i.createTime",QueryHelper.ORDER_BY_DESC);
infoList = infoService.findObjects(queryHelper);
} catch (Exception e) {
throw new Exception(e.getMessage());
}
return "listUI";
}


11.3条件回显
1、条件删除后回显查询条件:
当在列表页中,通过条件查询了记录后,并对记录进行了删除,应当在删除后返回查询列表时保留查询条件。
改造action中的查询方法,对中文查询条件进行decode 
info.setTitle(URLDecoder.decode(info.getTitle(),"utf-8"));

在配置文件中redirectAction时,对中文参数进行encode:
《package name="info-action" namespace="/nsfw"extends="base-default"》
《action name="info_*"class="cn.itcast.nsfw.info.action.InfoAction" method="{1}"》
《resultname="{1}"》/WEB-INF/jsp/nsfw/info/{1}.jsp《/result》
《result name="list" type="redirectAction"》
《param name="actionName"》info_listUI《/param》
《param name="info.title"》${strTitle}《/param》
《param name="pageNo"》${pageNo}《/param》
《param name="encode"》true《/param》
《/result》
《/action》
《/package》

2、条件编辑后回显查询条件:
当在列表页中,通过条件查询了记录后,并对记录进行了编辑,应当在编辑后返回查询列表时保留查询条件。

此时应当①在跳转到编辑页面的方法中先将列表中的查询条件缓存起来避免被覆盖;②在转发跳转到编辑页面时,在页面中应对缓存起来的条件在页面中暂存避免遗漏查询条件;③当编辑页面提交并保存编辑后,重定向到列表方法之际,应当把原有的查询条件作为参数传递到查询列表方法

12分页
12.1页面分页信息分析
 
上图中,发现分页需要的信息有:当前页号,总共页数,上一页,下一页,附带一个数据列表。
由于一般分页是在列表页,所以上面的信息中,数据列表对象是已经有了的;而且上一页、下一页这个只是当前页的数量的加减,所以现在只需要能获取到当前页号,总共页数就可以。也就是说从Action中查询完数据后,需要返回一个这样的对象,它至少包括了:当前页号、总页数、数据列表(具体数据对象不明)。

再分析;总页数是怎么出来的?应该是要有每页最多显示多少条,然后总共的记录是多少;才能计算出总页数;即使前端页面不显示,但是我们后台计算也是需要总记录数和每页大小才能计算出总页数。这样对象中也要包括这2个属性。

页面对象(当前页号,总页数,数据列表,总记录数,每页大小)
12.2 设计分页对象
根据上面的分析;可以写出一个页面对象,内容包括了:当前页号,总页数,数据列表,总记录数,每页大小。

这个类主要目的是:在数据库层查询数据后,应该将查询到的列表封装给页面对象,并且根据从action中传递的页面大小和当前页,计算出在页面上所需要的属性(当前页、总页数、数据列表),然后再将这个页面对象返回给jsp页面使用。所以设计一个可以实现这个操作的类PageResult:

public class PageResult {

//总记录数
private long totalCount;
//当前页号
private int pageNo;
//总页数
private int totalPageCount;
//页大小
private int pageSize;
//列表记录
private List items;
//计算总页数
public PageResult(long totalCount, int pageNo, int pageSize,List items) {
this.items = items==null?new ArrayList():items;
this.totalCount = totalCount;
this.pageSize = pageSize;
if(totalCount != 0){
//计算总页数
int tem = (int)totalCount/pageSize;
this.totalPageCount =(totalCount%pageSize==0)?tem:(tem+1);
this.pageNo = pageNo;
} else {
this.pageNo = 0;
}
}
public long getTotalCount() {
return totalCount;
}
public void setTotalCount(long totalCount) {
this.totalCount = totalCount;
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
public int getTotalPageCount() {
return totalPageCount;
}
public void setTotalPageCount(int totalPageCount) {
this.totalPageCount = totalPageCount;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public List getItems() {
return items;
}
public void setItems(List items) {
this.items = items;
}
}

12.3实现分页
1、在baseDaoImpl中应该实现一个带分页功能的查询;
@Override
public PageResult getPageResult(QueryHelper queryHelper, intpageNo, int pageSize) {
Query query =getSession().createQuery(queryHelper.getQueryListHql());
List《Object》 parameters = queryHelper.getParameters();
if(parameters != null){
for(int i = 0; i < parameters.size(); i++){
query.setParameter(i, parameters.get(i));
}
}
if(pageNo < 1) pageNo = 1;
query.setFirstResult((pageNo-1)*pageSize);//设置数据起始索引号
query.setMaxResults(pageSize);
List items = query.list();
//获取总记录数
Query queryCount =getSession().createQuery(queryHelper.getQueryCountHql());
if(parameters != null){
for(int i = 0; i < parameters.size(); i++){
queryCount.setParameter(i, parameters.get(i));
}
}
long totalCount = (Long)queryCount.uniqueResult();
return new PageResult(totalCount, pageNo, pageSize,items);
}


2、由于分页信息在列表都需要使用到,所以可以将在jsp页面中需要使用到的分页对象PageResult和分页页号pageNo、页大小pageSize放置baseAction中。

public abstract class BaseAction extends ActionSupport {

protected String[] selectedRow;

protected PageResult pageResult;
private int PageNo;
private int pageSize;
public static int DEFAULT_PAGE_SIZE = 3;

3、业务Action中调用分页的方法;
public String listUI() throws Exception{
//加载分类集合
ActionContext.getContext().getContextMap().put("infoTypeMap",Info.INFO_TYPE_MAP);
QueryHelper queryHelper = new QueryHelper(Info.class,"i");
try {
if(info != null){
if(StringUtils.isNotBlank(info.getTitle())){
info.setTitle(URLDecoder.decode(info.getTitle(),"utf-8"));
queryHelper.addCondition("i.title like ?", "%" +info.getTitle() + "%");
}
}
//根据创建时间降序排序
queryHelper.addOrderByProperty("i.createTime",QueryHelper.ORDER_BY_DESC);
pageResult = infoService.getPageResult(queryHelper,getPageNo(), getPageSize());
} catch (Exception e) {
throw new Exception(e.getMessage());
}
return "listUI";
}
4、Jsp页面中对分页对象进行解析。

12.4抽取前端分页代码
创建pageNavigator.jsp到项目的common目录下;页面内容如下:
《%@ page language="java" import="java.util.*"pageEncoding="utf-8"%》
《%@ taglib prefix="s" uri="/struts-tags"%》
《div class="c_pate" style="margin-top: 5px;"》
      
《table width="100%" class="pageDown" border="0"cellspacing="0"
cellpadding="0"》
《tr》
《td align="right"》
                总共《s:property value="pageResult.totalCount"/》 条记录,当前第 《s:propertyvalue="pageResult.pageNo"/》 页,
                共《s:property value="pageResult.totalPageCount"/》页 
               
                       《ahref="javascript:doGoPage(《s:propertyvalue='pageResult.pageNo-1'/》)"》上一页《/a》
               
               
                         《ahref="javascript:doGoPage(《s:propertyvalue='pageResult.pageNo+1'/》)"》下一页《/a》
                       
到 
max="" value="《s:property value='pageResult.pageNo'/》" /》  
   《/td》
《/tr》
《/table》
暂无数据!
       《/div》
《script type="text/javascript"》
//翻页
function doGoPage(pageNo){
document.getElementByIdx_x("pageNo").value = pageNo;
document.forms[0].action=list_url;
document.forms[0].submit();
}
《/script》
在一般的列表中只要引入 《jsp:includepage="/common/pageNavigator.jsp"/》
0 0
原创粉丝点击