springmvc 异常处理、文件上传以及拦截器相关知识

七 异常处理器(异常处理机制)

系统中异常包括两类:预期异常和运行时异常RuntimeException,前者通过捕获异常从而获取异常信息,后者主要通过规范代码开发、测试通过手段减少运行时异常的发生。
系统的dao、service、controller出现都通过throws Exception向上抛出,最后由springmvc前端控制器交由异常处理器进行异常处理

1、首先声明自定义异常

/**自定义异常
 * @author liuxuan
 *
 */
public class MyException extends Exception{

    public MyException(String message) {
        // TODO Auto-generated constructor stub
        super(message);
    }

}

2、编写自定义异常处理器

package cn.lx.springmvc.exception;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;

/**自定义异常处理器
 * 需要实现 HandlerExceptionResolver接口
 * @author liuxuan
 *
 */
public class MyExceptionHandlerResolver implements HandlerExceptionResolver{

    public MyExceptionHandlerResolver() {
        // TODO Auto-generated constructor stub
    }

    /**
     * 异常解析
     * */
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) {
        //打印错误信息
        ex.printStackTrace();
        MyException myException = null;
        //判断异常的种类,如果是自定义异常,则进行处理,不是的话,转换为自定义异常
        if(ex instanceof MyException){
            myException = (MyException) ex;
        }else{
            myException = new MyException(ex.getMessage());
        }
        ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("message",myException.getMessage());
        modelAndView.setViewName("/WEB-INF/jsp/error.jsp");
        return modelAndView;
    }

}

3、配置自定义异常处理器

在springmvc.xml中进行配置
<!-- 异常处理器 -->
    <bean id="handlerExceptionResolver" class="cn.itcast.ssm.controller.exceptionResolver.CustomExceptionResolver"/>

4、异常信息显示页面

<%@ 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>

八 上传文件

上传文件同样使用commons-fileUpload 和commons-io技术
8.1 页面处理

1、表单提交方式为post
2、文件域 name属性重要

    <input type="file"  name="pictureFile"/> 

3、form表单上配置ectye=”multipart/form-data”

8.2 springmvc.xml中配置文件上传处理器
<!-- 文件上传
    图片上传处理器
 -->
<bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- 设置上传文件的最大尺寸为5MB -->
    <property name="maxUploadSize">
        <value>5242880</value>
    </property>
</bean>
8.3 controller方法中处理图片上传

Multipart pictureFile中封装了文件上传信息,注意 形参中的参数名称必须和页面file文件域的名称一致

@RequestMapping("insertitem")
public ModelAndView insertitem(Items items,HttpServletRequest request,MultipartFile pictureFile) throws IllegalStateException, IOException{
    /*items.setCreatetime(new Date());*/
    //处理图片上传 pictureFile中封装了图片
    if(pictureFile != null){
        //获取文件名称
        String oldFileName = pictureFile.getOriginalFilename();
        long size = pictureFile.getSize();
        //上传文件的大小
        System.out.println("上传图片的大小:"+size);
        String path = request.getServletContext().getRealPath("/")+"/WEB-INF/upload/"+oldFileName;
        System.out.println(path);
        File file = new File(path);
        //如果目录不存在,就创建目录
        if(!file.getParentFile().exists()){
            file.getParentFile().mkdirs();
        }
        //读写文件
        pictureFile.transferTo(file);
    }
    itemService.insertItem(items);
    return findAllItems();
}

九 json数据交互

9.1 导入相应的jar包
9.2 页面准备

注意加上contentType声明请求类型是json

<script type="text/javascript">
    $(function(){
        $.ajax({
            type:"post",
            url:"${pageContext.request.contextPath }/item/ajaxItem.action",
            contentType:"application/json;charset=utf-8",
            data:'{"name":"测试商品","price":99.9}',
            success:function(data){
                alert(data);
            }
        });
    });
</script>
9.3 controller中方法代码编写
@RequestMapping(value="/ajaxItem",method=RequestMethod.POST)
public @ResponseBody Items ajaxItem(@RequestBody Items item) throws MyException{
    //自动将数据封封装给pojo类
    System.out.println(item);
    return item;
}
9.4 配置json解析器
注意:如果使用<mvc:annotation-driven /> 则不需要配置解析器
9.5 相应API解释
1   @RequestBody
作用:
@RequestBody注解用于读取http请求的内容(字符串),通过springmvc提供的HttpMessageConverter接口将读到的内容转换为json、xml等格式的数据并绑定到controller方法的参数上。
本例子应用:
@RequestBody注解实现接收http请求的json数据,将json数据转换为java对象

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

十、 自定义拦截器

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

10.1 编写自定义拦截器
实现HandlerInterceptor接口,如下:
Public class HandlerInterceptor1 implements HandlerInterceptor{

    /**
     * controller执行前调用此方法
     * 返回true表示继续执行,返回false中止执行
     * 这里可以加入登录校验、权限拦截等
     */
    @Override
    Public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        // TODO Auto-generated method stub
        Return false;
    }
    /**
     * controller执行后但未返回视图前调用此方法
     * 这里可在返回用户前对模型数据进行加工处理,比如这里加入公用信息以便页面显示
     */
    @Override
    Public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        // TODO Auto-generated method stub

    }
    /**
     * controller执行后且视图返回后调用此方法
     * 这里可得到执行controller时的异常信息
     * 这里可记录操作日志,资源清理等
     */
    @Override
    Public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // TODO Auto-generated method stub

    }

}
10.2 配置自定义拦截器

springmvc.xml中配置自定义拦截器

<!--拦截器 -->
<mvc:interceptors>
    <!--多个拦截器,顺序执行
 -->
<mvc:interceptor>
    <!--拦截器拦截路径-->
    <mvc:mapping path="/**"/>
    <!--自定义拦截器类-->
    <bean class="cn.itcast.springmvc.filter.HandlerInterceptor1"></bean>
</mvc:interceptor>
</mvc:interceptors>

十一、 RESTful支持

11.1 什么是restful?
Restful就是一个资源定位及资源操作的风格。不是标准也不是协议,只是一种风格,是对http协议的诠释。
资源定位:互联网所有的事物都是资源,要求url中没有动词,只有名词。没有参数
Url格式:http://blog.csdn.net/beat_the_world/article/details/45621673
资源操作:使用put、delete、post、get,使用不同方法对资源进行操作。分别对应添加、删除、修改、查询。一般使用时还是post和get。Put和Delete几乎不使用。
11.2 URL 模板模式映射
@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不用指定名称。

// 查询商品列表
@RequestMapping("/queryItem/${id}")
public ModelAndView queryItem(String id ) throws Exception {
    // 商品列表
    List<Items> itemsList = itemService.findItemsList(null);
    System.out.println(id);
    // 创建modelAndView准备填充数据、设置视图
    ModelAndView modelAndView = new ModelAndView();

    // 填充数据
    modelAndView.addObject("itemsList", itemsList);
    // 视图
    modelAndView.setViewName("item/itemsList");

    return modelAndView;
}
11.3 静态资源访问
spingmvc如果配置的拦截路径是”/”。就不能直接访问静态资源了,需要配置过滤, 才能访问
如果在DispatcherServlet中设置url-pattern为 /则必须对静态资源进行访问处理。
spring mvc 的<mvc:resources mapping="" location="">实现对静态资源进行映射访问。
location是页面引用的路径,mapping是映射的服务器中的路径
第一个*代表当前路径下的所有文件
第二个*代表子目录下的所有文件及目录
如下是对js文件访问配置:
<mvc:resources location="/js/" mapping="/js/**"/>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值