一、接口
-新建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 。
-写service,调用mybatis的dao层
二、service层
-创建接口IUserService,便于维护,为AOP做准备,无论是静态代理或者是动态代理,还是后续发展成的AOP都用接口代理,也可以用czlib来代理class,但是这种方式没有接口扩展性强
-声明login接口
-创建实现类UserServiceImpl,注入实现方法
三、通用数据端响应对象【ServiceResponse、ResponseCode】
-common下创建类ServiceResponse
-用范型声明该类,传范型T,代表响应里面要封装的数据对象是什么类型,让它实现序列化接口Serializable
-声明三个属性:int status,String msg,T data,data代表我们将返回的范型使用对象,为了做成通用的,采用T 做一个范型,好处:返回时可以指定范型内容,也可以不指定类型
-构造方法,写成私有的,即外部不能new;几个私有的构造器,调用比较方便,规避String msg和String data的冲突(data的值可能会传进msg里)
-封装一个方法isSuccess,来确认这个响应是不是成功的响应,如果status是0则success,1则fail
-用一个枚举来对数字归类
-在common创建enum枚举类ResponseCode
0-成功,1-出错,10-需要登录,2-不合法参数
-声明两个属性code,desc,写出构造器
-响应编码枚举类完成,扩展只需要继续编辑即可
-回到ServiceResponse
更改isSuccess方法,如果SUCCESS.getcode返回为0,即返回true
(其实isSuccess方法不是一直都是0值吗?)
-创建三个公有构造器
-创建成功状态下的公有构造器,调用私有构造器,1.仅status,2、status+msg 3、status+data 4、status+msg+data;此时解决了上面提到的“传String data的冲突(data的值可能会传进msg里)”,因为public构造器里面传参使用 T类型,调用私有构造器时仅传入T类型的data里
--创建失败状态下和其他错误状态的公有构造器(但是这个errorCode是??)
--加工。三个属性int status,String msg,T data是序列化返回给前端,但是isSuccess是public,会显示在前端的josn里,所以要加一个@JosnIgnore注解,则该字段序列化之后不会显示在josn里面
--public 的get方法都会显示在josn里面
--注意:失败有时候不返回data,此时是有data-key的空节点,data-value是null,这种是不需要返回给前端的,控制方法:在类前面增加注解@JosnSerialize(include = JosnSerialize.Inclusion.NOT_NULL)
该注解作用,仅返回非空值,比如只需要返回status,那么msg和data为空就不会返回给前端
【保证序列化json的时候,null的对象,key也会消失】
四、继续编写service层和dao层mapper逻辑
-先把IUserService和UserServiceImpl中login的方法返回类型都改成ServiceResponse<T>类型
-把mapper通过注解方式引进来
-编写UserMapper接口,增加checkUser方法
-编写UserMapperImpl,用#防止sql注入,会进行预编译
-回到service,使用范型做的高可用的服务端相应类进行报错
-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>可以方便要查询的数据
-回到service层,处理密码错误情况和能成功登录的情况,setPassword是为了将返回值密码置为空
五、把service注入到controller上
-先声明,@service("iUserService")
-把service注解到controller
-声明一个常量类,Const,当前用户
-在login方法里声明一个response,如果isSuccess为0,成功响应。
然后调用常量类的属性,设置session属性,两个参数