SpringMVC环境搭建
2013-07-30 13:11
316 查看
随着Annotation的流行,一些主流框架都加入了对Annotation的支持。使用Annotation能够简化很多配置工作,能够很大程度上提高程序开发的效率。下面主要讲解Sping MVC 注解功能,介绍如何使用注解配置替换传统的基于 XML 的 Spring MVC 配置。
SpringMVC model类似于Struts。在多线程服务对象这点上,Spring的Controller类似于Struts Action,只有一个实例处理所有客户的请求。然而,我们相信Spring的MVC比起Struts有很多优点,例如: Spring在controllers,JavaBean,models和views提供了一个非常清晰的划分。
Spring 的MVC是非常灵活的。不像Struts,它强制你的Action和Form对象进入固化的层次之中(因而迫使你使用Java的实体承), Spring MVC完全是基于接口的。而且,通过插入你自己的接口几乎Spring MVC 框架的所有部分都是可配置的。
基于注解的Controller 是如何定义做到这一点的
[java]
view plaincopyprint?
package xxx.user.web;
…………………………
@Controller // <——①
@RequestMapping("/user.html") //<——②
public class UserController {
private String showListUserPage = "user/listUser";
………………………………………
@Resource // <——③
private UserManager userManger;
@"RequestMapping(“/work/staff/addStaff.do”) //<——④
public String listUser(ModelMap model) {
String roleMapJSON = UserConstants.getRoleMapJSON();
model.addAttribute("roleMapJSON", roleMapJSON);
return showListUserPage;
}
………………………
}
①@Controller注解标明该类需要Spring容器自动加载,将一个类成为 Spring 容器的 Bean。
②: @RequestMapping 这个注解使得该类具有了Spring MVC Controller 的功能。
@RequestMapping注解标识UserController处理来自/user.html的请求。
@RequestMapping 可以标注在类定义处,将 Controller 和特定请求关联起来;还可以标注在方法签名处(注解4后面详细介绍)。所以在类声明处标注的 @RequestMapping 相当于让 POJO 实现了 Controller 接口,而在方法定义处的 @RequestMapping 相当于让 POJO 扩展 Spring 预定义的 Controller(如 SimpleFormController 等)。
③:注解方式注入 UserManager
④: 此处又用了一个@RequestMapping注解,这里的这个注解是为了细粒度区分各个Controller方法,也就是说 listUser 这个方法来处理 /work/staff/addStaff.do的请求
此外,我们注意到此处返回值是一个String类型,Spring MVC会认为这是你告诉他返回的视图名称,当然此处你也可以返回一个ModelAndView类型,假若你什么也不返回-void,那么Spring会试图查找和你的请求URL同名的视图进行匹配(与配置文件相关)。
启用Spring MVC 功能
web.xml
Xml代码
……………………….
<!-- Spring MVC的Servlet,它将加载WEB-INF/annomvc-servlet.xml的配置文件,以启动Spring MVC模块 -->
[html]
view plaincopyprint?
<servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
启用Spring MVC 注解功能
web.xml 中定义了一个名为 spring的 Spring MVC 模块,按照 Spring MVC 的契约,需要在 WEB-INF/spring-servlet.xml 配置文件中定义 Spring MVC 模块的具体配置。
Spring MVC 会自动加载 spring-servlet.xml 配置文件,要使用注解功能,主要对其进行配置。
[html]
view plaincopyprint?
<?xml version="1.0" encoding= "UTF-8"?>
<beansxmlnsbeansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsd">
<mvc:annotation-driven/>
<context:component-scanbase-packagecontext:component-scanbase-package="com.tgb.SpringMVC1"/>
<beanclassbeanclass="org.springframework.web.servlet.view.InternalResourceViewResolver">
<propertynamepropertyname="viewClass"value="org.springframework.web.servlet.view.JstlView"/>
<propertynamepropertyname="prefix" value="/"></property>
<propertynamepropertyname="suffix" value=".jsp"></property>
</bean>
</beans>
图解
HandlerMapping
DispatcherServlet要将一个请求交给哪个特定的Controller,它需要咨询一个Bean——这个Bean的名字为“HandlerMapping”。
HandlerMapping是把一个URL指定到一个Controller上,(就像应用系统的web.xml文件使用<servlet-mapping>将URL映射到servlet)。
Spring带有三种HandlerMapping,(SpringMVC中的所有HandlerMapping都实现了接口org.springframework.web.servlet. HandlerMapping)。
ViewResolver
在Spring MVC中,当Controller将请求处理结果放入到ModelAndView中以后,DispatcherServlet会根据ModelAndView选择合适的视图进行渲染。那么在Spring MVC中是如何选择合适的View呢?View对象是是如何创建的呢?答案就在ViewResolver中,ViewResolver接口定义了resolverViewName方法,根据viewName创建合适类型的View实现。
<beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver">
<propertyname="viewClass"value="org.springframework.web.servlet.view.JstlView"/>
<propertyname="prefix" value="/"></property>
<propertyname="suffix" value=".jsp"></property>
</bean>
Handleradapter
Spring MVC通过HandlerAdapter来实际调用处理函数。
以AnnotationMethodHandlerAdapter为例
DispatcherServlet中根据handlermapping找到对应的handler method后,首先检查当前工程中注册的所有可用的handlerAdapter,根据handlerAdapter中的supports方法找到可以使用的handlerAdapter。通过调用handlerAdapter中的handle方法来处理及准备handler method中的参数及annotation(这就是spring mvc如何将reqeust中的参数变成handle method中的输入参数的地方),最终调用实际的handle
method。
SpringMVC model类似于Struts。在多线程服务对象这点上,Spring的Controller类似于Struts Action,只有一个实例处理所有客户的请求。然而,我们相信Spring的MVC比起Struts有很多优点,例如: Spring在controllers,JavaBean,models和views提供了一个非常清晰的划分。
Spring 的MVC是非常灵活的。不像Struts,它强制你的Action和Form对象进入固化的层次之中(因而迫使你使用Java的实体承), Spring MVC完全是基于接口的。而且,通过插入你自己的接口几乎Spring MVC 框架的所有部分都是可配置的。
基于注解的Controller 是如何定义做到这一点的
[java]
view plaincopyprint?
package xxx.user.web;
…………………………
@Controller // <——①
@RequestMapping("/user.html") //<——②
public class UserController {
private String showListUserPage = "user/listUser";
………………………………………
@Resource // <——③
private UserManager userManger;
@"RequestMapping(“/work/staff/addStaff.do”) //<——④
public String listUser(ModelMap model) {
String roleMapJSON = UserConstants.getRoleMapJSON();
model.addAttribute("roleMapJSON", roleMapJSON);
return showListUserPage;
}
………………………
}
package xxx.user.web; ………………………… @Controller // <——① @RequestMapping("/user.html") //<——② public class UserController { private String showListUserPage = "user/listUser"; ……………………………………… @Resource // <——③ private UserManager userManger; @"RequestMapping(“/work/staff/addStaff.do”) //<——④ public String listUser(ModelMap model) { String roleMapJSON = UserConstants.getRoleMapJSON(); model.addAttribute("roleMapJSON", roleMapJSON); return showListUserPage; } ……………………… }
①@Controller注解标明该类需要Spring容器自动加载,将一个类成为 Spring 容器的 Bean。
②: @RequestMapping 这个注解使得该类具有了Spring MVC Controller 的功能。
@RequestMapping注解标识UserController处理来自/user.html的请求。
@RequestMapping 可以标注在类定义处,将 Controller 和特定请求关联起来;还可以标注在方法签名处(注解4后面详细介绍)。所以在类声明处标注的 @RequestMapping 相当于让 POJO 实现了 Controller 接口,而在方法定义处的 @RequestMapping 相当于让 POJO 扩展 Spring 预定义的 Controller(如 SimpleFormController 等)。
③:注解方式注入 UserManager
④: 此处又用了一个@RequestMapping注解,这里的这个注解是为了细粒度区分各个Controller方法,也就是说 listUser 这个方法来处理 /work/staff/addStaff.do的请求
此外,我们注意到此处返回值是一个String类型,Spring MVC会认为这是你告诉他返回的视图名称,当然此处你也可以返回一个ModelAndView类型,假若你什么也不返回-void,那么Spring会试图查找和你的请求URL同名的视图进行匹配(与配置文件相关)。
启用Spring MVC 功能
web.xml
Xml代码
……………………….
<!-- Spring MVC的Servlet,它将加载WEB-INF/annomvc-servlet.xml的配置文件,以启动Spring MVC模块 -->
[html]
view plaincopyprint?
<servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
<servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-servlet.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
启用Spring MVC 注解功能
web.xml 中定义了一个名为 spring的 Spring MVC 模块,按照 Spring MVC 的契约,需要在 WEB-INF/spring-servlet.xml 配置文件中定义 Spring MVC 模块的具体配置。
Spring MVC 会自动加载 spring-servlet.xml 配置文件,要使用注解功能,主要对其进行配置。
[html]
view plaincopyprint?
<?xml version="1.0" encoding= "UTF-8"?>
<beansxmlnsbeansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsd">
<mvc:annotation-driven/>
<context:component-scanbase-packagecontext:component-scanbase-package="com.tgb.SpringMVC1"/>
<beanclassbeanclass="org.springframework.web.servlet.view.InternalResourceViewResolver">
<propertynamepropertyname="viewClass"value="org.springframework.web.servlet.view.JstlView"/>
<propertynamepropertyname="prefix" value="/"></property>
<propertynamepropertyname="suffix" value=".jsp"></property>
</bean>
</beans>
<?xml version="1.0" encoding= "UTF-8"?> <beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsd"> <mvc:annotation-driven/> <context:component-scanbase-package="com.tgb.SpringMVC1"/> <beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver"> <propertyname="viewClass"value="org.springframework.web.servlet.view.JstlView"/> <propertyname="prefix" value="/"></property> <propertyname="suffix" value=".jsp"></property> </bean> </beans>
图解
HandlerMapping
DispatcherServlet要将一个请求交给哪个特定的Controller,它需要咨询一个Bean——这个Bean的名字为“HandlerMapping”。
HandlerMapping是把一个URL指定到一个Controller上,(就像应用系统的web.xml文件使用<servlet-mapping>将URL映射到servlet)。
Spring带有三种HandlerMapping,(SpringMVC中的所有HandlerMapping都实现了接口org.springframework.web.servlet. HandlerMapping)。
ViewResolver
在Spring MVC中,当Controller将请求处理结果放入到ModelAndView中以后,DispatcherServlet会根据ModelAndView选择合适的视图进行渲染。那么在Spring MVC中是如何选择合适的View呢?View对象是是如何创建的呢?答案就在ViewResolver中,ViewResolver接口定义了resolverViewName方法,根据viewName创建合适类型的View实现。
<beanclass="org.springframework.web.servlet.view.InternalResourceViewResolver">
<propertyname="viewClass"value="org.springframework.web.servlet.view.JstlView"/>
<propertyname="prefix" value="/"></property>
<propertyname="suffix" value=".jsp"></property>
</bean>
Handleradapter
Spring MVC通过HandlerAdapter来实际调用处理函数。
以AnnotationMethodHandlerAdapter为例
DispatcherServlet中根据handlermapping找到对应的handler method后,首先检查当前工程中注册的所有可用的handlerAdapter,根据handlerAdapter中的supports方法找到可以使用的handlerAdapter。通过调用handlerAdapter中的handle方法来处理及准备handler method中的参数及annotation(这就是spring mvc如何将reqeust中的参数变成handle method中的输入参数的地方),最终调用实际的handle
method。
相关文章推荐
- SpringMVC学习-->第一天-搭建开发环境
- SpringMVC入门学习(一) 环境搭建+实例演示
- springMVC学习篇 - 搭建环境及关键点
- AngularJS整合Springmvc、Spring、Mybatis搭建开发环境
- SpringMVC学习之环境搭建(一)
- SpringMVC环境搭建
- springMVC 源码解析之简单环境搭建
- 搭建springmvc环境的步骤(基于配置文件)
- springMVC环境搭建-1
- springMVC环境搭建
- springmvc环境搭建及实例
- maven搭建springmvc环境
- SpringMvc环境搭建(下载所需的包)
- SpringMVC-01_SpringMVC环境搭建
- Springmvc——(1)环境搭建
- SpringMVC总结(一)搭建环境
- SpringMVC入门学习(一) 环境搭建+实例演示
- Step by Step 搭建SpringMVC项目[3]-配置SpringMVC环境
- SpringMvc环境搭建(配置文件)
- springMVC笔记系列(17 特别篇的开始)——springMVC要点回顾及idea开发环境搭建