`
uule
  • 浏览: 6308312 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

SpringMVC总结

 
阅读更多

SpringMVC与struts2比较

SpringMVC注解例子

跟我学SpringMVC目录汇总贴、PDF下载、源码下载

详解 Spring 3.0 基于 Annotation 的依赖注入实现 +  spring DI

 例子工程:

1、spring mvc模拟用户增删改查以及登录和上传文件的相关流程

 

跟着开涛学SpringMVC(系列)

Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(一)

Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(二)

Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(三)

Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(四)

Spring MVC 3.0.5+Spring 3.0.5+MyBatis3.0.4全注解实例详解(五)

 

十年架构师不到400行手写一个Spring MVC

 

1、<context:annotation-config/>

(spring中定义) 

而我们前面所介绍的 AutowiredAnnotationBeanPostProcessor 和 CommonAnnotationBeanPostProcessor 就是处理这些注释元数据的处理器。但是直接在 Spring 配置文件中定义这些 Bean 显得比较笨拙。

Spring 为我们提供了一种方便的注册这些BeanPostProcessor 的方式,这就是 <context:annotation-config/>

 

<context:annotationconfig/> 将隐式地向 Spring 容器注册AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、PersistenceAnnotationBeanPostProcessor 以及equiredAnnotationBeanPostProcessor 这 4 个 BeanPostProcessor

在配置文件中使用 context 命名空间之前,必须在 <beans> 元素中声明 context 命名空间。

 

2、<mvc:annotation-driven />

(springMVC中定义) 

Spring MVC 3.0对使用和配置作了较大的改进,除了提供注解来简化控制器的开发之外,在配置文件上面也进行了简化。

    

 
    基于Spring MVC注解的配置就是上面这两行,还有一种更简化的配置写法是只写这一句:<mvc:annotation-driven />就可以了,Spring启动的时候会自动注册上面这两个bean。为什么大象要在这里显示的注册两个bean呢?因为,我们在真正使用的时候,一般来说,使用默认的方式满足不了我们的系统或业务要求。比如拦截器,比如数据验证,比如返回消息格式转换等等一些自定义设置。他们都需要配置在这两个bean里面。因为本例是用来作为入门教程,所以这些东西都没有加进来。

    DefaultAnnotationHandlerMapping这个类是将所有标注了@RequestMapping注解的Controller类,都放到了一个HandlerMapping对象中,当有请求时,就在这个对象中进行查找是否有与之匹配的路径,AnnotationMethodHandlerAdapter是管理所有@RequestMapping注解的方法。

 

<!-- 使用annotation 自动注册bean, 并保证@Required、@Autowired的属性被注入 -->
	<context:component-scan base-package="com.aaa.**.dao,
										  com.aaa.**.service,
										  com.aaa.**.controller">
		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
		<context:exclude-filter type="annotation" expression="org.springframework.web.bind.annotation.ControllerAdvice"/>
	</context:component-scan>

   

 ================================================================================== 

SpringMVC原理:



 

1、Spring MVC的核心是DispatcherServlet,当客户端发送一个请求时,这个请求经过一系列过滤器处理。然后DispatcherServlet会接收到这个请求。

2、DispatcherServlet会从HandlerMapping对象中查找与请求匹配的Controller,并将结果返回给DispatcherServlet。

3、DispatcherServlet将请求转发给目标Controller,如果定义有拦截器,则会经过这些拦截器处理。

4、标Controller处理完成业务逻辑后,会返回一个结果给DispatcherServlet。

5、DispatcherServlet根据结果查询ViewResolver,找到与之对应的视图对象,同样将结果返回给DispatcherServlet。

6、DispatcherServlet根据指定的显示结果,调用模板对象渲染view。 

7、将view返回给客户端。

 

DefaultAnnotationHandlerMapping这个类是将所有标注了@RequestMapping注解的Controller类,都放到了一个HandlerMapping对象中,当有请求时,就在这个对象中进行查找是否有与之匹配的路径

AnnotationMethodHandlerAdapter是管理所有@RequestMapping注解的方法。

===================================================================================

SpringMVC 是一个基于DispatcherServlet的MVC框架,每一个请求最先访问的都是 DispatcherServlet,DispatcherServlet负责转发每一个Request请求给相应的Handler,Handler处理 以后再返回相应的视图(View)和模型(Model),返回的视图和模型都可以不指定,即可以只返回Model或只返 回View或都不返回。在使用注解的SpringMVC中,处理器Handler是基于@Controller和@RequestMapping这两个注 解的,@Controller声明一个处理器类,@RequestMapping声明对应请求的映射关系,这样就可以提供一个非常灵活的匹配和处理方式。

 

DispatcherServlet 是继承自HttpServlet的,既然SpringMVC是基于DispatcherServlet的,那么我们先来配置一下 DispatcherServlet,好让它能够管理我们希望它管理的内容。HttpServlet是在web.xml文件中声明的。

 

Xml代码  收藏代码
  1. <servlet>  
  2.     <servlet-name>blog</servlet-name>  
  3.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  4.     <load-on-startup>1</load-on-startup>  
  5. </servlet>  
  6. <servlet-mapping>  
  7.     <servlet-name>blog</servlet-name>  
  8.     <url-pattern>*.do</url-pattern>  
  9. </servlet-mapping>  

 

 上面声明了一个名为blog的DispatcherServlet,该Servlet将处理所有以“.do”结尾的请求。在初始化DispatcherServlet的时候,SpringMVC默认会到/WEB-INF目录下寻找一个叫[servlet-name]-servlet.xml的配置文件,来初始化里面的bean对象,该文件中对应的bean对象会覆盖spring配置文件中声明的同名的bean对象。如上面的就会在/WEB-INF目录下寻找一个叫blog-servlet.xml的文件;当然也可以在Servlet中声明配置文件的位置,那就是通过Servlet的初始化参数来设置contextConfigLocation参数的值。

 

Xml代码  收藏代码
  1. <servlet>  
  2.     <servlet-name>blog</servlet-name>  
  3.     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  4.     <init-param>  
  5.         <param-name>contextConfigLocation</param-name>  
  6.         <param-value>/WEB-INF/blog-servlet.xml</param-value>  
  7.     </init-param>  
  8.     <load-on-startup>1</load-on-startup>  
  9. </servlet>  
  10. <servlet-mapping>  
  11.     <servlet-name>blog</servlet-name>  
  12.     <url-pattern>*.do</url-pattern>  
  13. </servlet-mapping>  

 

 DispatcherServlet会利用一些特殊的bean来处理Request请求和生成相应的视图返回。

 

2、DispatcherServlet

DispatcherServlet是前端控制器设计模式的实现,提供Spring Web MVC的集中访问点,而且负责职责的分派,而且与Spring IoC容器无缝集成,从而可以获得Spring的所有好处。 具体请参考第二章的图2-1。
 
DispatcherServlet主要用作职责调度工作,本身主要用于控制流程,主要职责如下:
1、文件上传解析,如果请求类型是multipart将通过MultipartResolver进行文件上传解析;
2、通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,它包括一个处理器、多个HandlerInterceptor拦截器);
3、通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);
4、通过ViewResolver解析逻辑视图名到具体视图实现;
5、本地化解析;
6、渲染具体的视图等;
7、如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。

该DispatcherServlet默认使用WebApplicationContext作为上下文,Spring默认配置文件为“/WEB-INF/[servlet名字]-servlet.xml”。

 

DispatcherServlet也可以配置自己的初始化参数,覆盖默认配置:

摘自Spring Reference

参数

描述

contextClass

实现WebApplicationContext接口的类,当前的servlet用它来创建上下文。如果这个参数没有指定, 默认使用XmlWebApplicationContext。

contextConfigLocation

传给上下文实例(由contextClass指定)的字符串,用来指定上下文的位置。这个字符串可以被分成多个字符串(使用逗号作为分隔符) 来支持多个上下文(在多上下文的情况下,如果同一个bean被定义两次,后面一个优先)。

namespace

WebApplicationContext命名空间。默认值是[server-name]-servlet。

 

上下文关系

集成Web环境的通用配置:
<context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>
          classpath:spring-common-config.xml,
          classpath:spring-budget-config.xml
      </param-value>
</context-param>
<listener>  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
 
如上配置是Spring集成Web环境的通用配置;一般用于加载除Web层的Bean(如DAO、Service等),以便于与其他任何Web框架集成。
contextConfigLocation:表示用于加载Bean的配置文件;
contextClass:表示用于加载Bean的ApplicationContext实现类,默认WebApplicationContext。
 
创建完毕后会将该上下文放在ServletContext:
servletContext.setAttribute(
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE,
this.context);
ContextLoaderListener初始化的上下文和DispatcherServlet初始化的上下文关系,如图3-1



 

从图中可以看出:

ContextLoaderListener初始化的上下文加载的Bean是对于整个应用程序共享的,不管是使用什么表现层技术,一般如DAO层、Service层Bean;

DispatcherServlet初始化的上下文加载的Bean是只对Spring Web MVC有效的Bean,如Controller、HandlerMapping、HandlerAdapter等等,该初始化上下文应该只加载Web相关组件。

 

<!-- Handles Spring requests -->
	<servlet>
		<servlet-name>servlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/webmvc-config.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>


webmvc-config.xml:
<context:component-scan base-package="com.soa">
	<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />
  	<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> 
</context:component-scan>

 

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>classpath*:META-INF/spring/applicationContext*.xml</param-value>
</context-param>


applicationContext.xml:
<context:component-scan base-package="com.soa">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> 
</context:component-scan>

 

 

来源:http://sishuok.com/forum/blogPost/list/5188.html

 

视图:

关于视图的返回,Controller只负责传回来一个值,然后到底返回的是什么视图,是由视图解析器控制的,在jsp中常用的视图解析器是InternalResourceViewResovler,它会要求一个前缀和一个后缀

 

Xml代码  收藏代码
  1. <bean  
  2.     class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
  3.     <property name="prefix" value="/WEB-INF/" />  
  4.     <property name="suffix" value=".jsp" />  
  5. </bean>  

 

在上述视图解析器中,如果Controller返回的是blog/index,那么通过视图解析器解析之后的视图就是/WEB-INF/blog/index.jsp。

 

要使用注解的SpringMVC需要在SpringMVC的配置文件中进行声明,具体方式为先引入mvc命名空间,然后利用<mvc:annotation-driven />进行声明。

 

Xml代码  收藏代码
  1. <beans xmlns="http://www.springframework.org/schema/beans"  
  2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
  3.     <span style="background-color: #00ff00;"><span style="color: #ff0000;">xmlns:mvc="http://www.springframework.org/schema/mvc"</span>  
  4. </span>  
  5.   
  6.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  7.      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
  8.      http://www.springframework.org/schema/context  
  9.      http://www.springframework.org/schema/context/spring-context-3.0.xsd  
  10.     <span style="background-color: #00ff00; color: #ff0000;"> http://www.springframework.org/schema/mvc  
  11.      http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"</span>  
  12.   
  13. >  
  14. <mvc:annotation-driven />  
  15.   
  16. </beans>  

 

接下来讨论一下方法的返回值,主要有以下情况:

 

  • 返回一个ModelAndView,其中Model是一个Map,里面存放的是一对对的键值对,其可以直接在页面上使用,View是一个字符串,表示的是某一个View的名称
  • 返回一个字符串,这个时候如果需要给页面传值,可以给方法一个Map参数,该Map就相当于一个Model,往该Model里面存入键值对就可以在页面上进行访问了
  • 返回一个View对象
  • 返回一个Model也就是一个Map,这个时候将解析默认生成的view name,默认情况view name就是方法名。
  • 什么也不返回,这个时候可以在方法体中直接往HttpServletResponse写入返回内容,否则将会由RequestToViewNameTranslator来决定
  • 任何其他类型的对象。这个时候就会把该方法返回类型对象当做返回Model模型的一个属性返回给视图使用,这个属性名称可以通过在方法上给定@ModelAttribute注解来指定,否则将默认使用该返回类名称作为属性名称。
下面是一个简单的实例
Java代码  收藏代码
  1.        @RequestMapping("/{owner}/index")  
  2. public String userIndex(Map<String, Object> map,@PathVariable String owner, HttpServletRequest request) throws ParserException {  
  3.     List<DefCategory> categories = categoryService.find(owner);  
  4.     int offset = Util.getOffset(request);  
  5.     Pager<Blog> pager = blogService.find(owner, 0, offset, maxResults);  
  6.     int totalRecords = pager.getTotalRecords();  
  7.     List<Blog> blogs = pager.getData();  
  8.     Util.shortBlog(blogs);  
  9.       
  10.     List<Message> messages = messageService.find(owner, 05).getData();  
  11.     Util.shortMessage(messages, 20);  
  12.     map.put("messages", messages);  
  13.     map.put("totalRecords", totalRecords);  
  14.     List<BlogStore> stores = storeService.find(owner, 05).getData();  
  15.     map.put("maxResults", maxResults);  
  16.     map.put("blogs", blogs);  
  17.     map.put("totalRecords", totalRecords);  
  18.     map.put("owner", userService.find(owner));  
  19.     map.put("defCategories", categories);  
  20.     map.put("stores", stores);  
  21.     return "blog/userIndex";  
  22. }  

  给页面传值

    在Controller中把请求转发给业务逻辑层进行处理之后需要把业务逻辑层的处理结果进行展现,在展现的过程中就需要我们把处理结果传给展示层进行展 示。那么处理结果是怎么进行传递的呢?前面已经说了Controller的返回结果可以是一个包含模型和视图的ModelAndView,也可以仅仅是一 个视图View,当然也可以什么都不返回,还可以是仅仅返回一个Model。我们知道模型Model是用来封装数据给视图View进行展示的,那么,在 SpringMVC中,如果要把我们后台的信息传递给前台进行展示的话应该怎么做呢?这主要有两种方式:
    1.返回包含模型Model的ModelAndView,或者是直接返回一个Model(这个时候就需要考虑默认的视图),这种类型的返回结果是包含Model的,这个Model对象里面的对应属性列都可以直接在视图里面使用。
    2.如果是直接返回一个视图View,这个时候SpringMVC提供了一种类似于在Controller方法中获取HttpRequest对象的机制,这个时候我们只需要给定Controller方法一个Map参数,然后在方法体里面给这个Map加上需要传递到视图的键值对,这样在视图中就可以直接访问对应的键值对

 

来源:http://haohaoxuexi.iteye.com/blog/1343761

 

Spring MVC 的几个问题

http://s.yanghao.org/program/viewdetail.php?i=96706

 

 

  • 大小: 72.5 KB
  • 大小: 85.3 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics