一、参数绑定_数组
//绑定数组
@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的方法上;