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 定义了拦截器接口 HandlerInterceptor
boolean preHandle
预处理方法,实现处理器方法的预处理,就是在处理器方法执行之前这个方法会
被执行,相当于拦截了处理器方法,框架会传递请求和响应对象给该方法,第三
个参数为被拦截的处理器。如果 preHandle 方法返回 true 表示继续流程(如调
用下一个拦截器或处理器方法),返回 false 表示流程中断,不会继续调用其他
的拦截器或处理器方法,此时我们需要通过 response 来产生响应;

拦截器实现

编写一个类,继承 HandlerInterceptorAdapter
public class DemoInterceptor implements HandlerInterceptor{
/*
当请求到达控制器之前被执行
true--继续向下执行,到达下一个拦截器,或控制器
false--不会继续向下执行
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse
response, Object handler)throws Exception {
System.out.println("之前执行");
return false;
}

注册拦截器

复制代码
<!--  配置拦截器  -->
    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/><!-- 配置所有请求进入到此拦截器 -->
            <mvc:exclude-mapping path="/api/loginCtl/login"/><!-- 配置不进入拦截器的地址 -->
            <bean id="Interceptor" class="com.example.ssm.interceptor.TokenInterceptor"></bean><!-- 配置拦截器的实现类 -->
        </mvc:interceptor>
    </mvc:interceptors>

拦截器具体实现

发送post请求

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

因此后端会接收到:

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

相关推荐
、BeYourself几秒前
Scala 数据类型
开发语言·后端·scala
重生之后端学习7 分钟前
136. 只出现一次的数字
开发语言·算法·leetcode·职场和发展·深度优先
啊唯不困14 分钟前
AI智能应用开发(Java)起点-终点 -1、java的前世今生andJava环境配置、jdk下载,以及Idea下载和基本应用
java·开发语言·intellij-idea
_muffinman16 分钟前
Java学习笔记-第2章 运算和语句
java·笔记·学习
荒夜长歌17 分钟前
传统java行业跳槽面试汇总(后续会更新)
java·面试·跳槽
旷世奇才李先生18 分钟前
065智慧农业专家远程指导系统-springboot+vue
java·vue.js·spring boot
大迪deblog18 分钟前
系统架构设计-软件架构风格
java·开发语言·架构·软件构建
盐水冰19 分钟前
【烘焙坊项目】后端搭建(10) - 地址簿功能&用户下单&微信支付
java·数据库·后端
csbysj202020 分钟前
Bootstrap 弹出框
开发语言
重庆小透明22 分钟前
【面试问题】java小厂
java·开发语言·面试