高级参数绑定
参数绑定数组
直接在前台遍历出多个参数,然后提交之后springmvc 会自动封装为一个数组, 我们只用接受就行了, 代码如下
@RequestMapping(value="/item/deletes.action") public ModelAndView deletes(Integer[] ids){ System.out.println(ids.toString()); ModelAndView mv = new ModelAndView(); mv.setViewName("success"); return mv ; }注意: 数组的名称要和前台提交数据的名称一致
通过debug 我们可以看到后台收到的参数
也可以把数组放入包装类中,然后进行存取
参数绑定List 集合
在包装类中封装List 集合 ,注意jsp页面的书写
<td><input type="text" value="${item.name }" name="itemList[${vs.index}].name"></td> <td><input type="number" value="${item.price }" name="itemList[${vs.index}].price" > </td>
springmvc 不支持直接参数绑定 list 直接形参接受
结果如下
然后就可以啦!
@RequestMapping
1.URl 路径映射
@RequestMapping(value="/item/deletes.action")
这里的value 是一个参数是个数组, 可以写多个访问路径 ,比如
@RequestMapping(value={"/item/deletes.action","item/update.action"}
两个路径都可以访问到的
如果只有value 这个属性 ,value 可以省略
2.添加在类上面
在class 上直接写上整个类中所有方法的访问路径 的共同路径 ,
//@RequestMapping("item") public class ItemController // 共同的路径为 item 上
3.请求方法限制
限制请求方式只能为get
@RequestMapping(value="/item/deletes.action",method=RequestMethod.GET)
限制 方式可以是post 可以是get
@RequestMapping(value="/item/deletes.action",method={RequestMethod.GET,RequestMethod.POST})
如果访问的方式不对就会报错
HTTP Status 405 - Request method 'GET' not supported
Controller 层方法返回值1.返回ModelAndView 模型视图对象 , 全局异常处理要用
直接在此对象中添加视图和模型 即可
2. 返回字符串string , 体现了mvc 思想, 官方建议使用
2.1 。直接返回视图的名字 ,如果相带数据直接在接受参数的形参中定义model 对象 ,然后再方法中, addAttrbute()直接添加要加的pojo或者是数据即可
2.3. redirect 重定向 再返回的路径前加上 redirect : 就可以实现重i定向
return "redirect:/itemEdit.action?itemId=" + item.getId();
2.4 . forword 转发 , 再路径前加上froward : 即可
return "forward: /itemEdit.action";
3. void 没有返回值, 用户ajax 前后台交换数据,
1, 可以用转发 和重定向啊, 就原始的servlet 的一套
getRequestDispatcher().forword(request,response);
response.sendRedirect
2 . 可以用ajax 用json 进行前后台互换数据
response.getWriter().print("{\"abc\":123}");
异常处理器
系统中的异常分为两类, 预期异常和运行时异常, RuntimeException ,前者通过不加异常从而获取异常信息, 后者通过规范代码开发, 测试通过手段减少运行时异常发生
spring 为我们提供了一个 异常处理器接口, HandlerExceptionResolver 我们如果要完成异常的处理我们就要实现接口, 实现接口中的方法, 然后把实现的异常处理器类,实例化, 放入spring容器中,
package com.itheima.springmvc.exception; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; public class ExcuptionResolver implements HandlerExceptionResolver { public ModelAndView resolveException(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) { // TODO Auto-generated method stub obj // obj 发生异常的地方, 日志 : 发布war包, Eclipse 2. 发布tomcat 服务器上的linux log4j日志, /** * exception 指的是, 什么异常 ? * */ ModelAndView mv = new ModelAndView() ; mv.addObject("error","未知异常"); mv.setViewName("error"); return mv; } }
在xml中进行配置
<!-- SpringMvc 的异常处理器 --> <bean class="com.itheima.springmvc.exception.ExcuptionResolver"> </bean>预期异常
我们提前加以判断如果不满足条件 就抛出异常 如下
自定义异常类 , 继承 execption
package com.itheima.springmvc.exception; public class MassageExcuption extends Exception { private String msg ; private static final long serialVersionUID = 1L; public MassageExcuption(String msg) { this.msg = msg; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }
然后直接进行编辑异常处理器 判断异常类型
package com.itheima.springmvc.exception; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerExceptionResolver; import org.springframework.web.servlet.ModelAndView; public class ExcuptionResolver implements HandlerExceptionResolver { public ModelAndView resolveException(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception ex) { // TODO Auto-generated method stub obj // obj 发生异常的地方, 日志 : 发布war包, Eclipse 2. 发布tomcat 服务器上的linux log4j日志, /** * exception 指的是, 什么异常 ? * */ ModelAndView mv = new ModelAndView() ; if(ex instanceof MassageExcuption){ MassageExcuption me = (MassageExcuption)ex; mv.addObject("error",me.getMsg()); }else { mv.addObject("error","未知异常"); } mv.setViewName("error"); return mv; } }
上传图片
jsp :
jsp要from 提交开启文件提交的哪个属性
然后name要和后台的方法上的形参对应
controller :
接受参数用形参, 参数的名字和前台的name 对应
@RequestMapping(value = "/updates.action") // public ModelAndView updateitem(Items items){ public String updateitem(QueryVo vo, MultipartFile pictureFile) throws Exception{ //保存图片到 String name = UUID.randomUUID().toString().replaceAll("-", ""); //jpg String ext = FilenameUtils.getExtension(pictureFile.getOriginalFilename()); pictureFile.transferTo(new File ("E:\\upload\\" + name + "." + ext)); vo.getItems().setPic("E:\\upload\\" + name + "." + ext); //修改 itemService.update(vo.getItems()); // ModelAndView mav = new ModelAndView(); // mav.setViewName("success"); return "redirect:/itemEdit.action?id=" + vo.getItems().getId(); // return "forward:/item/itemlist.action"; }
配置文件中要配置文件上传实现类
<!-- 配置文件上串 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="500000"></property> </bean>
导包 : upload 和 io包
json 数据交换
导包 : spring官方声明用这三个包
前台 :
用jquery 进行 编写ajax ,
<script type="text/javascript"> $(function(){ alert(1); var params = '{"id": 1,"name": "测试商品","price": 99.9,"detail": "测试商品描述","pic": "123456.jpg"}'; // $.post(url,params,function(data){ //回调 // },"json");// $.ajax({ url : "${pageContext.request.contextPath }/json.action", data : params, contentType : "application/json;charset=UTF-8",//发送数据的格式 type : "post", dataType : "json",//回调 success : function(data){ alert(data.name); } }); alert(2); }); </script>
记得导入 js 库,
后端 : 直接用spring封装好的方法进行, 直接把json 字符串转换为对象
@RequestMapping(value="/json.action") public @ResponseBody Items ajax(@RequestBody Items items ){ System.out.println(items.getName()); return items; }
@requestMapping 不用解释
@responseBody 返回参数用这个注解
@requestBody 接受spring 把json 转换为的对象使用 ,
RESTful 开发风格
Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
资源:互联网所有的事物都可以被抽象为资源
资源操作:使用POST、DELETE、PUT、GET,使用不同方法对资源进行操作。
分别对应 添加、 删除、修改、查询。
传统方式操作资源
http://127.0.0.1/item/queryItem.action?id=1 查询,GET
http://127.0.0.1/item/saveItem.action 新增,POST
http://127.0.0.1/item/updateItem.action 更新,POST
http://127.0.0.1/item/deleteItem.action?id=1 删除,GET或POST
使用RESTful操作资源
http://127.0.0.1/item/1 查询,GET
http://127.0.0.1/item 新增,POST
http://127.0.0.1/item 更新,PUT
http://127.0.0.1/item/1 删除,DELETE
从url 上获取参数@RequestMapping(value="item/itemEdit{id}.action") public ModelAndView toEdit2( @PathVariable Integer id , HttpServletRequest request,HttpServletResponse response, HttpSession session ,Model model){
直接把参数绑定在路径上 ,然后再参数上添上注解 @pathVariable 然后可以了
拦截器
再进入controller之前,进行数据的一些处理,拦截
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.itheima.springmvc.interceptor.Interceptor1"></bean> </mvc:interceptor> <!-- <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="com.itheima.springmvc.interceptor.Interceptor2"></bean> </mvc:interceptor> --> </mvc:interceptors>
配置之后 ,创建 普通的java类, 然后要实现接口, 实现接口中的三个方法, HandlerInterceptor 这个接口,
preHandle controller层之前的拦截 对请求进行拦截
afterCompletion controller 之后的拦截
postHandle 渲染后拦截