spring对文本文件操作

合集下载

文本文件操作方法

文本文件操作方法

文本文件操作方法文本文件操作是指在计算机中对文本文件进行读取、写入、修改和删除等操作的过程。

文本文件是一种以文本形式存储的文件,通常以.txt或者.csv为扩展名,其中存储的是以字符为基本单位的数据。

文本文件操作是日常编程中非常常见的操作之一,可以用于读取和处理大量的文本数据,也可以用于将处理后的结果保存到文本文件中。

下面将介绍一些常用的文本文件操作方法。

1. 打开文件:在进行文本文件操作之前,需要先打开文件,以便后续的读写操作。

可以使用python内置的open()函数来打开文件,该函数的用法如下:file = open('filename.txt', 'r')其中'filename.txt'是要打开的文件名,'r'表示以只读模式打开文件。

还可以使用'w'表示以只写模式打开文件,'a'表示以追加模式打开文件。

2. 读取文件内容:打开文件之后,可以使用read()方法来读取文件中的内容。

该方法会一次性将文件中的所有内容读取到一个字符串中。

content = file.read()还可以使用readline()方法每次只读取文件中的一行内容,使用readlines()方法将文件中的内容按行读取到一个列表中。

line = file.readline()lines = file.readlines()3. 写入文件内容:如果以写入模式打开文件,就可以使用write()方法或者writelines()方法向文件中写入内容。

file.write('Hello World!')file.writelines(['Hello', 'World!'])4. 关闭文件:在对文件进行读写操作之后,要及时关闭文件,以释放资源。

file.close()另外,还可以使用with语句来打开文件,在语句块结束时会自动关闭文件。

javaspringboot导出下载文本文件操作(包含写文本文件)

javaspringboot导出下载文本文件操作(包含写文本文件)

javaspringboot导出下载⽂本⽂件操作(包含写⽂本⽂件)内容简介本⽂主要内容为使⽤java把内容写⼊⽂本⽂件,并实现下载/导出的功能。

实现步骤1. controller层@ResponseBody@RequestMapping(value = "/exportLand2ndClassIndex", method = RequestMethod.GET)public ResponseEntity<byte[]> exportLand2ndClassIndex(){return extractTifService.exportLand2ndClassIndex();}2. 服务实现层,请⾃⾏定义服务接⼝,这⾥不展⽰了/*** 导出* @return CallbackBody*/@Overridepublic ResponseEntity<byte[]> exportLand2ndClassIndex(){//查询表数据List<TswatLuc2ndClassIndex> list = tswatLuc2ndClassIndexDao.queryAllClassIndex();if (list == null || list.size() <= 0){return null;}List txtContentList = new ArrayList();txtContentList.add("\"value\",\"name\"");for(TswatLuc2ndClassIndex classIndex : list){String value = classIndex.getLevel2Code();String name = classIndex.getSwat();txtContentList.add(value + "," + name);}//导出的⽂件存储⽬录String fileSavePath = GisPathConfigurationUtil.getSwatLuc2ndClassIndexTxtFileSavePath();//保存⽂本⽂件writeToTxt(txtContentList, fileSavePath);//获取⽂本⽂件的ResponseEntitytry{ResponseEntity<byte[]> fileByte = buildResponseEntity(new File(fileSavePath));return fileByte;}catch (Exception e){e.printStackTrace();return null;}}/*** 将数据写⼊⽂本⽂件* @param list* @param path*/private void writeToTxt(List list,String path) {String dir = path.substring(0,stIndexOf("\\"));File parent = new File(dir);if (parent != null && !parent.exists()) {parent.mkdirs();}FileOutputStream outSTr = null;BufferedOutputStream Buff = null;String enter = "\r\n";StringBuffer write ;try {outSTr = new FileOutputStream(new File(path));Buff = new BufferedOutputStream(outSTr);for (int i = 0; i < list.size(); i++) {write = new StringBuffer();write.append(list.get(i));write.append(enter);Buff.write(write.toString().getBytes("UTF-8"));}Buff.flush();Buff.close();} catch (Exception e) {e.printStackTrace();} finally {try {Buff.close();outSTr.close();} catch (Exception e) {e.printStackTrace();}}}//读取⽂件private ResponseEntity<byte[]> buildResponseEntity(File file) throws IOException {byte[] body = null;//获取⽂件InputStream is = new FileInputStream(file);body = new byte[is.available()];is.read(body);HttpHeaders headers = new HttpHeaders();//设置⽂件类型headers.add("Content-Disposition", "attchement;filename=" + file.getName());//设置Http状态码HttpStatus statusCode = HttpStatus.OK;//返回数据ResponseEntity<byte[]> entity = new ResponseEntity<byte[]>(body, headers, statusCode);return entity;}。

spring中文API文档

spring中文API文档

这次发布的Spring Security-3.0.1 是一个bug fix 版,主要是对3.0 中存在的一些问题进行修正。

文档中没有添加新功能的介绍,但是将之前拼写错误的一些类名进行了修正,建议开发者以这一版本的文档为参考。

另:Spring Security 从2010-01-01 以后,版本控制从SVN 换成了GIT,我们在翻译文档的时候,主要是根据SVN 的变化来进行文档内容的比对,这次换成GIT 后,感觉缺少了之前那种文本比对工具,如果有对GIT 熟悉的朋友,还请推荐一下文本比对的工具,谢谢。

序言I. 入门1. 介绍1.1. Spring Security 是什么?1.2. 历史1.3. 发行版本号1.4. 获得Spring Security1.4.1. 项目模块1.4.1.1. Core - spring-security-core.jar1.4.1.2. Web - spring-security-web.jar1.4.1.3. Config - spring-security-config.jar1.4.1.4. LDAP - spring-security-ldap.jar1.4.1.5. ACL - spring-security-acl.jar1.4.1.6. CAS - spring-security-cas-client.jar1.4.1.7. OpenID - spring-security-openid.jar1.4.2. 获得源代码2. Security 命名空间配置2.1. 介绍2.1.1. 命名空间的设计2.2. 开始使用安全命名空间配置2.2.1. 配置web.xml2.2.2. 最小<http> 配置2.2.2.1. auto-config 包含了什么?2.2.2.2. 表单和基本登录选项2.2.3. 使用其他认证提供器2.2.3.1. 添加一个密码编码器2.3. 高级web 特性2.3.1. Remember-Me 认证2.3.2. 添加HTTP/HTTPS 信道安全2.3.3. 会话管理2.3.3.1. 检测超时2.3.3.2. 同步会话控制2.3.3.3. 防止Session 固定攻击2.3.4. 对OpenID 的支持2.3.4.1. 属性交换2.3.5. 添加你自己的filter2.3.5.1. 设置自定义AuthenticationEntryPoint2.4. 保护方法2.4.1. <global-method-security> 元素2.4.1.1. 使用protect-pointcut 添加安全切点2.5. 默认的AccessDecisionManager2.5.1. 自定义AccessDecisionManager2.6. 验证管理器和命名空间3. 示例程序3.1. Tutorial 示例3.2. Contacts3.3. LDAP 例子3.4. CAS 例子3.5. Pre-Authentication 例子4. Spring Security 社区4.1. 任务跟踪4.2. 成为参与者4.3. 更多信息II. 结构和实现5. 技术概述5.1. 运行环境5.2. 核心组件5.2.1. SecurityContextHolder, SecurityContext 和Authentication 对象5.2.1.1. 获得当前用户的信息5.2.2. UserDetailsService5.2.3. GrantedAuthority5.2.4. 小结5.3. 验证5.3.1. 什么是Spring Security 的验证呢?5.3.2. 直接设置SecurityContextHolder 的内容5.4. 在web 应用中验证5.4.1. ExceptionTranslationFilter5.4.2. AuthenticationEntryPoint5.4.3. 验证机制5.4.4. 在请求之间保存SecurityContext 。

iSpring操作说明

iSpring操作说明

点击下放图片跳转对应格式转换操作
SWF
HTML5
如果您的PPT版本过低,或不是office的PPT,移动端可以播放)
1 3 4
2
保存为HTML5 格式,选择 HTML5选项, 点击Publish。
上传到Bb方法
• 保存完成后会自动生成一个文件夹,文件夹内有一个文件夹一个名为index的 html文件。
发布效果
• 学生点击对应名称,在新页面中打开课件播放
2
保存为SWF格式 选择Flash选项, 点击Publish。
上传到Bb方法
保存完成后会自动生成一个文件夹,文件夹内有三个文件。如下图
进入Bb平台,在项目中通过文本编辑框上传视频按钮上传转好的文件
选择文件类型为swf的文件,默认名称为movie。建议上传前修改为与视 频名称一致的文件名。
上传成功后发布项目效果如下所示。
件名称
2. 点击Browse
选择保存路
2

3. 设置保存页
数。All
slides为全部
PPT;Selected
为选中的
PPT页数
4. 设置保存文
件类型
点击下放图片跳转对应格式转换操作
SWF
HTML5
如果您的PPT版本过低,或不是office的PPT,请点击上方按钮
保存为SWF格式说明
1 3 4
• 如下图
• 将文件夹压缩成ZIP格式
• 在内容区菜单内,创建内容中选择文件功能。
• 设置名称,点击浏览资源库或浏览课程
• 点击上传当中的上传Zip压缩包
• 选择对应Zip压缩包,点击提交
• 上传完成后,点击对应的文件夹
• 进入该文件夹后,选择对应的html文件,点击提交

Spring使用@Value注解与@PropertySource注解加载配置文件操作

Spring使用@Value注解与@PropertySource注解加载配置文件操作

Spring使⽤@Value注解与@PropertySource注解加载配置⽂件操作1、@Value注解简介Spring框架提供的@Value注解可以将外部的值动态注⼊到Bean中,@Value注解使⽤在字段、构造器参数和⽅法参数上。

@Value可以指定属性取值的表达式,⽀持通过#{}使⽤SpringEL来取值,也⽀持使⽤${}来将属性来源中(Properties⽂件、本地环境变量、系统属性等)的值注⼊到Bean的属性中。

此注解值的注⼊发⽣在AutowiredAnnotationBeanPostProcessor类中。

@Value注解实现以下⼏种情况:(1)注⼊普通字符;(2)注⼊操作系统属性;(3)注⼊表达式运算结果;(4)注⼊其他Bean的属性;(5)注⼊⽂件内容;(6)注⼊⽹址内容;(7)注⼊属性⽂件。

2、@PropertySource注解简介@PropertySource注解可以加载指定的属性⽂件(*.properties)到 Spring 的 Environment 中。

可以配合 @Value 和@ConfigurationProperties 使⽤。

语法格式如下:@PropertySource(value = "classpath:com/pjb/el/user.properties",encoding = "UTF-8")public class UserInfo{}【实例】使⽤@Value注解与@PropertySource注解加载配置⽂件。

(1)创建⽤户信息属性⽂件(user.properties)erId=1erName=pan_junbiao的博客user.blogUrl=https:///pan_junbiaouser.remark=您好,欢迎访问 pan_junbiao的博客(2)创建⽤户信息实体类(UserInfo.java)使⽤@PropertySource注解加载配置⽂件信息,然后使⽤@Value注解注⼊属性值。

实验4 Spring使用基础

实验4 Spring使用基础

实验4 Spring开发基础一、实验目的1.掌握Spring框架的概念、特点及结构。

2.学会利用MyEclipse开发Spring的过程和方法。

3.熟悉applicationContext.xml配置bean的方法。

4.掌握Spring框架的核心技术IoC(DI)、AOP。

二、实验步骤1.运行MyEclipse建立Web Project(File→New→Web Project),项目名称为ex1,如下图所示,单击Finish按钮完成项目创建。

2.右击项目名ex1,在快捷菜单中选择MyEclipse→Project Facets→InstallSpring Facet,单击Finish按钮,完成配置。

3.通过这些步骤,项目中增加了Spring 3.1.1库,项目src文件夹下添加了applicationContext.xml的配置文件。

请查看这些改变。

4.在项目的src文件夹下面建立test包,在该包下面建立Person接口,内含go方法,再建立类Student和Teacher,分别实现Person接口,代码如下:5.在applicationContext.xml中添加如下两个bean的定义:6.在包test中建立Test类,从应用程序上下文中获得对象,并调用对象方法,其中main方法的代码如下:7.运行主类Test,观察并分析运行结果。

8.通过Set方法注入依赖。

修改Student类和Teacher类,分别在其中添加私有字符串属性name和set、get方法(设置姓名,自动生成set、get方法),Teacher 类可以不要getName方法,修改go方法,在输出原有字符串前增加name的输出,代码如下:9.修改applicationContext.xml中的两个bean元素,设置name属性值,修改如下:10.再次运行主类Test,观察并分析运行结果。

11.引用其他bean,在Spring容器中将bean注入需要调用的实例。

java利用springJavaMailSenderImpl发送邮件,支持普通文本、附件、。。。

java利用springJavaMailSenderImpl发送邮件,支持普通文本、附件、。。。

java利⽤springJavaMailSenderImpl发送邮件,⽀持普通⽂本、附件、。

博客分类:本⽂主要介绍利⽤发送邮件。

⾸先介绍了发送⼀般邮件,然后介绍了发送富⽂本(html)邮件及以velocity为模板发送邮件。

邮件发送分为为三步:创建邮件发送器、编写邮件、发送邮件。

Spring的提供了强⼤的邮件发送功能,可发送普通⽂本邮件、带附件邮件、html格式邮件、带图⽚邮件、设置发送内容编码格式、设置发送⼈的显⽰名称。

下⾯就进⾏介绍,⽰例代码中很多都是字符串硬编码,实际使⽤时推荐使⽤spring的配置⽂件进⾏配置。

1、创建邮件发送器⾸先定义对象,并对其进⾏smtp相关信息设置,相当于我们⾃⼰的邮箱,如下:Java代码1. JavaMailSenderImpl mailSender = new JavaMailSenderImpl();2. mailSender.setHost("");3. mailSender.setUsername("mosaic@");4. mailSender.setPassword("asterisks");JavaMailSenderImpl mailSender = new JavaMailSenderImpl();mailSender.setHost("");mailSender.setUsername("mosaic@");mailSender.setPassword("asterisks");当然更好的⽅法是使⽤配置⽂件进⾏配置,这⾥只是进⾏介绍,忽略硬编码先。

以上主机为邮箱服务商的smtp地址,⽤户名、密码为⽤户⾃⼰的邮箱。

除以上外还可以设置setPort(int port) 、setProtocol(String protocol) 等,可暂时不考虑。

spring配置详解

spring配置详解

spring配置详解1.前⾔公司⽼项⽬的后台,均是基于spring框架搭建,其中还⽤到了log4j.jar等开源架包。

在新项⽬中,则是spring和hibernate框架均有使⽤,利⽤了hibernate框架,来实现持久化,简化sql操作等。

Hibernate配置⽂件可以有两种格式,⼀种是 hibernate.properties,另⼀种是hibernate.cfg.xml。

后者稍微⽅便⼀些,当增加hbm映射⽂件的时候,可以直接在 hibernate.cfg.xml ⾥⾯增加,不必像 hibernate.properties 必须在初始化代码中加⼊。

我们新项⽬中使⽤的是hibernate.cfg.xml格式。

不过在本⽂中不将细述,后续有机会再补上。

公司项⽬中,中间件主要有tomcat,webshpere,WebLogic。

以下,将对项⽬中spring基本配置,log4j的配置,还有中间件的相关参数配置做⼀个初步的介绍。

2.spring配置——以⽼GIS项⽬为例⼦GISV13中的配置涉及到了SpringMVC,IOC,AOP, Quartz⽅⾯的配置。

配置的实现是通过注记配置和XML配置来合作实现。

这⾥,我将按照Spring的配置流程,将其他⼏个⽅⾯的配置融合其中,来进⾏全⾯解析。

2.1SpringMVC的配置2.1.1.web.xml的配置Web程序中,当中间件启动时,中间件会⾸先读取web.xml中的配置。

在web.xml中可以配置监听器,过滤器,servlet映射等等。

在Spring 框架中,我们主要需配置容器初始化时读取的spring容器配置⽂件的路径以及springMVC中的分发器DispatcherServlet。

在GISV13的web.xml中,我们定义了如下内容:InitGISConfigServlet定义了容器启动时,⾸先要运⾏这个⽅法。

然后servletname为MVC的这部分便是定义了springMVC的分发器以及此servlet所对应的加载配置⽂件的路径。

spring jdbc配置文件进行加密解密

spring jdbc配置文件进行加密解密

Linux主要shell命令详解shell是用户和Linux操作系统之间的接口。

Linux中有多种shell,其中缺省使用的是Bash。

本章讲述了shell的工作原理,shell的种类,shell的一般操作及Bash的特性。

什么是shellLinux系统的shell作为操作系统的外壳,为用户提供使用操作系统的接口。

它是命令语言、命令解释程序及程序设计语言的统称。

shell是用户和Linux内核之间的接口程序,如果把Linux内核想象成一个球体的中心,shell就是围绕内核的外层。

当从shell或其他程序向Linux传递命令时,内核会做出相应的反应。

shell是一个命令语言解释器,它拥有自己内建的shell命令集,shell也能被系统中其他应用程序所调用。

用户在提示符下输入的命令都由shell先解释然后传给Linux核心。

有一些命令,比如改变工作目录命令cd,是包含在shell内部的。

还有一些命令,例如拷贝命令cp和移动命令rm,是存在于文件系统中某个目录下的单独的程序。

对用户而言,不必关心一个命令是建立在shell内部还是一个单独的程序。

shell首先检查命令是否是内部命令,若不是再检查是否是一个应用程序(这里的应用程序可以是Linux本身的实用程序,如ls和rm,也可以是购买的商业程序,如xv,或者是自由软件,如emacs)。

然后shell在搜索路径里寻找这些应用程序(搜索路径就是一个能找到可执行程序的目录列表)。

如果键入的命令不是一个内部命令并且在路径里没有找到这个可执行文件,将会显示一条错误信息。

如果能够成功找到命令,该内部命令或应用程序将被分解为系统调用并传给Linux内核。

shell的另一个重要特性是它自身就是一个解释型的程序设计语言,shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数、变量、数组和程序控制结构。

shell编程语言简单易学,任何在提示符中能键入的命令都能放到一个可执行的shell程序中。

SpringBoot-使用HSSFWorkbook操作excel教程2(从excel文件导入数据)

SpringBoot-使用HSSFWorkbook操作excel教程2(从excel文件导入数据)

SpringBoot-使⽤HSSFWorkbook操作excel教程2(从excel⽂件导⼊数据)在之前的⽂章中演⽰了如何实现数据的导出,本⽂接着演⽰如何实现数据导⼊。

对前端⽽⾔,数据导⼊就是⽂件上传,对后端这边则是获取上传的⽂件进⾏解析,并把解析出来的数据保存到数据库中。

⼆、从 excel ⽂件导⼊数据1,添加依赖编辑项⽬的 pom.xml ⽂件,添加 poi 相关依赖:1 2 3 4 5<dependency><groupId>org.apache.poi</groupId> <artifactId>poi</artifactId><version>3.17</version></dependency>2,创建数据模型这⾥我们定义⼀个 User 模型对象,后⾯将会把解析出来的数据转成这个数据模型集合。

1 2 3 4 5 6 7 8 9 10 11 12@Getter@Setter@AllArgsConstructor@NoArgsConstructor @ToStringpublic class User {private int id;private String name; private String gender; private Date birthday; private String workID; }3,创建导⼊⼯具类为⽅便使⽤,这⾥封装⼀个⽤于导⼊数据的⼯具类。

⾥⾯主要⼯作是获取上传⽂件的流,然后进⾏解析,最终将得到的数据集合返回。

12345 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24public class PoiUtils {// 从excel⽂件中导⼊数据public static List<User> importUser2List(MultipartFile file) {List<User> users = new ArrayList<>();try{// 根据上传⽂件的流获取⼀个 HSSFWorkbook 对象HSSFWorkbook workbook =new HSSFWorkbook(new POIFSFileSystem(file.getInputStream())); // 获取 workbook 中表单的个数int numberOfSheets = workbook.getNumberOfSheets();// 遍历表单for(int i = 0; i < numberOfSheets; i++) {HSSFSheet sheet = workbook.getSheetAt(i);// 对于每个表单,先获取⾏数int physicalNumberOfRows = sheet.getPhysicalNumberOfRows();User user;for(int j = 0; j < physicalNumberOfRows; j++) {if(j == 0) {continue;//标题⾏跳过}HSSFRow row = sheet.getRow(j);if(row == null) {24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 if(row == null) {continue;//没数据跳过}// 如果该⾏数据正常,则获取改⾏的单元格个数进⾏遍历int physicalNumberOfCells = row.getPhysicalNumberOfCells(); user = new User();for(int k = 0; k < physicalNumberOfCells; k++) {HSSFCell cell = row.getCell(k);switch(cell.getCellTypeEnum()) {// 处理格式为普通⽂本的单元格数据case STRING: {String cellValue = cell.getStringCellValue();if(cellValue == null) {cellValue = "";}switch(k) {case1:user.setName(cellValue);break;case2:user.setWorkID(cellValue);break;case3:user.setGender(cellValue);break;}}break;// 处理其他格式的单元格数据default: {switch(k) {case0:user.setId((int)cell.getNumericCellValue());break;case4:user.setBirthday(cell.getDateCellValue());break;}}break;}}users.add(user);}}} catch(IOException e) {e.printStackTrace();}// 将遍历得到的数据集合返回return users;}}4,数据导⼊接⼝我们创建⼀个 Controller 调⽤这个⼯具类来获取 excel ⽂件中的⼈员数据:1 2 3 4 5 6 7 8 9 10 11 12@RestControllerpublic class HelloController {@PostMapping("/importUser")public String importUser(MultipartFile file) {List<User> users = PoiUtils.importUser2List(file);System.out.println("--- 共有"+ users.size() + "条数据 ---"); for(User user: users) {System.out.println(user);}return"导出成功!";}}125,前端实现前端主要是⼀个 Excel 表格的上传,这⾥直接采⽤ Element 的⽂件上传控件,具体代码如下:(1)el-upload 组件属性介绍:accept:表⽰接收的上传⽂件类型action:表⽰上传接⼝:on-success:表⽰上传成功时的回调:on-error:表⽰上传失败时的回调:disabled:表⽰当 fileUploadBtnText 属性的值为“正在导⼊”时禁⽤上传控件:before-upload:表⽰⽂件上传前的回调(2)el-button 组件属性介绍::loading="fileUploadBtnText=='正在导⼊'" 表⽰当 fileUploadBtnText ⽂本为“正在导⼊”时,显⽰⼀个 Loading 加载1234 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44<template><div><el-upload:show-file-list="false"accept="application/vnd.ms-excel"action="/importUser":on-success="fileUploadSuccess":on-error="fileUploadError":disabled="fileUploadBtnText=='正在导⼊'":before-upload="beforeFileUpload"style="display: inline"><el-button size="mini"type="success":loading="fileUploadBtnText=='正在导⼊'"> <i class="fa fa-lg fa-level-up"style="margin-right: 5px"></i>{{fileUploadBtnText}} </el-button></el-upload></div></template><script>export default{data(){return {fileUploadBtnText: '导⼊数据', // 按钮⽂字}},methods: {// ⽂件上传成功的回调fileUploadSuccess(response, file, fileList) {if (response) {this.$message({type: 'success', message: response});}this.fileUploadBtnText = '导⼊数据';},// ⽂件上传失败的回调fileUploadError(err, file, fileList) {this.$message({type: 'error', message: "导⼊失败!"});this.fileUploadBtnText = '导⼊数据';},// ⽂件上传前的回调beforeFileUpload(file) {this.fileUploadBtnText = '正在导⼊';}}}</script><style></style>6,运⾏测试(1)准备⼀个⽤于上传的 excel ⽂件,内容如下:(2)点击“导⼊数据”按钮选择 excel ⽂件后会⾃动上传:(3)后端接收到⽂件后解析并打印出相关信息:(4)同时前端也会显⽰成功信息:。

springboot@Value实现获取计算机中绝对路径文件的内容

springboot@Value实现获取计算机中绝对路径文件的内容

springboot@Value实现获取计算机中绝对路径⽂件的内容⽬录springboot @Value获取绝对路径⽂件的内容默认情况下使⽤同样的我们可以使⽤file协议获取⽂本的内容Spring注解@Value解读依赖注⼊概述实际应⽤案例源码解读分析1、⾸先进⼊SpringApplication.run(XXXApplication.class, args)2、然后进⼊到AbstractApplicationContext的refresh()⽅法3、⽽后进⼊到DefaultListableBeanFactory的preInstantiateSingletons()⽅法4、然后我们进⼊到AbstractAutowireCapableBeanFactory5、我们略过创建实例的过程6、第5步完成了AbstractAutowireCapableBeanFactoryspringboot @Value获取绝对路径⽂件的内容默认情况下使⽤@Value("aaa.txt")private Resource txtResource;这样获取到的是项⽬classpath 下的 aaa.txt如果想获取⾮项⽬路径下的⽂件内容怎么办呢,看了下@Value的好像也没有说,其实@Value("https://")private Resource urlResource;这样是可以获取到百度⾸页的内容的.它这⾥使⽤的是https协议.同样的我们可以使⽤file协议获取⽂本的内容即:@Value("file:///E://aaa.txt")private Resource txtResource;使⽤@Value 有⼀个好处就是,你不⽤关⼼⽂本内容的变化,你每次调⽤的时候,springboot 会⾃动帮你重新加载.Spring注解@Value解读主要通过源码解读来分析@Value实现属性注⼊Spring Bean的过程,并对static类型字段⽆法通过@Value注⼊为Spring Bean依赖的原因做⼀个探究。

Springboot整合PageOffice实现word在线编辑保存功能

Springboot整合PageOffice实现word在线编辑保存功能

Springboot整合PageOffice实现word在线编辑保存功能⽬录⼀、查看官⽹⼆、查看下载包三、测试四、gitee地址⼀、查看官⽹点击⾸页下载,进⼊页⾯:最新得5.2,我们就下载5.2版本进⾏测试。

⼆、查看下载包Samples5 为⽰例⽂件。

放⼊tomcat中得webapps可以直接访问。

localhost:8080/Samples5/index.html集成⽂件⾥⾯有我们需要jar包新建springboot项⽬以及简单测试这⾥就不多说了。

1、springboot 引⼊ pageoffice5.2.0.12.jar2、springboot 引⼊thymleaf<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency>3、编写配置⽂件/*** PageOffice 配置类*/@Configurationpublic class PageOfficeConfig {@Value("${file.save.path}")String poSysPath;/*** 添加PageOffice的服务器端授权程序Servlet(必须)* @return*/@Beanpublic ServletRegistrationBean servletRegistrationBean() {com.zhuozhengsoft.pageoffice.poserver.Server poserver = new com.zhuozhengsoft.pageoffice.poserver.Server();//设置PageOffice注册成功后,license.lic⽂件存放的⽬录poserver.setSysPath(poSysPath);ServletRegistrationBean srb = new ServletRegistrationBean(poserver);srb.addUrlMappings("/poserver.zz");srb.addUrlMappings("/posetup.exe");srb.addUrlMappings("/pageoffice.js");srb.addUrlMappings("/jquery.min.js");srb.addUrlMappings("/pobstyle.css");srb.addUrlMappings("/sealsetup.exe");return srb;}}4、编写 index.html 和 word.html4.1 index.html<!DOCTYPE html><html xmlns="/1999/xhtml" xmlns:th=""><head><meta charset="UTF-8"><title>Title</title><!-- office插件js begin 必须引⼊--><script type="text/javascript" src="/jquery.min.js"></script><script type="text/javascript" src="/pageoffice.js" id="po_js_main"></script><!-- end --></head><body><a href="javascript:POBrowser.openWindowModeless('word','width=1200px;height=800px;');" rel="external nofollow" >打开⽂件</a> </body></html>4.2 word.html**<!DOCTYPE html><html xmlns="/1999/xhtml" xmlns:th=""><head><meta charset="UTF-8"><title>Title</title></head><body><input id="Button1" type="button" value="隐藏/显⽰标题栏" onclick="return Button1_onclick()" /><input id="Button2" type="button" value="隐藏/显⽰菜单栏" onclick="return Button2_onclick()" /><input id="Button3" type="button" value="隐藏/显⽰⾃定义⼯具栏" onclick="return Button3_onclick()" /><input id="Button4" type="button" value="隐藏/显⽰ Office⼯具栏" onclick="return Button4_onclick()" /><div style="width:1000px;height:700px;" th:utext="${pageoffice}"> </div><script type="text/javascript">function Save() {document.getElementById("PageOfficeCtrl1").WebSave();}function PrintFile(){document.getElementById("PageOfficeCtrl1").ShowDialog(4);}function IsFullScreen(){document.getElementById("PageOfficeCtrl1").FullScreen = !document.getElementById("PageOfficeCtrl1").FullScreen; }function CloseFile(){window.external.close();}function BeforeBrowserClosed(){if (document.getElementById("PageOfficeCtrl1").IsDirty){if(confirm("提⽰:⽂档已被修改,是否继续关闭放弃保存?")){return true;}else{return false;}}}// 隐藏/显⽰标题栏function Button1_onclick() {var bVisible = document.getElementById("PageOfficeCtrl1").Titlebar;document.getElementById("PageOfficeCtrl1").Titlebar = !bVisible;}// 隐藏/显⽰菜单栏function Button2_onclick() {var bVisible = document.getElementById("PageOfficeCtrl1").Menubar;document.getElementById("PageOfficeCtrl1").Menubar = !bVisible;}// 隐藏/显⽰⾃定义⼯具栏function Button3_onclick() {var bVisible = document.getElementById("PageOfficeCtrl1").CustomToolbar;document.getElementById("PageOfficeCtrl1").CustomToolbar = !bVisible;}// 隐藏/显⽰ Office⼯具栏function Button4_onclick() {var bVisible = document.getElementById("PageOfficeCtrl1").OfficeToolbars;document.getElementById("PageOfficeCtrl1").OfficeToolbars = !bVisible;}</script></body></html>**5、编写PageOfficeController/*** PageOffice Demo*/@Controller@RequestMapping("/page")public class PageOfficeController {/*** 进⼊测试* @return*/@RequestMapping(value="/index", method=RequestMethod.GET)public ModelAndView showIndex(){ModelAndView mv = new ModelAndView("index");return mv;}/*** office online打开* @param request* @param map* @return*/@RequestMapping(value="/word", method=RequestMethod.GET)public ModelAndView showWord(HttpServletRequest request, Map<String,Object> map){//--- PageOffice的调⽤代码开始 -----PageOfficeCtrl poCtrl=new PageOfficeCtrl(request);poCtrl.setServerPage("/poserver.zz");//设置授权程序servletpoCtrl.addCustomToolButton("保存","Save()",1); //添加⾃定义按钮poCtrl.addCustomToolButton("打印", "PrintFile()", 6);poCtrl.addCustomToolButton("全屏/还原", "IsFullScreen()", 4);poCtrl.addCustomToolButton("关闭", "CloseFile()", 21);poCtrl.setSaveFilePage("/page/save");//设置保存的actionpoCtrl.webOpen("D:\\page\\test.docx", OpenModeType.docAdmin,"张三");poCtrl.setCaption("信息平台");map.put("pageoffice",poCtrl.getHtmlCode("PageOfficeCtrl1"));//--- PageOffice的调⽤代码结束 -----ModelAndView mv = new ModelAndView("word");return mv;}/*** 保存* @param request* @param response*/@RequestMapping("/save")public void saveFile(HttpServletRequest request, HttpServletResponse response){FileSaver fs = new FileSaver(request, response);fs.saveToFile("d:\\page\\" + fs.getFileName());fs.close();}}6.application.yml 配置server:port: 8080spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/test?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=UTC username: rootpassword: finn123# thymeleaf页⾯模板配置thymeleaf:prefix: classpath:/templates/suffix: .htmlmvc:view:prefix: classpath:/templates/suffix: .htmlresources:static-locations: classpath:/templates/,classpath:/static/file:save:path: d:/page/7.注意项⽬结构注意jquery.min.js 和 pageoffice.js⽂件地址三、测试输⼊⽹址打开⽂件,或让你先进⾏下载pageoffice。

文本文件的读写方法

文本文件的读写方法

文本文件的读写方法1. 打开文件:在进行文本文件的读写之前,首先需要使用合适的方式打开文件,可以使用Python的open()函数来实现。

2. 读取文件内容:使用Python的read()方法来读取文本文件中的内容,可以一次性读取整个文件的内容,也可以指定读取的字符数。

3. 逐行读取:使用readline()方法来逐行读取文本文件的内容,适用于处理大型文本文件。

4. 读取所有行:使用readlines()方法来读取文本文件中所有行的内容,并将其保存在一个列表中。

5. 写入文件内容:使用write()方法将数据写入到文本文件中,可以是字符串或者其他数据类型。

6. 追加模式:使用'w'模式打开文件时,如果文件已经存在,会将其内容清空然后重新写入,为了避免覆盖原有内容,可以使用'a'模式来进行追加写入。

7. 关闭文件:使用close()方法关闭打开的文件,确保文件被正确释放并保存所做的更改。

8. with语句:使用Python的with语句可以更方便地管理文件的打开和关闭,可以自动处理文件对象的释放。

9. 二进制模式:在打开文件时,可以使用'b'模式来指定二进制模式,适用于处理非文本文件。

10. 编码设置:在打开文件时,可以指定文件的编码格式,以便正确解析文件中的内容,如'utf-8'、'gbk'等。

11. 文件指针操作:使用seek()方法可以移动文件指针到指定位置,以便进行读取或者写入相关操作。

12. tell()方法:使用tell()方法可以获取文件指针当前的位置,便于记录文件读写的位置。

13. 读取指定字节数:使用read(n)方法可以读取指定数量的字节数,对于大文本文件可以节省内存。

14. 写入换行符:使用'\n'来添加换行符,以便实现文件内容的分行显示。

15. 文件操作异常处理:在读写文件时,使用try-except语句处理可能出现的异常,如文件不存在、权限错误等。

Spring系列之Spring常用注解总结

Spring系列之Spring常用注解总结

Spring系列之Spring常⽤注解总结Spring系列之Spring常⽤注解总结传统的Spring做法是使⽤.xml⽂件来对bean进⾏注⼊或者是配置aop、事物,这么做有两个缺点:1、如果所有的内容都配置在.xml⽂件中,那么.xml⽂件将会⼗分庞⼤;如果按需求分开.xml⽂件,那么.xml⽂件⼜会⾮常多。

总之这将导致配置⽂件的可读性与可维护性变得很低。

2、在开发中在.java⽂件和.xml⽂件之间不断切换,是⼀件⿇烦的事,同时这种思维上的不连贯也会降低开发的效率。

为了解决这两个问题,Spring引⼊了注解,通过"@XXX"的⽅式,让注解与Java Bean紧密结合,既⼤⼤减少了配置⽂件的体积,⼜增加了Java Bean的可读性与内聚性。

不使⽤注解:先看⼀个不使⽤注解的Spring⽰例,在这个⽰例的基础上,改成注解版本的,这样也能看出使⽤与不使⽤注解之间的区别,先定义⼀个⽼虎:package com.spring.model;public class Tiger {private String tigerName="TigerKing";public String toString(){return "TigerName:"+tigerName;}}再定义⼀个猴⼦:package com.spring.model;public class Monkey {private String monkeyName = "MonkeyKing";public String toString(){return "MonkeyName:" + monkeyName;}}定义⼀个动物园:package com.spring.model;public class Zoo {private Tiger tiger;private Monkey monkey;public Tiger getTiger() {return tiger;}public void setTiger(Tiger tiger) {this.tiger = tiger;}public Monkey getMonkey() {return monkey;}public void setMonkey(Monkey monkey) {this.monkey = monkey;}public String toString(){return tiger + "\n" + monkey;}}spring的配置⽂件这么写:<?xml version="1.0" encoding="UTF-8"?><beansxmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:p="/schema/p"xmlns:context="/schema/context"xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-3.0.xsd/schema/context/schema/context/spring-context-3.0.xsd"><bean id="zoo" class="com.spring.model.Zoo"><property name="tiger" ref="tiger"/><property name="monkey" ref="monkey"/></bean><bean id="tiger" class="com.spring.model.Tiger"/><bean id="monkey" class="com.spring.model.Monkey"/></beans>测试⽅法:public class TestAnnotation {/*** 不使⽤注解*/@Testpublic void test(){//读取配置⽂件ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext2.xml");Zoo zoo=(Zoo) ctx.getBean("zoo");System.out.println(zoo.toString());}}都很熟悉,权当复习⼀遍了。

