项目实例改编:利用structs2的action 实时显示图片、pdf和其他内容的框架抽取。(转)...

转自:http://www.verydemo.com/demo_c167_i1382.html

针对:预览文件(图片,PDF)文件来源为action中的inputStream

重点:

  1.     structs2的action的配置
  2.     action的写法和结果类型
  3.     resulttype的写法
  4.     网页上实时显示

  1 structs2的action的配置

 

  首先在package的标签中加入自定义的结果类型<result-types>的名字displayResult,以及后面提到的自定义类DisplayFileResult,虽然不配置也不影响用户体验,但 structs默认的结果类型没有直接适合的,例如使用stream会打印结果异常,如果不想异常,就在代码中不要调用inputStream的close方法。

<package name="file" extends="structs-default">   ......<result-types><result-type name="displayResult"class="ssc.net.cn.ecp.portal.bl.file.result.DisplayFileResult" /></result-types>......</package>

   在   <result-types>后配置图片资源的action。见  <action name="showImageContent" > ,在成功结果类型的type属性上加上displayResult

<package name="file" extends="structs-default">   ......<result-types><result-type name="displayResult"class="ssc.net.cn.ecp.portal.bl.file.result.DisplayFileResult" /></result-types><action name="showImageContent"class="ssc.net.cn.ecp.portal.bl.file.action.ShowFileContent" method="showImage"><result name="success" type="displayResult"></result><result name="error" /></action><action name="showPdfContent"class="ssc.net.cn.ecp.portal.bl.file.action.ShowFileContent" method="showPdf"><result name="success" type="displayResult"></result><result name="error"/></action>.</package>

 

2 action的写法和结果类型。

  此处给出一个框架式的写法,加入最少两个方法getInputStream()和getContentType(),供DisplayFileResult类使用。

import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;public class ShowFileContent extends ActionSupport {private InputStream inputStream;public InputStream getInputStream() {return inputStream;}public void setInputStream(InputStream inputStream) {this.inputStream = inputStream;}private String contentType;public String getContentType() {return contentType;}public void setContentType(String contentType) {this.contentType = contentType;}public String showImage() {try  {HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);String filePath = request.getParameter("filepath");this.setInputStream(new java.io.FileInputSteam(filePath));this.setContentType("image/png");}catch  (IOException e) {return ERROR}return SUCCESS;  }public String showPdf()  {try {HttpServletRequest request= (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST);String filePath = request.getParameter("filepath");this.setInputStream(new java.io.FileInputSteam(filePath));this.setContentType("application/pdf");}catch  (IOException e){return ERROR}return SUCCESS;}}

3 result type的写法

  调用response相关方法,把输出流转换为资源方式。在这里,我再老生长谈一句话:一定要切记关闭流,如果不关闭流,在打开过多流后操作系统(Linux)会报类似“too many open files”之类的错误,导致无法访问文件。

package ssc.net.cn.ecp.portal.bl.file.result;import java.io.IOException;import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.Result;public class DisplayFileResult implements Result {private static final long serialVersionUID = 4897546905647587338L;private HttpServletResponse response;ShowFileContent action;public void execute(ActionInvocation invocation) throws Exception {init(invocation);writeResponseOutputStream();}private void init(ActionInvocation invocation) {action = (ShowFileContent) invocation.getAction();response = ServletActionContext.getResponse();response.setContentType(action.getContentType());}private void writeResponseOutputStream() {java.io.InputStream is = action.getInputStream();java.io.BufferedInputStream bi = null;if (is == null) {return;}try {bi = new java.io.BufferedInputStream(is);byte[] bytearray = new byte[1024];int size = 0;while ((size = bi.read(bytearray)) != -1) {response.getOutputStream().write(bytearray, 0, size);}} catch (IOException e) {e.printStackTrace();} finally {try {response.flushBuffer();} catch (IOException e) {e.printStackTrace();}try {bi.close();} catch (IOException e) {e.printStackTrace();}try {is.close();} catch (IOException e) {e.printStackTrace();}}}}

4 网页上实时显示

  给个显示图片的例子:实时显示图片,参数需要加入new date(), 浏览器就会认为是一个新的图片地址,而不会调用浏览器缓存显示图片

<img src="showImageContent.action?filepath=mypic.gif‘&date="+String(new date()) />

 

