目录
5. SpringBoot Web开发
5.1 静态资源的访问
- 在我们开发Web应用的时候,需要引用大量的js、css、图片等静态资源。
- Spring Boot默认提供静态资源目录位置需置于classpath下,目录名需符合如下规则:
- /static
- /public
- /resources
- /META-INF/resources
- SpringBoot在jar类型项目中也可以开发War(web)项目
- 如访问静态图片资源:在src/main/resources/目录下创建static,在该位置放置一个图片文件。启动程序后,尝试访问http://localhost:8080/images/1.jpg。如能显示图片,配置成功。
5.2 自动返回json格式数据
package com.it.web.controller;
import com.it.model.User;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
* @ClassName HelloController
* @Author shuyy
* @Date 2020/10/25
**/
@RestController//相当于声明Controller,并提供restful风格
//@EnableAutoConfiguration//自动配置不需要写Spring配置文件
public class UserController {
@RequestMapping("user/{id}")//映射路径【restful风格】
@ResponseBody//响应体
public User userInfo(@PathVariable Integer id){
User user = new User("shu","123");
user.setId(id);
return user;
}
@RequestMapping("login")//映射路径
@ResponseBody//响应体-自动返回json格式的字符串
public Map<String,Object> login(String username,String password){
Map<String,Object> map = new HashMap<String,Object>();
//模拟从数据库查数据
if ("shu".equals(username) && "123".equals(password)){
map.put("success",1);
map.put("errMsg","");
}else {
map.put("success",0);
map.put("errMsg","用户名或密码不正确");
}
return map;
}
/*public static void main(String[] args) {
//启动程序(这里只是测试一下,以后一般不这样启动)
SpringApplication.run(HelloController.class,args);
}*/
}
5.3 捕获全局异常
- @ExceptionHandler:表示拦截异常
- @ControllerAdvice:controller 的一个辅助类,最常用的就是作为全局异常处理的切面类
- @ResponseBody:进行 json 转换
package com.it.web.exception;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.HashMap;
import java.util.Map;
/*
* @Author ShuYY
* @Description 用于捕获全局异常
* @Date 2020/10/25
**/
@ControllerAdvice//切面
public class GlobalExceptionHandler {
@ExceptionHandler(RuntimeException.class)//捕获运行时异常
@ResponseBody//返回json
public Map<String,Object> exceptionHandler(){
//异常处理方法,自定义
Map<String, Object> map = new HashMap<String, Object>();
map.put("errorCode", "101");
map.put("errorMsg", "系统错误!");
return map;
}
}
- 配置注解扫描包
- 效果
- 之前未捕获的报错
5.4 渲染Web页面
模板引擎
-
在动态HTML实现上Spring Boot依然可以完美胜任,并且提供了多种模板引擎的默认配置支持,所以在推荐的模板引擎下,我们可以很快的上手开发动态网站。
-
Spring Boot提供了默认配置的模板引擎主要有以下几种:
- Thymeleaf
- FreeMarker
- Velocity
- Groovy
- Mustache
-
Spring Boot建议使用这些模板引擎,避免使用JSP,若一定要使用JSP将无法实现Spring Boot的多种特性,具体可见后文:支持JSP的配置
-
当你使用上述模板引擎中的任何一个,它们默认的模板配置路径为:src/main/resources/templates。当然也可以修改这个路径,具体如何修改,可在后续各模板引擎的配置属性中查询并修改。
5.5 SpringBoot中使用FreeMarker
第一步:引入freeMarker的依赖包
<!--引入freeMarker的依赖包-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
第二步:写个控制器,并返回一些数据
- 写个Student实体,提供无参、有参构造、get/set、toString
- 写个StudentController
package com.it.web.controller;
import com.it.model.Student;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName StudentController
* @Author shuyy
* @Date 2020/10/25
**/
/*
@RestController 一般用于写API,给移动客户端提供数据,一般返回的是json格式的数据
@Controller 一般写后端页面时使用
*/
@Controller//这里访问freeMarker模板,不使用@RestController
@RequestMapping("stu")
public class StudentController {
@RequestMapping("list")
public String list(Model model){
//在Spring提供的model接口中存数据,在页面中取出
model.addAttribute("username","shuyy");
model.addAttribute("age",18);
List<Student> stuList = new ArrayList<>();
stuList.add(new Student(1,"shu1","男"));
stuList.add(new Student(2,"shu2","男"));
stuList.add(new Student(3,"shu3","男"));
model.addAttribute("stuList",stuList);
return "stu/list";
}
}
第三步:创建.ftl模板文件
- 在src/main/resources/创建一个templates文件夹,再在下面创建stu文件夹,创建个list.html,直接重命名为list.ftl
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
欢迎${username}登录<br>
<#if (age < 18)>未成年人请在家长的陪同下访问
<#elseif (age >= 18 && sex == "男")>欢迎帅哥访问
<#else>欢迎美女访问
</#if>
<br>
<table border="1">
<tr>
<td>ID</td>
<td>姓名</td>
<td>性别</td>
</tr>
<#list stuList as stu>
<tr>
<td>${stu.id}</td>
<td>${stu.username}</td>
<td>${stu.sex}</td>
</tr>
</#list>
</table>
</body>
</html>
- 稍微修改一下,根据id倒序输出(?sort_by(“id”)?reverse)
5.6 SpringBoot中使用jsp
第一步:创建Mavenweb项目
第二步:pom中引入依赖
<parent>
<!--SpringBoot的父依赖-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
</parent>
<dependencies>
<!--SpringBoot配置web依赖的核心组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<!--jsp解析-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>
第三步:src/main/resources下写个application.properties
- application.properties文件名固定,位置固定
spring.mvc.view.prefix=/WEB-INF/view/
spring.mvc.view.suffix=.jsp
server.port=8888
server.context-path=/test
第四步:写个简单的控制器
- 随便写点
- 效果(端口号和项目名都是我们所修改的内容)