1.SpringMVC应用--开发流程、请求处理流程、九大组件

1. Spring MVC开发过程

1.web.xml中配置DispetcherServclet前端控制器

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >
​
<web-app>
  <display-name>Archetype Created Web Application</display-name>
​
  <!--
    配置Servlet
      1.配置servlet标签
        servlet-name
        servlet-class   org.springframework.web.servlet.DispatcherServlet
      2.配置servlet-mapping标签
        servlet-name  跟servlet标签中一样
        url-pattern   拦截哪些请求
          方式一:带后缀,比如*.action  *.do  *.aaa   *.bbb
          方式二:/   不会拦截.jsp
          方式三:/*  拦截所有请求,包括jsp
          推荐使用方式一或方式二
  -->
  <servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

2.开发处理具体业务逻辑的Handler(@Controller、@RequestMapping)

@Controller
@RequestMapping("/demo")
public class DemoController {
​
    @RequestMapping("/handle01")
    public ModelAndView handle01(){
        Date date = new Date();
        //封装了数据和页面信息的 ModelAndView
        ModelAndView modelAndView = new ModelAndView();
        //addObject 其实是向请求域中放入数据信息  类似:request.setAttribute("date",date);
        modelAndView.addObject("date",date);
        // 视图信息(封装跳转的页面信息)
        // modelAndView.setViewName("/WEB-INF/jsp/success.jsp");
        modelAndView.setViewName("success");
        return modelAndView;
    }
​
}

 

<%@ page isELIgnored="false"%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
跳转成功!当前系统时间:${date}
</body>
</html>

3.springmvc.xml配置文件配置controller扫描,配置springmvc三大件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/mvc
       http://www.springframework.org/schema/mvc/spring-mvc.xsd
">

    <!--开启controller扫描-->
    <context:component-scan base-package="com.lagou.edu.controller"/>

    <!--配置视图解析器  配置视图信息的前缀和后缀-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!--
        自动注册最合适的处理器映射器,处理器适配器
    -->
    <mvc:annotation-driven/>

    <!-- 静态资源配置,方案一 -->
    <!--
        原理:添加改标签配置之后,会在springmvc上下文中定义一个DefaultServletHttpRequestHandler对象
             这个对象如同一个检察人员,对进入DispatcherServlet的url请求进行过滤筛查,如果发现是一个静态资源请求
             会把请求转由web应用服务器(tomcat)默认的DefaultServlet来处理,如果不是静态资源请求,
             name继续由SpringMVC框架处理
    -->
    <mvc:default-servlet-handler/>

    <!--
        静态资源配置,方案二 SpringMVC框架自己处理静态资源
        mapping:约定静态资源的url规则
        location:约定的静态资源的存放位置
    -->
    <!--<mvc:resources location="classpath:/" mapping="/resources/**"/>-->

</beans>

4.将xml文件路径告诉springmvc(DispatcherServlet)

 

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>
  
  <servlet>
    <servlet-name>lagoumvc</servlet-name>
    <servlet-class>com.lagou.edu.mvcframework.servlet.LagouDispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath*:springmvc.properties</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>lagoumvc</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
  
</web-app>

5.测试代码

2. Spring MVC请求处理流程

 

 

流程说明

第一步:用户发送请求至前端控制器DispatcherServlet

第二步:DispatcherServlet收到请求调用HandlerMapping处理器映射器

第三步:处理器映射器根据请求url找到具体的Handler(后端控制器),生成处理器对象及处理器拦截器(如果有则生成),一并返回DispatcherServlet

第四步:DispatcherServlet调用HandlerAdapter处理器适配器去调用Handler

第五步:处理器适配器执行Handler

第六步:Handler执行完成给处理器适配器返回ModelAndView

第七步:处理器适配器向前端控制器返回ModelAndView,ModelAndView是Spring MVC框架的一个底层对象,包括Model 和 View

第八步:前端控制器请求视图解析器去进行视图解析,根据逻辑视图名来解析真正的视图。

第九步:视图解析器向前段控制器返回View

第十步:前端控制器进行视图渲染,就是将模型数据(在ModelAndView对象中)填充到Request域

第十一步:前端控制器向用户响应结果

3. Spring MVC 九大组件

  • HandlerMapping(处理器映射器)

    HandlerMapping是用来查找Handler的,也就是处理器。具体的表现形式可以是类,也可以是方法。比如,标注了@RequestMapping的每个方法都可以看成是一个Handler。Handler负责具体实际的处理请求,在请求到达后,HandlerMapping的作用便是找到请求对应的处理器Handler和Interceptor

  • HandlerAdapter(处理器适配器)

    handlerAdapter是一个适配器。因为Spring MVC中Handler可以使任意形式的,只要能处理请求即可。但是把请求交给Servlet的时候,由于Servlet的方法结构都是doService(HttpServletRequest req,HttpServletResponse resp)形式的,要让固定Servlet处理方法调用Handler来进行处理,便是HandlerAdapter的职责

  • HandlerExceptionResolver

    HandlerExceptionResolver用于处理Handler产生的异常情况。它的作用是根据一场设置ModelAndView,之后交给渲染方法进行渲染,渲染方法会将ModelAndView渲染成页面。

  • ViewResolver

    ViewResolver即视图解析器,用于将String类型的视图名和Locale解析为View类型的视图,只有一个resolverViewName()方法。从定义的方法可以看出,Controller层返回的String类型视图名的参数和数据填入模板中,生成html文件。ViewResolver在这个过程主要完成两件事:ViewResolver找到渲染所用的模板(第一件大事)和所用的技术(第二件大事,其实也就是找到视图的类型,如JSP)并填入参数。默认情况下,Spring MVC会自动为我们配置一个InternalResourceViewResolver,是针对JSP类型视图的。

  • RequestToViewNameTranslator

    RequestToViewNameTranslator组件的作用是从请求中获取ViewName,因为ViewResolver根据ViewName查找View,但有的Handler处理完成之后,没有设置View,也没有设置ViewName,便要通过这个组件从请求中查找ViewName。

  • LocaleResolver

    ViewResolver组件的resolveViewName方法需要两个参数,一个是视图名,一个是Locale。LocaleResolver用于从请求中解析出Locale,比如中国Locale是zh-CN,用来表示一个区域。这个组件也是i18n的基础。

  • ThemeResolver

    ThemeResolver组件是用来解析主题的。主题是样式、图⽚及它们所形成的显示效果的集合。Spring MVC 中⼀套主题对应⼀个 properties⽂件,⾥⾯存放着与当前主题相关的所有资源,如图⽚、 CSS样式等。创建主题⾮常简单,只需准备好资源,然后新建⼀个“主题名.properties”并将资源设置进去,放在classpath下,之后便可以在⻚⾯中使⽤了。 SpringMVC中与主题相关的类有ThemeResolver、 ThemeSource和Theme。 ThemeResolver负责从请求中解析出主题名,ThemeSource根据主题名找到具体的主题,其抽象也就是Theme,可以通过Theme来获取主题和具体的资源。

  • MultipartyResolver

    MultipartResolver ⽤于上传请求,通过将普通的请求包装成 MultipartHttpServletRequest 来实现。 MultipartHttpServletRequest 可以通过 getFile() ⽅法 直接获得⽂件。如果上传多个⽂件,还可以调⽤ getFileMap()⽅法得到Map<FileName, File>这样的结构, MultipartResolver 的作⽤就是封装普通的请求,使其拥有⽂件上传的功能。

  • FlashMapManager

    FlashMap ⽤于重定向时的参数传递,⽐如在处理⽤户订单时候,为了避免重复提交,可以处理完post请求之后重定向到⼀个get请求,这个get请求可以⽤来显示订单详情之类的信息。这样做虽然可以规避⽤户重新提交订单的问题,但是在这个⻚⾯上要显示订单的信息,这些数据从哪⾥来获得呢?因为重定向时么有传递参数这⼀功能的,如果不想把参数写进URL(不推荐),那么就可以通过FlashMap来传递。只需要在重定向之前将要传递的数据写⼊请求(可以通过ServletRequestAttributes.getRequest()⽅法获得)的属性OUTPUT_FLASH_MAP_ATTRIBUTE中,这样在重定向之后的Handler中Spring就会⾃动将其设置到Model中,在显示订单信息的⻚⾯上就可以直接从Model中获取数据。 FlashMapManager 就是⽤来管理 FalshMap 的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值