我们先来讲一下Struts2实现下载功能的基本路线。一般来说,实现下载功能需要经过以下步骤:
- 点击下载按钮或链接,请求下载文件
- 后台调用方法生成文件下载流
- 将文件下载流写入response中,浏览器开始下载
在Struts2框架中,可以利用这个路线实现下载功能。接下来我们具体讲一下:
准备工作
- 编写jsp页面提供下载按钮或链接:通过向服务器发送请求,请求下载文件。
- 在struts.xml文件中配置Action:用来接收后台的下载文件请求。
- 编写对应的Action代码:解析请求,生成文件流,写入response,返回下载流文件。
编写jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件下载</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/downloadFile.action?filePath=/home/user/test.pdf">下载文件</a>
</body>
</html>
jsp页面包含一个下载链接,当用户点击下载时,将会向服务器发送请求。
在struts.xml中配置Action
<action name="downloadFile" class="com.example.action.FileDownloadAction">
<result name="success" type="stream">
<!-- 需要下载的文件的路径,支持相对路径和绝对路径 -->
<param name="inputName">fileInputStream</param>
<param name="contentType">application/octet-stream</param>
<param name="contentDisposition">attachment;filename="test.pdf"</param>
<param name="bufferSize">1024</param>
</result>
</action>
其中,name属性表示Action的名称,class属性指定Action的类名,result标签指定返回结果。
编写对应的Action代码
package com.example.action;
import java.io.FileInputStream;
import java.io.InputStream;
import com.opensymphony.xwork2.ActionSupport;
public class FileDownloadAction extends ActionSupport {
private InputStream fileInputStream;
public String execute() throws Exception {
String filePath = request.getParameter("filePath");
fileInputStream = new FileInputStream(filePath);
return SUCCESS;
}
public InputStream getFileInputStream() {
return fileInputStream;
}
public void setFileInputStream(InputStream fileInputStream) {
this.fileInputStream = fileInputStream;
}
}
在Action类中,我们使用了InputStream来读取需要下载的文件内容。并使用ActionSupport的SUCCESS返回值来指定下载成功后的操作。
示例1
下面我们来看一下这个示例如何具体实现。假设我们需要提供一个下载功能用来下载服务器上的图片。
准备工作
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件下载</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/downloadFileImage.action?filePath=/home/user/picture.jpg">下载图片</a>
</body>
</html>
如上所示,这里我们提供了一个下载图片的链接。
配置Action
<action name="downloadFileImage" class="com.example.action.FileDownloadAction">
<result name="success" type="stream">
<!-- 需要下载的图片的路径,支持相对路径和绝对路径 -->
<param name="inputName">fileInputStream</param>
<param name="contentType">image/jpeg</param>
<param name="contentDisposition">attachment;filename="picture.jpg"</param>
<param name="bufferSize">1024</param>
</result>
</action>
这里我们配置了Action,指定了需要下载的图片的路径、类型和流传输参数。
编写对应的Action代码
package com.example.action;
import java.io.FileInputStream;
import java.io.InputStream;
import com.opensymphony.xwork2.ActionSupport;
public class FileDownloadAction extends ActionSupport {
private InputStream fileInputStream;
public String execute() throws Exception {
String filePath = request.getParameter("filePath");
fileInputStream = new FileInputStream(filePath);
return SUCCESS;
}
public InputStream getFileInputStream() {
return fileInputStream;
}
public void setFileInputStream(InputStream fileInputStream) {
this.fileInputStream = fileInputStream;
}
}
在Action代码中,我们通过参数传递获取需要下载的图片文件的路径,并将图片文件的流写入response中实现下载。
示例2
下面我们再来看一个下载txt文件的示例。
准备工作
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>文件下载</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/downloadFile.action?filePath=/home/user/document.txt">下载文档</a>
</body>
</html>
如上所示,这里我们提供了一个下载文档的链接。
配置Action
<action name="downloadFile" class="com.example.action.FileDownloadAction">
<result name="success" type="stream">
<!-- 需要下载的文档的路径,支持相对路径和绝对路径 -->
<param name="inputName">fileInputStream</param>
<param name="contentType">text/plain</param>
<param name="contentDisposition">attachment;filename="document.txt"</param>
<param name="bufferSize">1024</param>
</result>
</action>
这里我们同样配置了Action,但是这里需要注意的是,ContentType应该设置为text/plain。
编写对应的Action代码
package com.example.action;
import java.io.FileInputStream;
import java.io.InputStream;
import com.opensymphony.xwork2.ActionSupport;
public class FileDownloadAction extends ActionSupport {
private InputStream fileInputStream;
public String execute() throws Exception {
String filePath = request.getParameter("filePath");
fileInputStream = new FileInputStream(filePath);
return SUCCESS;
}
public InputStream getFileInputStream() {
return fileInputStream;
}
public void setFileInputStream(InputStream fileInputStream) {
this.fileInputStream = fileInputStream;
}
}
还是和上一个示例类似,我们获取路径参数,并将对应的txt文件流写入response中实现下载。
通过以上两个示例,我们可以看到,实现下载功能的基本路线是相似的,只需要在jsp页面增加下载链接,然后通过Action来处理下载请求即可。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JSP开发之Struts2实现下载功能的实例 - Python技术站