三、SpringMVC组件

1 请求处理流程

SpringMVC 通过前端控制器(DispatcherServlet)拦截并处理用户请求

在这里插入图片描述

  • DispatcherServlet 前端控制器,总控制器

    • 作用:接收请求,协同各组件工作,响应请求
  • HandlerMapping 处理器映射

    • 作用:负责根据用户请求的URL找到对应的Handler
    • 可以自定义配置 SpirngMVC提供多个处理器映射的实现,可以根据需要进行配置
  • HandlerAdapter 处理器适配器

    • 作用:根据HandlerMapping 解析用户请求后产生的调用链,通过适配器模式完成Handler的调用
  • Handler 处理器/控制器

    • 由工程师根据业务的需求进行开发
    • 作用:处理请求
  • ModelAndView 视图模型

    • 作用:用于封装处理器返回的数据以及响应的视图
    • ModelAndView = Model + View
  • ViewResolver 视图解析器

    • 作用:对ModelAndView进行解析
    • 可以自定义配置 SpirngMVC提供多个视图解析器的实现,可以根据需要进行配置
  • View 视图

    • 作用:完成数据渲染

2 处理器映射器

因为<mvc:annotation-driven/>自动注册了下面这些bean实例(可在实现类AnnotationDrivenBeanDefinitionParser中查看),所以要研究核心组件,需要将该注释删除。

处理器映射器,HandlerMapping接口的实现类,用来处理请求映射

  • RequestMappingHandlerMapping
  • BeanNameUrlHandlerMapping

处理器适配器

  • RequestMappingHandlerAdapter
  • HttpRequestHandlerAdapter
  • SimpleControllerHandlerAdapter

视图解析器

  • ExceptionHandlerExceptionResolver
  • ResponseStatusExceptionResolver

不同的处理器映射器对URL处理的方式也不相同,使用对应的处理器映射器之后,我们的前端请求规则也需要发生响应的变化

SpringMVC提供的处理器映射器:

  • BeanNameUrlHandlerMapping
  • SimpleUrlHandlerMapping
  • BeanNameUrlHandlerMapping
    在这里插入图片描述

2.1 RequestMappingHandlerMapping

使用注解方式@requestMapping的映射方式,访问路径为

http://localhost:8080/demo2_war/user/add

<!-- <mvc:annotation-driven/>-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>
package com.yiwu.controllers;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/add")
    public String addUser(){
        System.out.println("访问到了插入用户````");
        return "../success.jsp";
    }
    @RequestMapping("/delete")
    public String deleteUser(){
        System.out.println("访问到了删除用户");
        return "../success.jsp";
    }
}

2.2 SimpleUrlHandlerMapping

通过简单的url匹配的方式将其映射到一个处理器,处理器类需要实现Controller接口

http://localhost:8080/demo2_war/aaa

http://localhost:8080/demo2_war/bbb

package com.yiwu.controllers;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class StudentController implements Controller {

    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        System.out.println("访问到了插入学生信息````");
        return null;
    }
}

 <bean id = "studentController" class="com.yiwu.controllers.StudentController"/>
<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/aaa">studentController</prop>
            <prop key="/bbb">studentController</prop>
        </props>

    </property>
</bean>

2.3BeanNameUrlHandlerMapping

使用Name的方式定位controller,我们的Controller类必须(直接|间接)实现Controller接口。默认情况
http://localhost:8080/demo2_war/abc

 <bean id = "studentController" name = "/abc" class="com.yiwu.controllers.StudentController"/>
<!--默认情况,因此可以不写 BeanNameUrlHandlerMapping-->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

3 视图解析器 ViewResolver

​ 使用ViewResolver对控制器返回的ModelAndView对象进行解析,将逻辑视图转换成物理视图。ModelAndView中View 负责渲染Model,例如找到代表View的jsp,用这个jsp去渲染Model中的数据。

SpringMVC提供了多个 视图解析器:

  • InternalResourceViewResolver

  • UrlBasedViewResolver

在spring-servlet.xml中配置视图解析器

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="../"/>
    <property name="suffix" value=".jsp"/>
</bean>
package com.yiwu.controllers;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/add")
    public String addUser(){
        System.out.println("访问到了插入用户````");
        //return "../success.jsp";
        return "success";
    }
    @RequestMapping("/delete")
    public String deleteUser(){
        System.out.println("访问到了删除用户");
        return "success";
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

老去的90后

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

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

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

打赏作者

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

抵扣说明:

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

余额充值