栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【SpringMVC】02:请求与响应

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【SpringMVC】02:请求与响应

第二章:SpringMVC请求与响应

OVERVIEW
  • 第二章:SpringMVC请求与响应
      • 一、SpringMVC请求数据获取
        • 1.MVC请求参数获取
          • (1)基本类型参数:
          • (2)POJO类型参数:
          • (3)数组类型参数:
          • (4)集合类型参数POJO:
          • (5)集合类型参数List:
        • 2.MVC数据获取相关:
          • (1)中文乱码问题:
          • (2)自定义类型转换器
          • (3)获得Servlet相关API
          • (4)@RequestParam参数绑定
          • (5)@RequestHeader获取请求头
          • (6)@CookieValue获取Cookie
        • 3.文件上传
          • (1)文件上传:
          • (2)文件上传原理:
          • (3)文件上传步骤:
      • 二、SpringMVC数据响应
        • 1.页面跳转
          • (1)直接返回字符串
          • (2)通过ModelAndView对象返回
        • 2.回写数据
          • (1)直接返回字符串
          • (2)返回对象或集合
          • (3)返回对象或集合简化:

一、SpringMVC请求数据获取 1.MVC请求参数获取

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

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

  • 基本类型参数
  • POJO类型参数
  • 数组类型参数
  • 集合类型参数
(1)基本类型参数:

Controller中业务方法的参数名要与请求参数的name一致,参数值就会自动映射匹配。

(2)POJO类型参数:

Controller中业务方法的POJO参数的属性名要与请求参数的name一致,参数值就会自动映射匹配。

(3)数组类型参数:

Controller中业务方法的数组名称要与请求参数的name一致,参数值就会自动映射匹配。

(4)集合类型参数POJO:

获取集合参数时,要将集合参数包装到一个POJO中才能实现,

package com.itcast.controller;

import com.itcast.domain.VO;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class UserController {
    @RequestMapping("/quickStart")
    public String func() {
        return "form";
    }

    @RequestMapping("/test")
    @ResponseBody
    //public void test(List userList) {}将集合封装到一个对象中
    public void test(VO vo) {
        System.out.println(vo);
    }
}
package com.itcast.domain;

import java.util.Date;

public class User {
    private int id;
    private String username;
    private String password;
    private Date birthday;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + ''' +
                ", password='" + password + ''' +
                ", birthday=" + birthday +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}
package com.itcast.domain;

import java.util.List;

public class VO {
    private List userList;

    @Override
    public String toString() {
        return "VO{" +
                "userList=" + userList +
                '}';
    }

    public List getUserList() {
        return userList;
    }

    public void setUserList(List userList) {
        this.userList = userList;
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title

    
        
<%--表明是第一个User对象的id username password birthday--%>







(5)集合类型参数List:

当使用ajax提交时可以指定contentType为jason形式,

那么在方法参数位置使用@RequestBody可以直接接收集合数据,而无需使用POJO进行包封装:

package com.itcast.controller;

import com.itcast.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

@Controller
public class UserController {
    @RequestMapping("/quickStart")
    public String func() {
        return "ajax";
    }

    @RequestMapping("/test")
    @ResponseBody
    public void test(@RequestBody List userList) {
        System.out.println(userList);
    }
}
package com.itcast.domain;

import java.util.Date;

public class User {
    private int id;
    private String username;
    private String password;
    private Date birthday;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + ''' +
                ", password='" + password + ''' +
                ", birthday=" + birthday +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title
    
    





在浏览器输入http://localhost:8080//01spring_mvc_war_exploded/quickStart,查看控制台输出:

2.MVC数据获取相关: (1)中文乱码问题:

当post请求时数据可能会出现乱码现象,可以设置一个过滤器来进行编码的过滤:对web.xml文件进行配置

(2)自定义类型转换器

SpringMVC默认已经提供了一些常用的类型转换器,但不是所有数据类型都提供了转换器,

自定义类型转换器的开发步骤:

  1. 定义转换器类实现Converter接口
  2. 在配置文件中声明转换器
  3. 在中引用转换器
package com.itcast.converter;

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

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

public class DateConverter implements Converter {
    public Date convert(String str) {
        //将日期的String字符串转换为Date对象
        Date date = null;
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        try {
            date = format.parse(str);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}


    
    
    
    
        
        
        
    
    
    
    
    
    
    
        
            
                
            
        
    

(3)获得Servlet相关API

SpringMVC支持使用原始ServletAPI对象作为Controller控制器方法的参数进行注入:

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession

(4)@RequestParam参数绑定

当请求的参数名称与Controller的业务方法参数名称不一致时,需要通过@RequestParam注解显示的进行数据绑定操作:

注解@RequestParam参数:

  • value:请求参数的名称
  • required:指定请求参数是否必须具有(默认为true)
  • defaultValue:当没有指定请求参数时则使用默认值赋值

(5)@RequestHeader获取请求头

使用@RequestHeader获取请求头,相当于web阶段学习的request.getHeader(name)

@RequestHeader注解的属性如下:

  • value:请求头的名称
  • required:是否必须携带此请求头

(6)@CookieValue获取Cookie

使用@CookieValue注解可以获得指定的Cookie的值:

@CookieValue注解的属性如下:

  • value:指定cookie的名称
  • required:是否必须携带此cookie

3.文件上传

文件上传也属于客户端将数据发送到服务器端的一种,服务器端接收客户端发送的数据(文件)。

(1)文件上传:

文件上传客户端3要素:

  1. 表单项type="file"
  2. 表单的提交方式是post
  3. 表单的enctype属性是多部分表单形式,以及enctype=multipart/form-data

(2)文件上传原理:
  1. 当form表单修改为多部分表单时,request.getParameter()将失效
  2. enctype="application/x-www-form-urlencoded"时,form表单的正文内容是key=value&key=value&key=value...
  3. 当form表单的enctype取值为Multipart/form-data时,请求正文内容就变成多部分形式:

(3)文件上传步骤:
  • step1:导入fileupload和io坐标


	commons-fileupload
	commons-fileupload
	1.3.1


	commons-io
	commons-io
	2.3

  • step2:配置文件上传解析器



    
    
    
    
        
        
        
    
    
    
        
        
    
    
    
    
    

  • step3:编写文件上传代码
package com.itcast.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@Controller
public class UserController {
    @RequestMapping("/test")
    @ResponseBody
    public void test(String username, MultipartFile uploadFile) throws IOException {
        System.out.println(username);
        //将上的文件save到服务器磁盘的某个位置中
        String originalFilename = uploadFile.getOriginalFilename();
        uploadFile.transferTo(new File("D:\upload\" + originalFilename));
    }
}
  • step4:编写jsp上传网页
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

    
        Title
    
    
        
名称
文件

在浏览器中访问upload.jsp页面,输入名称和选择上传的文件后:

查看控制台中的输出:

查看服务器磁盘中上传文件夹的内容:

上传成功

二、SpringMVC数据响应

SpringMVC数据响应方式包括页面跳转与回写数据两种方式。

1.页面跳转 (1)直接返回字符串

直接返回字符串,该方式会将返回的字符串与视图解析器的前后缀拼接后进行跳转。

forward:/WEB-INF/views/index.jsp
redirect:/index.jsp
(2)通过ModelAndView对象返回


    
    
    
    
        
        
        
    

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

    
        Title
    
    
        

Success!${username}

package com.itcast.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;

@Controller
public class UserController {
    @RequestMapping("/quickStart")
    public String save() {
        System.out.println("Controller save running....");
        return "success.jsp";//进行jsp跳转
    }

    @RequestMapping("/test1")
    public ModelAndView test1() {
        
        ModelAndView modelAndView = new ModelAndView();
        //1.设置模型数据
        modelAndView.addObject("username", "this is test1!");
        //2.设置视图名称
        modelAndView.setViewName("success");
        return modelAndView;//进行页面跳转
    }

    @RequestMapping("/test2")
    public ModelAndView test2(ModelAndView modelAndView) {
        //springMVC对方法的 参数可以进行相应注入
        modelAndView.addObject("username", "this is test2!");
        modelAndView.setViewName("success");
        return modelAndView;//进行页面跳转
    }

    @RequestMapping("/test3")
    public String test3(Model model) {
        //springMVC对方法的 参数可以进行相应注入
        model.addAttribute("username", "this is test3!");
        return "success";//进行页面跳转
    }

    //使用原始的方法向域中存储数据(不常用)与JavaAPI解耦
    @RequestMapping("/test4")
    public String test4(HttpServletRequest request) {
        //springMVC对方法的 参数可以进行相应注入
        request.setAttribute("username", "this is test4!");
        return "success";//进行页面跳转
    }
}
2.回写数据 (1)直接返回字符串

在web基础阶段客户端访问服务器端,如果想直接回写字符串作为响应体返回使用response.getWriter().print("helloworld")即可

在Controller中直接回写字符串的方法如下:

字符串直接返回需要通过@ResponseBody注解告知SpringMVC框架,返回的字符串不是页面跳转请求(而是在http响应体中返回)

package com.itcast.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.itcast.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Date;

@Controller
public class UserController {
    @RequestMapping("/quickStart")
    public String save() {
        System.out.println("Controller save running....");
        return "success.jsp";//进行jsp跳转
    }

    @RequestMapping("/test1")
    @ResponseBody
    public String test1() {
        return "this is response test1!";
    }

    @RequestMapping("/test2")
    @ResponseBody
    public String test2() throws JsonProcessingException {
        User user = new User();
        user.setId(10);
        user.setName("Tom");
        user.setPassword("123456");
        user.setBirthday(new Date());
        //使用jason转换工具将对象转换成jason格式的字符串 然后返回
        ObjectMapper objectMapper = new ObjectMapper();
        String jason = objectMapper.writeValueAsString(user);
        return jason;
    }
}
(2)返回对象或集合


    
    
    
    
        
        
        
    
    
    
        
            
                
            
        
    

package com.itcast.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.itcast.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Date;

@Controller
public class UserController {
    @RequestMapping("/test2")
    @ResponseBody
    public String test2() throws JsonProcessingException {
        User user = new User();
        user.setId(10);
        user.setName("Tom");
        user.setPassword("123456");
        user.setBirthday(new Date());
        //使用jason转换工具将对象转换成jason格式的字符串 然后返回
        ObjectMapper objectMapper = new ObjectMapper();
        String jason = objectMapper.writeValueAsString(user);
        return jason;
    }

(3)返回对象或集合简化:

使用将自动加载SpringMVC三大组件,可用该标签替代注解处理器和适配器的配置,

同时默认底层就会集成jackson进行对象or集合的json格式字符串转换:



    
    
    
    
        
        
        
    
    
    

package com.itcast.controller;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.itcast.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.Date;

@Controller
public class UserController {
    @RequestMapping("/test3")
    @ResponseBody
    public User test() throws JsonProcessingException {
        User user = new User();
        user.setId(11);
        user.setName("Tim");
        user.setPassword("1234560");
        user.setBirthday(new Date());
        return user;
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/885852.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号