SpringMVC好好学二(上传文件、RESTful)

SpringMVC好好学二(上传文件、RESTful)

大纲

  • 1、SpringMVC 上传文件

  • 2、SpringMVC RESTful风格

  • 3、SpringMVC 请求转发和重定向

  • 4、SpringMVC 类型转换器

1、SpringMVC上传文件

        上传文件的前提是表单的 enctype 取值必须是: multipart/form-data,请求方法必须是post方式。

1.1传统方式长传文件

  • 导入依赖
<!--文件上传需要的jar包-->
    <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.5</version>
    </dependency>
  • 示例代码
@RequestMapping(value = "/uploadFile")
    @ResponseBody
    private String  uploadFile(HttpServletRequest request) throws Exception {
        System.out.println("文件上传...");
        // 使用fileupload组件完成文件上传
        // 上传的位置
        String path = request.getSession().getServletContext().getRealPath("/uploads");
        // 判断,该路径是否存在
        File file = new File(path);
        if (!file.exists()) {
            // 创建该文件夹
            file.mkdirs();
        }
        // 解析request对象,获取上传文件项
        DiskFileItemFactory factory = new DiskFileItemFactory();
        ServletFileUpload upload = new ServletFileUpload(factory);
        // 解析request
        List<FileItem> items = upload.parseRequest(request);
        // 遍历
        for (FileItem item : items) {
            // 进行判断,当前item对象是否是上传文件项
            if (item.isFormField()) {
                // 说明普通表单项
            } else {
                // 说明上传文件项
                // 获取上传文件的名称
                String filename = item.getName();
                //上传文件
                item.write(new File(file, filename));
                // 删除临时文件
                item.delete();
            }
        }
        return "success";
    }

1.2springmvc上传文件

        SpringMVC框架提供了MultipartFile对象,该对象表示上传的文件,要求变量名称必须和表单file标签的name属性名称相同

        代码示例:

 @RequestMapping(value = "/springMVCUploadFile")
    @ResponseBody
    private String  springMVCUploadFile(HttpServletRequest request, MultipartFile upload) throws Exception {
        System.out.println("文件上传...");
        // 使用fileupload组件完成文件上传
        // 上传的位置
        String path = request.getSession().getServletContext().getRealPath("/uploads");
        // 判断,该路径是否存在
        File file = new File(path);
        if (!file.exists()) {
            // 创建该文件夹
            file.mkdirs();
        }
        // 获取到上传文件的名称
        String filename = upload.getOriginalFilename();
        String uuid = UUID.randomUUID().toString().replaceAll("-", "").toUpperCase();
        //上传的文件名唯一化
        filename = uuid + filename;
        //上传文件
        upload.transferTo(new File(file,filename));
        return "success";
    }

2、SpringMVC RESTful风格

        RESTful是一种软件架构设计规则, 只是提供了一组设计原则和约束条件,它主要用于客户端和服务端交互。其核心价值在于如何设计出符合REST风格的网络接口。

  • RESTful的实现

        REST 风格提倡 URL 地址使用统一的风格设计,从前到后各个单词使用斜杠分开,不使用问号键值对方式携带请求参数,而是将要发送给服务器的数据作为 URL 地址的一部分,以保证整体风格的一致性。

具体说,就是 HTTP 协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。 它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。

  • 查询操作
-- 传统方式
getUserById?id=1
-- REST风格
user/1 --> get请求方式
  • 保存操作
-- 传统方式
saveUser
-- REST风格
user --> post请求方式
  • 删除操作
-- 传统方式
deleteUser?id=1
-- REST风格
user/1 --> delete请求方式
  • 更新操作
-- 传统方式
updateUser
-- REST风格
user --> put请求方式

3、SpringMVC 请求转发和重定向

        Spring MVC 是对 Servlet 的进一步封装,其本质就是一个 Servlet,因此在 Spring MVC 中也存在转发和重定向的概念。

        在 Spring MVC 中,我们可以在逻辑视图名中通过“forward:”和“redirect:”两个关键字来表示转发和重定向

3.1 请求与转发

        使用“forward:”关键字进行请求转发操作,控制器方法中所设置的逻辑视图名称以“forward:”为前缀时,该逻辑视图名称不会被 Spring MVC 配置的视图解析器解析,而是会将前缀“forward:”去掉,以剩余部分作为最终路径通过转发的方式实现跳转.

  • 通过 String 类型的返回值实现转发
-- 通过 String 类型的返回值实现转发
@RequestMapping("/testDispatcher")
public String testDispatcher() {
    return "forward:/login";
} 
控制器方法返回的是一个字符串类型的值“forward:/login”,此时 Spring MVC 会将“forward:”识别
为转发指示符,而剩余的“/login”则会被当做转发的 URL,即路径“/testDispatcher”请求最终会被
转发到 “/login”上进行处理 
  • 通过 ModelAndView 实现转发
@RequestMapping("/testDispatcher")
public ModelAndView testDispatcher() {
    ModelAndView modelAndView = new ModelAndView();
    //设置逻辑视图名
    modelAndView.setViewName("forward:/login");
    return modelAndView;
}

3.2 重定向

        我们可以在控制器方法指定逻辑视图名(View Name)时,使用“redirect:”关键字进行重定向操作。

        当控制器方法中所设置的视图名称以“redirect:”为前缀时,该视图名称不会被 Spring MVC 配置的视图解析器解析,而是会将前缀“redirect:”去掉,以剩余部分作为最终路径通过重定向的方式实现跳转

  • 通过 String 类型的返回值实现重定向
@RequestMapping("/testRedirect")
public String testRedirect() {
    return "redirect:/login";
}
  • 通过 ModelAndView 实现重定向
RequestMapping("/testRedirect")
public ModelAndView testDispatcher() {
    ModelAndView modelAndView = new ModelAndView();
    //设置逻辑视图名
    modelAndView.setViewName("redirect:/login");
    return modelAndView;
}

4、SpringMVC 类型转换器

        Spring 提供了一种 Converter(类型转换器)的类型转换工具。在 Spring MVC 中,它的作用是在控制器方法对请求进行处理前,先获取到请求发送过来的参数,并将其转换为控制器方法指定的数据类型,然后再将转换后的参数值传递给控制器方法的形参,这样后台的控制器方法就可以正确地获取请求中携带的参数了。

4.1 内置的类型转换器

        Spring MVC 框架默认提供了许多内置的类型转换器,主要包括以下几种类型。

  • 1)标量转换器
名称作用
StringToBooleanConverterString 到 boolean 类型转换
ObjectToStringConverterObject 到 String 转换,调用 toString 方法转换
StringToNumberConverterFactoryString 到数字转换(例如 Integer、Long 等)
NumberToNumberConverterFactory数字子类型(基本类型)到数字类型(包装类型)转换
StringToCharacterConverterString 到 Character 转换,取字符串中的第一个字符
NumberToCharacterConverter数字子类型到 Character 转换
CharacterToNumberFactoryCharacter 到数字子类型转换
StringToEnumConverterFactoryString 到枚举类型转换,通过 Enum.valueOf 将字符串转换为需要的枚举类型
EnumToStringConverter枚举类型到 String 转换,返回枚举对象的 name 值
StringToLocaleConverterString 到 java.util.Locale 转换
PropertiesToStringConverterjava.util.Properties 到 String 转换,默认通过 ISO-8859-1 解码
StringToPropertiesConverterString 到 java.util.Properties 转换,默认使用 ISO-8859-1 编码
  • 2)集合、数组相关转换器
名称作用
ArrayToCollectionConverter任意数组到任意集合(List、Set)转换
CollectionToArrayConverter任意集合到任意数组转换
ArrayToArrayConverter任意数组到任意数组转换
CollectionToCollectionConverter集合之间的类型转换
MapToMapConverterMap之间的类型转换
ArrayToStringConverter任意数组到 String 转换
StringToArrayConverter字符串到数组的转换,默认通过“,”分割,且去除字符串两边的空格(trim)
ArrayToObjectConverter任意数组到 Object 的转换,如果目标类型和源类型兼容,直接返回源对象;否则返回数组的第一个元素并进行类型转换
ObjectToArrayConverterObject 到单元素数组转换
CollectionToStringConverter任意集合(List、Set)到 String 转换
StringToCollectionConverterString 到集合(List、Set)转换,默认通过“,”分割,且去除字符串两边的空格(trim)
CollectionToObjectConverter任意集合到任意 Object 的转换,如果目标类型和源类型兼容,直接返回源对象;否则返回集合的第一个元素并进行类型转换
ObjectToCollectionConverterObject 到单元素集合的类型转换

        Spring MVC 对于基本类型(例如 int、long、float、double、boolean 以及 char 等)已经做好了基本类型转换。因此,通常情况下 Spring MVC 提供的这些类型转换器可以满足开发人员大多数的类型转换需求的。

4.2 自定义类型转换器

        Spring MVC 内置的类型转换器就可以满足我们日常的开发需求,但对于一些较为复杂类型的转换,例如 String 转换 Date 类型,以及开发人员自定义格式的数据的转换等,就需要我们根据自身的需求开发自定义类型转换器来转换了.

  • 创建自定义类型转换器类

Spring 在 org.springframework.core.convert.converter 包中定义了 3 种类型的转换器接口,如下表:

接口说明
Converter<S,T>该接口使用了泛型,第一个类型 S 表示原类型,第二个类型 T 表示目标类型,里面定义了一个 convert() 方法,能够将原类型对象作为参数传入,进行转换之后返回目标类型对象。
ConverterFactory如果我们希望将一种类型的对象转换为另一种类型及其子类对象,例如将 String 转换为 Number 以及 Number 的子类 Integer、Double 等类型的对象,那么就需要一系列的 Converter,如 StringToInteger、StringToDouble 等。ConverterFactory<S,R> 接口的作用就是将这些相同系列的多个 Converter 封装在一起。
GenericConverter该接口会根据源类对象及目标类对象的上下文信息进行类型转换。

        如果我们想要自定义类型转换器,第一步就是要创建一个自定义类型转换器类,并实现以上 3 个接口的中任意一种转换器接口即可

  • 代码示例
package net.biancheng.c.converter;

import org.springframework.core.convert.converter.Converter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
* 自定义日期转换器
*/
public class MyDateConverter implements Converter<String, Date> {
    private String datePatten = "yyyy-MM-dd";

    @Override
    public Date convert(String source) {
        System.out.println("前端页面传递过来的时间为:" + source);
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(datePatten);
        try {
            return simpleDateFormat.parse(source);
        } catch (ParseException e) {
            throw new IllegalArgumentException("无效的日期格式,请使用正确的日期格式" + datePatten);
        }
    }
}
  • 配置自定义类型转换器

        在创建完自定义类型转换器后,我们还需要在 Spring MVC 的核心配置文件中对它进行配置,这个自定义类型装换器才会生效,示例配置如下

<!--显式地装配自定义类型转换器-->
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>
<!--自定义类型转换器配置-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="net.biancheng.c.converter.MyDateConverter"></bean>
        </set>
    </property>
</bean>
end
  • 作者:旭仔(联系作者)
  • 发表时间:2024-03-17 10:45
  • 版权声明:自由转载-非商用-非衍生-保持署名
  • 转载声明:如果是转载栈主转载的文章,请附上原文链接
  • 公众号转载:请在文末添加作者公众号二维码(公众号二维码见右边,欢迎关注)
  • 评论