目录
一.SpringWeb 概述
二.SpringWEB 特点
1.SpringWEB 是 spring 家族原生产品,与 IOC 容器等基础设施无缝对接. |
2.基于原生的 Servlet,提供了一个前端控制器 DispatcherServlet ,开发者无须额外开发控制器对象. |
3.可以自动绑定用户输入,并正确地转换数据类型. |
4.代码清新简洁,大幅度提升开发效率. |
5.内部组件化程度高,可插拔式组件即插即用. |
6.性能卓著,尤其适合现代大型、超大型互联网项目要求. |
三.SpringWEB 运行流程
1.用户发送出请求到前端控制器 DispatcherServlet。 |
2.DispatcherServlet 收到请求调用 HandlerMapping(处理器映射器)。 |
3.HandlerMapping 找到具体的处理器(可查找 xml 配置或注解配置),生成处理器对象及处理器拦截器(如果有),再一起返回给 DispatcherServlet。
|
4.DispatcherServlet 调用 HandlerAdapter(处理器适配器)。 |
5.HandlerAdapter 经过适配调用具体的处理器(Handler/Controller)。 |
6.Controller 执行完成向前端响应结果。 |
运行流程图如下所示:
四.SpringWEB 组件
处理 | 作用 | |
前端控制器 | DispatcherServlet(不需要程序员开发),由框架提供,在web.xml 中配置。 | 统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求. |
处理器映射器 | HandlerMapping(不需要程序员开发),由框架提供。 | 作用:根据请求的 url 查找 Handler(处理器/Controller) |
处理器适配器 | HandlerAdapter(不需要程序员开发),由框架提供。 | 按照特定规则(HandlerAdapter 要求的规则)去执行 Handler。 |
处理器 |
Handler
(也称之为 Controller,需要工程师开发)。
注意:编写 Handler 时按照 HandlerAdapter 的要求去做,这样适配器才可以去正确执行Handler。
| 接受用户请求信息,调用业务方法处理请求,也称之为后端控制器。 |
五.搭建 SpringWeb
1.导包
< dependency >< groupId >org.springframework</ groupId >< artifactId >spring-webmvc</ artifactId >< version >5.2.2.RELEASE</ version ></ dependency >
2.配置 DispatcherServlet
< 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 >
3.开启 SpringWEB 注解
< mvc :annotation-driven ></ mvc :annotation-driven >
4.处理器类搭建
@RestController 用于标记在一个类上,使用它标记的类就是一个 SpringWEB控制器类 .Spring 配置中指定了自动扫描的 basepackage 后,Spring 会扫描这些包以及子包中的使用@RestController 标识的类,然后将类加入到 Spring IOC 容器中,注入依赖。
/* @RestController 让spring扫描 ,并创建管理对象
@RequestMapping(path = "/loginCtl")为类和方法定义地址,在类和方法上定义地址不能重复
在同一个类中,方法不能重名,但在两个或多个类时,不同的类的方法可以重名
*/
@RestController
@RequestMapping(path = "/loginCtl")
/*LoginController 为自定义请求处理器(serive包下的类) 为处理器类和方法定义访问地址*/
public class LoginController {
}
六.接收请求
1.@RequestMapping
@RequestMapping(value = "/hello",method = RequestMethod.GET)
@RequestMapping(path= "/hello",method = RequestMethod.POST)
2.获取请求数据
Spring WEB 支持对多种类型的请求参数进行封装
(1)使用 request 对象接收
@GetMapping(path = "/test")
public void tset(HttpServletRequest request){
System.out.println(request.getParameter("num"));
}
(2)spring 自动封装
@RequestMapping("/save")
public void save(String userName,Integer age){
}
(3)当请求参数名与形参名不一致时
可以使用@RequestParam("")进行参数绑定.(前端的一个属性名为“userName”,后端则为“name”,用@RequestParam进行参数绑定,就能接收到了)
@RequestMapping("/save")
public void save(@RequestParam("userName") String name,
@RequestParam("userAge") Integer age){
}
@RequestMapping("/save")
public void save(@RequestParam(value = "userName") String name){
}
(4)使用实体类对象接收
@RequestMapping("/save")
public void save(@RequestBody Admin admin){
}
<!--jackson-->< dependency >< groupId >com.fasterxml.jackson.core</ groupId >< artifactId >jackson-databind</ artifactId >< version >2.13.3</ version ></ dependency >
(5)日期类型转换
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
@RequestMapping(path = "/login",method = RequestMethod.POST)
public Result login(@RequestBody Admin admin){
Result result = new Result(200,"登录成功",admin1);
return result;
}
响应结果:
七.拦截器
boolean preHandle预处理方法,实现处理器方法的预处理,就是在处理器方法执行之前这个方法会被执行,相当于拦截了处理器方法,框架会传递请求和响应对象给该方法,第三个参数为被拦截的处理器。如果 preHandle 方法返回 true 表示继续流程(如调用下一个拦截器或处理器方法),返回 false 表示流程中断,不会继续调用其他的拦截器或处理器方法,此时我们需要通过 response 来产生响应;
在spring.xml上注册拦截器
<!--配置拦截器-->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/> <!--定义进入拦截器的地址-->
<mvc:exclude-mapping path="/loginCtl/login"/> <!--定义不进入拦截器的地址-->
<bean id="admintoken" class="com.ffyc.ssm.interceptor.AdminTokenInterceptor"></bean> <!--拦截器实现类-->
</mvc:interceptor>
</mvc:interceptors>
代码实现:
定义一个AdminTokenInterceptor 拦截器类并实现HandlerInterceptor接口,preHandle方法是重写的方法,如果前端传回来的adminToken与后端的一致则token验证成功,否则返回验证失败,else里返回错误信息。
package com.ffyc.ssm.interceptor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ffyc.ssm.model.Result;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
/*
拦截器处理方法
当请求到达处理器前 进入到拦截器进行处理
返回true---离开拦截器向后执行到达处理器
返回false--不再向后执行
* */
public class AdminTokenInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String adminToken =request.getHeader("adminToken");
System.out.println(adminToken);
if(adminToken.equals("123456789")){
return true;
}else{
//向前端做出响应
Result result=new Result(401,"token验证失败",null);
/*与JavaEE一样的打印操作*/
ObjectMapper objectMapper = new ObjectMapper();
String s = objectMapper.writeValueAsString(result);
PrintWriter writer = response.getWriter();
writer.write(s);
}
return false;
}
}
今天分享就到这里,感谢大家的浏览,制作不易,记得一件三连哦!!!