本文已参与「新人创作礼」活动,一起开启掘金创作之路。
1.配置流程
1.其中服务器,加载配置文件
- DIspatcherServlet对象创建
- springmvc.xml被加载了
- ControllerDemo创建成对象
2.发送请求,后台处理
SpringMVC的原理如下图所示: 当发起请求时被前置的控制器拦截到请求,根据请求参数生成代理请求,找到请求对应的实际控制 器,控制器处理请求,创建数据模型,访问数据库,将模型响应给中心控制器,控制器使用模型与视图 渲染视图结果,将结果返回给中心控制器,再将结果返回给请求者。
2.3、SpringMVC执行原理
简要分析执行流程
- DispatcherServlet表示前置控制器,是整个SpringMVC的控制中心。用户发出请求, DispatcherServlet接收请求并拦截请求。 我们假设请求的url为 : http://localhost:8080/SpringMVC/hello 如上url拆分成三部分: http://localhost:8080服务器域名 SpringMVC部署在服务器上的web站点 hello表示控制器 通过分析,如上url表示为:请求位于服务器localhost:8080上的SpringMVC站点的hello控制器。
- HandlerMapping为处理器映射。DispatcherServlet调用HandlerMapping,HandlerMapping根据 请求url查找Handler。
- HandlerExecution表示具体的Handler,其主要作用是根据url查找控制器,如上url被查找控制器 为:hello。
- HandlerExecution将解析后的信息传递给DispatcherServlet,如解析控制器映射等。
- HandlerAdapter表示处理器适配器,其按照特定的规则去执行Handler。
- Handler让具体的Controller执行。
- Controller将具体的执行信息返回给HandlerAdapter,如ModelAndView。
- HandlerAdapter将视图逻辑名或模型传递给DispatcherServlet。
- DispatcherServlet调用视图解析器(ViewResolver)来解析HandlerAdapter传递的逻辑视图名。
- 视图解析器将解析的逻辑视图名传给DispatcherServlet。
- DispatcherServlet根据视图解析器解析的视图结果,调用具体的视图。
- 最终视图呈现给用户。
2.涉及的组件讲解
2.1 DispatcherServlet:前端控制器 用户请求到达前端控制器,它就相当于mvc模式中的c,dispatcherServlet是整个流程控制的中心,由它调用其他组件处理用户的请求,dispatcherServlet的存在降低了组件之间的耦合性 2.2 HandlerMapping:处理映射器 handlerMapping负责根据用户请求找到Handler即处理器,SpringMVC提供不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式 2.3 Handler:处理器 通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行 2.3 View Resolver:视图解析器 View Resolver负责将处理结果生成View视图,View Resolver 首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户 2.4 View:视图 SpringMVC框架提供了很多的View视图类型的支持,包括:jstlView、FreemarkerView、pdfView等,我们最常用的视图是jsp
一般情况下需要通过页面标签或页面模板技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面
2.5 <mvc:annotation-driver> 说明
在SpringMVC的各个组件中,处理器映射器、处理器适配器、视图解析器称为SpringMVC的三大组件 使用<mvc:annotation-driver> 自动加载 RequestMappingHandlerMapping(处理器映射器)和RequestMappingHandlerAdapter(处理器适配器),可用在SpringMVC.xml配置文件中使用<mvc:annotation-driver>替代注解处理器和适配器的配置 它就相当于在xml中配置了:
<!--开启SpringMVC注解框架的支持-->
<mvc:annotation-driven/>
RequestMapping的属性:value:用于请求的URL、他和path属性作用是一样的 path:用于指定请求路径 method:用于指定请求的方式 params:用于指定限制请求参数的条件,它支持简单的表达式,要请求参数的key和value必须和配置一模一样 例如: params = {”accountName“},表示请求参数必须有accountName params = {”money!100“},表示请求参数money不能是100 headers:用于指定限制请求消息头的条件
method = {RequestMethod.POST}现在请求方式对其的限制
public class ControllerDemo {
//请求
@RequestMapping(path = "/hello" ,method = {RequestMethod.POST},params = {"username"})
public String hellspring(){
System.out.println("hell springmvc");
return "success";
}
}
3使用注解@Controller
- @Controller注解类型用于声明Spring类的实例是一个控制器(在讲IOC时还提到了另外3个注 解);
- Spring可以使用扫描机制来找到应用程序中所有基于注解的控制器类,为了保证Spring能找到你的 控制器,需要在配置文件中声明组件扫描。
<!-- 自动扫描指定的包,下面所有注解类交给IOC容器管理 -->
<context:component-scan base-package="com.kuang.controller"/>
- 增加一个ControllerTest2类,使用注解实现;
//@Controller注解的类会自动添加到Spring上下文中
@Controller
public class ControllerTest2{
//映射访问路径
@RequestMapping("/t2")
public String index(Model model){
//Spring MVC会自动实例化一个Model对象用于向视图中传值
model.addAttribute("msg", "ControllerTest2");
//返回视图位置
return "test";
}
}
4.RequestMapping
- @RequestMapping
- @RequestMapping注解用于映射url到控制器类或一个特定的处理程序方法。可用于类或方法上。 用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。 为了测试结论更加准确,我们可以加上一个项目名测试 myweb 只注解在方法上面
@Controller
public class TestController {
@RequestMapping("/h1")
public String test(){
return "test";
}
}
- 同时注解类与方法
@Controller
@RequestMapping("/admin")
public class TestController {
@RequestMapping("/h1")
public String test(){
return "test";
}
}