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

基于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

@ExceptionHandler
public  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(…)方法,在类上配置相应的注解(不常用)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值