4-SpringMVC获得请求数据


DispatcherServlet / ---------------------------------------------------------------------- 解决: 1.在spring-mvc.xml中添加 表示在SpringMVC框架中要开放哪些资源的权限,一般就是静态资源。jquery不需要springmvc去找,或者说告诉他去location找。
  1. 或者
    mvc:default-servlet-handler/
    表示springmvc找不到时 交给原始的容器tomcat去找

    
    ### 请求数据乱码问题
    
    tomcat 8.5  get请求  中文不会出现乱码, post会出现乱码。
    
    如:post获取参数 回写的结果

    VO{userList=[User{name=’盲赂颅氓聸陆茅芦聵茅聙聼’, age=11}, User{name=’忙掳麓莽聰碌猫麓鹿’, age=12}]}

    
    解决:设置一个过滤器来进行编码的过滤(以下不一定有用,跟控制台字符的编码字符集有关)
    
    web.xml中添加全局的filter
    CharacterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding UTF-8 CharacterEncodingFilter /*
    
    ### 参数绑定注解@RequestParam
    
    当请求的参数名称与Controller的业务方法参数名不一致时,用它
    
    @RequestParam有如下参数可以使用:
    
    - value : 与请求参数名称一致
    - required : 指定的请求参数是否必须包括,默认是true,   请求没写该参数且没有默认值会400
    @RequestMapping(value = "/quick16") @ResponseBody public void save16(@RequestParam(value = "name", required = true, defaultValue = "abc") String username) { System.out.println(username); }
    
    ### 获得Restful风格的参数(了解)
    
    Restful是一种软件架构风格、设计风格,不是标准。
    
    Restful风格的请求是 使用   "**url + 请求方式**"表示一次请求目的的,相应数据不是以问号方式,而是在url内
    
    - GET  获取资源
    - POST 新建资源(添加一个用户数据)
    - PUT 更新资源
    - DELETE 删除资源
    
    eg:
    
    - /user/1 GET:  获得id = 1 的user
    - /user/1 DELETE 
    - /user/1 PUT   更新id = 1 的user
    - /user    POST: 新增user
    
    **通过占位符 和@PathVariable 进行参数绑定**
    http://localhost/ustc_spring_mvc_war_exploded/quick17/aaa
    
    
    @RequestMapping(value = "/quick17/{name}") @ResponseBody public void save17(@PathVariable(value = "name") String username) { System.out.println(username); }
    
    还有post方式...
    
    ### 自定义类型转换器(用的不多,内置一般够用)
    
    SpringMVC框架内部有一些定义好的类型转换器,  请求的参数到达服务端后都是字符串 . 不一定能满足我们的需求,比如日期的转换,有很多种格式 ,需要自定义。
    
    开发步骤:
    
    ①定义转换器类实现Converter接口
    public class DateConverter implements Converter {

    public Date convert(String s) {

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
    Date date = null;
    try {
        date = simpleDateFormat.parse(s);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    return date;

    }
    }

    
    ②在配置文件中声明转换器
    
    ③在springmvc.xml中\<annotation-dirven>中引用转换器

<mvc:annotation-driven conversion-service=”ConversionServiceFactoryBean”/>


@RequestMapping(value = "/quick18") @ResponseBody public void save18(@RequestParam(name = "date") String username) { System.out.println(username); } http://localhost/ustc_spring_mvc_war_exploded/quick17?date=2020-12-02

### 获得servlet相关api

视频缺失

### 获得请求头

#### 1.@RequestHeader

相当于request.getHeader(name)
/** * 获取请求头封装到header */ @RequestMapping(value = "/quick19") @ResponseBody public void save19(@RequestHeader(value = "User-Agent") String header) { System.out.println(header); }

#### 2.@CookieValue
/** * 获取指定cookie的值 */ @RequestMapping(value = "/quick20") @ResponseBody public void save20(@CookieValue(value = "JSESSIONID") String jsessionid) { System.out.println(jsessionid); }

Cookie: JSESSIONID=8E06D127BC5FD536CC11F79379482B2C

### 文件上传

#### 1.文件上传客户端的三要素

- 表单项type = "file"
- 提交方式 POST
- 表单的enctype属性是多部分表单形式, enctype="multipart/form-data"
// 准备一个表单
名称
文件


#### 2.文件上传原理

- 当form表单为多部分表单时,request.getParamter()失效,因为他获取的是键值对模式的

- **enctype="application/x-www-form-urlencoded"**  // 这是默认的,为键值对模式 key=value&...

- enctype="multipart/form-data"时,请求正文内容就变成多部分形式

  ![image-20201212230033296](.4-SpringMVC获得请求数据_images/image-20201212230033296.png)
// 请求正文内容示例: -----------------------------77008394839796727021065346689 Content-Disposition: form-data; name="username"

qwer
—————————–77008394839796727021065346689
Content-Disposition: form-data; name=”upload”; filename=”1.txt”
Content-Type: text/plain

aaa
bbb
—————————–77008394839796727021065346689
Content-Disposition: form-data; name=”上传”

提交查询
—————————–77008394839796727021065346689–


springmvc 的文件上传也是封装的apache的fileupload

#### 3.单文件上传步骤

① 导入fileupload和io坐标  (输出的也得有)

Failed to introspect Class [org.springframework.web.multipart.commons.CommonsMultipartResolver] from ClassLoader [ParallelWebappClassLoader

解决:project structure 中 output添加相应依赖


commons-fileupload commons-fileupload 1.3.1 commons-io commons-io 2.3

② 配置文件上传解析器 spring-mvc.xml

③ 编写文件上传代码
/** * 上传单个文件 * @param username * @param uploadFile 上传的文件被封装为MultipartFile对象,此参数名要和表单中type为file 的input标签的name一致 */ @RequestMapping(value = "/quick21") @ResponseBody public void save21(String username, MultipartFile uploadFile) throws IOException { System.out.println(username); String filename = uploadFile.getOriginalFilename(); System.out.println(filename); // c:\\upload目录得存在,否则500 uploadFile.transferTo(new File("C:\\upload" + File.separator + filename )); } ```

4.多文件上传 easy

1.input标签type=file增加多个,同时业务方法增加参数去接收

2.input标签type=file增加多个,name都一样,用数组去接收

// 准备一个表单

名称
文件
文件
文件


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!