SpringMvc是什么?
SpringMvc是一个基于用户请求驱动的Web框架。SpringMvc相当灵活并且可以拓展,其Mvc框架是围绕DispatcherServlet这个核心展开的作用就是截获请求,并将其分发到对应的业务控制中由业务控制器调用业务处理方法处理业务逻辑。
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的组件说明:
DispatcherServlet:前端控制器:
用户请求到达前端控制器,它就相当于Mvc中的C,DispatcherServlet是整个流程控制中的中心,右它调用其他组件处理用户请求,DIspatcherServlet的存在降低了组件之间的耦合性。
HandlerMapping:处理器映射器:
HandlerMapping负责根据用户请求Url找到Handler即处理器,SpringMvc提供了不同的映射器实现不同的映射方式。(配置文件方式、实现接口方式、注解方式等)
Handler:处理器:
Handler是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。(就是你写的Controller)
HandlAdapter:处理器适配器:
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
ViewResolver:视图解析器
ViewResolver负责将处理结果生成View视图,ViewResolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。
View:视图:
springmvc框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。我们最常用的视图就是jsp。
注解式处理器映射器:对类中标记了@ResquestMapping的方法进行映射。根据@ResquestMapping定义的url匹配@ResquestMapping标记的方法,匹配成功返回HandlerMethod对象给前端控制器。HandlerMethod对象中封装url对应的方法Method。 但是从spring3.1版本开始,废除了DefaultAnnotationHandlerMapping的使用,推荐使用RequestMappingHandlerMapping完成注解式处理器映射。在springmvc.xml中配置如下:
<!-- 配置处理器映射器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
注解式处理器适配器:
对标记@ResquestMapping的方法进行适配。从spring3.1版本开始,废除了AnnotationMethodHandlerAdapter的使用,推荐使用RequestMappingHandlerAdapter完成注解式处理器适配。在springmvc.xml中配置如下:
<!-- 配置处理器适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
直接配置处理器映射器和处理器适配器比较麻烦,可以使用注解驱动来加载。springmvc.xml配置文件中使用替代注解处理器和适配器的配置。
<!-- 注解驱动 -->
<mvc:annotation-driven />
视图解析器:
视图解析器使用SpringMVC框架默认的InternalResourceViewResolver,这个视图解析器支持JSP视图解析在springmvc.xml配置文件中配置如下:
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置逻辑视图的前缀 -->
<property name="prefix" value="/WEB-INF/jsp/" />
<!-- 配置逻辑视图的后缀 -->
<property name="suffix" value=".jsp" />
</bean>
现在我们可以修改ItemController中的代码
// 设置视图jsp,需要设置视图的物理地址
modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp");
就可以改为
modelAndView.setViewName("itemList");
SpringMVC运行索要的jar包如下。
SpringMVC本身就是Spring的子项目,对Spring兼容性很好。(毕竟是亲儿子)专业术语叫“无缝整合”。SpringMVC是表现层所以他控制的就是Controller(以后你接触的表现出基本都会叫这个名字了,忘记action吧!)
导入这些约束spring-aop、spring-beans、spring-context、spring-mvc、spring-tool、spring-tx、spring-util
<!-- 配置controller扫描包 -->
<context:component-scan
base-package="com.ziyuanshequ.springmvc.controller" />
</beans>
配置前段控制器:
配置SpringMVC的前端控制器DispatcherServlet在web.xml中。
<!-- 配置SpringMVC前端控制器 -->
<servlet>
<servlet-name>ziyuanshequ</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 指定SpringMVC配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ziyuanshequ</servlet-name>
<!-- 设置所有以action结尾的请求进入SpringMVC -->
<url-pattern>*.action</url-pattern>
</servlet-mapping>
加入Jsp页面:
<c:forEach items="${itemList }" var="item">
<tr>
<td>${item.name }</td>
<td><fmt:formatDate value="${item.createtime}" pattern="yyyy-MM-dd HH:mm:ss"/></td>
<td>${item.detail }</td>
</tr>
</c:forEach>
实体类entity:
public class Item {
// 商品id
private int id;
// 商品名称
private String name;
// 商品创建时间
private Date createtime;
// 商品描述
private String detail;
set/get...
}
创建ItemController
@Controller
public class ItemController {
// 请求的url,和用户请求的url进行匹配,.action可不写
@RequestMapping("/itemList.action")
public ModelAndView getItemList() {
// 创建页面需要显示的商品数据
List<Item> list = new ArrayList<>();
list.add(new Item(1, "小米", new Date(), "质量好!"));
list.add(new Item(2, "华为", new Date(), "质量好!"));
list.add(new Item(3, "魅族", new Date(), "质量好!"));
// 创建ModelAndView,用来存放数据和视图
ModelAndView modelAndView = new ModelAndView();
// 设置数据到模型中
modelAndView.addObject("list", list);
// 设置视图jsp,需要设置视图的物理地址
modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp");
return modelAndView;
}
}