Spring Mvc 二

  • 参数绑定:
    • 绑定数组:
      • 需求:当选中多个数据进行全部删除的时候,或者是进行多组数据同时操作
      • 前端页面
        <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";
        }

         

  • 异常处理器
    • 异常处理器分类:预期的异常和运行时期的异常(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中可以不写内容

       

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值