框架学习之springMvc整合框架-02文件上传、下载、国际化、拦截器、异常框架

来源:互联网 发布:淘宝哪一家假货多 编辑:程序博客网 时间:2024/06/02 04:54

基于maven搭建项目

所有需要的架包通过在maven respository官网获得

文件上传和下载

文件上传

具体步骤:
1. 在提交的表单中加入属性:enctype=”multipart/form-data”
2. 在处理器Controller里面的具体对应的方法参数中加入(MultipartFile fileName),fileName是上传表单中的文件名,保持一致,否则加注解(不推荐)
3. xml配置:

<!-- 如果请求是multipart/form-data 编码方式的,就必须在容器中存在一个id叫做multipartResolver 用spring整合multipart的Resolver -->    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">        <property name="maxUploadSize" value="50000000" />    </bean>    <bean class="com.bwf.term14.book.web.controller.manage.BookController">        <property name="allowedContentTypes">            <list>                <value>image/jpeg</value>                <value>image/gif</value>                <value>image/png</value>            </list>        </property>        <property name="maxSize" value="500000" />        <property name="tipOfNotAllowedType" value="图书图片文件格式错误,必须是一个图片(后缀名:.jpg, .png, .gif)" />        <property name="tipOfExceedMaxSize" value="图书图片文件太大了,不能超过50KB" />    </bean>

说明:
1). multipartResolver名字必须是这个,不能变,其次可以给它配一个文件上传的最大限制,这个是spring整合的实现类的一个属性
2). 如果要增加文件的格式验证和文件大小的控制,那可以不用在controller类上注解,可以在xml文件中单独配置bean属性;再在bean中配置property属性,将允许的格式和大小写上(list),错误提示信息也可一并配好;最后,在类中声明这些property属性就可以直接用了(名字要一致)
4. java代码实现文件上传操作

在验证格式和大小之后的操作:

String realPath = request.getServletContext().getRealPath("指定文件上传的保存路径") + fileName.getOriginalFilename();//获得实际文件名fileName.transferTo(new File(realPath)); // 将MultipartFile中的文件保存到指定的File中

根据需求可以打印文件上传的结果提示信息,放在请求作用域

文件下载

public ResponseEntity<byte[]> download(HttpServletRequest request) throws IOException {             File txlFile = new File(request.getServletContext().getRealPath("文件资源路径"));        byte[] fileByteArr = FileUtils.readFileToByteArray(txlFile);    // commons-io.jar :FileUtil,此方法将File对象指向的文件中的所有字节读取到内存中,保存成byte数组        // 设置符合HTTP协议下载情况下的响应头信息        HttpHeaders headers = new HttpHeaders();        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); // Content-Type: appliation/octet-stream        headers.setContentDispositionFormData("attachment", "文件名"); // Content-Dispository: attachement; filename=文件名        headers.setContentLength(txlFile.length()); // Content-Length: 1023        return new ResponseEntity<byte[]>(fileByteArr, headers, HttpStatus.CREATED );    }

说明:
1). 该方法的返回类型要改为:ResponseEntity(字节数组)
2). 上述的返回类型需要一个字节数组,那就需要将下载的目标文件通过FileUtis调用readFileToByteArray(File file)方法转换成字节数组
3). 创建一个响应头对象,封装响应头信息
4). 新创建一个ResponseEntity(字节数组,响应头对象,状态码)

国际化

资源准备

  1. 在src根目录下创建国际化资源文件xx_zn_CN.properties或xx_en_US.properties
  2. 在配置文件中准备资源,键名(语义性要强)和值

springMvc.xml配置

<!-- 国际化:指定处理国际化资源包的Bean是哪个 -->    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">        <property name="basenames">            <list>                <value>xx</value> <!-- 指定国际化资源包的基础名 可以改动的 就是我们定义的资源文件的前缀名 -->            </list>        </property>    </bean> 

注意:配置的属性不要改变,因为这是提供的实现类的属性,否则找不到

国际化切换区域特征

