从spring到springboot的三个原因
Spring本身配置的重量化
Spring web项目的配置太多
微服务的萌芽阶段,需要一个轻量级框架
idea快捷键 search everything double shift
1、创建一个maven项目结构
2、pom.xml添加两个依赖:spring-context的依赖、spring-webmvc的依赖
3、web.xml DispatcherServlet
4、启动一个springmvc的配置,Dispatcher-servlet.xml
5、创建一个controller,发布一个http请求
6、发布到jsp/servlet容器
Spring需要 1 2 3 4 5 6,但是Springboot仅需要 5 黑体标粗。
1、基于maven搭建webapp项目
2、然后,pom.xml添加Spring需要的依赖
3、web.xml中添加servlet
注意:classpath就是resources目录
4、webapp同级目录下,新建resources/dispatcher.xml
servlet-dispatcher.xml 中注解扫描、视图解析
5、新建源码目录 source root
servlet-dispatcher.xml 配置开启注解扫描
7、运行成功,localhost:8080/test,controller中的return值返回至前端
①pom.xml导入两个依赖spring-context spring-webmvc;
②web.xml 配置 servlet-dispatcher.xml 或 springmvc-servlet.xml (名称自定义),新建resources/servlet-dispatcher.xml 或 springmvc-servlet.xml;
③工程文件java 设置controller。
数据库表设计
附1:IOC和DI
IOC 反转控制 是Spring的基础,Inversion Of Control 简单说就是创建对象由以前的程序员自己new 构造方法来调用,变成了交由Spring创建对象。
DI 依赖注入 Dependency Inject. 简单地说就是拿到的对象的属性,已经被注入好相关值了,直接使用即可。
附2:spring配置文件和springmvc配置文件
SSM两个配置文件(web.xml指定两个配置文件 servlet-dispatcher.xml/springmvc-servlet.xml 和 mybatis xml配置)
第一个配置文件,springmvc的配置文件,对于web.xml将拦截到的请求(一般是所有请求)转发到ServletDispatcher对应的xml配置文件,一般是包含视图解析器和扫描spring注解component-scan,视图解析器属于springmvc,扫描spring注解属于spring。视图解析器只有在controller返回ModelAndView,需要打开jsp页面时定位jsp页面使用,如果controller返回值字符串String和类对象,前端直接显示,没用。扫描spring注解component-scan主要是扫描@Controller @Service @Repository,使controller service entity 不再 applicationContext.xml / servlet-Dispatcher.xml 中配置,还是用@Autowired/@Resource 自动注入,不再需要setter-getter,主要是controller service
第二个配置文件,spring的配置文件,数据库连接四个常量 + MapperScan + Mapper.xml 路径
附3: mvc:annotation-driven和context:annotation-config/
前者 mvc:annotation-driven 在web.xml中DispatcherServlet指定的配置文件,标志启动注解驱动, 是spring MVC为@Controllers分发请求所必须的,需要写。
后者在web.xml中的contextConfigLocation指定的配置文件中,当使用 context:component-scan/ 后,就可以将 context:annotation-config/ 移除了。
附4:Spring和SpringMVC的父子关系
Spring和SpringMVC的容器具有父子关系,Spring容器为父容器,SpringMVC为子容器,子容器可以引用父容器中的Bean,而父容器不可以引用子容器中的Bean。所以,可以在@Controller中注入@Service,@Component,@Repository等Bean,但是反过来就不行。
@Service,@Repository,@Component为什么要与@Controller要分开配置扫描。在SpringMVC的配置文件中扫描Controlller Bean(@Controller),在Spring的配置文件中扫描除了Controller的其他Bean(如@Service,@Repository,@Component等)。
1、极端:仅使用Spring扫描所有的bean,不可以
SpringMVC在匹配Controller与url的映射关系时只会在自己的上下文中查找Controller进行请求的处理。由于所有Controller的都在Spring容器中,SpringMVC找不到Controller对象,报404错误。(另外,此时的@Controller Bean可以注入@Service Bean中,因为两者都在Spring容器中,@Controller Bean可以被Spring注入)
2、第一个极端修改:Spring扫描所有Bean,SpringMVC扫描@Controller Bean,可以
没有问题,Controller与URL正常映射。此外,@Service Bean可以注入@Controller Bean(来自Spring容器非SpringMVC容器)。
3、极端:仅使用SpringMVC扫描所有的bean,可以
这就是自家项目的配置方法,使用上完全没有问题。所以我们项目中根本没有使用Spring的容器,而是用的SpringMVC的容器。(我们的项目就是用是springmvc扫描所有spring注解,不包括@Mapper,它是ibatis注解)
所以,分开扫描的好处是便于扩展,如果要是项目需要加入Struts等可以整合进来,分开配置可以使SpingMVC和Struts都使用可使用Spring中的Bean。若只使用SpringMVC扫描,那么Struts中无法使用SpringMVC中的Bean。
附5:@Controller 和 @RestController
@Controller @RequestBody @RestController 三个都是spring注解,由于后端更多的是返回数据而不是页面跳转,所有@RestController出现了
@RestController注解相当于@ResponseBody + @Controller合在一起的作用。
1.使用@Controller 注解,在对应的方法上,视图解析器可以解析return 的jsp,html页面,并且跳转到相应页面;若返回json等内容到页面,则需要加@ResponseBody注解。
@CrossOrigin
@Controller
public class FileUploadController {
//跳转到上传文件的页面
@RequestMapping(value="/gouploadimg", method = RequestMethod.GET)
public String goUploadImg() {
//跳转到 templates 目录下的 uploadimg.html
return “uploadimg”;
}
//处理文件上传
@RequestMapping(value="/testuploadimg", method = RequestMethod.POST)
public @ResponseBody String uploadImg(@RequestParam(“file”) MultipartFile file,
HttpServletRequest request) {
System.out.println(“调用文件上传方法”);
String contentType = file.getContentType();
String fileName = file.getOriginalFilename();
2.@RestController注解,相当于@Controller+@ResponseBody两个注解的结合,返回json数据不需要在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面。
@CrossOrigin
@RestController /* @Controller + @ResponseBody*/
public class HospitalController {
//注入Service服务对象
@Autowired
private HospitalService hospitalService;
/**
* 查询所有医院信息(未分页)
*/
@RequestMapping(value = “findAllHospital”,method = RequestMethod.GET)
public List findAllHospital(){
List hospitalList= hospitalService.findAllHospital();
return hospitalList;
}
附6:@GetMapping和@RequestMapping
@GetMapping @PostMapping @RequestMapping 三个都是spring注解
@GetMapping用于将HTTP get请求映射到特定处理程序的方法注解
具体来说,@GetMapping是一个组合注解,是@RequestMapping(method = RequestMethod.GET)的缩写。
@PostMapping用于将HTTP post请求映射到特定处理程序的方法注解
具体来说,@PostMapping是一个组合注解,是@RequestMapping(method = RequestMethod.POST)的缩写。
@GetMapping("/getRule")
public Rule getRule(){
Rule rule=new Rule(" @GetMapping",“404”);
return rule;
}
@RequestMapping(method = RequestMethod.GET ,value = “/getRule2”)
public Rule getRule2(){
Rule rule=new Rule("@RequestMapping(method = RequestMethod.GET ",“404”);
return rule;
}
springboot 在约定优于配置理念下,是 springframework 的脚手架,快速高效的构建应用。
springboot starter-web的jar,会自动内置一个tomcat,不再需要配置tomcat了。
注意1:构建springboot项目之前,配置好全局maven。idea 配置全局默认maven ,File/Other Settings/Default Settings…/Maven, File/Settings/Maven 只能配置当前项目的maven,新建springboot项目要先配置好默认的Maven相关,因为在新建springboot项目的时候无法配置。
注意2:构建springboot项目开始:idea新建springboot项目的时候,可以使用 https://start.aliyun.com/ 或者 https://start.spring.io 或者 http://start.spring.io ,笔者这里使用 http://start.spring.io 。
注意3:启动Springboot项目报错:IDEA运行Springboot报错,找不到org.springframework.context.ConfigurableApplicationContext类,可删除本地〜/ .m2 / repository / org / springframework下的文件夹并运行。
Springboot是一个依赖优于配置理论的产物,主要包括四个约定。
1、只要依赖spring-boot-starter-web的jar包,就会自动内置一个tomcat容器(可以替换)
2、项目结构的约定
3、默认提供配置文件application.properties
4、spring-boot-starter-web的jar包提供自动依赖/启动依赖,如果是一个webstarter,默认认为你是构建一个spring mvc的应用
像上面的springboot的项目一样,自带tomcat容器,不需要额外提供,值得注意的是,springboot只是模式tomcat服务器,可以替换,一般来说,springboot可以支持四种服务器,分别是 tomcat jetty Undertow Reactor,其中,前三种是Servlet服务器,最后一种是Reactive 服务器。
springboot第二个约定,提供一个同一个项目结构,源工程均是src/main/java
resources资源目录下两个目录一个文件,static目录存放前端静态文件,templates目录存放前端模板(static中放静态页面html,而templates中放动态页面jsp),application.properties用于全局常量配置
其中,static目录存放前端静态文件,templates目录存放前端模板,application.properties存放全局常量配置信息。
在springboot项目中,仅依赖spring-boot-starter-web这个jar包,但是却可以完成整个web操作,这是因为其他的jar包依赖都使用 spring-boot-starter-web 自动依赖了,并且都已经匹配上正确的版本,不需要程序员关心。
在使用springboot项目的时候,我们再也不用担心少导入的哪个依赖,或者依赖之间的版本匹配问题了,spring-boot-starter-web的自动依赖也是它的一个约定。
在springboot中,只要是使用了spring-boot-starter-web,就默认你是一个spring mvc应用,把需要的依赖自动配置给你了。
UserMapper.xml尽量放在resources目录下,如果放在src/main/java/com/example/demo/dao/mappers 源码目录下,默认是不会被打包的,放在resources目录下,要在application.properties文件中指定一下。
注意,一般404都是controller这里的GetMapping错了。
启动类中为什么要配置@ComponentScan注解:因为springboot只扫描启动类所在包及其子包下面的注解,该项目中启动类在com.example.demo下面,可以去掉@Component(“com.example.demo”)这个注解,如下:
启动类中为什么要配置@MapperScan注解:@ComponentScan 只能扫描指定目录下spring中的注解,要扫描ibatis中的@Mapper注解,所以这里使用@MapperScan
spring +springmvc+mybatis | springboot +mybatis | |
---|---|---|
web.xml | 指定contextConfigLocation和DispatcherServlet配置文件 | 没有web.xml文件,没有DispatcherServlet配置文件,没有contextConfigLocation配置文件 |
视图解析器 | 在DispatcherServlet配置文件中 | 没有视图解析器 |
spring注解扫描器 | 本项目在DispatcherServlet配置文件中(也可以让springmvc扫描Controller,spring扫描service component/repository) | spring注解扫描在启动类中 |
数据库四个属性 | contextConfigLocation配置文件中 | application.properties文件中 |
Mapper类扫描 | contextConfigLocation配置文件中 | mapper注解扫描在启动类中 |
Mapper.xml | contextConfigLocation配置文件中 | application.properties文件中 |
回答:两种方式,static和templates
新建springboot工程,导入thymeleaf依赖
四种方式
注意,controller的方法名尽量不要与页面名称重合,比如这里,都加上了say前缀,sayhello sayhello2 sayhello3 sayhello4
方式1运行成功:
Springboot是Spring的脚手架,完成对Spring封装,使后台开发更加高效。
spring工程代码:https://download.csdn.net/download/qq_36963950/12552110
springboot工程代码:https://download.csdn.net/download/qq_36963950/12552116
springboot页面跳转工程代码:https://download.csdn.net/download/qq_36963950/12552737