BOS项目5:定区添加及查询,Hessian入门,基于hessian实现定区关联客户功能

2023-11-08 10:08

本文主要是介绍BOS项目5:定区添加及查询,Hessian入门,基于hessian实现定区关联客户功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



目录

  1. 1    定区添加功能
  2. 2    定区分页查询
  3. 3    Hessian入门
  4. 4    定区关联客户基于hessian
  5. 1    定区添加功能
  6. 2    定区分页查询
  7. 3    Hessian入门
  8. 4    定区关联客户基于hessian

1.    定区添加功能

什么是定区?定区将客户信息、取派员、分区信息关联到一起,为自动分单提供数据。

1.1   在下拉框中展示取派员数据

第一步:修改combobox的url地址,访问StaffAction的listajax方法,查询取派员数据

第二步:在StaffAction中提供方法

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * ajax查询未作废的员工 
  3.  * @return 
  4.  */  
  5. public String findByWorking(){  
  6.       
  7.     List<Staff> list=staffService.findByWroking();  
  8.     this.writeList2json(list, new String[]{"decidezones"});  
  9.     return NONE;  
  10. }  

service

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. @Override  
  2. public List<Staff> findByWroking() {  
  3.     //获取条件  
  4.     DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Staff.class);  
  5.     //添加条件  
  6.     detachedCriteria.add(Restrictions.eq("deltag""0"));  
  7.     return staffDao.findByCriteria(detachedCriteria);  
  8. }  

1.2   使用datagrid数据表展示分区数据

效果:展示未被定区关联的分区数据表

第一步:修改datagrid的url地址 

第二步:在SubareaAction中提供listajax方法,查询分区数据

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 查询未分配到定区的分区,返回json 
  3.  */  
  4. public String listajax(){  
  5.     List<Subarea> list = subareaService.findListNotAssociation();  
  6.     String[] excludes = new String[]{"decidedzone","region"};  
  7.     this.writeListBean2Json(list, excludes );  
  8.     return NONE;  
  9. }  

Service代码:

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 查询未关联到定区的分区 
  3.  */  
  4. public List<Subarea> findListNotAssociation() {  
  5.     DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Subarea.class);  
  6.     //添加过滤条件----定区属性为空  
  7.     detachedCriteria.add(Restrictions.isNull("decidedzone"));  
  8.     return subareaDao.findByCondition(detachedCriteria );  
  9. }  

1.3   提交表单

    为保存按钮绑定事件

问题一:参数名id冲突

 

解决:将datagrid的filed由id改为subareid

问题二:提交的subareid值为空

解决:在Subarea类中加入一个getSubareaid方法,返回的json中含有一个subareid字段

 

1.4   服务端实现

    Action

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. //属性驱动,接收分区id数组  
  2. private String[] subareaid;  
  3. public void setSubareaid(String[] subareaid) {  
  4.     this.subareaid = subareaid;  
  5. }  
  6. /** 
  7.  * 添加定区 
  8.  */  
  9. public String add(){  
  10.     decidedzoneService.save(model,subareaid);  
  11.     return "list";  
  12. }  

    Service 

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. @Resource  
  2. private IDecidedzoneDao decidedzoneDao;  
  3. @Resource  
  4. private ISubareaDao subareaDao;  
  5. public void save(Decidedzone model, String[] subareaid) {  
  6.     decidedzoneDao.save(model);//持久状态对象  
  7.     for (String id : subareaid) {  
  8.         Subarea subarea = subareaDao.findById(id);//持久状态  
  9.         //分区关联定区  
  10.         subarea.setDecidedzone(model);  
  11.     }  
  12. }  

    配置struts.xml

2.    定区分页查询

    改造datagridurl地址

略  

    在Action中提供分页查询方法

略  

3.    Hessian入门

Hessian 是一个基于 binary-RPC 实现的远程通讯 library。使用二进制传输数据。

     Hessian通常通过Web应用来提供服务,通过接口暴露服务。

     Servlet和spring的DispatcherServlet都可以把请求转发给Hessian服务。

     由以下两种方式提供,分别为:

     com.caucho.hessian.server.HessianServlet、

     org.springframework.web.servlet.DispatcherServlet。

“hessian入门案例”

服务端开发

第一步:创建一个web项目,并导入hessian的jar包
第二步:创建一个接口

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. public interface HelloService {  
  2.     public String sayHello(String name);  
  3.     public List<User> findAllUser();  
  4. }  
第三步:提供上面接口的实现类

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. public class HelloServiceImpl implements HelloService{  
  2.     public String sayHello(String name) {  
  3.         System.out.println("sayHello方法被调用了");  
  4.         return "hello " + name;  
  5.     }  
  6.   
  7.     public List<User> findAllUser() {  
  8.         List<User> list = new ArrayList<User>();  
  9.         list.add(new User(1"小王"));  
  10.         list.add(new User(2,"小白"));  
  11.         return list;  
  12.     }  
  13. }  
第四步:在web.xml中配置服务
[html]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. <servlet>  
  2.     <servlet-name>hessian</servlet-name>  
  3.     <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>  
  4.     <init-param>  
  5.         <param-name>home-class</param-name>  
  6.         <param-value>cn.itcast.service.HelloServiceImpl</param-value>  
  7.     </init-param>  
  8.     <init-param>  
  9.         <param-name>home-api</param-name>  
  10.         <param-value>cn.itcast.service.HelloService</param-value>  
  11.     </init-param>  
  12. </servlet>  
  13. <servlet-mapping>  
  14.     <servlet-name>hessian</servlet-name>  
  15.     <url-pattern>/hessian</url-pattern>  
  16. </servlet-mapping>  
客户端开发:

第一步:创建一个客户端项目,并导入hessian的jar包
第二步:创建一个接口(和服务端接口对应)

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. public interface HelloService {  
  2.     public String sayHello(String name);  
  3.     public Object findAllUser();  
  4. }  
第三步:使用hessian提供的方式创建代理对象调用服务

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. HessianProxyFactory factory = new HessianProxyFactory();  
  2. HelloService proxy =   
  3.     (HelloService) factory.create(HelloService.class"http://localhost:8080/hessian_server/hessian");  
  4. String ret = proxy.sayHello("test");  
  5. System.out.println(ret);  
  6. Object users = proxy.findAllUser();  
  7. System.out.println(users);  


4.    定区关联客户(基于hessian)

物流公司的客户信息存在crm系统中

4.1   提供crm系统

Crm发布服务配置

remoting-servlet.xml

