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"地址时,则会出现

相关推荐
写代码的【黑咖啡】2 小时前
Python 中的 Gensim 库详解
开发语言·python
TTBIGDATA3 小时前
【Hue】Ambari 页面启动 Hue 失败 user ‘hadoop‘ does not exist
java·hadoop·ambari
饺子大魔王的男人4 小时前
Remote JVM Debug+cpolar 让 Java 远程调试超丝滑
java·开发语言·jvm
兩尛10 小时前
c++知识点2
开发语言·c++
fengfuyao98510 小时前
海浪PM谱及波形的Matlab仿真实现
开发语言·matlab
xiaoye-duck10 小时前
C++ string 底层原理深度解析 + 模拟实现(下)——面试 / 开发都适用
开发语言·c++·stl
Hx_Ma1611 小时前
SpringMVC框架提供的转发和重定向
java·开发语言·servlet
期待のcode12 小时前
原子操作类LongAdder
java·开发语言
舟舟亢亢12 小时前
Java集合笔记总结
java·笔记