1. 导入spring-mvc依赖
      1. <!-- Spring MVC-->
      2. <dependency>
      3. <groupId>org.springframework</groupId>
      4. <artifactId>spring-webmvc</artifactId>
      5. <version>${spring.version}</version>
      6. </dependency>
    1. 新建一个spring的xml文件,前缀有context和MVC ```xml <?xml version=”1.0” encoding=”UTF-8”?>

    
    
    3. 
    spring-mvc.xml中组件扫描web包
    ```xml
    <!--组件扫描-->
    <context:component-scan base-package="com.jie.ssm.web"/>
    
    1. spring-mvc.xml配置视图解析器

      <!-- 视图解析器 -->
      <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
       <!--
           viewClass,视图, 默认是 InternalResourceView
           JstlView是 InternalResourceView子视图,增加了对jstl标签库的支持
               -->
       <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
       <!-- 视图路径的前缀 -->
       <property name="prefix" value="/WEN-INF/views/"/>
       <!-- 视图路径的后缀 -->
       <property name="suffix" value=".jsp"/>
      
       <property name="contentType" value="text/html;charset=UTF-8"/>
      </bean>
      
    1. web.xml的3.1版本 ```xml

    Archetype Created Web Application

    
    
    6. 
    web.xml配置前端控制器(所有请求都要从控制器中走)
    ```xml
    <!-- Spring MVC 前端控制器 -->
    <servlet>
      <servlet-name>springMVC</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>springMVC</servlet-name>
      <!-- /:表示所有的请求都要经过前端控制器 -->
      <url-pattern>/</url-pattern>
    </servlet-mapping>
    
    1. 容器之间的关系

    2. web.xml配置ContextLoaderListener监听器 ```xml

      contextConfigLocation classpath:beans.xml

    org.springframework.web.context.ContextLoaderListener

    
    
    9. 
    Login案例
    
       1. 
    创建controller 包
    
       2. 
    创建LoginController类
    
       3. 
    pom.xml导入servlet和jstl标签依赖
    ```xml
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.1</version>
    </dependency>
    
    <dependency>
      <groupId>javax.servlet.jsp.jstl</groupId>
      <artifactId>jstl-api</artifactId>
      <version>1.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.glassfish.web/jstl-impl -->
    <!-- https://mvnrepository.com/artifact/jstl/jstl -->
    <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>
    
    1. 写LoginController ```java package com.jie.ssm.web.controller;

    import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod;

    @Controller//表示这个一个控制器 public class LoginController {

    @RequestMapping(value = "/login",method = RequestMethod.GET)// /login访问该方法,该方法类型的是get请求
    public String login(){
        return "login";
    }
    

    }

    
    
       - 
    完整写法
    ```java
    package com.jie.ssm.web.controller;
    
    
    
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.servlet.ModelAndView;
    
    @Controller//表示这个一个控制器
    public class LoginController {
    
        @RequestMapping(value = "/login",method = RequestMethod.GET)// /login访问该方法,该方法类型的是get请求
        public ModelAndView login(){
            ModelAndView mv = new ModelAndView();
            mv.setViewName("login");
            mv.addObject("test","hello");
    
            return mv;
        }
    }
    
      - 返回是字符串或者ModelAndView,最终都会是ModelAndView对象
    
    1. 返回数据

      @RequestMapping(value = "/data",method = RequestMethod.GET)
      @ResponseBody
      public String data(){
      
      return "!!!";
      }
      
    1. 日志

      1. 导包 ```xml UTF-8 1.7 1.7 3.5.6 5.2.9.RELEASE 3.2.8 1.7.25 1.2.3
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>${slf4j.version}</version>
    </dependency>
    <!-- logback-core基础包 -->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-core</artifactId>
      <version>${logback.version}</version>
    </dependency>
    <!-- logback-classic是slf4j具体实现 -->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>${logback.version}</version>
    </dependency>
    <!-- logback-access访问模块,用于与Servlet容器集成,提供通过http协议来访问日志的功能 -->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-access</artifactId>
      <version>${logback.version}</version>
    </dependency>
    
    
    
       2. 
    引入日志
    ```xml
    <?xml version="1.0" encoding="UTF-8"?>
    <!-- scan,当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
    <!-- debug,当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false -->
    <configuration scan="true" scanPeriod="30 seconds" debug="false">
       <!-- 自定义属性,可以通过${属性名}进行访问 -->
       <property name="log.home" value="./" />
       <property name="app.name" value="demo" />
       <!-- 归档日志文件的最大数量 -->
       <property name="maxHistory" value="7" />
    
       <contextName>${app.name}</contextName>
    
       <!-- 日志输出格式 -->
       <property name="PATTERN"
               value="%d{yyyy-MM-dd HH:mm:ss.SSS} %thread %-5level %logger{100} %msg %n" />
    
       <!-- 输出源:控制台输出 -->
       <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
          <encoder charset="UTF-8">
             <pattern>${PATTERN}</pattern>
          </encoder>
       </appender>
    
       <!-- 输出源:文件输出(等级过滤只输出DEBUG日志) -->
       <appender name="FILE_DEBUG"
               class="ch.qos.logback.core.rolling.RollingFileAppender">
          <!-- 日志输出文件地址 -->
          <file>${log.home}/logs/${app.name}_debug.log</file>
          <!-- 追加到文件末尾 -->
          <append>true</append>
          <!-- 日志过滤设置,这里只输出DEBUG日志 -->
          <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>DEBUG</level>
             <onMatch>ACCEPT</onMatch>
             <onMismatch>DENY</onMismatch>
          </filter>
          <!-- 日志归档策略:按天来滚动,如果需要按小时来滚动,则设置为{yyyy-MM-dd_HH} -->
          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <fileNamePattern>${log.home}/logs/${app.name}_debug.%d{yyyy-MM-dd}.log
             </fileNamePattern>
             <!-- 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件,,例如设置为30的话,则30天之后,旧的日志就会被删除 -->
             <maxHistory>${maxHistory}</maxHistory>
          </rollingPolicy>
          <!-- 输出格式 -->
          <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
             <Pattern>${PATTERN}</Pattern>
          </encoder>
       </appender>
    
       <!-- 输出源:文件输出(等级过滤,只输出INFO日志) -->
       <appender name="FILE_INFO"
               class="ch.qos.logback.core.rolling.RollingFileAppender">
          <file>${log.home}/logs/${app.name}_info.log</file>
          <!-- 只输出INFO日志 -->
          <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>INFO</level>
             <onMatch>ACCEPT</onMatch>
             <onMismatch>DENY</onMismatch>
          </filter>
          <!-- 按天来回滚,如果需要按小时来回滚,则设置为{yyyy-MM-dd_HH} -->
          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <fileNamePattern>${log.home}/logs/${app.name}_info.%d{yyyy-MM-dd}.log
             </fileNamePattern>
             <maxHistory>${maxHistory}</maxHistory>
          </rollingPolicy>
          <!-- 输出格式 -->
          <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
             <Pattern>${PATTERN}</Pattern>
          </encoder>
       </appender>
    
       <!-- 输出源:文件输出(阈值过滤) -->
       <appender name="FILE_WARN"
               class="ch.qos.logback.core.rolling.RollingFileAppender">
          <file>${log.home}/logs/${app.name}_warn.log</file>
          <!-- 过滤WARN等级前的日志,即输出WARN等级之后的所有日志 -->
          <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
             <level>WARN</level>
          </filter>
          <!-- 按天来回滚,如果需要按小时来回滚,则设置为{yyyy-MM-dd_HH} -->
          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <fileNamePattern>${log.home}/logs/${app.name}_warn.%d{yyyy-MM-dd}.log
             </fileNamePattern>
             <maxHistory>${maxHistory}</maxHistory>
          </rollingPolicy>
          <!-- 输出格式 -->
          <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
             <Pattern>${PATTERN}</Pattern>
          </encoder>
       </appender>
    
       <!-- 输出源:文件输出(等级过滤) -->
       <appender name="FILE_ERROR"
               class="ch.qos.logback.core.rolling.RollingFileAppender">
          <file>${log.home}/logs/${app.name}_error.log</file>
          <!-- 只输出ERROR日志 -->
          <filter class="ch.qos.logback.classic.filter.LevelFilter">
             <level>ERROR</level>
             <onMatch>ACCEPT</onMatch>
             <onMismatch>DENY</onMismatch>
          </filter>
          <!-- 按天滚动,如果需要按小时来滚动,则设置为{yyyy-MM-dd_HH} -->
          <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
             <fileNamePattern>${log.home}/logs/${app.name}_error.%d{yyyy-MM-dd}.log
             </fileNamePattern>
             <maxHistory>${maxHistory}</maxHistory>
          </rollingPolicy>
          <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
             <Pattern>${PATTERN}</Pattern>
          </encoder>
       </appender>
    
       <!-- DEBUG INFO WARN ERROR-->
       <logger name="org.springframework" level="DEBUG" />
       <logger name="org.apache.ibatis" level="DEBUG" />
       <logger name="java.sql" level="DEBUG" />
       <logger name="com.jingluu" level="DEBUG" />
    
       <!-- 控制com.jingluu包(及子包)下的日志输出,level设置等级;addtivity等于false表示不再向父包进行传递 -->
       <!--<logger name="com.jingluu" level="INFO" addtivity="false">
          <appender-ref ref="FILE_DEBUG" />
          <appender-ref ref="FILE_INFO" />
          <appender-ref ref="FILE_WARN" />
          <appender-ref ref="FILE_ERROR" />
       </logger>-->
    
       <!-- 最顶级日志控制,ROOT只有一个 -->
       <root level="DEBUG">
          <appender-ref ref="CONSOLE" />
          <appender-ref ref="FILE_DEBUG" />
          <appender-ref ref="FILE_INFO" />
          <appender-ref ref="FILE_WARN" />
          <appender-ref ref="FILE_ERROR" />
       </root>
    
    </configuration>