<!-- 国际化:切换区域特征的功能,由spring提供 --><!-- 容器中必须有一个id叫做localeResolver的bean,注意名字不能改 --><bean id="localeResolver" class="org.springframework.web.servlet.i18n.SessionLocaleResolver" /> <mvc:interceptors>    <!-- 配置拦截切换区域特征的拦截器(提供要拦截的参数名) -->    <mvc:interceptor>        <!-- 针对所有的url -->        <mvc:mapping path="/**"/>        <!-- 配置拦截切换区域特征的拦截器(提供要拦截的参数名) -->        <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">                <property name="paramName" value="参数名" />        </bean>    </mvc:interceptor></mvc:interceptors>

说明:代码中的‘参数名’是指前端切换国家化的链接中的参数名

前端页面的输出和切换国际化的代码片段

使用springMvc的标签:

<sp:message code="资源文件的键名" /><p><a href="loginForm?参数名=zh_CN">中文</a> | <a href="loginForm?参数名=en_US">English</a></p>

说明:参数名可以任意的取

springMvc自定义拦截器

拦截器实现

  1. 创建一个拦截器类实现interceptor接口或继承HandlerInterceptorAdapter 实现类
  2. 都会重写一个叫preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)的方法
  3. 在方法体内部实现我们要完成的动作

拦截器xml配置

<mvc:interceptors>    <mvc:interceptor>            <mvc:mapping path="/**"/>                       <mvc:exclude-mapping path="/images/**"/>            <mvc:exclude-mapping path="/js/**"/>            <mvc:exclude-mapping path="/css/**"/>            <mvc:exclude-mapping path="/upload/**"/>            <bean class="com.bwf.term14.book.web.interceptor.自定义拦截器类" />    </mvc:interceptor>    <mvc:interceptor>            <mvc:mapping path="/manage/**"/>            <mvc:exclude-mapping path="/manage/admin/loginForm"/>            <mvc:exclude-mapping path="/manage/admin/loginCheck"/>            <bean class="com.bwf.term14.book.web.interceptor.自定义拦截器类">                <!-- 自定义属性表示提示信息或其他标志信息 -->                <property name="authorityFlag" value="currAdmin" />                <property name="tipNameOfFail" value="tip" />                <property name="tipContentOfFail" value="请先登录再进行其他操作" />                <property name="dispatcherUrlOfFail" value="/manage/admin/loginForm" />            </bean>    </mvc:interceptor></mvc:interceptors>

说明:
1. 由于自定义了拦截器,那么所有的资源都会被拦截器,所以需要将我们的css、js、图片等资源除外用上述第一个拦截器表示
2. 当需要特殊处理拦截到的请求时,可以在该拦截器中配置属性,比如免登陆验证成功或失败的信息,当然这些信息同时要在拦截器类中声明,否则读取不到

springMvc异常框架

使用注解处理异常

在方法上声明注解:@ExceptionHandler

@ExceptionHandlerpublic  String  handlerException(HttpServletRequest request,Exception exception){        request.setAttribute("异常名", exception);        return "要去的错误页面";    }

说明:在页面中我们可以用el表达式输出异常:${异常名}

使用spring提供的异常处理框架

<!-- 使用SpringMVC提供SimpleMappingExceptionResolver来配置出现异常以后去哪个视图 --><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">        <property name="defaultErrorView" value="error" />        <property name="exceptionAttribute" value="ex" />        <property name="exceptionMappings">            <props>                <prop key="java.sql.SQLException">error2</prop>            </props>        </property></bean>

说明:
1. defaultErrorView是指springMvc在处理异常的时候默认的一个错误视图(页面)
2. springMvc在页面输出的默认异常名是“error”,exceptionAttribute可以修改名字
3. exceptionMappings可以自定义映射不同处理情况下对应不同的异常处理的页面

创建实现类处理异常

创建一个全局异常处理类实现HandlerExceptionResolver接口,重写resolveException(…)方法,在类上配置相应的注解(不常用)

原创粉丝点击