02.商品分类选择-分析-前端js_
03.商品分类选择-分析-数据库_
(JJTree渲染过程解析(parent_id为0就是父节点,is_parent为1说明下面有子节点,state1正常2删除。tree组件有ztree,异步控件树每个节点都有id,展开节点向服务端发送请求,请求检索子节点列表,参数当前节点的id,服务端响应json数据,)&)
04.商品分类选择-Service_
05.商品分类选型实现_
(使用@RequestParam获取参数(@RequestParam(name=”id”,defaultValue=”0” )第一次请求不带参数,给一个默认值确保肯定有值)&)
06.图片上传分析及图片服务器配置_
(Socket选项 HTTP服务器(开启虚拟机,选择已移动该虚拟机保留原来网路配置不发生变化,复制重新生成网卡原来配置不生效,如果要使用虚拟机通过设置为NAT模式,并设置子网网段)&高可用的分布式文件系统构建(只有一个工程把图片放在工程目录下,在1000并发的时候到达tomcat集群,通过Nginx转发每一个tomcat部署一个应用程序,通过轮询把请求平均分给不同服务器,为了能够保证在不同服务器都能找到目标图片需要专门有一个分布式文件服务器FastDFS(软件分布式文件系统,允许横向扩容与负载均衡保证高性能与高可用)负责图片存放与http图片访问(http服务器可以使tomcat或者是nginx(用于访问静态资源性能较好)))&Nginx 安装及负载均衡配置&)
07.FastDFS上传图片测试_
(跟踪服务器配置(fastDFS没法从中央仓库获取,通过maven工程导入,)&存储节点配置(创建一个资源文件client.conf 配置fastDFS中央仓库服务器地址,后缀与源数据详情)&上传文件测试&)
08.FastDFSClient的使用_
(加载资源文件中的图片(this.getClass.getResource(“/”).getPath()取完还是绝对路径,使用全路径复制会有隐藏字符需要去除格式即可。不以’/'开头时,默认是从此类所在的包下取资源,以’/'开头时,则是从ClassPath根下获取。)&)
package testpackage;
public class TestMain {
public static void main(String[] args) {
System.out.println(TestMain.class.getResource(""));
System.out.println(TestMain.class.getResource("/"));
}
}
file:/E:/workspace/Test/bin/testpackage/
file:/E:/workspace/Test/bin/
上面说到的【path以’/'开头时,则是从ClassPath根下获取;】在这里就是相当于bin目录(Eclipse环境下)。
如果我们想在TestMain.java中分别取到1~3.properties文件,该怎么写路径呢?代码如下:
package testpackage;
public class TestMain {
public static void main(String[] args) {
// 当前类(class)所在的包目录
System.out.println(TestMain.class.getResource(""));
// class path根目录
System.out.println(TestMain.class.getResource("/"));
// TestMain.class在/testpackage包中
// 2.properties 在/testpackage包中
System.out.println(TestMain.class.getResource("2.properties"));
// TestMain.class在/testpackage包中
// 3.properties 在/testpackage.subpackage包中
System.out.println(TestMain.class.getResource("subpackage/3.properties"));
// TestMain.class在/testpackage包中
// 1.properties 在bin目录(class根目录)
System.out.println(TestMain.class.getResource("/1.properties"));
}
}
※Class.getResource和Class.getResourceAsStream在使用时,路径选择上是一样的。
Class.getClassLoader().getResource(String path)
path不能以’/'开头时;
path是从ClassPath根下获取;
还是先看一下下面这段代码的输出:
package testpackage;
public class TestMain {
public static void main(String[] args) {
TestMain t = new TestMain();
System.out.println(t.getClass());
System.out.println(t.getClass().getClassLoader());
System.out.println(t.getClass().getClassLoader().getResource(""));
System.out.println(t.getClass().getClassLoader().getResource("/"));//null
}
}
输出结果:
class testpackage.TestMain
sun.misc.Launcher$AppClassLoader@1fb8ee3
file:/E:/workspace/Test/bin/
null
从结果来看【TestMain.class.getResource("/") == t.getClass().getClassLoader().getResource("")】
如果有同样的Project结构
使用Class.getClassLoader().getResource(String path)可以这么写:
package testpackage;
public class TestMain {
public static void main(String[] args) {
TestMain t = new TestMain();
System.out.println(t.getClass().getClassLoader().getResource(""));
System.out.println(t.getClass().getClassLoader().getResource("1.properties"));
System.out.println(t.getClass().getClassLoader().getResource("testpackage/2.properties"));
System.out.println(t.getClass().getClassLoader().getResource("testpackage/subpackage/3.properties"));
}
}
※Class.getClassLoader().getResource和Class.getClassLoader().getResourceAsStream在使用时,路径选择上也是一样的。
09.图片上传功能分析_
10.图片上传功能实现_
(多文件上传1:使用MultipartHttpServletRequest(springMVC需要把commonsi-fileupload两个jar包加到项目中,前端控制器需要配置多媒体解析器MultipartResolver设置默认编码与最大文件大小,通过MultipartFile接收参数,通过@Value加载配置文件的资源,通过Map返回json数据)&单文件上传3:使用MultipartFile结合实体类&通过IOC容器注入Properties类型&placeholder属性&)
11.上传图片功能测试_
12.解决上传图片浏览器兼容性问题_
(使用jackson在服务端将JSON字符串转换成各种Java数据类型(SpringMvc会把对象转为字符串响应浏览器,直接把Map转为json返回String即可)&)
13.富文本编辑器的使用_
(富文本UEditor(富文本编辑器有UEditor、KindEditor、CKEditor都是纯js开发的)&)
14.商品添加功能分析_
15.商品添加-service_
16.商品添加-完成_
02.工程搭建分析_
03.前台系统工程搭建_
(使用URL Rewrite实现网站伪静态(在web.xml中 url-pattern拦截所有*.html 请求网页伪静态,所有url后缀全部改为html,@RequestMapping(“/index”) 通过index.html进行访问。只访问localhost:8080会默认找welcome-file欢迎页index.html 带html后缀去controller匹配)&)
04.首页展示_
05.首页内容管理-数据库分析_
06.内容服务工程搭建_
07.内容分类查询-service_
08.内容分类列表展示_
(@RequestParam注解(与参数名对不上号,使用@RequestParam(“id” ,defaultValue=””)Integer parentId。使用脚本启动服务Maven build clean tomcat7:run )&)
09.内容分类添加-js分析_
10.内容分类添加-mapper_
11.内容分类添加-service_
12.内容分类添加-完成_
13.内容分类修改、删除-作业_
14.内容添加-功能分析_
15.内容添加-service_
16.内容添加-完成_
17.内容编辑、删除_
01.课程计划
(Redis缓存穿透和雪崩(首页并发量最高,每次都查询数据库压力比较大,通过缓存读取内存数据减轻数据库压力,Reids可以把内容持久化到磁盘数据不会丢,内容不会丢失否则瞬时请求会造成数据库雪崩,Redis缓存同步问题)&)
02.首页大广告位实现分析_
04.首页大广告位实现-表现层_
05.首页大广告-测试_
06.redis的安装及启动_
(gcc的简易用法(编译、参数与连接)(编译环境对c语言编译后为可二进制可执行文件,需要按照gcc编译环境,yum install gcc-c++)&用make进行宏编译&makefile的基本语法与变量&RPM安装(install)&Redis安装和配置(rm -rf * 删除所有安装包 ,rm -rf /user/local/redis* )&Redis客户端命令(tar zxf redis-3.0.0.tar.gz 进行解压缩,C语言编译必须有Makefile文件夹,直接使用make命令编译,编译后进行通过make install进行安装 make install PREFIX=/usr/local/redis到指定目录,进入安装目录的bin文件夹,通过./redis-server启动前端启动模式占用一个终端,通过配置文件cp ~/redis-3.0.0/redis.conf 复制到当前文件夹下,进行后端启动不占端口号,修改daemonize yes即可,通过./redis-server redis.conf 后端启动,通过ps aux|grep redis查看进程判断是否启动。 ./redis-cli默认连接6379端口,客户端通过ping pang检测服务器健康状态,连接其他redis服务 ./redis-cli -h 192.168 -p 6379)&Redis基础配置文件&)
sftp是Secure File Transfer Protocol的缩写,安全文件传送协议。它类似于ftp, 但是它提供一种更为安全的网络的加密方法。
如何进行远程连接,进行文件的上传和下载。
在命令行模式下,输入:
sftp 用户名@ip地址 eg: sftp lzy@202.206.64.33
sftp>
如果登陆远程机器不是为了上传下载文件,而是要修改远程主机上的某些文件。可以
ssh lzy@202.206.64.33 (其实sftp就是ssh 的一个程式。)
sftp> get /var/index.php /home/libai/
这条语句将从远程主机的 /var目录下将 index.php 下载到本地 /home/libai/目录下。 sftp> put /home/libai/downloads/linuxgl.pdf /var/ 这条语句将把本地 /home/libai/downloads/目录下的 linuxgl.pdf文件上传至远程主机/var 目录下。
要查看远端机器的一些信息,可以直接使用平时的linux命令
比如:pwd 远端机器的当前路径 cd 改变远端机器的路径 ,ls, rm, mkdir,rmdir 都可以用
要查看本机的一些信息,要在平时的linux命令上,加上l
比如:lpwd 本机当前工作目录 lcd 改变本机的路径, lls ,lrm,lmkdir,lrmdir
要离开sftp,用exit 或quit、 bye 均可。详细情况可以查阅 man sftp.
如果觉得在命令行模式下不太方便,可以 sudo apt-get install gftp。在图形界面下操作就简便多了。
07.redis常用命令复_
(Redis数据结构常用命令(Redis一共提供5种数据类型,String普通key-value Hash一个key对应一个hash集,LIST集合 set集合 zset有序集合。String数据类型 set添加一个值 set str1 12345 get str1 incr str1自增,decr减1,Hash命令hset添加一个key hset hash1 field1 abc hget hash1 field1,ttl str1查看key的有效期-1永久保存,ttl str2 -2key不存在,正数正在倒计时,expire str1 100设置过期时间为100秒,key *查看数据库有多少key)&Redis数据结构——哈希&Redis数据结构——链表(linked-list)&Redis数据结构——集合&Redis数据结构——有序集合&INCRBY、DECRBY:对整数值执行加法操作和减法操作& HSET:为字段设置值&)
08.Jedis的使用方法_
(使用Jedis客户端操作Redis(Java客户端通过Jedis,每次创建都有一个连接耗费资源,通过redis连接池JedisPool 节约资源,jedis.getResource()获取jedis来操作数据库)&)
09.redis的使用方法_
(单线程与多线程客户端(持久化RDB和AOF默认开启RDB快照(当前时刻数据)定期操作磁盘,AOF保存对数据库操作的命令频繁操作磁盘性能下降,数据完整性高一点,可以同时开启。Redis有可能丢数据,Mysql或者Oracle关系型数据库不会丢数据,Redis不适合保存大数据适合存储小数据(单线程的顺次处理单个命令尽快完成,通过集群横向扩容),基于Hadoop的Hbase还有MongoDB支持存储海量数据)&)
10.redis集群架构讲解_
(使用Redis集群实现数据水平化存储(Redis集群没有统一的入口,可以连接任何客户端进入集群,集群内部客户端可以相互通讯,检测检点的监控状态通过投票容错实现,redis集群有0-16383个slot为了均匀分布key到不同服务器,每个节点分配一定数量的槽,一般集群分布在3个节点上,每个集群主从同步槽挂了包装高可用,需要6台服务器(一台服务器运行在不同端口6个实例,搭建集群要把dump.rdb快照文件删除,修改redis.conf改变端口号,/cluster-enabled yes集群节点。通过批处理批量执行启动命令 vim start-all.sh cd redis01 ./redis-server redis.conf) cd.. 通过chmod +x start-all.sh增加可执行权限,TCC最大权限 ,./start-all.sh执行)&对文章进行投票&Redis集群容错&Redis集群中的主从复制&Redis主从复制模式&)
11.redis集群搭建01_
(Redis主从架构的缺点&Redis哨兵模式& Redis集群架构& Redis集群环境搭建&mongodump 和mongorestore&批处理和任务&权限设置&)
12.redis集群搭建02_
(RPM、SRPM与YUM&)
13.使用redis-cli连接集群_
14.使用JedisCluster连接集群_
(使用Jedis客户端操作Redis(Java通过JedisCluster连接到集群,自带连接池,构造参数是set类型集合每个元素是HostAndPort类型)&)
15.JedisClient连接单机版_
(使用Annotation注解法创建对象(注解既包括了开启注解也包括了扫描包)&组件扫描注解&)
16.jedisClient连接集群_
17.向业务逻辑中添加缓存_
18.添加缓存测试_
19.缓存同步处理_
(消息发送和同步接收&HDEL:删除字段&)
day06
01.课程计划_
02.solr服务搭建_
(catalina.sh脚本&Redis基础配置文件&Tomcat启动&复制、删除与移动:cp、rm、mv &配置web.xml文件&)
03.业务域的定义_
(中文分词安装&IK分词器安装&内部类——InnerClasses属性 &基于XML Schema的简化配置方式&使用th:field属性&语言区域&使用服务提供业务逻辑&)
04.业务数据sql语句编写_
05.搜索工程搭建_
(覆盖起步依赖引入的传递依赖&)
06.导入商品数据到索引库-dao_
07.solrj实现索引库维护_
(在Sping Boot中集成Solr,实现数据的增、删、改和查&)
08.导入商品数据-Service_
( constructor方法&)
09.导入商品数据-jsp_
10.商品数据导入成功_
11.首页跳转到搜索页面_
12.商品实现分析_
13.使用solrJ查询索引库_
(Solr——搜索应用服务器&)
14.搜索服务-dao实现_
day07
01.课程计划_
02.商品搜索功能-Service_
03.商品搜索功能-Controller_
04.搜索功能测试_
05.什么是SolrCloud_
06.solr集群架构讲解_
(并发&分片简介&)
07.zookeeper集群讲解_
08.zookeeper集群搭建_
(配置ZooKeeper集群&Data Server简介&修改文件时间或创建新文件:touch&变量的使用与设置:echo、变量设置规则、unset &vim的额外功能&)
09.solr集群的配置_
10.SolrCloud中管理Collection_
11.闲扯_
12.使用SolrJ管理SolrCloud_
13.搜索功能切换到集群_
14.全局异常处理器的应用_
day08
01.课程计划_
02.同步索引库功能分析_
03.什么是ActiveMQ_
04.activemq的安装_
(vim的额外功能&)
05.Activemq发送queue消息_
(Topic 和 Queue&)
06.接收queue消息_
07.发送topic消息_
08.接收topic消息_
09.spring整合Activemq_
(使用JmsTemplate 发送&)
10.使用JMSTemplate发送消息_
11.Activemq整合Spring接收消息_
12.添加商品同步索引库-发送消息_
13.添加商品同步索引库-mapper_
14.添加商品同步索引库-MessageListener_
15.添加商品同步索引库-测试_
16.小结_
day09
01.课程计划_
02.商品详情页面工程搭建_
03.商品详情页面展示分析_
04.商品详情页面展示-代码实现_
05.商品详情页面展示-测试_
06.商品详情页面添加缓存分析_
07.redis添加缓存的使用方法_
08.向业务逻辑中添加缓存_
09.添加缓存测试_
10.freemarker的使用方法_
11.freemarker语法-取pojo的属性_
12.freemarker语法-list_
13.freemarker语法-if_
14.freemarker语法-日期类型处理_
15freemarker语法-null值的处理_
16.freemarker语法-include_
17.freemarker整合Spring_
18.网页静态化方案分析_
19.网页静态化-freemarker模板改造_
20.网页静态化-业务逻辑_
21.网页静态化-测试_
day10
01.课程计划_
(构建HTTP服务器&)
02.什么是nginx_
03.nginx的应用场景_
04.nginx的安装及启动_
( v-pre&)
05.nginx的配置文件介绍_
06.通过端口区分虚拟主机_
(shift&使用fetchType属性设置局部加载策略&ngx_http_upstream_t结构体&)
07.什么是域名及hosts文件的作用_
08.通过域名区分虚拟主机_
09.使用nginx配置反向代理_
(proxy_pass请求代理规则&)
10.使用nginx实现负载均衡_
11.nginx小结_
12.keepalived+nginx实现高可用_
13.lvs实现高并发处理_
14.sso系统分析_
15.sso工程搭建_
16.sso系统接口分析_
day11_单点登录&js跨域
01.课程计划_
02.检查数据是否可用-接口分析_
03.检查数据是否可用-Service_
04.检查数据是否可用-Controller_
05.用户注册-Service_
06.用户注册-表现层_
07.用户登录流程分析_
08.用户登录-Service_
(使用Redis保存token令牌&全局唯一标识符UUID&)
09.用户登录表现层_
10.用户登录测试_
11.根据token查询用户信息-Service_
(使用Redis保存token令牌&)
12.根据token查询用户信息-表现层层_
13.安全退出-作业_
14.登录、注册页面展示_
15.用户注册页面实现_
16.用户登页面实现_
17.js跨域分析_
(跨域AJAX&)
- jsonp的原理_
(活用模板方法模式及Callback&callback调用&JSONP&media query语法&)
19.jsonp服务端处理_
20.jsonp处理第二种方法_
day12
01.课程计划_
02.购物车实现分析_
03.购物车工程搭建_
04.商品详情页面加入购物车改造_
05.添加购物车功能分析_
06.添加购物车实现_
07.添加购物车测试_
08.展示购物车列表_
09.修改购物车商品数量_
10.修改购物车商品数量测试_
11.删除购物车商品_
12.购物车小结_
13.订单系统工程搭建_
14.订单确认页面展示_
15.登录拦截器实现分析_
(HandlerInterceptor接口&Handler实例&)
16.拦截器业务逻辑实现_
17.拦截器测试及登录成功回调_
(Interceptor&)
18.拦截器测试取用户信息_
19.订单生成-数据库分析_
20.订单生成-页面分析_
day13
01.课程计划_
02.订单提交-分析回顾_
03.生成订单业务逻辑_
04.订单生成表现层_
05.订单生成-测试_
06.系统架构讲解_
07.系统部署规划_
(安装RPM包&)
08.tomcat热部署_
09.系统部署演示_
10.项目总结01_
11.项目总结02_
12.面试中的问题_
部分代码
taotao-content
pom.xml
4.0.0
com.taotao
taotao-parent
0.0.1-SNAPSHOT
com.taotao
taotao-content
0.0.1-SNAPSHOT
pom
taotao-content-interface
taotao-content-service
com.taotao
taotao-common
0.0.1-SNAPSHOT
org.apache.tomcat.maven
tomcat7-maven-plugin
/
8083
taotao-content-service
pom.xml
4.0.0
com.taotao
taotao-content
0.0.1-SNAPSHOT
taotao-content-service
war
com.taotao
taotao-manager-dao
0.0.1-SNAPSHOT
com.taotao
taotao-content-interface
0.0.1-SNAPSHOT
org.springframework
spring-context
org.springframework
spring-beans
org.springframework
spring-webmvc
org.springframework
spring-jdbc
org.springframework
spring-aspects
org.springframework
spring-jms
org.springframework
spring-context-support
com.alibaba
dubbo
spring
org.springframework
netty
org.jboss.netty
org.apache.zookeeper
zookeeper
com.github.sgroschupf
zkclient
redis.clients
jedis
web.xml
taotao-content
index.jsp
contextConfigLocation
classpath:spring/applicationContext-*.xml
org.springframework.web.context.ContextLoaderListener
applicationContext-trans.xml
applicationContext-service.xml
applicationContext-redis.xml
applicationContext-dao.xml
resource.properties
#redis\u4e2d\u7f13\u5b58\u9996\u9875\u5185\u5bb9\u7684key
INDEX_CONTENT=INDEX_CONTENT
db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/taotao?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
SqlMapConfig.xml
package com.taotao.jedis;
import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
public class JedisClientPool implements JedisClient {
@Autowired
private JedisPool jedisPool;
@Override
public String set(String key, String value) {
Jedis jedis = jedisPool.getResource();
String result = jedis.set(key, value);
jedis.close();
return result;
}
@Override
public String get(String key) {
Jedis jedis = jedisPool.getResource();
String result = jedis.get(key);
jedis.close();
return result;
}
@Override
public Boolean exists(String key) {
Jedis jedis = jedisPool.getResource();
Boolean result = jedis.exists(key);
jedis.close();
return result;
}
@Override
public Long expire(String key, int seconds) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.expire(key, seconds);
jedis.close();
return result;
}
@Override
public Long ttl(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.ttl(key);
jedis.close();
return result;
}
@Override
public Long incr(String key) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.incr(key);
jedis.close();
return result;
}
@Override
public Long hset(String key, String field, String value) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.hset(key, field, value);
jedis.close();
return result;
}
@Override
public String hget(String key, String field) {
Jedis jedis = jedisPool.getResource();
String result = jedis.hget(key, field);
jedis.close();
return result;
}
@Override
public Long hdel(String key, String... field) {
Jedis jedis = jedisPool.getResource();
Long result = jedis.hdel(key, field);
jedis.close();
return result;
}
}
package com.taotao.jedis;
import org.springframework.beans.factory.annotation.Autowired;
import redis.clients.jedis.JedisCluster;
public class JedisClientCluster implements JedisClient {
@Autowired
private JedisCluster jedisCluster;
@Override
public String set(String key, String value) {
return jedisCluster.set(key, value);
}
@Override
public String get(String key) {
return jedisCluster.get(key);
}
@Override
public Boolean exists(String key) {
return jedisCluster.exists(key);
}
@Override
public Long expire(String key, int seconds) {
return jedisCluster.expire(key, seconds);
}
@Override
public Long ttl(String key) {
return jedisCluster.ttl(key);
}
@Override
public Long incr(String key) {
return jedisCluster.incr(key);
}
@Override
public Long hset(String key, String field, String value) {
return jedisCluster.hset(key, field, value);
}
@Override
public String hget(String key, String field) {
return jedisCluster.hget(key, field);
}
@Override
public Long hdel(String key, String... field) {
return jedisCluster.hdel(key, field);
}
}
package com.taotao.jedis;
public interface JedisClient {
String set(String key, String value);
String get(String key);
Boolean exists(String key);
Long expire(String key, int seconds);
Long ttl(String key);
Long incr(String key);
Long hset(String key, String field, String value);
String hget(String key, String field);
Long hdel(String key, String... field);
}
package com.taotao.content.service.impl;
import java.util.Date;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import com.taotao.common.pojo.TaotaoResult;
import com.taotao.common.utils.JsonUtils;
import com.taotao.content.service.ContentService;
import com.taotao.jedis.JedisClient;
import com.taotao.mapper.TbContentMapper;
import com.taotao.pojo.TbContent;
import com.taotao.pojo.TbContentExample;
import com.taotao.pojo.TbContentExample.Criteria;
@Service
public class ContentServiceImpl implements ContentService {
@Autowired
private TbContentMapper contentMapper;
@Autowired
private JedisClient jedisClient;
@Value("${INDEX_CONTENT}")
private String INDEX_CONTENT;
@Override
public TaotaoResult addContent(TbContent content) {
//补全pojo的属性
content.setCreated( new Date());
content.setUpdated(new Date());
//插入到内容表
contentMapper.insert(content);
//同步缓存
//删除对应的缓存信息
jedisClient.hdel(INDEX_CONTENT, content.getCategoryId().toString());
return TaotaoResult.ok();
}
@Override
public List getContentByCid(long cid) {
//先查询缓存
//添加缓存不能影响正常业务逻辑
try {
//查询缓存
String json = jedisClient.hget(INDEX_CONTENT, cid + "");
//查询到结果,把json转换成List返回
if (StringUtils.isNotBlank(json)) {
List list = JsonUtils.jsonToList(json, TbContent.class);
return list;
}
} catch (Exception e) {
e.printStackTrace();
}
//缓存中没有命中,需要查询数据库
TbContentExample example = new TbContentExample();
Criteria criteria = example.createCriteria();
//设置查询条件
criteria.andCategoryIdEqualTo(cid);
//执行查询
List list = contentMapper.selectByExample(example);
//把结果添加到缓存
try {
jedisClient.hset(INDEX_CONTENT, cid + "", JsonUtils.objectToJson(list));
} catch (Exception e) {
e.printStackTrace();
}
//返回结果
return list;
}
}
package com.taotao.content.service.impl;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.taotao.common.pojo.EasyUITreeNode;
import com.taotao.common.pojo.TaotaoResult;
import com.taotao.content.service.ContentCategoryService;
import com.taotao.mapper.TbContentCategoryMapper;
import com.taotao.pojo.TbContentCategory;
import com.taotao.pojo.TbContentCategoryExample;
import com.taotao.pojo.TbContentCategoryExample.Criteria;
/**
* 内容分类管理service
* Title: ContentCategoryServiceImpl
* Description:
* Company: www.itcast.cn
* @version 1.0
*/
@Service
public class ContentCategoryServiceImpl implements ContentCategoryService {
@Autowired
private TbContentCategoryMapper contentCategoryMapper;
@Override
public List getContentCategoryList(long parentId) {
//根据parentId查询子节点列表
TbContentCategoryExample example = new TbContentCategoryExample();
//设置查询条件
Criteria criteria = example.createCriteria();
criteria.andParentIdEqualTo(parentId);
//执行查询
List list = contentCategoryMapper.selectByExample(example);
List resultList = new ArrayList();
for (TbContentCategory tbContentCategory : list) {
EasyUITreeNode node = new EasyUITreeNode();
node.setId(tbContentCategory.getId());
node.setText(tbContentCategory.getName());
node.setState(tbContentCategory.getIsParent()?"closed":"open");
//添加到结果列表
resultList.add(node);
}
return resultList;
}
@Override
public TaotaoResult addContentCategory(Long parentId, String name) {
//创建一个pojo对象
TbContentCategory contentCategory = new TbContentCategory();
//补全对象的属性
contentCategory.setParentId(parentId);
contentCategory.setName(name);
//状态。可选值:1(正常),2(删除)
contentCategory.setStatus(1);
//排序,默认为1
contentCategory.setSortOrder(1);
contentCategory.setIsParent(false);
contentCategory.setCreated(new Date());
contentCategory.setUpdated(new Date());
//插入到数据库
contentCategoryMapper.insert(contentCategory);
//判断父节点的状态
TbContentCategory parent = contentCategoryMapper.selectByPrimaryKey(parentId);
if (!parent.getIsParent()) {
//如果父节点为叶子节点应该改为父节点
parent.setIsParent(true);
//更新父节点
contentCategoryMapper.updateByPrimaryKey(parent);
}
//返回结果
return TaotaoResult.ok(contentCategory);
}
}
taotao-content-interface
pom.xml
4.0.0
com.taotao
taotao-content
0.0.1-SNAPSHOT
taotao-content-interface
com.taotao
taotao-manager-pojo
0.0.1-SNAPSHOT
package com.taotao.content.service;
import java.util.List;
import com.taotao.common.pojo.TaotaoResult;
import com.taotao.pojo.TbContent;
public interface ContentService {
TaotaoResult addContent(TbContent content);
List getContentByCid(long cid);
}
package com.taotao.content.service;
import java.util.List;
import com.taotao.common.pojo.EasyUITreeNode;
import com.taotao.common.pojo.TaotaoResult;
public interface ContentCategoryService {
List getContentCategoryList(long parentId);
TaotaoResult addContentCategory(Long parentId, String name);
}
taotao-common
pom.xml
4.0.0
com.taotao
taotao-parent
0.0.1-SNAPSHOT
com.taotao
taotao-common
0.0.1-SNAPSHOT
joda-time
joda-time
org.apache.commons
commons-lang3
org.apache.commons
commons-io
commons-net
commons-net
com.fasterxml.jackson.core
jackson-databind
org.apache.httpcomponents
httpclient
org.quartz-scheduler
quartz
junit
junit
test
org.slf4j
slf4j-log4j12
javax.servlet
servlet-api
provided
JsonUtils.java
package com.taotao.common.utils;
import java.util.List;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* 淘淘商城自定义响应结构
*/
public class JsonUtils {
// 定义jackson对象
private static final ObjectMapper MAPPER = new ObjectMapper();
/**
* 将对象转换成json字符串。
* Title: pojoToJson
* Description:
* @param data
* @return
*/
public static String objectToJson(Object data) {
try {
String string = MAPPER.writeValueAsString(data);
return string;
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return null;
}
/**
* 将json结果集转化为对象
*
* @param jsonData json数据
* @param clazz 对象中的object类型
* @return
*/
public static T jsonToPojo(String jsonData, Class beanType) {
try {
T t = MAPPER.readValue(jsonData, beanType);
return t;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 将json数据转换成pojo对象list
* Title: jsonToList
* Description:
* @param jsonData
* @param beanType
* @return
*/
public static List jsonToList(String jsonData, Class beanType) {
JavaType javaType = MAPPER.getTypeFactory().constructParametricType(List.class, beanType);
try {
List list = MAPPER.readValue(jsonData, javaType);
return list;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}
IDUtils.java
package com.taotao.common.utils;
import java.util.Random;
/**
* 各种id生成策略
* Title: IDUtils
* Description:
* Company: www.itcast.com
* @author 入云龙
* @date 2015年7月22日下午2:32:10
* @version 1.0
*/
public class IDUtils {
/**
* 图片名生成
*/
public static String genImageName() {
//取当前时间的长整形值包含毫秒
long millis = System.currentTimeMillis();
//long millis = System.nanoTime();
//加上三位随机数
Random random = new Random();
int end3 = random.nextInt(999);
//如果不足三位前面补0
String str = millis + String.format("%03d", end3);
return str;
}
/**
* 商品id生成
*/
public static long genItemId() {
//取当前时间的长整形值包含毫秒
long millis = System.currentTimeMillis();
//long millis = System.nanoTime();
//加上两位随机数
Random random = new Random();
int end2 = random.nextInt(99);
//如果不足两位前面补0
String str = millis + String.format("%02d", end2);
long id = new Long(str);
return id;
}
public static void main(String[] args) {
for(int i=0;i< 100;i++)
System.out.println(genItemId());
}
}
package com.taotao.common.utils;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
*
* Cookie 工具类
*
*/
public final class CookieUtils {
/**
* 得到Cookie的值, 不编码
*
* @param request
* @param cookieName
* @return
*/
public static String getCookieValue(HttpServletRequest request, String cookieName) {
return getCookieValue(request, cookieName, false);
}
/**
* 得到Cookie的值,
*
* @param request
* @param cookieName
* @return
*/
public static String getCookieValue(HttpServletRequest request, String cookieName, boolean isDecoder) {
Cookie[] cookieList = request.getCookies();
if (cookieList == null || cookieName == null) {
return null;
}
String retValue = null;
try {
for (int i = 0; i < cookieList.length; i++) {
if (cookieList[i].getName().equals(cookieName)) {
if (isDecoder) {
retValue = URLDecoder.decode(cookieList[i].getValue(), "UTF-8");
} else {
retValue = cookieList[i].getValue();
}
break;
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return retValue;
}
/**
* 得到Cookie的值,
*
* @param request
* @param cookieName
* @return
*/
public static String getCookieValue(HttpServletRequest request, String cookieName, String encodeString) {
Cookie[] cookieList = request.getCookies();
if (cookieList == null || cookieName == null) {
return null;
}
String retValue = null;
try {
for (int i = 0; i < cookieList.length; i++) {
if (cookieList[i].getName().equals(cookieName)) {
retValue = URLDecoder.decode(cookieList[i].getValue(), encodeString);
break;
}
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return retValue;
}
/**
* 设置Cookie的值 不设置生效时间默认浏览器关闭即失效,也不编码
*/
public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
String cookieValue) {
setCookie(request, response, cookieName, cookieValue, -1);
}
/**
* 设置Cookie的值 在指定时间内生效,但不编码
*/
public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
String cookieValue, int cookieMaxage) {
setCookie(request, response, cookieName, cookieValue, cookieMaxage, false);
}
/**
* 设置Cookie的值 不设置生效时间,但编码
*/
public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
String cookieValue, boolean isEncode) {
setCookie(request, response, cookieName, cookieValue, -1, isEncode);
}
/**
* 设置Cookie的值 在指定时间内生效, 编码参数
*/
public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
String cookieValue, int cookieMaxage, boolean isEncode) {
doSetCookie(request, response, cookieName, cookieValue, cookieMaxage, isEncode);
}
/**
* 设置Cookie的值 在指定时间内生效, 编码参数(指定编码)
*/
public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName,
String cookieValue, int cookieMaxage, String encodeString) {
doSetCookie(request, response, cookieName, cookieValue, cookieMaxage, encodeString);
}
/**
* 删除Cookie带cookie域名
*/
public static void deleteCookie(HttpServletRequest request, HttpServletResponse response,
String cookieName) {
doSetCookie(request, response, cookieName, "", -1, false);
}
/**
* 设置Cookie的值,并使其在指定时间内生效
*
* @param cookieMaxage cookie生效的最大秒数
*/
private static final void doSetCookie(HttpServletRequest request, HttpServletResponse response,
String cookieName, String cookieValue, int cookieMaxage, boolean isEncode) {
try {
if (cookieValue == null) {
cookieValue = "";
} else if (isEncode) {
cookieValue = URLEncoder.encode(cookieValue, "utf-8");
}
Cookie cookie = new Cookie(cookieName, cookieValue);
if (cookieMaxage > 0)
cookie.setMaxAge(cookieMaxage);
if (null != request) {// 设置域名的cookie
String domainName = getDomainName(request);
System.out.println(domainName);
if (!"localhost".equals(domainName)) {
cookie.setDomain(domainName);
}
}
cookie.setPath("/");
response.addCookie(cookie);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 设置Cookie的值,并使其在指定时间内生效
*
* @param cookieMaxage cookie生效的最大秒数
*/
private static final void doSetCookie(HttpServletRequest request, HttpServletResponse response,
String cookieName, String cookieValue, int cookieMaxage, String encodeString) {
try {
if (cookieValue == null) {
cookieValue = "";
} else {
cookieValue = URLEncoder.encode(cookieValue, encodeString);
}
Cookie cookie = new Cookie(cookieName, cookieValue);
if (cookieMaxage > 0)
cookie.setMaxAge(cookieMaxage);
if (null != request) {// 设置域名的cookie
String domainName = getDomainName(request);
System.out.println(domainName);
if (!"localhost".equals(domainName)) {
cookie.setDomain(domainName);
}
}
cookie.setPath("/");
response.addCookie(cookie);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 得到cookie的域名
*/
private static final String getDomainName(HttpServletRequest request) {
String domainName = null;
String serverName = request.getRequestURL().toString();
if (serverName == null || serverName.equals("")) {
domainName = "";
} else {
serverName = serverName.toLowerCase();
serverName = serverName.substring(7);
final int end = serverName.indexOf("/");
serverName = serverName.substring(0, end);
final String[] domains = serverName.split("\\.");
int len = domains.length;
if (len > 3) {
// www.xxx.com.cn
domainName = "." + domains[len - 3] + "." + domains[len - 2] + "." + domains[len - 1];
} else if (len 1) {
// xxx.com or xxx.cn
domainName = "." + domains[len - 2] + "." + domains[len - 1];
} else {
domainName = serverName;
}
}
if (domainName != null && domainName.indexOf(":") > 0) {
String[] ary = domainName.split("\\:");
domainName = ary[0];
}
return domainName;
}
}
package com.taotao.common.pojo;
import java.io.Serializable;
import java.util.List;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* 淘淘商城自定义响应结构
*/
public class TaotaoResult implements Serializable{
// 定义jackson对象
private static final ObjectMapper MAPPER = new ObjectMapper();
// 响应业务状态
private Integer status;
// 响应消息
private String msg;
// 响应中的数据
private Object data;
public static TaotaoResult build(Integer status, String msg, Object data) {
return new TaotaoResult(status, msg, data);
}
public static TaotaoResult ok(Object data) {
return new TaotaoResult(data);
}
public static TaotaoResult ok() {
return new TaotaoResult(null);
}
public TaotaoResult() {
}
public static TaotaoResult build(Integer status, String msg) {
return new TaotaoResult(status, msg, null);
}
public TaotaoResult(Integer status, String msg, Object data) {
this.status = status;
this.msg = msg;
this.data = data;
}
public TaotaoResult(Object data) {
this.status = 200;
this.msg = "OK";
this.data = data;
}
// public Boolean isOK() {
// return this.status == 200;
// }
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
/**
* 将json结果集转化为TaotaoResult对象
*
* @param jsonData json数据
* @param clazz TaotaoResult中的object类型
* @return
*/
public static TaotaoResult formatToPojo(String jsonData, Class clazz) {
try {
if (clazz == null) {
return MAPPER.readValue(jsonData, TaotaoResult.class);
}
JsonNode jsonNode = MAPPER.readTree(jsonData);
JsonNode data = jsonNode.get("data");
Object obj = null;
if (clazz != null) {
if (data.isObject()) {
obj = MAPPER.readValue(data.traverse(), clazz);
} else if (data.isTextual()) {
obj = MAPPER.readValue(data.asText(), clazz);
}
}
return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);
} catch (Exception e) {
return null;
}
}
/**
* 没有object对象的转化
*
* @param json
* @return
*/
public static TaotaoResult format(String json) {
try {
return MAPPER.readValue(json, TaotaoResult.class);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* Object是集合转化
*
* @param jsonData json数据
* @param clazz 集合中的类型
* @return
*/
public static TaotaoResult formatToList(String jsonData, Class clazz) {
try {
JsonNode jsonNode = MAPPER.readTree(jsonData);
JsonNode data = jsonNode.get("data");
Object obj = null;
if (data.isArray() && data.size() > 0) {
obj = MAPPER.readValue(data.traverse(),
MAPPER.getTypeFactory().constructCollectionType(List.class, clazz));
}
return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj);
} catch (Exception e) {
return null;
}
}
}
package com.taotao.common.pojo;
import java.io.Serializable;
import java.util.List;
public class SearchResult implements Serializable{
private long totalPages;
private long recordCount;
private List itemList;
public long getTotalPages() {
return totalPages;
}
public void setTotalPages(long totalPages) {
this.totalPages = totalPages;
}
public long getRecordCount() {
return recordCount;
}
public void setRecordCount(long recordCount) {
this.recordCount = recordCount;
}
public List getItemList() {
return itemList;
}
public void setItemList(List itemList) {
this.itemList = itemList;
}
}
package com.taotao.common.pojo;
import java.io.Serializable;
public class SearchItem implements Serializable {
private String id;
private String title;
private String sell_point;
private long price;
private String image;
private String category_name;
private String item_desc;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getSell_point() {
return sell_point;
}
public void setSell_point(String sell_point) {
this.sell_point = sell_point;
}
public long getPrice() {
return price;
}
public void setPrice(long price) {
this.price = price;
}
public String getImage() {
return image;
}
public void setImage(String image) {
this.image = image;
}
public String getCategory_name() {
return category_name;
}
public void setCategory_name(String category_name) {
this.category_name = category_name;
}
public String getItem_desc() {
return item_desc;
}
public void setItem_desc(String item_desc) {
this.item_desc = item_desc;
}
}
package com.taotao.common.pojo;
import java.io.Serializable;
public class EasyUITreeNode implements Serializable{
private long id;
private String text;
private String state;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
}
package com.taotao.common.pojo;
import java.io.Serializable;
import java.util.List;
public class EasyUIDataGridResult implements Serializable{
private long total;
private List rows;
public long getTotal() {
return total;
}
public void setTotal(long total) {
this.total = total;
}
public List getRows() {
return rows;
}
public void setRows(List rows) {
this.rows = rows;
}
}
taotao-cart-web
pom.xml
4.0.0
com.taotao
taotao-parent
0.0.1-SNAPSHOT
com.taotao
taotao-cart-web
0.0.1-SNAPSHOT
war
com.taotao
taotao-common
0.0.1-SNAPSHOT
com.taotao
taotao-manager-interface
0.0.1-SNAPSHOT
org.springframework
spring-context
org.springframework
spring-beans
org.springframework
spring-webmvc
org.springframework
spring-jdbc
org.springframework
spring-aspects
org.springframework
spring-jms
org.springframework
spring-context-support
jstl
jstl
javax.servlet
servlet-api
provided
javax.servlet
jsp-api
provided
com.alibaba
dubbo
spring
org.springframework
netty
org.jboss.netty
org.apache.zookeeper
zookeeper
com.github.sgroschupf
zkclient
junit
junit
org.apache.tomcat.maven
tomcat7-maven-plugin
/
8089
web.xml
taotao-cart-web
index.html
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
CharacterEncodingFilter
/*
taotao-cart-web
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring/springmvc*.xml
1
taotao-cart-web
*.html
taotao-cart-web
*.action
cartSuccess.jsp
商品已成功加入购物车
/* Copyright 2014 Evernote Corporation. All rights reserved. */
.en-markup-crop-options {
top: 18px !important;
left: 50% !important;
margin-left: -100px !important;
width: 200px !important;
border: 2px rgba(255, 255, 255, .38) solid !important;
border-radius: 4px !important;
}
.en-markup-crop-options div div:first-of-type {
margin-left: 0px !important;
}
商品已成功加入购物车!
商品数量有限,请您尽快下单并付款!
去购物车结算 您还可以 继续购物
cart.jsp
我的购物车 - 淘淘商城
var pageConfig = {};
- 1.我的购物车
- 2.填写核对订单信息
- 3.成功提交订单
我的购物车
全选
商品
淘淘价
优惠
库存
数量
操作
${cart.title}
¥
有货
-
+
删除
¥总计:
- ¥0.00优惠:
1 件商品
全选
删除选中的商品
继续购物
去结算
不支持合并付款
去淘淘国际结算
去淘淘结算
总计(不含运费):
¥
exception.jsp
出错了 -淘淘商城
#refresh {
text-align: left;
margin: 30px auto;
width: 750px;
height: 220px;
background:
url(/images/errordog.jpg)
0 0;
position: relative
}
#refresh .txt {
position: absolute;
left: 236px;
top: 16px;
color: #fff;
font-size: 14px;
font-family: "microsoft yahei"
}
#refresh .m {
position: absolute;
left: 336px;
top: 80px;
line-height: 18px;
font-size: 14px
}
#refresh .m li {
padding-bottom: 8px
}
#refresh .m a {
color: #005eab
}
#refresh .m .fore1, #refresh .m .fore2 {
font-family: "microsoft yahei"
}
#refresh .m .fore1 a {
color: #e4393c
}
#refresh .m .fore2 a {
color: #e4393c;
font-weight: bold;
font-size: 18px;
padding: 0 3px
}
#refresh .m .fore3 {
font-weight: bold;
font-size: 12px
}
#refresh .m .fore4 a {
margin-right: 15px;
font-size: 12px
}
糟了...系统出错了...
- 您可以:稍后再试或联系客服400-8888-9999。
- 返回淘淘首页
- 错误消息
- ${message }
shortcut.jsp
- 收藏淘淘
- 您好!欢迎来到淘淘![登录] [免费注册]
-
我的订单
-
会员俱乐部
-
手机淘淘
-
客户服务
帮助中心
售后服务
在线客服
投诉中心
客服邮箱
-
网站导航
特色栏目
淘淘通信
校园之星
为我推荐
视频购物
淘淘社区
在线读书
装机大师
淘淘E卡
家装城
搭配购
我喜欢
企业服务
企业客户
办公直通车
旗下网站
English Site
springmvc.xml
resource.properties
#\u8d2d\u7269\u8f66\u5728cookie\u4e2d\u4fdd\u5b58\u7684key
CART_KEY=TT_CART
#\u8d2d\u7269\u8f66\u5546\u54c1\u7684\u6709\u6548\u671f\uff0c\u9ed8\u8ba4\u4e3a7\u5929
CART_EXPIER=604800
package com.taotao.cart.controller;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.taotao.common.pojo.TaotaoResult;
import com.taotao.common.utils.CookieUtils;
import com.taotao.common.utils.JsonUtils;
import com.taotao.pojo.TbItem;
import com.taotao.service.ItemService;
/**
* 购物车管理Controller
* Title: CartController
* Description:
* Company: www.itcast.cn
* @version 1.0
*/
@Controller
public class CartController {
@Value("${CART_KEY}")
private String CART_KEY;
@Value("${CART_EXPIER}")
private Integer CART_EXPIER;
@Autowired
private ItemService itemService;
@RequestMapping("/cart/add/{itemId}")
public String addItemCart(@PathVariable Long itemId,
@RequestParam(defaultValue="1")Integer num, HttpServletRequest request,
HttpServletResponse response) {
//取购物车商品列表
List cartItemList = getCartItemList(request);
//判断商品在购物车中是否存在
boolean flag = false;
for (TbItem tbItem : cartItemList) {
if (tbItem.getId() == itemId.longValue()) {
//如果存在数量相加
tbItem.setNum(tbItem.getNum() + num);
flag = true;
break;
}
}
//如果不存在,添加一个新的商品
if (!flag) {
//需要调用服务取商品信息
TbItem tbItem = itemService.getItemById(itemId);
//设置购买的商品数量
tbItem.setNum(num);
//取一张图片
String image = tbItem.getImage();
if (StringUtils.isNotBlank(image)) {
String[] images = image.split(",");
tbItem.setImage(images[0]);
}
//把商品添加到购物车
cartItemList.add(tbItem);
}
//把购物车列表写入cookie
CookieUtils.setCookie(request, response, CART_KEY, JsonUtils.objectToJson(cartItemList),
CART_EXPIER, true);
//返回添加成功页面
return "cartSuccess";
}
private List getCartItemList(HttpServletRequest request) {
//从cookie中取购物车商品列表
String json = CookieUtils.getCookieValue(request, CART_KEY, true);
if (StringUtils.isBlank(json)) {
//如果没有内容,返回一个空的列表
return new ArrayList();
}
List list = JsonUtils.jsonToList(json, TbItem.class);
return list;
}
@RequestMapping("/cart/cart")
public String showCartList(HttpServletRequest request) {
//从cookie中取购物车列表
List cartItemList = getCartItemList(request);
//把购物车列表传递给jsp
request.setAttribute("cartList", cartItemList);
//返回逻辑视图
return "cart";
}
@RequestMapping("/cart/update/num/{itemId}/{num}")
@ResponseBody
public TaotaoResult updateItemNum(@PathVariable Long itemId, @PathVariable Integer num,
HttpServletRequest request, HttpServletResponse response) {
//从cookie中取购物车列表
List cartList = getCartItemList(request);
//查询到对应的商品
for (TbItem tbItem : cartList) {
if (tbItem.getId() == itemId.longValue()) {
//更新商品数量
tbItem.setNum(num);
break;
}
}
//把购车列表写入 cookie
CookieUtils.setCookie(request, response, CART_KEY, JsonUtils.objectToJson(cartList),
CART_EXPIER, true);
//返回成功
return TaotaoResult.ok();
}
@RequestMapping("/cart/delete/{itemId}")
public String deleteCartItem(@PathVariable Long itemId, HttpServletRequest request ,
HttpServletResponse response) {
//从cookie中取购物车列表
List cartItemList = getCartItemList(request);
//找到对应的商品
for (TbItem tbItem : cartItemList) {
if (tbItem.getId() == itemId.longValue()) {
//删除商品
cartItemList.remove(tbItem);
break;
}
}
//把购车列表写入cookie
CookieUtils.setCookie(request, response, CART_KEY, JsonUtils.objectToJson(cartItemList),
CART_EXPIER, true);
//重定向到购物车列表页面
return "redirect:/cart/cart.html";
}
}