[html]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:context="http://www.springframework.org/schema/context"  
  5.     xmlns:aop="http://www.springframework.org/schema/aop"  
  6.     xmlns:tx="http://www.springframework.org/schema/tx"  
  7.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  8.     http://www.springframework.org/schema/beans/spring-beans.xsd  
  9.     http://www.springframework.org/schema/context  
  10.     http://www.springframework.org/schema/context/spring-context.xsd  
  11.     http://www.springframework.org/schema/aop  
  12.     http://www.springframework.org/schema/aop/spring-aop.xsd  
  13.     http://www.springframework.org/schema/tx   
  14.     http://www.springframework.org/schema/tx/spring-tx.xsd">  
  15.     <!-- 业务类  -->  
  16.     <bean id="customerService" class="cn.itcast.crm.service.impl.CustomerServiceImpl" />  
  17.       
  18.     <!-- 注册hessian服务 -->  
  19.     <bean id="/customer" class="org.springframework.remoting.caucho.HessianServiceExporter">  
  20.         <!-- 业务接口实现类 -->  
  21.         <property name="service" ref="customerService" />  
  22.         <!-- 业务接口 -->  
  23.         <property name="serviceInterface" value="cn.itcast.crm.service.CustomerService" />  
  24.     </bean>  
  25. </beans>  

4.2   在bos系统中配置调用crm服务

第一步:在bos项目中导入hessian的jar包

第二步:在bos项目中提供一个接口,和crm服务端接口对应

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. // 客户服务接口   
  2. public interface CustomerService {  
  3.     // 未关联定区客户  
  4.     public List<Customer> findnoassociationCustomers();  
  5.   
  6.     // 查询已经关联指定定区的客户  
  7.     public List<Customer> findhasassociationCustomers(String decidedZoneId);  
  8.   
  9.     // 将未关联定区客户关联到定区上  
  10.     public void assignCustomersToDecidedZone(Integer[] customerIds, String decidedZoneId);  
  11. }  

创建对应客户类(Customer)(必须包结构也相同不然也是返回map,一般远程服务是提供jar包不用考虑此问题)

如果不创建,可以把Customer泛型改成Object 

这时候调用返回的Object对象,是一个含有customer属性的map对象

第三步:在spring配置文件中注册一个代理对象,由spring工厂负责创建这个代理对象,使用此代理对象可以远程调用crm服务

[html]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. <!-- 注册代理对象,用于远程调用crm服务 -->  
  2. <!-- 配置远程服务的代理对象 -->  
  3. <bean id="customerService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">  
  4.     <!--本项目创建的对应服务接口 -->  
  5.     <property name="serviceInterface" value="com.itheima.bos.crm.CustomerService"/>  
  6.     <!--访问对应服务的url  
  7.         zjs_crm  项目名  
  8.         /remotiong 对发布应服务项目中web.xml 提供Hessian的DispatcherServlet的url-pattern  
  9.         /customer 对应发布服务配置remoting-servlet.xml中的注册服务bean id  
  10.     -->  
  11.     <property name="serviceUrl" value="http://192.168.15.63:8080/zjs_crm/remoting/customer"/>  
  12. </bean>  

 

第四步:通过注解将代理对象注入到Action中 

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. //注入代理对象  
  2. @Resource  
  3. private CustomerService customerService;  

第五步:调整定区关联客户窗口

效果


    发送ajax请求,请求action,在Action中调用代理对象,通过代理对象访问crm服务

[javascript]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. function doAssociations(){  
  2.     //判断当前是否选中了一个定区  
  3.     var rows = $("#grid").datagrid("getSelections");  
  4.     if(rows.length != 1){  
  5.         $.messager.alert("提示信息","请选择一个定区!","warning");  
  6.     }else{  
  7.         //清空下拉框客户信息  
  8.         $("#noassociationSelect").empty();  
  9.         $("#associationSelect").empty();  
  10.           
  11.         //发送ajax请求,请求Action,  
  12.         //在Action中调用代理对象获取客户数据,返回json,将返回的json数据动态填充到下拉框中  
  13.         //加载左侧下拉框中的客户信息  
  14.         var url1 = "${pageContext.request.contextPath}/decidedzoneAction_findCustomerNotAssociation.action";  
  15.         $.post(url1,{},function(data){  
  16.             for(var i=0;i<data.length;i++){  
  17.                 //使用客户信息填充下拉框  
  18.                 var name = data[i].name;  
  19.                 var id = data[i].id;  
  20.                 $("#noassociationSelect").append("<option value='"+id+"'>"+name+"</option>");  
  21.             }  
  22.         });  
  23.           
  24.         //加载右侧下拉框中的客户信息  
  25.         var url2 = "${pageContext.request.contextPath}/decidedzoneAction_findCustomerAssociation.action";  
  26.         var did = rows[0].id;//当前选中的定区id  
  27.         $.post(url2,{"id":did},function(data){  
  28.             for(var i=0;i<data.length;i++){  
  29.                 //使用客户信息填充下拉框  
  30.                 var name = data[i].name;  
  31.                 var id = data[i].id;  
  32.                 $("#associationSelect").append("<option value='"+id+"'>"+name+"</option>");  
  33.             }  
  34.         });  
  35.         $('#customerWindow').window('open');  
  36.     }  
  37. }  

第六步:在DecidedzoneAction中提供两个查询方法

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 获取未关联到定区的客户数据,返回json 
  3.  */  
  4. public String findCustomerNotAssociation(){  
  5.     //使用代理对象远程调用crm服务,获取客户数据  
  6.     List<Customer> list = customerService.findnoassociationCustomers();  
  7.     String[] excludes = new String[]{};  
  8.     this.writeListBean2Json(list, excludes);  
  9.     return NONE;  
  10. }  
  11.   
  12. /** 
  13.  * 获取已经关联到指定定区的客户数据,返回json 
  14.  */  
  15. public String findCustomerAssociation(){  
  16.     String id = model.getId();  
  17.     List<Customer> list = customerService.findhasassociationCustomers(id);  
  18.     String[] excludes = new String[]{};  
  19.     this.writeListBean2Json(list, excludes);  
  20.     return NONE;  
  21. }  

第七步:为左右移动按钮绑定事件 及 为“关联客户”按钮绑定事件

[javascript]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1.     $(function(){  
  2.         //为左右移动按钮绑定事件  
  3.         $("#toRight").click(function(){  
  4.             $("#associationSelect").append($("#noassociationSelect option:selected"));  
  5.         });  
  6.         $("#toLeft").click(function(){  
  7.             $("#noassociationSelect").append($("#associationSelect option:selected"));  
  8.         });  
  9.           
  10.         //为“关联客户”按钮绑定事件  
  11.         $("#associationBtn").click(function(){  
  12.             //在提交表单之前,将右侧下拉框中的所有option选中  
  13.             $("#associationSelect option").attr("selected","selected");  
  14.             //在提交表单之前,将当前选中的定区的id赋给隐藏域  
  15.             var id = $("#grid").datagrid("getSelections")[0].id;  
  16.             $("#customerDecidedZoneId").val(id);  
  17.             $("#customerForm").submit();  
  18.         });  
  19.     });  
  20. </script>  

第八步:在DecidedzoneAction中提供方法assigncustomerstodecidedzone

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. //接收客户id数组  
  2. private Integer[] customerIds;  
  3. public void setCustomerIds(Integer[] customerIds) {  
  4.     this.customerIds = customerIds;  
  5. }     
  6. /** 
  7.  * 定区关联客户 
  8.  */  
  9. public String assigncustomerstodecidedzone(){  
  10.     //调用代理对象,远程调用crm服务,完成定区关联客户  
  11.     customerService.assignCustomersToDecidedZone(customerIds, model.getId());  
  12.     return "list";  
  13. }  

1.    定区添加功能

什么是定区?定区将客户信息、取派员、分区信息关联到一起,为自动分单提供数据。


1.1   在下拉框中展示取派员数据

第一步:修改combobox的url地址,访问StaffAction的listajax方法,查询取派员数据

第二步:在StaffAction中提供方法

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * ajax查询未作废的员工 
  3.  * @return 
  4.  */  
  5. public String findByWorking(){  
  6.       
  7.     List<Staff> list=staffService.findByWroking();  
  8.     this.writeList2json(list, new String[]{"decidezones"});  
  9.     return NONE;  
  10. }  

service

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. @Override  
  2. public List<Staff> findByWroking() {  
  3.     //获取条件  
  4.     DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Staff.class);  
  5.     //添加条件  
  6.     detachedCriteria.add(Restrictions.eq("deltag""0"));  
  7.     return staffDao.findByCriteria(detachedCriteria);  
  8. }  

1.2   使用datagrid数据表展示分区数据

效果:展示未被定区关联的分区数据表


第一步:修改datagrid的url地址 

第二步:在SubareaAction中提供listajax方法,查询分区数据

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 查询未分配到定区的分区,返回json 
  3.  */  
  4. public String listajax(){  
  5.     List<Subarea> list = subareaService.findListNotAssociation();  
  6.     String[] excludes = new String[]{"decidedzone","region"};  
  7.     this.writeListBean2Json(list, excludes );  
  8.     return NONE;  
  9. }  

Service代码:

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 查询未关联到定区的分区 
  3.  */  
  4. public List<Subarea> findListNotAssociation() {  
  5.     DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Subarea.class);  
  6.     //添加过滤条件----定区属性为空  
  7.     detachedCriteria.add(Restrictions.isNull("decidedzone"));  
  8.     return subareaDao.findByCondition(detachedCriteria );  
  9. }  


1.3   提交表单

    为保存按钮绑定事件

问题一:参数名id冲突

 

解决:将datagrid的filed由id改为subareid

问题二:提交的subareid值为空

解决:在Subarea类中加入一个getSubareaid方法,返回的json中含有一个subareid字段

 

 

 

1.4   服务端实现

    Action

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. //属性驱动,接收分区id数组  
  2. private String[] subareaid;  
  3. public void setSubareaid(String[] subareaid) {  
  4.     this.subareaid = subareaid;  
  5. }  
  6. /** 
  7.  * 添加定区 
  8.  */  
  9. public String add(){  
  10.     decidedzoneService.save(model,subareaid);  
  11.     return "list";  
  12. }  


    Service 

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. @Resource  
  2. private IDecidedzoneDao decidedzoneDao;  
  3. @Resource  
  4. private ISubareaDao subareaDao;  
  5. public void save(Decidedzone model, String[] subareaid) {  
  6.     decidedzoneDao.save(model);//持久状态对象  
  7.     for (String id : subareaid) {  
  8.         Subarea subarea = subareaDao.findById(id);//持久状态  
  9.         //分区关联定区  
  10.         subarea.setDecidedzone(model);  
  11.     }  
  12. }  

    配置struts.xml


2.    定区分页查询

    改造datagridurl地址

略  

    在Action中提供分页查询方法

略  

 

3.    Hessian入门


Hessian 是一个基于 binary-RPC 实现的远程通讯 library。使用二进制传输数据。

     Hessian通常通过Web应用来提供服务,通过接口暴露服务。

     Servlet和spring的DispatcherServlet都可以把请求转发给Hessian服务。

     由以下两种方式提供,分别为:

     com.caucho.hessian.server.HessianServlet、

     org.springframework.web.servlet.DispatcherServlet。

 

“hessian入门案例”


服务端开发


第一步:创建一个web项目,并导入hessian的jar包
第二步:创建一个接口

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. public interface HelloService {  
  2.     public String sayHello(String name);  
  3.     public List<User> findAllUser();  
  4. }  


第三步:提供上面接口的实现类

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. public class HelloServiceImpl implements HelloService{  
  2.     public String sayHello(String name) {  
  3.         System.out.println("sayHello方法被调用了");  
  4.         return "hello " + name;  
  5.     }  
  6.   
  7.     public List<User> findAllUser() {  
  8.         List<User> list = new ArrayList<User>();  
  9.         list.add(new User(1"小王"));  
  10.         list.add(new User(2,"小白"));  
  11.         return list;  
  12.     }  
  13. }  


第四步:在web.xml中配置服务
[html]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. <servlet>  
  2.     <servlet-name>hessian</servlet-name>  
  3.     <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>  
  4.     <init-param>  
  5.         <param-name>home-class</param-name>  
  6.         <param-value>cn.itcast.service.HelloServiceImpl</param-value>  
  7.     </init-param>  
  8.     <init-param>  
  9.         <param-name>home-api</param-name>  
  10.         <param-value>cn.itcast.service.HelloService</param-value>  
  11.     </init-param>  
  12. </servlet>  
  13. <servlet-mapping>  
  14.     <servlet-name>hessian</servlet-name>  
  15.     <url-pattern>/hessian</url-pattern>  
  16. </servlet-mapping>  


客户端开发:


第一步:创建一个客户端项目,并导入hessian的jar包
第二步:创建一个接口(和服务端接口对应)

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. public interface HelloService {  
  2.     public String sayHello(String name);  
  3.     public Object findAllUser();  
  4. }  


第三步:使用hessian提供的方式创建代理对象调用服务

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. HessianProxyFactory factory = new HessianProxyFactory();  
  2. HelloService proxy =   
  3.     (HelloService) factory.create(HelloService.class"http://localhost:8080/hessian_server/hessian");  
  4. String ret = proxy.sayHello("test");  
  5. System.out.println(ret);  
  6. Object users = proxy.findAllUser();  
  7. System.out.println(users);  


4.    定区关联客户(基于hessian)

物流公司的客户信息存在crm系统中

 

4.1   提供crm系统


Crm发布服务配置

remoting-servlet.xml

[html]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:context="http://www.springframework.org/schema/context"  
  5.     xmlns:aop="http://www.springframework.org/schema/aop"  
  6.     xmlns:tx="http://www.springframework.org/schema/tx"  
  7.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  8.     http://www.springframework.org/schema/beans/spring-beans.xsd  
  9.     http://www.springframework.org/schema/context  
  10.     http://www.springframework.org/schema/context/spring-context.xsd  
  11.     http://www.springframework.org/schema/aop  
  12.     http://www.springframework.org/schema/aop/spring-aop.xsd  
  13.     http://www.springframework.org/schema/tx   
  14.     http://www.springframework.org/schema/tx/spring-tx.xsd">  
  15.     <!-- 业务类  -->  
  16.     <bean id="customerService" class="cn.itcast.crm.service.impl.CustomerServiceImpl" />  
  17.       
  18.     <!-- 注册hessian服务 -->  
  19.     <bean id="/customer" class="org.springframework.remoting.caucho.HessianServiceExporter">  
  20.         <!-- 业务接口实现类 -->  
  21.         <property name="service" ref="customerService" />  
  22.         <!-- 业务接口 -->  
  23.         <property name="serviceInterface" value="cn.itcast.crm.service.CustomerService" />  
  24.     </bean>  
  25. </beans>  


