高级参数绑定
参数绑定数组
直接在前台遍历出多个参数,然后提交之后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 渲染后拦截