SpringMVC_第三章(SpringMVC数据绑定)

目录

1. 什么是参数绑定

2:使用SpringMVC传递参数

2.1:基本数据类型用法

2.2:包装类型用法

2.3:数组类型用法 

2.4:单个对象用法(匹配对象的属性)

2.5 :list对象集合用法,绑定结合需要一个包装类(根据下标匹配)

2.6:Map参数传递,需要包装类,根据key匹配

 2.7:Json参数传递


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>&nbsp;&nbsp;
                            <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参数传递的各种情况简单案例。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值