今天是Struts2学习笔记的最后一篇文章了。用什么做结尾呢,这两天其实还学了很多东西,没有记录下,今天就查漏补缺一下。

文件上传与下载、FreeMarker以及昨天没做完的例子

文件上传与下载

文件的上传与下载涉及到Java的IO操作,etc啊……女朋友打电话写不下去了,明天补!

2017年3月11日

经过了...重庆三日游、办公室三日游、辞职之后。。。终于有时间补上了!!!

最近一周可以说是上大学以来最爽的时候了,辞去了两年半的职务,主要还是因为那个狗屁老师啥都不懂,还想给你干活,下辈子吧!我也鄙视在他身边游走的人,一群狗腿子,就知道阿谀奉承,不敢怒不敢言,有啥意思?你们以后要走仕途是咋?我觉得,人绝对不能获得太憋屈,做人更不能让别人太憋屈!

这几天给自己定义一个技能学习路线:

 Struts2-->Spring -->SpringMVC -->Hibernate -->MyBatis

当然了,绩效考核管理系统这学期还要做,我主要还是学习新技术,我觉得老师对我很好了,没什么开发的压力,还能学到新技术  最近还要学习 Activiti和Redis,技术发展的让自己觉得一无是处,还是要用知识改变啊!

好了,重回到这个文章上面来:

文件的操作,也就是IO流,一直没有太仔细的研究,其实挺简单,就是太麻烦,

文件转换成流 然后在套上传输管道  那边接收  在把流转换成源文件 就这个过程。

自己也下载了JavaEE关于文件流的视频,还是要找个时间专题攻一攻这块儿。

Struts2的文件上传可是简单地很:首先这个表单的enctype="multipart/form-data"是肯定的,然后Action里面的代码有个大坑...主要是书没讲清楚,就是你的想知道你上传的文件的时候除了需要知道文件是啥,肯定还要知道文件名、文件大小、文件的类型等等,这些的话直接在你指定的表单的文件域的name后面加上什么ContentType之类的,不能使用其他的,只能是name+ContentType类型的,eg:

private File uploadFile;
private String uploadFileContentType;
private String uploadFileFileName;

文件上传的处理代码如下:

        //创建输入流
InputStream is = new FileInputStream(uploadFile);
//拿到文件保存的本机位置
String uploadPath = ServletActionContext.getServletContext().getRealPath("/upload");
//根据给定的路径和指定的文件名创建一个文件实例,但这个实例的空的
File toFile = new File(uploadPath,this.getUploadFileFileName());
//为这个空文件套上输出的管子,开始输出文件内容
OutputStream os = new FileOutputStream(toFile);
//设置缓冲流
byte[] buffer = new byte[1024];
int length = 0;
//其实这个循环判断就是保证将buffer里面的东西都输出出来
while((length = is.read(buffer))>0)
{
os.write(buffer,0,length);
}
is.close();
os.close();

其实多文件上传也很简单,不同的是前台传来的是一个数组,需要在业务逻辑中循环数组

for(int i = 0;i<getMultiFile().length;i++)
{
//创建输入流
InputStream is = new FileInputStream(multiFile[i]);
//拿到文件保存的本机位置
String uploadPath = ServletActionContext.getServletContext().getRealPath("/upload");
//根据给定的路径和指定的文件名创建一个文件实例,但这个实例的空的
File toFile = new File(uploadPath,multiFileFileName[i]);
//为这个空文件套上输出的管子,开始输出文件内容
OutputStream os = new FileOutputStream(toFile);
//设置缓冲流
byte[] buffer = new byte[1024];
int length = 0;
//其实这个循环判断就是保证将buffer里面的东西都输出出来
while((length = is.read(buffer))>0)
{
os.write(buffer,0,length);
}
is.close();
os.close();
}

还可以通过拦截器来限制上传文件的类型及大小:

<interceptor-ref name=""fileUpload>
<param name="allowedType">
image/bmp,image/png
</param>
<param name="maximumSize">
81920 <!-- 单位是字节 -->
</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>

在Struts中实现文件的下载也非常简单,主要是需要配置action中result的返回类型,注意返回类型需要设置为流:stream

<!--File 下载演示-->
<action name="download_*" class="tech.youngs.Action.DownloadFileAction" method="{1}">
<result name="input">/WEB-INF/jsp/downloadFile.jsp</result>
<result name="success" type="stream">
<param name="contentType">image/jpeg</param>
<!-- 这里的contentDisposition是指定文件下载的方式
attachment是弹出提示框进行下载的方式
还有是inline是直接打开文件
Struts2默认inline -->
<param name="contentDisposition">
attachment;filename="l_hires.jpg";
</param>
<!-- 这里定义了文件下载的输入流 并命名为downloadFile -->
<param name="inputName">downloadFile</param>
</result>
</action>

获取下载文件的流可比上传文件的流要简单的多:

public InputStream getDownloadFile()
{
return ServletActionContext.getServletContext()
.getResourceAsStream("/upload/l_hires.jpg");
}

非常简单不是。

好了 文件的上传下载的坑算是填完了,接下来需要注意得是有一个知识点非常重要但是我忽略了,那就是FreeMarker,这个就是个模板引擎,因为绩效考核管理系统使用的是json传数据,所以没有用到FreeMarker,但其实它非常好用也很重要,现在慕课网还更新着他的知识。用好FreeMarker彻底让前后端分离,代码清晰。

我现在看到的FreeMarker用得最多的地方还是显示后台传值。

