Java框架-SpringBoot

1. SpringBoot简介

SpringBoot是一个默认就集成了绝大部分常规开发时都使用的依赖、完成了绝大部分的常规配置、基于SpringMVC的框架。

SpringBoot的核心思想是约定大于配置,因为在传统的SSM项目中,创建项目后,需要自定义大量的配置,而不同的项目的配置却大同小异,甚至就是完全相同,所以,SpringBoot就直接完成了相关的配置,并要求使用者遵循配置值的约定,例如它将DispatcherServlet的映射路径配置为/*,则使用者就按照这个配置值使用即可,无须自已编写配置!

2. 示例使用SpringBoot开发用户注册

2.1. 创建SpringBoot项目

如果要创建SpringBoot项目,常规的创建方式有:

  • 基于SpringBoot的父级项目来创建新的项目;
  • 使用开发工具的创建向导来创建;
  • 从Spring网站创建项目并导入到本地开发工具中。

本次使用以上介绍的第3种做法,首先,打开https://start.spring.io/网站,在网页中主要确定几项:

  • 所使用的SpringBoot版本;
  • Group与Artifact,相当于在Eclipse中创建Maven项目时指定的Group Id和Artifact Id;
  • 强烈建议不要修改默认生成的Package name,默认值就是由填写的Group和Artifact值决定的;
  • 确定使用jar或war;
  • 添加必要的依赖。

完成后,点击页面中的Generate按钮就可以开始生成项目并自动下载该项目!

解压下载得到的压缩包文件,将得到项目文件夹,为了便于管理项目,推荐将该文件夹移动到Workspace中。

然后,在Eclipse中,通过Import > Existing Maven Projects导入项目,默认的项目结构并不完整,可以暂且不管,后续项目更新完成后就会恢复正常,导入项目后,项目会开始自动下载所需的依赖,这个过程中只需要保证能够连接到Maven服务器,确保能下载所依赖的jar包,然后,等待即可,如果项目没有开始自动下载,对项目点右键,选择Maven > Update Project更新即可。

建议使用4.11及以上版本的Eclipse,如果使用的是较低版本的Eclipse,在pom.xml文件中可能报错,这是因为较低版本的Eclipse中内置的Maven配置版本较低导致的,而较高版本的Eclipse中内置的Maven配置版本较高,就不会出错,并且,即使出错,也不影响正常的开发和运行。

2.2. 检查项目是否基本可用

展开项目中的src/test/java,其中,已经存在cn.demo.sample包,这个包的名称是创建项目时填写的Group和Artifact决定的,这个包的名称是不允许修改的,并且,项目中所有的单元测试类都必须放在这个包或其子包中!在包中已经存在SampleApplicationTests类,类中有contextLoads()方法,通过单元测试的方式,直接测试方法,如果能成功运行,则表示测试环境是正常的!

展开项目中的src/main/java,其中,已经存在cn.demo.sample包,这个包的名称是创建项目时填写的Group和Artifact决定的,这个包的名称是不允许修改的,并且,项目中所有的单元测试类都必须放在这个包或其子包中!在包中已经存在SampleApplication类,它是项目的启动类,类中有main()方法,这个main()就是整个项目的启动方法。

2.3. 在项目中添加静态页面

在SpringBoot项目中,在src/main/resources下,默认就存在static文件夹,这个文件就是SpringBoot项目用于存放静态资源(网页文件、css文件、js文件、图片文件等)的文件夹!

所以,可以在static文件夹下创建index.html文件,内容可以自行设计,完成后,启动项目,在浏览器中输入http://localhost:8080/即可访问。

因为SpringBoot框架内置了Tomcat,每个项目都有独立的Tomcat,在部署项目时,会将Context Path设置为"",即空字符串,所以,在SpringBoot的启动日志中也会有:

Tomcat started on port(s): 8080 (http) with context path ''

所以,最后,在执行访问时,URL的端口号右侧不需要添加项目名称!

另外,index.html是默认的资源名称,所以,如果需要访问的就是这个资源,则URL中也不必显式的指定资源名。

在SpringBoot项目中,在src/main/resources下默认即存在application.properties文件,这个文件是整个项目的配置文件,后续相关的配置都需要写在这个文件中!例如,可以在该文件中添加配置:

server.port=80

就可以把Tomcat的端口号改为80,如果使用的是Windows操作系统,重新启动项目,通过http://localhost/即可访问刚才的页面,因为80端口是HTTP协议的默认端口,所以,当尝试提交HTTP请求时,如果没有显式的指定端口号,会视为尝试访问服务器的80端口!如果使用的是Mac OS或Linux操作系统,这些操作系统对80端口的使用是非常严格的,需要自行在操作系统中进行相关配置后,才允许使用80端口!

另外,如果在SpringBoot项目中,还会使用到Thymeleaf等模版技术,应该将模版页面放在**src/main/resources/templates/**文件夹下。

2.4. 使用控制器接收客户端提交的请求

src/main/java下的cn.demo.sample包是SpringBoot项目默认组件扫描的根包,所以,在项目中创建的所有组件类(需要由Spring框架创建并管理的)必须放在这个包或其子包中!

cn.demo.sample包中创建HelloController控制器,在类的声明之前添加@Controller注解,并在类中添加处理请求的方法,例如:

package cn.demo.sample;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class HelloController {
  
  @RequestMapping("hello")
  @ResponseBody
  public String showHello() {
    return "SpringBoot框架真好用!!!";
  }

}

编写完成后,重启项目,在浏览器中输入http://localhost:8080/hello即可请求到以上控制器中的资源!

SpringBoot项目默认已经配置了DispatcherServlet,并且,映射的路径是/*,所以,在配置请求路径时,并不要求路径中的资源是以.do作为后缀,同时,也就意味着当前项目中所有请求路径都会被SpringMVC框架所处理!

SpringBoot框架将所有内置的框架、开发环境中的编码已经全部设置为UTF-8了,所以,在使用SpringBoot时,默认都是可以直接支持中文的!

在编写控制器时,还可以使用一些新的注解:

  • @RestController:该注解可以用于替代此前使用的@Controller,使用该注解后,当前控制器类中所有的方法默认都是响应正文,相当于每个方法之前都添加了@ResponseBody,所以,可以简单的理解为@RestController = @Controller + @ResponseBody
  • @GetMapping:该注解相当于@RequestMapping(method=RequestMethod.GET)
  • @PostMapping:该注解相当于@RequestMapping(method=RequestMethod.POST)

以上注解并不是SpringBoot项目新增的,而是SpringMVC框架中本来就有的,但是,在传统的SpringMVC框架中,这些注解是不能直接使用的,需要另行配置,而SpringBoot默认已经完成了这些配置,所以,可以直接使用!

2.5. 配置数据库连接

在SpringBoot项目中,如果涉及数据库编程,需要自行添加数据库相关的依赖,虽然SpringBoot默认能集成绝大部分常规依赖,但是,它无法直接确定每个开发者使用的是哪种数据库、哪种数据库编程时使用的框架,所以,是需要自行添加的!


      org.mybatis.spring.boot
      mybatis-spring-boot-starter
      2.1.1


      mysql
      mysql-connector-java
      runtime

当SpringBoot项目添加了数据库相关的依赖后,启动项目时,就会自动尝试读取数据库连接的配置信息,如果没有配置信息,则启动项目会报错!

所以,需要在application.properties中添加配置:

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

添加以上配置后,就可以正常启动项目,但是,启动项目时,只会读取配置信息,并不会执行连接,所以,即使以上配置信息中存在错误的值,也不影响项目启动,同样,也不无法得知以上配置信息是否正确!

所以,接下来,需要尝试连接到数据库,以确认以上配置信息是否正确!可以在src/test/javacn.demo.sample中的SampleApplicationTests测试类编写并执行单元测试:

@RunWith(SpringRunner.class)
@SpringBootTest
public class SampleApplicationTests {
  
  @Test
  public void contextLoads() {
  }
  
  @Autowired
  private DataSource dataSource;
  
  @Test
  public void getConnection() throws SQLException {
    System.err.println(dataSource.getConnection());
  }
}

2.6. 实现注册相关的数据库编程

首先,需要创建用户数据类,用于封装用户数据的属性,所以,在src/main/javacn.demo.sample包下创建User类:

public class User {

  private Integer id;
  private String username;
  private String password;
  private Integer age;
  private String phone;
  private String email;
  
  // 补充SET/GET方法,toString()方法
  
}

注册功能:先根据用户尝试注册的用户名查询数据,如果查询到某个结果,则表示该用户名已经被占用,不允许插入新的用户数据,如果查询不到结果,则该用户名没有被人占用,将用户尝试注册的信息插入到数据库中即可!所以,涉及操作分别是根据用户名查询用户数据插入用户数据

cn.demo.sample包中创建UserMapper接口,并在接口中添加抽象方法:

package cn.demo.sample;

public interface UserMapper {
  Integer addnew(User user);
  User findByUsername(String username);
}

写完接口后,需要配置接口文件的位置,配置的做法可以是:

  • 在接口的声明之前添加@Mapper注解,使用这种做法,就要求每一个接口都需要添加该注解;
  • 在启动类(SampleApplication)的声明之前,添加@MapperScan("接口所在的包")注解,然后,所有接口都放在配置的包中即可!

一般推荐使用以上的第2种做法,例如:

@SpringBootApplication
@MapperScan("cn.demo.sample")
public class SampleApplication {
  public static void main(String[] args) {
    SpringApplication.run(SampleApplication.class, args);
  }
}

接下来,就需要配置各抽象方法对应的SQL语句,首先,还是在src/main/resources下创建mappers文件夹,并在该文件中创建得到UserMapper.xml,用于配置SQL语句。

UserMapper.xml中配置SQL语句:

  




  
    INSERT INTO 
    	t_user (username, password, age, phone, email )
   	 VALUES 
   	 	(#{username}, #{password}, #{age}, #{phone}, #{email})
  

  


在执行单元测试之前,还需要指定这些XML文件的位置,需要在application.properties中进行配置:

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

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

@RunWith(SpringRunner.class)
@SpringBootTest
public class SampleApplicationTests {
  
  @Test
  public void contextLoads() {
  }
  
  @Autowired
  private DataSource dataSource;
  @Autowired
  private UserMapper userMapper;
  
  @Test
  public void addnew() {
    User user = new User();
    user.setUsername("lucy02");
    user.setPassword("123456");
    user.setAge(32);
    user.setPhone("13900139002");
    user.setEmail("[email protected]");
    Integer rows = userMapper.addnew(user);
    System.err.println("rows=" + rows);
    System.err.println(user);
  }
  
  @Test
  public void findByUsername() {
    String username = "lucy";
    User user = userMapper.findByUsername(username);
    System.err.println(user);
  }
  
  @Test
  public void getConnection() throws SQLException {
    System.err.println(dataSource.getConnection());
  }

}

至此,关于注册时涉及的数据库编程的相关功能就已经完成!

其实,还可以在抽象方法之前添加注解来配置SQL语句及相关内容,例如:

public interface UserMapper {
  
  @Insert("INSERT INTO t_user (username, password, age, phone, email) VALUES (#{username}, #{password}, #{age}, #{phone}, #{email})")
  Integer addnew(User user);
  
  @Select("SELECT * FROM t_user WHERE username=#{username}")
  User findByUsername(String username);

}

这种做法也不是SpringBoot集成MyBatis才可以做到的,直接使用MyBatis也可以实现,但是,需要额外的配置,而SpringBoot已经完成了相关的配置,所以,可以直接使用!

2.7. 开发处理注册的控制器

首先,需要创建封装返回结果的JsonResult类,在类中声明需要响应到客户端的JSON数据中的属性:

public class JsonResult {
  private Integer state;
}

创建UserController控制器类,在这个控制器类中处理请求:

@RestController
public class UserController {
  
  @Autowired
  private UserMapper userMapper;

  @RequestMapping("reg")
  public JsonResult reg(User user) {
    User result = userMapper.findByUsername(user.getUsername());
    if (result == null) {
      userMapper.addnew(user);
      return new JsonResult(1);
    } else {
      return new JsonResult(2);
    }
  }

}

完成后,重新启动项目,在浏览器中访问http://localhost:8080/reg?username=david&password=1234执行测试。

2.8. 前端页面

先创建reg.html和jQuery文件到static文件夹下。

为注册的表单设置ID值:

修改按钮:


然后,引用jQuery文件,并编写代码以提交请求、处理结果:



你可能感兴趣的:(Java)