黑马程序员技术交流社区

标题: [石家庄校区]springmvc开发总结(下) [打印本页]

作者: longxf_sjz    时间: 2019-8-25 10:12
标题: [石家庄校区]springmvc开发总结(下)

1 springmvc文件上传
  1.1 文件上传需要满足的三个条件
         表单中必须以post提交;
         表单中的enctype必须为 multipart/form-data ;
         表单中必须要有一个文件域 type=file
  1.2 springmvc需要添加文件解析器

[XML] 纯文本查看 复制代码
 <!--配置文件解析器对象-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760" />
    </bean>
    需要注意该文件解析器的id值固定
  1.3 controller方法中通过MultipartFile对象接收上传文件

[Java] 纯文本查看 复制代码
<form action="/user/fileupload2" method="post" enctype="multipart/form-data">
        选择文件:<input type="file" name="upload" /><br/>
        <input type="submit" value="上传" />
    </form>
       
        @RequestMapping("/fileupload2")
    public String fileuoload2(HttpServletRequest request, MultipartFile upload) throws Exception {
        System.out.println("springmvc文件上传...");

        // 使用fileupload组件完成文件上传
        // 上传的位置
        String path = request.getSession().getServletContext().getRealPath("/uploads/");
        // 判断,该路径是否存在
        File file = new File(path);
        if(!file.exists()){
            // 创建该文件夹
            file.mkdirs();
        }

        // 说明上传文件项
        // 获取上传文件的名称
        String filename = upload.getOriginalFilename();
        // 把文件的名称设置唯一值,uuid
        String uuid = UUID.randomUUID().toString().replace("-", "");
        filename = uuid+"_"+filename;
        // 完成文件上传
        upload.transferTo(new File(path,filename));

        return "success";
    }

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

2.2 自定义异常类
[Java] 纯文本查看 复制代码
public class SysException extends Exception{

                // 存储提示信息的
                private String message;

                public String getMessage() {
                        return message;
                }

                public void setMessage(String message) {
                        this.message = message;
                }

                public SysException(String message) {
                        this.message = message;
                }

        }

2.3 自定义异常处理器
  
[Java] 纯文本查看 复制代码
public class SysExceptionResolver implements HandlerExceptionResolver{
                /**
                 * 处理异常业务逻辑
                 */
                public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
                        // 获取到异常对象
                        SysException e = null;
                        if(ex instanceof SysException){
                                e = (SysException)ex;
                        }else{
                                e = new SysException("系统正在维护....");
                        }
                        // 创建ModelAndView对象
                        ModelAndView mv = new ModelAndView();
                        mv.addObject("errorMsg",e.getMessage());
                        mv.setViewName("error");
                        return mv;
                }

        }
2.4配置异常处理器
[XML] 纯文本查看 复制代码
<bean id="sysExceptionResolver" class="cn.itcast.exception.SysExceptionResolver"/>

3 springmvc拦截器
  3.1拦截器简介
  Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。
  拦截器和web中的过滤器是有几分相似,但是也有区别,接下来我们就来说说他们的区别:
        1 过滤器是 servlet 规范中的一部分, 任何 java web 工程都可以使用。
        2 拦截器是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。
        3 过滤器在 url-pattern 中配置了/*之后,可以对所有要访问的资源拦截。
        4 拦截器它是只会拦截访问的控制器方法,如果访问的是 jsp, html,css,image 或者 js 是不会进行拦
        截的。
   3.2 自定义拦截器

[Java] 纯文本查看 复制代码
public class MyInterceptor1 implements HandlerInterceptor{
                /**
                 * 预处理,controller方法执行前
                 * return true 放行,执行下一个拦截器,如果没有,执行controller中的方法
                 */
                public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
                        System.out.println("MyInterceptor1执行了...前1111");
                        // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
                        return true;
                }
                /**
                 * 后处理方法,controller方法执行后,success.jsp执行之前
                 */
                public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
                        System.out.println("MyInterceptor1执行了...后1111");
                        // request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
                }

                /**
                 * success.jsp页面执行后,该方法会执行
                 */
                public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
                        System.out.println("MyInterceptor1执行了...最后1111");
                }

        }

3.3 配置拦截器
[XML] 纯文本查看 复制代码
<mvc:interceptors>
        <!--配置拦截器-->
        <mvc:interceptor>
            <!--要拦截的具体的方法-->
            <mvc:mapping path="/user/*"/>
            <!--不要拦截的方法
            <mvc:exclude-mapping path=""/>
            -->
            <!--配置拦截器对象-->
            <bean class="cn.itcast.controller.cn.itcast.interceptor.MyInterceptor1" />
        </mvc:interceptor>
    </mvc:interceptors>






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2