SpringMVC 实战指南:文件上传

第一章:常用的注解:

  1. @RequestParam 注解:
    1. 作用:把请求中的指定名称的参数传递给控制器中的形参赋值
    2. 属性:
      1. value:请求参数中的名称
      2. required:请求参数中是否必须提供此参数,默认值是 true(必须提供)
    3. 代码:
      @Controller
      @RequestMapping("/dept")
      public class DeptController {/*** @RequestParam 注解:* required = false 默认值是 true,必须要传请求参数,不传就会报错* defaultValue = "abc" 如果没有传请求参数,默认使用该值* 当有默认值 defaultValue 属性时,required 属性设置为 true 不传值也是可以的*/@RequestMapping("/save1")public String save1(@RequestParam(value = "username",required = false,defaultValue = "abc") String name){System.out.println("姓名:" + name);return "suc";}
      }
  2. @RequestBody 注解:
    1. 作用:用于获取请求体的内容(注意:get方法不可以)
    2. 属性:
      1. required:是否必须有请求体,默认值是true
      2. 代码:
        @RequestMapping("/save2")
        public String save2(@RequestBody String body){System.out.println("请求内容:" + body);return "suc";
        }
  3. @PathVaribale 注解:
    1. 作用:拥有绑定 url 中的占位符。例如: url 中有 /delete/{id}。{id} 就是占位符
    2. 属性:
      1. value:指定 url 中的占位符名字
    3. Resutful 风格的 URL:
      1. 请求路径一样,可以根据不同的请求方式去执行后台的不同方法
      2. restful 风格的 URL 优点
        1. 结构清晰
        2. 符合标准
        3. 易于理解
        4. 扩展方便
    4. 代码:
      @RequestMapping("/findById/{id}")
      public String findById(@PathVariable(value = "id") Integer id){System.out.println("根据id查询:" + id);return "suc";
      }
    5. 修改前端控制器的配置文件:
      <!--配置前端控制器-->
      <servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--加载springmvc.xml配置文件,配置的是Spring配置--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!--配置启动加载--><load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/</url-pattern>
      </servlet-mapping>
  4. @RequestHeader 注解:
    1. 作用:获取指定请求头的值
    2. 属性:
      1. value:请求头的名称
    3. 代码:
      /*** RequestHeader 获取请求头的值* @param header* @return*/
      @RequestMapping("/save3")
      public String save3(@RequestHeader(value = "Accept") String header){System.out.println("Accept请求头的值:" + header);return "suc";
      }
  5. @CookieValue 注解:
    1. 作用:用于获取指定 cookit 的名称的值
    2. 属性:
      1. value:cookie 名称
    3. 代码:
      /*** CookieValue 获取cookie的值* @param cookie* @return*/
      @RequestMapping("/save4")
      public String save4(@CookieValue(value = "JSESSIONID") String cookie){System.out.println("值:" + cookie);return "suc";
      }

