SpringMVC学习中记录的知识点

目录

SpringMVC中的重要组件及原理分析

跳转方式

视图解析器

SpringMVC作用域传值的方式

文件下载

文件上传

自定义拦截器


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>

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值