zoukankan      html  css  js  c++  java
  • SpringMVC入门(二)—— 参数的传递、Controller方法返回值、json数据交互、异常处理、图片上传、拦截器

    一、参数的传递

    1、简单的参数传递

    1  /* @RequestParam用法:入参名字与方法名参数名不一致时使用{
    2   *     value:传入的参数名,required:是否必填,defaultValue:默认值
    3  * }
    4  */
    5  @RequestMapping("itemEdit")
    6  public ModelAndView itemEdit(@RequestParam(value="id",required=true,defaultValue="1")Integer id){....}

    2、Model/ModelMap

     1 /**
     2  * 演示返回String,通过Model/ModelMap返回数据模型
     3  * 跳转修改商品信息页面
     4  * @param id
     5  * @return
     6  */
     7  @RequestMapping("itemEdit")
     8  public String itemEdit(@RequestParam("id")Integer ids,Model m,ModelMap model){ 
     9      //查询商品信息
    10      Item item = itemServices.getItemById(ids);
    11      //通过Model把商品数据返回页面
    12      model.addAttribute("item", item);
    13      //返回String视图名字
    14      return "itemEdit";
    15  }

    3、pojo与包装pojo

    要点:表单提交的name属性必需与pojo的属性名称一致。
     1 /**
     2  * 演示传递pojo参数
     3  * 更新商品信息
     4  * @return
     5  */
     6  @RequestMapping("updateItem")
     7  public String updateItem(Item item,Model model){
     8       //更新商品
     9       itemServices.update(item);
    10       //返回商品模型
    11       model.addAttribute("item", item);
    12       //返回担任提示
    13       model.addAttribute("msg", "修改商品成功");
    14       //返回修改商品页面
    15       return "itemEdit";
    16  }

    4、自定义参数绑定

    ①自定义转换器

     1 /**
     2  * 日期转换器
     3  * S:source 要转换的源类型
     4  * T:目标,要转换成的数据类型
     5  * @author Steven
     6  */
     7 public class DateConvert implements Converter<String, Date> {
     8 
     9     @Override
    10     public Date convert(String source) {
    11         Date result = null;
    12         try {
    13             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    14             result = sdf.parse(source);
    15         } catch (ParseException e) {
    16             e.printStackTrace();
    17         }
    18         return result;
    19     }
    20 }
     ② 配置日期转换器
     1 <!-- 配置注解驱动,相当于同时使用最新处理器映射跟处理器适配器,对json数据响应提供支持 -->
     2     <!-- 使用自定义转换器 -->
     3     <mvc:annotation-driven conversion-service="MyConvert" />
     4     
     5     <!-- 定义转换器 -->
     6     <bean id="MyConvert" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
     7         <property name="converters">
     8             <set>
     9                 <bean class="com.cenobitor.springmvc.utils.DateConvert" />
    10             </set>
    11         </property>
    12     </bean>

    5、数组参数传递

     1 @RequestMapping("/queryItem")
     2 public String queryItem(QueryVo vo,Integer[] ids){
     3      System.out.println(vo);
     4      if (ids != null && ids.length > 0){
     5         for (Integer id : ids) {
     6             System.out.println(id);
     7         }
     8       }
     9       return "itemList";
    10 }

    二、Controller方法返回值

    1、返回ModelAndView

    1 @RequestMapping("itemList")
    2 public ModelAndView queryItemList(){
    3 
    4     ModelAndView modelAndView = new ModelAndView();
    5     modelAndView.setViewName("itemList");
    6     List<Item> list = itemService.getItemList();
    7     modelAndView.addObject("itemList",list);
    8     return modelAndView;
    9 }

    2、返回void:使用原始的request、response处理

    3、返回String 

    ①返回视图的名字

    ②转发,跳转action

    1 @RequestMapping(value = "updateItem",method = RequestMethod.POST)
    2 public String updateItem(Item item, Model model){
    3   model.addAttribute("item",item);
    4   return "forward:/itemEdit.action";
    5 }

    ③重定向,跳转action

    return "redirect:/itemEdit.action";

    三、json数据交互

    1、依赖jar包

    jackson-annotation-2.4.0.jar
    jackson-cort-2.4.0.jar
    jackson-databind-2.4.2.jar

    2、代码演示

     1 /**
     2  * json数据交互演示
     3  * @param item2
     4  * @return
     5  */
     6  @RequestMapping("getItem")
     7  //@ResponseBody把pojo转成json串响应用户
     8  @ResponseBody
     9  //@RequestBody用于接收用户传入json串转成pojo
    10  public Item getItem(@RequestBody Item item2) {
    11       System.out.println("接收到的json商品数据为:" + item2);
    12       Item item = itemServices.getItemById(3);
    13       return item;
    14  }

    四、异常处理

    1、需实现HandlerExceptionResolver 

     1 /**
     2  * 全局异常处理器
     3  * @author Steven
     4  *
     5  */
     6 public class CustomerException implements HandlerExceptionResolver {
     7 
     8     @Override
     9     public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object hanlder,
    10             Exception e) {
    11         //记录日志
    12         e.printStackTrace();
    13         //错误消息 
    14         String msg = "很抱歉,系统发生异常了,请联系管理员";
    15         
    16         //响应用户错误提示
    17         ModelAndView mav = new ModelAndView();
    18         //返回错误消息
    19         mav.addObject("msg", msg);
    20         //响应错误提示页面
    21         mav.setViewName("msg");
    22         return mav;
    23     }
    24 }

    2、在springmvc.xml中配置全局异常处理器

    1 <!-- 配置全局异常处理器 -->
    2 <bean class="com.cenobitor.exception.CustomerException"/>

    五、图片上传

    1、需要支持的jar包

    commons-fileupload-1.2.2.jar
    commons-io-2.4.jar

    2、配置多媒体解析器

        <!-- 配置多媒体处理器 -->
        <!-- 注意:这里id必须填写:multipartResolver -->
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
            <!-- 最大上传文件大小 -->
            <property name="maxUploadSize" value="8388608" />
        </bean>

    3、注意事项

    ① 表单需添加enctype="multipart/form-data" 属性

    ② controller层接收的入参需要添加MultipartFile picFile,其中picFile为表单中对应的文件name属性名。

    ③ 保存图片使用绝对路径,访问使用虚拟路径

    4、controller代码

     1 @RequestMapping(value = "updateItem", method = { RequestMethod.POST, RequestMethod.GET })
     2 public String updateItem(Item item, Model model, MultipartFile picFile) throws Exception {
     3 
     4         // 图片新名字
     5         String name = UUID.randomUUID().toString();
     6         // 图片原名字
     7         String oldName = picFile.getOriginalFilename();
     8         // 后缀名
     9         String exeName = oldName.substring(oldName.lastIndexOf("."));
    10 
    11         File pic = new File("D:\WebWork\" + name + exeName);
    12         // 保存图片到本地磁盘
    13         picFile.transferTo(pic); 
    14         // 更新商品图片信息
    15         item.setPic(name + exeName);
    16 
    17         itemServices.update(item);
    18         model.addAttribute("item", item);
    19         model.addAttribute("msg", "修改商品成功");
    20         return "itemEdit";
    21 }

    六、拦截器

    1、需实现HandlerInterceptor

     1 /**
     2  * 自定义拦截器
     3  * @author Steven
     4  *
     5  */
     6 public class MyInterceptor1 implements HandlerInterceptor {
     7 
     8     //在preHandle方法返回true并且Controller方法完全执行完后被执行
     9     //处理异常、记录日志
    10     @Override
    11     public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
    12             throws Exception {
    13         System.out.println("MyInterceptor1.afterCompletion.....");
    14     }
    15 
    16     //在Controller方法执行后,返回ModelAndView之前被执行
    17     //设置或者清理页面共用参数等等
    18     @Override
    19     public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
    20             throws Exception {
    21         System.out.println("MyInterceptor1.postHandle.....");
    22     }
    23 
    24     //在Controller方法执行前被执行
    25     //登录拦截、权限认证等等
    26     @Override
    27     public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
    28         
    29         System.out.println("MyInterceptor1.preHandle.....");
    30         
    31         //返回true放行,false拦截
    32         return true;
    33     }
    34 
    35 }

    2、在springmvc.xml配置拦截器

     

    1 <!-- 拦截器定义 -->
    2 <mvc:interceptors>
    3         <!-- 定义一个拦截器 -->
    4         <mvc:interceptor>
    5             <!-- path配置</**>拦截所有请求,包括二级以上目录,</*>拦截所有请求,不包括二级以上目录 -->
    6             <mvc:mapping path="/**"/>
    7             <bean class="com.cenobitor.springmvc.interceptor.MyInterceptor1" />
    8         </mvc:interceptor>
    9 </mvc:interceptors>
  • 相关阅读:
    3.5星|津巴多《时间的悖论》:未来导向的人更有可能取得个人的成功,但帮助他人的可能性更小
    成功的销售必须在失败时也能快乐:4星|《哈佛商业评论》2018年第4期
    被取代的金融工作岗位越来越多:3星|《被人工智能操控的金融业》
    比特币和区块链是泡沫,但是短期内不会破:4星|《财经》2018年第7期
    点赞是当代可卡因:3星|《欲罢不能:刷屏时代如何摆脱行为上瘾》
    如何使用GetManifestResourceStream
    隐藏光标与获得光标2----获得光标所在的控件
    端口是否使用
    是否联网以及热点问题
    注册表操作
  • 原文地址:https://www.cnblogs.com/gdwkong/p/8977884.html
Copyright © 2011-2022 走看看