第二章:响应数据和结果视图

  1. 返回值分类
    1. 搭建环境,导入依赖:
      <!-- 版本锁定 -->
      <properties><spring.version>5.0.2.RELEASE</spring.version>
      </properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.0</version><scope>provided</scope></dependency>
      </dependencies>
    2. 配置前端控制器和过滤器:
      <web-app><!--配置解决中文乱码问题的过滤器--><filter><filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!--配置前端控制器--><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!--加载springmvc.xml配置文件,配置的是Spring配置--><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!--配置启动加载--><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping>
      </web-app>
    3. 编写 springmvc.xml 配置文件:
      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 配置spring 创建容器时要扫描的包 --><context:component-scan base-package="com.qcby.mybatis"></context:component-scan><!-- 配置视图解析器 --><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/pages/"/><property name="suffix" value=".jsp"/></bean><!-- 让映射器、适配器和处理器生效(默认不配置也是可以的)--><!-- <mvc:annotation-driven conversion-service="conversionService"/> --><mvc:annotation-driven />
      </beans>
  2. 返回值类型为 String 类型:
    1. Controller 方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址
      @Controller
      public class HelloController {@RequestMapping("/hello")public String sayHello(){System.out.println("入门方法已执行");return "suc";}}
  3. 返回类型为 void:
    1. 如果控制器的方法返回值编写成 void,执行程序报 404 的异常,原因是默认查找的 JSP 页面没有被找到
    2. 默认会跳转到 @RequestMapping(value = "/initUpdate"),initUpdate 页面
    3. 可以使用请求转发或者重定向跳转到指定的页面
      @Controller
      @RequestMapping("/hello")
      public class HelloController {@RequestMapping("/save1")public void save2(HttpServletRequest request, HttpServletResponse response) throws IOException {System.out.println("方法已被执行");//做出相应动作response.getWriter().println("hello");}}
  4. 返回值是 ModelAndView 对象:
    1. ModelAndView 对象是 Spring 提供的一个对象,可以用来调整具体的 JSP 视图
    2. 代码:
      @Controller
      @RequestMapping("/hello")
      public class HelloController {@RequestMapping("/save2")public ModelAndView save2(){System.out.println("方法被执行");//创建 mv 对象ModelAndView mv = new ModelAndView();//把一些数据存储到 mv 对象中mv.addObject("msg","用户名或者密码错误0");//设置逻辑视图的名称mv.setViewName("suc");return mv;}
      }
  5. SpringMVC 框架提供的转发和重定向:
    1. forward 请求转发:
      1. controller 方法返回 String 类型,想进行请求转发也可以编写成:
        @Controller
        @RequestMapping("/hello")
        public class HelloController {/*** 返回 String* 请求转发* @return*/@RequestMapping("/save3")public String save3(){System.out.println("方法被执行");return "forward:/WEB-INF/pages/suc.jsp";}
        }
    2. redirect 重定向:
      1. controller 方法返回 String 类型,想进行重定向也可以编写成:
        @Controller
        @RequestMapping("/hello")
        public class HelloController {@RequestMapping("/hello")public String sayHello(){System.out.println("入门方法已执行");return "suc";}/*** 返回 String* 重定向* @return*/@RequestMapping("/save4")public String save4(){System.out.println("方法被执行");return "redirect:hello";}}
  6. ResponseBody  响应 json 数据(重要):
    1. json 字符串和 JavaBean 对象相互转换的过程中,需要使用 jackson 的 jar 包
      <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version>
      </dependency>
      <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-core</artifactId><version>2.9.0</version>
      </dependency>
      <dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-annotations</artifactId><version>2.9.0</version>
      </dependency>
    2. DispatcherServlet 会拦截到所有的资源,导致一个问题就是静态资源(img、css、js)也会被拦截到,从而不能被使用。
      1. 解决:问题就是需要配置静态资源不进行拦截,在 springmvc.xml 配置文件添加如下配置
    3. 标签配置不过滤:
      1. location 元素表示 webapp 目录下的包下所有文件
      2. mappin 元素表示以 /static 开头的所有请求路径,如 /static/a 或 /static/b
        <!-- 设置静态资源不过滤 -->
        <mvc:resources mapping="/css/**" location="/css/" /><!-- 样式 -->
        <mvc:resources mapping="/images/**" location="/images/"/><!-- 图片-->
        <mvc:resources mapping="/js/**" location="/js/"/><!-- javascript -->
    4. js 代码编写:
      1. jquery 下载
        <%--Created by IntelliJ IDEA.User: L-J-XDate: 2025/1/14Time: 16:38To change this template use File | Settings | File Templates.
        --%>
        <%@ page contentType="text/html;charset=UTF-8" language="java" %>
        <html>
        <head><title>Controller 方法的返回值</title><%-- 引入 jq --%><script src="/js/jquery-2.1.4.min.js" type="text/javascript"/><script>        //页面加载$(function(){//单击事件$("#bin").click(function (){//发送 ajax 请求$.ajax({type:"post",url:"/user/save1",contentType:"application/json;charset=UTF-8",data:'{"username:"zhangsan","age":"20"}',datatype:"json",success:function (data){alert(data.username + " " + data.age);}});});});</script>
        </head>
        <body><h3>返回值是String</h3><a href="/user/save1">返回String</a><h3>返回值是void</h3><a href="/user/save2">返回void</a><h3>返回值是ModelAndView</h3><a href="/user/save3">返回ModelAndView</a><h3>返回值是String</h3><a href="/user/save4">返回String</a><h3>异步的数据交互</h3><input type="button" value="ajax交互" id="btn"></body>
        </html>
    5. 后台代码编写:
      import com.qcby.mybatis.pojo.User;
      import org.springframework.stereotype.Controller;
      import org.springframework.web.bind.annotation.*;
      import sun.net.util.IPAddressUtil;import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      import javax.servlet.http.HttpSession;@Controller
      @RequestMapping(("/user"))
      public class UserController {@RequestMapping("/save6")public User save6(@RequestBody User user){System.out.println(user);//模拟调用业务层代码user.setUsername("hello");user.setAge(100);//把 user 对象转换成 json 字符串再响应。使用 @ResposeBody 注解 response.getWriter().print()return user;}
      }
    6. 实体类代码:
      package com.qcby.mybatis.pojo;import org.springframework.format.annotation.DateTimeFormat;import java.io.Serializable;
      import java.util.Date;
      import java.util.List;public class User implements Serializable {private String username;private Integer age;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", age=" + age +'}';}
      }

第三章:文件上传

  1. 导入依赖:
    <dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3.1</version>
    </dependency><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.4</version>
    </dependency>
  2. 编写文件上传的 JSP 页面:
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head><title>文件上传</title>
    </head>
    <body><h3>文件上传</h3><form action="/fileupload" method="post" enctype="multipart/form-data">选择文件:<input type="file" name="upload"/><br/><input type="submit" value="上传"/></form>
    </body>
    </html>
  3. SpringMVC 传统方式文件上传:
    1. 配置文件解析器对象:
      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsd"><!-- 启动 Tomcat 服务器的时候,就会被加载 --><!-- 配置注解扫描 --><context:component-scan base-package="com.qcby.mybatis"/><!-- 配置视图解析器,进行页面的跳转 --><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- 需要跳转的页面 --><property name="prefix" value="/WEB-INF/pages/"/><!-- 跳转页面的后缀名 --><property name="suffix" value=".jsp"/></bean><!-- 配置文件上传的解析组件。id 的名称是不固定的,不能乱写 --><bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 设置文件上传的总大小 8M = 8 * 1024 * 1024 --><property name="maxUploadSize" value="8388608"/></bean><!-- 让映射器、适配器和处理器生效(默认不配置也是可以的)--><mvc:annotation-driven/>
      </beans>
    2. SpringMVC 框架提供了 MultiparFile 对象,该对象表示上传的文件,要求变量名称必须和表单 file 标签的 name 属性名称相同:
      @Controller
      @RequestMapping("/upload")
      public class IploadController {/*** 文件上传* MultipartFile upload 文件上传解析器对象解析 request 后,文件上传对象*/@RequestMapping("/fileupload")public String upload(MultipartFile upload, HttpServletRequest request) throws IOException {//文件存储位置String realPath = request.getSession().getServletContext().getRealPath("/uploads");//创建该文件夹File file = new File(realPath);//判断该文件夹是否存在if(!file.exists()){//创建文件夹file.mkdirs();}//获取到上传文件的名称String filename = upload.getOriginalFilename();//把文件的名称修改成唯一的值 sdfs-csdf-fwer-sdfwString uuid = UUID.randomUUID().toString().replace("-","").toUpperCase();//唯一的值filename = uuid + "_" + filename;System.out.println("文件名称:" + filename);//上传文件upload.transferTo(new File(file,filename));return "suc";}
      }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/67632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++实现矩阵Matrix类 实现基本运算

本系列文章致力于实现“手搓有限元&#xff0c;干翻Ansys的目标”&#xff0c;基本框架为前端显示使用QT实现交互&#xff0c;后端计算采用Visual Studio C。 目录 Matrix类 1、public function 1.1、构造函数与析构函数 1.2、获取矩阵数值 1.3、设置矩阵 1.4、矩阵转置…

HTML<form>标签

例子 具有两个输入字段和一个提交按钮的HTML表单&#xff1a; <form action"/action_page.php" method"get"> <label for"fname">First name:</label> <input type"text" id"fname" name"f…

《贪心算法:原理剖析与典型例题精解》

必刷的贪心算法典型例题&#xff01; 算法竞赛&#xff08;蓝桥杯&#xff09;贪心算法1——数塔问题-CSDN博客 算法竞赛&#xff08;蓝桥杯&#xff09;贪心算法2——需要安排几位师傅加工零件-CSDN博客 算法&#xff08;蓝桥杯&#xff09;贪心算法3——二维数组排序与贪心算…

【2024 年度总结】从小白慢慢成长

【2024 年度总结】从小白慢慢成长 1. 加入 CSDN 的契机2. 学习过程2.1 万事开头难2.2 下定决心开始学习2.3 融入技术圈2.4 完成万粉的目标 3. 经验分享3.1 工具的选择3.2 如何提升文章质量3.3 学会善用 AI 工具 4. 保持初心&#xff0c;继续前行 1. 加入 CSDN 的契机 首次接触…

【C++篇】红黑树封装 实现map和set

目录 前言&#xff1a; 一&#xff0c;库中map和set的大致结构 二&#xff0c;模拟实现 2.1&#xff0c;大致框架 2.2&#xff0c;复用红黑树实现insert接口 2.3&#xff0c;迭代器iterator的实现 operator()的实现&#xff1a; operator--()的实现&#xff1a; 对inser…

写作利器:如何用 PicGo + GitHub 图床提高创作效率

你好呀&#xff0c;欢迎来到 Dong雨 的技术小栈 &#x1f331; 在这里&#xff0c;我们一同探索代码的奥秘&#xff0c;感受技术的魅力 ✨。 &#x1f449; 我的小世界&#xff1a;Dong雨 &#x1f4cc; 分享我的学习旅程 &#x1f6e0;️ 提供贴心的实用工具 &#x1f4a1; 记…

RabbitMQ 高级特性

目录 1.消息确认 1.1 消息确认机制 1.2 手动确认方法 1. 2.1肯定确认 1.2.2 否定确认 1.3 SpringBoot 代码示例 1.3.1 配置确认机制 1.3.2 配置队列,交换机,绑定关系 1.3.3 生产者(向 rabbitmq 发送消息) 1.3.4 消费者(消费队列中的信息) 2.持久性 2.1 交换机…

AIGC视频生成模型:Meta的Emu Video模型

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍Meta的视频生成模型Emu Video&#xff0c;作为Meta发布的第二款视频生成模型&#xff0c;在视频生成领域发挥关键作用。 &#x1f33a;优质专栏回顾&am…

面向对象的程序设计:以对象的方式进行思考

1 理解接口与实现的区别 以上一篇文章的电视机需要插电使用的例子继续来讲解: 对电视而言,插电使用,只需要标准的插座即可,具体的电从哪里来,是火力发电厂,或是太阳能发电,亦或是畜电池逆变供电,电视机是不需要关心的。 发电厂或供电设备属于实现,220V交流电插座属于…

要获取本地的公网 IP 地址(curl ifconfig.me)

文章目录 通过命令行查询&#xff08;适用于 Linux/Mac/Windows&#xff09;Linux/MacWindows 注意事项 要获取本地的公网 IP 地址&#xff0c;可以通过以下简单的方法&#xff1a; 通过命令行查询&#xff08;适用于 Linux/Mac/Windows&#xff09; Linux/Mac 打开终端。输入…

MySQL 数据库 UDF 提权

免责声明 本博客文章仅供教育和研究目的使用。本文中提到的所有信息和技术均基于公开来源和合法获取的知识。本文不鼓励或支持任何非法活动&#xff0c;包括但不限于未经授权访问计算机系统、网络或数据。 作者对于读者使用本文中的信息所导致的任何直接或间接后果不承担任何责…

【数据分享】1929-2024年全球站点的逐年平均气温数据(Shp\Excel\无需转发)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01;本次我们为大家带来的就是具体到气象监…

【Linux 源码】内核态到用户态

文章目录 1. 由来2. 流程图3. 中断3.1 概念3.2 8259A芯片3.4 中断时的栈处理3.4.1 相同特权级3.4.2 不同特权级 3.5 中断流程3.6 定位中断程序3.7 中断流程步骤总结 4. 源码4.1 move_to_user_mode4.2 0号进程4.3 TSS和LDT在GDT表排布4.4 ldt中的0x17栈段 5. 总结 1. 由来 ​ 首…

雷电9最新版安装Magisk+LSPosd(新手速通)

大家好啊&#xff01;我是NiJiMingCheng 我的博客&#xff1a;NiJiMingCheng 在安卓系统的定制与拓展过程中&#xff0c;获取 ROOT 权限以及安装各类框架是进阶玩家常用的操作&#xff0c;这可以帮助我们实现更多系统层面的个性化功能。今天&#xff0c;我将为大家详细介绍如何…

《Linux服务与安全管理》| 邮件服务器安装和配置

《Linux服务与安全管理》| 邮件服务器安装和配置 目录 《Linux服务与安全管理》| 邮件服务器安装和配置 1.在Server01上安装dns、postfix、dovecot和telnet&#xff0c;并启动 2&#xff0e;在Server01上配置DNS服务器&#xff0c;设置MX资源记录 3&#xff0e;在server1上…

计算机毕业设计Python电商品推荐系统 商品比价系统 电商比价系统 商品可视化 商品爬虫 机器学习 深度学习 京东爬虫 国美爬虫 淘宝爬虫 大数据

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

【银河麒麟高级服务器操作系统】业务访问慢网卡丢包现象分析及处理过程

了解更多银河麒麟操作系统全新产品&#xff0c;请点击访问 麒麟软件产品专区&#xff1a;product.kylinos.cn 开发者专区&#xff1a;developer.kylinos.cn 文档中心&#xff1a;document.kylinos.cn 交流论坛&#xff1a;forum.kylinos.cn 服务器环境以及配置 【内核版本…

鸿蒙开发中的骨架图:提升用户体验的关键一环

大家好&#xff0c;我是小 z&#xff0c;今天要给大家分享一个提升用户体验的超实用技巧 —— 骨架图&#x1f3af; 文章目录 一、什么是骨架图二、骨架图的作用三、鸿蒙开发中实现骨架图的方法1. 利用 opacity 奠定视觉基础2. animateTo 驱动动态变化3. 二者协同触发与展示 四…

leetcode刷题记录(七十三)——543. 二叉树的直径

&#xff08;一&#xff09;问题描述 543. 二叉树的直径 - 力扣&#xff08;LeetCode&#xff09;543. 二叉树的直径 - 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 r…

【esp32小程序】小程序篇02——连接git

一、创建仓库 进入gitee官网&#xff0c;登录&#xff08;如果没有gitee账号的就自行注册一下&#xff09;。 点击号-->新建仓库 填写好必填信息&#xff0c;然后点击“创建” 二、微信开发者工具配置 在微信开发者工具打开我们的项目。按下面的步骤依次点击 三、验证 点…