当前位置:首页 » 《关于电脑》 » 正文

Springweb详解

21 人参与  2024年09月08日 18:41  分类 : 《关于电脑》  评论

点击全文阅读


Springweb详解

一.springweb介绍

1.1 SpringWEB 特点

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

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

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

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

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

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

1.2 springweb组件

前端控制器:DispatcherServlet(不需要程序员开发)由框架提供,在 web.xml 中配置。 作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理 用户的请求.

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

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

处理器:Handler(也称之为 Controller,需要工程师开发)。 注意:编写 Handler 时按照 HandlerAdapter 的要求去做,这样适配器才可 以去正确执行 Handler。 作用:接受用户请求信息,调用业务方法处理请求,也称之为后端控制器

二.springweb搭建

2.1 导包
<dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.2.RELEASE</version></dependency>
2.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>
2.3 开启Springweb注解
<mvc:annotation-driven></mvc:annotation-driven>
2.4 处理器类搭建

@RestController 用于标记在一个类上,使用它标记的类就是一个 SpringWEB 控制器类。用@RequestMapping标记一个类或方法,spring会扫描包中用了@RM的类,方法然后加入到IOC容器中,注入依赖

//@RequestMapping 用来为类和方法定义访问地址,类上面的地址不能重复@RequestMapping(path = "/loginCtl")public class LoginController {    @RequestMapping(path = "/login")    public String login(){        ......    }}

三. 接受请求

3.1 @RequestMapping

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

//  path和value都表示定义一个此类或方法的地址    //  method=RequestMethod.POST   指定允许哪些请求方式访问此方法    @RequestMapping(path = "/login",                    method = RequestMethod.POST)    public String login(Admin admin){......    }

ok我们来总结一下:

springweb好处:对web层进行封装,让我们可以快速搭建自己的后端处理程序(LoginController):

@RestController//表示此类由spring创建管理@RequestMapping(path = "/loginCtl")//为类定义一个映射地址public class LoginController {    @Autowired    LoginService loginService;//方便的注入其他对象    //为方法定义映射地址,设置该方法允许哪些请求方式访问,可以方便接收请求中的参数    @RequestMapping(path = "/login",                    method = RequestMethod.POST)     public String login(Admin admin){        Admin admin1=loginService.login(admin);        System.out.println(admin1);        //可以直接将返回的对象,自动转为json字符串        return "success";    }}

四.springweb请求的运行流程(截至目前)

一次请求到后端,先进入DispatcherServlet,统一进行拦截,再调用其他程序进行处理,调用HandlerMapping(处理器映射器) 解析请求中处理器的地址和方法地址。判断地址是否存在,不存在返回404,如果存在,判断该地址有没有拦截器。如果有拦截器,进入拦截器。

然后会回到DispatcherServlet,再调用HandlerAdapter(处理器适配器),最终由处理器适配器调用我们自己的处理器(LoginController),由我们自己的处理器进行接受请求,处理请求,响应。

五.获取请求数据

5.1 spring自动封装

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

    @RequestMapping(path = "/login",                    method = RequestMethod.POST)    public String login(Admin admin,String mark){......        return "success";    }
5.2 当请求参数名和形参名不一致
5.2.1 可以使用@RequestParam(“”)进行参数绑定
    @RequestMapping(path = "/login",                    method = RequestMethod.POST)    public String login(Admin admin,@RequestParam("m") String mark){......        return "success";    }
5.2.2 可以使用@RequestHeader(“”)接收请求头中的数据
    @RequestMapping(path = "/login",                    method = RequestMethod.POST) //因为请求头中的User-Agent传回来发现java中没有-命名的变量,所以需要用到这个public String login(Admin admin,@RequestHeader("User-Agent") String userAgent){......        return "success";    }
5.3 使用实体类对象接收

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

    @RequestMapping(path = "/login",                    method = RequestMethod.POST)    public String login(@RequestBody Admin admin){......        return "success";    }
5.4 日期类型转换

属性类型为Date类型需要指定转换格式,在声明属性上方添加:

 @DateTimeFormat(pattern = "yyyy-MM-dd")     private Date birthday;

@DateTimeFormat():前端提交到后端的数据日期指定转换格式

@JsonFormat():后端把对象转为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>

七.跨域访问处理:

添加依赖:

<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格式,只需要导入json组件即可:

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

九.拦截器

springweb中的拦截器类似于servlet中的过滤器,主要用于拦截用户请求并作相应的处理

spring中的拦截器与过滤器有本质的区别,过滤器是servlet规范中定义并实现的,在进入到servlet之前截获请求,而拦截器时spring中定义的拦截机制,是对进入到处理器的请求进行拦截

配置拦截器:

    <!--配置拦截器-->    <mvc:interceptors>        <mvc:interceptor>            <mvc:mapping path="/**"/>   <!--定义哪些地址可以进入到拦截器中-->            <mvc:exclude-mapping path="/loginCtl/login"/>  <!--定义哪些地址不进入拦截器-->            <mvc:exclude-mapping path="/loginCtl/login"/>  <!--可以配多个-->            <bean id="admin" class="com.ffyc.ssm.interceptor.AdminTokenInterceptor"></bean> <!--配置拦截器的实现类-->        </mvc:interceptor>    </mvc:interceptors>

定义一个拦截器:

当请求进入拦截器时判断token,符合则true然后继续执行处理器,不符合false则不往后执行可以在此给用户做出相应

//定义一个拦截器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 writer=response.getWriter();            writer.write("token验证失败");            return false;   //拦截器中返回false,不会继续向后执行,可以在拦截器中向用户做出响应        }    }}

点击全文阅读


本文链接:http://zhangshiyu.com/post/157112.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1