SpringBoot快速体验Web开发(二)

spring-boot-starter-web 是SpringBoot对Web开发的支持,主要包括了RESTful参数的传递、实体类参数的校验等。接下来的内容将对Web开进行介绍。

  • 对Json天然的支持
  1. 新建一个spring-boot-web,使用打开idea,右键New --> Project。(当然,你们也可以选择其他方式创建项目,上篇SpringBoot有详细介绍)
    在这里插入图片描述
  2. 填写好包名以及项目名。
    在这里插入图片描述
  3. 加入spring-boot-web的依赖包。
    在这里插入图片描述
    我的包结构如下图:
    springboot包结构
  4. 在domain包下新建一个实体类 User,User 信息如下:
public class User {
    
    private String name;
    private int age;
    private String pass;

    此处省略get、set方法...
}
  1. 在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;
    }
}
  1. 在 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 请求传参

  1. 在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 就可以优雅地解决这些问题。

  1. 在之前的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;
  1. 在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;
    }
  1. 在之前的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开发中经常需要要自定义的配置文件,如下详细说明使用

  1. 在配置 application.yml 中配置如下:
coin:
  name: 药岩
  description: 热爱生活、分享技术
  1. 在comm包中新建NeoProperties 类,通过@Value("${}") 赋予配置文件的值
@Component
public class NeoProperties {

    @Value("${coin.name}")
    private String name;
    @Value("${coin.description}")
    private String description;
	
	此处省略get、set方法...
}
  1. 在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 两个步骤:

  1. 新建自定义Filter,实现Filter接口和方法
  2. 将自定义Filter添加到过滤链中,添加@Configuration注解

代码实现:

  1. 在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() {}
}
  1. 在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: 药岩

看到最后的都是人才,喜欢记得点赞哦!不然白嫖我了❤

发布了15 篇原创文章 · 获赞 32 · 访问量 6326

猜你喜欢

转载自blog.csdn.net/CSDN_Qiang17/article/details/104029942