spring-boot-starter-web 是SpringBoot对Web开发的支持,主要包括了RESTful参数的传递、实体类参数的校验等。接下来的内容将对Web开进行介绍。
- 对Json天然的支持
- 新建一个spring-boot-web,使用打开idea,右键New --> Project。(当然,你们也可以选择其他方式创建项目,上篇SpringBoot有详细介绍)
- 填写好包名以及项目名。
- 加入spring-boot-web的依赖包。
我的包结构如下图:
- 在domain包下新建一个实体类 User,User 信息如下:
public class User {
private String name;
private int age;
private String pass;
此处省略get、set方法...
}
- 在controller包下新建一个类 UserController ,在类中创建一个方法返回 User,如下:
@RestController
@RequestMapping(value = "/user")
public class UserController {
@RequestMapping(value = "/getUser")
public List<User> getUser(){
User user = new User();
user.setName("Java");
user.setAge(24);
user.setPass("999999");
return user;
}
}
- 在 Test 包下新建 WebControllerTest 测试类,对 getUser() 方法进行测试。
@SpringBootTest
public class WebControllerTest {
private MockMvc mockMvc;
@Before
public void setUp(){
mockMvc = MockMvcBuilders.standaloneSetup(new UserController()).build();
}
@Test
public void getUserController() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.post("/user/getUser")).andDo(print());
}
}
返回结果:
{"name":"Java","age":24,"pass":"999999"}
SpringBoot自动将对象转换成Json格式进行返回,对Json具有天然的支持,无需通过工具类转换。
RESTful 请求传参
- 在UserController中新建一个getParameterUser方法,返回User的Json对象
@RequestMapping(value = "/getUser2/{name}", method = RequestMethod.GET)
public User getParameterUser(@PathVariable String name){
User user = new User();
user.setName(name);
return user;
}
打开浏览器访问:http://localhost:8099/user/getParameterUser/药岩
注意:
- 我这返回的是树形结构的Json对象,是因为安装了谷歌插件JSON-handle。
- 我这使用的是8099端口,可以在配置文件中配置application.yml(把application.properties修改为application.yml,个人喜好)
server:
port: 8099
- 我这里使用的是method = RequestMethod.GET 的get提交方式,如果这里写成POST提交,则会报 Request method ‘POST’ not supported
参数校验
参数校验在我们日常开发中很常见,对实体类的长度大小、是否为空、是否符合要求等校验,传统项目使用 if-else 进行一大堆逻辑繁琐的代码判断使用 @Valid + BindingResult 就可以优雅地解决这些问题。
- 在之前的User实体类中进行参数校验
@NotEmpty(message = "姓名不能为空")
private String name;
@Max(value = 120, message = "年龄不能超过120岁")
@Min(value = 18, message = "年龄不能小于18岁")
private int age;
@NotEmpty(message = "密码不能为空")
@Length(min = 6, message = "密码长度不能小于六位")
private String pass;
- 在UserController中新建saveUser方法,使用 @Valid + BindingResult,校验后如果有错误将错误打印出来。
@RequestMapping(value = "/saveUser")
public User saveUser(@Valid User user, BindingResult result){
//判断是否有异常
if (result.hasErrors()){
List<ObjectError> objectErrors = result.getAllErrors();
for (ObjectError error : objectErrors){
System.out.println(error.getCode() + "_" + error.getDefaultMessage());
}
}
return user;
}
- 在之前的WebControllerTest类中进行测试
@SpringBootTest
public class WebControllerTest {
private MockMvc mockMvc;
@Before
public void setUp(){
mockMvc = MockMvcBuilders.standaloneSetup(new UserController()).build();
}
@Test
public void saveUser() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.post("/user/saveUser")
.param("name", "devin")
.param("age", "130")
.param("pass", "123"))
.andDo(print());
}
}
打印效果:
Max_年龄不能超过120岁
Length_密码长度不能小于六位
自定义 Property
在Web开发中经常需要要自定义的配置文件,如下详细说明使用
- 在配置 application.yml 中配置如下:
coin:
name: 药岩
description: 热爱生活、分享技术
- 在comm包中新建NeoProperties 类,通过@Value("${}") 赋予配置文件的值
@Component
public class NeoProperties {
@Value("${coin.name}")
private String name;
@Value("${coin.description}")
private String description;
此处省略get、set方法...
}
- 在Test报下新建PropertiesTest 测试类
@RunWith(SpringRunner.class)
@SpringBootTest
public class PropertiesTest {
@Resource
private NeoProperties neoProperties;
@Test
public void setNeoProperties(){
System.out.println("coin.name:" + neoProperties.getName());
System.out.println("coin.description:" + neoProperties.getDescription());
}
}
打印如下:
coin.name:药岩
coin.description:热爱生活、分享技术
自定义Filter
项目中我们常常通过Filter来记录日志请求、权限验证等。
自定义 Filter 两个步骤:
- 新建自定义Filter,实现Filter接口和方法
- 将自定义Filter添加到过滤链中,添加@Configuration注解
代码实现:
- 在comm包下新建MyFilter类,实现Filter方法
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
//打印输出请求地址和请求参数
System.out.println("this is MyFilter url:" + httpServletRequest.getRequestURI() + "{} Paramer: " + httpServletRequest.getParameter("name"));
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {}
}
- 在comm包下,新建WebConfiguration 类,将自定义MyFilter 添加到过滤链中,添加@Configuration 注解
@Configuration
public class WebConfiguration {
@Bean
public RemoteIpFilter remoteIpFilter(){
return new RemoteIpFilter();
}
@Bean
public FilterRegistrationBean filterRegistrationBean(){
FilterRegistrationBean registration = new FilterRegistrationBean();
//将自定义MyFilter 添加到过滤链中
registration.setFilter(new MyFilter());
registration.addUrlPatterns("/*");
registration.addInitParameter("paramName", "paramValue");
registration.setName("MyFilter");
registration.setOrder(1);
return registration;
}
}
测试:随便访问之前的请求地址都会打印出URL和请求参数。
打开浏览器访问:http://localhost:8099/user/getParameterUser?药岩
控制台打印:
this is MyFilter url:/user/getParameterUser/药岩{} Paramer: 药岩
看到最后的都是人才,喜欢记得点赞哦!不然白嫖我了❤