Spring Boot 控制层

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot 控制层相关的知识,希望对你有一定的参考价值。

Spring Boot 控制层

1.无注解获取参数

@RequestMapping("/test1")
    public Student test1(Integer id ,String name){
        Student s = new Student();
        s.setId(id);
        s.setName(name);
        return s;
}

2.HttpServletRequest的getParameter方法

@RequestMapping("/test2")
    public Student test2( HttpServletRequest request ) {
        Integer id = Integer.parseInt( request.getParameter("id") ); // 转换一下(没有判断空串或null)
        String name = request.getParameter("name");
        return new Student(id,name);
    }

3.实体类封装

@RequestMapping("/test3")
    public Student test3( Student s ) {
        return s;
}

类的属性名和http参数要一致。

  1. @RequestParam
@RequestMapping("/test4")
    public Student test4( @RequestParam(value="stu_id") Integer id,
                          @RequestParam(value="stu_name",required=true,defaultValue = "何浩") String name) {
        Student s=new Student();
        s.setId(id);
        s.setName(name);
        return s;
    }

5.前端传递数组

@RequestMapping(value = "/test5")
    public Integer[] test5( @RequestParam(value = "ids") Integer[ ] ids ) {
        return ids;
    }


@RequestMapping(value = "/test6")
    public List<Integer> test6( @RequestParam(value = "ids") List<Integer> ids ) {
        return ids;
    }

在这里插入图片描述

6.使用 @PathVariable 获取参数

@RequestMapping("/test7/{id}/{name}")
    public Student test5( @PathVariable(value = "id") Integer id,
                          @PathVariable(value = "name") String name) {
        Student s=new Student();
        s.setId(id);
        s.setName(name);
        return s;
    }

//http://localhost:8080/test7/123/herio

7.使用 @RequestBody 获取参数

@PostMapping( value = "/test8")
    public Map<String,Object> test6(@RequestBody Map<String,Object> map) {
        return map;
    }

在这里插入图片描述


8.前端传递对象数组

@PostMapping( value = "/test9")
    public List<Student> test9(@RequestBody List<Student> list) {
        Iterator it = list.iterator();
        while (it.hasNext()){
            Student s=(Student)it.next();
            System.out.println(s.getId()+":"+s.getName());
        }
        return list;
    }

在这里插入图片描述


9.获取格式化参数

@RequestMapping(value = "/test10")
    public String test7( @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") Date date,
                         @NumberFormat(pattern = "#,###.#") BigDecimal price) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        String s_date = sdf.format(date); //日期格式化
        DecimalFormat df = new DecimalFormat("¥#,###.##"); //保留两位小数
        String s_price=df.format(price); //数字格式化
        return "今天("+s_date+")的价格是:"+s_price;
    }

在这里插入图片描述


10.创建过滤器

@WebFilter("/*")
public class MyFilter  implements Filter {
    private List<String> IPList=new ArrayList<>();
    @Override
    public void init(FilterConfig filterConfig) throws ServletException { //过滤器初始化
        IPList.add("127.0.0.1"); // 本机地址
        IPList.add("0:0:0:0:0:0:0:1"); // IPv6 的本机地址,本机默认是这个地址
    }
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        String ip = request.getRemoteAddr(); // 获得客户端 ip 地址
        System.out.println(ip); //控制台上查看一下
        if( IPList.contains(ip) ){
            response.setContentType("text/html;charset=utf-8"); //设置响应的字符集(避免中文乱码)
            response.getWriter().println("你已被列入黑名单!");
        }
        else{
            chain.doFilter(request,response); //放行
        }
    }
}

启动类上加注解

@ServletComponentScan

在这里插入图片描述


11.创建拦截器

拦截器类MyInterceptor

public class MyInterceptor implements HandlerInterceptor {
    //声明日志对象
    private final Logger log = LoggerFactory.getLogger(this.getClass());
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String ip=request.getRemoteAddr(); //获得客户端 ip 地址
        String path=request.getServletPath(); //获得客户端Servlet请求路径
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d = new Date(); //获得当前系统日期时间
        String ds = sdf.format(d); //格式化date对象
        log.info(" 时间"+ds+"    "+ip+" 访问了"+path); //  日志输出
        return true; //  放行(关键点)
    }
}

配置类中添加自己的拦截器

MyWebConfig类

@Configuration //配置类 不要掉了
public class MyWebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor( new MyInterceptor() ) //加载自定义的拦截器
                .addPathPatterns("/**") //拦截的请求路径 /** 表示所有请求
                .excludePathPatterns("/","/css/*","/images/*","/js/*"); //不拦截的请求,如首页、静态资源等
    }
}

在这里插入图片描述

时间2021-05-21 11:34:21    0:0:0:0:0:0:0:1 访问了/hello

过滤器,拦截器执行周期

在这里插入图片描述

以上是关于Spring Boot 控制层的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 控制层

Spring Boot 业务逻辑层

Spring Boot 1.5.2 控制器层测试

Spring Boot:测试控制器层时是不是应该测试验证

Spring boot:thymeleaf 没有正确渲染片段

spring boot:实现jpa+thymeleaf 用户管理