Springmvc详解

SpringMVC详解

javaSE、javaWeb、框架(建议研究官方文档,锻炼项目)

将来的技术栈:SpringMvc+Vue+SpringBoot+Linux

SpringMvc的执行流程(重点,面试常问问题)

注:SPringMVC的第一个项目的网址: http://c.biancheng.net/spring_mvc/first-program.html

1、SpringMvc

1.1、简介

MVC:模型(dao,service)、视图(jsp)、控制器(servlet)

定义:

  • 是一种软件的设计的规范
  • 是将业务逻辑、数据、显示分离的方法来组织代码
  • MVC主要的作用时降低了视图与业务逻辑之间的双向耦合
  • MVC不是一种设计模式,而是一种架构模式

前端、数据传输、实体类(pojo、vo、dto)

SpringMvc是一种基于java实现的web框架

SpringMVC的特点

  • 轻量级
  • 高效,基于请求相应的MVC框架
  • 与Spring兼容性好,无缝结合
  • 约定大于配置
  • 功能强大,RESTful、数据验证、格式化、本地化、主题等。
  • 简介灵活

Spring的web框架围绕DispatcherServlet(调度servlet)设计的,DispatcherServlet的作用时将请求分发到不同的处理器

1.2、SPringMVC的运行流程

image-20211114162538636

1.3、第一个SpringMVC项目

所需要的maven依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>SpringMVC</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>SpringMVC-01</artifactId>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
        </dependency>


        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.1</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.1.0.RELEASE</version>
        </dependency>
    </dependencies>


    <properties>
        <maven.compiler.source>9</maven.compiler.source>
        <maven.compiler.target>9</maven.compiler.target>
    </properties>


    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
        </resources>
    </build>
</project>

SpringMVC所需要的配置的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>SpriDispatcherServletng</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <!--
        注:/与/*的区别
        1、/不会扫面项目中的jsp的文件,但是/*会扫面项目中的jsp'的文件,因此我们一般事采用/而不是采用/*
        -->
        <servlet-name>SpriDispatcherServletng</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

所需要配置的springmvc-servlet.xml文件的内容

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       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">

<!--    配置映射器-->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>

<!--   配置处理器适配器 -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
<!--    配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!--        配置文件的前后缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <bean class="com.li.Controller.HelloSpringMVC" id="/hello"/>
</beans>

java类的实现

package com.li.Controller;

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class HelloSpringMVC implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws Exception {
        ModelAndView modelAndView=new ModelAndView();
        String resoult="HelloSpringMVC";
        modelAndView.addObject("msg",resoult);
        modelAndView.setViewName("test");
        return modelAndView;
    }
}

1.4、开发中的相关文件的配置

web.xml文件的内容

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <servlet>
        <servlet-name>SpriDispatcherServletng</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springmvc-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <!--
        注:/与/*的区别
        1、/不会扫面项目中的jsp的文件,但是/*会扫面项目中的jsp'的文件,因此我们一般事采用/而不是采用/*
        -->
        <servlet-name>SpriDispatcherServletng</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

</web-app>

springmvc-servlet.xml的文件内容

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

<!--    扫面COntroller下的所有的包-->
    <context:component-scan base-package="com.li.Controller" />
    
    <!--静态资源全部过滤-->
    <mvc:default-servlet-handler/>
    <!--开启springmvc的注解支持-->
    <mvc:annotation-driven/>


<!--    配置视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!--        配置文件的前后缀-->
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <bean class="com.li.Controller.HelloSpringMVC" id="/hello"/>
</beans>

1.5、Controller

控制器Controller

  • 控制器复杂提供访问应用程序的行为,通常通过接口定义或注解定义两种方法实现
  • 控制器负责解析用户的请求并将其转化为一个模型
  • 在SpringMVC中一个控制器可以包含多个方法
  • 子啊SpringMVC中,对于COntroller的配置方式有多种

常见的实现方式

  • 通过调用COntroller接口(当时先了Controller接口的类,则其具有了控制器的功能,会接受请求并返回一个ModelAndView)
  • 注解的方式@Controller(建议使用

1.6、RestFul风格

概念:RestFul就是一个资源定位及资源操作的风格,不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更加的简介,更有层次,更易于实现缓存等机制。

功能:

  • 资源:互联网所有的事务都可以被抽象资源
  • 资源操作:使用POST、DELETE、PUT、GET,使用不同的方法对资源进行操作
  • 分别对应添加、删除、修改、查询。

优点:安全、简洁、高效

常见错误:404页面跳转失败、405不支持相关的写法、500内部代码错误

1.7、数据处理

处理提交数据

1、注:提交的域名和处理方法的参数名一致

image-20211116193432289

2、注:提交的域名和处理方法的参数名称不一致通过@RequestParm(“xx”)进行重命名

image-20211116193637100

3、前端提交一个对象采用对象的封装

Model、ModelMap、ModelAndView之间的对比

  • Model:只有寥寥的几个方法,只适合用于存储数据,简化了新手对于Model对象的操作与理解
  • ModelMap:继承了LinkeMap,除了实现自身的一些方法,同样继承LinkeMap的方法和特性
  • ModelAndView:可以在存储数据的同时,可以进行设置返回的逻辑视图,进行控制展示层的跳转。

1.8、乱码问题的解决

参考网站:https://www.cnblogs.com/melodyjerry/p/13562572.html

第一种(自己创建过滤器)

package com.li.util;

import javax.servlet.*;
import java.io.IOException;

public class filter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");
    }

    @Override
    public void destroy() {

    }
}

第二种(在web.xml文件中引进SpringMVC中自带的过滤器)

<filter>
        <description>字符集过滤器</description>  
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>  
            <param-name>forceEncoding</param-name>  
            <param-value>true</param-value>  
        </init-param> 
    </filter>

    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

第三种(修改tomcat中的配置,在config文件夹下的server.xml文件中)

<Connector URIEncoding="utf-8" port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

image-20211116205452825

第四种解决方法(自定义过滤器)

package com.kuang.filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;

/**
 * 解决get和post请求 全部乱码的过滤器
 */
