Strusts2--课程笔记8

时间:2021-08-05 23:51:23

文件的和上传和下载:

  (1)文件的上传:

    Struts是通过拦截器实现文件上传的,而默认拦截器栈中包含了文件上传拦截器,故表单通过Struts2可直接将文件上传,其底层是通过apache的commons-fileupload完成的。

    我们要做的,就是将上传好的文件放到指定的位置或者其他的一些处理。

    前端表单提交的代码:

 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

 <html>
<head>
<title>index page</title>
</head> <body>
<form action="test/upload.action" method="POST" enctype="multipart/form-data">
文件:<input type="file" name="img"/><br>
<input type="submit" value="上传"/>
</form>
</body>
</html>

    Action代码:

 package com.tongji.actions;

 import java.io.File;
import java.io.IOException; import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext; public class UploadAction {
private File img;
private String imgFileName; //文件名 = 文件 + FileName , 必须是这样 public File getImg() {
return img;
} public void setImg(File img) {
this.img = img;
} public String getImgFileName() {
return imgFileName;
} public void setImgFileName(String imgFileName) {
this.imgFileName = imgFileName;
} public String execute() throws IOException {
if (img != null) {
//String path = "d:/images";
String path = ServletActionContext.getServletContext().getRealPath("/images");
File destFile = new File(path,imgFileName);
FileUtils.copyFile(img, destFile);
return "success";
}
return "message";
} }

    注意:第32行,不能像31行那样直接写文件要被拷贝到的路径。因为,不能让前端代码操纵后端服务器的盘符,前端代码能够操作的只能是对应项目的所在空间(tomcat目录下的项目的空间)。

    struts.xml配置文件: 

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<constant name="struts.multipart.maxSize" value="20971520"/> <!-- 改变可上传文件的大小 -->
<package name="demo" namespace="/test" extends="struts-default">
<action name="upload" class="com.tongji.actions.UploadAction">
<result>/welcome.jsp</result>
<result name="message">/messge.jsp</result> <!-- 处理上传失败异常 -->
<interceptor-ref name="defaultStack"> <!-- 设置可上传文件的拓展名 -->
<param name="fileUpload.allowedExtensions">jpg,png</param>
</interceptor-ref>
</action>
</package>
</struts>

    注意:以上的注释内容。

  (2)多文件的上传:

    前端表单提交的代码:

 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

 <html>
<head>
<title>index page</title>
</head> <body>
<form action="test/upload.action" method="POST" enctype="multipart/form-data">
文件1:<input type="file" name="imgs"/><br>
文件2:<input type="file" name="imgs"/><br>
文件3:<input type="file" name="imgs"/><br>
<input type="submit" value="上传"/>
</form>
</body>
</html>

    Action代码:

 package com.tongji.actions;

 import java.io.File;
import java.io.IOException; import org.apache.commons.io.FileUtils;
import org.apache.struts2.ServletActionContext; public class UploadAction {
private File[] imgs;
private String[] imgsFileName; //文件名 = 文件 + FileName , 必须是这样 public File[] getImgs() {
return imgs;
} public void setImgs(File[] imgs) {
this.imgs = imgs;
} public String[] getImgsFileName() {
return imgsFileName;
} public void setImgsFileName(String[] imgsFileName) {
this.imgsFileName = imgsFileName;
} public String execute() throws IOException {
//若没有选择要上传的文件,则该数组不进行创建,而非创建了长度为0的数组对象
if (imgs != null) {
String path = ServletActionContext.getServletContext().getRealPath("/images");
for (int i = 0; i < imgs.length; i++) {
File destFile = new File(path, imgsFileName[i]);
FileUtils.copyFile(imgs[i], destFile);
}
return "success";
}
return "message";
} }

     补充:<constant name="struts.multipart.maxSize" value="20971520"/> <!-- 改变可上传文件的大小 -->,在多文件上传时,指的是多文件上传的总大小

  (3)文件的下载:

    服务端向客户端浏览器发送文件时,如果是浏览器支持的文件类型,一般会默认使用浏览器打开,比如txt、jpg等,会直接在浏览器中显示;如果需要用户以附件的形式保存,则称为文件下载。

    如果需要向浏览器提供文件下载功能,则需要设置HTTP响应头的Content-Disposition属性,即内容配置属性值为attachment(附件)。

    Action类中需要提供两个属性,一个为文件输入流,用于指定服务器向客户端所提供下载的文件资源;一个为文件名,即用户要下载的资源文件名。

    前端页面代码: 

 <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>

 <html>
<head>
<title>index page</title>
</head> <body>
<a href="test/download.action">美图</a>
</body>
</html>

    Action代码:

 package com.tongji.actions;

 import java.io.InputStream;

 import org.apache.struts2.ServletActionContext;

 public class DownloadAction {
private InputStream is;
private String fileName; //随意 public InputStream getIs() {
return is;
} public void setIs(InputStream is) {
this.is = is;
} public String getFileName() {
return fileName;
} public void setFileName(String fileName) {
this.fileName = fileName;
} public String execute() throws Exception {
fileName = "5.jpg"; fileName = "书言.jpg";
is = ServletActionContext.getServletContext().getResourceAsStream("/images/" + fileName); byte[] bytes = fileName.getBytes("utf-8");
fileName = new String(bytes, "iso-8859-1"); return "success";
} }

    解释:第33行是为了解决中文乱码的问题,因为代码是utf-8格式的,而前端页面是iso-8859-1格式的。

    struts.xml配置:

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="demo" namespace="/test" extends="struts-default">
<action name="download" class="com.tongji.actions.DownloadAction">
<result type="stream">
<param name="inputName">is</param>
<param name="contentDisposition">attachment;filename=${fileName}</param>
</result>
</action>
</package>
</struts>

    解释:返回类型是stream,并且要指定inputName(用于指定服务器向客户端所提供下载的文件资源),以及需要设置HTTP响应头的Content-Disposition属性,即配置attachment和文件名。

       如果Action中的InputStream属性值为inputStream,则不需要配置<param name="inputName">is</param>,因为InputStream默认值就为inputStream。

