使用Spring框架模拟用户注册和登录

今天我们使用Spring框架完成一个注册和登录的功能

首先要明确我们的目标,然后将目标进行拆解
目标:

用户在注册页面填写后完成后,我们需要接收并处理这个请求,然后将用户提交的数据保存在MySql数据库中。

拆解:

1、新建maven项目,添加Spring依赖,配置文件,添加Tomcat服务器等;
2、因为需要把数据存到数据库中,所以我们先要新建数据库、数据表;
3、创建实体类,表示用户的基本信息,并添加相应的get / set 方法;
4、创建数据持久层Dao,完成对数据的增删改查;
5、创建Service类,处理业务逻辑;
6、创建控制器Controller,接受请求并响应;
7、创建前端页面。


1、创建项目等操作:

我设置的项目名称为:Spring-UserManagement

2、创建新数据库、数据表:

创建数据库:spring_umanagement

CREATE DATABASE `spring_umanagement`;

在建好的库中创建数据表:

CREATE TABLE t_user (
    id INT AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(30) NOT NULL,
    email VARCHAR(30),
    PRIMARY KEY(id)
) DEFAULT CHARSET=UTF8;
3、创建实体类,表示用户的基本信息,并添加相应的get / set 方法;

实体类中的属性名需要和新建的表t_user中的字段名保持一致。

public class User{
    private integer id;//这里推荐使用int类型的包装类integer
    private String username;
    private String passward;
    private String email;
    //可以使用Eclipse自动生成getXXX() / setXXX() 方法
}
4、创建数据持久层Dao,完成对数据的增删改查;

为了降低耦合度,我们可以使用面向接口编程的思想,先声明一个接口IUserDao,在其中声明相应的抽象方法即可,然后,我们可以用某个实现类去实现这个接口,重写其方法,这样,我们在用这个实现类的时候,可以用这个接口去声明,而不用再关心具体的实现类是哪一个,这样大大增加了代码的维护性和程序的灵活性。

public interface IUserDao{
    int register(User user);
}

声明数据持久层的一个实现类UserDaoImpl

public class UserDaoImpl implements IUserDao{
    //Override
    public int register(User user){
        //需要连接数据库
        //我这里使用的是JDBC连接数据库,所以需要添加相应的配置(依赖和配置文件)
    }
}

添加的依赖代码如下:

<!-- commons-dbcp -->
<dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.4</version>
</dependency>

<!-- mysql-connector -->
<dependency>
    <groupId>mysql-connector-java</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.37</version>
</dependency>

添加的配置文件代码如下:
文件名可自定义,但后缀必须是:.properties
为了解释方便这里我使用的名字是:db.properties

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/库名?useUnicode=true&characterEncoding=utf8
username=数据库的用户名
password=数据库的密码(没有则不写,空着)
initialSize=5       初始化连接数
maxActive=50    最大连接数

因为我们需要的是一个数据库连接池的管理对象(BasicDataSource),通过这个管理对象(BasicDataSource)我们来获取连接对象(Connection对象),而这个管理员对象需要配置连接数据库的参数,才可以正常的使用,所以我们需要使用Spring获得其对象,然后读取配置文件,并给其属性注入值。
读取配置文件:

<util:properties id="dbConfig" location="classpath:db.properties">

配置BasicDataSource

<bean id="basicDataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="#{dbConfig.driver}">
</bean>

这里的name属性是BasicDataSource的属性名,value可以使用Spring表达式注入值。
Spring表达式:#{使用的bean的id.要访问的属性}

接下来就可以编写UserDao中的代码了;
首先我们需要通过Spring拿到BasicDataSource对象,因为数据持久层中多个方法中使用到这个对象,所以可以将其声明为属性。
然后通过注解@Resource,拿到BasicDataSource对象;


这里解释一下注解@Resource,在之前的文章中,我提到了Spring注入的两种方式:构造器注入和属性的set方法注入,其实还有第三种注入方式就是通过注解`进行自动装配。

@Resource注解,可以标注在字段或属性的set方法上,@Resource默认按名称装配,名称可以通过它的name属性指定,如果没有指定name属性,当注解标注在属性上时,即默认按属性的名称作为bean名称寻找依赖对象;当注解标注在属性的set方法上时,即默认按方法参数名作为bean名称寻找依赖对象。
@Autowired注解和@Resource一样,也可以标注在字段或属性的set方法上,但@Autowired默认按类型装配。


此时代码就变成了:

@Repository("userDao")
public class UserDaoImpl implements IUserDao{
    @Resource(name="dataSource")
    private BasicDataSource dataSource;
    public void setDataSource(BasicDataSource dataSource){
        this.dataSource = dataSource;
    }
    public int register(User user){
        //获取连接对象
        Connection conn = dataSource.getConnection();
        //下面写存储用户信息到数据库的代码,
        //可以使用传递过来的对象参数通过其get方法读取基本信息
        //然后存储到数据库,基本的存储流程,不再赘述
    }
} 
5、创建Service类,处理业务逻辑;

为了降低耦合度,我们可以使用面向接口编程的思想,先声明一个接口IUserService,在其中声明相应的抽象方法即可,然后,我们可以用某个实现类去实现这个接口,重写其方法,这样,我们在用这个实现类的时候,可以用这个接口去声明,而不用再关心具体的实现类是哪一个,这样大大增加了代码的维护性和程序的灵活性。

public interface IUserService
    int register(User user);
}

声明数据持久层的一个实现类UserServiceImpl

@Service("userService")
public class UserServiceImpl implements IUserService{
    @Resource(name="userDao")
    private IUserDao userDaoImpl;
    //Override
    public int register(User user){
        userDaoImpl.register(user);
        //....
    }
}
6、创建控制器Controller,接受请求并响应;
@Controller
public class UserController{

    @Resource(name="userService")
    private IUserService userService;

    //处理“显示注册页面”的请求
    @RequestMapping(value="/reg.do",method=RequestMethod.POST)
    public String showRegister(User user){
        return "视图名";
    }

    //处理“注册页面”表单提交的请求
    //@RequestMapping(value="/handle_reg.do",method=RequestMethod.POST)
    public String handleRegister(User user){
        //调用Service实现注册
        userService.register(user);
        return "响应页面";
    }
}
7、创建前端页面(当然这里只是简单的页面,我们的重点在于实现需求);

前端页面我就在这不写了,大家可以自行搜索。
登录的功能只需要在响应的类中添加方法即可,至此:这个小项目的梗概,基本就结束了。
由于本文是纯手打的,如出现错误,还请谅解,还望指正…………
我们可以一起讨论、学习……

猜你喜欢

转载自blog.csdn.net/qq_41244651/article/details/79506539