概述

  • 是Spring为展示层提供的基于MVC设计理念的Web框架,通过一套MVC注解,让POJO成为解决申请的控制器,而无需实现任何接口
  • 反对REST格调的URL申请
  • 采纳涣散耦合的可插拔组件构造,比其余MVC框架更具扩展性和灵活性
  • SpringMVC的IOC容器是Spring的IOC容器的子容器,故而可援用Spring的IOC中的bean,反之则不行

运行流程

  • 以后端发出请求时,首先进入到DispatcherServlet(地方控制器),把申请的地址传给HandlerMapping处理器映射器中进行比对(Handler即蕴含了咱们申请的Controller类和Method办法的对象)
  • 未找到则示意动态资源,进入defaultServlet处理器,返回前端
  • 找到则示意动静资源,调用AdapterMap数据适配器,获取该资源的执行列表(指标办法,拦截器办法),并返回处理器执行链(HandlerExecutionChain)给地方控制器
  • 地方控制器将后果交给HandlerAdapter处理器适配器,顺次执行执行列表的办法,返回逻辑视图ModelAndView给地方控制器
  • 将后果交给ViewResolver视图解析器,遍历生成具体的View物理视图
  • 地方控制器调用render办法渲染视图,行将数据文件转化成可视化界面返回前端

步骤

  • 导入jar包,在web.xml中配置地方控制器DispatcherServlet,退出SpringMVC配置文件
<servlet>        <servlet-name>springDispatcherServlet</servlet-name>        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>        <!-- 配置地方控制器的初始化参数:配置文件的地位和名称 -->        <init-param>            <param-name>contextConfigLocation</param-name>            <!-- 默认为WEB-INF/<servlet-name>-servlet.xml -->            <param-value>classpath:spring/springmvc.xml</param-value>        </init-param>        <!-- 配置servlet被加载的先后顺序 -->        <!-- 为正数或者没有设置,则容器会当Servlet被申请时再加载 -->        <!-- 为正整数或者0时,示意容器在利用启动时就加载并初始化这个servlet -->        <!-- 值越小,servlet的优先级越高,就越先被加载。值雷同时,容器就会本人抉择程序来加载 -->        <load-on-startup>1</load-on-startup></servlet><servlet-mapping>        <servlet-name>springDispatcherServlet</servlet-name>        <url-pattern>/</url-pattern></servlet-mapping>
  • 编写解决申请的处理器并标识@Controller,编写视图
  • 应用@RequestMapping("/地址") //映射申请的URL,可放在类与办法上,办法返回值进入视图解析器(应用@GetMapping("/地址")响应get申请,@PostMapping("/地址")响应post申请)
<!--注解驱动,以使得拜访门路与办法的匹配能够通过注解配置--><mvc:annotation-driven /><!-- 在配置dispatchServlet时配置<url-pattern>/</url-pattern>拦挡所有申请,这时候dispatchServlet齐全取代了default servlet,将不会再拜访容器中原始默认的servlet,而对动态资源的拜访就是通过容器默认servlet解决的,故而这时候动态资源将不可拜访,应用下列标签拜访动态资源 --><mvc:default-servlet-handler/>
  • 在SpringMVC配置文件中配置要扫描的包,配置视图解析器
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">        <property name="prefix" value="/响应地址前缀/"></property>        <property name="suffix" value=".后缀"></property></bean>

REST

  • 资源体现层状态转换,是一种互联网软件架构
  • 资源:网络上的一个实体即一个具体信息,可为一段文字,一张图片,一种服务,总之是一个具体的存在,能够用URI指向它,每种资源对应一个特定的URI,拜访URI可获取这个资源
  • 体现层:把资源具体出现进去的模式,就为体现层,如txt、json、html、二进制等
  • 状态转化:每收回一次申请,就代表客户端和服务器的一次交互过程,http为无状态协定,所有的状态保留在服务器中,因而要想操作服务器,必须通过某种伎俩,让服务器产生状态转化。Http协定里有四种基本操作:GET用来获取资源,POST用来新建资源,PUT用来更新资源,DELETE用来删除资源

注解

  • @RequestMapping

    • 为控制器指定可解决那些申请,进而确定执行那个办法
    • 定义类上:提供初步的申请映射信息
    • 定义方法上:提供细分的映射信息
    • 属性

      • value:申请url
      • method:申请办法(RequestMethod.get,RequestMethod.post)多值用数组
      • params:申请参数

        • 值可应用简略表达式,例!p示意申请参数不能蕴含p
        • params={“name”,“age!=10”} 参数age不为10
      • heads:申请头

        • 值可应用简略表达式,heads={“Accept-Language=en-US,zh”}
      • 可联结应用,使申请更加精确化
    • 反对Ant格调匹配符

      • 匹配文件名中的一个字符 ?
      • 匹配文件名中的任意字符 *
      • 匹配多层门路 **
    • @PathVariable 用来将URL中的占位符参数绑定到指标办法的参数中

      • @RequestMapping("/a/{id}")

        • @PathVariable(“id”)
    • HiddenHttpMethodFilter 过滤器将申请转换为规范的http办法,使浏览器form表单反对put,delete申请
    <filter>    <filter-name>HiddenHttpMethodFilter</filter-name>    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class></filter><filter-mapping><filter-name>HiddenHttpMethodFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
*   CharacterEncodingFilter 过滤器用于解决中文```<filter>    <filter-name>CharacterEncodingFilter</filter-name>    <filter-class>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>```
  • @RequestParam

    • 用来映射url中申请参数
    • 定义在办法形参前,给形参赋值
    • 属性

      • value:申请参数的参数名
      • required:该参数是否必须,默认为true
      • defaultValue:申请参数默认值
  • @RequestHeader

    • 映射申请头信息
    • 将申请报头的属性值绑定到解决办法的形参中
    • 申请头蕴含若干属性,服务器可据此获知客户端信息
    • 属性

      • value:申请头参数的参数名
  • @CookieValue

    • 映射Cookie信息
    • 属性与RequestParam雷同
  • @ResponseBody

    • 标注在办法上
    • 将java对象转为json格局的数据
    • 将controller的办法返回的对象通过适当的转换器转换为指定的格局之后,写入到response对象的body区,通常用来返回JSON或XML数据(用于异步获取数据)
    • 在应用此注解之后不会再走视图处理器,而是间接将数据写入到输出流中,他的成果等同于通过response对象输入指定格局的数据
    • 所需jar包:jackson-annotations-2.9.0.pr2.jar,jackson-core-2.9.0.pr2.jar,jackson-databind-2.9.0.pr2.jar
    • 应用fastJSON.jar 对象转json:JSON.toJSONString(对象)
    • 应用fastJSON.jar json转对象:JSON.parseObject(json,对象.class)
  • @RequestBody

    • 标注在形参上
    • 将前台发送过去的JSON或XML数据封装为对应的 JavaBean 对象,封装时应用到的一个对象是零碎默认配置的 HttpMessageConverter 进行解析,而后封装到形参上
    • GET、POST形式提交

      • 表单属性 enctype

        • 可选 application/x-www-form-urlencoded
        • 不能解决 multipart/form-data 格局的数据
        • 必须 application/json,application/xml 格局的数据
    • PUT形式提交

      • 表单属性 enctype

        • 必须 application/x-www-form-urlencoded
        • 不能解决 multipart/form-data 格局的数据
  • @initBinder

    • 提供数据绑定,可对WebDataBinder对象进行初始化
    • 标注办法不能有返回值
  • @NumberFormat

    • 对数字类型的属性格式化
  • @DateTimeFormat

    • 对日期类型属性格式化
    • pattern属性:yyyy-MM-dd hh:mm:ss

处理器参数

POJO
  • 一般Java类,具备一部分getter/setter办法的那品种就能够称作POJO,实际意义就是一般的JavaBeans(简略的实体类),特点就是反对业务逻辑的帮助类
  • SpringMVC会按申请参数名与pojo属性名进行主动匹配,主动填充属性值。且反对级联属性
servlet原生API
  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
  • java.security.Principal
  • Locale
  • InputStream
  • OutputStream
  • Reader
  • Writer

处理器解决模型数据

