springMVC是什么

来源:互联网 发布:阿姆斯特丹大学 知乎 编辑:程序博客网 时间:2024/06/13 21:25
    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和springMVC的关系
Spring MVC属于Spring FrameWork的后续产品,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 />标签意义:
<mvc:annotation-driven /> 是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配置方案。<mvc:annotation-driven /> 会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,是spring MVC为@Controllers分发请求所必须的。并提供了:数据绑定支持,@NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持,读写XML的支持(JAXB),读写JSON的支持(Jackson)。
后面,我们处理响应ajax请求时,就使用到了对json的支持。写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{  
 
      @RequestMapping(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
     public User xxx(User user)  
     {  
            //直接操作user对象
           return user;  
     }  
0 0
原创粉丝点击