SpringMVC简单认知

springMVC

  • 一款基于web开发的应用框架
  • MVC:
    • Model : 模型 - 数据 domain
    • View : 视图 - 数据的展现方式 jsp, jstl, el
    • Controller : 控制器 - 结合模型和视图,控制请求流程 例如:servlet, controller
  • Servlet和Controller比较:
    • servlet缺点:
      • 请求参数处理麻烦 String 值 = request.getParameter(“参数名”)
      • 当业务比较多时,servlet 类的数量膨胀不好管理
    • controller优点:
      • 利用spring 各种思想,ioc, di, aop, 可扩展性高

开始学习:

知识点一:一个基于springMVC的http请求的响应过程

  • 第一步:向服务器发送Http request请求,请求被前端控制器==(DispatcherServlet)==捕获。
  • 第二步:前端控制器根据xml(spring.xml)文件中的配置(或者注解)对请求的URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用处理器映射器(HandlerMapping)获得处理该请求的Handler(controller)以及Handler对应的拦截器(Interceptor),最后以 HandlerExecutionChain 对象的形式返回。
  • 第三步:前端控制器根据获得的Handler(controller),选择一个合适的处理器适配器(HandlerAdapter)去执行该Handler。
  • 第四步:处理器适配器提取request中的模型数据,填充Handler入参,执行处理器(Handler)(也称之为Controller).
  • 第五步:Handler(Controller)执行完成后,向处理器适配器返回一个ModelAndView对象,处理器适配器再向前端控制器返回该ModelAndView对象(ModelAndView只是一个逻辑视图)。
  • 第六步:根据返回的ModelAndView,前端控制器请求一个适合的视图解析器(ViewResolver)(必须是已经注册到Spring容器中的ViewResolver)去进行视图解析,然后视图解析器向前端控制器返回一个真正的视图View(jsp)。
  • 第七步:前端控制器通过Model解析出ModelAndView中的参数进行解析,最终展现出完整的View并通过Http response返回给客户端。
    SpringMVC简单认知_第1张图片SpringMVC简单认知_第2张图片

知识点二:组件分析

  • 前端控制器DispatcherServlet:(不需要我们开发)

    • 作用:接收请求,响应结果,相当于转发器,中央处理器。有了DispatcherServlet减少了其它组件之间的耦合度。
  • 处理器映射器HandlerMapping:(不需要我们开发)

    • 作用:根据请求url查找Handler。
  • 处理器适配器HandlerAdapter:(不需要我们开发)

    • 作用:按照特定的规则(HandlerAdapter要求的规则)去执行Handler
  • 处理器Handler(需要我们开发)

    • 注意:编写Handler时按照HandlerAdapter的要求去做,这样适配器才可以去正确执行Handler
  • 视图解析器ViewResolver(不需要我们开发)

    • 作用:进行视图解析,根据逻辑视图名解析成真正的View
  • 视图View(需要程序员开发JSP)

    • View是一个接口,实现类支持不同的View类型(jsp、freemarker、pdf…)
  • 【注】:不需要程序员开发的,需要程序员自己做一下配置即可。

  • 依赖添加

依赖:

<dependency>
    <groupId>org.springframeworkgroupId>
    <artifactId>spring-webmvcartifactId>
    <version>4.3.21.RELEASEversion>
dependency>


<dependency>
    <groupId>javax.servletgroupId>
    <artifactId>javax.servlet-apiartifactId>
    <version>3.1.0version>
    <scope>providedscope>
dependency>

<dependency>
    <groupId>javax.servlet.jspgroupId>
    <artifactId>javax.servlet.jsp-apiartifactId>
    <version>2.2.1version>
    <scope>providedscope>
dependency>

<dependency>
    <groupId>jstlgroupId>
    <artifactId>jstlartifactId>
    <version>1.2version>
dependency>
  • spring配置文件添加
这里和spring博客那里的xml配置是一样的:可以根据所需要的配置
下面我举了一些重要配置。

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">

        
        <mvc:annotation-driven />
         
        <context:component-scan base-package="com.banban.controller"/>

        
        <mvc:view-resolvers>
                
                <mvc:jsp prefix="/" suffix=".jsp" />
        mvc:view-resolvers>

        
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            
            <property name="maxUploadSize" value="500000">property>
        bean>


        
        <mvc:default-servlet-handler/>

        
        <context:component-scan base-package="com.banban.interceptor"/>

        
        <mvc:interceptors>
            
            <mvc:interceptor>
                <mvc:mapping path="/a"/>
                <ref bean="myInterceptor1"/>
            mvc:interceptor>
        mvc:interceptors>
