springmvc运行流程

如图所示:

springmvc运行流程_第1张图片   

        1:启动工程时,系统加载web.xml 
        2:当用户输入一个请求时,请求被web.xml中被拦截,转到了springmvc.xml中进行处理
        3:由于HandlerMapping有不同的实现类,所以map映射的规则也不同
        4:HandlerMapping根据请求的url找到相应的Handler,返回给DispatcherServlet
        5:DispactherServlet请求处理器适配器HandlerAdapter去执行Handler(常称为Controller)
        6:处理器适配器(HandlerAdapter)执行Handler
        7:Handler执行完毕后会返回给处理器适配器(HandlerAdapter)一个ModelAndView对象
        8:HandlerAdapter接收到Handler返回的ModelAndView后,将其返回给前端控制器
        9:DispatcherServlet接收到ModelAndView后,会请求视图解析器(View Resolver)对视图进行解析
        10:View Resolver根据View信息匹配到相应的视图结果,反馈给DispatcherServlet
        11:DispatcherServlet收到View具体的视图后,进行视图渲染,将Model中的数据模型填充到View视图中的request域,生成最终的视图View
        12:DispatcherServlet向用户返回请求的结果
     

       通过前面的Spring MVC请求处理流程图可以知道,当请求到达前端控制器DispatcherServlet时,DispatcherServlet会请求处理器映射器(HandlerMapping)寻找相关的Handler对象,打开Spring MVC的源码,可以发现许多种处理器映射器(包括抽象类)。

先在springmvc.xml配置文件中添加处理器映射器:

 

     Spring MVC拥有多种处理器映射器,他们都实现了HandlerMapping接口。上面配置的处理器映射器为BeanNameUrlHandlerMapping类,其映射规则是,将bean的name作为url进行查找,需要配置Handler时指定bean的name。

     根据Spring MVC的请求流程,DispatcherServlet根据HandlerMapping传来的Handler(或Handler执行链)与配置的处理器适配器HandlerAdapter进行匹配,找到可以处理此Handler(或Handler执行链)类型的HandlerAdapter,该HandlerAdapter将会调用自己的handler方法,利用Java的反射机制去执行具体的Controller方法并获得ModelAndView视图对象。

    接下来要在springmvc.xml中配置一个处理器适配器HandlerAdapter。在Spring MVC中,常用的处理器适配器有HttpRequestHandlerAdapter、SimpleControllerHandlerAdapter以及AnnotationMethodHandlerAdapter。这里配置的处理器是SimpleControllerHandlerAdapter。主要配置如下:

       SimpleControllerHandlerAdapter适配器支持所有实现了Controller接口的Handler控制器,开发者如果编写了实现Controller接口的控制器,那么SimpleControllerHandlerAdapter适配器会执行Controller的具体方法。

       当处理器适配器HandlerAdapter处理了相关的Handler的具体方法之后,Handler会返回一个视图对象ModelAndView,以后会详述,这里使用默认的InternalResourceViewResolver。主要的配置如下:

       配置了InternalResourceViewResolver视图解析器后,其会根据Handler方法执行之后返回的ModelAndView中的视图的具体位置,来加载相应的界面并绑定反馈数据。例子如下所示:

public class FruitsControllerTest implements Controller{

	private FruitsServices fruitsServices= new FruitsServices();
	@Override
	public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
		// TODO Auto-generated method stub
		
		List fruitsList = fruitsServices.queryFruitsList();
		ModelAndView mav = new ModelAndView();
		//相当于request的setAttribut,在JSP页面中通过fruitsList获取数据
		mav.addObject("fruitsList",fruitsList);
		//指定视图
		mav.setViewName("/WEB-INF/jsp/fruits/fruitsList.jsp");
		return mav;
	}

}

class FruitsServices{
	public List queryFruitsList(){
		List fruitsList = new ArrayList();
		Fruits apple = new Fruits();
		apple.setName("红富士");
		apple.setPrice(2.3);
		apple.setProducing_area("山东");
		Fruits banana = new Fruits();
		banana.setName("香蕉");
		banana.setPrice(1.5);
		banana.setProducing_area("上海");
		fruitsList.add(apple);
		fruitsList.add(banana);
		return fruitsList;
	}
	
}

界面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"  prefix="c" %>





Insert title here


	

新鲜水果

名称 价格 产地
${fruit.name} ${fruit.price} ${fruit.producing_area}

这里使用JSTL的c标签来遍历服务端绑定到前端页面的数据“fruitsList”,并将不同的属性设置在table的不同位置。

       由于配置的处理器映射为BeanNameUrlHandlerMapping,在接收到用户的请求时,它会将bean的name作为url进行查找。所以接下来要在springmvc.xml中配置一个可以被url映射的Handler的bean,供处理器映射器查找,该bean的具体配置如下:

启动工程,访问http://localhost:8080/SpringMVC_Test/queryFruits_test.action即可访问。

你可能感兴趣的:(Spring,mvc)