4.2   在bos系统中配置调用crm服务

第一步:在bos项目中导入hessian的jar包

第二步:在bos项目中提供一个接口,和crm服务端接口对应

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. // 客户服务接口   
  2. public interface CustomerService {  
  3.     // 未关联定区客户  
  4.     public List<Customer> findnoassociationCustomers();  
  5.   
  6.     // 查询已经关联指定定区的客户  
  7.     public List<Customer> findhasassociationCustomers(String decidedZoneId);  
  8.   
  9.     // 将未关联定区客户关联到定区上  
  10.     public void assignCustomersToDecidedZone(Integer[] customerIds, String decidedZoneId);  
  11. }  

创建对应客户类(Customer)(必须包结构也相同不然也是返回map,一般远程服务是提供jar包不用考虑此问题)

如果不创建,可以把Customer泛型改成Object 

这时候调用返回的Object对象,是一个含有customer属性的map对象


第三步:在spring配置文件中注册一个代理对象,由spring工厂负责创建这个代理对象,使用此代理对象可以远程调用crm服务


[html]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. <!-- 注册代理对象,用于远程调用crm服务 -->  
  2. <!-- 配置远程服务的代理对象 -->  
  3. <bean id="customerService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">  
  4.     <!--本项目创建的对应服务接口 -->  
  5.     <property name="serviceInterface" value="com.itheima.bos.crm.CustomerService"/>  
  6.     <!--访问对应服务的url  
  7.         zjs_crm  项目名  
  8.         /remotiong 对发布应服务项目中web.xml 提供Hessian的DispatcherServlet的url-pattern  
  9.         /customer 对应发布服务配置remoting-servlet.xml中的注册服务bean id  
  10.     -->  
  11.     <property name="serviceUrl" value="http://192.168.15.63:8080/zjs_crm/remoting/customer"/>  
  12. </bean>  

 

第四步:通过注解将代理对象注入到Action中 

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. //注入代理对象  
  2. @Resource  
  3. private CustomerService customerService;  

第五步:调整定区关联客户窗口

效果


    发送ajax请求,请求action,在Action中调用代理对象,通过代理对象访问crm服务

 

[javascript]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. function doAssociations(){  
  2.     //判断当前是否选中了一个定区  
  3.     var rows = $("#grid").datagrid("getSelections");  
  4.     if(rows.length != 1){  
  5.         $.messager.alert("提示信息","请选择一个定区!","warning");  
  6.     }else{  
  7.         //清空下拉框客户信息  
  8.         $("#noassociationSelect").empty();  
  9.         $("#associationSelect").empty();  
  10.           
  11.         //发送ajax请求,请求Action,  
  12.         //在Action中调用代理对象获取客户数据,返回json,将返回的json数据动态填充到下拉框中  
  13.         //加载左侧下拉框中的客户信息  
  14.         var url1 = "${pageContext.request.contextPath}/decidedzoneAction_findCustomerNotAssociation.action";  
  15.         $.post(url1,{},function(data){  
  16.             for(var i=0;i<data.length;i++){  
  17.                 //使用客户信息填充下拉框  
  18.                 var name = data[i].name;  
  19.                 var id = data[i].id;  
  20.                 $("#noassociationSelect").append("<option value='"+id+"'>"+name+"</option>");  
  21.             }  
  22.         });  
  23.           
  24.         //加载右侧下拉框中的客户信息  
  25.         var url2 = "${pageContext.request.contextPath}/decidedzoneAction_findCustomerAssociation.action";  
  26.         var did = rows[0].id;//当前选中的定区id  
  27.         $.post(url2,{"id":did},function(data){  
  28.             for(var i=0;i<data.length;i++){  
  29.                 //使用客户信息填充下拉框  
  30.                 var name = data[i].name;  
  31.                 var id = data[i].id;  
  32.                 $("#associationSelect").append("<option value='"+id+"'>"+name+"</option>");  
  33.             }  
  34.         });  
  35.         $('#customerWindow').window('open');  
  36.     }  
  37. }  

 

第六步:在DecidedzoneAction中提供两个查询方法

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 获取未关联到定区的客户数据,返回json 
  3.  */  
  4. public String findCustomerNotAssociation(){  
  5.     //使用代理对象远程调用crm服务,获取客户数据  
  6.     List<Customer> list = customerService.findnoassociationCustomers();  
  7.     String[] excludes = new String[]{};  
  8.     this.writeListBean2Json(list, excludes);  
  9.     return NONE;  
  10. }  
  11.   
  12. /** 
  13.  * 获取已经关联到指定定区的客户数据,返回json 
  14.  */  
  15. public String findCustomerAssociation(){  
  16.     String id = model.getId();  
  17.     List<Customer> list = customerService.findhasassociationCustomers(id);  
  18.     String[] excludes = new String[]{};  
  19.     this.writeListBean2Json(list, excludes);  
  20.     return NONE;  
  21. }  

 

第七步:为左右移动按钮绑定事件 及 为“关联客户”按钮绑定事件

[javascript]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1.     $(function(){  
  2.         //为左右移动按钮绑定事件  
  3.         $("#toRight").click(function(){  
  4.             $("#associationSelect").append($("#noassociationSelect option:selected"));  
  5.         });  
  6.         $("#toLeft").click(function(){  
  7.             $("#noassociationSelect").append($("#associationSelect option:selected"));  
  8.         });  
  9.           
  10.         //为“关联客户”按钮绑定事件  
  11.         $("#associationBtn").click(function(){  
  12.             //在提交表单之前,将右侧下拉框中的所有option选中  
  13.             $("#associationSelect option").attr("selected","selected");  
  14.             //在提交表单之前,将当前选中的定区的id赋给隐藏域  
  15.             var id = $("#grid").datagrid("getSelections")[0].id;  
  16.             $("#customerDecidedZoneId").val(id);  
  17.             $("#customerForm").submit();  
  18.         });  
  19.     });  
  20. </script>  


第八步:在DecidedzoneAction中提供方法assigncustomerstodecidedzone

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. //接收客户id数组  
  2. private Integer[] customerIds;  
  3. public void setCustomerIds(Integer[] customerIds) {  
  4.     this.customerIds = customerIds;  
  5. }     
  6. /** 
  7.  * 定区关联客户 
  8.  */  
  9. public String assigncustomerstodecidedzone(){  
  10.     //调用代理对象,远程调用crm服务,完成定区关联客户  
  11.     customerService.assignCustomersToDecidedZone(customerIds, model.getId());  
  12.     return "list";  
  13. }  

