SpringMVC01

三层架构

  • 表现层:负责数据展示

  • 业务层:负责业务处理

  • 数据层:负责数据操作

  • MVC(Model View Controller),一种用于设计创建Web应用程序表现层的模式

  • 入门案例制作

    ①导入SpringMVC相关坐标

  • <!-- servlet3.1规范的坐标 -->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>3.1.0</version>
        <scope>provided</scope>
    </dependency>
    <!--jsp坐标-->
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.1</version>
        <scope>provided</scope>
    </dependency>
    <!--spring的坐标-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.9.RELEASE</version>
    </dependency>
    <!--spring web的坐标-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-web</artifactId>
        <version>5.1.9.RELEASE</version>
    </dependency>
    <!--springmvc的坐标-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.1.9.RELEASE</version>
    </dependency>

    ②定义表现层业务处理器Controller,并配置成spring的bean(等同于Servlet)

  • @Controller
    public class UserController {
    
        public void save(){
            System.out.println("user mvc controller is running ...");
        }
    }
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:context="http://www.springframework.org/schema/context"
           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">
        <!--扫描加载所有的控制类类-->
        <context:component-scan base-package="com.itheima"/>
    
    </beans>

    ③web.xml中配置SpringMVC核心控制器,用于将请求转发到对应的具体业务处理器Controller中(等同于Servlet配置)

  • <servlet>
        <servlet-name>DispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:spring-mvc.xml</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>DispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    ④设定具体Controller的访问路径(等同于Servlet在web.xml中的配置)

  • //设定当前方法的访问映射地址
    @RequestMapping("/save")
    public void save(){
        System.out.println("user mvc controller is running ...");
    }

    ⑤设置返回页面

  • //设定当前方法的访问映射地址
    @RequestMapping("/save")
    //设置当前方法返回值类型为String,用于指定请求完成后跳转的页面
    public String save(){
        System.out.println("user mvc controller is running ...");
        //设定具体跳转的页面
        return "success.jsp";
    }

    入门案例工作流程分析

  • 服务器启动

    1. 加载web.xml中DispatcherServlet

    2. 读取spring-mvc.xml中的配置,加载所有com.itheima包中所有标记为bean的类

    3. 读取bean中方法上方标注@RequestMapping的内容

  • 处理请求

    1. DispatcherServlet配置拦截所有请求 /

    2. 使用请求路径与所有加载的@RequestMapping的内容进行比对

    3. 执行对应的方法

    4. 根据方法的返回值在webapp目录中查找对应的页面并展示


      使用注解形式转化SpringMVC核心配置文件为配置类

    5. @Configuration
      @ComponentScan(value = "com.itheima",includeFilters =
          @ComponentScan.Filter(type=FilterType.ANNOTATION,classes = {Controller.class})
          )
      public class SpringMVCConfiguration implements WebMvcConfigurer{
          //注解配置放行指定资源格式
      //    @Override
      //    public void addResourceHandlers(ResourceHandlerRegistry registry) {
      //        registry.addResourceHandler("/img/**").addResourceLocations("/img/");
      //        registry.addResourceHandler("/js/**").addResourceLocations("/js/");
      //        registry.addResourceHandler("/css/**").addResourceLocations("/css/");
      //    }
      
          //注解配置通用放行资源的格式
          @Override
          public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
              configurer.enable();;
          }
      }

      基于servlet3.0规范,自定义Servlet容器初始化配置类,加载SpringMVC核心配置类

    6. public class ServletContainersInitConfig extends AbstractDispatcherServletInitializer {
          //创建Servlet容器时,使用注解的方式加载SPRINGMVC配置类中的信息,并加载成WEB专用的			           //ApplicationContext对象
          //该对象放入了ServletContext范围,后期在整个WEB容器中可以随时获取调用
          @Override
          protected WebApplicationContext createServletApplicationContext() {
              AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext();
              ctx.register(SpringMVCConfiguration.class);
              return ctx;
          }
      
          //注解配置映射地址方式,服务于SpringMVC的核心控制器DispatcherServlet
          @Override
          protected String[] getServletMappings() {
              return new String[]{"/"};
          }
      
          @Override
          protected WebApplicationContext createRootApplicationContext() {
              return null;
          }
      
          //乱码处理作为过滤器,在servlet容器启动时进行配置,相关内容参看Servlet零配置相关课程
          @Override
          public void onStartup(ServletContext servletContext) throws ServletException {
              super.onStartup(servletContext);
              CharacterEncodingFilter cef = new CharacterEncodingFilter();
              cef.setEncoding("UTF-8");
              FilterRegistration.Dynamic registration = servletContext.addFilter("characterEncodingFilter", cef);
              registration.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST,DispatcherType.FORWARD,DispatcherType.INCLUDE),false,"/*");
          }
      }

    7. 删除spring-mvc.xml

    8. 删除web.xml


      POJO类型参数传参

    9. @RequestMapping("/requestParam4")
      public String requestParam4(User user,String age){
          System.out.println("user.age="+user.getAge()+",age="+age);
          return "page.jsp";
      }

      类型转换器

      SpringMVC对接收的数据进行自动类型转换,该工作通过Converter接口实现

    10. 日期类型格式转换

    11. 声明自定义的转换格式并覆盖系统转换格式

    12. <!--5.启用自定义Converter-->
      <mvc:annotation-driven conversion-service="conversionService"/>
      <!--1.设定格式类型Converter,注册为Bean,受SpringMVC管理-->
      <bean id="conversionService"
            class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
          <!--2.自定义Converter格式类型设定,该设定使用的是同类型覆盖的思想-->
          <property name="formatters">
              <!--3.使用set保障相同类型的转换器仅保留一个,避免冲突-->
              <set>
                  <!--4.设置具体的格式类型-->
                  <bean class="org.springframework.format.datetime.DateFormatter">
                      <!--5.类型规则-->
                      <property name="pattern" value="yyyy-MM-dd"/>
                  </bean>
              </set>
          </property>
      </bean>

      自定义类型转换器

    13. 自定义类型转换器,实现Converter接口,并制定转换前与转换后的类型

    14. <!--1.将自定义Converter注册为Bean,受SpringMVC管理-->
      <bean id="myDateConverter" class="com.itheima.converter.MyDateConverter"/>
      <!--2.设定自定义Converter服务bean-->
      <bean id="conversionService"
            class="org.springframework.context.support.ConversionServiceFactoryBean">
          <!--3.注入所有的自定义Converter,该设定使用的是同类型覆盖的思想-->
          <property name="converters">
              <!--4.set保障同类型转换器仅保留一个,去重规则以Converter<S,T>的泛型为准-->
              <set>
                  <!--5.具体的类型转换器-->
                  <ref bean="myDateConverter"/>
              </set>
          </property>
      </bean>
      //自定义类型转换器,实现Converter接口,接口中指定的泛型即为最终作用的条件
      //本例中的泛型填写的是String,Date,最终出现字符串转日期时,该类型转换器生效
      public class MyDateConverter implements Converter<String, Date> {
          //重写接口的抽象方法,参数由泛型决定
          public Date convert(String source) {
              DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
              Date date = null;
              //类型转换器无法预计使用过程中出现的异常,因此必须在类型转换器内部捕获,不允许抛出,框架无法预计此类异常如何处理
              try {
                  date = df.parse(source);
              } catch (ParseException e) {
                  e.printStackTrace();
              }
              return date;
          }
      }

      通过注册自定义转换器,将该功能加入到SpringMVC的转换服务ConverterService中

    15. <!--开启注解驱动,加载自定义格式化转换器对应的类型转换服务-->
      <mvc:annotation-driven conversion-service="conversionService"/>

上一篇:两层网络架构综合实验配置


下一篇:vue 组件name的 正确使用方式