springmvc
springmvc:
Spring web mvc和Struts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来,如下图:
spring web MVC 提供了模型-视图-控制体系结构来灵活的开发,松散耦合的web的应用的组件 。MVC 模式导致了应用程序的不同方面(输入逻辑、业务逻辑和 UI 逻辑)的分离, 同时提供了在这些元素之间的松散耦合。模型封装了应用程序数据,并且通常它们由 POJO 组成。视图主要用于呈现模型数据,并且通常它生成客户端的浏览器可以解释的 HTML 输出。
控制器主要用于处理用户请求,并且构建合适的模型并将其传递到视图呈现。
DispatcherServlet:
Spring Web 模型-视图-控制(MVC)框架是围绕 DispatcherServlet 设计的,DispatcherServlet 用来处理所有的 HTTP 请求和响应。
Spring Web MVC DispatcherServlet 的请求处理的工作流程如下图所示:
request---->dipatcherSevlet:(handlerMapping,Controller,View Resolver, View)-------->respose;
1.收到一个 HTTP 请求后,DispatcherServlet 根据 HandlerMapping 来选择并且调用适当的控制器。
2.控制器接受请求,并基于使用的 GET 或 POST 方法来调用适当的 service 方法。Service 方法将设置基于定义的业务逻辑的模型数据,并返回视图名称到 DispatcherServlet 中。
3.DispatcherServlet 会从 ViewResolver 获取帮助,为请求检取定义视图。
4.一旦确定视图,DispatcherServlet 将把模型数据传递给视图,最后呈现在浏览器中。
上面所提到的所有组件,即 HandlerMapping、Controller 和 ViewResolver 是 WebApplicationContext 的一部分, 而 WebApplicationContext 是带有一些对 web 应用程序必要的额外特性的 ApplicationContext 的扩展。
创建SpringMVC项目:
1.导包
2.在web.xml配置spring前端的控制器,指定读取的springMVC的配置文件,创建servlet的映射, 配置SpringMVC前端控制器时会有一个坑:就是在配置你的拦截的内容是配置/*时是不可以用的是访问不到任何资源的,配置规则如下:
(1)/*:不能进行对其访问:No mapping found for HTTP request with URI [/spring-mvc/WEB-INF/jsp/hello.jsp] in DispatcherServlet with name 'spring-mvc' 拦截所有,jsp,js,css都会拦截,不建议
(2) /:拦截所有不包括jsp,肯定可以用
(3)*.action,*.do,拦截do,action的结尾请求,一般用于前台,面向消费者的
<servlet>
<servlet-name>spring-mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定springmvc的配置文件
默认路径:/WEB-INF/${servlet-name}-servlet.xml
-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc-servlet.xml</param-value>
</init-param>
</servlet>
<!-- 配置映射的及请求设置 -->
<servlet-mapping>
<servlet-name>spring-mvc</servlet-name>
<!-- 设置请求拦截规则
1./*:不能进行对其访问:No mapping found for HTTP request with URI [/spring-mvc/WEB-INF/jsp/hello.jsp] in DispatcherServlet with name 'spring-mvc'
拦截所有,jsp,js,css都会拦截,不建议
2./:拦截所有不包括jsp,肯定可以用
3.*.action,*.do,拦截do,action的结尾请求,一般用于前台,面向消费者的--->
<url-pattern>/</url-pattern>
</servlet-mapping>
3.配置spring的配置文件: 在applicationContent.xml中配置
<!-- 配置controller扫描包 ,多个包调用用","隔开-->
<context:component-scan base-package="com.leo.controller"></context:component-scan>
<!--配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 逻辑视图的前缀,后缀 ,逻辑视图名在controller中返回ModelView指定-->
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
<!-- 最终的jsp物理地址:前缀+逻辑视图+后缀 -->
</bean>
4.创建controller类:控制器
配置@Controller//把controller交给spring管理
@RequestMapping("/hello")//映射url:即指定请求的url地址
public class HelloSpringMVC {
//设置请求的方法
@RequestMapping(method=RequestMethod.GET)
public String printHello(ModelMap model) {
model.addAttribute("message", "SpringMVC");
return "hello";
}
}
5.创建视图:已经在spring-mvcservlet.xml中配置过了,
spring mvc架构:
主要就是DispatcherServlet进行对各个组件的调用以及各个组件对DispatcherSevlet的响应 包括组件有:DispatcherServlet:相当于mvc中的contol,是整个流程控制的中心,由他调用其他组件,降低了组件之间的耦合,
HandlerMapping:处理映射器根据url找到Handler处理器
Handler:是后端控制器在前端控制器下对用户处理请求,需要自己开发里面的业务逻辑
HandlAdaptcher:这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行
ViewResolver:视图解析器将结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户
View:其中视图包括jstlView,fremarkerView,padfView,最常用的为jsp一般情况下需要通过页面标签或页面模版技术将模型数据通过页面展示给用户,需要由程序员根据业务需求开发具体的页面
在springmvc的各个组件中,处理器映射器、处理器适配器、视图解析器称为springmvc的三大组件。
架构流程:
1.请求--->前端控制器DispatcherServlet
2.DispatcherServlet调用HandlerMapping处理器映射器
3、 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、 执行处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、 ViewReslover解析后返回具体View
10、DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户
这样通过运行项目访问其路径就可以请求到你想要的结果了,在这里说明一下在springmvc的配置文件中扫描包时开多个之间用逗号隔开<!-- 配置controller扫描包 ,多个包调用用","隔开
扫描@Controller,@Service
在不配置处理器映射器,和处理器适配器,会使用默认的,可以不配置
-->
<context:component-scan base-package="com.leo.controller"></context:component-scan>
<!-- 废除了:配置处理器映射器
<bean class="org.springframework.web.servlet.mvc.annotation.RequestMappingHandlerMapping"></bean>
配置处理器配置器
<bean class="org.springframework.web.servlet.mvc.annotation.RequestMappingHandlerAdapter"></bean> -->
<!-- 注解驱动 ,配置这个就相当于配置了上面的两个-->
<mvc:annotation-driven></mvc:annotation-driven>高版本的已经不再支持上面的两种的配置方式统一使用这个注解驱动