SpringMVC快速入门
1. 开发步骤
- 导入SpringMVC相关坐标
- 配置SpringMVC核心控制器DispatherServlet
- 创建Controller类和视图页面
- 使用注解配置Controller类中业务方法的映射地址
- 配置SpringMVC核心文件spring-mvc.xml
- 客户端发起请求测试
2. 代码实现
项目结构:
web.xml:
spring-mvc.xml(开启组件扫描才可以使用注解):
UserController:
2. springmvc流程图
注:
- load-on-startup 元素标记容器是否应该在web应用程序启动的时候就加载这个servlet,(实例化并调用其init()方法)。
- 它的值必须是一个整数,表示servlet被加载的先后顺序。
- 如果该元素的值为负数或者没有设置,则容器会当Servlet被请求时再加载。
- 如果值为正整数或者0时,表示容器在应用启动时就加载并初始化这个servlet,值越小,servlet的优先级越高,就越先被加载。值相同时,容器就会自己选择顺序来加载。
SpringMVC的组件解析
1. SpringMVC的执行流程
2. SpringMVC注解解析
范例:
3. SpringMVC组件扫描
范例:
4. SpringMVC资源解析器
4.1 视图解析器
源码:
配置文件:
控制器:
注:
5. 知识要点
SpringMVC的数据响应
1. SpringMVC的数据响应方法
-
页面跳转
直接返回字符串
通过ModelAndView对象返回
-
回写数据
直接返回字符串
返回对象或集合
2. 页面跳转
2.1 返回字符串形式
直接返回字符串,这种方式会将返回的字符串与视图解析器的前后缀拼接后跳转。
2.2 返回ModelAndView对象
1. 方式1
范例:
2.方法2
3.方法3(不常用)
3. 回写数据
3.1 直接返回字符串
范例:
3.2 直接返回JSON字符串
普通版
进阶版(SpringMVC帮你转成json)
配置文件:
代码:
高级版(注解)
实例
主要是配置文件:
SpringMVC获得请求数据
1. 获得请求参数
1.1 获得基本类型参数
Contoller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配。
1.2 获得POJO类型参数
Contoller中的业务方法的POJO参数的属性名与请求参数的name一致,参数值会自动映射匹配。
1.3 获得数组类型参数
Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配。
1.4 获得集合类型参数
1.4.1 普通方式
获得集合参数时,要将集合参数包装到一个POJO中才可以
1.4.2 @RequestBody注解的方式
当使用ajax提交时,可以指定contentType为json形式,那么在方法参数位置使用@RequestBody可以直接接受集合数据而无需使用POJO进行包装
2. 静态资源访问的开启
3. 请求数据乱码问题
当post请求时,数据会出现乱码,我们可以设置一个过滤器来进行编码的过滤
4. 参数绑定注解@RequestParam
当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定
例子:
5. 获得Restful风格的参数
范例:
6. 自定义类型转换器
7. 获得servlet相关API
7.1 获得请求头(@RequestHeader)
7.2 获得请求头(@CookieValue)
8. 文件上传
1. 单文件上传
- 导坐标
- 配置配置文件
- 具体代码
前端:
后端:
2. 多文件上传
前端:
后端:
SpringMVC拦截器
1. 拦截器的作用
##2. 拦截器和过滤器区别
3. 拦截器快速入门
自定义拦截器很简单,只有如下三步:
- 创建拦截器类实现HandlerInterceptor
- 配置拦截器
- 测试拦截器的拦截效果
具体代码看spring_mvc下的itheima_spring_interceptor
MyInterceptor1:
package com.itheima.interceptor;
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 {
//在目标方法执行之前 执行 返回的是false就后面的都不执行,true才会执行后面的
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
System.out.println("preHandle.....");
String param = request.getParameter("param");
if("yes".equals(param)){
return true;
}else{
request.getRequestDispatcher("/error.jsp").forward(request,response);
return false;//返回true代表放行 返回false代表不放行
}
}
//在目标方法执行之后 视图对象返回之前执行
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
modelAndView.addObject("name","itheima");
System.out.println("postHandle...");
}
//在流程都执行完毕后 执行
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
System.out.println("afterCompletion....");
}
}
配置文件:
SpringMVC异常处理机制
主要看代码itheima_spring_exception
1. 异常处理的思路
2. 异常处理两种方式
###1. 使用SpringMVC提供的简单异常处理器SimpleMappingExceptionResolver
范例:
配置文件:
###2. 实现Spring的异常处理接口HandlerExceptionResolver自定义自己的异常处理器
步骤
- 创建异常处理器类实现HandlerExceptionResolver
package com.itheima.resolver;
import com.itheima.exception.MyException;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyExceptionResolver implements HandlerExceptionResolver {
/*
参数Exception:异常对象
返回值ModelAndView:跳转到错误视图信息
*/
public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {
ModelAndView modelAndView = new ModelAndView();
if(e instanceof MyException){
modelAndView.addObject("info","自定义异常");
}else if(e instanceof ClassCastException){
modelAndView.addObject("info","类转换异常");
}
modelAndView.setViewName("error");
return modelAndView;
}
}
- 配置异常处理器
- 编写异常页面
-
测试异常跳转
ModelAndView modelAndView = new ModelAndView();
if(e instanceof MyException){ modelAndView.addObject("info","自定义异常"); }else if(e instanceof ClassCastException){ modelAndView.addObject("info","类转换异常"); } modelAndView.setViewName("error"); return modelAndView;
}
}
2. 配置异常处理器
[外链图片转存中...(img-9v6UBj85-1614757014910)]
3. 编写异常页面
[外链图片转存中...(img-GV2u6c0J-1614757014912)]
4. 测试异常跳转