Strusts2--课程笔记8的更多相关文章

  1. Linux内核分析课程笔记(一)

    linux内核分析课程笔记(一) 冯诺依曼体系结构 冯诺依曼体系结构实际上就是存储程序计算机. 从两个层面来讲: 从硬件的角度来看,冯诺依曼体系结构逻辑上可以抽象成CPU和内存,通过总线相连.CPU上 ...

  2. &lpar;1&sol;18&rpar;重学Standford&lowbar;iOS7开发&lowbar;iOS概述&lowbar;课程笔记

    写在前面:上次学习课程对iOS还是一知半解,由于缺乏实践,看公开课的视频有时不能很好地领会知识.带着问题去学习永远是最好的方法,接触一段时间iOS开发以后再来看斯坦福iOS公开课,又会有许多新的发现, ...

  3. Andrew Ng机器学习课程笔记(五)之应用机器学习的建议

    Andrew Ng机器学习课程笔记(五)之 应用机器学习的建议 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7368472.h ...

  4. Andrew Ng机器学习课程笔记--week1(机器学习介绍及线性回归)

    title: Andrew Ng机器学习课程笔记--week1(机器学习介绍及线性回归) tags: 机器学习, 学习笔记 grammar_cjkRuby: true --- 之前看过一遍,但是总是模 ...

  5. Andrew Ng机器学习课程笔记--汇总

    笔记总结,各章节主要内容已总结在标题之中 Andrew Ng机器学习课程笔记–week1(机器学习简介&线性回归模型) Andrew Ng机器学习课程笔记--week2(多元线性回归& ...

  6. Andrew 机器学习课程笔记

    Andrew 机器学习课程笔记 完成 Andrew 的课程结束至今已有一段时间,课程介绍深入浅出,很好的解释了模型的基本原理以及应用.在我看来这是个很好的入门视频,他老人家现在又出了一门 deep l ...

  7. 操作系统学习笔记----进程&sol;线程模型----Coursera课程笔记

    操作系统学习笔记----进程/线程模型----Coursera课程笔记 进程/线程模型 0. 概述 0.1 进程模型 多道程序设计 进程的概念.进程控制块 进程状态及转换.进程队列 进程控制----进 ...

  8. 《CSS动画实用技巧》课程笔记

    概述 这是我学习[CSS动画实用技巧][1]的课程笔记 常用动画属性--transition [常用动画属性--transition][2] .change img{ display:block; w ...

  9. Deeplearning&period;ai课程笔记--汇总

    从接触机器学习就了解到Andrew Ng的机器学习课程,后来发现又出来深度学习课程,就开始在网易云课堂上学习deeplearning.ai的课程,Andrew 的课真是的把深入浅出.当然学习这些课程还 ...

  10. selenium课程笔记

    selenium课程笔记第一天(2017-7-1) 一.配置火狐浏览器 运行:firefox.exe -p -no -remote selenium课程笔记第二天 用Eclipse+java+sele ...

随机推荐

  1. Bzoj2118 墨墨的等式

    Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 1488  Solved: 578 Description 墨墨突然对等式很感兴趣,他正在研究a1x1+ ...

  2. MongoDB(一)

    问题解决 1.由于目标计算机积极拒绝 无法连接 原因:还没有启动mongodb,就使用mongo命令 解决方法:在bin目录下输入 mongod --dbpath XXXX/data 然后在输入 mo ...

  3. NanoApe Loves Sequence-待解决

    NanoApe Loves Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/131072 K (Java ...

  4. Java 简介

    前言 本文大致介绍 Java 语言 什么是 Java 语言? Java 不仅仅是一门语言,Java 是一个完整的平台,有一个庞大的库,其中包含很多可重用的代码和一个提供诸如安全性,跨操作系统的可移植性 ...

  5. C&num; random&lpar;number&rpar;

    C#随机函数Random()的用法 出自:http://www.cnblogs.com/wang726zq/archive/2012/04/28/2474711.html http://blog.cs ...

  6. 单点登录系统&lpar;SSO&rpar;的开发思路

    单点登录并不是一个新鲜的玩意儿,比较官方的解释是企业业务整合的解决方案之一,通俗来讲SSO就是一个通用的用户中心,国内比较流行的UCenter就是一套单点登录解决方案.而近期以CSDN明文存储用户密码 ...

  7. maven如何单独启动插件目标

    说来恼火,在网上找了半天没找到 原来插件名称其实不需要定义而是直接想象到的,如下,我尝试过了好几种 mvn plugin:goal 都没成功:从代码看goal已经没啥疑问了,就是compile,但哪个 ...

  8. 【单位矩阵】【杭电OJ1575】

    Tr A Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  9. Linux - 磁盘操作

    Linux 磁盘常见操作 : df -Ph # 查看硬盘容量 df -T # 查看磁盘分区格式 df -i # 查看inode节点 如果inode用满后无法创建文件 du -h 目录 # 检测目录下所 ...

  10. hadoop脑裂

    今天修改了和journalNode通信的zookeeper配置,原来没有打开zookeeper动态清理快照的功能. 所以3台zookeeper节点,每台修改完配置后,然后重启了下zookeeper服务 ...