SpringWeb

SpringWeb

SpringWeb 概述

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

搭建ssm框架

早期 spring strust2 mybatis

现在 spring springweb mybatis

springweb是spring框架的一部分,是对web层进行封装,目前是企业开发中的首选

SpringWEB 特点

 SpringWEB 是 spring 家族原生产品,与 IOC 容器等基础设施无缝对接.

 基于原生的 Servlet,提供了一个前端控制器 DispatcherServlet ,开发者 无须额外开发控制器对象.

 可以自动绑定用户输入,并正确地转换数据类型.

 代码清新简洁,大幅度提升开发效率.

 内部组件化程度高,可插拔式组件即插即用.

 性能卓著,尤其适合现代大型、超大型互联网项目要

SpringWEB 运行流程

 用户发送出请求到前端控制器 DispatcherServlet。

 DispatcherServlet 收到请求调用 HandlerMapping(处理器映射器)。

 HandlerMapping 找到具体的处理器(可查找 xml 配置或注解配置),生成处 理器对象及处理器拦截器(如果有),再一起返回给 DispatcherServlet。

 DispatcherServlet 调用 HandlerAdapter(处理器适配器)。

 HandlerAdapter 经过适配调用具体的处理器(Handler/Controller)。

 Controller 执行完成向前端响应结果。

搭建 SpringWeb

导包

 <!--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 注解

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

处理器类搭建

@RestController 用于标记在一个类上,使用它标记的类就是一个 SpringWEB 控制器类.

Spring 配置中指定了自动扫描的 basepackage 后,Spring 会扫描这些包以及 子包中的使用了@RestController 标识的类,然后将类加入到 Spring IOC 容器 中,注入依赖。

@RequestMapping 注解是一个用来处理请求地址映射的注解,可用于类或方 法上。

Springweb请求流程

 用户发送出请求到前端控制器 DispatcherServlet。

DispatcherServlet 收到请求调用 HandlerMapping(处理器映射器)。

 HandlerMapping 找到具体的处理器(可查找 xml 配置或注解配置),生成处 理器对象及处理器拦截器(如果有),再一起返回给 DispatcherServlet。

DispatcherServlet 调用 HandlerAdapter(处理器适配器)。

 HandlerAdapter 经过适配调用具体的处理器(Handler/Controller)。

 Controller 执行完成向前端响应结果。

一次请求先到后端,先进入DispatcherServlet ,统一进行拦截,在调用其他程序处理,调用HandlerMapping (处理器映射器)解析请求中处理器的地址和方法地址,判断地址是否存在,不存在返回404,如果存在,判断地址有没有对应的拦截器,如果有拦截器,进入到拦截器.然后回到DispatcherServlet ,调用HandlerAdapter (处理器适配器),最终由处理器适配器调用我们自己的处理器,最后由我们自己的处理器接收数据 响应结果

SpringWEB 组件

前端控制器:DispatcherServlet(不需要程序员开发),由框架提供,在 web.xml 中配置。

作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理 用户的请求.

处理器映射器:HandlerMapping(不需要程序员开发),由框架提供。 作用:根据请求的 url 查找 Handler(处理器/Controller)

处理器适配器:HandlerAdapter(不需要程序员开发),由框架提供。 作用:按照特定规则(HandlerAdapter 要求的规则)去执行 Handler。

处理器:Handler(也称之为 Controller,需要工程师开发)。

注意:编写 Handler 时按照 HandlerAdapter 的要求去做,这样适配器才可 以去正确执行 Handler。

作用:接受用户请求信息,调用业务方法处理请求,也称之为后端控制器。

接收请求

@RequestMapping

@RequestMapping 是一个用来为处理器地址映射的注解,可用于类或方法上. 作用在类上,在整个项目中不能重复,作用在方法上,整个类中不能重复. 常用属性 path,value,method. path 和 value 用来定义地址 method 用来定义请求方式

@RequestMapping(value = “/hello”,method = RequestMethod.GET)