给个pdf显示的例子:

<iframe src="showPdfContent.action?filepath=mypic.gif‘&date="+String(new date()) />

 

 

 

转载于:https://www.cnblogs.com/tianhyapply/p/4394506.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259112.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开始Go开发之旅-Golang架构师之路系列实战

2019独角兽企业重金招聘Python工程师标准>>> 作者: gomaster.me(冯琪超) 系列:Golang架构师之路 巧妇难做无米之炊&#xff0c;golang sdk就是gopher的大米 下载golang 点击 官网下载golang sdk 根据不同系统&#xff0c;官网下载链接会选择相应的平台进行链接跳转&…

安卓9.0官方系统升级包_华为、荣耀公布可升级安卓10.0机型,你的手机在名单之内吗?...

在近两个月以前&#xff0c;美方将华为关进了小黑屋&#xff0c;随后谷歌也将华为旗下的机型移出了安卓10.0升级名单&#xff0c;这一波操作之后&#xff0c;引起了不小的“恐慌”&#xff0c;许多华为用户也在担心是否还能正常使用安卓系统服务&#xff0c;不过&#xff0c;让…

2. Mysql数据库的入门知识

2. Mysql数据库的入门知识 &#xff08;1&#xff09;打开Windows系统提供的服务查看相应的服务。 &#xff08;2&#xff09;在Windows任务管理器的进程中查看 &#xff08;3&#xff09;使用命令行管理windows的Mysql数据库服务。 Net start 服务名 Net stop 服务名 mysql -h…

nginx php-fpm 输出php错误日志(转)

nginx是一个web服务器&#xff0c;因此nginx的access日志只有对访问页面的记录&#xff0c;不会有php 的 error log信息。 nginx把对php的请求发给php-fpm fastcgi进程来处理&#xff0c;默认的php-fpm只会输出php-fpm的错误信息&#xff0c;在php-fpm的errors log里也看不到ph…

win7优化设置_win7蓝牙怎么打开?

当电脑需要连接蓝牙设备的时候&#xff0c;就需要打开蓝牙设置才行。鉴于一些win7的用户还不知道蓝牙功能在哪&#xff0c;win7蓝牙怎么打开&#xff0c;故系统圣地分享本篇教程。1、win7蓝牙怎么打开?首先要你的电脑支持蓝牙功能。如果你的电脑有蓝牙功能的话那么在电脑的右下…

Doxygen从零学起———安装和配置

Doxygen可以为多种语言生成说明文档&#xff08;从程序的源代码中提取其中按照约定格式写的注释中提取信息&#xff09; 例如C, Objective-C, C#, C, PHP, Python, IDL (Corba, Microsoft, and UNO/OpenOffice flavors), Fortran, VHDL, Tcl, D ,从这期开始&#xff0c;我将系…

Java中的ClassLoader

Java中类的加载过程&#xff08;如Dog类&#xff09;&#xff1a; 通过类型信息定位Dog.class文件。载入Dog.class文件&#xff0c;创建相应的Class对象。执行父类的静态字段定义时初始化语句和父类的静态初始化块。执行子类的静态字段定义时初始化语句和子类的静态初始化块。当…

excel删除无尽空白行_excel如何批量删除空白行 巧用 ctrl+G 只需1秒 最常用的技巧...

工作中我们使用excel通常都会遇到这种情况&#xff0c;就是表格中有很多多余的空行。我们需要把多余的空行删除。 如果空行只有一两行的话&#xff0c;可以把鼠标放在空白行上&#xff0c;然后点击鼠标右键&#xff0c;在弹出的菜单中选择删除菜单。 在弹出的删除确定窗口中&am…

DevOps的前世今生

2019独角兽企业重金招聘Python工程师标准>>> 目前在国外&#xff0c;互联网巨头如Google、Facebook、Amazon、LinkedIn、Netflix、Airbnb&#xff0c;传统软件公司如Adobe、IBM、Microsoft、SAP等&#xff0c;亦或是网络业务非核心企业如苹果、沃尔玛、索尼影视娱乐…

【转】最牛B的编码套路

