SSM校园商铺总结

处理图片问题:

如何处理图片路径?

思路:我们从前台接受传入的图片,要存入特定的路径。

我们设计路径的代码思路如下。

我们不同店铺的图片要存在不同的文件中,我们写了一个专门处理图片路径的类

因为一个项目中会有很多种图片,如头条图片、商品图片等,这两种图片不应该放在一个文件夹下,但是他们却在同一个项目的存储图片的文件下下,因为路径这个类分为了两个部分:

第一部分:处理图片的根路径(项目的所有种类图片都放在这里):

这一部分要注意一件事:就是操作系统的问题,因为win和linux操作系统的路径不同,因此设置一个if语句先确定是那种操作系统,然后设置不同的根路径

第二部分:图片的子路径

这部分用于创建各种不同类型的照片的路径

如商铺的照片就要在相对路径下加入商铺id区分商铺信息

如头条的照片也要在这里区分

如何处理接受到的图片:

处理图片有这么个问题需要处理:

传入的图片可能会有重名图片,如果不修改,那么会引起数据库读取错误

问题解决方法:

    我们接受前端传来的图片,读取它的文件,我们通过一个获取当前的日期将其格式改为纯数字加上一个一万内的随机数作为图片新的名字。

处理图片整体思路:

看完web层补下来

DAO层:

主要是mapper层的操作:、

首先是

动态语句:

<foreach>用于处理接受列表

<if test="">用来限定条件

<where>可以将if里的第一个and去掉

再说下我的判定条件:

显示一级类别下所有二级类别,因为一级类别的parentId这一字段不为空,因此可以这样查

当查询条件不为空&查询条件的parentId不为空&查询条件的父类的商铺类别id(主键)不为空(有效)那么查出来的就是相应的条件。

DTO层:

添加这一层的类都是XxxExecuption

它用于将service操作完后的信息存入这个类中,这些信息包括操作完并赋值的实体类和操作状态,因为本身的实体类可能并不需要这些内容,我们用这个类将这些操作状态封装起来了,service操作完后会返回这个类给前端控制器,Controller可以通过这个类的信息判断service层的操作状态和获取servic操作完的实体类。完成了service和controller的衔接。

DTO这一层还有一个要说的点,就是这个类里包括了service层的操作状态,因为service的操作状态不同,因此我们需要设置多个操作状态,操作状态包括,成功、失败、内部异常等等状态,因此我们定义一个枚举来设置用户状态,如果两个dto类对应不同的操作状态,那么我们需要写两个操作状态枚举,这个枚举类应该包括操作状态码和操作状态描述

再说枚举类:这个枚举类一般有多个构造方法,用于处理不同情况 ,如果操作出错我们的构造函数只用接受错误状态码和错误描述即可,操作成功的构造函数接受状态信息和实体类,如果查询的是列表,我们可以传入实体类列表和状态信息。应对不同情况

WEB层:

首先需要给类上面加入一个

@Controller注解

这样证明了这个类是一个controller,无需实现任何接口

然后

加上根路由,就是这个类的父路由

@RequestMapping("/shopadmin")//根url

加上这个RequestMapping就能完成url请求和controller之间的映射关系

JSON:

我们采用JSON处理前后端数据交互问题所以

1.再方法上加上json要用的注解: @ResponseBody

作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据,

我们使用了一个Map数据结构用来完成保存所有的处理信息并交给前端,因为前面使用了ResponseBody的注解,因此返回这个传给前端是以json的格式,我们的Map结构的key存储标识符,前端根据这个标识符来获取相应的标识读取其中的value,value则存储key对应的具体描述,如交给前端的对象、错误的具体信息等等。

如何处理前端传来的数据:

前端传来的数据,如新建的商铺的实体类信息我们也是通过json格式接受,我们将其也要转为相应的实体类

我们通过jackson包里的方法,先定义一个ObjectMapper对象用这个对象可以进行json格式转换,比如注册店铺页面,我们前端通过json格式传入一个字符串类型,我们将其要转为一个shop类型,使用ObjectMapper的readValue(”json转为的字符串“,要转成的类+.class)方法.

当我们要将获得一个列表类型,并有泛型的时候,我们没办法设置这样的class类型,因此我们需要用jackson的类型工厂创建出这样的类型,这个类型工厂里的方法可以用来创建这种泛型集合类,最后返回一个类型,注意在readValue中,这个类型不需要加上.class后缀。

将前端传来的值:因为我们有时从前端只获取一个数据如shopId,因此我们需要使用request.getParameter()方法,但是这个方法获取得是String类型,因此我们需要写一个工具类来修改获取的String类型转为对应的类型,我们的参数获取一个接受的request和parameter需要的lkey,得到其字符串类型并转为相应的数据类型

处理上传的图片

这里上传图片要解决的问题有很多,路径是一方面,使用springmvc自带的multipart处理上传文件,还有是这方面代码的重构问题

路径:前面已经说过的

multipart处理上传文件:因为用springmvc自带的multipart处理性能优越因此我们使用这个框架,注意要在spring-web层配置bean,就是文件解析器,还有个问题就是multipart的的文件形式不能和file相互转换,因此改为传入文件流处理,最后通过thumbnail的方法将其转为文件

代码重构问题:

我进行过一次代码重构,原因是这样的,本来在controller加图片的方法,只用将实体类和图片流和版名称传入即可在service层去处理相应的图片,并将重命名的图片地址赋值给数据库中商铺表这一字段,但是后来我们操作商品时还需要将商品的详情类表完全存入数据库,因此我们不仅要传入商品的缩率图的名称和流还需要传入商品详情图的缩率图和流。因此参数变为了5个,我们需要进行重构,将参数变少

我们对这些进行了封装,建立了一个包装图片的类,类中有属性image的名字和image的输入流,如果是详情的话,用一个泛型为ImageHolder的列表进行封装,然后这样我们通过ImageHolder传入service层,减少了参数

如何接受文件列表:文件列表的接受很简单,我们在前端给列表中的图片的名称规定从一开始按1递增,通过for循环,这里的最大值我们一开始设定好,也就是文件的最大上传个数,每次取得时候在productImg后面+i,便可

使用kaptcha实现验证码上传功能:

使用这个验证码功能首先在web.xml中设置一个kaptcha的servlet,设置一个url,当访问这个url时使用这个servlet处理,这里我们还设置了springmvc的前端控制器的servlet,这个前端控制默认拦截所有请求。

后端实现流程:对于任何有验证码的页面,我们后台处理都需要先验证验证码是否正确, 因此我们把验证码这个功能写在最前面,这个方法实现如下:接受requset,从session中获得这个框架中有一个方法可以直接获得前端当前显示的验证码(从session中获取通过getAttribute()方法,因为getAttribute时web组件中获取),我们从这个获取正确的验证码,然后再从requset中获取前端输入的验证码(通过request的getParameter方法,因为时从前端获取的),进行两者比较, 返回正确与否的值。

这里曾经遇到个问题,就是再spring-web中配置相应的文件解析器,如果有文件不配置这个,那么将会读取不到前端传来的数据。

商铺列表分页问题

在dao层:分页是这样的:我们接受的是limit start,size (start从0开始),在mapper文件中只能指定相应的从某行到某行,

从前端却只能传来页数和页数大小,因此我们需要一个页数转为记录条数的记录。

 我们在Util类中写入一个方法,参数接受页数行页数大小,通过将页数减1乘上页数大小,就是我们要索引的这一页的所有记录。

删除商品问题,我们在sql建表时,我们定义了商品类别id为商品的外键,因此当我们删除商品类别时,先将这商品类别下的商品

的商品类别id这一字段全部置为空,才能删除商品类别

配置前端读取图片问题:

设置图片:我的数据库中存储的并不是全部路径,而是部分路径,因此在传给前端路径时并不完全,因此我们在tomcat的server.xml文件中配置,解决方案:

在idea不想es直接更改,打开tomca文件夹找到server.xml文件在最后设置一个<Context path=”“ docBase=”“>,意思相当于当我们遇到第一个参数的路径时转第二个路径就是当遇到/A就转为/A/B/C/这种

redis问题:

我在我们的项目中加入了redis这一缓存技术,因为项目有一些经常不用更改的数据,由于redis快的特点我们把这些存入redis,当redis没有我们取mysql中取,然后存入mysql,有的话直接取。这一功能在service层实现,

第一步:导入jedis包

第二步:加入jedis的配置文件,这里面会有一些配置jedis连接池等的配置

使用就行了,这里注意,我们给redis存的时候,它的key应该是分情况的,比如有的头条能用,有的头条不能用,分开时给key后面加上他们的状态码就行。

删除时,接受一个参数,就是区域名等的前缀因为后面可能还要分出不同的去域名,在删除方法里。通过通配符匹配名称的方法进行全部删除。

猜你喜欢

转载自blog.csdn.net/Sunmeok/article/details/82182571