分享好友 站长动态首页 网站导航

Spring MVC详解(学习总结)

2022-07-28 08:10 · 头闻号编程技术

文章是看楠哥的视频做的总结,自己还查阅了一些资料,文章也加了自己的总结,这篇博客可以帮助大家入门,还有一些知识大家如果用到的话可以到时候再去学习一下,我写这篇主要是为了方便后面复习。
在这里插入图片描述

一、Sprig MVC简介

1.1介绍

Spring MVC是Spring framework提供的Web组件,全称是Spring Web MVC,是目前主流的实现MVC设计模式的框架,提供前端路由映射、视图解析等功能

Java Web开发者必须要掌握的技术框架

1.2MVC是什么

MVC是一种软件架构思想,把软件按照模型,视图,控制器来划分
Model:模型层,指工程中的JavaBean,用来处理数据
JavaBean分成两类

在这里插入图片描述

二、Spring MVC实现原理

2.1核心组件

2.2工作流程

  1. 客户端请求被DispatcherServlet接收
  2. 根据HandlerMapping映射到Handler
  3. 生成Handler和HandlerInterceptor
  4. Handler和HandlerInterceptor以HandlerExecutionChain的形式一并返回给DispatcherServlet
  5. DispatcherServlet通过HandlerAdapter调用Handler的方法完成业务逻辑处理
  6. 返回一个ModelAndView对象给DispatcherServlet
  7. DispatcherServlet把获取的ModelAndView对象传给ViewResolver视图解析器,把逻辑视图解析成物理视图
  8. ViewResolver返回一个View进行视图渲染(把模型填充到视图中)
  9. DispatcherServlet把渲染后的视图响应给客户端
    在这里插入图片描述

三、第一个Spring MVC

  1. 创建maven改成工程,pom.xml加入Spring MVC的依赖在这里插入图片描述在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    pom.xml
<?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">  <modelVersion>4.0.0</modelVersion>  <groupId>org.example</groupId>  <artifactId>SpringMVC</artifactId>  <version>1.0-SNAPSHOT</version>  <packaging>war</packaging>  <name>SpringMVC Maven Webapp</name>  <!-- FIXME change it to the project's website -->  <url>http://www.example.com</url>  <properties>    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>    <maven.compiler.source>1.8</maven.compiler.source>    <maven.compiler.target>1.8</maven.compiler.target>  </properties>  <dependencies>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>4.11</version>      <scope>test</scope>    </dependency>    <dependency>      <groupId>org.springframework</groupId>      <artifactId>spring-webmvc</artifactId>      <version>5.3.19</version>    </dependency>  </dependencies></project>
 <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-webmvc</artifactId>            <version>5.3.19</version>        </dependency>
  1. 在web.xml中配置Spring MVC的DispatcherServlet
    首先在项目中创建java和resources的目录
    在这里插入图片描述
    在resources目录中添加springmvc.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"></beans>