@RequestMapping(path= “/hello”,method = RequestMetho

获取请求数据

Spring WEB 支持对多种类型的请求参数进行封装

  1. 使用 request 对象接收

    @GetMapping(path = "/test")
    public voidtset(HttpServletRequest request){
    	System.out.println(request.getParameter("num"));
    }
    

在处理中如果需要使用到 HttpServletRequest 对象只需要定义

  1. spring 自动封装

    @RequestMapping("/save")
    public void save(String userName,Integer age){
    }
    

    Spring 会自定进行数据封装,这里要注意的是,处理器接收参数的形参名称必须 和表单的 name 属性保持一致,否则会接收失败

  2. 当请求参数名与形参名不一致时,可以使用@RequestParam(“”)进行参数绑 定.

    @RequestParam("m") String mark,@RequestHeader("User-Agent") String useragent
        /*@RequestParam("m") String mark  把请求中的参数绑定到指定的参数
          @RequestHeader("User-Agent") String useragent 获取请求头中的数据 获得token就这样获取*/
    

表单的 name 和控制器的形参并不一致,但是@RequestParam 注解的 value 值必须和表单的 name 保持一致

@RequestHeader(“”)用来接收请求中的数据.

@RequestHeader(“user-agent”) 可以用来接收请求头中的数据

​ 4.使用实体类对象接收

@RequestBody 可以接收前端提交的 json 格式数据,将 json 格式封装到对象 中.

@RequestMapping(path = "/login",method = RequestMethod.POST)
public String login(@RequestBody Admin admin){
    Admin admin1=loginService.login(admin);
    System.out.println(admin1);
    System.out.println("hello springweb");
    return "success";
}

5.日期类型转换

属性类型为 Date 类型需要指定转换格式

@DateTimeFormat(pattern = “yyyy-MM-dd”)

private Date birthday

springweb优点

对web层进行封装,让我们快速搭建自己的后端处理程序

@RestController //表示此类由spring创建管理
@RequestMapping(path = "/loginCtl") //为类定义一个映射地址
public class LoginController {
    @Autowired
    LoginService loginService;//方便注入其他对象

    @RequestMapping(path = "/login",method = RequestMethod.POST)//为方法定义映射地址,设置该方法允许那些请求方式访问,可以方便的接受请求中的参数
    public String login(Admin admin){
        System.out.println(admin.getAccount());
        System.out.println(admin.getPassword());
        Admin admin1=loginService.login(admin);
        System.out.println(admin1);


        System.out.println("hello springweb");

        return "success"; //可以直接将返回的对象自动转化为json字符串
    }
}

中文乱码处理

SpringWEB 中已经为我们提供了过滤器,只需要在 web.xml 中配置好即可

<filter>
	<filter-name>characterEncodingFilter</filter-name>
	<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
	<init-param>
	<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
	</filter>
	<filter-mapping>
	<filter-name>characterEncodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

跨域访问处理

添加依赖

 <!--spring中提供的解决跨域问题的过滤器-->
        <dependency>
            <groupId>com.thetransactioncompany</groupId>
            <artifactId>cors-filter</artifactId>
            <version>2.5</version>
        </dependency>

Web.xml 中配置

<filter>
	<filter-name>CORS</filter-name>
	<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>CORS</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>

返回 JSON

Springweb 中 向 前 端 返 回 数 据 为 json 时 , 只 需 要 在 方 法 上 添 加 @ResponseBody 注解即可, 由 于 在 类 上 面 已 经 使 用 @RestController 注 解 , 所 以 不 需 要 再 次 添 加,@RestController 中已经包含

但是必须在项目中导入相应的转 json 组件才可以直接将响应的对象转为 json

<!--  jackson-->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.14.2</version>
</dependency>

拦截器

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

//定义拦截器
public class AdminTokenInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("进入到了拦截器");
        //获取token
        String token=request.getHeader("token");
        if(token.equals("123456")){
            return true;//拦截器中返回true,请求会离开拦截器,继续向后执行,到达处理器
        }else{
            response.setContentType("text/html;charset=utf-8");
            PrintWriter printWriter= response.getWriter();
            printWriter.write("token验证失败");
            return false;//拦截器中返回false,不会向后执行,可以在拦截器中向用户做出相应
        }
    }
}
<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>

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值