1. SpringMVC的工作流程

工作流程

  1. 用户通过浏览器发送请求至DispatcherServlet
  2. DispatcherServlet收到请求调用HandlerMapping
  3. HandlerMapping找到具体的处理器链返回给DispatcherServlet
  4. DispatcherServlet会根据返回的处理器链调用HandlerAdapter
  5. HandlerAdapter经过适配调用具体的Handler(controller)
  6. Controller执行完成返回一个执行结果
  7. HandlerAdapter将Handler的结果ModelAndView对象返回给DispatcherServlet
  8. DispatcherServlet将ModelAndView对象传给ViewReslover
  9. ViewReslover解析后得到具体View,并返回给DispatcherServlet
  10. DispatcherServlet根据View进行视图渲染(即将模型数据填充至视图中)
  11. DispatcherServlet会将渲染后的视图响应给浏览器

2. SpringMVC的三大组件

处理器映射器 负责根据URL寻找对应的处理器方法

处理器适配器 负责真正的去调用某个处理器方法

视图解析器 负责将逻辑视图转换成物理视图

SpringMVC自带三大组件,如果不进行配置也能正常使用.配置的相当于增强版

<!--视图解析器-->
<bean id="viewResolver"
      class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <!--SpringMVC的前端控制器允许我们以配置的形式传入前缀和后缀,他会在跳转视图的时候自动拼接-->
    <property name="prefix" value="/WEB-INF/"></property>
    <property name="suffix" value=".jsp"></property>
</bean>

3.RequestMapping

RequestMapping用于建立请求URL和处理方法之间的对应关系,也可以通过它的属性对请求做出各种限制

  • value: 用于限制请求URL(和path作用一样)

  • method:用于限制请求类型

  • params:用于限制请求参数的条件

此注解可以标注在方法上,也可以标注在类上,标注在类上代表类中的所有方法都可以共用一段URL

@Controller
@RequestMapping("/demoController")
public class DemoController {
    /**
     * 编写控制器
     * @RequestMapping:用于为当前方法绑定一个URL地址,作用就是为了前端请求的匹配
     */
    @RequestMapping("/demo1")
    public String demo01(){
        System.out.println("后台执行了...");
        // 返回值就是下一步要转发的页面
        return "success";
    }
}

4. 限制请求路径

4.1 页面

<a href="${pageContext.request.contextPath}/demoController/demo2">demo2@RequestMapping-path</a>
<a href="${pageContext.request.contextPath}/demoController/demo3">demo2@RequestMapping-path</a>

4.2 后台

@RequestMapping(path = {"/demo2","/demo3"})
public String demo02(){
    System.out.println("后台执行了...");
    // 返回值就是下一步要转发的页面
    return "success";
}

5. 限制请求类型

method,作用就是用于限定当前方法的提交方式,支持数组写法(同时多个)
如果不写method,代表所有请求方式都能运行

5.1 页面

<form action="${pageContext.request.contextPath}/demoController/demo4" method="post">
    <input type="submit" value="demo4@RequestMapping-mothod">
</form>

5.2 后台

/**
 * 编写控制器
 * @RequestMapping:用于为当前方法绑定一个URL地址,作用就是为了前端请求的匹配
 * method,作用就是用于限定当前方法的提交方式,支持数组写法(同时多个)
 * 如果不写method,代表所有请求方式都能运行
 */
@RequestMapping(value = "/demo4",method = RequestMethod.POST)
public String demo04(){
    System.out.println("value = \"/demo3\",method = RequestMethod.POST");
    // 返回值就是下一步要转发的页面
    return "success";
}

6. 限制请求参数

params用于限定请求参数的必传,不写代表不限制

6.1 页面

<a href="${pageContext.request.contextPath}/demoController/demo5?username=11">demo5@RequestMapping-params</a><br>

6.2 后台

/**
 * 编写控制器
 * @RequestMapping:用于为当前方法绑定一个URL地址,作用就是为了前端请求的匹配
 * params用于限定请求参数的必传,不写代表不限制
 */
@RequestMapping(value = "/demo5",params = "username")
public String demo05(){
    System.out.println("username");
    // 返回值就是下一步要转发的页面
    return "success";
}