SpringMVC入门学习(一)

什么是SpringMVC?

一般刚开始学习一个框架的时候,肯定都会这么问,首先上一张老图。


Spring web mvcStruts2都属于表现层的框架,它是Spring框架的一部分,我们可以从Spring的整体结构中看得出来。

SpringMVC是一个基于MVC的web框架

既然提到了mvc这种开发设计模式,那么我们就看看在b/s系统下,mvc模式的应用情况


1、 用户发起request请求至控制器(Controller)

控制接收用户请求的数据,委托给模型进行处理

2、 控制器通过模型(Model)处理数据并得到处理结果

模型通常是指业务逻辑

3、 模型处理结果返回给控制器

4、 控制器将模型数据在视图(View)中展示

web中模型无法将数据直接在视图上显示,需要通过控制器完成。如果在C/S应用中模型是可以将数据在视图中展示的。

5、 控制器将视图response响应给用户

通过视图展示给用户要的数据或处理结果。

SpringMVC架构图

架构流程:

第一步:发起请求到前端控制器(DispatcherServlet)

第二步:前端控制器请求HandlerMapping查找 Handler

可以根据xml配置、注解进行查找

第三步:处理器映射器HandlerMapping向前端控制器返回Handler

第四步:前端控制器调用处理器适配器去执行Handler

第五步:处理器适配器去执行Handler

第六步:Handler执行完成给适配器返回ModelAndView

第七步:处理器适配器向前端控制器返回ModelAndView

ModelAndViewspringmvc框架的一个底层对象,包括 Modelview

第八步:前端控制器请求视图解析器去进行视图解析

根据逻辑视图名解析成真正的视图(jsp)

第九步:视图解析器向前端控制器返回View

第十步:前端控制器进行视图渲染

视图渲染将模型数据(ModelAndView对象中)填充到request

第十一步:前端控制器向用户响应结果


组件介绍:

1、前端控制器DispatcherServlet(不需要程序员开发)

作用接收请求,响应结果,相当于转发器,中央处理器。

有了DispatcherServlet减少了其它组件之间的耦合度。 

2、处理器映射器HandlerMapping(不需要程序员开发)

作用:根据请求的url查找Handler 

3、处理器适配器HandlerAdapter

作用:按照特定规则(HandlerAdapter要求的规则)去执行Handler

4、处理器Handler(需要程序员开发)

注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler

5、视图解析器View resolver(不需要程序员开发)