beans>
  • 控制器
    • spring 提供的前控制器(实际是一个servlet),作为一个统一入口,由它来分发请求,进入真正的控制器
      需要使用 WEB-INF/web.xml 文件配置它的路径

<servlet>
    <servlet-name>aaservlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
    
    <init-param>
        <param-name>contextConfigLocationparam-name>
        <param-value>classpath:springmvc.xmlparam-value>
    init-param>
    
    <load-on-startup>1load-on-startup>
servlet>

<servlet-mapping>
    <servlet-name>aaservlet-name>
    
    <url-pattern>/url-pattern>
servlet-mapping>

说明:

  • 在配置前端控制器的时候,需要我们配置的有contextConfigLocation,为他指定SpringMVC.xml的路径,否则默认加载WEB-INF/[DispatcherServlet的Servlet名字]-servlet.xml
  • DispatcherServlet三种拦截方式:
    • *.action:可以访问以.action结尾的地址,由DispatcherServlet进行解析。此方法最简单,不会导致静态资源(jpg,js,css)被拦截。
    • / :所有访问的地址都由DispatcherServlet进行解析,此方法可以实现REST风格的url,很多互联网类型的应用使用这种方式。但是此方法会导致静态文件(jpg,js,css)被拦截后不能正常显示,所以对静态文件的解析需要配置不让DispatcherServlet进行解析。
    • /*:这样配置是不对的,使用这种配置,最重要转发到一个jsp页面时,仍然会由DispatcherServlet解析jsp地址,不能根据jsp页面找到Handler,会报错。

操作:基于注解方式的MVC操作

SpringMVC.xml的配置说明:

<mvc:annotation-driven />
这个配置是开启关于MVC的所有相关注解
比如:《基本上这一个开启,就涵盖了所有的处理器映射器的配置》

<mvc:annotation-driven />
是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学都快速应用默认配置方案。
<mvc:annotation-driven />
会自动注册DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,是spring MVC为@Controllers分发请求所必须的。
并提供了:
数据绑定支持,
@NumberFormatannotation支持,
@DateTimeFormat支持,
@Valid支持,
读写XML的支持(JAXB),
读写JSON的支持(Jackson)。
后面,我们处理响应ajax请求时,就使用到了对json的支持。
后面,对action写JUnit单元测试时,要从spring IOC容器中取DefaultAnnotationHandlerMapping与AnnotationMethodHandlerAdapter 两个bean,来完成测试,取的时候要知道是<mvc:annotation-driven />这一句注册的这两个bean。
<context:component-scan base-package="com.banban.controller"/>
这个是扫描那些加了controller,service等等的注解的类,加入到容器中去。

        <mvc:view-resolvers>
                
                <mvc:jsp prefix="/" suffix=".jsp" />
        mvc:view-resolvers>

配置视图解析,当controller完成逻辑后,spring会根据,我们返回或者定义的路径,拼接成完整的url返回。

        <mvc:default-servlet-handler/>
因为拦截器原因,如果默认拦截所有路径,会一起将静态资源拦截,这个注解,就是忽略静态资源的拦截,使其能成功呈现在jsp中。而不会出现静态资源丢失的情况

  
        <mvc:interceptors>
            
            <mvc:interceptor>
                <mvc:mapping path="/a"/>
                <ref bean="myInterceptor1"/>
            mvc:interceptor>
        mvc:interceptors>
拦截器配置:我们可以自定义有哪些拦截器,以及拦截的路径有哪些

前控制器web.xml配置说明


        <servlet>
            <servlet-name>DispatcherServletservlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServletservlet-class>
            
            <init-param>
                <param-name>contextConfigLocationparam-name>
                <param-value>classpath:springmvc.xmlparam-value>
            init-param>
            
            <load-on-startup>1load-on-startup>
        servlet>

        <servlet-mapping>
            <servlet-name>DispatcherServletservlet-name>
            
            <url-pattern>/url-pattern>
        servlet-mapping>

这是MVC的核心配置;
所有的请求与回应都会经过前端控制器。

        <filter>
            <filter-name>Codingfilter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilterfilter-class>
            <init-param>
                <param-name>encodingparam-name>
                <param-value>UTF-8param-value>
            init-param>
        filter>

        <filter-mapping>
            <filter-name>Codingfilter-name>
            <url-pattern>/*url-pattern>
        filter-mapping>
        
这个配置是解决post请求乱码问题

你可能感兴趣的:(框架,SpringMVC,SpringMVC简单认知)