目录
概述
SpringMVC的组件
DispatcherServlet
HandlerMapping
HandlerAdapter
SpringWeb的运行流程
Controller类的编写
@RestController注解
@RequestMapping注解
SpringWeb搭建
获取请求参数
解决POST请求中文乱码问题
Ajax返回JSON数据
跨域问题的解决
拦截器
拦截器搭建
配置拦截器
概述
Spring Web 是Spring框架中提供Web控制层功能,能够替代传统的Servlet功能,进行接收请求,处理数据,响应参数的处理
SpringWeb与spring无需通过中间层进行整合,能够进行配置直接使用
SpringWeb是基于SpringMVC架构的Web功能,但是在现在的前后端分离的架构中,SpringMVC中的部分功能已经不再使用了,比如View视图层的功能已经被前端架构取代,但是其他的功能是继续应用的
SpringMVC的组件
DispatcherServlet
Spring 中提供了org.springframework.web.servlet.DispatcherServlet 类,它从HttpServlet 继承而来,它就是 Spring MVC 中的前端控制器。
DispatcherServlet自己并不处理请求而是,将请求与处理器分发给映射处理器与处理器适配器,由处理器处理数据并返回数据给DispatcherServlet
HandlerMapping
HandlerMapping负责解析请求地址,经过了 HandlerMapping 处理之后,DispatcherServlet 就知道要将请求交给哪个页面控制器来处理了,会找到对应的处理器。
HandlerAdapter
经过了 HandlerMapping 处理之后,DispatcherServlet就获取到了处理器,但是处理器有多种,为了方便调用,DispatcherServlet将这些处理器包装成处理器适配器 HandlerAdapter,HandlerAdapter 调用真正的处理器的功能处理方法,完成功能处理
SpringWeb的运行流程
1.DispatcherServlet接收所有的前端请求,并且负责将资源分发地址给映射处理器,与适配器
2.映射处理器解析请求地址,查询对应的Handler处理器返回给DispatcherServlet
3.如果本次请求有对应的拦截器则会经过拦截器
4.处理器适配器是会找到对应的处理器并且封装请求中的参数
5.处理器会将根据请求参数处理数据然后返回给DispatcherServlet
Controller类的编写
Controller类是SpringMVC中留下来的称呼,实际上就是请求的对应的处理器类,负责处理请求的数据开发者实际上编写的主要处理数据的程序就是Controller类
Controller类需要被两个注解进行修饰,包含@RestController与@RequestMapping
@RestController注解
@RestController用于修饰一个Controller类对象,类似于的@Service注解,将该类的对象注入进spring容器
在之前的SpringMVC中使用@Controller注解进行修饰,而@RestController中集成了@Controller与@ResponseBody注解,在现在的SpringWeb中都是使用该注解进行修饰
注意@ResponseBody注解会默认返回json格式的数据
@RestController注解内部结构
@RequestMapping注解
该注解用于解析请求映射的地址,可以用于类与方法上,只有匹配的地址才会进去该类与方法
属性值:
value :请求的路径,这个路径相对于应用的上下文,它是 path 的别名。类型是一个 String[] ,也就是说它可以匹配多个请求路径
method: 请求的方法。RequestMethod.GET代表Http协议中的get请求,RequestMethod.POST代表Http协议中的post请求,如果不指名该属性值,则get请求与post请求都会的匹配
也可以直接用@GetMapping, @PostMapping注解分别代表的get请求与post请求的类型
SpringWeb搭建
1.导入依赖jar
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
2.在web.xml文件中配置DispatcherServlet
<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:application.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.在配置文件中开启SpringMVC的注解(再创建一个xml文件进行配置,导入进主配置文件中)
<mvc:annotation-driven></mvc:annotation-driven>
获取请求参数
1.注入HttpServletRequest类对象与HttpServletResponse类对象
将两个类的对象引用作为形参传入方法中,在方法中使用HttpServletRequest类的对象即可获取请求参数,类似于Servlet中的做法
@GetMapping(path = "/test2")
public String test2(HttpServletRequest request, HttpServletResponse response){
//注意此时的HttpServletRequest类与HttpServletResponse类是自动注入进来的
request.getParameter("account");//获取参数
return "springWeb";
}
2.使用形参进行接收,在方法中的形参列表中直接使用对应类型的参数即可接收请求中的数据
@GetMapping(path = "/test")
public String test(Integer num,
@RequestParam("user-name") String account,
String password){
//接收参数可以直接定义形参进行接收,参数名需要与形参名一致,如果参数名不合法则使用@RequestParam修饰
//@RequestHeader("Host")接收请求头中的数据
System.out.println("hello springWeb");
System.out.println(num);
Admin admin = new Admin();
admin.setAccount(account);
admin.setPassword(password);
loginService.login(admin);
return "springWeb";
}
注意请求参数名在java中不合法的情况,例如人为的设置或者是请求头中的数据
此时使用@RequestParam("请求参数名")来绑定形参即可接收
@RequestHeader("Host")可以获取请求头中的数据
3.使用对象类型接收
使用前提是model类中的属性名与参数名一致,spring框架会自动将参数进行组装
@GetMapping(path = "/test1")
public String test1(Admin admin ,@RequestHeader("Host")String host ){
System.out.println("hello springWeb");
System.out.println(host);
loginService.login(admin);
return "springWeb";
}
解决POST请求中文乱码问题
在servlet中学习过POST请求参数中的中文字符传入后端时会出现中文乱码的问题,当时解决的方式是通过过滤器进行解决的。
SpringWeb中已经提供了该过滤器解决该问题,该类已经被SpringWeb封装过了,我们只需要直接进行配置即可
配置编码的servlet
<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数据
程序员在SpringWeb中返回的响应数据,只需要在controller类中使用return关键子进行返回即可
JSON数据格式一般是通过将引用类型的数据转换为JSON字符串进行返回,JSON格式现在已经是前后端交互传输数据格式的标准了所以在返回引用类型的数据时SpringWeb会默认返回JSON格式的数据,如果没有引入JSON转换的jar包的话会报出JSON格式转换的异常
@responseBody注解的作用就是将 controller 的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到 response 对象的 body 区,@responseBody已经集成进入@RestController类中了
引入JSON转换的jar依赖
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<!--JSON-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>
跨域问题的解决
1.添加jar依赖
<dependency>
<groupId>com.thetransactioncompany</groupId>
<artifactId>cors-filter</artifactId>
<version>2.5</version>
</dependency>
2.配置过滤器
通过过滤器实现的跨域问题的解决
<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>
拦截器
拦截器是对已经进入了SpringMVC中的请求进行拦截,可以对这些请求的Handler类进行拦截
拦截器是SpringWeb中定义的功能,不同于过滤器是对servlet中定义的功能
拦截器搭建
SpringMVC 定义了拦截器接口 HandlerInterceptor,该接口中定义了三个方法,其中后两个方法是针对与视图进行处理的,在现在的软件架构中已经不应用了,只需要重写boolean preHandle( )方法
preHandle:
该方法是在预处理方法,就是在处理器方法执行之前这个方法会被执行,相当于拦截了处理器方法,框架会传递请求和响应对象给该方法,第三个参数为被拦截的处理器方法。如果preHandle方法返回true表示继续流程(如调用下一个拦截器或处理器方法),返回 false 表示流程中断,不会继续调用其他的拦截器或处理器方法,此时我们需要通过 response 来产生响应;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle");
return false;
}
配置拦截器
在springMVC的配置文件中进行该配置
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<mvc:exclude-mapping path="/statics/**"/>
<mvc:exclude-mapping path="/loginCtl/checklogin"/>
<bean id="demo" class="com.ff.springMVC.util.DemoInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>