文章目录
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";
}
}