SpringMVC初识

来源:互联网 发布:s52射钉弹淘宝叫什么 编辑:程序博客网 时间:2024/04/29 15:17
转载自: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 


     步骤如下:
     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对象,从而将相应结果渲染给客户。


     示例:

     目录结构:

     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.xsdhttp://www.springframework.org/schema/context    http://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://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 --><beanclass="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" /><!-- HandlerAdapter --><beanclass="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" /><!-- ViewResolver, 视图解析器,框架提供了好多解析器,这里举例其中的一种 --><beanclass="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 {@Overridepublic 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对象。

0 0