最近&#xff0c;我大量阅读了Steve Yegge的文章。其中有一篇叫“Practicing Programming”&#xff08;练习编程&#xff09;&#xff0c;写成于2005年&#xff0c;读后令我惊讶不已&#xff1a; 与你所相信的恰恰相反&#xff0c;单纯地每天埋头于工作并不能算是真正意义上的…

ecshop 广告设置

最近公司准备做个商城&#xff0c;让我从JAVA转过去&#xff0c;好吧&#xff0c;先看下吧&#xff0c;反正也得做。接到手里的是一套已经成型的模板&#xff0c;但是二次开发必须得了解下机制、文件、响应、设置什么的&#xff0c;也是个新手&#xff0c;写点东西给后面更新的…

linux 信号_Linux信号机制

信号就是一条消息&#xff0c;通知进程系统中发生了什么事&#xff0c;每种信号都对应着某种系统事件。一般的底层硬件异常是由内核的异常处理程序处理的&#xff0c;它对用户进程来说是透明的。而信号机制&#xff0c;提供了一种方法通知用户进程发生了这些异常。例如&#xf…

DOxygen for C++使用说明——添加数学公式

公式 Doxygen允许你把 公式显示在最终的输出中&#xff08;这个功能仅限于HTML和输出&#xff09;.为了可以在HTML documentation显示公式&#xff08;转化为图片&#xff09;&#xff0c;你必须安装以下软件&#xff1a; latex: 编译器, 被用来解析公式, 首先提取公式写到一…

Tomcat 的 DefaultServlet

问题描述&#xff1a; 群里有人测试 Spring MVC&#xff0c;没有配置任何Controller&#xff0c;只配置了一个view resolver&#xff0c;指定了前缀后缀。 然后&#xff0c;他问的是 当访问 localhost:8080/test 的时候&#xff0c;为什么会被重定向到 localhost:8080/test/ &a…

spss练习数据_SPSS篇——如何在成千上百万个数据中标识重复个案

本文就带大家来学习一个小技巧&#xff0c;如何运用SPSS标识重复个案。我们都知道在Excel中&#xff0c;通常会用到“筛选”功能来选出指定条件相同的单元格。那么在SPSS中&#xff0c;如何在成千上百万个数据中筛选出重复的个案呢&#xff1f; 小编就是要告诉你&#xff0c;几…

DOxygen for C++使用说明——Markdown支持

自Doxygen 版本1.8.0&#xff0c;Markdown被引进。 接下来&#xff0c;我们将先简单介绍标准的Markdown语法&#xff0c;读者可以进入Markdown官网查询更详细的细节。然后讨论一下Doxygen支持的Markdown扩展&#xff0c;最后讨论一下Doxygen对Markdown标准的实现细节。 Stand…

方程式漏洞之复现window2008/win7 远程命令执行漏洞

前几天就想写的&#xff0c;因为一些缘故就没写。此次是在外网环境下进行的。大家在内网中也一个样。 方法&#xff1a; 使用Eternalblue模块&#xff0c;剑测是否有漏洞然后msf生成一个dll直接反弹shell. PS&#xff1a;win版本的不知道缘何生成出来的dll是0kb 我就在自己本地…

客服会话 小程序 如何发起_小程序、公众号、App三者如何融合布局?这里有一份避坑指南...

对产品经理来说&#xff0c;小程序无疑是2020年最火爆的词之一了。我们能看到&#xff0c;就在今年疫情期间&#xff0c;小程序DAU达到4.5亿&#xff0c;而超市、生鲜果蔬、社区购物等都同比增长100个点左右&#xff0c;小程序的商业价值很明显地在快速释放。小程序如此火爆&am…

DOxygen for C++使用说明——注释代码二

这一次我在谷歌搜索中检索到了Doxygen在github的仓库&#xff0c;进去一看&#xff0c;令人大喜&#xff0c;github仓库里含有了一个Doxygen的官方配置文件Doxyfile,于是下载下来&#xff0c;发现Doxyfile已经配置了将仓库中的\src文件编译成Documentation,并且将结果放在了dox…

python super()(转载)

一、问题的发现与提出 在Python类的方法&#xff08;method&#xff09;中&#xff0c;要调用父类的某个方法&#xff0c;在Python 2.2以前&#xff0c;通常的写法如代码段1&#xff1a; 代码段1&#xff1a; class A:def __init__(self):print "enter A"print "…