今天我们使用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、创建前端页面(当然这里只是简单的页面,我们的重点在于实现需求);
前端页面我就在这不写了,大家可以自行搜索。
登录的功能只需要在响应的类中添加方法即可,至此:这个小项目的梗概,基本就结束了。
由于本文是纯手打的,如出现错误,还请谅解,还望指正…………
我们可以一起讨论、学习……