SpringMVC=SpringMVC请求参数以及文件上传

一.SpringMVC的请求:

新建web项目:pom.xml的坐标导入:

 
    
    
      mysql
      mysql-connector-java
      5.1.47
    
    
    
      com.alibaba
      druid
      1.1.15
    
    
    
      org.springframework
      spring-jdbc
      5.1.5.RELEASE
    
    
    
      org.springframework
      spring-context
      5.1.5.RELEASE
    
    
    
      junit
      junit
      4.12
    
    
    
      org.springframework
      spring-test
      5.1.5.RELEASE
    
    
      org.springframework
      spring-orm
      5.1.5.RELEASE
    
    
      org.aspectj
      aspectjweaver
      1.9.5
    

    
    
      org.springframework
      spring-webmvc
      5.1.5.RELEASE
    
    
    
      javax.servlet
      servlet-api
      2.5
      provided
    
    
    
      javax.servlet
      jsp-api
      2.0
      provided
    

    
      org.projectlombok
      lombok
      1.18.10
    

    
      commons-fileupload
      commons-fileupload
      1.4
    
  
  
    
      
        org.apache.maven.plugins
        maven-compiler-plugin
        3.1
        
          1.8
          1.8
          UTF-8
        
      
    
  

(1)请求参数:

客户端请求参数的格式是:name=value&name=value……

服务器要获取请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数:

① 简单类型

基本类型,基本类型的包装类型,字符串

index.jsp


简单类型参数访问

简单参数接收

UserController

@Controller
@RequestMapping("/user")
public class UserController {

    //简单参数
    @RequestMapping("/simpleParam")
    public String simpleParam(String username,Integer age){
        System.out.println("姓名:"+username);
        System.out.println("年龄:"+age);
        return "success";
    }
}

注意:前端页面的name属性名必须与方法中的形参名称一致,类型自定义

② 对象类型

User

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {

    private String username;

    private Integer age;
}

对象类型

用户名:
年龄:

UserController

    //对象参数
    @RequestMapping("/objectParam")
    public String objectParam(User user){
        System.out.println(user);
        return "success";
    }

注意:表单元素的name属性必须和user实体的属性名一致

③ 数组类型

应用场景:批量删除

index.jsp


数组类型

足球
篮球
乒乓球
游泳
爬山

UserController

//数组参数
    @RequestMapping("/arrayParam")
    public String arrayParam(Integer[] hobby){
        System.out.println(Arrays.toString(hobby));
        return "success";
    }

注意:复选框的name属性名必须与数组的变量名一致:

④ 集合(复杂)类型

如果提交的是一个集合的数据,springMVC的方法形参是无法接收的,必须要通过实体类进行包装才行

SpringMVC=SpringMVC请求参数以及文件上传_第1张图片

QueryVo

@Data
@NoArgsConstructor
@AllArgsConstructor
public class QueryVo {

    private String orderId;

    private User user;

    private Integer[] hobby;

    private List list;

    private Map map;

}

index.jsp

复合类型

订单id:
用户名:
年龄:
爱好: 足球
篮球
乒乓球
游泳
爬山
list集合 <%-- list[0] == 第一个元素 list[1] == 第二个元素 --%>
map集合 <%-- map.put("key1",value); map.put("key2",value); --%>

UserController

//复杂参数
    @RequestMapping("/allTypeParam")
    public String allTypeParam(QueryVo queryVo){
        System.out.println(queryVo);
        return "success";
    }

 

(2)中文乱码过滤器:

如果是get请求,tomcat8以上版本的服务器统一了UTF-8编码,所以不会出现乱码

如果是post请求,由于servlet规范当中post默认解码方式为:ISO-8859-1,所以出现了中文乱码问题:

Spring框架提供了post请求中文过滤器

在web.xml 文件中配置如下即可:

	
		CharacterEncodingFilter
		org.springframework.web.filter.CharacterEncodingFilter
		
			encoding
			UTF-8
		
	
	
		CharacterEncodingFilter
		/*
	

 

(3)自定义类型转换器

应用场景:日期格式:

springMVC框架默认将字符串转为日期对象的格式为(yyyy/MM/dd),这种格式在国内并不流行...

我们已经习惯使用了(yyyy-MM-dd),这时框架无法识别,页面出现400的错误

SpringMVC=SpringMVC请求参数以及文件上传_第2张图片

所以springMVC考虑全面 ..支持了自定义类型转换器的扩展...

自定义类型转换器:

/*
    自定义日期类型转换器(yyyy-MM-dd)
 */
public class DateConverter implements Converter {
    @Override
    public Date convert(String source) { // 字符串 (yyyy-MM-dd)
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = simpleDateFormat.parse(source);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}

spring-mvc.xml配置:

SpringMVC=SpringMVC请求参数以及文件上传_第3张图片

index.jsp

日期

生日:

UserController

    //=============================================日期相关:
    @RequestMapping("/getDate")
    public String getDate(Date birthday){
        System.out.println(birthday);

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println(simpleDateFormat.format(birthday));
        return "success";
    }

注解方案:

需要把spring-mvc文件里的 关于时间转换的内容注释掉:然后修改UserController即可:

