详解 Spring 3.0 基于 Annotation 的依赖注入实现 + spring DI
例子工程:
1、spring mvc模拟用户增删改查以及登录和上传文件的相关流程
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全注解实例详解(五)
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文件中声明的。
- <servlet>
- <servlet-name>blog</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>blog</servlet-name>
- <url-pattern>*.do</url-pattern>
- </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参数的值。
- <servlet>
- <servlet-name>blog</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>/WEB-INF/blog-servlet.xml</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>blog</servlet-name>
- <url-pattern>*.do</url-pattern>
- </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,它会要求一个前缀和一个后缀
- <bean
- class="org.springframework.web.servlet.view.InternalResourceViewResolver">
- <property name="prefix" value="/WEB-INF/" />
- <property name="suffix" value=".jsp" />
- </bean>
在上述视图解析器中,如果Controller返回的是blog/index,那么通过视图解析器解析之后的视图就是/WEB-INF/blog/index.jsp。
要使用注解的SpringMVC需要在SpringMVC的配置文件中进行声明,具体方式为先引入mvc命名空间,然后利用<mvc:annotation-driven />进行声明。
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
- <span style="background-color: #00ff00;"><span style="color: #ff0000;">xmlns:mvc="http://www.springframework.org/schema/mvc"</span>
- </span>
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://www.springframework.org/schema/context
- http://www.springframework.org/schema/context/spring-context-3.0.xsd
- <span style="background-color: #00ff00; color: #ff0000;"> http://www.springframework.org/schema/mvc
- http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"</span>
- >
- <mvc:annotation-driven />
- </beans>
接下来讨论一下方法的返回值,主要有以下情况:
- 返回一个ModelAndView,其中Model是一个Map,里面存放的是一对对的键值对,其可以直接在页面上使用,View是一个字符串,表示的是某一个View的名称
- 返回一个字符串,这个时候如果需要给页面传值,可以给方法一个Map参数,该Map就相当于一个Model,往该Model里面存入键值对就可以在页面上进行访问了
- 返回一个View对象
- 返回一个Model也就是一个Map,这个时候将解析默认生成的view name,默认情况view name就是方法名。
- 什么也不返回,这个时候可以在方法体中直接往HttpServletResponse写入返回内容,否则将会由RequestToViewNameTranslator来决定
- 任何其他类型的对象。这个时候就会把该方法返回类型对象当做返回Model模型的一个属性返回给视图使用,这个属性名称可以通过在方法上给定@ModelAttribute注解来指定,否则将默认使用该返回类名称作为属性名称。
- @RequestMapping("/{owner}/index")
- public String userIndex(Map<String, Object> map,@PathVariable String owner, HttpServletRequest request) throws ParserException {
- List<DefCategory> categories = categoryService.find(owner);
- int offset = Util.getOffset(request);
- Pager<Blog> pager = blogService.find(owner, 0, offset, maxResults);
- int totalRecords = pager.getTotalRecords();
- List<Blog> blogs = pager.getData();
- Util.shortBlog(blogs);
- List<Message> messages = messageService.find(owner, 0, 5).getData();
- Util.shortMessage(messages, 20);
- map.put("messages", messages);
- map.put("totalRecords", totalRecords);
- List<BlogStore> stores = storeService.find(owner, 0, 5).getData();
- map.put("maxResults", maxResults);
- map.put("blogs", blogs);
- map.put("totalRecords", totalRecords);
- map.put("owner", userService.find(owner));
- map.put("defCategories", categories);
- map.put("stores", stores);
- return "blog/userIndex";
- }
给页面传值
在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
相关推荐
springmvc的思维导图,完整版, Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。
SpringMVC总结.md
SpringMVC是Spring框架的一部分,专门用来构建Web应用程序的MVC架构模式。它的设计目的是简化Web层的应用程序开发,具有高度的可配置性、灵活性以及与Spring其他技术的无缝集成能力。SSM即Spring、SpringMVC和...
适合用过一段时间SpringMvc的开发者, 以及看开始用SpringMVC开发项目的开发者, 很不错的总结文档...
本总结笔记是Spring、Mybatis、SpringMVC的综合学习资源,涵盖了这些框架的基本概念、配置方式、优点与适用场景,以及它们各自组件和功能点的详细解释。适用于初学者入门学习,同时也可以作为面试时的参考资料,帮助...
### SpringMVC框架详解 #### 一、SpringMVC框架概述 SpringMVC是一个轻量级的MVC框架,它遵循MVC模式,用于构建基于Java的Web应用程序。该框架的核心优势在于它能够清晰地将数据层、业务逻辑层与表示层进行分离,...
SpringMVC 是一款基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的一部分,主要用于构建 MVC(Model-View-Controller)架构的应用程序。SpringMVC 的核心是 DispatcherServlet,它作为前端控制器,负责接收请求...
根据给定文件的信息,本文将对SpringMVC框架的核心流程进行深入总结,并通过核心流程图的形式来解析SpringMVC的工作机制。SpringMVC是Spring框架的一部分,它为Web应用程序提供了模型-视图-控制器(Model-View-...
MyBatis和SpringMVC是两个非常流行的Java开发框架,它们在企业级应用开发中有着广泛的应用。MyBatis是一个轻量级的持久层框架,它解决了Java与数据库交互时的繁琐工作,而SpringMVC则是一个强大的MVC(Model-View-...
总结,SpringMVC 以其强大的功能和灵活性,成为了 Java Web 开发的主流框架之一。通过理解并熟练掌握上述知识点,开发者可以构建出高效、可维护的 Web 应用程序。本教程的 PPT 将详细讲解这些内容,帮助你快速上手 ...
Spring和SpringMVC面试问题总结 1.Spring中AOP的应用场景、Aop原理、好处? 2.Spring中IOC的作用与原理?对象创建的过程。 3.介绍spring框架 4.Spring常见创建对象的注解? 5.Spring中用到的设计模式 6.Spring的优点...
【SpringMVC课程总结】 一、课程基本概况 本次课程主要涵盖了JavaWeb框架技术,特别是SpringMVC这一流行且强大的MVC框架。课程内容详细讲解了SpringMVC的基本概念、核心组件及其工作流程。学生通过学习,掌握了从...
【标题】:“Maven与SpringMVC技术总结” 【描述】:“Maven, MySQL, SpringMVC技术概览” 【标签】:“Maven” 【正文】: Maven是一款强大的Java项目管理和集成工具,它简化了构建、依赖管理和项目生命周期...
总结起来,"SpringMVC+Hibernate+EXT"的项目源码提供了一个完整的解决方案,涵盖了Web开发的各个方面:从后端的业务逻辑处理到前端的用户体验设计。通过学习和理解这个项目的源码,开发者可以深入理解如何将这三个...
在提供的压缩包文件中,"MyBatis-SpringMVC整合总结.docx"可能包含了详细的整合步骤和注意事项,而"jar包"可能包含了项目中用到的第三方库,"springMVC_web"则可能是项目结构或示例代码。这些资源对于学习和实践...
以下是基于这些文档内容的详细知识点总结: 1. **SpringMVC概述与HelloWorld**: - SpringMVC是Spring框架的一个模块,用于构建Web应用程序,它提供了模型-视图-控制器(MVC)架构模式的实现。 - HelloWorld示例...
总结来说,这个SpringMVC demo涵盖了SpringMVC的基本用法和高级特性,是一个很好的学习和实践平台。通过分析和运行这个示例,你将能更深入地理解和掌握SpringMVC框架的各个方面,包括但不限于模型绑定、数据验证、...
**总结** "IDEA社区版编写的SpringMVC小项目"涵盖了SpringMVC的基本使用,包括了文件上传和JSON解析两个常见功能。这个项目可以作为学习SpringMVC的起点,帮助理解如何在IDEA中配置和运行SpringMVC项目,以及如何...