用户模块-登录接口完整code

Paste_Image.png
Paste_Image.png
Paste_Image.png

一、接口

-新建UserController
-在类上面,添加spring注解,@Controller,起到Controller作用
-在类上面,添加@RequestMapping("/user/"),把请求地址放到/user命名空间下
-构造类里登录函数login,参数username,password,session
-注释:用户登录
-添加@RequestMapping(value="Login.do",method=RequestMapping.POST),value和接口名保持一致,设置方法post
-添加RequestBody,在返回值的时候,自动通过springmvc的josn 插件将返回值序列化成josn ,通过插件的配置文件dispatche-servlet.xml看到bean(如图),点击bean所指向的类,打开没有看到supportMedicaTypes这个属性,打开其所继承的父类,发现supportMedicaTypes属性,且是个集合,因此在dispatche-servlet.xml中直接把要配置的application/josn注入到集合value里面,这样,MVC返回值通过responseBody注解自动序列化成 josn 。

Paste_Image.png

-写service,调用mybatis的dao层

二、service层

-创建接口IUserService,便于维护,为AOP做准备,无论是静态代理或者是动态代理,还是后续发展成的AOP都用接口代理,也可以用czlib来代理class,但是这种方式没有接口扩展性强
-声明login接口

Paste_Image.png

-创建实现类UserServiceImpl,注入实现方法

Paste_Image.png

三、通用数据端响应对象【ServiceResponse、ResponseCode】

-common下创建类ServiceResponse

-用范型声明该类,传范型T,代表响应里面要封装的数据对象是什么类型,让它实现序列化接口Serializable
-声明三个属性:int status,String msg,T data,data代表我们将返回的范型使用对象,为了做成通用的,采用T 做一个范型,好处:返回时可以指定范型内容,也可以不指定类型

Paste_Image.png

-构造方法,写成私有的,即外部不能new;几个私有的构造器,调用比较方便,规避String msg和String data的冲突(data的值可能会传进msg里)

Paste_Image.png

-封装一个方法isSuccess,来确认这个响应是不是成功的响应,如果status是0则success,1则fail

Paste_Image.png

-用一个枚举来对数字归类

-在common创建enum枚举类ResponseCode

0-成功,1-出错,10-需要登录,2-不合法参数

Paste_Image.png

-声明两个属性code,desc,写出构造器


Paste_Image.png

-响应编码枚举类完成,扩展只需要继续编辑即可

-回到ServiceResponse

更改isSuccess方法,如果SUCCESS.getcode返回为0,即返回true
(其实isSuccess方法不是一直都是0值吗?)

Paste_Image.png

-创建三个公有构造器

Paste_Image.png

-创建成功状态下的公有构造器,调用私有构造器,1.仅status,2、status+msg 3、status+data 4、status+msg+data;此时解决了上面提到的“传String data的冲突(data的值可能会传进msg里)”,因为public构造器里面传参使用 T类型,调用私有构造器时仅传入T类型的data里


Paste_Image.png

--创建失败状态下和其他错误状态的公有构造器(但是这个errorCode是??)

Paste_Image.png

--加工。三个属性int status,String msg,T data是序列化返回给前端,但是isSuccess是public,会显示在前端的josn里,所以要加一个@JosnIgnore注解,则该字段序列化之后不会显示在josn里面

Paste_Image.png

--public 的get方法都会显示在josn里面

--注意:失败有时候不返回data,此时是有data-key的空节点,data-value是null,这种是不需要返回给前端的,控制方法:在类前面增加注解@JosnSerialize(include = JosnSerialize.Inclusion.NOT_NULL)
该注解作用,仅返回非空值,比如只需要返回status,那么msg和data为空就不会返回给前端
【保证序列化json的时候,null的对象,key也会消失】

Paste_Image.png

四、继续编写service层和dao层mapper逻辑

-先把IUserService和UserServiceImpl中login的方法返回类型都改成ServiceResponse<T>类型

Paste_Image.png

-把mapper通过注解方式引进来

Paste_Image.png

-编写UserMapper接口,增加checkUser方法

Paste_Image.png

-编写UserMapperImpl,用#防止sql注入,会进行预编译

-回到service,使用范型做的高可用的服务端相应类进行报错

Paste_Image.png

-MD5不可逆转加密方法,先// to do MD5

-继续判断用户密码,编写mapper,返回值User,因为一旦登录成功,返回值是User
注意:Mybatis传多个参数需要用到@Param注解,写sql是要对应@Param注解里面的String

-resultmap引用mapper顶部有自定义的,resulttype引用java本来有的类型(parametetype也是),parametetype为map(全称为:java.util.Map)型,因为会接收多个参数
注意:sql语句最好不要写成select *,因为实际开发过程中,表是会发生变化的,如果始终只是要两个字段,那么select *就不利于维护,要什么查什么
用<include refid>可以方便要查询的数据

Paste_Image.png

-回到service层,处理密码错误情况和能成功登录的情况,setPassword是为了将返回值密码置为空

Paste_Image.png

五、把service注入到controller上

-先声明,@service("iUserService")

Paste_Image.png

-把service注解到controller

-声明一个常量类,Const,当前用户

Paste_Image.png

-在login方法里声明一个response,如果isSuccess为0,成功响应。
然后调用常量类的属性,设置session属性,两个参数

Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容