目录(?)[-]

  1. 1    定区添加功能
  2. 2    定区分页查询
  3. 3    Hessian入门
  4. 4    定区关联客户基于hessian
  5. 1    定区添加功能
  6. 2    定区分页查询
  7. 3    Hessian入门
  8. 4    定区关联客户基于hessian

1.    定区添加功能

什么是定区?定区将客户信息、取派员、分区信息关联到一起,为自动分单提供数据。

1.1   在下拉框中展示取派员数据

第一步:修改combobox的url地址,访问StaffAction的listajax方法,查询取派员数据

第二步:在StaffAction中提供方法

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * ajax查询未作废的员工 
  3.  * @return 
  4.  */  
  5. public String findByWorking(){  
  6.       
  7.     List<Staff> list=staffService.findByWroking();  
  8.     this.writeList2json(list, new String[]{"decidezones"});  
  9.     return NONE;  
  10. }  

service

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. @Override  
  2. public List<Staff> findByWroking() {  
  3.     //获取条件  
  4.     DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Staff.class);  
  5.     //添加条件  
  6.     detachedCriteria.add(Restrictions.eq("deltag""0"));  
  7.     return staffDao.findByCriteria(detachedCriteria);  
  8. }  

1.2   使用datagrid数据表展示分区数据

效果:展示未被定区关联的分区数据表

第一步:修改datagrid的url地址 

第二步:在SubareaAction中提供listajax方法,查询分区数据

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 查询未分配到定区的分区,返回json 
  3.  */  
  4. public String listajax(){  
  5.     List<Subarea> list = subareaService.findListNotAssociation();  
  6.     String[] excludes = new String[]{"decidedzone","region"};  
  7.     this.writeListBean2Json(list, excludes );  
  8.     return NONE;  
  9. }  

Service代码:

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 查询未关联到定区的分区 
  3.  */  
  4. public List<Subarea> findListNotAssociation() {  
  5.     DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Subarea.class);  
  6.     //添加过滤条件----定区属性为空  
  7.     detachedCriteria.add(Restrictions.isNull("decidedzone"));  
  8.     return subareaDao.findByCondition(detachedCriteria );  
  9. }  

1.3   提交表单

    为保存按钮绑定事件

问题一:参数名id冲突

 

解决:将datagrid的filed由id改为subareid

问题二:提交的subareid值为空

解决:在Subarea类中加入一个getSubareaid方法,返回的json中含有一个subareid字段

 

1.4   服务端实现

    Action

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. //属性驱动,接收分区id数组  
  2. private String[] subareaid;  
  3. public void setSubareaid(String[] subareaid) {  
  4.     this.subareaid = subareaid;  
  5. }  
  6. /** 
  7.  * 添加定区 
  8.  */  
  9. public String add(){  
  10.     decidedzoneService.save(model,subareaid);  
  11.     return "list";  
  12. }  

    Service 

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. @Resource  
  2. private IDecidedzoneDao decidedzoneDao;  
  3. @Resource  
  4. private ISubareaDao subareaDao;  
  5. public void save(Decidedzone model, String[] subareaid) {  
  6.     decidedzoneDao.save(model);//持久状态对象  
  7.     for (String id : subareaid) {  
  8.         Subarea subarea = subareaDao.findById(id);//持久状态  
  9.         //分区关联定区  
  10.         subarea.setDecidedzone(model);  
  11.     }  
  12. }  

    配置struts.xml

2.    定区分页查询

    改造datagridurl地址

略  

    在Action中提供分页查询方法

略  

3.    Hessian入门

Hessian 是一个基于 binary-RPC 实现的远程通讯 library。使用二进制传输数据。

     Hessian通常通过Web应用来提供服务,通过接口暴露服务。

     Servlet和spring的DispatcherServlet都可以把请求转发给Hessian服务。

     由以下两种方式提供,分别为:

     com.caucho.hessian.server.HessianServlet、

     org.springframework.web.servlet.DispatcherServlet。

“hessian入门案例”

服务端开发

第一步:创建一个web项目,并导入hessian的jar包
第二步:创建一个接口

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. public interface HelloService {  
  2.     public String sayHello(String name);  
  3.     public List<User> findAllUser();  
  4. }  
第三步:提供上面接口的实现类

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. public class HelloServiceImpl implements HelloService{  
  2.     public String sayHello(String name) {  
  3.         System.out.println("sayHello方法被调用了");  
  4.         return "hello " + name;  
  5.     }  
  6.   
  7.     public List<User> findAllUser() {  
  8.         List<User> list = new ArrayList<User>();  
  9.         list.add(new User(1"小王"));  
  10.         list.add(new User(2,"小白"));  
  11.         return list;  
  12.     }  
  13. }  
第四步:在web.xml中配置服务
[html]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. <servlet>  
  2.     <servlet-name>hessian</servlet-name>  
  3.     <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>  
  4.     <init-param>  
  5.         <param-name>home-class</param-name>  
  6.         <param-value>cn.itcast.service.HelloServiceImpl</param-value>  
  7.     </init-param>  
  8.     <init-param>  
  9.         <param-name>home-api</param-name>  
  10.         <param-value>cn.itcast.service.HelloService</param-value>  
  11.     </init-param>  
  12. </servlet>  
  13. <servlet-mapping>  
  14.     <servlet-name>hessian</servlet-name>  
  15.     <url-pattern>/hessian</url-pattern>  
  16. </servlet-mapping>  
客户端开发:

第一步:创建一个客户端项目,并导入hessian的jar包
第二步:创建一个接口(和服务端接口对应)

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. public interface HelloService {  
  2.     public String sayHello(String name);  
  3.     public Object findAllUser();  
  4. }  
第三步:使用hessian提供的方式创建代理对象调用服务

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. HessianProxyFactory factory = new HessianProxyFactory();  
  2. HelloService proxy =   
  3.     (HelloService) factory.create(HelloService.class"http://localhost:8080/hessian_server/hessian");  
  4. String ret = proxy.sayHello("test");  
  5. System.out.println(ret);  
  6. Object users = proxy.findAllUser();  
  7. System.out.println(users);  


4.    定区关联客户(基于hessian)

物流公司的客户信息存在crm系统中

4.1   提供crm系统

Crm发布服务配置

remoting-servlet.xml

[html]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:context="http://www.springframework.org/schema/context"  
  5.     xmlns:aop="http://www.springframework.org/schema/aop"  
  6.     xmlns:tx="http://www.springframework.org/schema/tx"  
  7.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  8.     http://www.springframework.org/schema/beans/spring-beans.xsd  
  9.     http://www.springframework.org/schema/context  
  10.     http://www.springframework.org/schema/context/spring-context.xsd  
  11.     http://www.springframework.org/schema/aop  
  12.     http://www.springframework.org/schema/aop/spring-aop.xsd  
  13.     http://www.springframework.org/schema/tx   
  14.     http://www.springframework.org/schema/tx/spring-tx.xsd">  
  15.     <!-- 业务类  -->  
  16.     <bean id="customerService" class="cn.itcast.crm.service.impl.CustomerServiceImpl" />  
  17.       
  18.     <!-- 注册hessian服务 -->  
  19.     <bean id="/customer" class="org.springframework.remoting.caucho.HessianServiceExporter">  
  20.         <!-- 业务接口实现类 -->  
  21.         <property name="service" ref="customerService" />  
  22.         <!-- 业务接口 -->  
  23.         <property name="serviceInterface" value="cn.itcast.crm.service.CustomerService" />  
  24.     </bean>  
  25. </beans>  

