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 支持对多种类型的请求参数进行封装
- 使用 request 对象接收
@GetMapping(path ="/test")publicvoidtset(HttpServletRequest request){System.out.println(request.getParameter("num"));}
在处理中如果需要使用到 HttpServletRequest 对象只需要定义
- spring 自动封装
@RequestMapping("/save")publicvoidsave(String userName,Integer age){}
Spring 会自定进行数据封装,这里要注意的是,处理器接收参数的形参名称必须 和表单的 name 属性保持一致,否则会接收失败 - 当请求参数名与形参名不一致时,可以使用@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)publicStringlogin(@RequestBodyAdmin 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")//为类定义一个映射地址publicclassLoginController{@AutowiredLoginService loginService;//方便注入其他对象@RequestMapping(path ="/login",method =RequestMethod.POST)//为方法定义映射地址,设置该方法允许那些请求方式访问,可以方便的接受请求中的参数publicStringlogin(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 中定义的一种拦截机制, 是对进入到处理器的请求进行拦截
//定义拦截器publicclassAdminTokenInterceptorimplementsHandlerInterceptor{@OverridepublicbooleanpreHandle(HttpServletRequest request,HttpServletResponse response,Object handler)throwsException{System.out.println("进入到了拦截器");//获取tokenString token=request.getHeader("token");if(token.equals("123456")){returntrue;//拦截器中返回true,请求会离开拦截器,继续向后执行,到达处理器}else{
response.setContentType("text/html;charset=utf-8");PrintWriter printWriter= response.getWriter();
printWriter.write("token验证失败");returnfalse;//拦截器中返回false,不会向后执行,可以在拦截器中向用户做出相应}}}
<mvc:interceptors><mvc:interceptor><mvc:mappingpath="/**"/><!--定义那些地址可以进入到拦截器中--><mvc:exclude-mappingpath="/loginCtl/login"/><!--定义那些地址不进入拦截器--><beanid="AdminToken"class="com.ffyc.ssm.interceptor.AdminTokenInterceptor"></bean><!--配置拦截器的实现类--></mvc:interceptor></mvc:interceptors>
SpringWEB 定义了拦截器接口 HandlerInterceptor 调用这个三个方法的时候,其参数的值也是从框架内部传递进来的。 boolean preHandle 预处理方法,实现处理器方法的预处理,就是在处理器方法执行之前这个方法会 被执行,相当于拦截了处理器方法,框架会传递请求和响应对象给该方法,第三 个参数为被拦截的处理器。如果 preHandle 方法返回 true 表示继续流程(如调 用下一个拦截器或处理器方法),返回 false 表示流程中断,不会继续调用其他 的拦截器或处理器方法,此时我们需要通过 response 来产生响应;
版权归原作者 2301_78085386 所有, 如有侵权,请联系我们删除。