- 参数绑定:
- 绑定数组:
- 需求:当选中多个数据进行全部删除的时候,或者是进行多组数据同时操作
- 前端页面
<input type="checkbox" name="ids" value="${item.id }">
-
控制器
@RequestMapping("/queryitem") public String queryItem(QueryVo queryVo, String[] ids) { return "success"; } Controller方法中可以用String[]接收,或者pojo的String[]属性接收。 ------------------------------------------------------- public class QueryVo { private String[] ids; }
-
将表单的数据绑定到List
-
需求分析:批量修改商品信息数据
-
实体类:
public class QueryVo { private List<Items> itemList; }
-
前端页面:
<c:forEach items="${itemList }" var="item" varStatus="s"> <tr> <td> <input type="hidden" name="itemList[${s.index}].id" value="${item.id }"> <input type="text" name="itemList[${s.index}].name" value="${item.name }"> </td> <td><input type="text" name="itemList[${s.index}].price" value="${item.price }"></td> </tr> </c:forEach> name属性必须是包装pojo的list属性+下标+元素属性。 这样设置name的原因是,在提交的数据的时候,会直接提交到对应的实体数组中
-
控制器
@RequestMapping("/queryitem") public String queryItem(QueryVo queryVo) { return "success"; } 注意:接收List类型的数据必须是pojo的属性,方法的形参为List类型无法正确接收到数据。
-
-
@equestMapping
-
Url路径映射:
@RequestMapping(value="/item") 或 @RequestMapping("/item) value的值是数组,可以将多个url映射到同一个方法
-
窄化请求映射
在class上添加@RequestMapping(url)指定通用请求前缀, 限制此类下的所有方法请求url必须以请求前缀开头,通过此方法对url进行分类管理。 如下: @RequestMapping放在类名上边,设置请求前缀 @Controller @RequestMapping("/item") 方法名上边设置请求映射url: @RequestMapping放在方法名上边,如下: @RequestMapping("/queryItem ") 访问地址为:/item/queryItem
-
请求方法限定
限定GET方法 @RequestMapping(method = RequestMethod.GET) 限定POST方法 @RequestMapping(method = RequestMethod.POST) GET和POST都可以 @RequestMapping(method={RequestMethod.GET,RequestMethod.POST}) 注意:设置限定请求方法后,请求方式不匹配会抛异常
-
- 绑定数组:
- Controller方法的返回值
- 返回ModelAndView
@RequestMapping("/itemList") public ModelAndView getItemList() throws Exception { List<Items> itemList = itemService.getItemList(); //把结果传递给页面 ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("itemList", itemList); //设置逻辑视图 modelAndView.setViewName("itemList"); //返回结果 return modelAndView; } controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view。
- 返回void
@RequestMapping("/itemList2") public void itemList2(HttpServletRequest request, HttpServletResponse response) throws Exception { request.getRequestDispatcher("/WEB-INF/jsp/itemList.jsp").forward(request, response);*/ PrintWriter writer = response.getWriter(); response.setCharacterEncoding("utf-8"); response.setContentType("application/json;charset=utf-8"); writer.write("{\"id\":\"123\"}"); } 在controller方法形参上可以定义request和response,使用request或response指定响应结果:
- 返回字符串
- 返回逻辑视图的名称
@RequestMapping("/itemEdit") public String editItem(Model model) { Items items = itemService.getItemById(ids); //把数据传递给页面 model.addAttribute("item", items); //返回逻辑视图 return "editItem"; } controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
- 重定向
@RequestMapping(value="/updateitem") public String updateItem() throws Exception { //redirect页面跳转 return "redirect:/item/itemList.action"; }
- 返回逻辑视图的名称
- 返回ModelAndView
- 异常处理器
- 异常处理器分类:预期的异常和运行时期的异常(RuntimeExcpetion),预期的异常可以通过捕获进行减少,而运行时期异常则需要通过测试来减少,系统的Dao、server、controller中出现都通过throws Exception向上抛出,最后由Spring Mvc的前端控制器交由异常处理器进行处理。
- 自定义异常类:为了区别不同的异常,通常根据异常类型自定义异常类,使用的时候在需要抛出异常的地方创建该对象的实体,然后进行使用。参考博客:https://www.cnblogs.com/evens-word/p/7991329.html,
public class CustomerException extends Exception { private String expMessage; public CustomerException() { } public CustomerException(String msg) { this.expMessage = msg; } public String getExpMessage() { return expMessage; } public void setExpMessage(String expMessage) { this.expMessage = expMessage; } }
- 自定义全局异常处理器 HandlerExceptionResolver:
public class GlobalExceptionResolver implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) { //判断异常的种类 String msg = null; if (exception instanceof CustomerException) { CustomerException custExp = (CustomerException) exception; msg = custExp.getExpMessage(); } else { //如果时候自定义异常,取错误消息 //如果时候运行时异常,取错误的堆栈。 exception.printStackTrace(); StringWriter s = new StringWriter(); PrintWriter printWriter = new PrintWriter(s); exception.printStackTrace(printWriter); msg = s.toString(); } //写日志、发短信、发邮件 //... //返回一个错误页面,显示错误消息 表示跳转到 error 页面,原因是设置了视图解析器 ModelAndView modelAndView = new ModelAndView(); modelAndView.addObject("msg", msg); modelAndView.setViewName("error"); return modelAndView; } }
-
错误页面: 当发生错误的时候,直接在全局异常处理器中,进行设置要跳转的页面
-
web.xml中设置:就是将自定义的全局异常处理器,交给sprin去管理即可。
<bean class="com.itheima.springmvc.exception.GlobalExceptionResolver"/>
-
文件上传:
-
所依赖的jar 包 : commons-fileupload.jar 、 commons-io.jar
-
文件解析器:
<!-- 文件上传 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 设置上传文件的最大尺寸为5MB --> <property name="maxUploadSize"> <value>5242880</value> </property> </bean>
-
页面文件上传的内容:
<form method="post" enctype="multipart/form-data"> <input type="file" name="picture"/> </form> 注意: 1、表单post提交 2、类型multipart/form-data 3、file的name与controller形参一致
-
Controller: 在使用的时候,参数名称需要跟页面文件上传的name一致,不然页面传递的数据Controller接收不到
@RequestMapping(value="/updateitem") public String updateItem(MultipartFile picture ) throws Exception { //随机生成文件名 String picName = UUID.randomUUID().toString(); //获取文件名 String oriName = picture.getOriginalFilename(); //取文件扩展名 String extName = oriName.substring(oriName.lastIndexOf(".")); //保存文件 picture.transferTo(new File("C:\\temp\\images\\" + picName + extName)); //redirect页面跳转 return "redirect:/item/itemList.action"; }
-
-
Json数据交互
-
@RequestBody: 将页面传递的字符串解析成对象,前提是页面传递的字符串必须是Key-Value的形式,Key的值需要和实体的属性一致,才会映射到实体中,如果传递的不是Json会报错
-
@ResponseBody:表示将数据按照json的形式发送到前端
-
依赖的Jar包:Springmvc默认用MappingJacksonHttpMessageConverter对json数据进行转换,需要加入jackson的包
-
非注解开发:
<!--注解适配器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean> </list> </property> </bean> 注意:如果使用<mvc:annotation-driven /> 则不用定义上边的内容。
-
页面的Ajax发送数据
$.ajax({ type:"post", url:"${pageContext.request.contextPath }/item/jsontest.action", data:'{"id":1,"name":"电冰箱","price":1999.0}', contentType:"application/json;charset=utf-8", success:function(data){ alert(data.id +":" +data.name); } });
-
Controller
@RequestMapping("/jsontest") @ResponseBody public Items jsonTest(@RequestBody Items items) { return items; }
-
-
拦截器:
-
作用:Spring Mvc 的拦截器,相当于Servlet中的Fiter,用于对处理器进行预处理和后处理
-
自定义拦截器:自定义拦截器实现接口,有三个方法
-
preHandle:Controller 执行前调用该方法,返回true表示继续执行,返回false表示终止,
-
postHandle:Controller执行后但是未返回视图前调用该方法,可用于将数据再进行操作,然后返回到页面显示
-
afterCompletion:当proHandle返回true的时候才会执行, 可以得到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> 注意事项: 多个拦截器,顺序执行
-
-
静态资源访问:
-
/ 和 /* 的区别: / 在访问静态资源的时候,是不会拦截jsp页面的,但是 /* 是拦截所有的请求的页面,包括jsp页面
-
配置静态资源访问: 在DispatchServlet中配置的 url-pattern 就是用来进行设置 静态资源访问的方式
-
设置静态资源的映射路径,对指定的资源访问路径进行映射:
<mvc:resources location="/WEB-INF/js/" mapping="/js/**"/> <mvc:resources location="/html/" mapping="/html/**"/> location 表示访问的路径,mapping表示请求的路径
-
-
RestFul
-
介绍:一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。它主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。
-
例如:
@RequestMapping("/itemEdit/{id}") //如果id和方法的形参一致@PathVariable中可以不写内容 public String editItem(@PathVariable("id") Integer iid, Model model) { Items items = itemService.getItemById(iid); //把数据传递给页面 model.addAttribute("item", items); //返回逻辑视图 return "editItem"; } 注意事项: {id}:占位符 @PathVariable:用于将请求URL中的模板变量映射到功能处理方法的参数上 如果路径占位符中的变量和方法的形参一致@PathVariable中可以不写内容
-