bos06_课堂笔记
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
BOS 物流管理系统第六天定区管理
今天内容安排:
1、添加定区功能
定区关联分区、取派员
2、定区条件分页查询
form请求数据json转换、Spring Data Specification 实现条件查询
3、定区关联客户(重点)
BOS系统和CRM 系统远程调用WebService CXF
1.任务一:定区管理添加功能
业务:
什么是定区?固定配送、物流管理区域
添加定区业务实现说明:
1: 添加定区页面回显取派员(q mode:remote)
2: 添加定区页面: 显示未关联分区信息
3: 添加定区业务: 定区表添加一条记录分区表循环更新定区表在分区表外键! update 4: 定区编号唯一(ajax唯一性校验) 修改定区实体类注册策略
定区是分区的集合、定区需要指定多名取派员负责(多名取派员换班依赖排班功能---- 收派时间管理)
系统简化设计,一个定区只关联一个取派员
分析页面,定区要去关联取派员、关联分区数据
1.1.取派员下拉列表
在StaffAction 添加ajaxlist 方法
Service
获取取派员在职非作废!
DAO 代码
1.2.分区datagrid 表格显示
定区关联分区,显示未关联定区的分区列表
在SubareaAction 添加查询方法
DAO 代码
Service 代码
Action 代码
测试页面回显数据! 解决延迟加载问题:
添加定区存在问题:? 提交数据id 冲突
1.3.添加定区实现
1.3.1.解决定区编号和分区编号提交name冲突完善decidedzone.jsp的添加定区form
定区实体类采用手动指定id的方式
点击添加form中save按钮,提交form (验证功能)
问题:分区datagrid 勾选分区编号,会不会随form 提交???
分区编号提交时也为id 和定区编号冲突
修改datagrid的field
修改服务器返回json,含有subareaId ,修改Subarea 实体类添加get方法!
1.3.
2.编写添加定区服务器代码
Action代码
Service代码
DAO代码
测试!ok
2.任务三:定区条件分页查询
定区编码----- bc_decidedzone表
所属单位----- bc_staff 表
分区------ bc_subarea 表
完善form
第一步:在页面引入自定义jquery 函数serializeJSON
第二步;点击查询按钮,将form数据转换为json ,load到datagrid
第三步:修改datagrid 的url
第四步:编写服务器代码,spring data Specification DAO代码
Service代码
Action 代码
封装条件方法实现
// 抽取代码
private Specification<DecidedZone> getSpecification() {
// model 瞬时态分页条件查询 ...
// molde 数据封装Specification 实现类中
// Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb); 方法将请求参数封装Specification
Specification<DecidedZone> spec = new
Specification<DecidedZone>() {
public Predicate toPredicate(Root root, CriteriaQuery query, CriteriaBuilder cb) {
// 将请求参数model 数据封装Predicate
// 1: root 表示Subarea from Subarea join .... where .... 省市区条件Region 关键字SubArea 定区DecidedZone oid
// 2:cb 连接条件构建器类似以前hibernate Restrictions.like/eq/gt
List<Predicate> list = new ArrayList<Predicate>(); // 存放所有条件对象Predicate
if (StringUtils.isNotBlank(model.getId())) {
// 连自己表
Predicate p1 = cb.equal(root.get("id").as(String.class), model.getId());
list.add(p1);
}
// 3: 连接省市区多表Region 查询
if (model.getStaff() != null) {
// subarea 连接region 表
Join staffJoin =
root.join(root.getModel().getSingularAttribute("staff", Staff.class), JoinType.LEFT);
if
(StringUtils.isNotBlank(model.getStaff().getStation())) {
Predicate p2 =
cb.like(staffJoin.get("station").as(String.class), "%" +
model.getStaff().getStation() + "%");
list.add(p2);
}
}
// 4: 定区id
if (StringUtils.isNotBlank(association)) {
// "" 0 未关联分区的定区1 关联定区
if ("1".equals(association)) {
Predicate p3 =
cb.isNotEmpty(root.get("subareas").as(Set.class));
list.add(p3);
} else if ("0".equals(association)) {
Predicate p3 =
cb.isEmpty(root.get("subareas").as(Set.class));
list.add(p3);
}
}
// List<Predicate> list = new ArrayList<Predicate>(); 集合长度大小由用户表单请求参数决定
Predicate[] p = new Predicate[list.size()];// 定义数组泛型
// list.toArray 返回的Object 数组
return cb.and(list.toArray(p));// Predicate数组内部所有条件and 关系
}
};
return spec;
}
定区条件分页查询完成!
任务四:定区关联客户功能
2.1.分析定区关联客户功能
业务:系统存在很多定区(将取派员分配管理不同分区),客户居住在物流系统所能覆盖的区域(分区),分区属于定区,定区分配取派员
为了系统后期更为方便查询和管理,系统存在定区关联客户,手动将客户关联到定区上!!!
需求文档很多功能模块中,存在相关接口的描述--------- 远程系统交互接口
客户信息来自CRM 管理系统,BOS系统存在定区信息,BOS要去远程访问CRM 获取客户信息,完成客户与定区关联操作
2.2.C XF 编写CRM系统接口服务
现在企业开发WebService ,WS实现技术需要和Spring进行整合
可以查看Spring 框架规范文档
Spring 整合WebService 在21章节
Spring 整合CXF 21.5
2.2.1.Spring 整合CXF
回顾步骤:
1、项目导入CXF 的jar包
2、编写接口是实现类
在接口添加注解,表明WebService 接口@WebService 、@WebMethod
3、<jaxws:server> 配置服务器接口
4、引入cxf 文件
5、配置CXF Servlet
====================================================================== 2.2.2.使用CXF 编写CRM系统(一)
分析功能需求:
⏹左面select 加载所有未关联定区的客户
⏹右面select 加载当前选中定区,已经关联的客户
⏹将移动到右面select中所有客户,关联到当前选中的定区上第一步:新建maven project
第二步:通过maven引入坐标
Spring 、Hibernate(驱动)CXF 、Servlet、JSP
<properties>
<spring.version>3.2.12.RELEASE</spring.version>
<hibernate.version>3.6.10.Final</hibernate.version>
<slf4j.version>1.7.5</slf4j.version>
<c3p0.version>0.9.1.2</c3p0.version>
<oracle.version>10.2.0.4.0</oracle.version>
<servlet.version>2.5</servlet.version>
<jsp.version>2.0</jsp.version>
<junit.version>4.11</junit.version>
<cxf.version>2.2.3</cxf.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version> </dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${slf4j.version}</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>${c3p0.version}</version>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc14</artifactId>
<version>${oracle.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>${servlet.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jsp-api</artifactId>
<version>${jsp.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.12.0.GA</version>
</dependency>
</dependencies>
tomcat7 插件
<build>
<plugins>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.1</version>
<configuration>
<port>9999</port>
</configuration>
</plugin>
</plugins>
</build>
第三步:applicationContext.xml配置Spring 整合Hibernate
<!-- 引入外部属性文件-->
<context:property-placeholder location="classpath:db.properties" />
<!-- 连接池-->
<bean id="dataSource" class="boPooledDataSource"> <property name="driverClass" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${er}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <!-- 第一部分:连接池-->
<property name="dataSource" ref="dataSource" />
<!-- 第二部分:hibernate常用属性-->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<!-- 第三部分:包扫描-->
<property name="packagesToScan">
<list>
<value>cn.itcast.crm.domain</value>
</list>
</property>
</bean>
<!-- 事务管理-->
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property> </bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
第四步:新建customer数据表
第五步:配置web.xml spring listener
测试: 建表完成!
webservice 需要三个服务实现:
业务层+dao
在配置cxf服务器端配置servlet
第六步:准备客户假数据
2.2.
3.使用CXF 编写CRM 系统(二)
注解版本案例介绍开发中因为cxf 使用xml 配置
1、编写CustomerDao接口和实现
2: 编写dao接口实现三个业务方法
接口
实现类
2、配置WebService服务发布使用Spring 集成!
引入jaxws 名称空间
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance" xmlns:aop="/schema/aop"
xmlns:context="/schema/context" xmlns:tx="/schema/tx"
xmlns:cache="/schema/cache"
xmlns:jaxws="/jaxws"
xsi:schemaLocation="
/schema/beans
/schema/beans/spring-beans.xsd
/schema/aop
/schema/aop/spring-aop.xsd
/schema/context
/schema/context/spring-context.xsd
/schema/tx
/schema/tx/spring-tx.xsd
/schema/cache
/schema/cache/spring-cache.xsd
/jaxws
/schemas/jaxws.xsd">
dao 和service bean 注册!
<?xml version="1.0"encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xmlns:aop="/schema/aop"
xmlns:context="/schema/context"
xmlns:tx="/schema/tx"
xsi:schemaLocation="
/schema/beans
/schema/beans/spring-beans.xsd /schema/aop
/schema/aop/spring-aop.xsd /schema/context
/schema/context/spring-context.xsd /schema/tx
/schema/tx/spring-tx.xsd">
<context:property-placeholder
location="classpath:jdbc.properties"/>
<bean id="dataSource"
class="boPooledDataSource">
<!-- 配置连接数据库参数c3p0 连接池-->
<property name="driverClass"
value="${jdbc.driverClass}"></property>
<property name="jdbcUrl"value="${jdbc.url}"></property>
<property name="user"value="${ername}"></property>
<property name="password"
value="${jdbc.password}"></property>
</bean>
<!-- sessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.annotation.AnnotationSes sionFactoryBean">
<!-- 第一部分:连接池-->
<property name="dataSource"ref="dataSource"/>
<!-- 第二部分:hibernate常用属性-->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${jdbc.dialect}</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
</props>
</property>
<!-- 第三部分:包扫描-->
<property name="packagesToScan">
<list>
<value>cn.itcast.mavencrm.domain</value>
</list>
</property>
</bean>
<!-- dao -->
<bean id="customerDao"
class="cn.itcast.mavencrm.dao.CustomerDaoImpl">
<property name="sessionFactory"
ref="sessionFactory"></property>
</bean>
<!-- service -->
<bean id="customerService"
class="cn.itcast.mavencrm.service.CustomerServiceImpl">
<property name="customerDao"ref="customerDao"></property> </bean>
<!-- 配置事务管理器
-->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManage r">
<property name="sessionFactory"
ref="sessionFactory"></property>
</bean>
<!-- 通知-->
<tx:advice id="myadvice"
transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="assigen*"/>
<tx:method name="get*"read-only="true"/>
</tx:attributes>
</tx:advice>
<!-- 切面-->
<aop:config>
<aop:pointcut expression="bean(customerService)"
id="mycut"/>
<aop:advisor advice-ref="myadvice"pointcut-ref="mycut"/> </aop:config>
</beans>
测试业务层方法的实现编写Junit 测试类ok
cxf+spring 整合
业务层接口添加webService 注解
配置spring 继承cxf配置 2.2.3 版本cxf 需要配置下列
引入配置文件(高本版2.6.15可以不配置)
配置服务器发布
3、在web.xml 配置CXF Servlet
4、启动crm项目
http://localhost:9999/mavencrm/customer?wsdl查看到web service 的wsdl文件(wsdl2java)
2.3.CXF 编写BOS客户端junit测试程
接口联调动作
1、A方服务器编写接口本地测试OK
2、B方编写接口客户端代码
3、B方邀请A方,同时在线进行接口调试
第一步:修改BOS的pom.xml 引入CXF
<cxf.version>2.2.3</cxf.version>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-frontend-jaxws</artifactId>
<version>${cxf.version}</version>
</dependency>
<dependency>
<groupId>org.apache.cxf</groupId>
<artifactId>cxf-rt-transports-http</artifactId>
<version>${cxf.version}</version>
</dependency>
本地生成代理类完成
第二步:将crm 接口和实体类,复制bos 本地代理类完成
第三步:针对业务接口,编写junit测试用例配置applicationContext.xml CXF 客户端
测试类: bos 测试完成!
2.4.项目集成定区关联客户
当我们将cxf 版本使用 2.2.3 版本依赖asm 使用的 2.2.3 会导致和struts2 依赖asm.xxxjar 冲突
启动bos 系统需要引入兼容asm.jar 采用3.3.1 版本手动导入就近原则! bos 系统pom.xml 手动引入3.3.1 坐标!
解决asm jar 问题!
第一步:点击关联客户,弹出关联窗口
先选择一个定区
只能选择一个定区
第二步:在弹出关联窗口时,自动发起两次Ajax请求,获取未关联定区客户和已经关联当前选中定区的客户
编写服务器代码
测试: 发现现象select 每次请求清空之前option
第三步:select 左右移动$(function函数内部)
第四步:提交关联form实现关联
●提交右侧需要管理客户id 列表(所有option选中option 属性添加
selected="selected" )
●通过页面隐藏域,提交定区id
编写服务器代码
问题:只能关联,不能取消关联?修改CRM代码,采用全部取消关联,再关联方式
作业:
1、添加定区
2、定区条件分页查询Specification 编程方式
3、定区关联客户CXF编程实现。