public class GenericEncodingFilter implements Filter {

    @Override
    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        //处理response的字符编码
        HttpServletResponse myResponse=(HttpServletResponse) response;
        myResponse.setContentType("text/html;charset=UTF-8");

        // 转型为与协议相关对象
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        // 对request包装增强
        HttpServletRequest myrequest = new MyRequest(httpServletRequest);
        chain.doFilter(myrequest, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

}

//自定义request对象,HttpServletRequest的包装类
class MyRequest extends HttpServletRequestWrapper {

    private HttpServletRequest request;
    //是否编码的标记
    private boolean hasEncode;
    //定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰
    public MyRequest(HttpServletRequest request) {
        super(request);// super必须写
        this.request = request;
    }

    // 对需要增强方法 进行覆盖
    @Override
    public Map getParameterMap() {
        // 先获得请求方式
        String method = request.getMethod();
        if (method.equalsIgnoreCase("post")) {
            // post请求
            try {
                // 处理post乱码
                request.setCharacterEncoding("utf-8");
                return request.getParameterMap();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
        } else if (method.equalsIgnoreCase("get")) {
            // get请求
            Map<String, String[]> parameterMap = request.getParameterMap();
            if (!hasEncode) { // 确保get手动编码逻辑只运行一次
                for (String parameterName : parameterMap.keySet()) {
                    String[] values = parameterMap.get(parameterName);
                    if (values != null) {
                        for (int i = 0; i < values.length; i++) {
                            try {
                                // 处理get乱码
                                values[i] = new String(values[i]
                                        .getBytes("ISO-8859-1"), "utf-8");
                            } catch (UnsupportedEncodingException e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
                hasEncode = true;
            }
            return parameterMap;
        }
        return super.getParameterMap();
    }

    //取一个值
    @Override
    public String getParameter(String name) {
        Map<String, String[]> parameterMap = getParameterMap();
        String[] values = parameterMap.get(name);
        if (values == null) {
            return null;
        }
        return values[0]; // 取回参数的第一个值
    }

    //取所有值
    @Override
    public String[] getParameterValues(String name) {
        Map<String, String[]> parameterMap = getParameterMap();
        String[] values = parameterMap.get(name);
        return values;
    }
}

2、什么是json

  • 是一种轻量级的数据的交换格式,目前使用特别的广泛
  • 采用完全独立与编程语言的文本格式来存储和表示数据
  • 简介和清晰的层次结构使得JSON成为理想的数交换语言
  • 易与人的阅读和编写,同时也易于机器解析和生成,并有效的提升网络传输效率

JSON键值对是用来保存javaScript对象的一种方式,和JavaScript对象的写法也大同小异,键值对组合中的键名写在前面,并用双引号""进行包裹,使用冒号进行分割,紧接着便是值

例:

{“name”:“lisi”}、{“age”:“3”}、{“sex”,“男”}

JSON 和 JavaScript 对象互转

  • 要实现从JSON字符串转换为JavaScript 对象,使用 JSON.parse() 方法:

    var obj = JSON.parse('{"a": "Hello", "b": "World"}'); 
    
  • 要实现从JavaScript 对象转换为JSON字符串,使用 JSON.stringify() 方法:

    var json = JSON.stringify({a: 'Hello', b: 'World'});
    

2.1、json的使用

常用有三种json解析jackson、fastjson、gson。

jackson转化json需要的maven依赖

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-core -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>2.9.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>2.9.3</version>
        </dependency>

fastjson转化json需要的maven依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.47</version>
</dependency

gson转化json需要的maven依赖

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.2</version>
</dependency>

2.2、解决json的乱码问题

第一中方式 在@RequestMapping(value = “/t1”, produces=“text/html; charset=utf-8”)

@Controller
//@RestController  采用@RestController与@ResponseBody 都是直接跳过视图层,将数据之恶传送到前端
public class UserJson {
//   produces="text/html; charset=utf-8"解决json的乱码问题
    @RequestMapping(value = "/t1", produces="text/html; charset=utf-8")
    @ResponseBody  //当使用@ResponseBody方法会直接跳过视图层,之后将数据直接放回给页面
    public String userJson( HttpServletResponse response) throws JsonProcessingException {
        response.setCharacterEncoding("utf-8");
        User user = new User("安帅", "女", "23");
        ObjectMapper map=new ObjectMapper();
//        将对象转化为json字符串
        String s = map.writeValueAsString(user);
        System.out.println(user.toString());
        System.out.println("========================="+s);
        return s;
    }

第二中方式(在zpringMVc-servlet.xml中配置文件)

 <mvc:annotation-driven>
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8"/>
            </bean>
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                        <property name="failOnEmptyBeans" value="false"/>
                    </bean>
                </property>
            </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

3、整合SSM

所需要的maven依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>SpringMVC</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>SSM-SpringMVC</artifactId>

    <properties>
        <maven.compiler.source>9</maven.compiler.source>
        <maven.compiler.target>9</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
            <scope>test</scope>
        </dependency>
<!--        实现lombok第三方插件-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.10</version>
        </dependency>

<!--        连接数据库-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.27</version>
        </dependency>
<!--        采用c3p0数据连接池-->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.5</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2.1-b03</version>
        </dependency>
        <dependency>
            <groupId>jstl</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>

        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.6</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.12</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.13</version>
        </dependency>
    </dependencies>



    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

</project>

所创建的xml文件

  • springMVC所需要的配置文件

    • web.xml文件

      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
               version="4.0">
      
          <welcome-file-list>
              <welcome-file>index.jsp</welcome-file>
          </welcome-file-list>
          <servlet>
              <servlet-name>DispatcherServletng</servlet-name>
              <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
              <init-param>
                  <param-name>contextConfigLocation</param-name>
                  <param-value>classpath:applicationContext.xml</param-value>
              </init-param>
              <load-on-startup>1</load-on-startup>
          </servlet>
          <servlet-mapping>
              <!--
              注:/与/*的区别
              1、/不会扫面项目中的jsp的文件,但是/*会扫面项目中的jsp'的文件,因此我们一般事采用/而不是采用/*
              -->
              <servlet-name>DispatcherServletng</servlet-name>
              <url-pattern>/</url-pattern>
          </servlet-mapping>
      
      
      
          <filter>
              <description>字符集过滤器</description>
              <filter-name>encodingFilter</filter-name>
              <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
              <init-param>
                  <param-name>encoding</param-name>
                  <param-value>UTF-8</param-value>
              </init-param>
              <init-param>
                  <param-name>forceEncoding</param-name>
                  <param-value>true</param-value>
              </init-param>
          </filter>
      
          <filter-mapping>
              <filter-name>encodingFilter</filter-name>
              <url-pattern>/*</url-pattern>
          </filter-mapping>
      </web-app>
      
    • springMVC-servlet

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:context="http://www.springframework.org/schema/context"
             xmlns:mvc="http://www.springframework.org/schema/mvc"
             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/mvc
              http://www.springframework.org/schema/mvc/spring-mvc.xsd">
      
      
          <!--    扫面COntroller下的所有的包-->
          <context:component-scan base-package="com.li.inspur.Controller" />
          <!--静态资源全部过滤-->
          <mvc:default-servlet-handler/>
          <!--开启springmvc的注解支持-->
          <mvc:annotation-driven/>
      
          <!--    配置视图解析器-->
          <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
              <!--        配置文件的前后缀-->
              <property name="prefix" value="/WEB-INF/jsp/"/>
              <property name="suffix" value=".jsp"/>
          </bean>
      
      </beans>
      
  • mybatis需要的配置文件

    • mybatis-config.xml

      <?xml version="1.0" encoding="UTF-8" ?>
      <!DOCTYPE configuration
              PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
              "http://mybatis.org/dtd/mybatis-3-config.dtd">
      <configuration>
          <typeAliases>
      <!--        进行包的扫面注册进行设置别名,一般是类名的小写-->
              <package name="com.li.inspur.pojo"/>
          </typeAliases>
          <mappers>
      <!--        进行包的扫描注册-->
              <package name="com.li.inspur.mapper"/>
          </mappers>
      </configuration>
      
      
    • db.properties

      jdbc.driver=com.mysql.cj.jdbc.Driver
      jdbc.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false
      jdbc.username=root
      jdbc.password=
      
  • spring中所需要的配置文件

    • mybatis-dao.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:context="http://www.springframework.org/schema/context"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
              https://www.springframework.org/schema/beans/spring-beans.xsd
              http://www.springframework.org/schema/context
              https://www.springframework.org/schema/context/spring-context.xsd">
      
          <!--    导入资源文件-->
          <context:property-placeholder location="classpath:db.properties"/>
          <!--    配置资源池
                  dbcp:半自动化操作,不能自动连接
                  c3p0:自动化操作(自动化的加载配置文件,并且可以自动设置到对象中)
          -->
          <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
              <property name="driverClass" value="${jdbc.driver}"/>
              <property name="jdbcUrl" value="${jdbc.url}"/>
              <property name="user" value="${jdbc.username}"/>
              <property name="password" value="${jdbc.password}"/>
          </bean>
      
          <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
              <property name="dataSource" ref="dataSource" />
              <!--        绑定mybatis文件-->
              <property name="configLocation" value="classpath:mybatis-config.xml"/>
          </bean>
      
      <!--    配置dao的扫描包,动态实现了Dao接口可以注入到Spring容器中-->
          <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
              <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
      <!--        扫面dao包-->
              <property name="basePackage" value="com.li.inspur.mapper"/>
          </bean>
      
      </beans>
      
      
    • spring-service

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:context="http://www.springframework.org/schema/context"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
              https://www.springframework.org/schema/beans/spring-beans.xsd
              http://www.springframework.org/schema/context
              https://www.springframework.org/schema/context/spring-context.xsd">
          <import resource="classpath:spring-dao.xml"/>
          <!--    配置注解-->
          <context:annotation-config/>
      <!--    扫描service中的所有门类-->
          <context:component-scan base-package="com.li.inspur.service" />
      
      <!--  2  将我们所有的业务类全部的注入到spring中,可以通过配置或者是注解的实现-->
      
      
      <!--    3 配置事务-->
          <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
              <property name="dataSource" ref="dataSource"/>
          </bean>
      
      
      <!--    事务的支持-->
      
      </beans>
      
      
    • applicationContext.xml

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:context="http://www.springframework.org/schema/context"
             xsi:schemaLocation="http://www.springframework.org/schema/beans
              https://www.springframework.org/schema/beans/spring-beans.xsd
              http://www.springframework.org/schema/context
              https://www.springframework.org/schema/context/spring-context.xsd">
      <!--    配置注解-->
          <context:annotation-config/>
          <import resource="classpath:spring-dao.xml"/>
          <import resource="classpath:springmvc-servlet.xml"/>
          <import resource="spring-service.xml"/>
      </beans>
      
      
      
  • 注:在ssm整合之中,applicationContext.xml文件时用来整合的,所以在web.xml在引进xml文件的时候,引进的时applicationContext.xml文件

  • 在整合ssm框架的时候注意mybatis-spring引进的maven依赖的版本的对应关系

  • 在使用mapper.xml文件的时候,不要忘记其文件的工作空间,以及各个文件之间的扫描

    image-20211120124641093

image-20211120131634986

4、拦截器

4.1、定义

SpringMVC中的处理器拦截器类似于Servlet开发中的过滤器filter,用于对处理器进行预处理和后处理,开发者可以自己定义一些拦截器来实现一些特定的功能

过滤器与拦截器的区别

  • 拦截器时AOP的思想

  • 过滤器,servlet规范中的一部分,任何Javaweb项目都可以使用,在url-pattern中配置了/*之后,便可以对所有的资源进行拦截

  • 注:拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架才可以使用

  • 拦截器只会拦截访问的控制器方法,如果访问的是jsp/html/css/image/js是不会进行拦截的

自定义拦截器

实现HandlerInterceptor接口

自定义拦截器

package com.li.inspur.until;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//设置自定义拦截器
public class interceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        表示在执行前进行拦截,当返回值是true时,表示通过所有的请求
        System.out.println("执行之前");
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//        表示在执行完成之后进行拦截
        System.out.println("执行之后");

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//        在执行之后做处理工作
        System.out.println("表示在执行之后做处理工作");
    }
}

在SpringMVC配置拦截器


<mvc:interceptors>
    <mvc:interceptor>
        <!--/** 包括路径及其子路径-->
        <!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截-->
        <!--/admin/** 拦截的是/admin/下的所有-->
        <mvc:mapping path="/**"/>
        <bean class="com.li.inspur.until.interceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

5、SpringMVC中的文件的上传和下载

所需要的maven依赖

 <dependency>
          <groupId>commons-fileupload</groupId>
          <artifactId>commons-fileupload</artifactId>
          <version>1.4</version>
</dependency>
<!--servlet-api导入高版本的-->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
</dependency>

springMVC.xml中的文件的配置

<bean id="multipartResolver"  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 请求的编码格式,必须和jSP的pageEncoding属性一致,以便正确读取表单的内容,默认为ISO-8859-1 -->
    <property name="defaultEncoding" value="utf-8"/>
    <!-- 上传文件大小上限,单位为字节(10485760=10M) -->
    <property name="maxUploadSize" value="10485760"/>
    <property name="maxInMemorySize" value="40960"/>
</bean>
package com.li.inspur.Controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;

@Controller
@RequestMapping(value = "/user")
public class toLoad {
    //@RequestParam("file") 将name=file控件得到的文件封装成CommonsMultipartFile 对象
    //批量上传CommonsMultipartFile则为数组即可
    //文件的上传
    @RequestMapping(value = "/upload")
    public String fileUpload(@RequestParam("file") CommonsMultipartFile file , HttpServletRequest request) throws IOException {
        System.out.println("调用了这个方法");
        //获取文件名 : file.getOriginalFilename();
        String uploadFileName = file.getOriginalFilename();

        //如果文件名为空,直接回到首页!
        if ("".equals(uploadFileName)){
            return "redirect:/index.jsp";
        }
        System.out.println("上传文件名 : "+uploadFileName);

        //上传路径保存设置
        String path = request.getServletContext().getRealPath("/upload");
        //如果路径不存在,创建一个
        File realPath = new File(path);
        if (!realPath.exists()){
            realPath.mkdir();
        }
        System.out.println("上传文件保存地址:"+realPath);

        InputStream is = file.getInputStream(); //文件输入流
        OutputStream os = new FileOutputStream(new File(realPath,uploadFileName)); //文件输出流

        //读取写出
        int len=0;
        byte[] buffer = new byte[1024];
        while ((len=is.read(buffer))!=-1){
            os.write(buffer,0,len);
            os.flush();
        }
        os.close();
        is.close();
        return "redirect:/index.jsp";
    }

    
    
    //文件的的下载
    @RequestMapping(value="/download")
    public String downloads(HttpServletResponse response , HttpServletRequest request) throws Exception{
        System.out.println("调用了文件的下载的方法");
        //要下载的图片地址
        String  path = request.getServletContext().getRealPath("/upload");
        String  fileName = "timg.jpg";

        //1、设置response 响应头
        response.reset(); //设置页面不缓存,清空buffer
        response.setCharacterEncoding("UTF-8"); //字符编码
        response.setContentType("multipart/form-data"); //二进制传输数据
        //设置响应头
        response.setHeader("Content-Disposition",
                "attachment;fileName="+ URLEncoder.encode(fileName, "UTF-8"));

        File file = new File(path,fileName);
        //2、 读取文件--输入流
        InputStream input=new FileInputStream(file);
        //3、 写出文件--输出流
        OutputStream out = response.getOutputStream();

        byte[] buff =new byte[1024];
        int index=0;
        //4、执行 写出操作
        while((index= input.read(buff))!= -1){
            out.write(buff, 0, index);
            out.flush();
        }
        out.close();
        input.close();
        return null;
    }
}

nloads(HttpServletResponse response , HttpServletRequest request) throws Exception{
System.out.println(“调用了文件的下载的方法”);
//要下载的图片地址
String path = request.getServletContext().getRealPath("/upload");
String fileName = “timg.jpg”;

    //1、设置response 响应头
    response.reset(); //设置页面不缓存,清空buffer
    response.setCharacterEncoding("UTF-8"); //字符编码
    response.setContentType("multipart/form-data"); //二进制传输数据
    //设置响应头
    response.setHeader("Content-Disposition",
            "attachment;fileName="+ URLEncoder.encode(fileName, "UTF-8"));

    File file = new File(path,fileName);
    //2、 读取文件--输入流
    InputStream input=new FileInputStream(file);
    //3、 写出文件--输出流
    OutputStream out = response.getOutputStream();

    byte[] buff =new byte[1024];
    int index=0;
    //4、执行 写出操作
    while((index= input.read(buff))!= -1){
        out.write(buff, 0, index);
        out.flush();
    }
    out.close();
    input.close();
    return null;
}

}


















































Spring MVC 是 Spring 框架的一个模块,它是一种基于 MVC 设计模式的 Web 框架,用于开发具有灵活性和可扩展性的 Web 应用程序。Spring MVC 是目前最流行的 Java Web 框架之一,它可以与其他 Spring 框架和第三方框架集成使用,可以满足各种 Web 应用程序的需求。 Spring MVC 框架中的核心组件包括: 1. DispatcherServlet:前端控制器,用于接收客户端请求并将请求分发给相应的控制器。 2. HandlerMapping:用于将请求映射到相应的处理器(Controller)。 3. Controller:用于处理客户端请求并返回相应的视图。 4. ViewResolver:用于将逻辑视图名称解析为实际视图对象。 5. ModelAndView:用于封装处理器的返回值(数据模型和视图名称)。 6. Interceptor:用于在请求处理前或处理后执行一些公共的逻辑。 Spring MVC 框架的工作流程: 1. 客户端发送请求到 DispatcherServlet。 2. DispatcherServlet 根据请求 URL 调用 HandlerMapping 查找相应的处理器(Controller)。 3. Controller 处理请求并返回一个 ModelAndView 对象。 4. DispatcherServlet 调用 ViewResolver 根据逻辑视图名称查找相应的视图对象。 5. View 对象渲染模型数据,并将渲染后的结果返回给客户端。 6. 客户端接收响应并显示。 总的来说,Spring MVC 框架通过提供一种基于 MVC 设计模式的 Web 框架来简化 Web 应用程序的开发,提高应用程序的灵活性和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值