框架 day51 BOS项目练习(定区添加及查询,Hessian入门,基于hessian实现定区关联客户功能)
2016-06-11 19:52
1236 查看
BOS项目笔记第5天
1. 定区添加功能
什么是定区?定区将客户信息、取派员、分区信息关联到一起,为自动分单提供数据。1.1 在下拉框中展示取派员数据
第一步:修改combobox的url地址,访问StaffAction的listajax方法,查询取派员数据
第二步:在StaffAction中提供方法
/** * ajax查询未作废的员工 * @return */ public String findByWorking(){ List<Staff> list=staffService.findByWroking(); this.writeList2json(list, new String[]{"decidezones"}); return NONE; }
service
@Override public List<Staff> findByWroking() { //获取条件 DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Staff.class); //添加条件 detachedCriteria.add(Restrictions.eq("deltag", "0")); return staffDao.findByCriteria(detachedCriteria); }
1.2 使用datagrid数据表展示分区数据
效果:展示未被定区关联的分区数据表
第一步:修改datagrid的url地址
第二步:在SubareaAction中提供listajax方法,查询分区数据
/** * 查询未分配到定区的分区,返回json */ public String listajax(){ List<Subarea> list = subareaService.findListNotAssociation(); String[] excludes = new String[]{"decidedzone","region"}; this.writeListBean2Json(list, excludes ); return NONE; }
Service代码:
/** * 查询未关联到定区的分区 */ public List<Subarea> findListNotAssociation() { DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Subarea.class); //添加过滤条件----定区属性为空 detachedCriteria.add(Restrictions.isNull("decidedzone")); return subareaDao.findByCondition(detachedCriteria ); }
1.3 提交表单
为保存按钮绑定事件
问题一:参数名id冲突
解决:将datagrid的filed由id改为subareid
问题二:提交的subareid值为空
解决:在Subarea类中加入一个getSubareaid方法,返回的json中含有一个subareid字段
1.4 服务端实现
Action
//属性驱动,接收分区id数组 private String[] subareaid; public void setSubareaid(String[] subareaid) { this.subareaid = subareaid; } /** * 添加定区 */ public String add(){ decidedzoneService.save(model,subareaid); return "list"; }
Service
@Resource private IDecidedzoneDao decidedzoneDao; @Resource private ISubareaDao subareaDao; public void save(Decidedzone model, String[] subareaid) { decidedzoneDao.save(model);//持久状态对象 for (String id : subareaid) { Subarea subarea = subareaDao.findById(id);//持久状态 //分区关联定区 subarea.setDecidedzone(model); } }
配置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包
第二步:创建一个接口
public interface HelloService { public String sayHello(String name); public List<User> findAllUser(); }
第三步:提供上面接口的实现类
public class HelloServiceImpl implements HelloService{ public String sayHello(String name) { System.out.println("sayHello方法被调用了"); return "hello " + name; } public List<User> findAllUser() { List<User> list = new ArrayList<User>(); list.add(new User(1, "小王")); list.add(new User(2,"小白")); return list; } }
第四步:在web.xml中配置服务
<servlet> <servlet-name>hessian</servlet-name> <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class> <init-param> <param-name>home-class</param-name> <param-value>cn.itcast.service.HelloServiceImpl</param-value> </init-param> <init-param> <param-name>home-api</param-name> <param-value>cn.itcast.service.HelloService</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>hessian</servlet-name> <url-pattern>/hessian</url-pattern> </servlet-mapping>
客户端开发:
第一步:创建一个客户端项目,并导入hessian的jar包
第二步:创建一个接口(和服务端接口对应)
public interface HelloService { public String sayHello(String name); public Object findAllUser(); }
第三步:使用hessian提供的方式创建代理对象调用服务
HessianProxyFactory factory = new HessianProxyFactory(); HelloService proxy = (HelloService) factory.create(HelloService.class, "http://localhost:8080/hessian_server/hessian"); String ret = proxy.sayHello("test"); System.out.println(ret); Object users = proxy.findAllUser(); System.out.println(users);
4. 定区关联客户(基于hessian)
物流公司的客户信息存在crm系统中4.1 提供crm系统
Crm发布服务配置
remoting-servlet.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <!-- 业务类 --> <bean id="customerService" class="cn.itcast.crm.service.impl.CustomerServiceImpl" /> <!-- 注册hessian服务 --> <bean id="/customer" class="org.springframework.remoting.caucho.HessianServiceExporter"> <!-- 业务接口实现类 --> <property name="service" ref="customerService" /> <!-- 业务接口 --> <property name="serviceInterface" value="cn.itcast.crm.service.CustomerService" /> </bean> </beans>
4.2 在bos系统中配置调用crm服务
第一步:在bos项目中导入hessian的jar包
第二步:在bos项目中提供一个接口,和crm服务端接口对应
// 客户服务接口 public interface CustomerService { // 未关联定区客户 public List<Customer> findnoassociationCustomers(); // 查询已经关联指定定区的客户 public List<Customer> findhasassociationCustomers(String decidedZoneId); // 将未关联定区客户关联到定区上 public void assignCustomersToDecidedZone(Integer[] customerIds, String decidedZoneId); }
创建对应客户类(Customer)(必须包结构也相同不然也是返回map,一般远程服务是提供jar包不用考虑此问题)
如果不创建,可以把Customer泛型改成Object
这时候调用返回的Object对象,是一个含有customer属性的map对象
第三步:在spring配置文件中注册一个代理对象,由spring工厂负责创建这个代理对象,使用此代理对象可以远程调用crm服务
<!-- 注册代理对象,用于远程调用crm服务 --> <!-- 配置远程服务的代理对象 --> <bean id="customerService" class="org.springframework.remoting.caucho.HessianProxyFactoryBean"> <!--本项目创建的对应服务接口 --> <property name="serviceInterface" value="com.itheima.bos.crm.CustomerService"/> <!--访问对应服务的url zjs_crm 项目名 /remotiong 对发布应服务项目中web.xml 提供Hessian的DispatcherServlet的url-pattern /customer 对应发布服务配置remoting-servlet.xml中的注册服务bean id --> <property name="serviceUrl" value="http://192.168.15.63:8080/zjs_crm/remoting/customer"/> </bean>
第四步:通过注解将代理对象注入到Action中
//注入代理对象 @Resource private CustomerService customerService;
第五步:调整定区关联客户窗口
效果
发送ajax请求,请求action,在Action中调用代理对象,通过代理对象访问crm服务
function doAssociations(){ //判断当前是否选中了一个定区 var rows = $("#grid").datagrid("getSelections"); if(rows.length != 1){ $.messager.alert("提示信息","请选择一个定区!","warning"); }else{ //清空下拉框客户信息 $("#noassociationSelect").empty(); $("#associationSelect").empty(); //发送ajax请求,请求Action, //在Action中调用代理对象获取客户数据,返回json,将返回的json数据动态填充到下拉框中 //加载左侧下拉框中的客户信息 var url1 = "${pageContext.request.contextPath}/decidedzoneAction_findCustomerNotAssociation.action"; $.post(url1,{},function(data){ for(var i=0;i<data.length;i++){ //使用客户信息填充下拉框 var name = data[i].name; var id = data[i].id; $("#noassociationSelect").append("<option value='"+id+"'>"+name+"</option>"); } }); //加载右侧下拉框中的客户信息 var url2 = "${pageContext.request.contextPath}/decidedzoneAction_findCustomerAssociation.action"; var did = rows[0].id;//当前选中的定区id $.post(url2,{"id":did},function(data){ for(var i=0;i<data.length;i++){ //使用客户信息填充下拉框 var name = data[i].name; var id = data[i].id; $("#associationSelect").append("<option value='"+id+"'>"+name+"</option>"); } }); $('#customerWindow').window('open'); } }
第六步:在DecidedzoneAction中提供两个查询方法
/** * 获取未关联到定区的客户数据,返回json */ public String findCustomerNotAssociation(){ //使用代理对象远程调用crm服务,获取客户数据 List<Customer> list = customerService.findnoassociationCustomers(); String[] excludes = new String[]{}; this.writeListBean2Json(list, excludes); return NONE; } /** * 获取已经关联到指定定区的客户数据,返回json */ public String findCustomerAssociation(){ String id = model.getId(); List<Customer> list = customerService.findhasassociationCustomers(id); String[] excludes = new String[]{}; this.writeListBean2Json(list, excludes); return NONE; }
第七步:为左右移动按钮绑定事件 及 为“关联客户”按钮绑定事件
$(function(){ //为左右移动按钮绑定事件 $("#toRight").click(function(){ $("#associationSelect").append($("#noassociationSelect option:selected")); }); $("#toLeft").click(function(){ $("#noassociationSelect").append($("#associationSelect option:selected")); }); //为“关联客户”按钮绑定事件 $("#associationBtn").click(function(){ //在提交表单之前,将右侧下拉框中的所有option选中 $("#associationSelect option").attr("selected","selected"); //在提交表单之前,将当前选中的定区的id赋给隐藏域 var id = $("#grid").datagrid("getSelections")[0].id; $("#customerDecidedZoneId").val(id); $("#customerForm").submit(); }); }); </script>
第八步:在DecidedzoneAction中提供方法assigncustomerstodecidedzone
//接收客户id数组 private Integer[] customerIds; public void setCustomerIds(Integer[] customerIds) { this.customerIds = customerIds; } /** * 定区关联客户 */ public String assigncustomerstodecidedzone(){ //调用代理对象,远程调用crm服务,完成定区关联客户 customerService.assignCustomersToDecidedZone(customerIds, model.getId()); return "list"; }
相关文章推荐
- 《程序员的自我修养》 第二章——编译和链接
- netframework 4.5官网下载路径
- JAVASE 打印输出--------01
- 一念永恒 > 第七十八章 他们是在说我么
- 最少拦截系统
- X86架构小机以何应对核心业务
- X86架构小机以何应对核心业务
- Android入门--弹出三个按钮的对话框
- 【颗粒归仓】(四)代码走查工具---StyleCop
- windows缺少网络协议,网络连接失败
- Sprint第二个冲刺(第十天)
- error when loading the sdk 发现了元素 d:skin 开头无效内容
- 编程就是算法和数据结构,算法和数据结构是编程的灵魂。
- CSAPP3e - x86-64 assembly code analysis - Attack Lab: Level II
- window无法启动Mysql服务(位于本地计算机)上
- html中文显示乱码的解决
- 浅析端到端方案兼容性
- 浅析端到端方案兼容性
- 分布式数据库概述
- 优先级队列之堆实现