SpringMVC初识

转载自:http://www.javake.com.cn/web/spring/20130204/6223.html
              http://www.blogjava.net/xiaohuzi2008/archive/2012/07/24/383833.html
              http://itroop.iteye.com/blog/263845

     Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,通过实现Model-View-Controller模式来很好地将数据、业务与展现进行分离。
    核心架构图:http://www.javake.com.cn/u/cms/www/201302/041704273cxr.JPG 
SpringMVC初识_第1张图片

     步骤如下:
     1、 首先用户发送请求——>DispatcherServlet,前端控制器收到请求后自己不进行处理,而是委托给其他的解析器进行处理,作为统一访问点,进行全局的流程控制;
     2、 DispatcherServlet——>HandlerMapping, HandlerMapping将会把请求映射为HandlerExecutionChain对象(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象,通过这种策略模式,很容易添加新的映射策略;
     3、 DispatcherServlet——>HandlerAdapter,HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,从而很容易支持很多类型的处理器;
     4、 HandlerAdapter——>处理器功能处理方法的调用,HandlerAdapter将会根据适配的结果调用真正的处理器的功能处理方法,完成功能处理;并返回一个ModelAndView对象(包含模型数据、逻辑视图名);
     5、 ModelAndView的逻辑视图名——> ViewResolver, ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
     6、 View——>渲染,View会根据传进来的Model模型数据进行渲染,此处的Model实际是一个Map数据结构,因此很容易支持其他视图技术;
     7、返回控制权给DispatcherServlet,由DispatcherServlet返回响应给用户,到此一个流程结束。
 
     具体的核心开发步骤:
     1、 DispatcherServlet在web.xml中的部署描述,从而拦截请求到Spring Web MVC
     2、 HandlerMapping的配置,从而将请求映射到处理器
     3、 HandlerAdapter的配置,从而支持多种类型的处理器
     4、 ViewResolver的配置,从而将逻辑视图名解析为具体视图技术
     5、处理器(页面控制器)的配置,从而进行功能处理


     SpringMVC部分接口:

     DispatcherServlet接口:Spring提供的前端控制器,所有的请求都有经过它来统一分发。在DispatcherServlet将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。
     HandlerMapping接口:能够完成客户请求到Controller映射。
     Controller接口:需要为并发用户处理上述请求,因此实现Controller接口时,必须保证线程安全并且可重用。Controller将处理用户请求,这和Struts Action扮演的角色是一致的。一旦Controller处理完用户请求,则返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。从宏观角度考虑,DispatcherServlet是整个Web应用的控制器;从微观考虑,Controller是单个Http请求处理过程中的控制器,而ModelAndView是Http请求过程中返回的模型(Model)和视图(View)。
     ViewResolver接口:Spring提供的视图解析器(ViewResolver)在Web应用中查找View对象,从而将相应结果渲染给客户。


     示例:

     目录结构:
SpringMVC初识_第2张图片
     web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://java.sun.com/xml/ns/javaee"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
	id="WebApp_ID" version="3.0">
	<display-name>SpringMVC</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>

	<!-- 编码均为UTF-8 -->
	<filter>
		<filter-name>CharacterEncodingFilter</filter-name>
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>utf-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>CharacterEncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<!-- SpringMVC的核心控制器(前端控制器) -->
	<servlet>
		<servlet-name>springMVC</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<!-- 指定配置文件的全名,如果不指定,则为这里的servlet-name的属性值+"-servlet.xml" -->
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/springmvc-servlet.xml</param-value>
		</init-param>
		<!-- 启动tomcat服务器时创建此serlvet核心对象 -->
		<load-on-startup>1</load-on-startup>
	</servlet>

	<!-- 拦截请求,/是所有请求 -->
	<servlet-mapping>
		<servlet-name>springMVC</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

</web-app>
     springmvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
	http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
	http://www.springframework.org/schema/tx 
	http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
	http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd
	http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">


	<!-- 控制器类,name表示访问的URI路径,class表示对应的action类 -->
	<bean name="/welcome" class="com.zero.controller.WelcomeController"></bean>
	
	<!-- HandlerMapping -->
	<bean
		class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
	<!-- HandlerAdapter -->
	<bean
		class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />


	<!-- ViewResolver, 视图解析器,框架提供了好多解析器,这里举例其中的一种 -->
	<bean
	class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/jsp/"></property>
		<property name="suffix" value=".jsp"></property>
		<!--prefix+ view + suffix -->
	</bean>

</beans>
     WelcomeController.java
public class WelcomeController implements Controller {

	@Override
	public ModelAndView handleRequest(HttpServletRequest arg0,
			HttpServletResponse arg1) throws Exception {
		
		System.out.println("**************");
		Map<String,Object> map = new HashMap<String,Object>();
		map.put("a", "数据一");
		map.put("b", "数据二");
	
		return new ModelAndView("/welcome","map",map);
		//第一个参数:指定页面要跳转的view视图路径
		//后面参数:指定了要项前台传递的参数
	}
}
     welcome.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!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>My JSP</title>
</head>
<body>
	<h>传递的数据 : </h>${map}
</body>
</html>


     ModelAndView类就如其名称所示,是代表了MVC Web程序中Model与View的对象,不过它只是方便一次返回这两个对象的holder,Model与View两者仍是分离的概念。

     最简单的ModelAndView是持有View的名称返回,之后View名称被view resolver,也就是实作org.springframework.web.servlet.View接口的实例解析,ModelAndView(String viewName)。
     如果要返回Model对象,则可以使用Map来收集这些Model对象,然后设定给ModelAndView,使用下面这个版本的ModelAndView:ModelAndView(String viewName, Map model)
  Map对象中设定好key与value值,之后可以在视图中取出,如果您只是要返回一个Model对象,则可以使用下面这个ModelAndView版本:ModelAndView(String viewName, String modelName, Object modelObject)
  藉由modelName,您可以在视图中取出Model并显示。ModelAndView类别提供实作View接口的对象来作View的参数:
           ModelAndView(View view)
           ModelAndView(View view, Map model)
           ModelAndView(View view, String modelName, Object modelObject)
    DispatcherServlet会根据传回的ModelAndView来解析View名称,并处理给予的Model。View名称的解析是委托给实作org.springframework.web.servlet.ViewResolver接口的实例,ViewResolver的一个实例是InternalResourceViewResolver,名称解析完之后,实际的View绘制与Model转 换处理是交给实作org.springframework.web.servlet.View的实例。
    ModelAndView可以接收Map类型的对象,ModelAndView将这个Map中的元素视为model,而不是把这个Map本身视为model。但是其他的集合类可以用本身作为model对象。

你可能感兴趣的:(SpringMVC初识)