1,数据回显

SpringMvc包含三种数据回显机制

第一种:对于简单数据类型,如:Integer、String、Float等使用Model将传入的参数再放到request域实现显示。

(回顾jsp四大域:ServletContext context域、HttpServletRequet request域、HttpSession session域、PageContext page域)

@RequestMapping(value="/editItems",method={RequestMethod.GET})
public String editItems(Model model,Integer id)throws Exception{//传入的id重新放到request域model.addAttribute("id", id);
}

第二种:对于Pojo类型,SpringMvc 默认支持方法参数中的pojo类型的参数回显。自动将形参中的pojo类放入jsp页面request域中。

request的key为pojo的类名(首字母小写)

@RequestMapping("/editItemSubmit")
public String editItemSubmit(Integer id,ItemsCustom itemsCustom)throws Exception{//...
}
springmvc自动将itemsCustom放回request,相当于调用下边的代码:
model.addAttribute("itemsCustom", itemsCustom);

第三种:对于方法返回值 暴露为模型数据传到视图页面

//商品分类
@ModelAttribute("itemtypes")
public Map<String, String> getItemTypes(){Map<String, String> itemTypes = new HashMap<String,String>();itemTypes.put("101", "数码");itemTypes.put("102", "母婴");return itemTypes;
}

2,异常处理

springmvc在处理请求过程中出现异常信息交由异常处理器进行处理,自定义异常处理器可以实现一个系统的异常处理逻辑。

系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。

系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理,如下图:

第一步:自定义异常类

为了区别不同的异常通常根据异常类型自定义异常类,这里我们创建一个自定义系统异常,如果controller、service、dao抛出此类异常说明是系统预期处理的异常信息。

public class CustomException extends Exception {/** serialVersionUID*/private static final long serialVersionUID = -5212079010855161498L;public CustomException(String message){super(message);this.message = message;}//异常信息private String message;public String getMessage() {return message;}public void setMessage(String message) {this.message = message;}
}

第二步:定义自定义异常处理器

