用户注册-持久层

1、创建用户表:t_user;

2、创建用户的实体类: 

        (1)通过表的结构可以提取出表的公共字段,放在一个实体类的基类中,起名BasEntity;

@Override
public String toString() {
    return "BaseEntity{" +
            "createdUser='" + createdUser + '\'' +
            ", createdTime=" + createdTime +
            ", modifiedTser='" + modifiedTser + '\'' +
            ", modifiedTime=" + modifiedTime +
            '}';
}

(2)创建用户的实体类:需要继承BaseEntity基类。

3、注册-持久层

        通过MyBatis来操作数据库,在做mybatis开发的流程。

        1.规划需要执行的SQL语句;

                 (1)用户的注册功能,相当于在做数据的插入操作;

                insert into t_user (username, password) values (值列表);

                (2) 在用户的注册时首先要去查询当前的用户名是否存在,如果存在则不能进行注册,相当于一条查询语句;

                select * from t_user where username=?

        2.设计接口和抽象方法:定义Mapper接口;

                (1)在项目的目录结构下首先创建一个mapper包,在这个包下再根据不同的模块来创建mapper接口。创建一个UserMapper的接口,要在接口中定义这两个SQL语句的抽象方法;

                

package com.cy.store.mapper;

import com.cy.store.entity.User;


/* 用户模块的持久层接口*/
public interface UserMapper {
    //使用Integer:因为有影响的行数,可以通过影响的行数(增、删
    // 改,可以更具返回值来判断)来判断是否插入成功

    Integer insert(User user);//设计成对象的类型可以少写很多值(如String username、pwd、等等)
    User findByUsername(String username);//根据用户名来查询用户的数据:如果找到则返回这个这个用户的数据,否则返回null值

}

                (2)在启动类配置mapper接口文件的位置:

//MapperScan注解指定当前项目中的Mapper接口路径的位置,在项目启动的时候会自动加载所有接口
@MapperScan("com.cy.store.mapper")

        3.编写映射:

                (1)定义xml映射文件,与对应的接口进行关联。所有的映射文件需要放在resource目录下,在这个目录下创建一个mapper文件夹,然后在这个文件夹中存放Mapepr映射文件;

                (2)创建接口对应的映射文件,遵循和接口的名称保持一致即可,创建一个UserMapper.xml文件;

                (3)配置接口中的方法对应上SQL语句上,需要借助标签来完成,insert\update\delete\select,对应的是SQL语句的增删改查操作;

                <!--id属性:表示映射的接口中方法的名称,直接在标签的内容来编写SQL语句-->

                        <insert id="">

                (4)将mapper文件的位置注册到properties对应的配置文件中。

               

                mybatis.mapper-locations=classpath:mapper/*.xml

                (5)单元测试:每个独立的层编写完毕后需要编写单元测试方法,来测试当前的功能。在test包结构下,创建一个mapper包,在这个包下再创建持久层的测试;

4、注册-业务层

        1、规划异常:如Java中提供的RuntimeException异常,程序运行过程中产生的异常,太过笼统。可以采取作为这异常的子类,然后再去定义具体的异常类型来继承这个异常。 而异常可能在业务层产生异常,也有可能在控制层产生异常;业务层异常的基类,ServiceException异常,这个异常继承RuntimeException异常。

根据业务层不同的功能来详细定义具体的异常的类型,统一的去继承ServiceException异常类。

        (1)用户在进行注册时可能会产生用户名被占用的错误,抛出一个异常:UsernameDuplicatedException。

        (2)正在执行数据插入操作的时候,服务器、数据库宕机:处理正在执行插入的过程中产生的异常InsertException。

        2、设计接口和抽象方法的定义:

                (1)在service包下创建一个IUserService接口,

        package com.cy.store.service;

        import com.cy.store.entity.User;

        /* 用户模块业务层接口*/
        public interface IUserService {
            //定义一个方法用来完成注册的功能,在注册的时候不需要有返回值(业务层不需要),
            //用户注册方法:传入参数用户的数据对象
            void reg(User user);
        }

                (2)创建一个实现类UserServiceImpl类,需要实现这个接口,并且实现抽象方法。

                 (3)在单元测试包下创建一个UserServiceTests类,在这个类中添加单元测试的功能。

5、注册-控制层

        1、创建响应:状态码、状态描述信息、数据。这部分功能封装到一个类中,将这个类作为方法返回值,返回给前端浏览器。

                

/* Json格式的数据进行响应 */
public class JsonResult<E> implements Serializable {//一个类中有泛型的数据类型,则该类在声明时也要声明为泛型数据类型
    //首先实现Serializable接口,然后声明相关需要响应给前端的数据
    private Integer state; //1. 响应的状态码
    private String message; //2.响应的描述信息
    private  E data; //3.响应数据,使用泛型来表示:(因为数据类型不确定)

        2、设计相关的请求(向后端服务器发送请求):需要依据当前的业务功能模块进行请求的设计。

        (1)请求路径: /user/reg

           (2) 请求参数: User user;

        (3)请求类型:POST(有敏感数据使用POST,没有就使用GET);

        (4)响应结果:JsonResult<Void>;

        3、处理请求:

                (1)创建一个控制层对应的类UserController类,依赖于业务层的接口。(第一步:需要把业务层的接口声明出来;第二步:在这个类上添加相应的注解用来接收相关的请求);

           

package com.cy.store.controller;

import com.cy.store.entity.User;
import com.cy.store.service.IUserService;
import com.cy.store.service.ex.InsertException;
import com.cy.store.service.ex.UsernameDuplicatedException;
import com.cy.store.util.JsonResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

//@Controller //表示当前类交给Spring管理
@RestController //等同于@Controller+@ResponseBody
@RequestMapping("users")//什么样的请求可以被拦截到此类当中呢,声明RequestMapping该注解.
public class UserController {

    @Autowired//将这个接口交给Spring自动进行装配
    private IUserService userService;//此类业务的执行依赖于业务层的接口

    @RequestMapping("reg")
    //@ResponseBody //表示此方法的响应结果以json格式进行数据的响应给到前端

    public JsonResult<Void> reg(User user){
        //创建响应结果对象
        JsonResult<Void> result = new JsonResult<>();
        try { //此处可能会抛异常,用try catch捕获:异常在业务层定义的异常(1)用户名被占用,(2)插入时的未知异常
            userService.reg(user);
            result.setState(200); //没有异常,封装一个200的状态码
            result.setMessage("用户注册成功!");
        } catch (UsernameDuplicatedException e) {
            result.setState(4000);
            result.setMessage("用户名被占用!");
        }catch (InsertException e) {
            result.setState(5000);
            result.setMessage("注册时产生未知的异常!");
        }
        return result;
    }
}

        4、控制层优化设计:在控制层抽离一个父类,在这个父类长统一的去处理关于异常的相关操作;编写一个BaseController类,统一处理异常。(3步骤的业务逻辑相对比较麻烦:凡是业务层抛出的异常都在控制层进行捕获,如果其他业务模块也抛异常,则代码需要进行重复编写。)

public class UserController extends BaseController{

    @Autowired//将这个接口交给Spring自动进行装配
    private IUserService userService;//此类业务的执行依赖于业务层的接口

    @RequestMapping("reg")
    //@ResponseBody //表示此方法的响应结果以json格式进行数据的响应给到前端

    public JsonResult<Void> reg(User user){

        userService.reg(user);
        return new JsonResult<>(OK); //如果成功则响应OK
    }
//控制层类的基类
public class BaseController {
    //表示操作成功的状态码
    public static final int OK = 200;

    //充当请求处理方法:该方法的返回值就是需要传递给前端的数据
    //被ExceptionHandler所修饰的方法会自动将异常对象传递给此方法的参数列表上 用Throwable e来接收
    //当前项目中产生了异常,被统一拦截到此方法中,这个方法此时就充当的是请求处理方法,方法的返回值直接给到前端
    @ExceptionHandler(ServerException.class) //Spring提供的注解:用于统一处理抛出的异常。业务层所有异常的基类ServerException
    public JsonResult<Void> handleException( Throwable e){
        JsonResult<Void> result = new JsonResult<>(e);
        if (e instanceof UsernameDuplicatedException){
            result.setState(4000);
            result.setMessage("用户名已经被占用!");
        } else if (e instanceof InsertException) {
            result.setState(5000);
            result.setMessage("注册时产生未知的异常!");

        }
        return result;
    }
}

6、注册-前端页面

        1、在register页面中编写发送请求的方法,点击事件来完成,选中对应的按钮($(“选择器”)(完成选择某一个元素),再去添加点击的事件,$.ajax()函数发送异步请求。

        2、jQuery封装了一个函数,称之为$.ajax()函数,通过对象调用ajax()函数,它可以异步加载相关的请求。依靠的是JavaScript提供的一个对象XHR(XmlHttpResponse),封装了这个对象。

        3、ajax()使用方式:

                (1)语法结构: $.ajax(); 需要传递一个方法体作为方法的参数来使用,一对大括号称之为方法体。ajax接收多个参数,参数与参数之间要求使用逗号,进行分割,每一组参数之间使用冒号:进行分割,参数的组成部分一个是参数的名称,一个是参数的值,参数的值要求是用字符串来标识。参数的声明顺序没有要求。

                        $.ajax({ 

        url: "",

        type: "",

        data: "",

        dataType: "",

        success: fucntion(){},

        error: function(){}

});

        4、ajax()函数参数的含义:

        url---表示请求的地址,不包含参数列表部分的内容。如"localhost:8080/users/reg"

        type---请求类型(GET和POST请求的类型)。如type:"GET"。

        data---向请求url地址提交的数据。例如data: "username=tom&pwd=123"。

        dataType---提交的数据类型。数据的类型一般指定为json类型。dataType:"json"。

        success---当服务器正常响应客户端时,会自动调用success参数的方法,并且将服务器返回的数据以参数的形式传递给这个方法的参数上。

        error---当服务器未正常响应客户端时,会自动调用error参数的方法,并且将服务器返回的数据以参数的形式传递给这个方法的参数上。

        5、JS代码可以独立声明在一个js文件里或者声明在一个script标签中。

        6、JS代码无法正常被服务器解析执行,体现在点击页面中的按钮没有任何的响应。解决方案:(1)在项目的maven下clear清理项目然后install重新部署。(2)在项目的file选项下-cash清理缓存。(3)重新的去重构项目,build项目下-rebuild选项。(4)重启idea或重启电脑。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值