您的位置:首页 > 编程语言 > Java开发

SpringMVC环境搭建

2013-01-31 19:57 471 查看
随着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 是如何定义做到这一点的

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模块 -->

<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 配置文件,要使用注解功能,主要对其进行配置。



<?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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: