SpringMVC的日期处理及文件上传

举报
酸菜鱼. 发表于 2022/09/11 17:17:04 2022/09/11
【摘要】 日期格式处理在控制器中使用对象接收数据前端: <form action="test/add" method="post"> <p>图书名称:<input type="text" name="bookName"/></p> <p>图书作者:<input type="text" name="bookAuthor"/></p> <p>图书价格:<input type...

日期格式处理

在这里插入图片描述

在控制器中使用对象接收数据

  • 前端:
 <form action="test/add" method="post">
      <p>图书名称:<input type="text" name="bookName"/></p>
      <p>图书作者:<input type="text" name="bookAuthor"/></p>
      <p>图书价格:<input type="text" name="bookPrice"/></p>
      <p><input type="submit" value="提交"/></p>
  </form>
  • 后端

    @Controller
    @RequestMapping("/test")
    public class TestController {
    
        @RequestMapping("/add")
        //表单提交的多个数据,在控制器方法中可以使用对象接收
        //但是提交的数据的key必须要与对象的属性名一致
        public String addBook(Book book){
            return "/tips.jsp";
        }
    
    }
    

日期格式处理

如果前端需要输入日期数据,在控制器中转换成Date对象,SpringMVC要求前端输入的日期格式必须为yyyy/MM/dd

如果甲方要求日期格式必须为指定的格式,而这个指定格式SpringMVC不接受,该如何处理呢?

  • 自定义日期转换器

创建自定义日期转换器

/***
 * 1.创建一个类实现Converter接口,泛型指定从什么类型转换为什么类型
 * 2.实现convert转换方法
 */
public class MyDateConverter implements Converter<String, Date> {

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");

    public Date convert(String s) {
        Date date = null;
        try {
            date = sdf.parse(s);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

}

在这里插入图片描述

配置自定义转换器

<!--  声明MVC使用注解驱动  -->
<mvc:annotation-driven conversion-service="converterFactory"/>

<bean id="converterFactory" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="com.qfedu.utils.MyDateConverter"/>
        </set>
    </property>
</bean>

文件上传下载

SpringMVC框架部署

  • 基于Maven创建web工程

  • 添加SpringMVC所需的依赖

    • Spring:context aspects jdbc test web webmvc jackson
  • 创建SpringMVC配置文件

  • 在web.xml中配置SpringMVC的前端控制器

  • 在web.xml中配置SpringMVC的编码过滤器

  • 配置springmvc静态资源处理策略

文件上传

案例:添加图书,同时提交图书的封面图片

前端提交文件

  • 表单提示方式必须为post
  • 表单enctype属性设置为multipart/form-data
<form action="book/add" method="post" enctype="multipart/form-data">
    <p>图书名称:<input type="text" name="bookName"/></p>
    <p>图书作者:<input type="text" name="bookAuthor"/></p>
    <p>图书价格:<input type="text" name="bookPrice"/></p>
    <p>图书封面:<input type="file" name="imgFile"/></p>
    <p><input type="submit" value="提交"/></p>
</form>

控制器接收数据和文件

SpringMVC处理上传文件需要借助于CommonsMultipartResolver文件解析器

  • 添加依赖:commons-io commons-fileupload

    <dependency>
         <groupId>commons-io</groupId>
         <artifactId>commons-io</artifactId>
         <version>2.4</version>
    </dependency>
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.4</version>
    </dependency>
    
  • 在spring-servlet.xml中配置文件解析器

    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10240000"/>
        <property name="maxInMemorySize" value="102400"/>
        <property name="defaultEncoding" value="utf-8"/>
    </bean>
    
  • 控制器接收文件

    • 在处理文件上传的方法中定义一个MultiPartFile类型的对象,就可以接受图片了
    @Controller
    @RequestMapping("/book")
    public class BookController {
    
    
        @RequestMapping("/add")
        public String addBook(Book book, MultipartFile imgFile, HttpServletRequest request) throws IOException {
            System.out.println("--------------add");
    
            //imgFile就表示上传的图片
            //1.截取上传文件的后缀名,生成新的文件名
            String originalFilename = imgFile.getOriginalFilename();
            String ext = originalFilename.substring( originalFilename.lastIndexOf(".") ); 
            String fileName = System.currentTimeMillis()+ext;
    
            //2.获取imgs目录在服务器的路径
            String dir = request.getServletContext().getRealPath("imgs");
            String savePath = dir+"/"+fileName; 
    
            //3.保存文件
            imgFile.transferTo( new File(savePath));
    
            //4.将图片的访问路径设置到book对象
            book.setBookImg("imgs/"+fileName);
    
            //5.调用service保存book到数据库
            return "/tips.jsp";
        }
    
    }
    

文件下载

显示文件列表

  • list.jsp
  <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  <html>
      <head>
          <title>Title</title>
      </head>
      <!-- 最新版本的 Bootstrap 核心 CSS 文件 -->
      <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
      <!-- 可选的 Bootstrap 主题文件(一般不用引入) -->
      <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap-theme.min.css" integrity="sha384-rHyoN1iRsVXV4nD0JutlnGaslCJuC7uwjduW9SVrLvRYooPp2bWYgmgJQIXwl/Sp" crossorigin="anonymous">
      <!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
      <script src="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
      <body>
  
      <h4>文件列表</h4>
  
      <div class="row" id="container"></div>
  
      <script type="text/javascript" src="js/jquery-3.4.1.min.js"></script>
      <script type="text/javascript">
          $.get("book/list",function(res){
              for (var i = 0; i < res.length; i++) {
                  var fn = res[i];
                  var htmlStr = "<div class='col-lg-2  col-md-3 col-sm-4 col-xs-6'><div class='thumbnail'><img src='imgs/"+fn+"' alt='...'> <div class='caption'><p><a href='#' class='btn btn-primary' role='button'>下载</a></p></div> </div> </div>";
                  $("#container").append(htmlStr);
              }
          },"json");
      </script>
  
      </body>
  </html>
  • BookController

    @RequestMapping("/list")
    @ResponseBody
    public String[] listImgs(HttpServletRequest request){
        //从imgs目录下获取所有的图片信息
        String dir = request.getServletContext().getRealPath("imgs");
        File imgDir = new File(dir);
        String[] fileNames = imgDir.list();
        return fileNames;
    }
    

实现文件下载

  • list.jsp

    var htmlStr = "<div class='col-lg-2  col-md-3 col-sm-4 col-xs-6'><div class='thumbnail'><img src='imgs/"+fn+"' alt='...'> <div class='caption'><p><a href='book/download?fname="+fn+"' class='btn btn-primary' role='button'>下载</a></p></div> </div> </div>";
    
  • BookController

@RequestMapping("/download")
public void downloadImg(String fname, HttpServletRequest request, HttpServletResponse response) throws Exception {
    //从imgs目录找到当前文件
    String dir = request.getServletContext().getRealPath("imgs");
    String filePath = dir+"/"+fname;
    FileInputStream fileInputStream = new FileInputStream(filePath);

    response.setContentType("application/exe");
    response.addHeader("Content-Disposition","attachment;filename="+fname);

    IOUtils.copy(fileInputStream, response.getOutputStream());
}

文章到这里就结束了,以后还会记录一些其他的知识,喜欢的大佬可以多多支持哦😉😉。
如果有什么疑问的地方请指出,诸佬们一起讨论🍻🍻
在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。