方法的参数类型有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种,分别为ModelAndView、String、JSON、void(void很少用)
这种方式可以同时操作数据和视图,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即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";
}
处理器操作的是数据。这种返回值类型一般是为了相应ajax的。想要操作JSON类型的数据,需要先经过3个步骤的配置:
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-coreartifactId>
<version>2.9.0version>
dependency>
<dependency>
<groupId>com.fasterxml.jackson.coregroupId>
<artifactId>jackson-databindartifactId>
<version>2.9.0version>
dependency>
<mvc:annotation-driven />
下面展示一般类型的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 "返回对象,表示数据";
}