总结内容

一、什么是 Spring MVC ?

Spring MVC 是 Spring 对 MVC 思想的实现(三层架构)

优点:

  • 它解决 Web 开发中常见的问题(参数接收、文件上传、表单验证、国际化等),而且使用简单
  • 最优秀的 MVC 框架 (更安全,性能更好,更简单)
  • 支持 RESTful 风格的 URL 请求 ,非常容易与其他视图技术集成,如 Velocity、FreeMarker、JSP 等。
  • 采用了松散耦合可插拔组件结构,比其他 MVC 框架更具扩展性和灵活性。

二、前端控制器

在 MVC 框架中都存在,是一个入口控制器(Controller),用来集中统一处理请求

​ => 然后把请求分发给相应的处理程序。

​ => 因此提高了可重用性 和 可拓展性。

Spring MVC 中的前端控制器:

**Spring MVC:**它提供了一个 DispatcherServlet 类作为前端控制器,所以要使用它必须在 web.xml 中配置。

配置前端控制器:

<!--在 main 目录新建 webapp/WEB-INF/web.xml-->

<!--添加如下内容-->
<!-- Spring MVC 前端控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定 Spring 容器启动加载 Spring MVC的配置文件-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:mvc.xml</param-value>
</init-param>
<!-- Tomcat 时启动初始化该 前端控制器 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

配置:mvc.xml

<!-- 配置 IoC DI 注解解析器,让 Spring 我们创建 XxxController 类的对象 -->
<context:component-scan base-package="cn.wolfcode.web.controller"/>
<!-- MVC 注解解析器 -->
<mvc:annotation-driven/>

编写处理器类:

@Controller
public class HelloController {
//用来处理请求地址映射的注解,可用于类或方法上
@RequestMapping("/hello")
public ModelAndView save() {
// 通过创建这个类对象,告诉 Spring MVC 找什么视图文件,往作用域或者说往模型中存入什么数据
ModelAndView mv = new ModelAndView();
// 往作用域或者模型中存入数据
mv.addObject("msg", "Hello Spring MVC");
// 找视图 类似 请求转发
mv.setViewName("/WEB-INF/views/hello.jsp");
return mv;
}
}

三、映射路径问题

Tomcat容器:

  • 静态资源请求 :处理静态资源是交由内置的 DefaultServlet 来处理的(拦截路径是 /)
  • jsp请求:处理 JSP 资源是交 由内置的 JspServlet 处理的(拦截路径是*.jsp | *.jspx)
  • 其他请求:(自定义拦截),由具体是servlet处理。如 Spring MVC 就由DispatcherServlet处理

项目启动,先加载(Tomcat)容器的 web.xml,而后加载项目中的 web.xml。

​ => 当拦截路径在两者文件中配置的 一样,后面会覆盖掉前者。

项目启动,解析web.xml,创建所有配置的 Servlet、Filter、Listener…这些对象,由Tomcat管理。

​ =>而,在web.xml里配置的DispatcherServlet类里的,所有的在 mvc.xml里解析配置了注解的

​ XxxServlet类创建出来,并交由Spring来管理。

Spring MVC:DispatcherServlet类,推荐(拦截路径是 /)

问题:

