SpringMVC入门(二)—— 参数的传递、Controller方法返回值、json数据交互、异常处理、图片上传、拦截器
一、参数的传递
1、简单的参数传递
/* @RequestParam用法:入参名字与方法名参数名不一致时使用{
* value:传入的参数名,required:是否必填,defaultValue:默认值
* }
*/
@RequestMapping("itemEdit")
public ModelAndView itemEdit(@RequestParam(value="id",required=true,defaultValue="1")Integer id){....}
2、Model/ModelMap
/**
* 演示返回String,通过Model/ModelMap返回数据模型
* 跳转修改商品信息页面
* @param id
* @return
*/
@RequestMapping("itemEdit")
public String itemEdit(@RequestParam("id")Integer ids,Model m,ModelMap model){
//查询商品信息
Item item = itemServices.getItemById(ids);
//通过Model把商品数据返回页面
model.addAttribute("item", item);
//返回String视图名字
return "itemEdit";
}
3、pojo与包装pojo
要点:表单提交的name属性必需与pojo的属性名称一致。
/**
* 演示传递pojo参数
* 更新商品信息
* @return
*/
@RequestMapping("updateItem")
public String updateItem(Item item,Model model){
//更新商品
itemServices.update(item);
//返回商品模型
model.addAttribute("item", item);
//返回担任提示
model.addAttribute("msg", "修改商品成功");
//返回修改商品页面
return "itemEdit";
}
4、自定义参数绑定
①自定义转换器
/**
* 日期转换器
* S:source 要转换的源类型
* T:目标,要转换成的数据类型
* @author Steven
*/
public class DateConvert implements Converter<String, Date> { @Override
public Date convert(String source) {
Date result = null;
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
result = sdf.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return result;
}
}
② 配置日期转换器
<!-- 配置注解驱动,相当于同时使用最新处理器映射跟处理器适配器,对json数据响应提供支持 -->
<!-- 使用自定义转换器 -->
<mvc:annotation-driven conversion-service="MyConvert" /> <!-- 定义转换器 -->
<bean id="MyConvert" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.cenobitor.springmvc.utils.DateConvert" />
</set>
</property>
</bean>
5、数组参数传递
@RequestMapping("/queryItem")
public String queryItem(QueryVo vo,Integer[] ids){
System.out.println(vo);
if (ids != null && ids.length > 0){
for (Integer id : ids) {
System.out.println(id);
}
}
return "itemList";
}
二、Controller方法返回值
1、返回ModelAndView
@RequestMapping("itemList")
public ModelAndView queryItemList(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("itemList");
List<Item> list = itemService.getItemList();
modelAndView.addObject("itemList",list);
return modelAndView;
}
2、返回void:使用原始的request、response处理
3、返回String
①返回视图的名字
②转发,跳转action
@RequestMapping(value = "updateItem",method = RequestMethod.POST)
public String updateItem(Item item, Model model){
model.addAttribute("item",item);
return "forward:/itemEdit.action";
}
③重定向,跳转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、代码演示
/**
* json数据交互演示
* @param item2
* @return
*/
@RequestMapping("getItem")
//@ResponseBody把pojo转成json串响应用户
@ResponseBody
//@RequestBody用于接收用户传入json串转成pojo
public Item getItem(@RequestBody Item item2) {
System.out.println("接收到的json商品数据为:" + item2);
Item item = itemServices.getItemById(3);
return item;
}
四、异常处理
1、需实现HandlerExceptionResolver
/**
* 全局异常处理器
* @author Steven
*
*/
public class CustomerException implements HandlerExceptionResolver { @Override
public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object hanlder,
Exception e) {
//记录日志
e.printStackTrace();
//错误消息
String msg = "很抱歉,系统发生异常了,请联系管理员"; //响应用户错误提示
ModelAndView mav = new ModelAndView();
//返回错误消息
mav.addObject("msg", msg);
//响应错误提示页面
mav.setViewName("msg");
return mav;
}
}
2、在springmvc.xml中配置全局异常处理器
<!-- 配置全局异常处理器 -->
<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代码
@RequestMapping(value = "updateItem", method = { RequestMethod.POST, RequestMethod.GET })
public String updateItem(Item item, Model model, MultipartFile picFile) throws Exception {
// 图片新名字
String name = UUID.randomUUID().toString();
// 图片原名字
String oldName = picFile.getOriginalFilename();
// 后缀名
String exeName = oldName.substring(oldName.lastIndexOf("."));
File pic = new File("D:\\WebWork\\" + name + exeName);
// 保存图片到本地磁盘
picFile.transferTo(pic);
// 更新商品图片信息
item.setPic(name + exeName);
itemServices.update(item);
model.addAttribute("item", item);
model.addAttribute("msg", "修改商品成功");
return "itemEdit";
}
六、拦截器
1、需实现HandlerInterceptor
/**
* 自定义拦截器
* @author Steven
*
*/
public class MyInterceptor1 implements HandlerInterceptor { //在preHandle方法返回true并且Controller方法完全执行完后被执行
//处理异常、记录日志
@Override
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("MyInterceptor1.afterCompletion.....");
} //在Controller方法执行后,返回ModelAndView之前被执行
//设置或者清理页面共用参数等等
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception {
System.out.println("MyInterceptor1.postHandle.....");
} //在Controller方法执行前被执行
//登录拦截、权限认证等等
@Override
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { System.out.println("MyInterceptor1.preHandle....."); //返回true放行,false拦截
return true;
} }
2、在springmvc.xml配置拦截器
<!-- 拦截器定义 -->
<mvc:interceptors>
<!-- 定义一个拦截器 -->
<mvc:interceptor>
<!-- path配置</**>拦截所有请求,包括二级以上目录,</*>拦截所有请求,不包括二级以上目录 -->
<mvc:mapping path="/**"/>
<bean class="com.cenobitor.springmvc.interceptor.MyInterceptor1" />
</mvc:interceptor>
</mvc:interceptors>
SpringMVC入门(二)—— 参数的传递、Controller方法返回值、json数据交互、异常处理、图片上传、拦截器的更多相关文章
- SpringMVC的@RequestMapping和Controller方法返回值
本节内容: @RequestMapping Controller方法返回值 一.@RequestMapping 通过@RequestMapping注解可以定义不同的处理器映射规则. 1. URL路径映 ...
- SpringMVC第五篇【方法返回值、数据回显、idea下配置虚拟目录、文件上传】
Controller方法返回值 Controller方法的返回值其实就几种类型,我们来总结一下-. void String ModelAndView redirect重定向 forward转发 数据回 ...
- SprimgMVC学习笔记(五)—— Controller方法返回值
一.返回ModelAndView controller方法中定义ModelAndView对象并返回,对象中可添加model数据.指定view. /** * 查询商品列表 * @return */ @R ...
- Controller方法返回值
1. 返回ModelAndView controller方法中定义ModelAndView对象并返回,对象中可添加model数据.指定view. //入门程序 第一 包类 + 类包 + 方法名 @Re ...
- springMVC整理04--文件上传 & 拦截器 & 异常处理
1. 文件上传 SpringMVC 的文件上传非常简便,首先导入文件上传依赖的 jar: <!-- 文件上传所依赖的 jar 包 --> <dependency> <g ...
- SpringMvc(四)- 下载,上传,拦截器
1.图片下载 图片下载:将服务器端的文件以流的形式写到客户端,通过浏览器保存到本地,实现下载: 1.1 图片下载步骤 1.通过session获取上下文对象(session.getServletCont ...
- SpringMVC中 controller方法返回值
1)ModelAndView @RequestMapping(value="/itemEdit") public ModelAndView itemEdit(){ //创建模型视图 ...
- Spring MVC中 controller方法返回值
1.返回ModelAndView 定义ModelAndView对象并返回,对象中可添加model数据.指定view 2.返回String 1.表示返回逻辑视图名 model对象通过 model.add ...
- @RequestMapping与controller方法返回值介绍
@RequestMapping url映射:定义controller方法对应的url,进行处理器映射使用.@RequestMapping(value="/item")或@Reque ...
随机推荐
- 【文文殿下】浅析scanf源码
本文仅做理性上的愉悦,无实际用途. scanf实际的调用 我们直接使用的scanf其实是这样写的 int __cdecl scanf ( const char *format, ... ) { va_ ...
- iOS 多Target, Other link Flag
在创建多个马甲包或者多个App间只有很小的差异是使用多Target是一种很好的方法 https://www.jianshu.com/p/18db54655246 1:选中原始的Target, 点击右键 ...
- window / Linux 下 Golang 开发环境的配置
一直专注于使用python语言进行程序开发,但是却又一直被它的性能问题所困扰,直到遇到了天生支持高并发的Golang,这似乎也成了学习go语言最理所当然的理由.下面介绍下Go语言开发环境搭建的步骤: ...
- $_REQUEST预定义变量
1,$_REQUEST接收$_GET,$_POST,$_COOKIE数据,因此这三种方式都可以攻击$_REQUEST方式,这种方式不安全,不建议使用$_REQUEST. 2,如果不知道get或post ...
- Windows搭建Nexus3私服
1. Nexus 简介 Nexus 是一个强大的 Maven 仓库管理器 , 它极大地简化了自己内部仓库的维护和外部仓库的访问 ; 利用 Nexus 你可以只在一个地方就能够完全控制访问和部署在你所维 ...
- 杭电OJ第11页2010-2019道题(C语言)
2010. 水仙花数 问题描述 Problem Description 春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的: "水仙花数"是指一个三位 ...
- Hive Cli相关操作
landen@Master:~/UntarFile/hive-0.10.0$ bin/hive --database 'stuchoosecourse' -e 'select * from hidde ...
- 对称(DES/AES)与非对称(RSA/SSL/数字证书)加密介绍及实际应用
本文不对具体的算法做深入研究,只是讲解各种安全算法的原理和使用场景. 一.数据校验算法 数据校验,是为保护数据的完整性,用一种指定的算法对原始数据计算出的一个校验值.当接收方用同样的算法再算一次校验值 ...
- 漫谈NIO(3)之Netty实现
1.前言 上一章结合Java的NIO例子,讲解了多路IO复用的一个基本使用方法,通过实际编码加深对其理解.本章开始进入Netty的环节,前面两章都是为了Netty进行铺垫说明.此节将对比Java的NI ...
- Java_反射机制详解
本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解. 下面开始正文. [案例1]通过一个对象 ...