SpringMVC-03 文件上传&拦截器&统一异常处理

本文介绍了如何使用SpringMVC进行文件上传,包括在springmvc.xml中的配置、前端设置、pom.xml依赖加载以及controller类的编写。此外,还详细讲解了如何实现统一异常处理,通过实现HandlerExceptionResolver接口并配置异常处理器,以及创建拦截器实现HandlerInterceptor接口,以控制请求的拦截和放行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 文件上传

使用springMVC自带的组件做文件上传功能, 后面会使用更好的第三方组件做文件上传功能的应用, 这里做一下了解

2. 文件上传关键代码配置

2.1 springmvc.xml配置

配置文件上传的解析器, 设置上传的最大文件限制

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!--单个上传文件的文件限制 5m-->
    <property name="maxUploadSize" value="5242880"/>
</bean>

2.2 文件上传的前端配置

前端配置如下:


  <fieldset>
        <h4>本服务内  文件上传</h4>
        <form action="${pageContext.request.contextPath}/update.do" method="post" enctype="multipart/form-data">
            <input type="file" placeholder="请选择要上传的文件" name="uploadFile">
            <input type="text" placeholder="请输入上传文件的执行者名称" name="name"/>
            <input type="submit" value="上传文件">
        </form>
    </fieldset>

2.3 加载依赖文件到pom.xml中

<dependencies>
    <!--引入jersey服务器的包-->
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-core</artifactId>
        <version>1.18.1</version>
    </dependency>
    <dependency>
        <groupId>com.sun.jersey</groupId>
        <artifactId>jersey-client</artifactId>
        <version>1.18.1</version>
    </dependency>
    <!--文件上传的jar包-->
    <!-- 引入fileUpload会自动依赖commons-io -->
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.1.9.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.1.9.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2</version>
        <scope>provided</scope>
    </dependency>

</dependencies>
org.apache.tomcat.maven tomcat7-maven-plugin 2.2 9037 /

2.4 配置controller类

@Controller
public class DefaultController {

/**
 * 本服务器 文件上传
 * @param uploadFile 页面表单所上传的文件
 */
@RequestMapping("update")
public String upload(MultipartFile uploadFile, HttpServletRequest request){
    //获取32位的随机字符串
    String uuid = UUID.randomUUID().toString().replace("-","");
    System.out.println("uuid = " + uuid);

    //上传文件的名称
    String filename = uploadFile.getOriginalFilename();
    System.out.println("filename = " + filename);

    //获取到 上传文件存储的upload文件夹路径
    String realPath = request.getSession().getServletContext().getRealPath("update");
    System.out.println("realPath = " + realPath);

    ///组装要上传文件的完整路径
    File path = new File(realPath, uuid+"_"+filename);
    System.out.println("path = " + path);

    //上传文件
    try {
        uploadFile.transferTo(path);
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "result";
}
}

3 统一异常处理

两条: 1 . 实现接口HandlerExceptionResolver, 2. 在spring-mvc.xml中配置异常处理器

<bean class="com.itheima.exception.MyHandlerExceptionResolver"></bean>

SpringMVC中有一个接口HandlerExceptionResolver , 一旦有异常发生,都会走到这个接口来,所以设置一个异常实现类 去实现这个接口 ,然后重写方法, 就实现了统一异常处理.

e.printStackTrace(); 主要是给程序员看的;
ModelAndView 用来给客户响应客户看到的异常页面和信息;

public class MyHandlerExceptionResolver implements HandlerExceptionResolver {
    /**
     * 异常解析方法
     * @param request 请求对象
     * @param response 响应对象
     * @param handler 异常所在的方法 Handler
     * @param e 具体抛出的异常信息
     * @return
     */
    @Override
    public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e) {
        //给开发者看的异常信息
        e.printStackTrace();

        //给浏览器用户看的信息
        ModelAndView modelAndView = new ModelAndView();
        //设置给用户看的错误提示信息
        modelAndView.addObject("message", "亲, 服务器服务中,请2小时后再试~~");
        //设置给用户看的错误提示页面
        modelAndView.setViewName("error");
        return modelAndView;
    }
}

4 拦截器

关键:
(1) 创建实现类实现HandlerInterceptor接口, 返回false拦截, 返回true放行;
(2)在spring-mvc.xml文件中配置拦截器, class是自定义拦截器实现类的全限定名称.

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/> //意思是拦截所有请求路径含子路径
        <bean class="com.itheima.interceptor.LoginInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

public class LoginInterceptor implements HandlerInterceptor {

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    //拦截用户请求, 判断当前请求是否为 登录请求, 是,放行
    String requestURI = request.getRequestURI();
    System.out.println("requestURI = " + requestURI);

    //判断当前请求是否为 登录请求, 是,放行
    if("/user/login.do".equals(requestURI)){
        return true;
    }

    //其他请求, 判断用户是否已经在Session域存在
    Object username = request.getSession().getAttribute("username");
    if(username != null){
        //在Session域存在 用户信息, 放行
        return true;
    } else {
        //在Session域不存在 用户信息, 拦截, 跳转页面到 用户登录页面
        response.sendRedirect("/index.jsp");

        return false;
    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值