4.2   在bos系统中配置调用crm服务

第一步:在bos项目中导入hessian的jar包

第二步:在bos项目中提供一个接口,和crm服务端接口对应

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. // 客户服务接口   
  2. public interface CustomerService {  
  3.     // 未关联定区客户  
  4.     public List<Customer> findnoassociationCustomers();  
  5.   
  6.     // 查询已经关联指定定区的客户  
  7.     public List<Customer> findhasassociationCustomers(String decidedZoneId);  
  8.   
  9.     // 将未关联定区客户关联到定区上  
  10.     public void assignCustomersToDecidedZone(Integer[] customerIds, String decidedZoneId);  
  11. }  

创建对应客户类(Customer)(必须包结构也相同不然也是返回map,一般远程服务是提供jar包不用考虑此问题)

如果不创建,可以把Customer泛型改成Object 

这时候调用返回的Object对象,是一个含有customer属性的map对象

第三步:在spring配置文件中注册一个代理对象,由spring工厂负责创建这个代理对象,使用此代理对象可以远程调用crm服务

[html]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. <!-- 注册代理对象,用于远程调用crm服务 -->  
  2. <!-- 配置远程服务的代理对象 -->  
  3. <bean id="customerService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">  
  4.     <!--本项目创建的对应服务接口 -->  
  5.     <property name="serviceInterface" value="com.itheima.bos.crm.CustomerService"/>  
  6.     <!--访问对应服务的url  
  7.         zjs_crm  项目名  
  8.         /remotiong 对发布应服务项目中web.xml 提供Hessian的DispatcherServlet的url-pattern  
  9.         /customer 对应发布服务配置remoting-servlet.xml中的注册服务bean id  
  10.     -->  
  11.     <property name="serviceUrl" value="http://192.168.15.63:8080/zjs_crm/remoting/customer"/>  
  12. </bean>  

 

第四步:通过注解将代理对象注入到Action中 

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. //注入代理对象  
  2. @Resource  
  3. private CustomerService customerService;  

第五步:调整定区关联客户窗口

效果


    发送ajax请求,请求action,在Action中调用代理对象,通过代理对象访问crm服务

[javascript]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. function doAssociations(){  
  2.     //判断当前是否选中了一个定区  
  3.     var rows = $("#grid").datagrid("getSelections");  
  4.     if(rows.length != 1){  
  5.         $.messager.alert("提示信息","请选择一个定区!","warning");  
  6.     }else{  
  7.         //清空下拉框客户信息  
  8.         $("#noassociationSelect").empty();  
  9.         $("#associationSelect").empty();  
  10.           
  11.         //发送ajax请求,请求Action,  
  12.         //在Action中调用代理对象获取客户数据,返回json,将返回的json数据动态填充到下拉框中  
  13.         //加载左侧下拉框中的客户信息  
  14.         var url1 = "${pageContext.request.contextPath}/decidedzoneAction_findCustomerNotAssociation.action";  
  15.         $.post(url1,{},function(data){  
  16.             for(var i=0;i<data.length;i++){  
  17.                 //使用客户信息填充下拉框  
  18.                 var name = data[i].name;  
  19.                 var id = data[i].id;  
  20.                 $("#noassociationSelect").append("<option value='"+id+"'>"+name+"</option>");  
  21.             }  
  22.         });  
  23.           
  24.         //加载右侧下拉框中的客户信息  
  25.         var url2 = "${pageContext.request.contextPath}/decidedzoneAction_findCustomerAssociation.action";  
  26.         var did = rows[0].id;//当前选中的定区id  
  27.         $.post(url2,{"id":did},function(data){  
  28.             for(var i=0;i<data.length;i++){  
  29.                 //使用客户信息填充下拉框  
  30.                 var name = data[i].name;  
  31.                 var id = data[i].id;  
  32.                 $("#associationSelect").append("<option value='"+id+"'>"+name+"</option>");  
  33.             }  
  34.         });  
  35.         $('#customerWindow').window('open');  
  36.     }  
  37. }  

第六步:在DecidedzoneAction中提供两个查询方法

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 获取未关联到定区的客户数据,返回json 
  3.  */  
  4. public String findCustomerNotAssociation(){  
  5.     //使用代理对象远程调用crm服务,获取客户数据  
  6.     List<Customer> list = customerService.findnoassociationCustomers();  
  7.     String[] excludes = new String[]{};  
  8.     this.writeListBean2Json(list, excludes);  
  9.     return NONE;  
  10. }  
  11.   
  12. /** 
  13.  * 获取已经关联到指定定区的客户数据,返回json 
  14.  */  
  15. public String findCustomerAssociation(){  
  16.     String id = model.getId();  
  17.     List<Customer> list = customerService.findhasassociationCustomers(id);  
  18.     String[] excludes = new String[]{};  
  19.     this.writeListBean2Json(list, excludes);  
  20.     return NONE;  
  21. }  

第七步:为左右移动按钮绑定事件 及 为“关联客户”按钮绑定事件

[javascript]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1.     $(function(){  
  2.         //为左右移动按钮绑定事件  
  3.         $("#toRight").click(function(){  
  4.             $("#associationSelect").append($("#noassociationSelect option:selected"));  
  5.         });  
  6.         $("#toLeft").click(function(){  
  7.             $("#noassociationSelect").append($("#associationSelect option:selected"));  
  8.         });  
  9.           
  10.         //为“关联客户”按钮绑定事件  
  11.         $("#associationBtn").click(function(){  
  12.             //在提交表单之前,将右侧下拉框中的所有option选中  
  13.             $("#associationSelect option").attr("selected","selected");  
  14.             //在提交表单之前,将当前选中的定区的id赋给隐藏域  
  15.             var id = $("#grid").datagrid("getSelections")[0].id;  
  16.             $("#customerDecidedZoneId").val(id);  
  17.             $("#customerForm").submit();  
  18.         });  
  19.     });  
  20. </script>  

第八步:在DecidedzoneAction中提供方法assigncustomerstodecidedzone

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. //接收客户id数组  
  2. private Integer[] customerIds;  
  3. public void setCustomerIds(Integer[] customerIds) {  
  4.     this.customerIds = customerIds;  
  5. }     
  6. /** 
  7.  * 定区关联客户 
  8.  */  
  9. public String assigncustomerstodecidedzone(){  
  10.     //调用代理对象,远程调用crm服务,完成定区关联客户  
  11.     customerService.assignCustomersToDecidedZone(customerIds, model.getId());  
  12.     return "list";  
  13. }  

1.    定区添加功能