作用:进行视图解析,根据逻辑视图名解析成真正的视图(view

6、视图View(需要程序员开发jsp)

View是一个接口,实现类支持不同的View类型(jspfreemarkerpdf...

入门程序:

需求:实现之前mybatis学习中的商品列表查询

环境准备:数据库mysql5.1,mybatis学习中的四张表,jdk1.7.0_72,springmvc3.2,spring3.2(一定包括spring-webmvc-3.2.0.RELEASE.jar)

1,首先在web.xml 中配置前端控制器

<!--springmvc前端控制器 -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--contextConfigLocation配置springmvc加载的配置文件(配置处理器映射器,适配器等等,如果不配置contextConfigLocation,默认加载的是/WEB-INF/servlet名称=servlet.xml(springmvc-servlet.xml)) -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--有三种配置方式:
第一种:*.action,访问以.action结尾 由DispatcherServlet进行解析 
第二种:/,所以访问的地址都由DispatcherServlet进行解析,对于静态文件的解析需要配置不让DispatcherServlet进行解析使用此种方式可以实现 RESTful风格的url 
第三种:/*,这样配置不对,使用这种配置,最终要转发到一个jsp页面时, 仍然会由DispatcherServlet解析jsp地址,不能根据jsp页面找到handler,会报错。 -->
<url-pattern>*.action</url-pattern>
</servlet-mapping>

2,在classpath下创建springmvc.xml文件

根据上面的springmvc架构图可以发现,我们需要在springmvc.xml配置文件中配置:1,处理器映射器(根据请求的URL找到对应的Handler),2处理器适配器(根据对应的规则去执行相应的Handler),3,视图解析器(进行视图解析)

<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
		http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
		http://www.springframework.org/schema/mvc 
		http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
		http://www.springframework.org/schema/context 
		http://www.springframework.org/schema/context/spring-context-3.2.xsd 
		http://www.springframework.org/schema/aop 
		http://www.springframework.org/schema/aop/spring-aop-3.2.xsd 
		http://www.springframework.org/schema/tx 
		http://www.springframework.org/schema/tx/spring-tx-3.2.xsd ">
	
	<!-- 配置适配器和映射器 -->
	<mvc:annotation-driven></mvc:annotation-driven>
	<!--可以扫描controller,service     这里让扫描controller 配置组件扫描controller -->
	<context:component-scan base-package="com.travelsky.cn.ssm.controller"></context:component-scan>
	
	  
	  <!-- 配置解析JSP的视图解析器  prefix和suffix查找视图页面的前缀和后缀,最终视图地址为:前缀+逻辑视图名+后缀  逻辑视图需要在Controller中返回ModelAndView指定,比如逻辑视图名为hello,则最终返回的jsp视图地址为:"jsp/items/hello.jsp"-->
	  <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	  	<!--前缀  -->
	  	<property name="prefix" value="/jsp/items/"/>
	  	<!--后缀 -->
	  	<property name="suffix" value=".jsp"/>
	  </bean>
	  
</beans>

3,创建/WEB-INF/jsp/itemsList.jsp视图页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>查询商品列表</title>
</head>
<body>
商品列表:
<table width="100%" border=1>
<tr>
	<td>商品名称</td>
	<td>商品价格</td>
	<td>商品描述</td>
</tr>
<c:forEach items="${itemsList }" var="item">
<tr>
	<td>${item.name }</td>
	<td>${item.price }</td>
	<td>${item.detail }</td>
</tr>
</c:forEach>

</table>
</body>
</html>

4,开发Handler

使用注解的映射器和注解的适配器。(注解的映射器和注解的适配器必须配对使用)

//使用Controller标识 它是一个控制器
@Controller
public class ItemsController3 {
	
	//商品查询列表
	//@RequestMapping实现 对queryItems方法和url进行映射,一个方法对应一个url
	//一般建议将url和方法写成一样
	@RequestMapping("/queryItems")
	public ModelAndView queryItems()throws Exception{
		
		//调用service查找 数据库,查询商品列表,这里使用静态数据模拟
		List<Items> itemsList = new ArrayList<Items>();
		//向list中填充静态数据
		
		Items items_1 = new Items();
		items_1.setName("联想笔记本");
		items_1.setPrice(6000f);
		items_1.setDetail("ThinkPad T430 联想笔记本电脑!");
		
		Items items_2 = new Items();
		items_2.setName("苹果手机");
		items_2.setPrice(5000f);
		items_2.setDetail("iphone6苹果手机!");
		
		itemsList.add(items_1);
		itemsList.add(items_2);
		
		//返回ModelAndView
		ModelAndView modelAndView =  new ModelAndView();
		//相当 于request的setAttribut,在jsp页面中通过itemsList取数据
		modelAndView.addObject("itemsList", itemsList);
		
		//指定视图
		modelAndView.setViewName("/WEB-INF/jsp/items/itemsList.jsp");
		
		return modelAndView;
		
	}

5,部署调试

通过请求http://localhost:8080/springmvc/queryItems.action如果页面展示出了商品列表,则表明入门程序运行成功!


源码分析:

通过前端控制器源码分析springmvc的执行过程

第一步:前端控制器接收请求

调用doDiapatch


第二步:

1. DispatherServlet调用HandlerMapping(处理器映射器)根据url查找Handler


第三步:DispatherServlet调用HandlerAdapter(处理器适配器)HandlerMapping找到Handler进行包装、执行。HandlerAdapter执行Handler完成后,返回了一个ModleAndView(springmvc封装对象)

DispatherServlet 找一个合适的适配器:

适配器执行Hanlder


第四步:视图渲染 DispatherServlet拿着ModelAndView调用ViewResolver(视图解析器)进行视图解析,解析完成后返回一个View(很多不同视图类型的View


视图解析,得到view:


调用view的渲染方法,将model数据填充到request

渲染方法:



猜你喜欢

转载自blog.csdn.net/huangyuhuangyu/article/details/80224724