public class CustomExceptionResolver implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex) {ex.printStackTrace();CustomException customException = null;//如果抛出的是系统自定义异常则直接转换if(ex instanceof CustomException){customException = (CustomException)ex;}else{//如果抛出的不是系统自定义异常则重新构造一个未知错误异常。customException = new CustomException("未知错误,请与系统管理 员联系!");}ModelAndView modelAndView = new ModelAndView();modelAndView.addObject("message", customException.getMessage());modelAndView.setViewName("error");return modelAndView;}}

前台页面

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt"  prefix="fmt"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>错误页面</title></head>
<body>
您的操作出现错误如下:<br/>
${message }
</body></html>

第三步:异常处理器配置

在springmvc.xml中添加:

<!-- 异常处理器 --><bean id="handlerExceptionResolver" class="com.xiaohui.exceptionResolver.CustomExceptionResolver"/>

3,文件上传

第一步:配置文件上传解析器:

<!-- 文件上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 设置上传文件的最大尺寸为5MB --><property name="maxUploadSize"><value>5242880</value></property>
</bean>

第二步:导入解析器依赖jar包

CommonsMultipartResolver解析器依赖commons-fileupload和commons-io,加入如下jar包:

第三步:编写上传文件Controller方法:

//商品修改提交
@RequestMapping("/editItemSubmit")
public String editItemSubmit(Items items, MultipartFile pictureFile)throws Exception{//原始文件名称String pictureFile_name =  pictureFile.getOriginalFilename();//新文件名称String newFileName = UUID.randomUUID().toString()+pictureFile_name.substring(pictureFile_name.lastIndexOf("."));//上传图片File uploadPic = new java.io.File("F:/develop/upload/temp/"+newFileName);if(!uploadPic.exists()){uploadPic.mkdirs();}//向磁盘写文件pictureFile.transferTo(uploadPic);//.....
}

前台页面:

form添加enctype="multipart/form-data":
<form id="itemForm"action="${pageContext.request.contextPath }/item/editItemSubmit.action"method="post" enctype="multipart/form-data"><input type="hidden" name="pic" value="${item.pic }" />
</from>file的name与controller形参一致:
<tr><td>商品图片</td><td><c:if test="${item.pic !=null}"><img src="/pic/${item.pic}" width=100 height=100 /><br/></c:if> <input type="file" name="pictureFile" /></td>
</tr>

5,JSON交互

@RequestBody:

@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容转换为json、xml等格式的数据并绑定到controller方法的参数上。

@ResponseBody

该注解用于将Controller的方法返回的对象,通过HttpMessageConverter接口转换为指定格式的数据如:json,xml等,通过Response响应给客户端

场景1:请求参数为json,响应结果为json实现

第一步:环境准备

Springmvc默认用MappingJacksonHttpMessageConverter对json数据进行转换,需要加入jackson的包,如下

第二步:配置json转换器

在注解适配器中加入messageConverters

<!--注解适配器 -->
<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 /> 则不用定义上边的内容。

第三步:controller编写

// 商品修改提交json信息,响应json信息
@RequestMapping("/editItemSubmit_RequestJson")
public @ResponseBody Items editItemSubmit_RequestJson(@RequestBody Items items) throws Exception {System.out.println(items);//itemService.saveItem(items);return items;
}

地四步:页面ajax如下:

//请求json响应json
function request_json(){$.ajax({type:"post",url:"${pageContext.request.contextPath }/item/editItemSubmit_RequestJson.action",contentType:"application/json;charset=utf-8",data:'{"name":"测试商品","price":99.9}',success:function(data){console.log(data);}});
}

场景二:请求参数形式为 键值对非json格式

步骤一、二 同上。

步骤三 controller编写

// 商品修改提交,提交普通form表单数据,响应json
@RequestMapping("/editItemSubmit_ResponseJson")
public @ResponseBody Items editItemSubmit_ResponseJson(Items items) throws Exception {System.out.println(items);// itemService.saveItem(items);return items;
}

步骤四:页面js ajax方法编写

function formsubmit(){var user = " name=测试商品&price=99.9";alert(user);$.ajax({type:'post',//这里改为get也可以正常执行url:'${pageContext.request.contextPath}/item/ editItemSubmit_RequestJson.action',
//ContentType没指定将默认为:application/x-www-form-urlencodeddata:user,success:function(data){alert(data.name);}}   )
}

从上边的js代码看出,已去掉ContentType的定义,ContentType默认为:application/x-www-form-urlencoded格式。

6,RESTful

采用的为模板模式映射。

@RequestMapping(value="/ viewItems/{id}"):{×××}占位符,请求的URL可以是“/viewItems/1”或“/viewItems/2”,通过在方法中使用@PathVariable获取{×××}中的×××变量。

@PathVariable用于将请求URL中的模板变量映射到功能处理方法的参数上。

@RequestMapping("/viewItems/{id}")
public @ResponseBody viewItems(@PathVariable("id") String id,Model model) throws Exception{//方法中使用@PathVariable获取useried的值,使用model传回页面//调用 service查询商品信息ItemsCustom itemsCustom = itemsService.findItemsById(id);return itemsCustom;
}

如果RequestMapping中表示为"/viewItems/{id}",id和形参名称一致,@PathVariable不用指定名称。

7,拦截器

Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。

拦截器定义:实现HandlerInterceptor接口,如下

Public class HandlerInterceptor1 implements HandlerInterceptor{/*** controller执行前调用此方法* 返回true表示继续执行,返回false中止执行* 这里可以加入登录校验、权限拦截等*/@OverridePublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {// TODO Auto-generated method stubReturn false;}/*** controller执行后但未返回视图前调用此方法* 这里可在返回用户前对模型数据进行加工处理,比如这里加入公用信息以便页面显示*/@OverridePublic void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {// TODO Auto-generated method stub}/*** controller执行后且视图返回后调用此方法* 这里可得到执行controller时的异常信息* 这里可记录操作日志,资源清理等*/@OverridePublic void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)throws Exception {// TODO Auto-generated method stub}}

拦截器配置:

第一种:针对某种mapping配置拦截器

<beanclass="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"><property name="interceptors"><list><ref bean="handlerInterceptor1"/><ref bean="handlerInterceptor2"/></list></property>
</bean>
<bean id="handlerInterceptor1" class="springmvc.intercapter.HandlerInterceptor1"/>
<bean id="handlerInterceptor2" class="springmvc.intercapter.HandlerInterceptor2"/>

第二种:针对所有配置全局拦截器:

<!--拦截器 -->
<mvc:interceptors><!--多个拦截器,顺序执行 --><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.xiaohui.filter.HandlerInterceptor1"></bean></mvc:interceptor><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.xiaohui.filter.HandlerInterceptor2"></bean></mvc:interceptor>
</mvc:interceptors>

测试运行打印结果

HandlerInterceptor1..preHandle..
HandlerInterceptor2..preHandle..HandlerInterceptor2..postHandle..
HandlerInterceptor1..postHandle..HandlerInterceptor2..afterCompletion..
HandlerInterceptor1..afterCompletion..

Spring Mvc 数据回显、异常处理、文件上传、json交互、ResTful、拦截器的使用(高级三)相关推荐

  1. Spring MVC 数据回显

    springmvc 的数据回显 原创 2015年08月02日 11:39:00 标签: springmvc 1        数据回显 1.1    什么数据回显 提交后,如果出现错误,将刚才提交的数 ...

  2. themyleaf 图片上传_javaEE --springboot #实现图片上传和回显 #单文件上传 #多文件上传 #ajax异步文件上传 (非常详细,从创建项目开始)...

    实现文件上传和回显 1.新建一个SpringBoot项目,选择 Spring Web 和 thymeleaf 依赖 .pow.xml文件下的依赖如下 2.根据下图,创建如下文件 3.直接上代码 配置文 ...

  3. Spring MVC的文件上传和下载以及拦截器

    一.文件上传 在使用form表单进行文件上传时,必须将method设置为 post,并将enctype设置为multipart/form-data.只有这样设置,浏览器才会将需要上传的文件已二进制数据 ...

  4. layui上传文件请求接口异常_SpringMVC实现文件上传与下载,拦截器,异常处理

    第一章:响应数据和结果视图 1. 返回字符串 Controller方法返回字符串可以指定逻辑视图的名称,根据视图解析器为物理视图的地址. @RequestMapping(value="/he ...

  5. springmvc代码详细(五种映射,绑定参数,处理json数据,文件上传,转发,拦截器的实现)

    项目结构图: 父工程的pom.xml文件: <!-- 集中定义依赖版本号 --><properties><junit.version>4.10</junit. ...

  6. springmvc请路径参数,springmvc-json-ajax使用,springmvc文件上传,springmvc文件下载,springmvc拦截器(内容较多)

    按照操作,绝对都可以实现,亲测.....(项目所有文件和目录结构全都放上去了) idea工具,创建maven项目 第一步: 放置各种配置文件: pom.xml <?xml version=&qu ...

  7. spring boot 整合web开发之文件上传、静态资源访问、异常处理、返回JSON数据

    目录 springboot 整合web开发 返回json数据 静态资源访问 文件上传 全局异常 1.返回json数据 springboot默认的是jackson-databind做为json处理器.也 ...

  8. Spring Boot配置MinIO(实现文件上传、下载、删除)

    1 MinIO MinIO 是一个基于Apache License v2.0开源协议的对象存储服务.它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片.视频.日志文件.备份数 ...

  9. 大数据之 将txt文件上传到HDFS并用Hive查询

    在生产上,一般对数据清洗之后直接放到HDFS上,再将目录加载到分区表中,之后通过hive去查询分析数据: 1.准备数据 order_created.txt 用 tab分割 10703007267488 ...

最新文章

  1. 大数据处理也要安全--关于MaxCompute的安全科普
  2. android听书功能实现,基于Android的喜马拉雅听书的实现.docx
  3. linux watchdog demo hacking
  4. IOS8 PUSH解决方法
  5. Spring boot属性松散绑定
  6. axios请求接口http_Vue实战038:api接口模块化统一管理
  7. UVa 297 四分树
  8. 栈的应用 - 就近匹配
  9. ssas如何创建分区_如何基于SSAS信息创建Excel报告
  10. 比较浮点值有多危险?
  11. AJAX实现导航式多条件搜索
  12. 一道笔试题的解法和联想
  13. 基于LM324的音调放大电路
  14. sql 2008 R2 备份和还原
  15. 体检导检系统服务器系统,喜仕达体检中心导检系统
  16. 每天学习10句英语-第七天
  17. mysql 计算天数_mysql计算两个日期之间的天数
  18. 创新产品访谈:Ntalker V2.5
  19. entity、bo、vo、po、dto、pojo如何理解及相互转化
  20. myeclipse浅灰色主题/配色

热门文章

  1. 思科cisco路由器动态路由协议配置方法
  2. 一样入职的应届生工资不一样_为什么每月工资一样,但扣的个税不一样?
  3. js 添加属性_轻松理解JS中的面向对象,顺便搞懂prototype和__proto__
  4. 火焰传感器感应有火亮灯代码_史上最全燃气壁挂炉故障代码,这个值得收藏
  5. vuedraggable嵌套块拖拽_Vue 基于 vuedraggable 实现选中、拖拽、排序效果
  6. ZKWeb网页框架1.3正式发布
  7. L2-007. 家庭房产
  8. Android编译期代码生成之apt实践入门
  9. 自己写的.Net(C#)代码×××
  10. 转:android 避免内存泄露