    //=============================================日期相关:
    @RequestMapping("/getDate")
    public String getDate(@DateTimeFormat(pattern = "yyyy-MM-dd") Date birthday){
        System.out.println(birthday);

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        System.out.println(simpleDateFormat.format(birthday));
        return "success";
    }

 

(4)其他相关注解

① @RequestParam

应用场景:分页查询:

index.jsp


分页参数RequestParam

分页查询

UserController

    //=============================================分页查询:
    // 分页查询
    /*
        @RequestParam 注解
            常用属性
                name/value:帮我们解决请求参数名和方法的变量名不一致问题.....
                required: 默认值为true,要求前端必须提交参数和值...
                defaultValue:指定参数的默认值

     */
    @RequestMapping("/findByPage")
    public String findByPage(@RequestParam(name = "pageNum",defaultValue = "1") Integer currentPage,@RequestParam(name = "size",defaultValue = "10") Integer pageSize){
        System.out.println("==="+currentPage);
        System.out.println("==="+pageSize);

        return "success";
    }

 

② @RequestHeader

获取请求头,相当于:request.getHeader();

index.jsp

请求头信息

请求头信息

UserController

    //=============================================获取请求头信息:
    @RequestMapping("/requestHeader")
    public String requestHeader(@RequestHeader("User-Agent") String userAgent,@RequestHeader("Cookie") String cookie){
        System.out.println("==="+userAgent);
        System.out.println("==="+cookie);

        return "success";
    }

 

③ @CookieValue

专门获取指定cookie名称的值

index.jsp

cookieValue信息

回去指定cookies信息

UserController

    //=============================================获取指定CookieValue
    @RequestMapping("/cookieValue")
    public String cookieValue(@CookieValue("JSESSIONID") String  jsessionid){
        System.out.println("jsessionid--"+jsessionid);

        return "success";
    }

(5)获取Servlet相关API

我们也可以通过SpringMVC框架,操作Servlet原生API

index.jsp

servletAPI信息

servletAPI

UserController


//=============================================获取servlet相关api
    @RequestMapping("/servletApi")
    public void servletApi(HttpServletRequest request, HttpServletResponse response, HttpSession session) throws ServletException, IOException{
        // 获取请求参数
        String username = request.getParameter("username");
        System.out.println(username);
        request.getRequestDispatcher("/WEB-INF/pages/success.jsp").forward(request, response);
    }

 

二.文件上传“”

(1)文件上传三要素:

  • 表单的提交方式 method="POST"

  • 表单的enctype属性是多部分表单形式 enctype=“multipart/form-data"

  • 表单项(元素)type="file"


    姓名:

    头像:

上传原理:

SpringMVC=SpringMVC请求参数以及文件上传_第4张图片

服务端代码如何获得请求体的内容

1.apache提供的file-uplaod工具包【开发中一般不用底层工具包】

2.Servlet3.0【原生servlet开发时使用...】

3.springMVC内置文件上传(底层集成了file-uplaod)常用

 

(2)SpringMVC实现文件上传

需求分析:

SpringMVC=SpringMVC请求参数以及文件上传_第5张图片

第一步:

姓名:
头像:

第二步:需要导入apache的文件上传依赖:

    
    
      commons-fileupload
      commons-fileupload
      1.4
    

修改spring-mvc.xml

    
    
        
        
    

第三步”

    // 文件上传
    @RequestMapping("/upload")
    public String upload(String username, MultipartFile picFile) {
        System.out.println("普通项:" + username);
        System.out.println("文件项:" + picFile);
        System.out.println("文件名:" + picFile.getOriginalFilename());
        // 保存到一个指定的磁盘目录
        try {
            picFile.transferTo(new File("d:\\"+picFile.getOriginalFilename()));
        } catch (IOException e) {
            e.printStackTrace();
        }

        return "success";
    }

 

三.静态资源访问的开启:

我们在以上项目中访问静态资源 01.jpg 图片时,出现了404问题,但是路径规则没问题。

原因:

在SpringMVC的前端控制器DispatcherServlet的url-pattern配置的是 /(缺省),代表除了jsp请求不拦截, 其他的所有请求都会拦截,包括一些静态文件(html、css、js)等, 而拦截住之后,它又找不到对应的处理器方法来处理, 因此报错.

SpringMVC=SpringMVC请求参数以及文件上传_第6张图片

 

SpringMVC=SpringMVC请求参数以及文件上传_第7张图片

 

开启方式有三种方式:

(1)方式一:

spring-mvc.xml

SpringMVC=SpringMVC请求参数以及文件上传_第8张图片


(2)方式二 常用:

SpringMVC=SpringMVC请求参数以及文件上传_第9张图片

spring-mvc.xml

 
    

(3)方式三:

web.xml


    DispatcherServlet
    
    *.do

 

spring-mvc.xml文件配置:




    
    



    
        
        
    



    
        
    

    
    
    
    
        
            
                
            
        
    

    



 

你可能感兴趣的:(Spring系列,spring)