目录
1. 什么是参数绑定
2:使用SpringMVC传递参数
2.1:基本数据类型用法
2.2:包装类型用法
2.3:数组类型用法
2.4:单个对象用法(匹配对象的属性)
2.5 :list对象集合用法,绑定结合需要一个包装类(根据下标匹配)
2.6:Map参数传递,需要包装类,根据key匹配
2.7:Json参数传递
参数绑定,简单来说就是客户端发送请求,而请求中包含一些数据,那么这些数据怎么到达 Controller ?这在实际项目开发中也是用到的最多的,那么 SpringMVC 的参数绑定是怎么实现的呢?下面我们来详细的讲解。
在springMVC之前
首先在使用springMVC之前的servlect时,我们通常在类中继承httpservlect,然后在get,post方法中通过getParameter得到前台页面传递的参数
@WebServlet("/index1")
public class UsersfindServlet extends HttpServlet{
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("进入psot方法");
//通过getParameter方法过去参数,并且只能得到string类型的参数,需要转换
String name=req.getParameter("name");
}
/**
* @param id
* @return
* 基本数据类型用法
* @RequestMapping设置映射
* @ResponseBody设置返回值直接返回,不同跳转新页面
* produces用于设置返回值类型编码是text/plain;charset=UTF-8
* @RequestParam(value="ids",required=false)
* value 绑定了参数对照 required设置参数为非必输
*/
@RequestMapping(value="/IntType",produces="text/plain;charset=UTF-8")
@ResponseBody
public String IntType(@RequestParam(value="ids",required=false) int id) {
System.out.println("基本类型参数绑定值是:"+id);
return "基本类型参数绑定值全额翁是:"+id;
}
测试结果:可以看到ids成功绑定到参数id上了
/**
* @param id
* @return
* 包装类型用法
*/
@RequestMapping(value="/IntegerType",produces= "text/plain;charset=UTF-8")
@ResponseBody
public String IntegerType(@RequestParam(value="id",required=true) int id) {
System.out.println("包装类型参数绑定值是:"+id);
return "包装类型参数绑定值是:"+id;
}
测试结果:可以看到多输入了name=张三,但是参数只接受id,页面显示id的值是6,包装类可以不传递参数
当不传递参数的时候
/**
* @param id
* @return
* 数组类型用法
*/
@RequestMapping(value="/ArrayType",produces="text/plain;charset=UTF-8")
@ResponseBody
public String ArrayType(@RequestParam(required=false) String[] names) {
//System.out.println("包装类型参数绑定值是:"+names);
StringBuffer sb=new StringBuffer();
for(String a:names) {
sb.append("数组值:").append(a).append(",");
}
return "数组类型用法值是:"+sb.toString();
}
测试结果:可以看到多输入了names和name1但是页面只能显示出来names
前台add表单:
后台controller:
/**
* @param id
* @return
* 对象用法(课程表下含有老师信息)
*/
@RequestMapping(value="/EntityType")
@ResponseBody
public ModelAndView EntityType(Course course) {
System.out.println(course.toString());
courseDao.addCourse(course);
ModelAndView andView=new ModelAndView();
andView.addObject("courses", courseDao.getCourse());
andView.setViewName("index");
System.out.println("实体对象类型用法值是:"+ courseDao.getCourse().toString());
return andView;
}
公共dao层代码
@Repository
public class CourseDao {
private Map map = new HashMap();
// 模拟数据库,将数据保存到map
public void addCourse(Course c) {
map.put(c.getId(), c);
}
//返回所有的课程信息
public Collection getCourse() {
return map.values();
}
}
实体代码:
//课程
public class Course {
private int id;//课程id
private String name;//课程名称
private double price;//课程价格
private Teacher teacher;//课程老师信息
//老师
public class Teacher {
private int id;//老师编号
private String name;//老师名字
最后是页面的展示页面:
编号
课程名
价格
讲师
操作
${course.id}
${course.name}
${course.price}
${course.teacher.name}
测试结果:
在add表单中填写数据,点击提交之后
点击提交之后:
如果将课程编号的价格讲师编号写成字符串会报错400,即请求错误,查看浏览器会发现类型不匹配
包装类如下:
public class CourseList {
private List lists;
表单页面lists[0]代表下标为0的第一个实体:
controller代码
/**
* @param id
* @return
* list集合用法,绑定结合需要一个包装类
*/
@RequestMapping(value="/listType")
@ResponseBody
public ModelAndView listType(CourseList list) {
List lsite=list.getLists();
for(Course course:list.getLists()) {
courseDao.addCourse(course);
}
ModelAndView andView=new ModelAndView();
andView.addObject("courses", courseDao.getCourse());
andView.setViewName("index");
System.out.println("List类型用法值是:"+ courseDao.getCourse().toString());
return andView;
}
展示页面为通用代码如上所示,不在重新贴出来:
测试结果如下:
测试结如下:
前台表单:
后台controller:
/**
* @param id
* @return
* Map用法,绑定结合需要一个包装类
* 赋值别名
* @RequestParam(value="id",required=false)
*/
@RequestMapping(value="/mapType2")
public ModelAndView mapType2(@RequestParam Map map) {
int id =Integer.parseInt(map.get("id")) ;
String name = map.get("name");
Double price = Double.valueOf(map.get("price"));
int id1 =Integer.parseInt(map.get("id1")) ;
String name1 = map.get("name1");
Teacher teacher=new Teacher();
teacher.setId(id1);
teacher.setName(name1);
Course courses=new Course();
courses.setId(id);
courses.setName(name);
courses.setPrice(price);
courses.setTeacher(teacher);
Course courses2=new Course();
courses2.setId(id);
courses2.setName(name);
courses2.setPrice(price);
courses2.setTeacher(teacher);
List lsit=new ArrayList();
lsit.add(courses);
lsit.add(courses2);
ModelAndView andView=new ModelAndView();
andView.addObject("courses",lsit);
andView.setViewName("index");
return andView;
}
1:必须导入jackson的jar包
2:在spring配置文件中配置
注解驱动
3:使用@RequestBody 注解将json转换为实体类
4:使用@ResponseBody直接返回
前台ajax:
后端:
/**
* @param id
* @return
* json用法,
* 第一步:需要添加jackson的jar包
* 第二步:需要在springMVC中配置一个消息转换器,将请求参数转换为json
* RequestBody将json映射成实体
*/
@RequestMapping(value="/jsonType")
@ResponseBody
public Course jsonType(@RequestBody Course course,HttpServletRequest request, HttpServletResponse response) {
System.out.println(course.toString());
course.setPrice(course.getPrice()+100);
return course;
}
输出结果可在页面上alert弹出
以上及时springMVC参数传递的各种情况简单案例。