您的位置:首页 > 编程语言 > Java开发

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

2017-08-01 13:41 691 查看

基于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(字节数组,响应头对象,状态码)

国际化

资源准备

在src根目录下创建国际化资源文件xx_zn_CN.properties或xx_en_US.properties

在配置文件中准备资源,键名(语义性要强)和值

springMvc.xml配置

<!-- 国际化:指定处理国际化资源包的Bean是哪个 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basenames">
<list>

4000
<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自定义拦截器

拦截器实现

创建一个拦截器类实现interceptor接口或继承HandlerInterceptorAdapter 实现类

都会重写一个叫preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)的方法

在方法体内部实现我们要完成的动作

拦截器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(…)方法,在类上配置相应的注解(不常用)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