SpringMVC个人总结1

来源:互联网 发布:阿拉伯菜 知乎 编辑:程序博客网 时间:2024/05/21 13:23
SpringMVC:
     概念:
     Spring框架中的一个模块,属于MVC框架


     springMVC原理:
         前端控制器 :
    org.springframework.web.servlet.DispatcherServlet
处理器映射 :HandlerMapping
    1、org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
    2、org.springframework.web.servlet.mvc.support.ControllerBeanNameHandlerMapping
    以上两个基于xml文件配置


    3、org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
    基于注解配置
处理适配器 :HandlerAdapter
    1. org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter
              要求编写的Handler实现Controller接口
    2. org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter.class
             要求编写的Handler实现HttpRequestHandler接口
    3. org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter
      基于注解的配置




    <mvc:annotation-driven />等于实例化 注解的映射器和适配器
    
视图解析器 :ViewResolver
    org.springframework.web.servlet.view.InternalResourceViewResolver
    一般使用此解析器,支持JSTL
         
利用SpringMVC的开发步骤:
1、导入jar包
2、springMVC的Servlet的配置 (前端控制器)
     <servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
   </servlet>
   <servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>*.form</url-pattern>
   </servlet-mapping>
   如果这样配置servlet,spring默认读取WEB-INF/[servletName]-servlet.xml
   
   如果修改配置 文件的名称和路径:需要配置一个初始化参数
   <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:servletMVC.xml</param-value>
            </init-param>


3、spring配置文件   
   <!-- 配置spring容器扫描注解 -->
<context:component-scan base-package="com.geminno.springmvc" />

<!-- 默认的注解映射的支持  等同于配配置了两个bean,一个是映射处理器,适配器   -->
   <mvc:annotation-driven />

<!-- 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
<property name="prefix" value="/jsp/"/>  
<property name="suffix" value=".jsp"/>
   </bean> 
4、编写处理器(就是struts2中的action,在spring中一般叫controller)
   


 
http://localhost:8888/SpringMVCDemo/user/userName.form


     参数的传递:
         1、自动匹配参数
   
2、自动装箱


3、日期处理:
    @InitBinder
    public void initBinder(ServletRequestDataBinder binder){
         binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"),
           true));
    }
4、特定参数的参数的处理
  @requestParam
  @PathVariable   //按照占位符


5、转发和重定向
   a、转发到一个jsp :return "string";
   b、转发到action :return "forward:url" 注:加后缀 //forward:/user/showUser.form
   c、重定向到一个JSP:return "redirect:/jsp/list.jsp"; 
       存放到Model中的数据,会自动加到url地址栏中传递
   d、重定向到action:return "redirect:/user/userList.form";


6、ajax请求:
   
 
7、springMVC操作Servlet的API
   
   
     
     Spring拦截器:
         两种方式:
   1、实现 HandlerInterceptor 接口  抽象类:HandlerInterceptorAdapter 
       preHandle() :该方法将在请求处理之前进行调用,一般进行初始化操作
            返回false时,后续的拦截器和controller不会执行
postHandle():在当前请求进行处理之后,也就是Controller 方法调用之后执行,但是它会在    DispatcherServlet 进行视图返回渲染之前被调用,所以我们可以在这个方法中对 Controller 处理之后ModelAndView 对象进行操作。postHandle 方法被调用的方向跟preHandle 是相反的,也就是说先声明的Interceptor 的postHandle 方法反而会后执行,这和Struts2 里面的Interceptor 的执行过程有点类型。Struts2 里面的Interceptor 的执行过程也是链式的,只是在Struts2 里面需要手动调用 ActionInvocation 的invoke 方法来触发对下一个Interceptor 或者是Action 的调用,然后每一个Interceptor 中在invoke 方法调用之前的内容都是按照声明顺序执行的,而invoke 方法之后的内容就是反向的afterCompletion():该方法也是需要当前对应的Interceptor 的preHandle 方法的返回值为true 时才会执行。顾名思义,该方法将在整个请求结束之后,也就是在 DispatcherServlet 渲染了对应的视图之后执行。这个方法的主要作用是用于进行资源清理工作的。
   2、实现 WebRequestInterceptor  类:WebRequestInterceptor
WebRequest :Spring 定义的一个接口,它里面的方法定义都基本跟HttpServletRequest 一样,在  WebRequestInterceptor 中对WebRequest 进行的所有操作都将同步到 HttpServletRequest 中,然后在当前请求中一直传递preHandle():该方法将在请求处理之前进行调用,也就是说会在Controller 方法调用之前被调用。这个方法跟HandlerInterceptor 中的preHandle 是不同的,主要区别在于该方法的返回值是void ,也就是没有返回值,所以我们一般主要用它来进行资源的准备工作,比如我们在使用Hibernate 的时候可以在这个方法中准备一个Hibernate 的Session 对象,然后利用WebRequest 的setAttribute(name, value, scope) 把它放到WebRequest 的属性中。这里可以说说这个setAttribute 方法的第三个参数scope ,该参数是一个Integer 类型的。在WebRequest 的父层接口RequestAttributes 中对它定义了三个常量:
  SCOPE_REQUEST :它的值是0 ,代表只有在request 中可以访问。
  SCOPE_SESSION :它的值是1 ,如果环境允许的话它代表的是一个局部的隔离的session,否则就代表普通的session,并且在该session范围内可以访问。
  SCOPE_GLOBAL_SESSION :它的值是2 ,如果环境允许的话,它代表的是一个全局共享的session,否则就代表普通的session,并且在该session 范围内可以访问
   postHandle():该方法将在请求处理之后,也就是在Controller 方法调用之后被调用,但是会在视图返回被渲染之前被调用,所以可以在这个方法里面通过改变数据模型ModelMap 来改变数据的展示。该方法有两个参数,WebRequest 对象是用于传递整个请求数据的,比如在preHandle 中准备的数据都可以通过WebRequest 来传递和访问;ModelMap 就是Controller 处理之后返回的Model 对象,我们可以通过改变它的属性来改变返回的Model模型afterCompletion():该方法会在整个请求处理完成,也就是在视图返回并被渲染之后执行。所以在该方法中可以进行资源的释放操作。而WebRequest 参数就可以把我们在preHandle 中准备的资源传递到这里进行释放。Exception 参数表示的是当前请求的异常对象,如果在Controller 中抛出的异常已经被Spring 的异常处理器给处理了的话,那么这个异常对象就是null