SpringMvc学习总结
SpringMvc执行流程
SpringMvc有一个控制器DispatcherServlet,用户接收和处理请求,当用户发送一个请求时,DispatcherServlet会拦截用户发送的请求,再根据地址找到对应的控制器Controller进行业务处理。
springmvc提供了 前端控制器 DispatcherServlet,仅针对对客户端的请求和响应进行统一 处理(就是说封装了servlet),是个框架 。是针对三层架构的表述层(或表示层) 开发提供的框架 ,而mvc是一种思想。
对于原先的mvc思想来说,springmvc只是包含了mvc思想的一部分 Controller进行实现。
在mvc思想的实现中 分成了 Model{ Service DAO }, View{ html } , Controllor{ controllor }.
原先的Controller在实现本身的作用外 接收请求和响应浏览器外, 还需要调用View和Controller。耦合严重。
springmvc的出现取代了controller本身作用接收请求 并且实现了表示前台页面的调用, controllor变成了中间层 调用Model层和写明View层的名字留给springmvc去调用,所以 springmvc的出现是为了解耦。
SpringMvc开发步骤
- 导入SpringMvc相关依赖
- 配置SpringMVC核心控制器DispathcerServlet
- 创建Controller类和视图页面
- 使用注解配置Controller类中业务方法的映射地址
- 配置SpringMVC核心文件 spring-mvc.xml
- 客户端发起请求测试
导入SpringMvc相关依赖
<!--Spring依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--SpringMVC依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!--Servlet依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<!--Jsp依赖-->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
</dependency>
配置SpringMVC核心控制器DispathcerServlet
<servlet>
<servlet-name>DispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<!--
<load-on-startup>1</load-on-startup>的作用
1)load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。
2)它的值必须是一个整数,表示servlet应该被载入的顺序
3)当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet;
4)当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。
5)正数的值越小,该servlet的优先级越高,应用启动时就越先加载。
6)当值相同时,容器就会自己选择顺序来加载。
-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>DispatcherServlet</servlet-name>
<!-- 此处必须为/,不然DispatcherServlet拦截将会出错-->
<url-pattern>/</url-pattern>
</servlet-mapping>
创建Controller类和视图页面
@Controller//表示这是Controller层,自动注入bean
public class HelloController {
@RequestMapping("/hello")//访问地址,可接受任何请求
public String hello(){
System.out.println("hello World!");
return "index.jsp";
}
}
配置SpringMVC核心文件 spring-mvc.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!--配置注解扫描-->
<context:component-scan base-package="com.xyj"/>
</beans>
SpringMvc常用注解解析
@RequestMapping
- value:用于指定请求访问地址
- method:用于指定接受请求访问类型,例如post,get,put,delete
- params:用于接收请求参数的配置,用于参数上,值为前端传入的属性名,通常用于前端参数与控制器参数不一致的情况
@ResponseBody
- 通常用在方法上,当你的方法想返回数据而非视图时,就可以使用该注解
@RequestBody
- 通常用在参数上,表明参数值从请求中获取
@RequestParam
- value:请求参数名称
- required:此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错
- defaultValue:当没有指定请求参数时,则使用指定的默认值赋值
@PathVariable
- 通常用在参数上,用于对应地址栏中的占位符
SpringMvc常用对象解析
ModelAndView
- addObject:参数1:用于取值的key,参数2:保存的数据,用于保存数据,返回给前端
- setViewName:参数:返回的视图
@RequestMapping(value="/hello1")
//如果传有ModelAndView作为形参,MVC框架会帮你注入,那么MVC会将自动给你创建一个ModelAndView对象供你使用
public ModelAndView hello1(ModelAndView modelAndView){
modelAndView.addObject("username","哈哈哈");
modelAndView.setViewName("hello1");
return modelAndView;
}
SpringMVC获得请求数据
- 基本类型参数
- POJO类型参数
- 数组类型参数
- 集合类型参数
//数组数据类型的获取
@RequestMapping("/hello2")
@ResponseBody
public void hello2(String[] strs) throws IOException {
System.out.println(Arrays.asList(strs));
}
//POJO数据类型的获取
public class User {
private String username;
private int age;
getter/setter…
}
@RequestMapping("/hello3")
@ResponseBody
public void hello3(User user){
System.out.println(user);
}
//基本数据类型的获取
@RequestMapping("/hello4")
@ResponseBody
public void hello4(String username,int age){
System.out.println(username);
System.out.println(age);
}
拦截器
拦截器的作用
-
Spring MVC 的****拦截器*类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。*
将拦截器按一定的顺序联结成一条链,这条链称为拦截器链(Interceptor Chain)
-
在访问被拦截的方 法或字段时,拦截器链中的 拦截器就会按其之前定义的顺序被调用。
-
拦截器也是AOP思想的具体实现。
登录拦截器
- 创建拦截器类实现HandlerInterceptor接口
- 配置拦截器
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class MyInterceptor1 implements HandlerInterceptor {
//在目标方法执行之前 执行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
//设置需要的程序
String authorization = request.getHeader("Authorization");
if (ObjectUtils.isEmpty(authorization)) {
response.setCharacterEncoding("utf-8");
response.setContentType("application/json; charset=utf-8");
response.getWriter().write("权限不足");
return false;
}
HttpSession session = request.getSession();
Object obj = session.getAttribute(authorization);
if(ObjectUtils.isEmpty(obj)){
response.getWriter().write("token已过期");
return false;
}
return true;
}
//在目标方法执行之后 视图对象返回之前执行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
//设置需要的程序
}
//在流程都执行完毕后 执行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
//设置需要的程序
}
}
常见问题解析
请求数据乱码问题
<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>
设置开放静态资源
<mvc:resources mapping="/js/**" location="/js/"/>