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文件中添加如下内容 <!-- 如果不添加此节点mybatis的mapper.xml文件都会被漏掉。 --> <build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>如何实现远程通信
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配置资源映射 <mvc:resources location="/css/" mapping="/css/**"/> <mvc:resources location="/js/" mapping="/js/**"/>分页插件PageHelper
Mybatis分页插件 - PageHelper说明 如果你也在用Mybatis,建议尝试该分页插件,这个一定是最方便使用的分页插件。 该插件目前支持Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库分页。 mysql开源,免费 sqlserver 学.net才用到sqlserver。分页插件不支持sqlserver 使用方法 第一步:把PageHelper依赖的jar包添加到工程中。官方提供的代码对逆向工程支持的不好,使用参考资料中的pagehelper-fix。 第二步:在Mybatis配置xml中配置拦截器插件: <plugins> <!-- com.github.pagehelper为PageHelper类所在包名 --> <plugin interceptor="com.github.pagehelper.PageHelper"> <!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库--> <property name="dialect" value="mysql"/> </plugin> </plugins> 第三步,测试代码 //初始化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<TbItem> list = itemMapper.selectByExample(example); //取分页信息,PageInfo。1、总记录数2、总页数 。当前页码 PageInfo<TbItem> 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表示该节点下没有子节点 通过父节点查询子节点 <a href="javascript:void(0)" class="easyui-linkbutton selectItemCat">选择类目</a> selectItemCat 事件绑定的class // 初始化选择类目组件common.js initItemCat : function(data){ $(".selectItemCat").each(function(i,e){ var _ele = $(e); if(data && data.cid){ _ele.after("<span style='margin-left:10px;'>"+data.cid+"</span>"); }else{ _ele.after("<span style='margin-left:10px;'></span>"); } 初始化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系统中实现回调函数