day54_电力项目_webservice改造&报表导出基础

本文档详细介绍了电力项目的第七天工作,包括使用Axis2进行WebService接口发布,实现分公司调用,探讨Hibernate的二级缓存优化,讲解联合查询的SQL语句应用,以及动态导出Excel报表的设置。同时,文中还强调了需要掌握的技能如WebService(Axis2)、二级缓存(Ehcache)和导出设置的开发。
摘要由CSDN通过智能技术生成

项目第七天(webservice+二级缓存+导出设置)

1:使用webservice发布系统元数据,分公司调用的过程(axis2)

需求:
这里写图片描述

操作步骤:详情请看【技术资料\webservice远程技术\axis的jar包】中的《axis发布webservice(使用eclipse的插件生成服务端和客户端.doc》
这里写图片描述

实质上分三步操作:
创建一个服务器端(电力系统),和一个客户端(人员系统)
第一步:使用服务器端提供的接口,生成.wsdl文件
第二步:使用.wsdl文件,在电力系统中生成服务器端的代码
第三步:使用.wsdl文件
http://localhost:8080/itcast0306elec/services/IWebSystemDDLService?wsdl
生成客户端(人员系统)的代码

优化:
客户端使用webservice不要每次都去从远程数据访问,而是在web容器启动的时候(使用监听,servlet,filter)从远程系统中加载一次数据,并将数据放置到application对象,每次使用的时候只需要从application对象中获取即可。

2:hibernate的二级缓存(cache)

优点:对应查询结果相同的数据,可以减少频繁检索数据库的操作。

分析:
项目中使用数据字典的时候,经常会遇见
* 使用数据类型和数据项的编号,获取数据项的值
* 使用数据类型和数据项的值,获取数据项的编号
* 使用数据类型,加载对应数据类型的下的集合
*
解决方案:
使用hibernate的二级缓存优化。
二级缓存中存放的数据结构
这里写图片描述

这里写图片描述

二级缓存整合项目:

第一步:导入jar包:
需要引入三个jar包
在hibernate下能找到
hibernate-distribution-3.5.6-Final\lib\optional\ehcache\ehcache-1.5.0.jar
在srping下能找到
..\lib\concurrent\backport-util-concurrent.jar
..\lib\jakarta-commons\commons-logging.jar

第二步:在hibernate.cfg.xml中添加配置:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
    "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- 开启二级缓存 -->
        <property name="hibernate.cache.use_second_level_cache">true</property>
        <!-- 提供二级缓存的供应商 -->
        <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
        <!-- 启用查询缓存 -->
        <property name="hibernate.cache.use_query_cache">true</property>

        <!-- 加载映射文件 -->
        <mapping resource="cn/itcast/elec/domain/ElecSystemDDL.hbm.xml"/>
        <!-- 指定使用二级缓存的类 放在maping下面 -->
        <!-- 配置类级别的二级缓存 -->
        <class-cache usage="read-write" class="cn.itcast.elec.domain.ElecSystemDDL"/>
    </session-factory>
</hibernate-configuration>

第三步:在DAO中执行的hql语句的时候,调用setCacheable(true),例如:


public List<T> findCollectionByConditionNoPageWithCache(String condition,
            final Object[] params, Map<String, String> orderby) {
        String hql = "SELECT o FROM "+entityClass.getSimpleName()+" o WHERE 1=1";
        String orderByHql = this.initOrderByHql(orderby);
        final String finalHql = hql + condition + orderByHql;
        //执行hql语句
        /**方式三*/
        List<T> list = this.getHibernateTemplate().execute(new HibernateCallback() {

            public Object doInHibernate(Session session)
                    throws HibernateException, SQLException {
                Query query = session.createQuery(finalHql);
                if(params!=null && params.length>0){
                    for(int i=0;i<params.length;i++){
                        query.setParameter(i, params[i]);
                    }
                }
                query.setCacheable(true);
                return query.list();
            }
        });
        return list;
    }

3:sql语句的联合查询

项目用使用sql语句的联合查询
这里写图片描述

显示的结果:
输出的结果是:List中存放Object[]数组对象,将List中的对象输出到页面上。
这里写图片描述

Sql语句的联合查询应用(标量查询):
以上功能可以实现步骤:
ElecUserAction类


public String home(){
    List<ElecSystemDDL> jctList = elecSystemDDLService.findSystemDDLListByKeyword("所属单位");
    request.setAttribute("jctList", jctList);
    List<ElecUser> userList = elecUserService.findUserListByConditionWithSql(elecUser); 
    request.setAttribute("userList", userList);
    return "home";
}

ElecUserService类


public List<ElecUser> findUserListByConditionWithSql(ElecUser elecUser) {
    /**方案二:使用sql语句+标量查询*/
    //查询条件
    String condition = "";
    List<Object> paramsList = new ArrayList<Object>();
    //用户名
    String userName = elecUser.getUserName();
    if(StringUtils.isNotBlank(userName)){
        condition += " and a.userName like ?";
        paramsList.add("%"+userName+"%");
    }
    //所属单位
    if(StringUtils.isNotBlank(elecUser.getJctID())){
        condition += " and a.jctID = ?";
        paramsList.add(elecUser.getJctID());
    }
    //入职开始时间
    if(elecUser.getOnDutyDateBegin()!=null){
        condition += " and a.onDutyDate >= ?";
        paramsList.add(elecUser.getOnDutyDateBegin());
    }
    //入职结束时间
    if(elecUser.getOnDutyDateEnd()!=null){
        condition += " and a.onDutyDate <= ?";
        paramsList.add(elecUser.getOnDutyDateEnd());
    }
    Object [] params = paramsList.toArray();
    //排序:按照入职时间升序排列
    Map<String, String> orderby = new LinkedHashMap<String, String>();
    orderby.put("a.onDutyDate", "asc");
    List<ElecUser> list = elecUserDao.findCollectionByConditionNoPageWithSql(condition, params, orderby);
    return list;
}

ElecUserDaoImpl类


public List<ElecUser> findCollectionByConditionNoPageWithSql(
            String condition, final Object[] params, Map<String, String> orderby) {
    String sql = "select a.userID as userID, a.logonName as logonName,a.userName as userName,a.contactTel as contactTel,a.onDutyDate as onDutyDate," +
" b.ddlName as sexID,c.ddlName as postID,d.ddlName as jctID,e.ddlName as isDuty" +
" from elec_user a" +
" inner join elec_systemddl b on a.sexID = b.ddlCode And b.keyword='性别'" + 
" inner join elec_systemddl c on a.postID = c.ddlCode And c.keyword='职位'" +
" inner join elec_systemddl d on a.jctID = d.ddlCode And d.keyword='所属单位'" + " inner join elec_systemddl e on a.isDuty = e.ddlCode And e.keyword='是否在职'";
    String orderbysql = this.orderbyHql(orderby);
    final String finalSql = sql + condition + orderbysql;
    List<Object[]> list = this.getHibernateTemplate().execute(new HibernateCallback() {

        public Object doInHibernate(Session session)
                throws HibernateException, SQLException {
            SQLQuery query = session.createSQLQuery(finalSql)
                        .addScalar("userID",Hibernate.STRING)
                        .addScalar("logonName", Hibernate.STRING)
                        .addScalar("userName", Hibernate.STRING)
                        .addScalar("contactTel", Hibernate.STRING)
                        .addScalar("onDutyDate", Hibernate.DATE)
                        .addScalar("sexID", Hibernate.STRING)
                        .addScalar("postID", Hibernate.STRING)
                        .addScalar("jctID", Hibernate.STRING)
                        .addScalar("isDuty", Hibernate.STRING);
            if(params!=null && params.length>0){
                for(int i=0;i<params.length;i++){
                    query.setParameter(i, params[i]);
                }
            }
            return query.list();
        }
    });

//将list<Object[]>转化成list[ElecUser]      
    List<ElecUser> userList = new ArrayList<ElecUser>();
    if(list!=null && list.size()>0){
        for(Object [] o:list){
            ElecUser elecUser = new ElecUser();
            elecUser.setUserID(o[0]!=null?o[0].toString():"");
            elecUser.setLogonName(o[1]!=null?o[1].toString():"");
            elecUser.setUserName(o[2]!=null?o[2].toString():"");
            elecUser.setContactTel(o[3]!=null?o[3].toString():"");
            elecUser.setOnDutyDate((Date)o[4]);
            elecUser.setSexID(o[5]!=null?o[5].toString():"");
            elecUser.setPostID(o[6]!=null?o[6].toString():"");
            elecUser.setJctID(o[7]!=null?o[7].toString():"");
            elecUser.setIsDuty(o[8]!=null?o[8].toString():"");
            userList.add(elecUser);
        }
    }   
    return userList;
}

4:导出设置

(1)需要的表
这里写图片描述

(2)需求分析
按照导出字段列表的内容,动态的导出excel文档
这里写图片描述

(3)数据库存放的方式
这里写图片描述

注意:
这里写图片描述

操作:
这里写图片描述

(4)掌握js的写法(标签的左右移动)
项目中经常会遇到标签左右移动功能:
页面效果:
这里写图片描述
Js代码:


function Add() {
       $("#colname1 option:selected").appendTo($("#colname2"));     
  }

  function Remove() {
       $("#colname2 option:selected").appendTo($("#colname1")); 
  }


  function upcol() {
       //获取选中的右侧option元素
       var rightcol = $("#colname2 option:selected"); 
       //option的第一个元素无法上移,rightcol.get(0)表示选中的option对象,rightcol.get(0).index表示option对象的位置索引,从0开始
       if(rightcol.get(0).index!=0){  
            rightcol.each(function(){  
                $(this).prev().before($(this));  //在当前选中对象的前面插入该对象
                //$(this).insertBefore($(this).prev());//等同于
            });  
       }    
  }
  function downcol() {
       //选择所有的对象
       var allrightcol = $("#colname2 option");  
       //选择被选中的对象
       var rightcol = $("#colname2 option:selected");  
       //option的最后一个元素无法下移
       if(rightcol.get(rightcol.length-1).index!=allrightcol.length-1){  
            //循环选中的对象
            for(i=rightcol.length-1;i>=0;i--){  
                //获取选中的对象
                var item = $(rightcol.get(i));  
                item.insertAfter(item.next());  //将选中的对象插入到下一个对象的后面
                //item.next().after(item);//等同于
            }  
      } 
  }  

Jsp代码:


<td width="30%" rowspan="4">
        <s:select list="#request.nomap" name="colname1" id="colname1"
                             size="15" multiple="true"
                             cssStyle="width:200px"
    ondblclick="JavaScript:Add('colname1','colname2','colname')">
       </s:select>
</td> 
<td width="15%"></td>
<td width="35%" rowspan="4" id="colnameDiv">
       <s:select list="#request.map" name="colname2" id="colname2"
                             size="15" multiple="true"
                             cssStyle="width:200px"
ondblclick="JavaScript:Remove('colname1','colname2','colname')">
       </s:select>
</td>  

在使用标签实现左右移动的时候,可以使用隐藏域的方式从页面中传递值,这样的好处是:不仅可以传递<select>标签(<option value=”stationRun”>)value中的属性值,也可以传递标签(<option>站点运行情况</option>)option中的文本值。大家要作为一种设计方式要记住。

5:需要掌握的知识点

重点:导出设置的开发,sql语句联合查询
了解知识:webservice(axis2)
二级缓存(ehcache的查询缓存)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值