springboot富文本导出word、pdf

springboot富文本导出word、pdf

springboot富⽂本导出word、pdf 1.导出word添加依赖<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.14</version></dependency>实现层代码private void downloadWord(HttpServletResponse response, Resource resource) {String title = resource.getTitle();String text = resource.getContent();try {//word内容String content="<html><body>" +"<p style=\"text-align: center;\"><span style=\"font-family: ⿊体, SimHei; font-size: 24px;\">"+ title + "</span></p>" + text + "</body></html>";byte b[] = content.getBytes("GBK"); //这⾥是必须要设置编码的,不然导出中⽂就会乱码。

ByteArrayInputStream bais = new ByteArrayInputStream(b);//将字节数组包装到流中/** 关键地⽅* ⽣成word格式 */POIFSFileSystem poifs = new POIFSFileSystem();DirectoryEntry directory = poifs.getRoot();DocumentEntry documentEntry = directory.createDocument("WordDocument", bais);//输出⽂件// request.setCharacterEncoding("utf-8");response.setContentType("application/msword");//导出word格式response.addHeader("Content-Disposition", "attachment;filename=" +new String(title.getBytes("GB2312"),"iso8859-1") + ".doc");ServletOutputStream ostream = response.getOutputStream();poifs.writeFilesystem(ostream);bais.close();ostream.close();poifs.close();}catch(Exception e){e.printStackTrace();}}2.导出pdf添加依赖<dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency><dependency><groupId>com.itextpdf.tool</groupId><artifactId>xmlworker</artifactId><version>5.5.8</version></dependency>压缩并导出实现代码private void downloadPdf(HttpServletResponse response, Resource resource) {String content = resource.getContent();content = MyUtil.handleConvertPdfContent(content);String rootDir = System.getProperty("user.dir")+"/";String pdfDir = rootDir+"temp/pdf/";String pdfFileName = resource.getTitle()+".pdf";try {String path = pdfDir + pdfFileName;File pdfFileDir = new File(pdfDir);if (!pdfFileDir.exists()) {pdfFileDir.mkdirs();}FileOutputStream pdfOut = new FileOutputStream(path);// 第⼀步创建⽂档实例⽂章pdf导出+压缩包下载Document document = new Document();// 第⼆步获取PdfWriter实例写⼊⽂件到⽬录 pdfDir + responseFileNamePdfWriter writer = PdfWriter.getInstance(document, pdfOut);// 第三步打开⽂档document.open();//获取 XMLWorkerHelper实例XMLWorkerHelper work = XMLWorkerHelper.getInstance();//解析html⽂件,创建pdf⽂档work.parseXHtml(writer, document, new ByteArrayInputStream(content.getBytes()));// 第五部操作完成后必须执⾏⽂档关闭操作。

Spring中的spring.factories文件用法(Spring如何加载第三方Bean)

Spring中的spring.factories文件用法(Spring如何加载第三方Bean)

Spring中的spring.factories⽂件⽤法(Spring如何加载第三⽅Bean)⽬录Spring的spring.factories⽂件⽤法问题解决SpringBoot的扩展机制之Spring Factories什么是 SPI机制Spring Boot中的SPI机制Spring Factories实现原理是什么Spring Factories在Spring Boot中的应⽤Spring的spring.factories⽂件⽤法在springBoot中,它⾃动扫描包的时候,只会扫描⾃⼰模块下的类。

问题如果我们不想被Spring容器管理的Bean的路径下不再SpringBoot的包扫描路径下,怎么办呢?如何加载别的第三⽅Bean呢?解决⾸先我们创建⼀个⼯程,另外创建⼀个与启动类不在⼀个级别的⽬录。

第⼀种⽅法就是使⽤在启动类上加上@Import注解。

@Import(value = {Test.class})第⼆种⽅法就是创建spring.factories⽂件现在我们将其改造⼀下,采⽤spring.factories的⽅式去加载Test类,在resources⽬录下新建⼀个META-INF的⽬录,然后再新建⼀个spring.factories⽂件,⽂件内容为:下⾯第⼆条就是我们⾃⼰的类的路径。

org.springframework.boot.autoconfigure.EnableAutoConfiguration=/com.huawei.it.config.Test然后在springBoot中的启动类中将@Import注释掉,启动⼀下,在控制台上就会发现,我们⾃⼰的配置类已经加载到Spring容器中去了,所以Spring可以加载⼀个⼯程下的任意⼀下⼯程类了。

应⽤下⾯就是我在Nacos源码中看到的,可以看到spring.factories⽂件中内容,与我们⾃⼰类加载到Spring容器中是⼀样的道理。

解决springboot获取form-data里的file文件的问题

解决springboot获取form-data里的file文件的问题

解决springboot获取form-data⾥的file⽂件的问题解决springboot 获取form-data⾥的file⽂件的问题前⾔:这两天⽤ springboot 和同事的 iOS 客户端上传⽂件对接。

在客户端他使⽤的是 afnetworking 第三⽅库。

我使⽤的是springboot 集成的 StandardMultipartHttpServletRequest 的解析⽅式。

写好服务器端的接⼝以后,使⽤ postman 模拟 form-data 混合上传普通⽂本数据和 file ⽂件是没问题的。

后来再 iOS 端混合上传⽂本和 file 的时候,发现 multiPartFile 解析不到⽂件。

经过查看 StandardMultipartHttpServletRequest 的源⽂件,以及断点跟踪,发现在 form-data 解析成 part 的时候是没问题的,在遍历 part 的时候就发现问题的所在了。

下图是 postman 模拟上传时候的断点跟踪:postman模拟上传在途中的红框⾥可以发现在 files 这个 part ⾥⾯的 content-dispostion 这个 key 对应的 value ⾥⾯包含filename="Jitu....."部分。

⽽在普通的⽂本输⼊框对应的 part 部分是没这段值的。

我⽤ iOS 客户端进⾏测试的时候发现⽂件上传的部分是缺少这段值的.我们再来看StandardMultipartHttpServletRequest的⼀部分源码:private static final String CONTENT_DISPOSITION = "content-disposition";private static final String FILENAME_KEY = "filename=";private static final String FILENAME_WITH_CHARSET_KEY = "filename*=";private void parseRequest(HttpServletRequest request) {try {Collection<Part> parts = request.getParts();this.multipartParameterNames = new LinkedHashSet<String>(parts.size());MultiValueMap<String, MultipartFile> files = new LinkedMultiValueMap<String, MultipartFile>(parts.size());for (Part part : parts) {String disposition = part.getHeader(CONTENT_DISPOSITION);String filename = extractFilename(disposition);if (filename == null) {filename = extractFilenameWithCharset(disposition);}if (filename != null) {files.add(part.getName(), new StandardMultipartFile(part, filename));} else {this.multipartParameterNames.add(part.getName());}}setMultipartFiles(files);}catch (Throwable ex) {throw new MultipartException("Could not parse multipart servlet request", ex);}}private String extractFilename(String contentDisposition) {return extractFilename(contentDisposition, FILENAME_KEY);}第⼀个⽅法是解析 request 请求的, 作⽤是将 request ⾥⾯的form-data表单数据分类解析为普通⽂本输⼊和⽂件输⼊, ⽽第⼆个⽅法就是⽤来判断是否为⽂件的, 其中第⼆个参数值就是filename=, 如果content-dispostion的值⾥包含这个值, 则判断为⽂件,否则就是普通⽂本输⼊. 看到这⾥就能明⽩为什么在跟 iOS 客户端联调的时候没把⽂件流解析成multipartFile. 这时候只需要在客户端组装form-data的时候需要加上filename=xxx这部分值.以上就是springboot 获取form-data⾥的file⽂件的实例详解,如有疑问请留⾔或到本站社区交流讨论,感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!。

SpringBoot大文件(百M以上)的上传下载实现技术

SpringBoot大文件(百M以上)的上传下载实现技术

SpringBoot⼤⽂件(百M以上)的上传下载实现技术1 背景⽤户本地有⼀份txt或者csv⽂件,⽆论是从业务数据库导出、还是其他途径获取,当需要使⽤蚂蚁的⼤数据分析⼯具进⾏数据加⼯、挖掘和共创应⽤的时候,⾸先要将本地⽂件上传⾄ODPS,普通的⼩⽂件通过浏览器上传⾄服务器,做⼀层中转便可以实现,但当这份⽂件⾮常⼤到了10GB级别,我们就需要思考另⼀种形式的技术⽅案了,也就是本⽂要阐述的⽅案。

技术要求主要有以下⼏⽅⾯:⽀持超⼤数据量、10G级别以上稳定性:除⽹络异常情况100%成功准确性:数据⽆丢失,读写准确性100%效率:1G⽂件分钟级、10G⽂件⼩时级体验:实时进度感知、⽹络异常断点续传、定制字符特殊处理2 ⽂件上传选型⽂件上传⾄ODPS基本思路是先⽂件上传⾄某中转区域存储,然后同步⾄ODPS,根据存储介质可以分为两类,⼀类是应⽤服务器磁盘,另⼀类类是中间介质,OSS作为阿⾥云推荐的海量、安全低成本云存储服务,并且有丰富的API⽀持,成为中间介质的⾸选。

⽽⽂件上传⾄OSS⼜分为web直传和sdk上传两种⽅案,因此上传⽅案有如下三种,详细优缺点对⽐如下:蚂蚁的⽂本上传功能演进过程中对第⼀种、第⼆种⽅案均有实践,缺点⽐较明显,如上表所述,不满⾜业务需求,因此⼤⽂件上传终极⽅案是⽅案三。

3 整体⽅案以下是⽅案三的整体过程⽰意图。

请求步骤如下:1. ⽤户向应⽤服务器取到上传policy和回调设置。

2. 应⽤服务器返回上传policy和回调。

3. ⽤户直接向OSS发送⽂件上传请求。

等⽂件数据上传完,OSS给⽤户Response前,OSS会根据⽤户的回调设置,请求⽤户的服务器。

如果应⽤服务器返回成功,那么就返回⽤户成功,如果应⽤服务器返回失败,那么OSS也返回给⽤户失败。

这样确保了⽤户上传成功,应⽤服务器已经收到通知了。

4. 应⽤服务器给OSS返回。

5. OSS将应⽤服务器返回的内容返回给⽤户。

6. 启动后台同步引擎执⾏oss到odps的数据同步。

利用spring的jdbcTemplate处理blob、clob

利用spring的jdbcTemplate处理blob、clob

所谓CLOB 可以看成是文本文,所谓BLOB可以看成是图片文件假设在mysql数据库上有以下表:create table test(id int primary key,txt TEXT,image BLOB);//写入假设现在分别读取一个文字文件和二进制文件,并想将之存储到数据库中,则可以使用JdbcTemplate 如:final File binaryFile=new File(";wish.jpg";);final File txtFile=new File(";test.txt";);final InputStream is=new FileInputStream(binaryFile);final Reader reader=new FileReader(txtFile);JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);final LobHandler lobHandler=new DefaultLobHandler();jdbcTemplate.execute(";insert into test (txt,image) values (?,?)";,new AbstractLobCreatingPreparedStatementCallBack(lobHandler)...{protected void setValues(PreoparedStatement pstmt,LobCreator lobCreator)...{lobCreator.setClobAsCharactoerStream(pstmt,1,reader,(int)textFile.length());lobCreator.setBlobAsBinaryStream(pstmt,2,is,(int)binaryFile.length());}});reader.close();is.close();//读取在建立AbstractLobCreatingPreparedStatementCallBack对象时候,需要一个lobHandler 实例,对于一般的数据库,采用DefaultLobHandler足以,对于Oracle特定的lob处理,可以使用OracleLobHandler如果是讲数据从数据库中读取出来并另存在未见,可以使用下面的程序final Writer writer=new FileWriter(";test_back.txt";);final OutputStream os=new FileOutputStream(new File(";wish_bak.jpg";)); jdbcTemplate.query(";select txt,image from test where id=?,new AbstractLobStreamingResultSetExtractor(){protected void streamData(ResultSet rs) throws SQLException,IOException,DataAccessException...{FileCopyUtils.copy(lobHandler.getClobAsCharacterStream(rs,1),writer);FileCopyUtils.copy(lobHandler.getBlobAsBinaryStream(rs,2),os);}});writer.close();os.close();这里使用FileCopyUtils的copy方法,将lobHandler取得的串流直接转接给文件输出FileWriter,FileOutputStream对象。

spring接口通过配置支持返回多种格式(xml,json,html,excel)

spring接口通过配置支持返回多种格式(xml,json,html,excel)

spring接⼝通过配置⽀持返回多种格式(xml,json,html,excel)1. 简介本⽂主要给⼤家介绍使⽤SpringMVC的后端服务如何通过配置来⽀持多种返回值类型(xml,json,html,excel)2. 基础概念2.1 HttpHeader中Content-Type和Accept设置的区别Accept:接⼝要返回给客户端的数据格式curl --header 'Accept:application/json' http://localhost:8080/todoContent-Type:客户端发送给服务器端的数据格式curl -X PUT --header 'Content-Type:application/json' -d '{"title":"周末⽇程","content":"睡觉"}' http://localhost:8080/todo2.2 SpringMVC⽣成输出的两种⽅式1)当服务端使⽤Restful的⽅式,只为客户端的ajax或其他服务端请求提供数据时,通常会使⽤@ResponseBody来标识你的返回,这时候Spring使⽤HttpMessageConverter来把返回的对象格式化成所需的格式。

2)当你需要提供表现层(⽐如:HTML),这时候SpringMVC使⽤ViewResolver来将处理你的返回。

有时候你的应⽤程序这两者都要提供2.3 SpringMVC输出格式判定很多时候为了⽀持多个系统或多个终端,你需要让相同的数据已不同的表现形式输出。

SpringMVC使⽤ContentNegotationStrategy来判定⽤户请求希望得到什么格式的数据。

ContentNegotationStrategy通过三种⽅式来识别⽤户想要返回什么样的数据通过请求URL后缀:http://myserver/myapp/accounts/list.html 返回html格式通过请求的参数:http://myserver/myapp/accounts/list?format=xls 该设置默认不开启,默认key是format。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
spring提供的访问资源文件的方式:
FileSystemResource
通过 FileSystemResource 以文件系统绝对路径的方式进行访问
public void file(){
String filePath = "D:/file/test.properties";//绝对路径
14
15
16
方法 说明
static void copy(byte[] in, File out) 将 byte[] 拷贝到一个文件中
static void copy(byte[] in, OutputStream out) 将 byte[] 拷贝到一个输出流中
static int copy(File in, File out) 将文件拷贝到另一个文件中
// ③ 将文件内容拷贝到另一个目标文件
FileCopyUtils.copy(res.getFile(),
new File(res.getFile().getParent()+ "/file2.txt"));
// ④ 将文件内容拷贝到一个输出流中
....
}
1
2
3
4
5
6
7
通过ServletContextResource 以相对于 Web 应用根目录的方式进行访问
除了用这些Resource 实现类,spring还提供了ResourceUtils 工具类,它支持“classpath:”和“file:”的地址前缀,它能够从指定的地址加载文件资源
File file2 = ResourceUtils.getFile(path);
}
1
2
3
4
5
本地化文件资源(摘自IBM)
本地化文件资源是一组通过本地化标识名进行特殊命名的文件,Spring 提供的 LocalizedResourceHelper 允许通过文件资源基名和本地化实体获取匹配的本地化文件资源并以 Resource 对象返回。假设在类路径的 i18n 目录下,拥有一组基名为 message 的本地化文件资源,我们通过以下实例演示获取对应中国大陆和美国的本地化文件资源:
public void file(){
File file1 = ResourceUtils.getFile("classpath:config/test.properties"); //类路径
String path = "file:D:/file/test.properties"; //绝对路径
OutputStream os = new ByteArrayOutputStream();
FileCopyUtils.copy(res.getInputStream(), os);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
Resource resource1 = new ClassPathResource(filePath);
InputStream is = file.getInputStream();//获取inputstream
File file = file.getFile(); //获取file对象
7
8
9
10
11
FileCopyUtils文件内容拷贝
它提供了许多一步式的静态操作方法,能够将文件内容拷贝到一个目标 byte[]、String 甚至一个输出流或输出文件中。下面的实例展示了 FileCopyUtils 具体使用方法:
public class FileCopyTest {
System.out.println(props.getProperty("jdbc.url"));
}
1
2
3
4
5
PropertiesLoaderUtils还有一些很实用的方法,比如
static Properties loadProperties(Resource resource)—从 Resource 中加载属性,static void fillProperties(Properties props, Resource resource)—将 Resource 中的属性数据添加到一个已经存在的 Properties 对象中
资源编码问题
采用Resource实现类加载资源文件时,默认是采用系统编码加载,如果资源文件是采用其他编码方式编码(utf-8),这时候就需要通过 EncodedResource 指定编码格式
public static void main(String[] args) throws Throwable {
// ② 这样才能正确读取文件的内容,而不会出现乱码
String content = FileCopyUtils.copyToString(encRes.getReader());
System.out.println(content);
Resource resource1 = new FileSystemResource(filePath);
InputStream is = file.getInputStream();//获取inputstream
File file = file.getFile(); //获取file对象
byte[] fileData = FileCopyUtils.copyToByteArray(res.getFile());
// ② 将文件内容拷贝到一个 String 中
String fileStr = FileCopyUtils.copyToString(new FileReader(res.getFile()));
public static void main(String[] args) throws Throwable {
Resource res = new ClassPathResource("config/test.properties");
// ① 将文件内容拷贝到一个 byte[] 中
public static void main(String[] args) throws Throwable {
// ① config/jdbc.properties 是位于类路径下的文件
Properties props = PropertiesLoaderUtils.loadAllProperties("config/jdbc.properties");
System.out.println("fileName(us):"+msg_us.getFilename());
System.out.println("fileName(cn):"+msg_cn.getFilename());
}
1
2
3
4
5
6
FileCopyUtils 本身和 Resource 没有任何关系,您完全可以在基于 JDK I/O API 的程序中使用这个工具类。
PropertiesLoaderUtils属性文件操作
我们可以通过 java.util.Properties类的load(InputStream inStream) 方法从输入流中加载资源文件,这需要先获取输入流,输入流有涉及到文件,步骤很多,比较繁琐。而Spring 提供的 PropertiesLoaderUtils 允许您直接通过基于类路径的文件地址加载属性资源,比load方法更具实用性:
);
// ② 获取对应中国大陆的本地化文件资源
Resource msg_cn = lrHalper.findLocalizedResource("i18n/message", ".properties",
Locale.CHINA);
public void file(){
LocalizedResourceHelper lrHalper = new LocalizedResourceHelper();
// ① 获取对应美国的本地化文件资源
Resource msg_us = lrHalper.findLocalizedResource("i18n/message", ".properties", .来自.. } 1
2
3
4
5
6
7
ClassPathResource
通过 ClassPathResource 以类路径的方式进行访问
public void file(){
String filePath = "config/test.properties";//类路径,编译后classes目录下
static int copy(InputStream in, OutputStream out) 将输入流拷贝到输出流中
static int copy(Reader in, Writer out) 将 Reader 读取的内容拷贝到 Writer 指向目标输出中
static void copy(String in, Writer out) 将字符串拷贝到一个 Writer 指向的目标中
利用spring提供的工具类读取资源文件
很多情况下自己写读取资源文件,都是通过I/O相关的类,File,InputStream,OutPutStream这些,很多方法可能都不记得,要去查资料,很不方便。相比I/O,spring的 org.springframework.core.io.Resource接口抽象层面更高,更适合操作资源文件。Spring 提供了若干 Resource 接口的实现类,这些实现类可以轻松地加载不同类型的底层资源,并提供了获取文件名、URL 地址以及资源内容的操作方法。
相关文档
最新文档