一、参数的传递
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>