springWeb

springweb就是spring框架中的一个模块,对web层进行了封装,使用起来更加方便。如何方便?参数接收框架进行封装

SpringWeb拥有控制器,接收外部请求,解析参数传给服务层。

SpringWeb运行流程

  1. 用户发起请求 ip:端口/项目名/类地址/方法地址/,表示所有的请求都可以到达DispatcherServlet
  2. DispatcherServlet,请求分发,核心的,在springweb底层就是一个servlet,接收用户所有请求,并分发给对应的映射处理器、适配器
  3. HandlerMapping 映射处理器,用来解析请求中的地址,有没有对应的处理器类;如果本次请求有对应的拦截器,会执行相应的拦截器
  4. HandlerAdapter 适配器,封装请求中的参数
  5. Handler 到达自己创建的处理器,接收参数、处理、响应

搭建SpringWeb

1.导入jar包

xml 复制代码
<!--springWeb-->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.2.2.RELEASE</version>
</dependency>

2.在 web.xml 文件中配置 DispatcherServlet

配置 spring 核心请求分发器

xml 复制代码
<!--配置DispatcherServlet(请求分发servlet),负责接收前端所有的请求-->
<servlet>
    <servlet-name>application</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!--配置读取spring配置文件-->
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring.xml</param-value>
    </init-param>
    <!--控制servlet创建初始化的时间,-1第一次访问时创建,>=0是服务器启动时创建-->
    <load-on-startup>0</load-on-startup>
</servlet>
<!--配置映射地址-->
<servlet-mapping>
    <servlet-name>application</servlet-name>
    <url-pattern>/</url-pattern>   <!--/ 表示所有的请求都会进入到DispatcherServlet-->
</servlet-mapping>

3.开启 springmvc 注解

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--配置开启使用springweb中的注解-->
    <mvc:annotation-driven></mvc:annotation-driven>
</beans>

4.spring.xml中导入springmvc配置文件

xml 复制代码
<!--导入springmvc配置文件-->
<import resource="classpath:spring-mvc.xml"></import>

5.创建自己的处理器,为类和方法定义地址

java 复制代码
package com.ffyc.ssm.web;

@RestController//类似于@service这些注解标签,表示此类是控制层类,并创建对象
@RequestMapping(path = "/loginCtl")//用来为类和方法定义一个映射地址
public class LoginController {

    @Autowired
    LoginService loginService;

    @RequestMapping(path = "/test")
    public String test(Integer num){
        System.out.println(num);
        System.out.println("hello springweb");
        loginService.login(new Admin());
        return "springweb";
    }
}

6.将ssm项目发布到Tomact中访问

Edit Configurations中

在服务器启动成功后,输入以下地址:

接收请求

springweb层的控制器类中如何使用?web层 :接收 处理 响应

1、@RestController 修饰控制器

2、@RequestMapping(path ="/loginCtl")

可以在方法 上使用。在类上面使用,整个项目中必须是唯一的,不能重复;在方法上使用时,同一个类中地址也必须是唯一的,可以使用path/value来定义地址。

类中必须要定义请求方式 :get/post。@RequestMapping(value = "/test",method = RequestMethod.POST);@RequestMapping(value ="/test")。没有指定请求方式,get/post请求都可以访问。
@GetMapping(path ="/test") ,get请求
@PostMapping(path = "/test"),post请求

3、如何接收请求中的数据

1.使用request对象接收,req.getParameter()

xml 复制代码
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency>
java 复制代码
@RestController//类似于@service这些注解标签,表示此类是控制层类,并创建对象
@RequestMapping(path = "/loginCtl")//用来为类和方法定义一个映射地址
public class LoginController {

    @Autowired
    LoginService loginService;

    @RequestMapping(path = "/test")
    public String test(HttpServletRequest request, HttpServletResponse response){
        System.out.println(request.getParameter("num"));
        return "springweb";
    }
}

2.直接在参数列表中,定义形参接收,还可以帮助我们进行数据类型转换。

请求中的键名称与形参名一致,如果接收不一致 需要通过注解标签@RequestParam进行绑定。例如java中参数是userName,请求的参数是user-name

请求头中的数据用:@RequestHeader

java 复制代码
@RequestMapping(path = "/test")
public String test(Integer num, @RequestParam("user-name") String userName,
                   @RequestHeader("User-Agent")String userAgent){
    System.out.println(num);
    System.out.println(userName);
    System.out.println(userAgent);
    return "springweb";
}

3.使用对象 接收。

把请求中的数据直接封装到对象里面,前提是请求中的数据和类中的属性名字一致

(保存,提交表单数据,数量比较多的时候用)

400,请求数据类型转换有问题

java 复制代码
@RestController//类似于@service这些注解标签,表示此类是控制层类,并创建对象
@RequestMapping(path = "/loginCtl")//用来为类和方法定义一个映射地址
public class LoginController {

    @Autowired
    LoginService loginService;

    @GetMapping(path = "/login")
    public String login(Admin admin,Integer mark){
        System.out.println(admin);
        System.out.println(mark);
        return "springweb";
    }
}


前端的日期类型是字符串,后端是Date类型,需要加@DateTimeFormat(pattern = "yyyy-MM-dd") 进行格式化

java 复制代码
@Data
public class Admin {
    private Integer id;
    private String account;
    private String password;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date birthday;
}

中文乱码处理

post请求方式中,中文会乱码,以前自己创建一个过滤器

SpringMVC 中已经为我们提供了这个编码过滤器,只需要在 web.xml 中配置好即可:

xml 复制代码
<!--配置spring框架中提供的编码过滤器-->
<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>

Ajax返回JSON

java 复制代码
package com.ffyc.ssm.common;

public class CommonResult {
    private int code;//自定义的状态码
    private Object data;//数据 对象 集合
    private String message;//消息

    public CommonResult(int code, Object data, String message) {
        this.code = code;
        this.data = data;
        this.message = message;
    }

    public CommonResult(int code, String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public Object getData() {
        return data;
    }

    public void setData(Object data) {
        this.data = data;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }
}
java 复制代码
@RestController//类似于@service这些注解标签,表示此类是控制层类,并创建对象
@RequestMapping(path = "/loginCtl")//用来为类和方法定义一个映射地址
public class LoginController {

    @Autowired
    LoginService loginService;

    @GetMapping(path = "/login")
    public CommonResult login(Admin admin, Integer mark){
        CommonResult commonResult=new CommonResult(200,"保存成功");
        return commonResult;
    }
}

@RestController//类似于@service这些注解标签,表示此类是控制层类,并创建对象。集成了两个注解标签

  • @Controller
  • @ResponseBody :方法的返回值会自动的转为JSON字符串,并将返回的内容写入到响应体中,为Ajax请求使用的
    控制器中返回结果,由于使用@RestController,里面包含@ResponseBody的注解标签,所以方法返回结果默认是json格式,并将json字符串写入到响应体中。返回一个对象时,必须加入一个转json的第三方组件
xml 复制代码
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.13.3</version>
</dependency>

跨域配置

加入依赖

xml 复制代码
<!--跨域-->
<dependency>
    <groupId>com.thetransactioncompany</groupId>
    <artifactId>cors-filter</artifactId>
    <version>2.5</version>
</dependency>

在 web.xml 中配置跨域过滤器

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>

拦截器

拦截器--->过滤器,功能类似,但是有区别

过滤器是java Servlet规范中定义的,是当请求进入到servlet之前,可以对请求进行拦截,可以加入一些逻辑处理。

拦截器与过滤器是有区别的,拦截器是spring框架中自己定义的功能,和过滤器的位置不同;拦截器只拦截进入到自己控制器中的请求,其余的不拦截。

搭建拦截器

1.创建一个类,实现HandlerInterceptor接口,重写接口中preHandle()方法;剩下两个方法是在MVC架构中使用(postHandle:当控制器执行完成后调用;afterCompletion:当响应结束后执行)。

预处理:当请求经过映射处理器检测对应的控制器是存在,判断该请求可以进入到该拦截器,执行调用。preHandle方法,如果返回true-->请求继续向下执行;返回false-->请求就不再向下执行。

其余两种是在MVC架构中使用的,当控制器执行完成后调用。

java 复制代码
//自定义token验证的拦截器
public class TokenInterceptor implements HandlerInterceptor {
    //预处理
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("preHandle");
        return false;
    }
}

2.配置拦截器。在spring-mvc.xml中

xml 复制代码
<!--配置拦截器-->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/> <!--配置哪些请求进入到拦截器-->
        <mvc:exclude-mapping path="/loginCtl/login"/>  <!--配置哪些请求不进入到拦截器-->
        <bean class="com.ffyc.ssm.common.TokenInterceptor"></bean>  <!--配置拦截器实现类-->
    </mvc:interceptor>
</mvc:interceptors>

3.测试。如果preHandle方法返回的是false的话,test方法不执行;如果返回true,先执行preHandle()后执行test()

java 复制代码
@GetMapping(path = "/test")
public CommonResult test(){
    System.out.println("test method");
    CommonResult commonResult=new CommonResult(200,"保存成功");
    return commonResult;
}
相关推荐
草莓base7 小时前
【手写一个spring】spring源码的简单实现--bean对象的创建
java·spring·rpc
乌啼霜满天2498 小时前
Spring 与 Spring MVC 与 Spring Boot三者之间的区别与联系
java·spring boot·spring·mvc
Elaine2023918 小时前
零碎04 MybatisPlus自定义模版生成代码
java·spring·mybatis
.生产的驴11 小时前
SpringCloud OpenFeign用户转发在请求头中添加用户信息 微服务内部调用
spring boot·后端·spring·spring cloud·微服务·架构
码蜂窝编程官方13 小时前
【含开题报告+文档+PPT+源码】基于SpringBoot+Vue的虎鲸旅游攻略网的设计与实现
java·vue.js·spring boot·后端·spring·旅游
AuroraI'ncoding14 小时前
时间请求参数、响应
java·后端·spring
计算机毕设指导616 小时前
基于 SpringBoot 的作业管理系统【附源码】
java·vue.js·spring boot·后端·mysql·spring·intellij-idea
ExiFengs18 小时前
实际项目Java1.8流处理, Optional常见用法
java·开发语言·spring
瓜牛_gn18 小时前
依赖注入注解
java·后端·spring
一元咖啡19 小时前
SpringCloud Gateway转发请求到同一个服务的不同端口
spring·spring cloud·gateway