【SSM_SpringMVC】学习笔记04_复杂参数绑定、json数据、异常处理器

一、参数绑定_数组

	//绑定数组
	@RequestMapping("selectArrays.do")
	public void selectArrays(String[] ids) {
		System.out.println(ids.length);
		for (String string : ids) {
			System.out.println(string);
		}
	}
	//绑定包装类数组
		@RequestMapping("selectVoArrays.do")
		public void selectVoArrays(ItemInfoVo vo) {
			System.out.println(vo.getIds().length);
			for (String string : vo.getIds()) {
				System.out.println(string);
			}
		}

二、参数绑定_List

//绑定包装类 List集合
	@RequestMapping("selectVoList.do")
	public void selectVoLists(ItemInfoVo vo) {
		System.out.println("List="+vo.getPriceList().size());
		
		Double totalPrice = 0d;
		for (Double price : vo.getPriceList()) {
			System.out.println(price);
			totalPrice += price;
		}
		System.out.println("总价:"+totalPrice);
	}

总结:从这里可以看出,使用包装类时可以发现,前端使用的参数名,在Controller这里并没有实际出现,而是以包装类vo出现,这时因为包装类中有前端页面所对应的属性。

三、Json数据交互

1、Json在线编辑器:http://www.bejson.com/jsoneditoronline/

2、Json相关包:

3、Json是什么:(源自:http://www.bejson.com/knownjson/aboutjson/

JSON是一种取代XML的数据结构,和xml相比,它更小巧但描述能力却不差,由于它的小巧所以网络传输数据将减少更多流量从而加快速度,

那么,JSON到底是什么?

JSON就是一串字符串 只不过元素会使用特定的符号标注。

{} 双括号表示对象

[] 中括号表示数组

"" 双引号内是属性或值

: 冒号表示后者是前者的值(这个值可以是字符串、数字、也可以是另一个数组或对象)

所以 {"name": "Michael"} 可以理解为是一个包含name为Michael的对象

而[{"name": "Michael"},{"name": "Jerry"}]就表示包含两个对象的数组

当然了,你也可以使用{"name":["Michael","Jerry"]}来简化上面一部,这是一个拥有一个name数组的对象

4、前端:使用ajax接受和发送json数据格式的字符串

//使用ajax接受和发送json格式的字符串
			function jsonData() {
				//json格式的字符串 要传输的数据
				var jsondata = '{"item_id":"9","item_name":"超级玛丽亚","item_type":"闯关","item_price":"99.0"}';
				$.ajax({
					type:"post",
					url:"${pageContext.request.contextPath }/item/jsonData.do",
					//发送的数据格式
					contentType:"application/json;charset=utf-8",
					//回调的格式
					dataType:"json",
					data:jsondata,
					success:function(data){
						alert(data);
						alert(data.item_name);
					}
				});
			}

后台:Controller测试

//使用ajax接受和发送json格式的字符串
	@RequestMapping("jsonData.do")
	@ResponseBody
	public ItemInfo jsonData(@RequestBody ItemInfo item) {
		System.out.println("jsonData:"+item);
		return item;
	}

5、 弹出框json数据格式回显
          前端:

  function editItem(id){
                $.ajax({
                    type:"post",
                    url:"${pageContext.request.contextPath }/item/editItem.do",
                    data:{"id":id},
                    //回调的格式
                    dataType:"json",
                    success:function(data){
                        //alert(data.item_name);
                        $("#edit_item_name").val(data.item_name);
                        $("#edit_item_type").val(data.item_type);
                        $("#edit_item_price").val(data.item_price);
                    }
                });
            }

Controller:

//弹出框 json数据回显
	@RequestMapping("editItem.do")
	@ResponseBody
	public ItemInfo editItem(String id) {
		System.out.println("id="+id);
		return service.selectItemInfoById(id);
	}

6、@RequestBody绑定数组、List

前端页面:
 

<td><input type="text" class="item_name_list" value="${item.item_name }"></td>









			//发送list array数组给后台
			function getNameList(){
				//获取数组数据
				var nameList = new Array();
				//保存数组
				$(".item_name_list").each(function(){
					nameList.push($(this).val());
				});
				//发送给后台
				$.ajax({
					type:"post",
					url:"${pageContext.request.contextPath }/item/getNameList.do",
					contentType:"application/json;charset=utf-8",
					dataType:"json",
					data:JSON.stringify(nameList)
				});
			}

Controller:

/*//@RequestBody 绑定list
	@RequestMapping("getNameList.do")
	public void getNameList(@RequestBody List<String> nameList) {
		System.out.println(nameList.size());
		for (String string : nameList) {
			System.out.println(string);
		}
	}*/
	//@RequestBody 绑定数组
		@RequestMapping("getNameList.do")
		public void getNameList(@RequestBody String[] nameList) {
			System.out.println(nameList.length);
			for (String string : nameList) {
				System.out.println("String name="+string);
			}
		}

二、异常处理器(图来自www.sikiedu.com)

 

 

1、捕获运行时异常、捕获自定义异常

自定义异常类

public class MyException extends Exception{
	//错误消息
	private String msg;

	
	public MyException(String msg) {
		super();
		this.msg = msg;
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}
	
}

自定义实现类MyHandlerExceptionResolver

public class MyHandlerExceptionResolver implements HandlerExceptionResolver {

	@Override
	public ModelAndView resolveException(HttpServletRequest request,
			HttpServletResponse response, 
			Object obj, //obj 异常对象的全包名+类名+方法名
			Exception e) {
		
		ModelAndView mav = new ModelAndView();
		
		//获取异常信息
		String errorMsg = "";
		
		//判断异常信息的类型
		if(e instanceof MyException) {
			//自定义异常
			errorMsg = "自定义异常" +((MyException) e).getMsg() + obj.toString();
		}else {
			//运行时异常
			errorMsg = "运行时异常" + e.getMessage() + obj.toString();
		}
		
		//将异常信息输出到错误页面中
		mav.addObject("error", errorMsg);
		
		//设置要跳转的视图名
		mav.setViewName("error");
		return mav;
	}

}

}

error.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<h1>${error}</h1>
</body>
</html>

最后在applicationContext.xml中添加bean对象,配置异常处理器

<bean class="com.dunka.exception.MyHandlerExceptionResolver"/>

2、使用注解式配置异常处理器

/**
 * 
 * @author Dunka
 * @Time   2019年3月4日
 * @Todo	自定义全局异常处理类
 */
@ControllerAdvice
public class MyGlobalExceptionHandler {
	//处理运行时异常
	@ExceptionHandler(RuntimeException.class)
	@ResponseBody
	String RuntimeException(RuntimeException e) {
		return e.getMessage();
	}
	//处理自定义异常
	@ExceptionHandler(MyException.class)
	String MyHandler(MyException e,Model model) {
		model.addAttribute("error", e.getMsg()+" "+e.getStackTrace()[0]);
		return "error";
	}

}

其中,通过@ControllerAdvice注解使@ExceptionHandler异常处理注解应用到所有使用@RequestMapping的方法上;

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

多啦CCCC梦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值