springmvc(二)工作流程

一、SpringMVC工作流程分析

在这里插入图片描述

  1. 用户通过浏览器发送请求到前端控制器DispatcherServlet
  2. 前端控制器将请求转给处理映射器HandlerMapping
  3. 处理映射器HandlerMapping根据请求,找到负责处理请求的处理器,并将其封装为处理器请求链HandlerExecution返回给前端控制器DispatcherServlet
  4. 前端控制器DispatcherServlet根据处理器执行链中处理器,找到执行该处理器的适配器HandlerMapping。
  5. 处理器的适配器HandlerMapping调用执行处理器Controller。
  6. 处理器Controller将处理结果和跳转视图封装为一个对象ModelAndView,并将其返回给处理适配器HandlerMapping。
  7. 处理适配器将结果直接返回给DispatcherServlet。
  8. 前端控制器调用视图解析器,将ModelAndView中视图名称封装成为视图对象。
  9. 视图解析器ViewResolver将封装的View对象返回给前端控制器DispatcherServlet。
  10. 前端控制器DispatcherServlet调用视图对象,让其自己进行渲染,进行数据填充,形成响应对象。
  11. 前端控制器响应浏览器。

1.1、SpringMVC组件

1、DispatcherServlet:前端控制器,也称为中央处理器或者核心控制器。

用户请求的入口控制器,相当于mvc中的c,DispatcherServlet是整个流程控制的中心,相当于SpringMVC的大脑,由它调用其他组件处理用户请求。DispatcherServlet的出现降低了组件之间的耦合性,SpringMVC提供该核心控制器需要我们在web.xml中配置。

2、HandlerMapping:处理器映射器

handlerMapping,派发请求的控制器。我们不需要自己控制该类,但是他是SpringMVC运转过程中一个重要的控制器。HandlerMapping负责根据用户请求找到Handler处理器(controller)SpringMVC提供了不同映射器实现不同映射方式。例如:配置文件、实现接口、注解方式等等。实际开发中,我们常用的是注解方式。

3、Handler:处理器

Handler是后端控制器,在DispatcherServlet的控制下Handler对用户的请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况下程序员根据业务需求开发Handler(这里的Handler一般指controller)

4、HandlerAdapter:处理器适配器

通过HandlerAdapter对处理器进行执行。这是适配器模式的应用,通过扩展处理器适配器,支持更多类型的处理器,调用处理器传递参数等工作。

5、ViewResolver:视图解析器

ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成为物理视图名称,即具体页面地址,再生成View视图对象,最后对View进行渲染,将处理结果通过页面展示给用户,SpringMVC提供了很多视图类型。包括:jstlView、freemarkerView、pdfView等。一般情况下需要通过页面标签或者页面模板技术将模型数据展示给用户,需要由程序员根据业务需求开发具体页面。

二、@RequestMapping注解

2.1、@RequestMapping出现的位置

@RequestMapping定义了处理器对请求的映射规则,该注解可以定义在类上,也可以定义在方法上。但是含义不同。

在这里插入图片描述

一个@Controller所注解的类中,可以定义多个处理器方法。当然,不同的处理器所匹配的URI不同,这些URI被指定在注解在方法之上的@RequestMapping注解的value属性上。但若这些请求具有相同的URI部分,这些相同的URI部分可以被抽取到注解到类上面RequestMapping注解的value属性中。此时这个URI表示模块名称,URI请求是相对于web的根目录。在类的级别上的注解会将一个特定的请求或者请求模式映射到一个控制器之上,之后你还可以进一步添加方法级别注解来指定到处理方法的映射关系。

2.2、指定请求方式

@RequestMapping的method属性,用来对被注解方法的所处理请求的提交方式进行限制,即只有满足method属性指定的提交方式的请求,才会执行该被注解的方法。

Method属性的取值为RequestMapping的枚举常量,常用的包括RequestMapping.POST和
RequestMapping.GET。

@Controller("job")
public class JobController {

    @Autowired
    private JobService jobService;

    @RequestMapping(value="add.do",method = RequestMethod.GET)
    public ModelAndView add(){
        System.out.println("JobController---------------add-------------");
        ModelAndView mv=new ModelAndView();
        mv.setViewName("job/add");
        return mv;
    }

    @RequestMapping(value="update.do",method = RequestMethod.POST)
    public ModelAndView update(){
        System.out.println("JobController---------------update-------------");
        ModelAndView mv=new ModelAndView();
        mv.setViewName("job/update");
        return mv;
    }

    @RequestMapping("hello.do")
    public ModelAndView hello(HttpServletRequest request) {
        System.out.println("JobController---------------hello-------------");
        jobService.add();
        ModelAndView mv = new ModelAndView();
        mv.addObject("jobName", "测试");//相当于 request.setAttribute("jobName","测试");
        mv.setViewName("index");//未经过springmvc视图解析器处理,转换成物理资源路径,相当于返回request.getRequestDispatcher("index.jsp").forward();
        //经过InternalResourceViewResolver对象的处理之后加上前后缀就变为了 /index.jsp
        return mv;
    }
}

在这里插入图片描述

常用的提交方式:

请求方式提交方式
地址栏请求get请求
超链接请求get请求
表单请求默认get,可以指定post
Ajax请求默认get,可以指定post

2.3、url-pattern解析

2.3.1、url-pattern解析

在web.xml配置SpringMVC前端控制器时有这个节点,这个节点值一般有两种写法:

  1. *.do:在没有特殊要求情况下,SpringMVC前端控制器DispatcherServlet常使用后缀匹配方式,如: *.do、 *.action、 *.mvc
  2. / : DispatcherServlet会将静态内容:.css、.js图片资源等,也当做普通的controller请求,前端控制器会调用处理器映射器为其查找相应的处理器。所有静态资源请求会出现404找不到情况。

2.3.2、静态资源的访问

springmvc配置文件中添加: <mvc:default-servlet-handler />

使用<mvc:default-servlet-handler />以后,springmvc框架会在容器中创建DefaultServletHttpRequestHandler处理器对象,该对象会对所有进入SpringMVC容器的url进行检查,如果发现是静态资源请求,就将该请求转给web应用服务器默认的Servlet进行处理。

一般服务器都有默认servlet,例如Tomcat服务器中就有专门处理静态资源的DefaultServlet.其是default,可以处理任何静态资源请求。该Servlet注册在tomcat的web.xml中,在tomcat安装目录/conf/web.xml中。

在这里插入图片描述

springmvc配置文件中添加:<mvc:resources />

<mvc:resources location="/images/" mapping="/images/**" />
<!--
    location:静态资源所在目录,且不要使用/WEB-INF/及其子目录
    mapping:表示对该资源的请求,注意后面加了两个*号
-->

在spring3.0以后,Spring定义了专门用于处理静态资源访问请求的处理器ResourceHttpServletRequestHandler,并添加了标签<mvc:resources />用于处理静态资源无法访问的问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笑谈子云亭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值