Map,Model或ModelMap类型
  • 应用org.springframework.ui.Model接口存储模型数据
  • 过程:在调用办法前会创立一个隐含的模型对象作为存储容器,如果参数是Map或Model类型,则将模型的援用传递给参数,从而通过参数对象拜访模型中的数据或向模型中增加新属性数据
  • 增加Map.put(“对象名”,对象值)、Model.addAttribute(“对象名”,对象值)
  • 返回String类型
ModelAndView类型
  • 蕴含视图与模型信息
  • ModelAndView ret = new ModelAndView(); //实例化
  • ret.add(“对象名”,对象值) //增加数据到ModelAndView中
  • SpringMVC会把ModelAndView的Model中的数据放到request域对象中
  • 返回ModelAndView类型
@SessionAttributes
  • 用于在多个申请之间专用某个模型属性数据
  • 标注在控制器类上,使属性暂存在HttpSession中,属性就可在session中获取
  • 属性

    • value={属性名}
    • types={属性类型.class}
@ModelAttribute
  • 标注在办法上,使每个指标办法执行之前被SpringMVC调用将标注办法的属性赋值给对应参数
  • 标注在pojo类型形参前,使形参为被@ModelAttribute标注的办法的属性
  • 注:在标注办法中放入map中的键与指标办法形参统一(首字母小写)

视图解析器

  • 对于返回String,View,ModeMap等类型,SpringMVC会在外部将它们装配成一个ModelAndView对象,蕴含逻辑名和模型对象的视图,借助视图解析器最终失去视图对象View
  • 视图的作用是渲染模型数据,将模型里的数据以某种模式出现给客户
  • 视图对象由视图解析器负责实例化。因为视图是无状态的,所以他们不会有线程平安的问题。所谓视图是无状态的,是指对于每一个申请,都会创立一个View对象
  • JSP是最常见的视图技术,联合JSTL应用
  • 罕用视图解析器实现类

    • BeanNameViewResolver:将逻辑视图解析为一个bean,bean的id等于逻辑视图名,主动依据咱们的视图名找到对应的视图Bean进行解析
    • InternalResourceViewResolver:将视图名解析为一个url文件,会把 Controller 处理器办法返回的模型属性都寄存到对应的 request 属性中,而后通过 RequestDispatcher 在服务器端把申请 forword 重定向到指标 URL
    • 多个解析器可通过order属性来指定优先级,越小优先级越高

转向与重定向

  • 个别状况下控制器办法返回字符串类型的值会被视图解析器解决
  • 若返回字符串带有前缀,则做非凡解决,把其后字符串作为url
  • 重定向:在返回值前加redirect:
  • 转向:在返回值前加forward:

配置文件标签

  • <mvc:annotation-driven/> //注解驱动

    • 主动注册 RequestMappingHandlerMapping,RequestMappingHandlerAdapter 与 ExceptionHandlerExceptionResolver 三个bean(3.1以上)
    • 主动为咱们将扫描到的@Component,@Controller,@Service,@Repository等注解标记的组件注册到工厂中,来解决咱们的申请,而<context:component-scan/>标签是通知Spring 来扫描指定包下的类,并注册被上述注解标记的组件
  • <mvc:default-servlet-handler/>

    • 会在Spring MVC上下文中定义一个org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler,它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是动态资源的申请,就将该申请转由Web应用服务器默认的Servlet解决,如果不是动态资源的申请,才由DispatcherServlet持续解决
    • 个别Web应用服务器默认的Servlet名称是"default",因而DefaultServletHttpRequestHandler能够找到它。如果你所有的Web应用服务器的默认Servlet名称不是"default",则须要通过default-servlet-name属性显示指定
  • <mvc:view-controller>

    • 发送的申请不想通过controller,只想间接地跳转到指标页面
    • path=“拜访的门路”(相当于RequestMapping(“拜访的门路”))
    • view-name=“跳转的视图” (相当于return “跳转的视图”)
    • 必须配置 <mvc:annotation-driven />
    • 与处理器雷同则生效

