您的位置:首页 > 其它

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

2016-06-20 15:21 656 查看


1. 定区添加功能

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

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

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

第二步:在StaffAction中提供方法

[java] view
plain copy







/**

* ajax查询未作废的员工

* @return

*/

public String findByWorking(){

List<Staff> list=staffService.findByWroking();

this.writeList2json(list, new String[]{"decidezones"});

return NONE;

}

service

[java] view
plain copy







@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方法,查询分区数据

[java] view
plain copy







/**

* 查询未分配到定区的分区,返回json

*/

public String listajax(){

List<Subarea> list = subareaService.findListNotAssociation();

String[] excludes = new String[]{"decidedzone","region"};

this.writeListBean2Json(list, excludes );

return NONE;

}

Service代码:

[java] view
plain copy







/**

* 查询未关联到定区的分区

*/

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

[java] view
plain copy







//属性驱动,接收分区id数组

private String[] subareaid;

public void setSubareaid(String[] subareaid) {

this.subareaid = subareaid;

}

/**

* 添加定区

*/

public String add(){

decidedzoneService.save(model,subareaid);

return "list";

}

Service

[java] view
plain copy







@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包

第二步:创建一个接口

[java] view
plain copy







public interface HelloService {

public String sayHello(String name);

public List<User> findAllUser();

}

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

[java] view
plain copy







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中配置服务

[html] view
plain copy







<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包

第二步:创建一个接口(和服务端接口对应)

[java] view
plain copy







public interface HelloService {

public String sayHello(String name);

public Object findAllUser();

}

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

[java] view
plain copy







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

[html] view
plain copy







<?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服务端接口对应

[java] view
plain copy







// 客户服务接口

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服务

[html] view
plain copy







<!-- 注册代理对象,用于远程调用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中

[java] view
plain copy







//注入代理对象

@Resource

private CustomerService customerService;

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

效果



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

[javascript] view
plain copy







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中提供两个查询方法

[java] view
plain copy







/**

* 获取未关联到定区的客户数据,返回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;

}

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

[javascript] view
plain copy







$(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

[java] view
plain copy







//接收客户id数组

private Integer[] customerIds;

public void setCustomerIds(Integer[] customerIds) {

this.customerIds = customerIds;

}

/**

* 定区关联客户

*/

public String assigncustomerstodecidedzone(){

//调用代理对象,远程调用crm服务,完成定区关联客户

customerService.assignCustomersToDecidedZone(customerIds, model.getId());

return "list";

}


1. 定区添加功能

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

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

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

第二步:在StaffAction中提供方法

[java] view
plain copy







/**

* ajax查询未作废的员工

* @return

*/

public String findByWorking(){

List<Staff> list=staffService.findByWroking();

this.writeList2json(list, new String[]{"decidezones"});

return NONE;

}

service

[java] view
plain copy







@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方法,查询分区数据

[java] view
plain copy







/**

* 查询未分配到定区的分区,返回json

*/

public String listajax(){

List<Subarea> list = subareaService.findListNotAssociation();

String[] excludes = new String[]{"decidedzone","region"};

this.writeListBean2Json(list, excludes );

return NONE;

}

Service代码:

[java] view
plain copy







/**

* 查询未关联到定区的分区

*/

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

[java] view
plain copy







//属性驱动,接收分区id数组

private String[] subareaid;

public void setSubareaid(String[] subareaid) {

this.subareaid = subareaid;

}

/**

* 添加定区

*/

public String add(){

decidedzoneService.save(model,subareaid);

return "list";

}

Service

[java] view
plain copy







@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包

第二步:创建一个接口

[java] view
plain copy







public interface HelloService {

public String sayHello(String name);

public List<User> findAllUser();

}

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

[java] view
plain copy







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中配置服务

[html] view
plain copy







<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包

第二步:创建一个接口(和服务端接口对应)

[java] view
plain copy







public interface HelloService {

public String sayHello(String name);

public Object findAllUser();

}

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

[java] view
plain copy







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

[html] view
plain copy







<?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服务端接口对应

[java] view
plain copy







// 客户服务接口

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服务

[html] view
plain copy







<!-- 注册代理对象,用于远程调用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中

[java] view
plain copy







//注入代理对象

@Resource

private CustomerService customerService;

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

效果



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

[javascript] view
plain copy







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中提供两个查询方法

[java] view
plain copy







/**

* 获取未关联到定区的客户数据,返回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;

}

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

[javascript] view
plain copy







$(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

[java] view
plain copy







//接收客户id数组

private Integer[] customerIds;

public void setCustomerIds(Integer[] customerIds) {

this.customerIds = customerIds;

}

/**

* 定区关联客户

*/

public String assigncustomerstodecidedzone(){

//调用代理对象,远程调用crm服务,完成定区关联客户

customerService.assignCustomersToDecidedZone(customerIds, model.getId());

return "list";

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: