目录
2.5 :list对象集合用法,绑定结合需要一个包装类(根据下标匹配)
1. 什么是参数绑定
参数绑定,简单来说就是客户端发送请求,而请求中包含一些数据,那么这些数据怎么到达 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");
}
2:使用SpringMVC传递参数
2.1:基本数据类型用法
/**
* @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上了
2.2:包装类型用法
/**
* @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,包装类可以不传递参数
当不传递参数的时候
2.3:数组类型用法
/**
* @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
2.4:单个对象用法(匹配对象的属性)
前台add表单:
<form class="form-horizontal" role="form" action="EntityType" method="post">
<div class="form-group">
<label class="col-sm-1 control-label">课程编号</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="id" placeholder="请输入课程编号">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">课程名称</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="name" placeholder="请输入课程名称">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">课程价格</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="price" placeholder="请输入课程价格">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">讲师编号</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="teacher.id" placeholder="请输入间讲师编号">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">讲师姓名</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="teacher.name" placeholder="请输入讲师姓名">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-1 col-sm-3">
<button type="submit" class="btn btn-default">提交</button>
</div>
</div>
</form>
后台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<Integer, Course> map = new HashMap<Integer, Course>();
// 模拟数据库,将数据保存到map
public void addCourse(Course c) {
map.put(c.getId(), c);
}
//返回所有的课程信息
public Collection<Course> 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;//老师名字
最后是页面的展示页面:
<table class="table table-hover" id="emps_table">
<thead>
<tr>
<th>
<input type="checkbox" id="check_all"/>
</th>
<th>编号</th>
<th>课程名</th>
<th>价格</th>
<th>讲师</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<c:forEach items="${courses}" var="course">
<tr>
<td><input type='checkbox' class='check_item'/></td>
<td>${course.id}</td>
<td>${course.name}</td>
<td>${course.price}</td>
<!-- 此处采取级联处理 -->
<td>${course.teacher.name}</td>
<td>
<button class="btn btn-primary btn-sm edit_btn">
<span class="glyphicon glyphicon-pencil">编辑</span>
</button>
<button class="btn btn-danger btn-sm delete_btn">
<span class="glyphicon glyphicon-trash">删除</span>
</button>
</td>
</tr>
</c:forEach>
</tbody>
</table>
测试结果:
在add表单中填写数据,点击提交之后
点击提交之后:
如果将课程编号的价格讲师编号写成字符串会报错400,即请求错误,查看浏览器会发现类型不匹配
2.5 :list对象集合用法,绑定结合需要一个包装类(根据下标匹配)
包装类如下:
public class CourseList {
private List<Course> lists;
表单页面lists[0]代表下标为0的第一个实体:
<form class="form-horizontal" role="form" action="listType" method="post">
<div class="form-group">
<label class="col-sm-1 control-label">1课程编号</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="lists[0].id" placeholder="1请输入课程编号">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">1课程名称</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="lists[0].name" placeholder="1请输入课程名称">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">1课程价格</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="lists[0].price" placeholder="1请输入课程价格">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">1讲师编号</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="lists[0].teacher.id" placeholder="1请输入讲师编号">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">1讲师姓名</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="lists[0].teacher.name" placeholder="请输入讲师姓名">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">2课程编号</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="lists[1].id" placeholder="2请输入课程编号">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">2课程名称</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="lists[1].name" placeholder="2请输入课程名称">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">2课程价格</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="lists[1].price" placeholder="2请输入课程价格">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">2讲师编号</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="lists[1].teacher.id" placeholder="2请输入讲师编号">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">2讲师姓名</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="lists[1].teacher.name" placeholder="2请输入讲师姓名">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-1 col-sm-3">
<button type="submit" class="btn btn-default">提交</button>
</div>
</div>
</form>
controller代码
/**
* @param id
* @return
* list集合用法,绑定结合需要一个包装类
*/
@RequestMapping(value="/listType")
@ResponseBody
public ModelAndView listType(CourseList list) {
List<Course> 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;
}
展示页面为通用代码如上所示,不在重新贴出来:
测试结果如下:
测试结如下:
2.6:Map参数传递,需要包装类,根据key匹配
前台表单:
<form class="form-horizontal" role="form" action="mapType2" method="post">
<div class="form-group">
<label class="col-sm-1 control-label">1课程编号</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="id" placeholder="请输入课程编号">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">1课程名称</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="name" placeholder="请输入课程名称">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">1课程价格</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="price" placeholder="请输入课程价格">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">1讲师编号</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="id1" placeholder="请输入讲师编号">
</div>
</div>
<div class="form-group">
<label class="col-sm-1 control-label">1讲师姓名</label>
<div class="col-sm-3">
<input type="text" class="form-control" name="name1" placeholder="请输入讲师姓名">
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-1 col-sm-3">
<button type="submit" class="btn btn-default">提交</button>
</div>
</div>
</form>
后台controller:
/**
* @param id
* @return
* Map用法,绑定结合需要一个包装类
* 赋值别名
* @RequestParam(value="id",required=false)
*/
@RequestMapping(value="/mapType2")
public ModelAndView mapType2(@RequestParam Map<String,String> 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<Course> lsit=new ArrayList<Course>();
lsit.add(courses);
lsit.add(courses2);
ModelAndView andView=new ModelAndView();
andView.addObject("courses",lsit);
andView.setViewName("index");
return andView;
}
2.7:Json参数传递
1:必须导入jackson的jar包
2:在spring配置文件中配置<mvc:annotation-driven />
注解驱动
3:使用@RequestBody 注解将json转换为实体类
4:使用@ResponseBody直接返回
前台ajax:
<script type="text/javascript">
$(function(){
var course = {
"id":"1",
"name":"语文",
"price":"200.333",
"teacher":{
"id":"12",
"name":"马云"
}
};
$.ajax({
url:"jsonType",
data:JSON.stringify(course),
type:"post",
contentType:"application/json;charse=UTF-8",
dataType:"json",
success:function(data){
alert(data.name+"---"+data.price+"-老师名字--"+data.teacher.name);
}
})
})
</script>
后端:
/**
* @param id
* @return
* json用法,
* 第一步:需要添加jackson的jar包
* 第二步:需要在springMVC中配置一个消息转换器,将请求参数转换为json
<mvc:annotation-driven><!-- mvc注解驱动 -->
<mvc:message-converters><!--mvc报文转换器 -->
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
</mvc:message-converters>
</mvc:annotation-driven>
* 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参数传递的各种情况简单案例。