然后在web.xml 配置Spring MVC的DispatcherServlet

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app>  <display-name>Archetype Created Web Application</display-name> <!-- 配置核心控制器 -->	<servlet>		<servlet-name>dispatcherServlet</servlet-name>		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>		<!-- springmvc配置文件加载路径		     1)默认情况下,读取WEB-INF下面的文件		     2)可以改为加载类路径下(resources目录,加上classpath:		 -->		<init-param>			<param-name>contextConfigLocation</param-name>			<param-value>classpath:springmvc.xml</param-value>		</init-param>		<!--		   DispatcherServlet对象创建时间问题		      1)默认情况下,第一次访问该Servlet的创建对象,意味着在这个时间才去加载springMVC.xml		      2)可以改变为在项目启动时候就创建该Servlet,提高用户访问体验。		          <load-on-startup>1</load-on-startup>		                数值越大,对象创建优先级越低(数值越低,越先创建)		-->		<load-on-startup>1</load-on-startup>	</servlet>	<servlet-mapping>		<servlet-name>dispatcherServlet</servlet-name>		 <!--/ 匹配所有的请求(不包括.jsp)-->   <!--    @RequestMapping("/index")    public String index(){        System.out.println("接收到了请求");        //返回逻辑视图 逻辑视图相当于视图的别名 通过这个找到物理视图,也就是真正的视图        //这里返回的只是页面的名称,不是完整的页面访问路径        return "index";    }}

@Controller注解是为了让Spring IOC容器初始化时自动扫描到该Controller类@RequestMapping是为了映射请求路径,这里因为类与方法上都有映射所以访问时应该是/;方法返回的结果是视图的名称index,该名称不是完整页面路径,最终会经过视图解析器解析为完整页面路径并跳转。
配置Tomcat
在这里插入图片描述
在这里插入图片描述
5. 测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
流程梳理

  1. DispatcherServlet接收到URL请求index,结合@RequestMapping(“/index”)注解把该请求交给index业务方法进行处理
  2. 执行index业务方法,控制台打印日志,并且返回"index"字符串(逻辑视图).
  3. 结合springmvc.xml中的视图解析器配置,找到目标资源:/index.jsp,即根目录下的index.jsp文件,把该JSP资源返回给客户端完成响应。

Spring MVC搭建成功

在这里插入图片描述

四、常用注解

@RequestMapping

Spring MVC通过@RequestMapping注解把URL请求和业务方法进行映射,在控制器的类定义处以及方法定义处都可以添加@RequestMapping,在类定义处添加相当于多了一层访问路径
在这里插入图片描述
@RequestMapping常用参数

   @RequestMapping(value = "/index",method = RequestMethod.POST)    public String index(){        System.out.println("接收到了请求");        //返回逻辑视图 逻辑视图相当于视图的别名 通过这个找到物理视图,也就是真正的视图        //注意:这里返回的只是页面名称,不是完整的页面访问路径        return "index";    }

上述代码表示只有POST请求可以访问该方法,如果使用其他请求访问的话,直接抛出异常,比如GET请求
在这里插入图片描述

五、参数绑定

在这里插入图片描述

5.1URL风格参数绑定

params是对URL请求参数进行限制,不满足条件的URL无法访问该方法,需要在业务方法中获取URL的参数值。

  1. 在业务方法定义时声明参数列表
  2. 给参数列表添加@RequestParam注解进行绑定

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
Spring MVC可以自动完成数据类型转换,该工作是由HandlerAdapter来完成的

5.2RESTful风格的URL参数获取

 @RequestMapping("/restful/{id}/{name}")    public String restful(@PathVariable("id") Integer num, @PathVariable("name") String name){        System.out.println(num+"-"+name);        return "index";    }

在这里插入图片描述

5.3映射cookie

  @RequestMapping("/cookie")    public String getcookie(@cookievalue("JSESSIONID") String sessionId){        System.out.println(sessionId);        return "index";    }

在这里插入图片描述

5.4使用POJO绑定参数

Spring MVC会根据请求参数名和POJO属性名进行匹配,自动为该对象填充属性值,并且支持属性级联
首先创建实体类
在这里插入图片描述
为了方便测试,写一个addUser.jsp页面

<%--  Created by IntelliJ IDEA.  User: 17614  Date: 2022-07-04  Time: 21:01  To change this template use File | Settings | File Templates.--%><%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title>Title</title></head><body><form action="/hello/add" method="post">    <table>        <tr>            <td>编号:</td>            <td>                <input type="text" name="id">            </td>        </tr>        <tr>            <td>姓名:</td>            <td>                <input type="text" name="name">            </td>        </tr>        <tr>            <td>                <input type="submit" value="提交">            </td>        </tr>    </table></form></body></html>

然后在Handler中,编写相关方法
在这里插入图片描述

启动Tomcat服务器
在这里插入图片描述

结果发现出现乱码问题
在这里插入图片描述
为了解决这个问题,我们只需要在web.xml配置文件中配置过滤器就可以了

  <filter>    <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>  </filter>  <filter-mapping>    <filter-name>encodingFilter</filter-name>    <url-pattern>@Controller@RequestMapping("/course")public class CourseController {    @Autowired    private CourseRepository courseRepository;    @GetMapping("/findAll")    public ModelAndView findAll() {        ModelAndView modelAndView = new ModelAndView();        modelAndView.setViewName("courseList");        modelAndView.addObject("list", courseRepository.findAll());        return modelAndView;    }    @DeleteMapping("/deleteById/{id}")    public String deleteById(@PathVariable("id") Integer id){        courseRepository.deleteById(id);        return "redirect:/course/findAll";    }    @PostMapping("/save")    public String save(Course course) {        courseRepository.saveOrUpdate(course);                return "redirect:/course/findAll";    }    @GetMapping("/findById/{id}")    public ModelAndView findById(@PathVariable("id") Integer id) {        ModelAndView modelAndView = new ModelAndView();        modelAndView.setViewName("edit");        modelAndView.addObject("courser", courseRepository.findById(id));        return modelAndView;    }    @PutMapping("/update")    public String update(Course course){        courseRepository.saveOrUpdate(course);        return "redirect:/course/findAll";    }}

JSP
courseList.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@page isELIgnored="false" %><html><head>    <title>Title</title></head><body>    <table>        <tr>            <td>编号:</td>            <td>名称:</td>            <td>价格:</td>            <td>操作:</td>        </tr>            <c:forEach items="${list}" var="course">                <tr>                    <td>${course.id}</td>                    <td>${course.name}</td>                    <td>${course.price}</td>                    <td>                        <form action="/course/deleteById/${course.id}" method="post">                            <input type="hidden" name="_method" value="DELETE">                            <input type="submit" value="删除">                        </form>                        <a href="/course/findById/${course.id}">修改</a>                    </td>                </tr>            </c:forEach>    </table></body></html>

save.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title>Title</title></head><body><form action="/course/save" method="post">    <table>        <tr>            <td>课程编号:</td>            <td>                <input type="text" name="id">            </td>        </tr>        <tr>            <td>课程名称:</td>            <td><input type="text" name="name"></td>        </tr>        <tr>            <td>课程价格:</td>            <td> <input type="text" name="price"></td>        </tr>        <tr>            <td>                <input type="submit" value="提交">            </td>            <td>                <input type="reset" value="重置">            </td>        </tr>    </table></form></body></html>

edit.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@page isELIgnored="false" %><html><head>    <title>Title</title></head><body>    <form action="/course/update" method="post">        <input type="hidden" name="_method" value="PUT"/>        <table>            <tr>                <td>课程编号:</td>                <td>                    <input type="text" name="id" value="${courser.id}">                </td>            </tr>            <tr>                <td>课程名称:</td>                <td>                    <input type="text" name="name" value="${courser.name}">                </td>            </tr>            <tr>                <td>课程价格:</td>                <td>                    <input type="text" name="price" value="${courser.price}">                </td>            </tr>            <tr>                <td>                    <input type="submit" value="提交">                </td>            </tr>        </table>    </form></body></html>

在这里插入图片描述
点击删除
在这里插入图片描述
点击修改
在这里插入图片描述
在这里插入图片描述
点提交
在这里插入图片描述

十、文件的上传下载

10.1文件上传

10.1.1单文件上传

1.底层使用的是Apache fileupload 组件完成上传功能,Spring MVC只是对其进行了封装,简化开发,pom.xml

 <dependency>      <groupId>commons-io</groupId>      <artifactId>commons-io</artifactId>      <version>2.8.0</version>    </dependency>    <dependency>      <groupId>commons-fileupload</groupId>      <artifactId>commons-fileupload</artifactId>      <version>1.4</version>    </dependency>

springmvc.xml
为了把二进制数据解析成对象

<!--    文件的上传-->    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"></bean>

2.JSP页面

<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@page isELIgnored="false" %><html><head>    <title>Title</title></head><body>    <form action="/file/upload" method="post" enctype="multipart/form-data">        <input type="file" name="img"/>        <input type="submit" value="提交">        <!-- 加上/代表从根目录也就是8080开始找 -->    </form>    <img src="${src}"/></body></html>
@Component@RequestMapping("/file")public class FileHandler {        @PostMapping("/upload")    public String upload(@RequestParam("img") MultipartFile img, HttpServletRequest request){        if (img.getSize()>0){            String path = request.getSession().getServletContext().getRealPath("file");            String filename = img.getOriginalFilename();            File descFile=new File(path, filename);            try {                img.transferTo(descFile);                request.setAttribute("src", "/file/"+filename);            } catch (IOException e) {                e.printStackTrace();            }        }        return "upload";    }}

在这里插入图片描述
然后选择文件
在这里插入图片描述
提交
在这里插入图片描述

10.1.2多文件上传

<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@page isELIgnored="false" %><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><html><head>    <title>多文件上传</title></head><body>    <form action="/file/uploads" method="post" enctype="multipart/form-data">        file1:<input type="file" name="imgs"/><br>        file2:<input type="file" name="imgs"/><br>        file3:<input type="file" name="imgs"/><br>        <input type="submit" value="提交"/>    </form><c:forEach items="${pathList}" var="path">    <img src="${path}" width="300px"></c:forEach>
  @PostMapping("/uploads")    public String uploads(@RequestParam("imgs") MultipartFile[] imgs,HttpServletRequest request){        List<String> pathList=new ArrayList<>();        for (MultipartFile img:imgs){            if (img.getSize()>0){                String path = request.getSession().getServletContext().getRealPath("file");                String filename = img.getOriginalFilename();                File descFile=new File(path, filename);                try {                    img.transferTo(descFile);                    pathList.add("/file/"+filename);                } catch (IOException e) {                    e.printStackTrace();                }            }        }        request.setAttribute("pathList", pathList);        return "uploads";    }

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

10.2文件下载

JSP页面通过超链接点击进行下载

<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head>    <title>文件下载</title></head><body>    <a href="/file/download?fileName=皮卡丘.jpg">皮卡丘.jpg</a>    <a href="/file/download?fileName=柯南.png">柯南.png</a>    <a href="/file/download?fileName=springmvc.png">springmvc.png</a></body></html>

Handler

      @GetMapping("/download")    public void download(String fileName,                         HttpServletRequest request,                         HttpServletResponse response) {        if (fileName!=null){            String path = request.getSession().getServletContext().getRealPath("file");            File file=new File(path,fileName);            OutputStream out=null;            if (file.exists()){                //设置下载文件                response.setContentType("applicationContext/force-download");                //设置文件名                response.setHeader("Context-Disposition", "attachment;filename="+fileName);                try {                    out=response.getOutputStream();                    out.write(FileUtils.readFileToByteArray(file));                    out.flush();                } catch (IOException e) {                    e.printStackTrace();                }finally {                    if (out!=null){                        try {                            out.close();                        } catch (IOException e) {                            e.printStackTrace();                        }                    }                }            }        }    }

在这里插入图片描述

十一、拦截器

11.1过滤器、监听器、拦截器的对比

反对 0
打赏 0
更多相关文章

评论

0

收藏

点赞