具体的FreeMarker怎么用,额,等到项目实战了在继续补充。

还有一个Demo,也做完了,没啥可说的,大部分在项目中遇见过 主要还是属性驱动和模型驱动这块儿,千万要知道模型驱动要new出来的!

好了!Struts2要有什么新的知识会及时更新,笔记就告一段落了!

下一站,Spring!

Struts2学习笔记⑧的更多相关文章

  1. Struts2学习笔记①

    Struts2 学习笔记① 所有的程序学习都从Hello World开始,今天先跟着书做一个HW的示例. Struts2是一套MVC框架,使用起来非常方便,接触到现在觉得最麻烦的地方是配置文件.我的一 ...

  2. Struts2学习笔记NO.1------结合Hibernate完成查询商品类别简单案例(工具IDEA)

    Struts2学习笔记一结合Hibernate完成查询商品类别简单案例(工具IDEA) 1.jar包准备 Hibernate+Struts2 jar包 struts的jar比较多,可以从Struts官 ...

  3. Struts2 学习笔记(概述)

    Struts2 学习笔记 2015年3月7日11:02:55 MVC思想 Strust2的MVC对应关系如下: 在MVC三个模块当中,struts2对应关系如下: Model: 负责封装应用的状态,并 ...

  4. struts2学习笔记 ⑤

    拦截器初探 昨天临睡觉之前看了看拦截器,也在昨天的学习笔记里面胡诌诌了几句,今天就来好好的会会拦截器这个东西.实际上拦截器是一种模块实现的机制<起码我是这么体会的>(至于说书里面说体现了A ...

  5. [struts2学习笔记] 第二节 使用Maven搞定管理和构造Struts 2 Web应用程序的七个步骤

    本文地址:http://blog.csdn.net/sushengmiyan/article/details/40303897 官方文档:http://struts.apache.org/releas ...

  6. struts2学习笔记之二:基本环境搭建

    学习struts2有一段时间了,作为一个运维人员学习的时间还是挺紧张的,写这篇文件为了方便以后复习时使用 环境: MyEclipse 10 tomcat6 jdk1.6   首先建立一个web项目,并 ...

  7. 【Struts2学习笔记-4】包含其他配置文件

    包含其他配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLI ...

  8. 【Struts2学习笔记-3】常量配置

    Struts2常量 配置Struts2常量值有3个地方,1)在struts.properties文件中配置常量:2)在web.xml文件中配置FileterDispatcher指定初始化参数来配置常量 ...

  9. struts2学习笔记(4)——数据类型转换

    回过头来看昨天的那个例子. 在昨天的例子中,只转换了一个Point类,如果想转换多个Point类怎么办呢?在昨天的例子上面做一个小的修改. 首先在input.jsp页面中修改几个输入框. <s: ...

随机推荐

  1. CSS中设置margin:0 auto; 水平居中无效的原因分析

    很多初学制作网页的朋友,可能会遇到的一个常见问题,就是在CSS中加了margin:0 auto;却没有效果,不能居中的问题,margin:0 auto;的意思就是:上下边界为0,左右根据宽度自适应,其 ...

  2. 第二部分 条件控制执行语句、循环语句、switch语句、跳转语句和其它语句

    条件控制执行语句: if语句 if....else....语句 循环语句: while语句 do....while语句 for语句 switch语句: 跳转语句: break; continue; r ...

  3. Jquery右击显示菜单事件,运用smartMenu插件。

    基本格式: 1.引用jquery.smartMenu插件.css样式: <script src="gongju/jquery-1.11.2.min.js" type=&quo ...

  4. 使用数字签名实现数据库记录防篡改(Java实现)

    本文大纲 一.提出问题 二.数字签名 三.实现步骤 四.参考代码 五.后记 六.参考资料 一.提出问题 最近在做一个项目,需要对一个现成的产品的数据库进行操作,增加额外的功能.为此,需要对该产品对数据 ...

  5. C++的输入和输出

    C++是一种常用的编程语言.一个完整的程序至少要有一个输出,而我们也经常需要在程序内进行大量输入和输出.所以今天,我和大家谈一谈输入和输出. 1.cin和cout.可以连续输入,使用流(>> ...

  6. 【java设计模式】之 建造者(Builder)模式

    我们还是举上一节的例子:生产汽车.上一节我们通过模板方法模式控制汽车跑起来的动作,那么需求是无止境的,现在如果老板又增加了额外的需求:汽车启动.停止.鸣笛引擎声都由客户自己控制,他想要什么顺序就什么顺 ...

  7. 持久层框架之MyBatis

    1.mybatis框架介绍: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并 ...

  8. struts2系列笔记(1)

    struts2框架 如果你之前在MVC模式的时候一直都是通过servlet,获取和返回数据,那么现在开始学习struts2框架, Struts是一个实现MVC设计模式的优秀的框架.它的许多优点我就不说 ...

  9. 《解决在Word中为汉子插入拼音及音标的问题》

    说明:本人使用的是Word2007版本.以下示例都是基于本人电脑操作.如有疑问,欢迎留言交流. [1]为word中的一些文字添加拼音及音标. [2]开始为文字添加拼音及音标. 选中要添加拼音及音标的文 ...

  10. matlab 全局变量的使用举例

    昨天在写项目时,想要把获取到的临时变量放入一个全局变量,为以后的使用做准备,结果总是出错,今天做了一个小程序,放在这里备用. 自定义函数: global_p.m function y=global_p ...