概述MVC与三层架构的关系:
用于处理数据,进行业务逻辑判断,数据库存取。其分为两类: 一类称为数据承载 Bean:实体类,专门用户承载业务数据的,如 本项目中的旅游订单Order、旅游会员User 等。 一类称为业务处理 Bean:指 Service 或 Dao 对象,专门用于处理用户提交请求的。
其中在service层中需要的配置
-(1)配置事务管理器transactionManager
-(2)开启事务控制的注解,其中配置proxy-target-class="true",其作用是使用cglib代理方式为Service类创建代理对象。那为什么需要用cglib的代理方式呢?
因为Dubbo需要将Service发布为服务,配置文件扫描的包为com.luochenggui.service,假如默认使用jdk的动态代理,创建的代理对象完整类名为com.sun.proxy.$Proxy35,导致Dubbo在进行包匹配时没有成功,服务发布失败,所以要求必须使用cglib创建代理对象
另外需要在Service注解中加入interfaceClass属性,否则会导致发布的服务接口为SpringProxy,而不是我们定义的Service接口
-(3)jedisPoolConfig相关参数配置与jedisPool
-(4)spring整合dubbo的相关配置,指定发布服务的名称、暴露服务的接口(一般在服务提供者一方配置,可以指定使用的协议名称和端口号)、指定服务注册中心的地址、批量扫描,发布服务
-(5)最后在web.xml中配置ContextLoaderListener,当web容器启动的时候,自动加载spring容器
为用户提供使用界面,与用户直接进行交互。本项目所用到的技术为:
控制器,用于将用户请求转发给相应的 Model 进行处理,并根据 Model 的计算结果向用户提供相应响应。
其中在controller层中需要的配置
作为管理组件,管理整个应用中所有 Bean 的生命周期行为。 即整个应用中所有对象的创建、初始化、销毁,及对象间关联关系的维护,均由 Spring 进行管理。
(1) 使用Druid连接池配置数据源 (2)使用pagehelper作为分页插件 (3)使用sqlsessionfactory来执行SQL语句 在这个bean中将数据源、分页插件的配置、给包取别名配置进来 (4)扫描mapper接口生成代理对象
Apache Dubbo是一款高性能的Java RPC框架。Dubbo提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
节点 | 角色描述 |
---|---|
Consumer | 调用远程服务的服务消费方 |
Provider | 暴露服务的服务提供方 |
Registry | 服务注册与发现的注册中心 |
Monitor | 统计服务的调用次数和调用时间的监控中心 |
Container | 服务运行容器 |
在上面的调用关系可以看出,Registry(服务注册中心)在其中起着至关重要的作用,Dubbo官方推荐使用Zookeeper作为服务注册中心。那如何防止Zookeeper单点故障?Zookeeper其实是支持集群模式的,可以配置Zookeeper集群来达到Zookeeper服务的高可用,防止出现单点故障
在 SpringMVC 的配置文件中加入 multipart 类型数据的解析器
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 设定文件上传的最大值为100MB,10*1024*1024 --> <property name="maxUploadSize" value="104857600" /> <!-- 设定文件上传时写入内存的最大值,如果小于这个参数不会生成临时文件,默认为10240 --> <property name="maxInMemorySize" value="4096" /> <!-- 设定默认编码 --> <property name="defaultEncoding" value="UTF-8"/> </bean>
利用MultipartFile接口中的方法,getOriginalFilename()方法获取文件的原始名,再对原始名进行字符串操作,使用UUID随机产生文件名称,防止同名覆盖。getBytes()方法获取文件的字节数组。将两个参数传到七牛云文件上传的方法,执行上传。
Quartz是Job scheduling(作业调度)领域的一个开源项目,Quartz既可以单独使用也可以跟spring框架整合使用,在实际开发中一般会使用后者。使用Quartz可以开发一个或者多个定时任务,每个定时任务可以单独指定执行的时间,例如每隔1小时执行一次、每个月第一天上午10点执行一次、每个月最后一天下午5点执行一次等。
<!--注册自定义Job--> <bean id="clearImgJob" class="com.atguigu.job.ClearImgJob"/> <!--注册JobDetail,作用:负责通过反射调用指定的Job--> <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!--注入目标对象--> <property name="targetObject" ref="clearImgJob"/> <!--注入目标方法--> <property name="targetMethod" value="clearImg"/> </bean> <!--注册一个触发器,指定任务的触发时间--> <bean id="clearImgTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <!--注入jobDetail--> <property name="jobDetail" ref="jobDetail"/> <!-- 指定触发的时间,基于Cron表达式(0 0 2 * * ?表示凌晨2点执行) --> <property name="cronExpression"> <value>0 0 2 * * ?</value> </property> </bean> <!--注册一个统一的调度工厂,通过这个调度工厂调度任务--> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <!--注入多个触发器--> <property name="triggers"> <ref bean="clearImgTrigger"/> </property> </bean>
在定时任务的方法里,先用sdiff()方法计算Redis中两个集合的差集,获取垃圾图片名称,在调用七牛云中删除文件的方法,完成定时删除垃圾图片。
图片上传整体流程如下:
图片上传的具体方法可以参照官网提供的API文档https://developer.qiniu.com/kodo/sdk/1239/java
七牛云操作对象存储服务。
Apache POI 该链接提供相关操作excel表的api。如导出Excel,导入Excel到数据库中。在本项目中,有两个模块的功能需要用到Excel操作:
(1)从excel中读取预约设置信息,批量导入到数据库,controller层实现方法:使用poi工具类解析excel文件,读取里面的内容,即POIUtils.readExcel(excelFile),然后将对应表格中的数据,用相应实体类进行封装。
(2)将旅游的整体运营统计数据导出,controller层实现方法:
在service层,controller层(web层),定时任务的jobs层都需要配置jedisPoolConfig相关参数配置与jedisPool
前面我们已经完成了文件上传,将图片存储在了七牛云服务器中。但是这个过程存在一个问题,就是如果用户只上传了图片而没有最终保存套餐信息到我们的数据库,这时我们上传的图片就变为了垃圾图片。对于这些垃圾图片我们需要定时清理来释放磁盘空间。这就需要我们能够区分出来哪些是垃圾图片,哪些不是垃圾图片。如何实现呢?
方案就是利用redis来保存图片名称,具体做法为:
1、当用户上传图片后,将图片名称保存到redis的一个Set集合中,例如集合名称为 setmealPicResources
2、当用户添加套餐后,将图片名称保存到redis的另一个Set集合中,例如集合名称为setmealPicDbResources
3、用sdiff()方法计算 setmealPicResources集合与 setmealPicDbResources集合的差值,结果就是垃圾图片的名称集合,清理这些图片即可
例:
用于用户注册时,进行发送验证码进行短信验证