如果 DispatcherServlet类里配置了 / 或 /*

​ => 所有 静态资源 或 (静态资源和 JSP) 都会交由前端控制器处理,

​ =>但,由于项目里的的XxxControlle类配置了具体的访问路径 如("/hello")

​ =>所以,会导致访问静态资源和 JSP 被拦截(访问不到)

解决:

1、修改前端控制器的映射路径:

<!--访问控制器里的处理方法时,请求路径须携带 .do。-->
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

2、在 mvc.xml 配置

<mvc:default-servlet-handler/>

它就会对进入 DispatcherServlet 的请求进行筛查,

=> 若不是映射的请求,就将该请求交由容器默认的 Servlet 处理。

四、处理响应

1、返回 ModelAndView:上面有例子

2、返回String (要共享数据,和 Model 参数组合使用,用其往作用域或模型中存 入数据。)

@Controller
public class ResponseController {
// 提供方法处理请求,localhost/hello2
@RequestMapping("/hello2")
public String resp2(Model model) {
// 往作用域或者模型中存入数据
model.addAttribute("msg", "方法返回类型是 String");
// 返回视图名
return "/WEB-INF/views/hello.jsp"; //消除前后缀之后 => return hello;
}
}

消除视图前缀和后缀:mvc.xml

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 视图前缀 -->
<property name="prefix" value="/WEB-INF/views/"/>
<!-- 视图后缀 -->
<property name="suffix" value=".jsp"/>
</bean>

请求转发及 URL 重定向:

  • 请求转发: 例
return "forword:/WEB-INF/views/hello.jsp";
  • 重定向: 例
return "redirect:/static/demo.html";

注意:

  • 加了 /,使用是绝对路径(推荐使用),从项目根路径找( “redirect:/…”)
  • 没加 /,使用是相对路径,相对于上一次访问上下文路径的上一级找( “redirect:…”)

五、处理参数

1、请求参数名和处理方法方法的形参同名:(推荐使用包装类)

2、不同名可以使用注解:@RequestParam(“username”)String name ,

3、处理复合类型请求参数:(Spring 会帮你封装好)

  • 数组类型:可以使用对应类型的数据

  • 自定义类型:(使用类来封装:注意传递参数名与封装对象的属性名一致)=> 底层通过set方法

  • 日期类型:

    • // 在方法上
      public ModelAndView resp(@DateTimeFormat(pattern="yyyy-MM-dd")Date date){...}
    • // 在类字段上,贴注解
      @DateTimeFormat(pattern="yyyy-MM-dd")
      private Date date;

4、ModelAttribute 注解:

// 给形参贴 @ModelAttribute,用来修改存在模型中使用的 key
public String resp7(@ModelAttribute("u")User user) {...}
${u}   //jsp页面回显数据

//没给形参贴@ModelAttribute时,模型对象model是用形参的类型来作为key
//这里处理方法返回类型是String,mvc会创建Model对象,并自动储存User对象,并以形参的类型来作为key,因此处理方法无需把model对象传进来用于存储User对象
//如果处理方法返回类型是ModelAndView,则需自行调用ModelAndView的addObject方法把User对象存入作用域
//形参必须是自定义类型,否则mvc创建model对象不会自动存储,需自行把module对象传进来以便存储
@RequestMapping("/noUseModelAttribute")
public String noUseModelAttribute(User user) {
return “modelAttribute”;
}

六、文件上传

1、设置文件上传大小(在web.xml 里的 标签里添加

<multipart-config>
<max-file-size>52428800</max-file-size>
<max-request-size>52428800</max-request-size>
</multipart-config>

2、配置上传解析器:

<!--这里  bean 名称是固定的,必须为multipartResolver-->
<bean id="multipartResolver"
class="org.springframework.web.multipart.support.StandardServletMultipartResolver"/>

3、编写上传控制器:

@Controller
public class UploadController {
// Spring 容器存在 ServletContext 类型的对象,
//所以定义好 ServletContext 类型字段贴 @Autowired 注解即可获取到
@Autowired
private ServletContext servletContext;
@RequestMapping("/upload")
public ModelAndView upload(Part pic) throws Exception {
pic.getContentType(); // 文件类型
pic.getName(); // 文件参数名
pic.getSize(); // 文件大小
pic.getInputStream(); // 文件输入流
// FileCopyUtils.copy(in, out),一个 Spring 提供的拷贝方法
// 获取项目 webapp 目录下 uploadDir 目录的绝对路径
servletContext.getRealPath("/uploadDir");
return null;
}
}

七、拦截器

作用:Spring MVC 提供的,主要用于对请求访问 控制器的方法进行拦截,项目中用于登录与权限等判断。

自定义拦截器:

定义一个类实现 HandlerInterceptor :

public class MyInterceptor implements HandlerInterceptor {
// 处理方法之前 , true 放行 ; false 拦截
public boolean preHandle(...){...} // 处理方法之后,渲染视图之前
public void postHandle(...){...} // 渲染视图之后
public void afterCompletion(...){...}
}

配置拦截器 mvc.xml

<mvc:interceptors>
<!-- 配置拦截器 -->
<mvc:interceptor>
<!-- 拦截的路径 -->
<mvc:mapping path="/**"/>
<!-- 被排除的路径
<mvc:exclude-mapping path="排除的路径"/> -->
<!-- 拦截器类 -->
<bean class="cn.wolfcode.web.interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>

注:若配置 /** 则会拦截所有进入 前端控制器的请求;

​ 若是 /* ,不会拦截多层的请求如: /a/b /static/hello.html

八、乱码处理

get请求:Tomcat 8之后已经解决了。

post请求:在 web.xml 直接使用 Spring MVC 内置的过滤器来处理。

<!-- 编码过滤器,仅针对 POST 方式 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filterclass>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>

总结

以上就是对 Spring 和 SpringMVC 常用注解常用注解的总结了,代码仅供参考,欢迎讨论交流。

SpringMVC 配置和请求方式的更多相关文章

  1. SpringMVC(四) RequestMapping请求方式

    常见的Rest API的Get和POST的测试参考代码如下,其中web.xml和Springmvc的配置文件参考HelloWorld测试代码中的配置. 控制类的代码如下: package com.ti ...

  2. springmvc 配置异步请求

    最开始按照网上配置了一个servlet class 没有继承Filter .结果报错.网上有文章说是tomcat 启动加载的servlet-3.0- api 加载了 tomcat 安装目录下lib里边 ...

  3. springmvc配置首页的方式

    <mvc:view-controller path="/" view-name="redirect:/user/loginUI" />

  4. SpringMVC(二):RequestMapping修饰类、指定请求方式、请求参数或请求头、支持Ant路径

    @RequestMapping用来映射请求:RequestMapping可以修饰方法外,还可以修饰类 1)SpringMVC使用@RequestMapping注解为控制指定可以处理哪些URL请求: 2 ...

  5. 【spring springmvc】这里有你想要的SpringMVC的REST风格的四种请求方式

    概述 之前的文章springmvc使用注解声明控制器与请求映射有简单提到过控制器与请求映射,这一次就详细讲解一下SpringMVC的REST风格的四种请求方式及其使用方法. 你能get的知识点 1.什 ...

  6. springmvc国际化 基于请求的国际化配置

    springmvc国际化 基于请求的国际化配置 基于请求的国际化配置是指,在当前请求内,国际化配置生效,否则自动以浏览器为主. 项目结构图: 说明:properties文件中为国际化资源文件.格式相关 ...

  7. SpringMVC的REST风格的四种请求方式

    一. 在HTTP 协议里面,四个表示操作方式的动词:GET.POST.PUT.DELETE. ·它们分别对应四种基本操作: 1.GET  ====== 获 取资源 2.POST ======新建资源 ...

  8. springMVC配置时,静态资源和jsp文件路径没错但是访问时controller的请求报404错误。

    springMVC配置时,静态资源和jsp文件路径没错但是访问时controller的请求报404错误. 1.场景 如果在web.xml中servlet-mapping的url-pattern设置的是 ...

  9. 第二节(RequestMapping请求方式)学习尚硅谷-springmvc视频教程

    项目中,创建测试类SpringMVCTest @Controller @RequestMapping("/springmvc1") public class SpringMVCTe ...

随机推荐

  1. 关于 vue2.x 的 $attrs 和 $listeners

    $attrs $attrs 用于多层次组件传递参数(组件标签的attribute,class和style除外),爷爷辈组件向孙子辈组件传递参数(注:参数不能被父辈prop识别,一旦被父辈prop识别且 ...

  2. Lua中如何实现类似gdb的断点调试--04优化钩子事件处理

    在第一篇的01最小实现中,我们实现了一个断点调试的最小实现,在设置钩子函数时只加了line事件,显然这会对性能有很大的影响.而后来两篇02通用变量打印和03通用变量修改及调用栈回溯则是提供了一些辅助的 ...

  3. Linux-系统启动与MBR扇区修复

    目录 1.系统启动过程 1.1 MBR扇区 1.2 MBR扇区的备份与还原 1.3 修复MBR 1.3.1 dd备份MBR信息 1.3.2 光驱启动修复 1.4 grub引导代码修复 1.系统启动过程 ...

  4. Vue3中setup语法糖学习

    目录 1,前言 2,基本语法 2,响应式 3,组件使用 3.1,动态组件 3.2,递归组件 4,自定义指令 5,props 5.1,TypeScript支持 6,emit 6.1,TypeScript ...

  5. Laravel-QueryList-采集

    <?php namespace App\Http\Controllers; use App\Models\NewsModel; use Illuminate\Http\Request; use ...

  6. ListBox 控件模板

    <Window x:Class="WpfApplication22.MainWindow" xmlns="http://schemas.microsoft.com/ ...

  7. Net之多线程用法

    1.多线程 2.线程池 3.Task using System; using System.Collections.Generic; using System.Linq; using System.T ...

  8. 使用Github Action自动填写疫情通

    使用Github Action自动填写疫情通 西电晨午晚检一天三次,通过企业号功能进行填写.实际上,西电企业号大部分功能是以网页模式工作的,通过构造connection发送合适的request,设置计 ...

  9. 分布式 PostgreSQL 集群(Citus),分布式表中的分布列选择最佳实践

    确定应用程序类型 在 Citus 集群上运行高效查询要求数据在机器之间正确分布.这因应用程序类型及其查询模式而异. 大致上有两种应用程序在 Citus 上运行良好.数据建模的第一步是确定哪些应用程序类 ...

  10. Nginx配置不当(CRLF注入 、目录穿越)

    基于vulhub漏洞环境 环境搭建参考:https://blog.csdn.net/qq_36374896/article/details/84102101 1.漏洞名称 CRLF注入 2.漏洞原理 ...