Mybatis逆向工程
使用mybatis官方提供的mybatis-generator生成pojo、mapper接口及映射文件。
并且将pojo放到e3-manager-pojo工程中。
将mapper接口及映射文件放到e3-manager-dao工程中。
SSM整合
1、Dao层:
Mybatis的配置文件:SqlMapConfig.xml
不需要配置任何内容,需要有文件头,文件必须存在
applicationContext-dao.xml:
mybatis整合spring,通过spring创建数据库连接池,spring管理sqlsessionFactory、mapper代理对象。需要mybatis和spring的整合包
2、Service层:
applicationContext-service.xml
所有的service实现类都放到spring容器中管理,并由spring管理事务
(可选)applicationContext-trans.xml
spring配置事务管理器,通知,传播行为,切面
3、表现层
springmvc框架,有springmvc管理controller
springmvc的三大组件,视图解析器前缀和后缀
web.xml配置前端控制器(url-pattern/不拦截jsp请求),初始化spring容器,解决post乱码
参数
@Autowired 自动装配
@RequestMapping("xx") 入口
@ResponseBody 返回类型是json类型
@PathVariable 入参绑定
解决mapper绑定异常
此异常的原因是由于mapper接口编译后在同一个目录下没有找到mapper映射文件而出现的。
由于maven工程在默认情况下src/main/java目录下的mapper文件是不发布到target目录下的。
默认发布src/main/resource
在e3-manager-dao工程的pom文件中添加如下内容
src/main/java
**/*.properties
**/*.xml
false
如何实现远程通信
1、WebService:效率不高基于soap协议(可用于两个公司之间的通信)
2、restful(只是一个形式url中包含参数,我们从url中取参数,并且url中是没有后缀):http+json。很多项目中应用,如果服务太多,服务之间调用关系混乱,需要治疗服务
3、dubbo:使用rpc协议进行远程调用,基于socket通信,传输速率高,可以统计出系统之间的调用关系、调用次数
表现层格式js.css加载不出来
由于在web.xml中定义的url拦截形式为“/”表示拦截所有的url请求,包括静态资源例如css、js等。所以需要在springmvc.xml中添加资源映射标签:
在springmvc配置资源映射
分页插件PageHelper
Mybatis分页插件 - PageHelper说明
如果你也在用Mybatis,建议尝试该分页插件,这个一定是最方便使用的分页插件。
该插件目前支持Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库分页。
mysql开源,免费
sqlserver 学.net才用到sqlserver。分页插件不支持sqlserver
使用方法
第一步:把PageHelper依赖的jar包添加到工程中。官方提供的代码对逆向工程支持的不好,使用参考资料中的pagehelper-fix。
第二步:在Mybatis配置xml中配置拦截器插件:
第三步,测试代码
//初始化spring容器
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-dao.xml");
//从容器中获得Mapper代理对象
TbItemMapper itemMapper = applicationContext.getBean(TbItemMapper.class);
//执行sql语句之前设置分页信息使用PageHelper的startPage方法。
PageHelper.startPage(1, 10);
//执行查询
TbItemExample example = new TbItemExample();
List list = itemMapper.selectByExample(example);
//取分页信息,PageInfo。1、总记录数2、总页数 。当前页码
PageInfo pageInfo = new PageInfo<>(list);
System.out.println(pageInfo.getTotal());
System.out.println(pageInfo.getPages());
System.out.println(list.size());
Nignx
正向代理:我的电脑可以上网,你的不行,我开个代理服务器给你,你配置一下就能通过我这电脑上网,我的电脑就是代理服务器
反向代理说的是服务端,正向代理说的是客户端
反向代理,服务来了之后,通过反向代理服务器,由反向代理服务器决定将请求转发给哪个应用服务器
nignx不实际处理,将请求转发给业务服务器。nginx相当于只做请求转发
页面伪静态化
web.xml有欢迎页,会按顺序找,首先找到index.html,
src下找不到会进入到servlet前端控制器(*.html)拦截方法
到@RequestMapping("/index")对应上了
去到handler对应的方法,进行操作和跳转页面
什么是Dubbo?Zookeeper
Dubbo就是SOA资源调度和治理中心的管理工具
Zookeeper可以作为集群的管理工具使用和集中管理配置文件
类目选择如何实现?
使用EasyUI的tree控件实现,页面初始化会初始化选择类目组件,点击类目,会打开一个窗口,
,发送一次请求,tree返回类型需要json类型的数据,使用异步树控件可以使子节点的加载依赖于父节点
,展开一个封闭的节点,就会该节点id的值作为参数,查询子节点,
state为close时表示该节点下还有子节点,open表示该节点下没有子节点
通过父节点查询子节点
选择类目
selectItemCat 事件绑定的class
// 初始化选择类目组件common.js
initItemCat : function(data){
$(".selectItemCat").each(function(i,e){
var _ele = $(e);
if(data && data.cid){
_ele.after(""+data.cid+"");
}else{
_ele.after("");
}
初始化tree请求的url:/item/cat/list
参数:
初始化tree时只需要把第一级节点展示,子节点异步加载。
long id(父节点id)
返回值:json。数据格式
[{
"id": 1,
"text": "Node 1",
"state": "closed"
},{
"id": 2,
"text": "Node 2",
"state": "closed"
}]
state:如果节点下有子节点“closed”,如果没有子节点“open”
创建一个pojo来描述tree的节点信息,包含三个属性id、text、state。
图片上传实现?
图片服务器中配置了有fastDFS和nginx
存储空间可扩展,提供一个统一的访问方式,
FastDFS,分布式文件系统,实现服务器高可用,支持每个节点有备份机
FastDFS支持冗余备份、负载均衡、线性扩容等机制
FastDFS客户端的使用步骤(可使用FastDFS工具类简化)
1、加载配置文件,配置文件中的内容就是tracker服务的地址。
配置文件内容:tracker_server=192.168.25.133:22122
2、创建一个TrackerClient对象。直接new一个。
3、使用TrackerClient对象创建连接,获得一个TrackerServer对象。
4、创建一个StorageServer的引用,值为null
5、创建一个StorageClient对象,需要两个参数TrackerServer对象、StorageServer的引用
6、使用StorageClient对象上传图片。
7、返回数组。包含组名和图片的路径。
FastDFS实现了图片的保存和上传,访问图片需要用到nginx
商品的回显和上传在common.js 80行左右
商品上传格式在common.js 20行
返回格式json类型的数据 返回error和url
图片上传解决浏览器兼容问题(除了谷歌,其他浏览器都会上传图片失败)
KindEditor的图片上传插件,对浏览器兼容性不好
返回值类型使用@RessponseBody注解返回java对象:Response Headers中的content-type是application/json,兼容性不好
返回值返回字符串时:content-type类型是text/plain,后台返回值从json对象转变成string字符
要指定字符集的话,可以在@RequestMapping后面添加produces=MediaTyper.TEXT_PLAIN_VALUE+";charset=utf-8"
富文本编辑器(纯JS编写,下载直接引用即可)
使用方法:
1、引用js css的控件
2、在表单中添加一个textarea控件,是一个富文本编辑器的载体,类似数据源
3、初始化富文本编辑器,使用官方提供的方法初始化
4、取富文本编辑器的内容
表单提交之前,把富文本编辑器的内容同步到textarea控件中。
搜索功能的实现需要solr服务,搜索服务工程,搜索服务表现层
搜索服务层负责将商品导入索引
搜索服务
商品全部导入索引库
把solrJ相关jar包导入工程
创建solrServer(索引库)对象,创建和一个和solr服务的连接
(web.xml会初始化spring容器,在spring的配置文件里面配置solrServer相关的信息)
在根据@Autowired注解自动装配调用solrServer
创建文档solr文档对象,将商品的属性添加到文档对象的域中。属性要跟schema.xml的域一一对应
定义完文档对象后,把对象添加进solr索引库中
最后提交
搜索的表现层
创建solrServer对象
创建查询对象
设置查询条件
设置分页条件
开启高亮
设置默认搜索域
执行查询
去查询结果总记录数
activeMQ
默认端口:8161 打开activeMQ网页 测试时建立的端口:61616
用户和密码都是:admin
activeMQ是中间件,用来传递消息,可以一对一或一对多,
一对一时,消息未传送到时可以保存在MQ服务端上
一对多时,消息具有实时性,生产者发送,有多少消费者在就给多少消费者发送,不会保存
但是有方法能做到一对多消息的保存
queue点对点发送,生产者发送消息,消费者未接受之前,会一直将消息存放在MQ服务端
topic一对多发送,生产者发送消息,消费者在的话就会接受,不在的话消息也不会保存
服务端也是有办法保持持久化的
spring和MQ整合
1、引入相关jar包 (3个 spring-jms spring-context-support activemq-all)
2、发送端:相关文件配置文件 配置生产者 queue目的地或topic目的地
接受端:配置queue目的地或topic目的地 监听器 消息监听容器
3、manager后台模块增加商品时向search模块发送itemId
发送端:注入生产者,目的地,发送商品添加消息
接收端(监听器):从消息中取商品id,根据商品id查询商品信息,创建文档对象并向其添加域,写入索引提交
单点登录如何解决模块之间session共享?
1、单点登录系统是使用redis模拟session,实现session的统一管理
2、登录成功后生成一个token,把用户信息保存在redis,key是token value是Tbuser对象转json,
在设置key的过期时间,再把token写入到cookies中
3、ajax请求 ,每个页面做一个js,js里做一个ajax请求获取token,
sso发布服务。每个页面都引进这个js
使用js从cookie中取token
ajax请求接口,得到json数据,解析用户名,显示到页面
问题:js的跨域限制
跨域:ip地址不同或ip相同,端口不同
jsonp解决:ajax跨域请求,请求数据带参数callback,jsonp判断参数是否有callback
有的话进行跨域处理,返回给页面的是JS语句,根据参数的方法取参数里面的数据。
跨域返回不了json数据,可以返回JS语句
jQuery的ajax的请求定义好了,我们只需把dataType设为jsonp.
在调用的url接口中对应的方法定义多一个callback参数,
在响应结果之前,判断是否为jsonp请求,是的话返回一个callback的js方法,参数为封装的用户信息
购物车模块
在不登录的情况下添加购物车,购物车信息写入cookie key:cart value:商品id。登录的情况下保存在redis中 hash key:用户id hashkey:商品id hashvalue:商品信息
在用户登录后,查询cookie是否有购物车列表,有则合并。
未登录的下,购物车列表以cookie为准,登录后以redis为准
未登录:
从商品详细信息中上传商品id和num;
判断商品是否在购物车中存在,存在就合并数量,不存在就根据id查询商品信息
将商品信息添加进购物车,并写入cookie
登录
从商品详细信息中上传商品id和num;
判断request
订单模块
订单提交之前要先用户登录,配置拦截器,登录后,要在sso系统中实现回调函数