Spring MVC框架是一个MVC框架,通过实现Model-View-Controller模式来很好地将数据、业务与展现进行分离。从这样一个角度来说,Spring MVC和Struts、Struts2非常类似。Spring MVC的设计是围绕DispatcherServlet展开的,DispatcherServlet负责将请求派发到特定的handler。通过可配置的handler mappings、view resolution、locale以及theme resolution来处理请求并且转到对应的视图。Spring MVC请求处理的整体流程如图:






spring mvc一定是soa架构吗 spring mvc指什么_mvc





spring和springMVC的关系


品,SpringMVC的整个配置都是基于IOC容器的, 可以与Spring无缝结合 。



springMVC(基于注解)


    在Spring MVC中开始比较全面的支持注解,通过注解可以大大简化J2EE应用开发的配置、精简开发人员的工作量从而提高开发效率。  好处: 


  • Controller不需要继承任何AbstractController等Controller; 
  • 无需通过配置文件配置,大大简化了Spring MVC相关的配置; 
  • 细粒度处理各种request请求,针对最基础的统一请求的GET/POST方式进行不同处理,除此还还可以对拥有不同请求参数的同一request请求分别用不同的方法处理{灵活}; 
  •  更加丰富的参数绑定机制,可以在Controller方法定义中,通过注解将某个或某些参数直接绑定到Controller方法的参数上,从而在方法体内,可以完全对HttpServletRequest视而不见,直接使用已经绑定好的参数。


    DispatcherServlet是继承自HttpServlet的,既然SpringMVC是基于DispatcherServlet的,那么使用springMVC前,需要在web.xml中配置如下:


<servlet> 

 

    <description>spring mvc servlet</description> 

 

    <servlet-name>springMvc</servlet-name> 

 

    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 

 

    <init-param><!-- 可以自定义配置文件路径和文件名 --> 

 
<  description>spring mvc 配置文件</description> 
 

      <param-name>contextConfigLocation</param-name> 

 

      <param-value>classpath:spring/spring-mvc.xml</param-value>  

 

    </init-param> 

 

    <load-on-startup>1</load-on-startup> 

 
</servlet> 
 

  <servlet-mapping> 

 

    <servlet-name>springMvc</servlet-name> 

 

    <url-pattern>/</url-pattern> 

 

  </servlet-mapping>



使用mvc注解方式,需要了解一下<mvc:annotation-driven />标签意义:


并提供了:数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)。


写JUnit单元测试时,要从spring IOC容器中取DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,来完成测试,取的时候要知道是<mvc:annotation-driven />这一句注册的这两个bean。



Spring 2.5 中除了提供 @Component注解外,还定义了几个拥有特殊语义的注解,它们分别是:@Repository、@Service 和 @Controller。在目前的 Spring 版本中,这 3 个注解和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注解分别和持久层、业务层和控制层(Web 层)相对应。虽然目前这 3 个注解和 @Component 相比没有什么新意,但 Spring 将在后面的版本中为它们添加特殊的功能。所以,如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注解。



    Spring3.x中定义一个控制器类,必须以@Controller注解标记。当控制器类接收到一个请求时,它会在自己内部寻找一个合适的处理方法来处理请求。使用@RequestMapping注解将方法映射到一些请求上,以便让该方法处理那些请求。这种方法就像一般的类中的方法,方法名参数列表和返回值并不像Struts2之类的框架有很强的限制。方法参数列表具体以及返回值具体都有哪些,这里先不细说。


    控制器在选择好适合处理请求的方法时,传入收到的请求(根据方法参数类型,可能以不同的类型传入),并且调用该方法中的逻辑来进行处理(也可以是调用Service来真正处理)。方法逻辑可能也会在参数中添加或者删除数据。处理方法处理完之后,会委派给一个视图,由该视图来处理方法的返回值。处理程序的返回值并不代表视图的具体实现,可以只是String类型,代表视图名,甚至是void(这时候SpringMVC可以根据方法名或者控制器名找默认视图)。也不需要担心返回值只是视图名称的话,视图拿不到要显示的数据,因为方法参数对于视图来说也是可以拿到的(使用model)。比如说,如果处理方法以Map为参数,那么这个Map对于视图也是可以拿到的,使用model的addAttribute方法。


    返回的视图名称会返回给DispatcherServlet,它会根据一个视图解析器将视图名称解析为一个具体的视图实现。这里说到的视图解析器是一个实现了ViewResolver接口的Bean,它的任务就是返回一个视图的具体实现(jsp、ftl、pdf、html等等).



@Controller(value="studentLoginController") 

 

  @RequestMapping("/student/login") 

 

  public class StudentLoginController { 

 

    

 

   @Resource(name="studentLoginServiceImpl") 

 

   private StudentLoginService studentLoginService; 

 

    

 

     
 
  

    @RequestMapping("/chooseRole") 
 
  

    public String getStudentRole(Model model){ 
 
  

     ...... 
 
  

     model.addAttribute("studentRoles", studentRoles); 
 
  

     return "student/login/choose_role"; 
 
  

    } 
 
  
 

   @RequestMapping("/studentCheckSuccess") 

 

   @ResponseBody 

 

   public Map<String, Object> studentCheckSuccess(HttpServletRequest req,HttpServletResponse resp) { 

 

    ...... 

 

    return map; 

 

   } 

 

  }




SpringMVC实现RESTful请求


    springmvc的resturl是通过@RequestMapping 及@PathVariable annotation提供的



一般请求:


@Controller


@RequestMapping("/aaa")//类级别,可以不需要,如果要了,下面所有的请求路径前都需要加入  /aaa  


public class MyController{  


 


value="/bbb", method=RequestMethod.GET)//方法级别,必须有,决定这个方法处理哪个请求,如果有类级别 /aaa/bbb?no=001&name=ylm,如果没有类级别的就直接请求/bbb?no=001&name=ylm


   

public String xxx(User user, Model model)   
 
  

         {   
 
  

                //直接操作user对象 
  
   

                model.addAttributes("user", user); 
  
  

               return "/index";   
 
  

         }   
 
  

   }



RESTful风格请求:


@Controller


@RequestMapping("/aaa")//类级别,可以不需要,如果要了,下面所有的请求路径前都需要加入  /aaa  


public class MyController{  


     //方法级别,必须有,决定这个方法处理哪个请求,如果有类级别 /aaa/bbb/001/ylm,如果没有类级别的就直接请求/bbb/001/ylm


   

@RequestMapping(value="/bbb/{no}/{name}", method=RequestMethod.GET) 
  
   

         @ResponseBody 
  
   
 xxx(User user)     
   

         {   
  
   

                //直接操作user对象 
  
      

               return user;   
  
   

         }   
  
   

    }