一、使用SpringBoot编写 HelloWorld
1.创建项目
为了加深对springboot项目结构的印象,本次采用maven创建springboot项目的方式。
新建一个empty project,然后创建一个新的module
2.修改pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.qt</groupId>
<artifactId>springbootHelloWorld</artifactId>
<version>1.0-SNAPSHOT</version>
<!--继承所有springboot的父项目-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.7.RELEASE</version>
</parent>
<!--web启动器依赖-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!--添加打包插件-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.修改tomcat端口
在resource的目录下新建一个application.yml的文件,并配置tomcat端口号
4.创建启动类
/**
* 启动类
*/
@SpringBootApplication
public class SpringBootHelloWorldApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootHelloWorldApplication.class,args);
}
}
5.创建Controller
/**
* 处理请求的Controller
*/
@RestController //@Controller+@ResponsBody 直接返回json字符串,不作页面跳转
public class HelloWorldController {
@RequestMapping("helloWorld")
public String showHelloWorld(){
return "HelloWorld";
}
}
运行启动类,访问helloWorld请求
6.Spring Boot 在 Controller 中常用注解
- @RestController
@RestController 相当于@Controller+@ResponseBody 注解
如果使用@RestController 注解 Controller 中的方法无法返回页面,相当于在方法上面自动 加 了 @ResponseBody 注 解 , 所 以 没 办 法 跳 转 并 传 输 数 据 到 另 一 个 页 面 , 所 以InternalResourceViewResolver 也不起作用,返回的内容就是 Return 里的内容。 - @GetMapping
@GetMapping 注解是@RequestMapping(method = RequestMethod.GET)的缩写。即该注解只处理get请求 - @PostMapping
@PostMapping 注解是@RequestMapping(method = RequestMethod.POST)的缩写。即该注解只处理post请求 - @PutMapping
@PutMapping 注解是@RequestMapping(method = RequestMethod.PUT)的缩写。即该注解只处理put请求 - @DeleteMapping
@DeleteMapping 注解是@RequestMapping(method = RequestMethod.DELETE)的缩写。即该注解只处理delete请求
二、Spring Boot 整合 Web 层技术
1.整合 Servlet
[1]整合 Servlet 方式一
- 创建servlet
/**
* 整合Servlet方式一
*/
@WebServlet(name = "firstServlet",urlPatterns = "/first")
public class FirstServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.getWriter().print("FirstServlet...");
}
}
- 给启动类加注解
@SpringBootApplication
@ServletComponentScan //在springboot启动时会扫描@WebServlet注解,并将该类实例化
public class SpringbootwebApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootwebApplication.class, args);
}
}
[2]整合servlet方式二
- 创建servlet
/**
* 整合方式二
*/
public class SecondServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
resp.getWriter().print("SecondServlet...");
}
}
- 创建servlet配置类
@Configuration
public class ServletConfig {
/**
* 完成servlet组件的注册
*/
@Bean
public ServletRegistrationBean getServletRegistrationBean(){
ServletRegistrationBean bean = new ServletRegistrationBean(new SecondServlet());
bean.addUrlMappings("/second");//给该bean增加url
return bean;
}
}
该类也可以防止启动类中
若servlet数量较多,则推荐使用方式一
2.整合Filter
[1]整合Filter方式一
通过注解扫描完成组件注册
- 创建filter
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
/**
* 整合 Filter 方式一
*/
//@WebFilter(filterName = "FirstFilter",urlPatterns ={"*.do","*.jsp"})
@WebFilter(filterName = "FirstFilter",urlPatterns = "/first")//拦截的是first请求
public class FirstFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("进入First Filter");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("离开First Filter");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
firstservlet中只做一件事:打印FirstServlet…
- 修改启动类
@SpringBootApplication
@ServletComponentScan //在springboot启动时会扫描@WebServlet注解,并将该类实例化。filter是servlet的一个子技术,因此可以扫描@WebFilter
public class SpringbootwebApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootwebApplication.class, args);
}
}
运行后访问first
[2]整合Filter方式二
通过方法完成 Filter 组件注册
- 创建 Filter
/**
* 整合Filter方式二
*/
public class SecondFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("进入Second Filter");
filterChain.doFilter(servletRequest,servletResponse);
System.out.println("离开Second Filter");
}
@Override
public void destroy() {
}
}
- 创建 Filter 配置类
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean getFilterRegistrationBean(){
FilterRegistrationBean bean=new FilterRegistrationBean(new SecondFilter());
// bean.addUrlPatterns(new String[]{"*.do","*.jsp"});
bean.addUrlPatterns("/second");
return bean;
}
}
启动项目后,访问second
3.整合Listener
[1]整合方式一
通过注解扫描完成 Listener 组件注册
- 编写 Listener
/**
* 整合Listener
*/
@WebListener
public class FirstListiner implements ServletContextListener {
public void contextDestroyed(ServletContextEvent event){
System.out.println("Listener....destory....");
}
public void contextInitialized(ServletContextEvent event){
System.out.println("Listener....init.....");
}
}
- 修改启动类,给启动类加上@ServletComponentScan注解
@SpringBootApplication
@ServletComponentScan //在springboot启动时会扫描@WebServlet,@WebFilter,@WebListener注解,并将该类实例化。filter是servlet的一个子技术,因此可以扫描@WebFilter
public class SpringbootwebApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootwebApplication.class, args);
}
}
[2]整合方式二
通过方法完成 Listener 组件注册
- 编写Listener类
/**
* 整合方式二
*/
public class SecondListener implements ServletContextListener {
public void contextDestroyed(ServletContextEvent event){
System.out.println("SecondListener....destory....");
}
public void contextInitialized(ServletContextEvent event){
System.out.println("SecondListener....init.....");
}
}
- 编写配置类
/**
* Listener配置类
*/
@Configuration
public class ListenerConfig {
@Bean
public ServletListenerRegistrationBean getServletListenerRegistrationBean(){
ServletListenerRegistrationBean bean = new
ServletListenerRegistrationBean(new SecondListener());
return bean;
}
}
三、Spring Boot 访问静态资源
在 SpringBoot 项目中没有我们之前常规 web 开发的WebContent(WebApp),它只有src 目录。在 src/main/resources 下面有两个文件夹,static 和 templates。SpringBoot 默认在 static目录中存放静态页面,而 templates 中放动态页面。
1.static 目录
Spring Boot 通过 classpath/static 目录访问静态资源。注意存放静态资源的目录名称是 static。如HTML、CSS、JS、image等。
SpringBoot中默认的静态资源目录有四个,当然也可以自己配置。
2.templates 目录
在 Spring Boot 中不推荐使用 jsp 作为视图层技术,而是默认使用 Thymeleaf 来做动态页面。Templates 目录这是存放 Thymeleaf 的页面。
3.静态资源存放其他位置
[1]Spring Boot 访问静态资源的位置
classpath:/META‐INF/resources/
classpath:/resources/
classpath:/static/
classpath:/public/
而且访问的优先级为从上至下。
把静态文件放在resources的META‐INF/resources/、resources/、static/、public/目录下都可以被访问到。
例如
@Controller
public class PageController {
@RequestMapping("show")
public String showPage(){
return "index.html";
}
}
项目启动后,访问localhost:8080/show,如果index.html在上述四个默认位置之一,都可以被访问到。
[2]自定义静态资源位置
在application.properties文件中自定义静态资源位置
spring.resources.static-locations=classpath:/resources下目录1/,classpath:/resources下目录2/
多个静态资源目录可以用逗号隔开。
注意:一旦配置了静态资源位置,默认的4个静态资源位置都会失效。
四、Spring Boot 文件上传
1.创建项目
用idea的手脚架工具创建的一个springboot项目,依赖了Spring Web
2.编写上传页面
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="fileupload" method="post" enctype="multipart/form-data">
<input type="file" name="file"/>
<input type="submit" value="提交">
</form>
</body>
</html>
3.编写 Controller
@RestController
public class FileUploadController {
/**
* 文件上传
*/
@PostMapping("fileupload")
public String fileupload(MultipartFile file) throws IOException {
System.out.println(file.getOriginalFilename());
file.transferTo(new File("e:/"+file.getOriginalFilename()));
return "上传成功";
}
}
具体的Controller的编写和springMVC中的相同。
注意:参数(MultipartFile 参数名)。参数名要和前端页面中file的name属性一致。
4.修改上传文件大小
spring boot 中默认单个上传文件的大小为1M,可以在配置appliaction文件中修改.
#配置单个上传文件的大小的限制
spring.servlet.multipart.max-file-size=2MB
#配置在一次请求中上传文件的总容量的限制
spring.servlet.multipart.max-request-size=20MB
五、Spring Boot 整合视图层技术
1.Spring Boot 整合 JSP 技术
在springboot项目中,是不推荐使用jsp的,但是支持jsp。
[1]创建项目
[2]修改 POM 文件,添加 JSP 引擎与 JSTL 标签库
springboot内嵌了tomcat服务器,但是这个内嵌的服务器中没有jsp引擎。因此我们需要在pom文件中添加jsp引擎的依赖。
<!--添加jsp引擎,springboot中内置的tomcat没有此依赖-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<!--添加JSTL坐标依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
[3]创建 webapp 目录
在main下创建一个名为webapp的目录
[4]标记为 web 目录
配置完成后,若可以在webapp目录下出现新建jsp文件的选项,则配置成功
[5]创建 JSP
<%@ page contentType="text/html;charset=UTF-8"
language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2>Hello JSP</h2>
</body>
</html>
[6]修改配置文件,配置视图解析器
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
[7]创建 Controller
/**
* 页面跳转 Controller
*/
@Controller
public class PageController {
/**
* 页面跳转
*/
@GetMapping("/{page}")
public String getPaht(@PathVariable String page){
return page;
}
}
如果在 IDEA 中项目结构为聚合工程。那么在运行 jsp 是需要指定路径。如果项目结构为独立项目则不需要。
2.Spring Boot整合freemaker
[1]创建项目
[2]修改pom文件,添加freemarker启动器
<!--添加freemarker启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
[3]创建 Users 实体
public class Users {
private String username;
private String usersex;
private String userage;
public Users(String username, String usersex, String userage) {
this.username = username;
this.usersex = usersex;
this.userage = userage;
}
public Users() {
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getUsersex() {
return usersex;
}
public void setUsersex(String usersex) {
this.usersex = usersex;
}
public String getUserage() {
return userage;
}
public void setUserage(String userage) {
this.userage = userage;
}
}
[4]创建Controller类
@Controller
public class UserController {
@GetMapping("showUsers")
public String showUsers(Model model){
List<Users> list = new ArrayList<>();
list.add(new Users("admin","F","32"));
list.add(new Users("Lisi","M","23"));
list.add(new Users("xiaoli","F","23"));
model.addAttribute("list",list);
return "userList";
}
}
[5]创建视图
创建一个后缀名为.ftl的文件,也可以先创建html文件,页面写完后再把后缀名改为.flt
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<table border="1" align="center" width="50%">
<tr>
<th>Name</th>
<th>Sex</th>
<th>Age</th>
</tr>
<#list list as user>
<tr>
<td>${user.username}</td>
<td>${user.usersex}</td>
<td>${user.userage}</td>
</tr>
</#list>
</table>
</body>
</html>
[6]修改配置文件添加后缀
spring.freemarker.suffix=.ftl