SpringWeb
之前javaEE开发中,web层使用的原生的Servlet, 弊端: 类中只提供doGet/doPost方法, 接收参数很麻烦 ,响应数据也很麻烦(java对象转为json格式)
spring中的web模块就可以解决以上存在的问题
SpringWEB 组件
前端控制器:DispatcherServlet(不需要程序员开发),由框架提供,在web.xml 中配置。作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求.处理器映射器:HandlerMapping(不需要程序员开发),由框架提供。作用:根据请求的 url 查找 Handler(处理器/Controller)处理器适配器:HandlerAdapter(不需要程序员开发),由框架提供。作用:按照特定规则(HandlerAdapter 要求的规则)去执行 Handler。处理器:Handler(也称之为 Controller,需要工程师开发)。注意:编写 Handler 时按照 HandlerAdapter 的要求去做,这样适配器才可以去正确执行 Handler。作用:接受用户请求信息,调用业务方法处理请求,也称之为后端控制器。
搭建 SpringWeb
导包
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.2.RELEASE</version></dependency>
配置 DispatcherServlet
在 web.xml 文件中配置 DispatcherServlet配置 spring 核心请求分发器<servlet><servlet-name>application</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring.xml</param-value></init-param><load-on-startup>0</load-on-startup></servlet><!-- 请求映射 --><servlet-mapping><servlet-name>application</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
开启 SpringWEB 注解
开启 springweb 注解<mvc:annotation-driven></mvc:annotation-driven>
接收请求
@RequestMapping@RequestMapping 是一个用来为处理器地址映射的注解,可用于类或方法上.作用在类上,在整个项目中不能重复,作用在方法上,整个类中不能重复.常用属性 path,value,method.path 和 value 用来定义地址method 用来定义请求方式@RequestMapping(value = "/hello",method = RequestMethod.GET)@RequestMapping(path= "/hello",method = RequestMethod.POST)
获取请求数据
Spring WEB 支持对多种类型的请求参数进行封装 自定义的处理器 @RestController 为web层类添加的注解标签 @RequestMapping 为类和方法配置映射访问地址,类地址在项目中不能重复 */ @RestController @RequestMapping(path = "/api/loginCtl") public class LoginController { @Autowired private LoginService loginService; /* @RequestMapping(path = "/login")为方法定义地址时,可以指定请求方式 @RequestMapping(path = "/login",method = RequestMethod.POST)意味着只能通过post方法获取请求 也可以通过@PostMapping(path = "/login") @GetMapping(path = "/login") 这两种方式,去直接对访问方式进行限制 */ /* 接收方式1:使用HttpServletRequest对象接收请求中的数据 @PostMapping(path = "/login") public String login(HttpServletRequest request){ System.out.println(request.getParameter("name")); System.out.println(request.getHeader("token")); System.out.println(request.getRemoteAddr()); return "success"; } */ /*方式2:通过定义参数名的方式接收请求中的数据 @PostMapping(path = "/login") public String login(String account,String password,@RequestHeader("token") String token) { System.out.println(account); System.out.println(password); System.out.println(token); return "success"; } */ //方式3:当请求中的参数名与形参不一样时,我们利用注解的方式将请求中的参数与形参进行绑定 /* @PostMapping(path = "/login") public String login(@RequestParam("user-accout") String account, @RequestParam("user-password") String password, @RequestHeader("user-token") String token) { System.out.println(account); System.out.println(password); System.out.println(token); return "success"; } */ /*方式4:后端接收前端提交的json格式的数据: 1.项目中需要添加json转换的组件 2.在对象前添加@RequestBody的注解 */ @PostMapping(path = "/login") public Result login(@RequestBody Admin admin){ Result result = new Result(200,"登陆成功",admin); System.out.println("yes"); return result; } @GetMapping(path = "/test") public String test(){ System.out.println("test"); return "success"; }
拦截器
Spring WEB 中的拦截器(Interceptor)类似于 Servlet 中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。Spring 中的拦截器与过滤器有着本质的区别,过滤器是 servlet 规范中定义并实现的,在进入到 servlet 之前截获请求.而拦截器是 spring 中定义的一种拦截机制,是对进入到处理器的请求进行拦截.SpringWEB 定义了拦截器接口 HandlerInterceptorboolean preHandle预处理方法,实现处理器方法的预处理,就是在处理器方法执行之前这个方法会被执行,相当于拦截了处理器方法,框架会传递请求和响应对象给该方法,第三个参数为被拦截的处理器。如果 preHandle 方法返回 true 表示继续流程(如调用下一个拦截器或处理器方法),返回 false 表示流程中断,不会继续调用其他的拦截器或处理器方法,此时我们需要通过 response 来产生响应;
拦截器实现
编写一个类,继承 HandlerInterceptorAdapterpublic class DemoInterceptor implements HandlerInterceptor{/*当请求到达控制器之前被执行true--继续向下执行,到达下一个拦截器,或控制器false--不会继续向下执行*/public boolean preHandle(HttpServletRequest request, HttpServletResponseresponse, Object handler)throws Exception {System.out.println("之前执行");return false;}
注册拦截器
<!-- 配置拦截器 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/><!-- 配置所有请求进入到此拦截器 --> <mvc:exclude-mapping path="/api/loginCtl/login"/><!-- 配置不进入拦截器的地址 --> <bean></bean><!-- 配置拦截器的实现类 --> </mvc:interceptor> </mvc:interceptors>
拦截器具体实现
发送post请求


由于定义过 <mvc:exclude-mapping path="/api/loginCtl/login"/><!-- 配置不进入拦截器的地址 -->,则该请求不会进入拦截器
因此后端会接收到:


同理在发送Get请求给“test”地址时,则会出现