什么是定区?定区将客户信息、取派员、分区信息关联到一起,为自动分单提供数据。


1.1   在下拉框中展示取派员数据

第一步:修改combobox的url地址,访问StaffAction的listajax方法,查询取派员数据

第二步:在StaffAction中提供方法

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * ajax查询未作废的员工 
  3.  * @return 
  4.  */  
  5. public String findByWorking(){  
  6.       
  7.     List<Staff> list=staffService.findByWroking();  
  8.     this.writeList2json(list, new String[]{"decidezones"});  
  9.     return NONE;  
  10. }  

service

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. @Override  
  2. public List<Staff> findByWroking() {  
  3.     //获取条件  
  4.     DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Staff.class);  
  5.     //添加条件  
  6.     detachedCriteria.add(Restrictions.eq("deltag""0"));  
  7.     return staffDao.findByCriteria(detachedCriteria);  
  8. }  

1.2   使用datagrid数据表展示分区数据

效果:展示未被定区关联的分区数据表


第一步:修改datagrid的url地址 

第二步:在SubareaAction中提供listajax方法,查询分区数据

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 查询未分配到定区的分区,返回json 
  3.  */  
  4. public String listajax(){  
  5.     List<Subarea> list = subareaService.findListNotAssociation();  
  6.     String[] excludes = new String[]{"decidedzone","region"};  
  7.     this.writeListBean2Json(list, excludes );  
  8.     return NONE;  
  9. }  

Service代码:

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 查询未关联到定区的分区 
  3.  */  
  4. public List<Subarea> findListNotAssociation() {  
  5.     DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Subarea.class);  
  6.     //添加过滤条件----定区属性为空  
  7.     detachedCriteria.add(Restrictions.isNull("decidedzone"));  
  8.     return subareaDao.findByCondition(detachedCriteria );  
  9. }  


1.3   提交表单

    为保存按钮绑定事件

问题一:参数名id冲突

 

解决:将datagrid的filed由id改为subareid

问题二:提交的subareid值为空

解决:在Subarea类中加入一个getSubareaid方法,返回的json中含有一个subareid字段

 

 

 

1.4   服务端实现

    Action

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. //属性驱动,接收分区id数组  
  2. private String[] subareaid;  
  3. public void setSubareaid(String[] subareaid) {  
  4.     this.subareaid = subareaid;  
  5. }  
  6. /** 
  7.  * 添加定区 
  8.  */  
  9. public String add(){  
  10.     decidedzoneService.save(model,subareaid);  
  11.     return "list";  
  12. }  


    Service 

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. @Resource  
  2. private IDecidedzoneDao decidedzoneDao;  
  3. @Resource  
  4. private ISubareaDao subareaDao;  
  5. public void save(Decidedzone model, String[] subareaid) {  
  6.     decidedzoneDao.save(model);//持久状态对象  
  7.     for (String id : subareaid) {  
  8.         Subarea subarea = subareaDao.findById(id);//持久状态  
  9.         //分区关联定区  
  10.         subarea.setDecidedzone(model);  
  11.     }  
  12. }  

    配置struts.xml


2.    定区分页查询

    改造datagridurl地址

略  

    在Action中提供分页查询方法

略  

 

3.    Hessian入门


Hessian 是一个基于 binary-RPC 实现的远程通讯 library。使用二进制传输数据。

     Hessian通常通过Web应用来提供服务,通过接口暴露服务。

     Servlet和spring的DispatcherServlet都可以把请求转发给Hessian服务。

     由以下两种方式提供,分别为:

     com.caucho.hessian.server.HessianServlet、

     org.springframework.web.servlet.DispatcherServlet。

 

“hessian入门案例”


服务端开发


第一步:创建一个web项目,并导入hessian的jar包
第二步:创建一个接口

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. public interface HelloService {  
  2.     public String sayHello(String name);  
  3.     public List<User> findAllUser();  
  4. }  


第三步:提供上面接口的实现类

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. public class HelloServiceImpl implements HelloService{  
  2.     public String sayHello(String name) {  
  3.         System.out.println("sayHello方法被调用了");  
  4.         return "hello " + name;  
  5.     }  
  6.   
  7.     public List<User> findAllUser() {  
  8.         List<User> list = new ArrayList<User>();  
  9.         list.add(new User(1"小王"));  
  10.         list.add(new User(2,"小白"));  
  11.         return list;  
  12.     }  
  13. }  


第四步:在web.xml中配置服务
[html]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. <servlet>  
  2.     <servlet-name>hessian</servlet-name>  
  3.     <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>  
  4.     <init-param>  
  5.         <param-name>home-class</param-name>  
  6.         <param-value>cn.itcast.service.HelloServiceImpl</param-value>  
  7.     </init-param>  
  8.     <init-param>  
  9.         <param-name>home-api</param-name>  
  10.         <param-value>cn.itcast.service.HelloService</param-value>  
  11.     </init-param>  
  12. </servlet>  
  13. <servlet-mapping>  
  14.     <servlet-name>hessian</servlet-name>  
  15.     <url-pattern>/hessian</url-pattern>  
  16. </servlet-mapping>  


客户端开发:


第一步:创建一个客户端项目,并导入hessian的jar包
第二步:创建一个接口(和服务端接口对应)

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. public interface HelloService {  
  2.     public String sayHello(String name);  
  3.     public Object findAllUser();  
  4. }  


第三步:使用hessian提供的方式创建代理对象调用服务

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. HessianProxyFactory factory = new HessianProxyFactory();  
  2. HelloService proxy =   
  3.     (HelloService) factory.create(HelloService.class"http://localhost:8080/hessian_server/hessian");  
  4. String ret = proxy.sayHello("test");  
  5. System.out.println(ret);  
  6. Object users = proxy.findAllUser();  
  7. System.out.println(users);  


4.    定区关联客户(基于hessian)

物流公司的客户信息存在crm系统中

 

4.1   提供crm系统


Crm发布服务配置

remoting-servlet.xml

[html]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:context="http://www.springframework.org/schema/context"  
  5.     xmlns:aop="http://www.springframework.org/schema/aop"  
  6.     xmlns:tx="http://www.springframework.org/schema/tx"  
  7.     xsi:schemaLocation="http://www.springframework.org/schema/beans   
  8.     http://www.springframework.org/schema/beans/spring-beans.xsd  
  9.     http://www.springframework.org/schema/context  
  10.     http://www.springframework.org/schema/context/spring-context.xsd  
  11.     http://www.springframework.org/schema/aop  
  12.     http://www.springframework.org/schema/aop/spring-aop.xsd  
  13.     http://www.springframework.org/schema/tx   
  14.     http://www.springframework.org/schema/tx/spring-tx.xsd">  
  15.     <!-- 业务类  -->  
  16.     <bean id="customerService" class="cn.itcast.crm.service.impl.CustomerServiceImpl" />  
  17.       
  18.     <!-- 注册hessian服务 -->  
  19.     <bean id="/customer" class="org.springframework.remoting.caucho.HessianServiceExporter">  
  20.         <!-- 业务接口实现类 -->  
  21.         <property name="service" ref="customerService" />  
  22.         <!-- 业务接口 -->  
  23.         <property name="serviceInterface" value="cn.itcast.crm.service.CustomerService" />  
  24.     </bean>  
  25. </beans>  


4.2   在bos系统中配置调用crm服务

第一步:在bos项目中导入hessian的jar包

第二步:在bos项目中提供一个接口,和crm服务端接口对应

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. // 客户服务接口   
  2. public interface CustomerService {  
  3.     // 未关联定区客户  
  4.     public List<Customer> findnoassociationCustomers();  
  5.   
  6.     // 查询已经关联指定定区的客户  
  7.     public List<Customer> findhasassociationCustomers(String decidedZoneId);  
  8.   
  9.     // 将未关联定区客户关联到定区上  
  10.     public void assignCustomersToDecidedZone(Integer[] customerIds, String decidedZoneId);  
  11. }  

创建对应客户类(Customer)(必须包结构也相同不然也是返回map,一般远程服务是提供jar包不用考虑此问题)

如果不创建,可以把Customer泛型改成Object 

这时候调用返回的Object对象,是一个含有customer属性的map对象


第三步:在spring配置文件中注册一个代理对象,由spring工厂负责创建这个代理对象,使用此代理对象可以远程调用crm服务


[html]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. <!-- 注册代理对象,用于远程调用crm服务 -->  
  2. <!-- 配置远程服务的代理对象 -->  
  3. <bean id="customerService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean">  
  4.     <!--本项目创建的对应服务接口 -->  
  5.     <property name="serviceInterface" value="com.itheima.bos.crm.CustomerService"/>  
  6.     <!--访问对应服务的url  
  7.         zjs_crm  项目名  
  8.         /remotiong 对发布应服务项目中web.xml 提供Hessian的DispatcherServlet的url-pattern  
  9.         /customer 对应发布服务配置remoting-servlet.xml中的注册服务bean id  
  10.     -->  
  11.     <property name="serviceUrl" value="http://192.168.15.63:8080/zjs_crm/remoting/customer"/>  
  12. </bean>  

 

第四步:通过注解将代理对象注入到Action中 

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. //注入代理对象  
  2. @Resource  
  3. private CustomerService customerService;  

第五步:调整定区关联客户窗口

效果


    发送ajax请求,请求action,在Action中调用代理对象,通过代理对象访问crm服务

 

[javascript]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. function doAssociations(){  
  2.     //判断当前是否选中了一个定区  
  3.     var rows = $("#grid").datagrid("getSelections");  
  4.     if(rows.length != 1){  
  5.         $.messager.alert("提示信息","请选择一个定区!","warning");  
  6.     }else{  
  7.         //清空下拉框客户信息  
  8.         $("#noassociationSelect").empty();  
  9.         $("#associationSelect").empty();  
  10.           
  11.         //发送ajax请求,请求Action,  
  12.         //在Action中调用代理对象获取客户数据,返回json,将返回的json数据动态填充到下拉框中  
  13.         //加载左侧下拉框中的客户信息  
  14.         var url1 = "${pageContext.request.contextPath}/decidedzoneAction_findCustomerNotAssociation.action";  
  15.         $.post(url1,{},function(data){  
  16.             for(var i=0;i<data.length;i++){  
  17.                 //使用客户信息填充下拉框  
  18.                 var name = data[i].name;  
  19.                 var id = data[i].id;  
  20.                 $("#noassociationSelect").append("<option value='"+id+"'>"+name+"</option>");  
  21.             }  
  22.         });  
  23.           
  24.         //加载右侧下拉框中的客户信息  
  25.         var url2 = "${pageContext.request.contextPath}/decidedzoneAction_findCustomerAssociation.action";  
  26.         var did = rows[0].id;//当前选中的定区id  
  27.         $.post(url2,{"id":did},function(data){  
  28.             for(var i=0;i<data.length;i++){  
  29.                 //使用客户信息填充下拉框  
  30.                 var name = data[i].name;  
  31.                 var id = data[i].id;  
  32.                 $("#associationSelect").append("<option value='"+id+"'>"+name+"</option>");  
  33.             }  
  34.         });  
  35.         $('#customerWindow').window('open');  
  36.     }  
  37. }  

 

第六步:在DecidedzoneAction中提供两个查询方法

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 获取未关联到定区的客户数据,返回json 
  3.  */  
  4. public String findCustomerNotAssociation(){  
  5.     //使用代理对象远程调用crm服务,获取客户数据  
  6.     List<Customer> list = customerService.findnoassociationCustomers();  
  7.     String[] excludes = new String[]{};  
  8.     this.writeListBean2Json(list, excludes);  
  9.     return NONE;  
  10. }  
  11.   
  12. /** 
  13.  * 获取已经关联到指定定区的客户数据,返回json 
  14.  */  
  15. public String findCustomerAssociation(){  
  16.     String id = model.getId();  
  17.     List<Customer> list = customerService.findhasassociationCustomers(id);  
  18.     String[] excludes = new String[]{};  
  19.     this.writeListBean2Json(list, excludes);  
  20.     return NONE;  
  21. }  

 

第七步:为左右移动按钮绑定事件 及 为“关联客户”按钮绑定事件

[javascript]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1.     $(function(){  
  2.         //为左右移动按钮绑定事件  
  3.         $("#toRight").click(function(){  
  4.             $("#associationSelect").append($("#noassociationSelect option:selected"));  
  5.         });  
  6.         $("#toLeft").click(function(){  
  7.             $("#noassociationSelect").append($("#associationSelect option:selected"));  
  8.         });  
  9.           
  10.         //为“关联客户”按钮绑定事件  
  11.         $("#associationBtn").click(function(){  
  12.             //在提交表单之前,将右侧下拉框中的所有option选中  
  13.             $("#associationSelect option").attr("selected","selected");  
  14.             //在提交表单之前,将当前选中的定区的id赋给隐藏域  
  15.             var id = $("#grid").datagrid("getSelections")[0].id;  
  16.             $("#customerDecidedZoneId").val(id);  
  17.             $("#customerForm").submit();  
  18.         });  
  19.     });  
  20. </script>  


第八步:在DecidedzoneAction中提供方法assigncustomerstodecidedzone

[java]  view plain  copy
 
  在CODE上查看代码片 派生到我的代码片
  1. //接收客户id数组  
  2. private Integer[] customerIds;  
  3. public void setCustomerIds(Integer[] customerIds) {  
  4.     this.customerIds = customerIds;  
  5. }     
  6. /** 
  7.  * 定区关联客户 
  8.  */  
  9. public String assigncustomerstodecidedzone(){  
  10.     //调用代理对象,远程调用crm服务,完成定区关联客户  
  11.     customerService.assignCustomersToDecidedZone(customerIds, model.getId());  
  12.     return "list";  
  13. }  

这篇关于BOS项目5:定区添加及查询,Hessian入门,基于hessian实现定区关联客户功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/369136

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo