1. SpringBoot

1.1. 概要

在传统的SSM框架应用过程中,存在大量的配置文件,及相关的配置项,例如:

1. DispatcherServlet
2. CharacterEncodingFilter
3. <mvc:component-scan />
4. <mvc:annotation-driven />
5. <bean class="...InternalResourceViewResolver" />
6. <util:properties />
7. <bean class="...BasicDataSource" />
8. <bean class="...MapperScannerConfigurer" />
9. <bean class="...SqlSessionFactoryBean" />

这些配置在每个基于SSM框架的应用中都是需要的,每次开发时却改动很小,甚至某些配置是不需要改动的,所以,出现了SpringBoot框架!

可以把SpringBoot理解为框架的集合体,默认就添加了大量的常用依赖,并且完成了绝大部分通用的配置,从而简化了项目的创建过程。

在其它方面,SpringBoot也有很多的简化,在学习中再慢慢体会。

1.2. 使用SpringBoot

访问https://start.spring.io/,通过该页面创建项目,主要填写必要的参数,点击Switch to the full version展开详细配置,在下方勾选所需要的jar包,然后生成项目。

下载生成的项目的压缩包,解压缩后,将项目文件夹复制或剪切到Workspace中,在Eclipse中,通过Import > Existing Maven Projects功能导入,然后等待项目更新完成(务必保证此过程中电脑是可以正常连接到Maven服务器的)。 

1.3. HelloWorld

首先,SpringBoot默认并不推荐服务器端的开发任务中包含页面的开发,即服务器端依然只提供JSON数据即可,而不应该通过转发或重定向等方式处理页面(当然,功能方面还是支持的)。

由于创建项目时,Group值为cn.tedu.bootArtifact值为sample,所以,在项目中默认存在cn.tedu.boot.sample包,这个包也是组件扫描的包,则本项目中,所有需要被Spring管理的组件都必须在这个包或它的子孙包中!

cn.tedu.boot.sample.controller中创建HelloController

@RestController
@RequestMapping("/hello")
public class HelloController { // 请求路径:/hello/index
@GetMapping("/index")
public String showIndex() {
return "hello, spring boot.";
} }

以上@RestController@Controller@ResponseBody的组合应用方式,当使用这个注解时,当前类中所有处理请求的方法相当于都添加了@ResponseBody,同时,也意味着当前控制器中处理请求时不支持转发或重定向,而全部是响应正文,如果一定需要转发或重定向,只能使用@Controller注解。

SpringBoot默认添加了许多常用的依赖,且相关的jar包都是较高的稳定版本,所以,简单的项目中可以不必自行添加依赖,如果需要添加依赖,大多数依赖是不推荐自定义版本号的。

在SpringBoot中,配置了StringHttpMessageConverter的配置,使得响应头的ContentType使用的字符编码是utf-8,所以,即使使用String类型的返回值响应正文,也是支持中文的!(默认是使用的ISO-8859-1)

并且,SpringBoot默认完成了关于DispatcherServlet的配置(事实上在SpringBoot项目中根本就不存在web.xml文件),并且映射的路径是/*,所以,在配置映射路径时,并不要求资源名以.do作为后缀。

在执行时,直接运行根包下的XXXApplication.java文件中的main()方法即可,SpringBoot中内置Tomcat,所以,在启动之前,务必保证默认端口8080没有被占用,并且,成功启动后,在没有停止之前,不可以启动第2次,否则将导致端口冲突,第2次启动会失败!

由SpringBoot部署的项目,在URL中没有项目名称,所以,以上配置的请求,可以通过http://localhost:8080/hello/index直接访问。

1.4. 设计注册页面

基于前后端分离的思想,页面并不需要是JSP页面,只需要是HTML页面即可。

在SpringBoot中,推荐将静态资源(HTML页面、CSS、JS、图片等)放在src/main/resources/static目录下。

所以,在static下创建reg.html页,完成后,通过http://localhost:8080/reg.html即可直接访问。

1.5. 创建实体类

package cn.tedu.boot.sample.entity;

import java.io.Serializable;

public class User implements Serializable {

    private static final long serialVersionUID = 1414039275087351434L;

    private Integer id;
private String username;
private String password;
private Integer age;
private String phone;
private String email; // ...
}

1.6. 持久层

在SpringBoot项目中,使用MyBatis时,无须配置MapperScannerConfiguereSqlSessionFactoryBean,可以直接开始编写代码,例如先创建cn.tedu.boot.sample.mapper.UserMapper接口:

public interface UserMapper {

    Integer addnew(User user);

}

然后,在resources下创建mappers文件夹,并在该文件夹下添加UserMapper.xml文件(从其它项目中复制粘贴过来):

<mapper namespace="cn.tedu.boot.sample.mapper.UserMapper">

    <insert id="addnew">
INSERT INTO t_user (
username, password,
age, phone,
email
) VALUES (
#{username}, #{password},
#{age}, #{phone},
#{email}
)
</insert> </mapper>

即使不用再配置比较繁琐的内容,也不代表完全没有配置,为了保证项目能扫描得到持久层接口,需要在接口文件之前添加@Mapper注解,同时,还需要指定持久层映射的XML文件的位置,在application.properties文件中:

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

编码完成后,应该及时执行单元测试,以检查功能是否正常,应该在src/test/java中的根包下创建测试类,所有测试类都应该添加@RunWith(SpringRunner.class)@SpringBootTest注解,相当于加载Spring配置文件以获取Spring容器,甚至完成其它的初始化配置,然后,所需要的Bean可以直接声明并添加@Autowired通过自动装配来得到值,接下来,编写测试方法即可:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTestCase { @Autowired
UserMapper userMapper; @Test
public void addnew() {
User user = new User();
user.setUsername("boot");
user.setPassword("8888");
Integer rows = userMapper.addnew(user);
System.err.println("rows=" + rows);
} }

通常,注册功能中,要求“用户名必须是唯一的”,所以,为了保证注册功能的完整性,还应该提供“根据用户名查询用户数据是否存在”的查询功能!对应的抽象方法可以是:

User findByUsername(String username);

匹配的映射是:

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

注意:由于这个查询功能应用于“注册时检查用户名是否被占用”,所以,并不关心查询到的数据的各属性值是多少,那么,在查询时,应该只查询必要的字段,如果所有字段都不关心,则只选取其中任一字段即可。

功能完成后,还是应该及时的编写测试:

@Test
public void findByUsername() {
String username = "boot";
User user
= userMapper.findByUsername(username);
System.err.println(user);
} public void deGet() {
// 接收用户提交的用户名等参数
// Dao > 检查用户名是否被占用
// 是:被占用 > 提示错误
// 否:没有被占用 > Dao > 插入数据
// -- 提示成功
}

1.7. 业务层

通常,业务层应该由业务接口和业务实现类来共同组成,例如创建cn.tedu.boot.sample.service.IUserService

package cn.tedu.boot.sample.service;

public interface IUserService {

}

然后,创建cn.tedu.boot.sample.service.impl.UserServiceImpl类实现该接口:

package cn.tedu.boot.sample.service.impl;

import cn.tedu.boot.sample.service.IUserService;

public class UserServiceImpl
implements IUserService { }

接下来,应该在接口中声明抽象方法,该方法表示向外提供的功能,例如注册、登录、修改密码等,此次需要完成的是注册,则:

void reg(User user); // throws 用户名被占用异常, XX异常;

注意:设计抽象方法时,仅以“成功”为前提来考虑方法的返回值类型!如果失败,使用抛出异常的方式来表现。

try {

} catch (用户名被占用异常 e) {

} catch (XXX异常 e) {

}

然后,在实现类中,声明持久层对象private UserMapper userMapper;并添加@Autowired注解,当前类也应该添加@Service注解,然后,实现以上方法:

@Service
public class UserServiceImpl
implements IUserService { @Autowired
private UserMapper userMapper; @Override
public void reg(User user) {
// 根据user.getUsername()查询数据
String username = user.getUsername();
User data = userMapper.findByUsername(username);
// 判断数据是否为null
if (data == null) {
// 是:为null,即:用户名未被使用,则插入数据
userMapper.addnew(user);
} else {
// 否:非null,即:用户名被占用,则抛出异常
throw new RuntimeException(
"注册失败!您尝试注册的用户名(" + username + ")已经被占用!");
}
} }

最后,执行单元测试:

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceTestCase { @Autowired
IUserService userService; @Test
public void reg() {
try {
User user = new User();
user.setUsername("service");
user.setPassword("8866");
userService.reg(user);
System.err.println("注册成功!");
} catch (RuntimeException e) {
System.err.println(e.getMessage());
}
} }

1.8. 控制器层

先创建控制器类cn.tedu.boot.sample.controller.UserController,添加@RestController@RequestMapping("/user")

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

控制器类本身并不完成实际功能的处理,主要作用是接收请求、给予响应结果,所以,在功能的处理方面,它会依赖于业务层private IUserService userService;并通过@Autowired注入值:

@Autowired
private IUserService userService;

接下来,应该设计所需要处理的请求,此次的请求是用户将提交注册相关数据,尝试执行注册,所以,请求的类型应该是POST,请求的参数应该是包括注册的所有数据,例如用户名、密码、年龄等,在SpringMVC中,可以使用User对象接收这些参数,在响应时,仍推荐使用JSON数据进行响应,所以,应该提前创建好ResponseResult类,作用处理请求的方法的返回值:

package cn.tedu.boot.sample.util;

import java.io.Serializable;

public class ResponseResult<T> implements Serializable {

    private static final long serialVersionUID = -5015220243507112803L;

    private Integer state;
private String message;
private T data; // SET/GET }

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

@RequestMapping("/reg")
public ResponseResult<Void> handleReg(User user) { }

最原始的处理方式为:

@RequestMapping("/reg")
public ResponseResult<Void> handleReg(User user) {
ResponseResult<Void> rr = new ResponseResult<Void>(); try {
userService.reg(user);
rr.setState(1);
rr.setMessage("注册成功");
return rr;
} catch (RuntimeException e) {
rr.setState(2);
rr.setMessage(e.getMessage);
return rr;
}
}

为了快速的创建ResponseResult并确定statemessage属性的值,简化以上代码,所以,可以在ResponseResult类中添加新的构造方法:

public ResponseResult(Integer state, String message) {
super();
this.state = state;
this.message = message;
} public ResponseResult(Integer state, Exception e) {
super();
this.state = state;
this.message = e.getMessage();
}

所以,原有的控制器中的代码可以调整为:

@RequestMapping("/reg")
public ResponseResult<Void> handleReg(User user) {
try {
userService.reg(user);
return new ResponseResult<Void>(1, "注册成功");
} catch (RuntimeException e) {
return new ResponseResult<Void>(2, e);
}
}

为了便于统一处理异常,应该添加专门的方法进行处理:

@ExceptionHandler(RuntimeException.class)
public ResponseResult<Void>
handleException(Exception e) {
return new ResponseResult<>(2, e);
}

则控制器中不必再处理异常:

@RequestMapping("/reg")
public ResponseResult<Void> handleReg(User user) {
// 执行注册
userService.reg(user);
// 注册成功,确定返回值
return new ResponseResult<>(1, "注册成功!");
}

全部完成后,可以在浏览器的地址栏中输入http://localhost:8080/user/reg?username=exception&password=666进行测试(如果有更多非空字段的设计,请添加更多参数),测试完成后,将以上处理请求的方法的注解修改为@PostMapping

spring boot 小案例的更多相关文章

  1. (转)Spring Boot (十三): Spring Boot 小技巧

    http://www.ityouknow.com/springboot/2017/06/22/spring-boot-tips.html 一些 Spring Boot 小技巧.小知识点 初始化数据 我 ...

  2. Spring Boot(十三):spring boot小技巧

    Spring Boot(十三):spring boot小技巧 一.初始化数据 我们在做测试的时候经常需要初始化导入一些数据,如何来处理呢?会有两种选择,一种是使用Jpa,另外一种是Spring JDB ...

  3. Spring Boot (十三): Spring Boot 小技巧

    一些 Spring Boot 小技巧.小知识点 初始化数据 我们在做测试的时候经常需要初始化导入一些数据,如何来处理呢?会有两种选择,一种是使用 Jpa,另外一种是 Spring JDBC .两种方式 ...

  4. 最近做的一个Spring Boot小项目,欢迎大家访问 http://39.97.115.152/

    最近做的一个Spring Boot小项目,欢迎大家访问 http://39.97.115.152/,帮忙找找bug,网站里有源码地址 网站说明 甲壳虫社区(Beetle Community) 一个开源 ...

  5. 【微框架】之一:从零开始,轻松搞定SpringCloud微框架系列--开山篇(spring boot 小demo)

    Spring顶级框架有众多,那么接下的篇幅,我将重点讲解SpringCloud微框架的实现 Spring 顶级项目,包含众多,我们重点学习一下,SpringCloud项目以及SpringBoot项目 ...

  6. Spring Boot 小技巧

    初始化数据 我们在做测试的时候经常需要初始化导入一些数据,如何来处理呢?会有两种选择,一种是使用 Jpa,另外一种是 Spring JDBC .两种方式各有区别下面来详细介绍. 使用 Jpa 在使用s ...

  7. Spring Boot 入门案例与配置说明

    一.Spring Boot简介 官网地址:http://spring.io/projects/spring-boot Spring Boot可以轻松创建可以运行的独立的,生产级的基于Spring的应用 ...

  8. 【微框架】之一:从零开始,轻松搞定SpringCloud微服务系列--开山篇(spring boot 小demo)

    Spring顶级框架有众多,那么接下的篇幅,我将重点讲解SpringCloud微框架的实现 Spring 顶级项目,包含众多,我们重点学习一下,SpringCloud项目以及SpringBoot项目 ...

  9. spring boot 整合案例

    github  :   https://github.com/nbfujx/springBoot-learn-demo

随机推荐

  1. 《Unity Shader入门精要》读书笔记(1)

    主要是对第二章的整理 渲染流水线:由一个三维场景出发,生成(渲染)一张二维图像. 渲染流程:应用阶段.几何阶段.光栅化阶段. 应用阶段: 1. 把数据加载到显存中 渲染所需数据从硬盘,到内存,再到显存 ...

  2. 工作流一期上线原创小故事——【加签】OR【不准】

    亲!您有过选择[加签]还是审核[不准]的烦恼吗? 加签分为:向前加签和向后加签,这个相信大家都很熟悉了吧. 审核分为:准和不准,就是√和×,这个相信大家也很熟悉了. 提示①:相邻的2个人审核时,如果意 ...

  3. matlab练习程序(Ritter‘s最小包围圆)

    原始算法是sphere,我这里简化为circle了. Ritter's求最小包围圆为线性算法,因为非常简单,所以应用非常广泛. 该算法求出的圆比最优圆大概会大个5%到20%左右,求最优圆应该可以用Bo ...

  4. 字符串安全处理:CRT安全增强以及安全模板重载

    Secure Template Overloads :http://msdn.microsoft.com/en-us/library/ms175759(v=vs.80).aspx Security E ...

  5. 使用 richtextbox 输出程序运行信息

    private delegate void Refresh_CallBack(Color color,string text); private void ControlsRefresh(Color ...

  6. Java中条件语句和if-else的嵌套原则

    if(condition)Statement 在此时的条件语句中的条件是需要用括号把它括起来.   其实,Java中的条件语句和C/C++中的是一样的.而Java常常希望在某个条件为真的时候执行多条语 ...

  7. Do the Untwist

      Do the Untwist Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. Linux --Mysql基础命令

    mysql>create database a; --创建一个名为a的新库 mysql>create table a: --创建一个名为a新表 mysql>use a: --进入一个 ...

  9. 深度剖析hdfs原理

    大数据底层技术的三大基石起源于Google在2006年之前的三篇论文GFS.Map-Reduce. Bigtable,其中GFS.Map-Reduce技术直接支持了Apache Hadoop项目的诞生 ...

  10. vue+node+mongoose踩过的坑

    1.当你在cmd中输入npm run dev的时候,出现这种错误 很有可能是目前的端口被占用了,可以把所有可能用到这个端口号的应用关闭或者你直接改一个新的端口号 修改端口的方法:新打开一个cmd,然后 ...