文件上传

  • 所需jar包:commons-fileupload-1.3.2.jar,commons-io-2.5.jar
  • SpringMVC通过即插即用的MultipartResolver接口实现,实现类为CommonsMultipartResolver
  • CommonsMultipartResolver配置

    • defaultEncoding必须与jsp页面pageEncoding属性统一
    • jsp页面表单属性enctype 必须 enctype=“multipart/form-data”
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">    <property name="defaultEncoding" value="UTF-8"></property>    <!--文件大小限定-->    <property name="maxUploadSize" value="5242880"></property></bean>
  • controller层形参类型为MultipartResolver
  • 获取上传文件名办法:getOriginalFilename()
  • 获取文件输出流:getInputStream()
  • 将文件写入磁盘:transferTo(门路)
  • 获取随机数 UUID uuid=UUID.randomUUID()
  • 定义为上传文件名String filePreName=uuid.toString().replaceAll("-", “”)

文件下载

  • 1.可通过链接间接下载特定的后缀的文件
  • 2.通过附件形式

    • 创立一个文件输出流 InputStream is=new FileInputStream(文件门路)
    • 转成字符数组 byte[] data=new byte[is.available()]
    • 写入流 is.read(data);
    • 实例化头部对象 HttpHeaders headers=new HttpHeaders()
    • 转码 String name=new String(readFileName.getBytes(“UTF-8”),“ISO8859-1”)
    • 设置附件 headers.setContentDispositionFormData(“attachment”, name)
    • 设置资源类型headers.setContentType(MediaType.APPLICATION_OCTET_STREAM)
    • 数据退出到附件中 ResponseEntity<byte[]> entity=new ResponseEntity<byte[]>(data, headers, HttpStatus.OK)

拦截器

  • 与过滤器不同的是拦截器拦挡动静资源,即所有被@RequestMapping,@GetMapping ,@PostMapping标注的资源
  • 实现HandlerInterceptor接口

    • public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) //指标办法之前执行,返回true示意放行
    • public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) //指标办法执行完结之后执行
    • public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) //页面销毁时执行
  • 拦截器配置
<mvc:interceptors>    <!--自定义拦截器-->    <bean class="拦截器类门路"></bean>    <!--抉择拦挡-->    <mvc:interceptor>        <!--拦挡门路,**代表门路及子门路-->        <mvc:mapping path="/**"/>        <!--不拦挡门路-->        <mvc:exclude-mapping path="/门路"/>        <bean class="拦截器类门路"></bean>    </mvc:interceptor></mvc:interceptors>

异样解决

  • 通过HandlerExceptionResolver接口解决异样,包含Handler映射,数据绑定以及指标办法执行产生的异样
  • ExceptionHandlerExceptionResolver实现类通过<mvc:annotation-driven/>加载

    • @ControllerAdvice //标注在自定义解决异样类上

      • 先找以后Handler中的@ExceptionHandler,若未找到匹配的异样类,则去ControllerAdvice标记的类中查找
    • @ExceptionHandler({异样类.class}) //标注在异样办法上产生此异样类主动执行办法解决异样,解决外部异样
  • ResponseStatusExceptionResolver实现类

    • @ResponseStatus //标注在继承此类的类上或产生异样的办法上

      • value:状态码
      • reason:信息
  • DefaultHandlerExceptionResolver实现类解决非凡异样,例申请办法异样
  • SimpleMappingExceptionResolver实现类

    • 可将不同的异样映射到不同的jsp页面(通过exceptionMappings属性的配置),同时咱们也能够为所有的异样指定一个默认的异样
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">      <!-- 定义默认的异样解决页面,当该异样类型的注册时应用 -->      <property name="defaultErrorView" value="error"></property>      <!-- 定义异样解决页面用来获取异样信息的变量名,默认名为exception -->      <property name="exceptionAttribute" value="ex"></property>      <!-- 定义须要非凡解决的异样,用类名或齐全路径名作为key,异样也页名作为值 -->      <property name="exceptionMappings">          <props>              <prop key="IOException">error/ioexp</prop>              <prop key="java.sql.SQLException">error/sqlexp</prop>          </props>      </property>  </bean>

导入其余配置文件

  • 1.通过<import resource=“文件”/>导入
  • 2.在web.xml中引入
<context-param>    <param-name>contextConfigLocation</param-name>    <param-value>classpath:文件门路</param-value></context-param><listener>     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>

最初

感激你看到这里,看完有什么的不懂的能够在评论区问我,感觉文章对你有帮忙的话记得给我点个赞,每天都会分享java相干技术文章或行业资讯,欢送大家关注和转发文章!