springmvc中的controller方法的传参方式、返回值类型总结

3种传参方式

方法的参数类型有3种,分别为HttpServletResquest类型的request、HttpServletResponse类型的response、自定义类型参数。前两种参数可以选择性传入,不传也行。下面展示自定义参数传入的3中方法。下面为3种传参的方式,与mybatis的传参方式是一致的

package com.bjpowernode.controller;

import ...

/**
 * @ClassName MyController
 * @Description 当@RequestMapping中有公共的部分时,可以将公共部分放到类的上边
 * @Author hhwu
 * @Date 2022/3/10 13:04
 * Version 1.0
 **/

@Controller//创建处理器对象,和@Service,@Component一样
@RequestMapping("/user")//当方法上的@RequestMapping中有公共的部分时,可以将公共部分抽取放到类的上边,更加方便易辨别
public class MyController {

    @RequestMapping(value = {"/receiveproperty.do"})//不指定请求方式时没有限制
    public ModelAndView doThird(String name, Integer age) {
        /**
         * @Author hhwu
         * @Description //TODO 使用形参名和请求参数名一样的方式接收请求参数
         * @Date 9:22 2022/3/11
         * @Param [name, age]
         * @return org.springframework.web.servlet.ModelAndView
         **/
        ModelAndView mv = new ModelAndView();
        mv.addObject("myname", name);//用post传过来的中文会乱码,get方式不会,用过滤器可以解决post乱码问题
        mv.addObject("myage", age);
        mv.setViewName("show");
        return mv;
    }

    @RequestMapping(value = {"/receiveparam.do"})//不指定请求方式时没有限制
    public ModelAndView doReceiveParam(@RequestParam(value = "cname", required = false) String name, @RequestParam(value = "cage",required = false) Integer age) {
        /**
         * @Author hhwu
         * @Description //TODO 使用@RequestParam注解的方式映射请求参数和形参,来接收请求参数
         * @Date 9:23 2022/3/11
         * @Param [name, age]
         * @return org.springframework.web.servlet.ModelAndView
         **/
        ModelAndView mv = new ModelAndView();
        mv.addObject("myname", name);
        mv.addObject("myage", age);
        mv.setViewName("show");
        return mv;
    }

    @RequestMapping(value = {"/receiveobject.do"})//不指定请求方式时没有限制
    public ModelAndView doReceiveObject(Student student) {
        /**
         * @Author hhwu
         * @Description //TODO 使用java对象接收请求参数,student对象会自动接收请求参数,并调用set方法进行赋值
         * @Date 9:23 2022/3/11
         * @Param [name, age]
         * @return org.springframework.web.servlet.ModelAndView
         **/
        ModelAndView mv = new ModelAndView();
        mv.addObject("myname", student.getName());
        mv.addObject("myage", student.getAge());
        mv.setViewName("show");
        return mv;
    }
}

4种返回值类型

一共4种,分别为ModelAndView、String、JSON、void(void很少用)

ModelAndView

这种方式可以同时操作数据和视图,addObject()方法可以间接给response设置携带数据,setViewName()方法可以执行转发视图的操作。

@Controller//创建处理器对象,和@Service,@Component一样
@RequestMapping("/user")//当方法上的@RequestMapping中有公共的部分时,可以将公共部分抽取放到类的上边,更加方便易辨别
public class MyController {

    @RequestMapping(value = {"/receiveobject.do"})//不指定请求方式时没有限制
    public ModelAndView doReceiveObject(Student student) {
        /**
         * @Author hhwu
         * @Description //TODO 使用java对象接收请求参数,student对象会自动接收请求参数,并调用set方法进行赋值
         * @Date 9:23 2022/3/11
         * @Param [name, age]
         * @return org.springframework.web.servlet.ModelAndView
         **/
        ModelAndView mv = new ModelAndView();
        mv.addObject("myname", student.getName());//用post传过来的中文会乱码,get方式不会,用过滤器可以解决post乱码问题
        mv.addObject("myage", student.getAge());
        mv.setViewName("show");
        return mv;
    }

