Springweb基础知识

目录

一.SpringWeb 概述

二.SpringWEB 特点

三.SpringWEB 运行流程

四.SpringWEB 组件

五.搭建 SpringWeb

1.导包

2.配置 DispatcherServlet

3.开启 SpringWEB 注解

4.处理器类搭建

六.接收请求

1.@RequestMapping

2.获取请求数据

(1)使用 request 对象接收

(2)spring 自动封装

(3)当请求参数名与形参名不一致时

(4)使用实体类对象接收

(5)日期类型转换

 七.拦截器


一.SpringWeb 概述

       
        SpringWeb 是 Spring 框架中的一个模块,基于 Servlet API 构建的 web 框架.
        SpringWeb 是 Spring 为 web 层开发提供的一整套完备的解决方案。
        在 web 层框架历经 Strust1,WebWork,Strust2 等诸多产品的历代更选之后,目前业界普遍选择了 springWeb 作为 Java EE 项目 web 层开发的首选方案。

二.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

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 >

3.开启 SpringWEB 注解

< mvc :annotation-driven ></ mvc :annotation-driven >

4.处理器类搭建

        @RestController 用于标记在一个类上,使用它标记的类就是一个 SpringWEB控制器类 .
        Spring 配置中指定了自动扫描的 basepackage 后,Spring 会扫描这些包以及子包中的使用@RestController 标识的类,然后将类加入到 Spring IOC 容器中,注入依赖。
@RequestMapping 注解是一个用来处理请求地址映射的注解,可用于 类或方法 上。
/*  @RestController  让spring扫描 ,并创建管理对象
    @RequestMapping(path = "/loginCtl")为类和方法定义地址,在类和方法上定义地址不能重复
    在同一个类中,方法不能重名,但在两个或多个类时,不同的类的方法可以重名
*/
@RestController
@RequestMapping(path = "/loginCtl")


/*LoginController  为自定义请求处理器(serive包下的类)  为处理器类和方法定义访问地址*/
public class LoginController {

}

六.接收请求

1.@RequestMapping

        @RequestMapping 是一个用来为处理器地址映射的注解,可用于类或方法上. 作用在类上,在 整个项目中不能重复 ,作用在方法上, 整个类中不能重复 .
        常用属性:path,value,method.
        path 和 value 用来定义地址 ,method 用来定义 请求方式
@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"));
}
        在处理中如果需要使用到 HttpServletRequest 对象只需要定义即可

(2)spring 自动封装

@RequestMapping("/save")
public void save(String userName,Integer age){
}
         Spring 会自动进行数据封装,这里要注意的是,处理器接收参数的形参名称必须和表单的 name 属性保持一致,否则会接收失败!(前端的属性名和后端的必须一致

(3)当请求参数名与形参名不一致时

        可以使用@RequestParam("")进行参数绑定.(前端的一个属性名为“userName”,后端则为“name”,用@RequestParam进行参数绑定,就能接收到了)

@RequestMapping("/save")
public void save(@RequestParam("userName") String name,
@RequestParam("userAge") Integer age){
}
         表单的 name 和控制器的形参并不一致,但是@RequestParam 注解的 value
值必须和表单的 name 保持一致。
@RequestMapping("/save")
public void save(@RequestParam(value = "userName") String name){
}
        @RequestHeader("")用来接收请求中的数据.
        @RequestHeader("user-agent") 可以用来接收 请求头 中的数据

(4)使用实体类对象接收

@RequestBody 可以接收前端提交的 json 格式数据,将 json 格式封装到对象
中.(Admin为model包的一个类)
@RequestMapping("/save")
public void save(@RequestBody Admin admin){
}
        需要在pom.xml中添加 json 转换组件
<!--jackson-->
< dependency >
< groupId >com.fasterxml.jackson.core</ groupId >
< artifactId >jackson-databind</ artifactId >
< version >2.13.3</ version >
</ dependency >

(5)日期类型转换

属性类型为 Date 类型需要指定转换格式
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date birthday;
返回 JSON
        只需要方法中返回对象即可,框架可以自动将对象转为 json 响应
@RequestMapping(path = "/login",method = RequestMethod.POST)
public Result login(@RequestBody Admin admin){
Result result = new Result(200,"登录成功",admin1);
return result;
}

响应结果:

 七.拦截器

         SpringWeb中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。
        Spring中的拦截器与过滤器有着本质的区别, 过滤器 是servlet规范中定义并实现的,在进入到 servlet之前 截获请求.而拦截器是spring中定义的一种 拦截机制 ,是对进入到 处理器 的请求进行拦截.

        SpringWeb 定义了拦截器接口 HandlerInterceptor  调用这个三个方法的时候,其参数的值也是从框架内部传递进来的。
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;
    }
}

今天分享就到这里,感谢大家的浏览,制作不易,记得一件三连哦!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值