本文主要是介绍BOS项目5:定区添加及查询,Hessian入门,基于hessian实现定区关联客户功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
目录
- 1 定区添加功能
- 2 定区分页查询
- 3 Hessian入门
- 4 定区关联客户基于hessian
- 1 定区添加功能
- 2 定区分页查询
- 3 Hessian入门
- 4 定区关联客户基于hessian
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;
- }
- }
- <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();
- }
- 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";
- }
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;
- }
- }
- <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();
- }
- 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";
- }
目录(?)[-]
- 1 定区添加功能
- 2 定区分页查询
- 3 Hessian入门
- 4 定区关联客户基于hessian
- 1 定区添加功能
- 2 定区分页查询
- 3 Hessian入门
- 4 定区关联客户基于hessian
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;
- }
- }
- <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();
- }
- 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";
- }
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;
- }
- }
- <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();
- }
- 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";
- }
这篇关于BOS项目5:定区添加及查询,Hessian入门,基于hessian实现定区关联客户功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!