	@RequestMapping(value = {"/receiveobject1.do"})//不指定请求方式时没有限制
    public String doReceiveObject1(Model model, Student student) {
        /**
         * @Author hhwu
         * @Description //TODO 等价于上边的操作,只是把Model和View分开了
         * @Date 9:23 2022/3/11
         * @Param [name, age]
         * @return org.springframework.web.servlet.ModelAndView
         **/
        model.addAttribute("myname", student.getName());
        model.addAttribute("myage", student.getAge());
        return "show";
    }
}

String

处理器操作的是视图。返回String即show,表示逻辑视图名称(***/show.jsp),需要在springmvc.xml配置视图解析器如果直接返回完整视图路径,则不能配置视图解析器,否则会有重复路径。
返回视图相当于转发给视图进行执行。

这种方式可以通过传入request形参,调用setAttribute()方法来操作数据,模仿modelandview的方式

@RequestMapping(value = {"/returnString.do"})//不指定请求方式时没有限制
    public String doReceiveObject(HttpServletRequest request, Student student) {
        /**
         * @Author hhwu
         * @Description //TODO 处理器方法返回string即show,表示逻辑视图名称,需要在springmvc.xml配置视图解析器
         * 如果直接返回完整视图路径,则不能配置视图解析器,否则会有重复路径
         * @Date 9:23 2022/3/11
         * @Param [name, age]
         * @return org.springframework.web.servlet.ModelAndView
         **/
        //使用request域也可以接收参数,手动添加
        request.setAttribute("myname", student.getName());
        request.setAttribute("myage", student.getAge());
        System.out.println("name:"+student.getName()+" age:"+student.getAge());
        return "show";
    }

JSON

处理器操作的是数据。这种返回值类型一般是为了相应ajax的。想要操作JSON类型的数据,需要先经过3个步骤的配置:

  1. 导入依赖包及jQuery文件
<!--    Jackson依赖,处理json-->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
  1. 在springmvc.xml中加入注解驱动
<!--    创建  对象转换为json格式  的注解驱动-->
    <mvc:annotation-driven />
  1. 在controller方法上加入@ResponseBody注解

下面展示一般类型的JSON返回、集合类型的JSON返回、字符串类型的JSON返回,在前端接收ajax相应时,datatype需要设置为JSON的。

注意,对于最后一种方式,虽然返回值类型是String,但是因为加了@ResponseBody注解,所以操作的不是视图。同时前端在接收ajax响应时需要指定datatype为text,而不是JSON:


    @ResponseBody//将处理器返回的json,通过httpservletresponse输出给浏览器
    @RequestMapping(value = "/returnStudentJson.do")
    public Student doStudentJsonObject(String name, Integer age) {
        /**
         * @Author hhwu
         * @Description //TODO 处理器方法返回一个student对象,通过框架转为json,相应ajax请求,参考readme.txt,因为实现已经导入了依赖和注册了驱动
         * @Date 17:59 2022/3/11
         * @Param [name, age]
         * @return com.bjpowernode.vo.Student
         **/
        //模拟获取到的student数据
        Student student = new Student();
        student.setName("李四");
        student.setAge(4);
        return student;//会被框架自动转为json
    }

    @ResponseBody//将处理器返回的json,通过httpservletresponse输出给浏览器
    @RequestMapping(value = "/returnStudentJsonArray.do")
    public List<Student> doStudentJsonObjectArray (String name, Integer age) {
        /**
         * @Author hhwu
         * @Description //TODO 处理器方法返回一个student集合
         * @Date 17:59 2022/3/11
         * @Param [name, age]
         * @return com.bjpowernode.vo.Student
         **/
        //模拟获取到的student数据
        ArrayList<Student> list = new ArrayList<>();
        Student student = new Student();
        student.setName("李四");
        student.setAge(4);
        list.add(student);

        Student student1 = new Student();
        student1.setName("张三");
        student1.setAge(3);
        list.add(student1);

        return list;
    }

    @ResponseBody
    //设置字符串的编码方式和过滤器的编码方式一致,否则乱码
    @RequestMapping(value = "/returnStringData.do", produces = "text/plain;charset=UTF-8")
    public String doStringData(String name, Integer age) {
        return "返回对象,表示数据";
    }
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

毋小黑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值