1.SpringMVC是什么
SpringMVC是Spring框架提供的构建Web应用程序的全功能MVC模块。它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无须实现任何接口。同时它还支持RESTful编程风格的请求。
SpringMVC的工作流程:
(1)用户发送请求至前端控制器DispatcherServlet
(2)DispatcherServlet收到请求调用HandlerMapping处理器映射器。
(3)处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
(4)DispatcherServlet调用HandlerAdapter处理器适配器。
(5)HandlerAdapter经过适配调用具体的Handler处理器(Controller,也叫后端控制器)。Controller执行完成返回ModelAndView。
(6)HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet。
(7)DispatcherServlet将ModelAndView传给ViewReslover视图解析器。
(8)ViewReslover解析后返回具体View视图。
(9)DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
(10)DispatcherServlet响应用户。
2.搭建SpringMVC项目
xml方式
配置pom文件
在resources文件夹下创建SpringMVC核心文件spring-mvc.xml,并添加注解扫描
web.xml中配置SpringMVC核心控制器DispathcerServlet
在项目中,新建“hello.jsp”页面
创建控制器Controller
配置Tomcat
启动Tomcat
注解方式
添加servlet依赖
在config包下创建配置类SpringMvcConfig替换spring-mvc.xml
在config包下创建配置类ServletContainersInitConfig替换web.xml
重新启动并测试
3.SpringMVC框架特点
1.Spring框架的一部分,无缝集成Spring框架
2.分离了控制器、模型对象、分派器以及处理程序对象的角色,更容易定制
3.支持注解驱动、数据验证等功能
4.高度可配置,支持多种视图技术,而不仅仅局限于JSP
5.采用松耦合可插入组件结构,比其他MVC框架更具备扩展灵活性
4.常用注解
在Spring MVC 中使用 @RequestMapping 将请求与处理方法一一对应 ,@RequestMapping负责将不同请求映射到对应的控制器方法中
在@RequestMapping指定的URL中可以含有变量参数,使用@PathVariable指定形参接收url中的参数值,@RequestMapping中也可以设置多个映射URL地址:
@RequestMapping注解也可以使用组合注解来限制方法接收请求的类型。
5.实现SpringMVC多种类型数据响应
实现页面跳转
xml方式:
注解方式:
返回ModelAndView对象
修改hello.jsp页面
编写控制器中处理请求的方法
回写数据
直接返回字符串
返回对象或集合
导入json相关依赖
开启mvc的注解驱动
xml方式:spring核心配置文件中加以下配置(<mvc:annotation-driven/>)
注解方式:spring配置类上加以下注解@EnableWebMvc
在entity下面创建实体类:
编写控制器中处理请求的方法:
6.SpringMVC文件上传下载
跨服务器上传文件
前端(file.jsp)代码: 通过AJAX发送请求:
<script type="text/javascript" src="${pageContext.request.contextPath}/statics/js/jquery-3.6.0.min.js"></script>
<script type="text/javascript">
function ajaxUpload(){
//获取表单数据,并添加到FormData中
let myfile=$("#myfile")[0].files[0];
let description=$("#description").val();
let formData=new FormData();
formData.append("myfile",myfile);
formData.append("description",description);
//发送AJAX请求
$.ajax({
//定义请求地址
url:"${pageContext.request.contextPath}/doAjaxUpload",
//定义请求类型
type:"post",
//定义请求参数(使用js对象)
data:formData,
//告诉jQuery不要去处理发送的数据,我们已经通过FormData处理了
processData:false,
contentType: false,
//定义服务器响应的数据格式为json
dataType:"json",
//成功响应的结果,data就是服务器返回的json对象
success:function(data){
alert(data.msg);
if(data.flag===1){
$("#img").attr("src","${pageContext.request.contextPath}/uploadfiles/"+data.content);
}
}
});
}
</script>
后端控制器代码:
@RequestMapping("/doAjaxUpload")
@ResponseBody
public MsgResult doAjaxUpload(MultipartFile myfile,
String description,
HttpServletRequest request){
//文件上传到服务器的位置(/uploadfiles)
String realPath = request.getServletContext().getRealPath("uploadfiles");
System.out.println(realPath);
//为上传到服务器的文件取名,使用UUID防止文件名重复
String filename=UUID.randomUUID().toString()+"-"+myfile.getOriginalFilename();
File targetFile=new File(realPath,filename);
if(!targetFile.exists()){
targetFile.mkdirs();
}
MsgResult result=new MsgResult();
try{
myfile.transferTo(targetFile);
result.setFlag(1);
result.setMsg("文件上传成功");
result.setContent(filename);
}catch(Exception ex){
result.setFlag(1);
result.setMsg("文件上传失败");
}
return result;
}
7.SpringMVC 日志记录、拦截器及统一异常处理
LogBack日志框架
日志记录器(Logger)配置:logback.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 定义附加器 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%date %msg%n</pattern>
</encoder>
</appender>
<!-- 根记录器 -->
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
<!-- controller记录器 -->
<logger name="controller" level="info" additivity="false">
<appender-ref ref="STDOUT" />
</logger>
<!-- controller.TestController记录器 -->
<logger name="controller.TestController" level="error" additivity="false">
<appender-ref ref="STDOUT" />
</logger>
</configuration>
Java代码获取日志记录器(Logger)
SpringMVC拦截器
拦截器概述:Spring MVC的拦截器(Interceptor)与Java Servlet的过滤器(Filter)类似,主要用于拦截用户的请求并做相应的处理。
定义拦截器可以通过两种方式: 通过实现HandlerInterceptor接口 、通过实现WebRequestInterceptor接口
//HandlerInterceptor接口里面有三个方法
public class TestInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("preHandle方法在控制器的处理请求方法前执行");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
System.out.println("postHandle方法在控制器的处理请求方法调用之后,解析视图之前执行");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
Object handler, Exception ex)
throws Exception {
System.out.println("afterCompletion方法在控制器的处理请求方法执行完成之后执行,即渲染视图结束之后执行");
}
}
在SpringMVC的配置文件中进行配置:
8.SpringMVC优点
灵活性和可扩展性强
MVC 设计模式
强大的请求处理机制
丰富的视图技术支持
高度整合性
安全性和可靠性高