SpringBoot整合SSM框架及Ajax

1. SpringBoot简介

SpringBoot是一个默认就集成了Spring、SpringMVC及相关常用框架的集合,并默认完成了常规的配置。关于配置,SpringBoot的理念是“约定大于配置”,在使用过程中,不必做配置的同时,也要遵守SpringBoot完成的配置值。

2. 创建SpringBoot项目

打开https://start.spring.io,在页面中填写创建项目的参数,必要的话,勾选所需要添加的依赖,点击Generate按钮,以下载项目。

解压下载的项目压缩包,得到项目文件夹,应该将该文件夹移动到Workspace中,在Eclipse中,通过Import > Existing Maven Projects导入项目。

导入时,务必保证当前计算机能够连接到Maven服务器!此次项目需要从Maven服务器下载大量依赖的jar包!

如果项目没有开始自动更新,可以对项目点击右键,选择Maven > Update Project,并在弹出的对话框中勾选Force update …并尝试更新,如果仍无法更新,可以尝试降低依赖的springboot的版本。

推荐使用Eclipse Oxygen(4.7)以上版本,如果使用的是较低版本的Eclipse,在pom.xml文件中可能会提示Maven版本错误!可以无视这个错误,并不影响项目的运行!

3. SpringBoot项目结构

创建好的项目结构例如:

[Java Resources]
	[src/main/java]
		[cn.tedu.springboot]
			ServletInitializer.java
			SpringbootApplication.java
	[src/main/resources]
		[static]
		[templates]
		application.properties
	[src/test/java]
		[cn.tedu.springboot]
			SpringbootApplicationTests.java

注意:以上cn.tedu.springboot包是根据创建项目时设置的Group和Artifact决定的,也是当前项目设置的组件扫描的根包!所以,后续在编程时,所有的组件类(例如控制器类)必须放在这个包或其子包中!

注意:SpringbootApplication类的名称也是根据创建项目时设置的Artifact决定的,这个类是SpringBoot项目的启动类,当需要运行时,执行该类中的main()方法即可!

注意:SpringBoot项目内置了Tomcat,运行启动类时,就会将项目部署到内置的Tomcat中!

注意:在src/main/resources下的static文件夹是用于存放静态资源的文件夹,例如存放.html、.css、.js及图片等!

注意:在src/main/resources下的templates文件夹是用于存放模版页面的,例如使用Thymeleaf时,就应该把相关的模版页面放在这里!

注意:在src/main/resources下的application.properties文件是SpringBoot项目唯一的配置文件,所有自定义配置都应该配置在该文件中!也有一些SpringBoot项目使用的配置文件是application.yml,与application.properties的区别只是配置的语法不同,功能与定位完全相同!

注意:在src/test/java下有cn.tedu.springboot包,这个包名也是创建项目时决定的,在SpringBoot项目中所有的单元测试类都必须放在这个包或子包中!否则,执行单元测试时,将无法加载Spring环境!在SpringbootApplicationTests测试类中,类的声明语句之前的2条注解,也是每个单元测试类必须添加的注解!

4. 在SpringBoot项目中添加静态网页

在src/main/resources/static下创建index.html,内容可以自行设计,完成后,启动项目(执行SpringbootApplication类中的main()方法),打开浏览器,通过http://localhost:8080/即可访问到该页面!

因为index.html是默认的欢迎页面的文件名,所以,在访问时,不必在URL中显式的使用http://localhost:8080/index.html。

5. 修改SpringBoot项目中内置Tomcat的端口号

在src/main/resources下的application.properties中添加配置:

server.port=8888

HTTP协议的默认端口号是80,也可以将端口号修改为这个值,如果使用的是Linux操作系统,使用80端口需要进行相关的权限设置。

6. 在SpringBoot项目中处理请求

在项目的根包cn.tedu.springboot下创建子包controller,并在该子包中创建控制器类HelloController,并在类之前添加@RestController注解:

package cn.tedu.springboot.controller;

import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

}

@RestController相当于@Controller + @ResponseBody,即:添加该注解后,当前类就是控制器类,并且,当前类中所有处理请求的方法都是响应正文,相当于每个处理请求的方法之前都添加了@ResponseBody!@RestController并不是SpringBoot项目才有的注解,在普通的SpringMVC项目中也可以使用该注解,只是需要另行配置!

注意:SpringBoot项目默认已经配置了SpringMVC的DispatcherServlet,并且,映射的路径是/,所以,在使用SpringBoot开发时,设计请求路径并不需要使用.do作为后缀!*

然后,在控制器类中添加处理请求:

@GetMapping("hello")
public String showHello() {
	return "Hello, <b>SpringBoot</b>!!!";
}

以上@GetMapping相当于@RequestMapping(method=RequestMethod.GET),即限制请求方式必须是GET类型的请求!除此以外,还有@PostMapping……

  1. 使用SpringBoot开发用户注册功能

7.1. 开发前端页面

正常的开发流程,应该是最后做页面!

在src/main/resources/static下创建用户注册页面。

7.2. 使用控制器接收并处理请求

为了便于接收用户提交的注册数据,首先,应该创建cn.tedu.springboot.entity.User用户数据的实体类:

创建cn.tedu.springboot.controller.UserController控制器类,在控制器类之前添加@RestController和@RequestMapping(“user”):

@RequestMapping("user")
@RestController
public class UserController {

}

然后,添加方法以接收并处理请求:

@PostMapping("reg")
public void reg(User user) {
	// 目前无法确定注册成功与否,暂时使用void作为返回值类型
	
	System.err.println("UserController.reg()");
	System.err.println("\t" + user);
	
	// TODO 将用户数据写入到数据库中
}

在前端页面中确定注册请求是提交到/user/reg的,如果无误,则启动项目,观察用户的注册数据是否可以提交到服务器端的控制器中!

7.3. 数据库连接

SpringBoot项目默认并没有集成数据库编程所需的依赖!可以在创建项目时添加,也可以在项目创建成功后再在pom.xml中补充相关依赖!

关于MyBatis和MySQL的依赖是:

<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>2.0.1</version>
</dependency>

<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<scope>runtime</scope>
</dependency>

注意:如果在SpringBoot项目中添加了数据库相关依赖,却没有配置数据库连接相关信息,则启动项目时会报错,因为SpringBoot在启动时就会加载连接数据库的相关信息!

然后,需要在application.properties中添加配置:

spring.datasource.url=jdbc:mysql://localhost:3306/tedu_ums?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root

在配置数据库连接时,可以不必配置driverClassName,SpringBoot会自动从数据库连接的jar包中查找!

添加以上配置后,即使配置值是错误的,也不影响项目启动!但是,应该及时检查配置是否正确!则可以通过单元测试,来尝试获取数据库连接,如果能够连接,则配置正确,如果无法连接,则配置错误,或者相关jar包是损坏的!

在SpringbootApplicationTests编写并执行单元测试:

@Autowired
private DataSource dataSource;

@Test
public void getConnection() throws SQLException {
	Connection conn = dataSource.getConnection();
	System.err.println(conn);
}

由于SpringBoot的单元测试在执行之前,会加载整个项目中的配置和Spring环境,所以,在传统的SpringMVC项目中可以通过getBean()获取的对象,在SpringBoot项目中都可以自动装配!

7.4. 通过MyBatis实现插入数据

创建cn.tedu.springboot.mapper.UserMapper接口,并在接口中添加抽象方法:

Integer insert(User user);

然后,需要配置接口文件的位置!可以直接在接口的声明语句之前添加@Mapper注解!使用这种做法时,每个MyBatis的接口都需要添加该注解!也有另一种做法,在启动类之前添加@MapperScan注解进行配置:

@SpringBootApplication
@MapperScan("cn.tedu.springboot.mapper")
public class SpringbootApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringbootApplication.class, args);
	}

}

在src/main/resources下创建名为mappers的文件夹,专门用于存放配置SQL语句的XML文件,并在该文件夹下复制粘贴得到UserMapper.xml文件,进行配置:

<mapper namespace="cn.tedu.springboot.mapper.UserMapper">

	<insert id="insert"
		useGeneratedKeys="true"
		keyProperty="id">
		INSERT INTO t_user (
			username, password,
			age, phone,
			email, is_delete,
			department_id
		) VALUES (
			#{username}, #{password},
			#{age}, #{phone},
			#{email}, #{isDelete},
			#{departmentId}
		)
	</insert>
	
</mapper>

在SpringBoot项目中,仍然需要配置XML文件的位置,则需要在application.properties中添加配置:

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

完成后,编写并执行单元测试:

@Autowired
private UserMapper userMapper;

@Test
public void insert() {
	User user = new User();
	user.setUsername("boot");
	user.setPassword("1234");
	Integer rows = userMapper.insert(user);
	System.err.println("rows=" + rows);
}

为了保证“用户名唯一”,可以在用户尝试注册之前,检查用户名是否已经被注册,则“根据用户名查询用户数据”,判断查询结果是否为null,即可判断得到答案!

所以,在UserMapper.java接口中添加:

User findByUsername(String username);

并在UserMapper.xml中配置SQL映射:

<select id="findByUsername"
	resultType="cn.tedu.springboot.entity.User">
	SELECT
		*
	FROM
		t_user
	WHERE
		username=#{username}
</select>

完成后,还是应该编写并执行单元测试:

@Test
public void findByUsername() {
	String username = "root";
	User user = userMapper.findByUsername(username);
	System.err.println(user);
}

然后,将以上方法应用到控制器的处理请求的过程中:

@PostMapping("reg")
public JsonResult reg(User user) {
	System.err.println("UserController.reg()");
	System.err.println("\t" + user);
	
	JsonResult jsonResult = new JsonResult();
	
	// 检查该用户名是否已经被注册
	String username = user.getUsername();
	User result = userMapper.findByUsername(username);
	// 判断查询结果是否为null
	if (result == null) {
		// 将用户数据写入到数据库中
		userMapper.insert(user);
		jsonResult.setState(1);
	} else {
		// 用户名已经被注册
		jsonResult.setState(2);
		jsonResult.setMessage("您尝试注册的用户名(" + username + ")已经被占用!");
	}
	
	return jsonResult;
}

猜你喜欢

转载自blog.csdn.net/qq_37669050/article/details/102508588