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

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";
	}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值