您的位置:首页 > 其它

框架 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";
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: