目录
SpringMVC中的重要组件及原理分析
- DispatcherServlet : 前端控制器,接收所有请求(如果配置/不包含 jsp)
- HandlerMapping: 解析请求格式的.判断希望要执行哪个具体的方法.
- HandlerAdapter: 负责调用具体的方法.
- ViewResovler: 视图解析器.解析结果,准备跳转到具体的物理视图
如果在 web.xml 中设置 DispatcherServlet 的<url-pattern>为 / 时,当用户发 起 请 求 , 请 求 一 个 控 制 器 , 首 先 会 执 行 DispatcherServlet. 由DispatcherServlet 调 用 HandlerMapping 的DefaultAnnotationHandlerMapping 解 析 URL, 解 析 后 调 用HandlerAdatper 组 件 的 AnnotationMethodHandlerAdapter 调 用Controller 中的 HandlerMethod.当 HandlerMethod 执行完成后会返回View,会被 ViewResovler 进行视图解析,解析后调用 jsp 对应的.class 文件并运行,最终把运行.class 文件的结果响应给客户端
跳转方式
- 默认跳转方式请求转发.
- 设置返回值字符串内容
- 添加 redirect:资源路径 重定向
- 添加 forward:资源路径 或省略 forward: 转发
转发——>客户浏览器发送HTTP请求——>web服务器接受请求——>调用内部一个方法在容器内部完成请求处理和转发动作——>再将转发跳转到的那个网页资源返回给客户; 转发只能在同一个容器内完成 转发的时候浏览器地址是不会变的,在客户浏览器里只会显示第一次进入的那个网址或者路径,客户看不到这个过程,只是得到了想要的目标资源。转发行为浏览器只做了一次请求。(转发只能跳转一次)
重定向——>客户浏览器发送HTTP请求——>web服务器接受请求后发送302状态码以及新的位置给客户浏览器——>客户浏览器发现是302响应,则自动再发送一个新的HTTP请求,请求指向新的地址(302:Found 临时移动,但资源只是临时被移动。即你访问网址A,但是网址A因为服务器端的拦截器或者其他后端代码处理的原因,会被重定向到网址B。)——>服务器根据此请求寻找资源发个客户;再客户浏览器中显示的是重定向之后的路径,客户可以看到地址的变化。重定向行为浏览器做了至少两次请求。(重定向可以跳转多次)
视图解析器
配置
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
若不希望自行自定义视图解析器,在方法返回值前添加forward: / redirect
SpringMVC作用域传值的方式
1、 原生Servlet
在 HanlderMethod 参数中添加作用域对象HttpServletRequest req, HttpServletResponse resp, HttpSession sessionParam等
2、使用Map集合
把 map 中内容放在 request 作用域中
Spring 会对 map 集合通过 BindingAwareModelMap 进行实例化3、 使用SpringMVC 中 Model 接口
把内容最终放入到 request 作用域中
4、 使用SpringMVC 中 ModelAndView 类
文件下载
1.访问资源时相应头如果没有设置 Content-Disposition,浏览器默认按照 inline 值进行处理
1.1 inline 能显示就显示,不能显示就下载.
2.只需要修改相应头中 Context-Disposition=”attachment;filename=文件名”
2.1 attachment 下载,以附件形式下载.
2.2 filename=值就是下载时显示的下载文件名
java
@RequestMapping("download")
public void download(String fileName, HttpServletResponse resp, HttpServletRequest req) throws IOException {
resp.setHeader("Content-Disposition", "attachment;filename=a.txt");
ServletOutputStream os = resp.getOutputStream();
String path = req.getServletContext().getRealPath("files");
File file = new File(path, fileName);
byte[] bytes = FileUtils.readFileToByteArray(file);
os.write(bytes);
os.flush();
os.close();
}
jsp 访问静态资源files下的文件
<a href="download?fileName=a.txt">Download</a>
文件上传
1. 基于 apache 的 commons-fileupload.jar 完成文件上传.
2. MultipartResovler 作用:
2.1 把客户端上传的文件流转换成 MutipartFile 封装类.
2.2 通过 MutipartFile 封装类获取到文件流
3. 表单数据类型分类
3.1 在<form>的 enctype 属性控制表单类型
3.2 默认值 application/x-www-form-urlencoded,普通表单数据.(少量文字信息)
3.3 text/plain 大文字量时使用的类型.邮件,论文
3.4 multipart/form-data 表单中包含二进制文件内容.
java
/**
* 上传文件
*
* @return
*/
@RequestMapping("upload")
public String upload(MultipartFile file,String name) throws IOException {
System.out.println(name);
String fileName = file.getOriginalFilename();
String suffix = fileName.substring(fileName.lastIndexOf("."));
String uuid = UUID.randomUUID().toString();
FileUtils.copyInputStreamToFile(file.getInputStream(),new File("D:/"+uuid+suffix));
return "main.jsp";
}
jsp
<form action="upload" enctype="multipart/form-data" method="post">
name:<input type="text" name="name"><br>
file:<input type="file" name="file"><br>
<input type="submit" value="submit"><br>
</form>
自定义拦截器
1.跟过滤器比较像的技术.
2.发送请求时被拦截器拦截,在控制器的前后添加额外功能.
2.1 跟 AOP 区分开.AOP 在特定方法前后扩充(对 ServiceImpl)
2.2 拦截器,请求的拦截.针对点是控制器方法.(对 Controller)
3.SpringMVC 拦截器和 Filter 的区别
3.1 拦截器只能拦截器 Controller
3.2 Filter 可以拦截任何请求.
4.实现自定义拦截器的步骤:
4.1 新建类实现 HandlerInterceptor
4.2 在 springmvc.xml 配置拦截器需要拦截哪些控制器
4.2.1 拦截所有控制器
4.2.2 拦截特定的的 url
<!--拦截器-->
<mvc:interceptors>
<!--拦截所有-->
<bean class="com.lcy.interceptor.DemoInterceptor"></bean>
<!--拦截特定url-->
<mvc:interceptor>
<mvc:mapping path="/demo"/>
<mvc:mapping path="/demo2"/>
<bean class="com.lcy.interceptor.DemoInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>