项目实例改编:利用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,一经查实,立即删除!

相关文章

零碎的小知识点 ----------C# ToString()函数注意事项

C#中存在着大量的字符串操作&#xff0c;有专门的string类&#xff0c;各种各种的方法&#xff0c;其中使用最为频繁的方法为ToString()&#xff0c;用起来很是顺手&#xff0c;但是这里存在一个很大的问题&#xff0c;空字符是不能用ToString方法转换的&#xff0c;不然就会报…

ios越狱系统UIGestureRecognizer事件截获问题

越狱的机器给self.view设置一个UITapGestureRecognizer,这货就把所有的点击事件全截获了,比如某个按钮,点击就没效果.普通系统是没有问题的. 因此要给UIGestureRecognizer设置delegate并且在其中对touch的view进行分别处理 比如要让按钮功能正常使用: 1 #pragma mark - UIGestu…

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

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

delete与delete[]的区别

一直对C中的delete和delete[]的区别不甚了解&#xff0c;今天遇到了&#xff0c;上网查了一下&#xff0c;得出了结论。做个备份&#xff0c;以免丢失。 C告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete&#xff0c;回收用 new[] 分配的一组对象的内存空间的时…

event对应的各种坐标

IE8不支持的PageXY 相对于整个页面鼠标的位置 包括溢出的部分 event.pageX; event.pageY; 所有浏览器支持的&#xff1a; 相对于当前浏览器窗口可视区域的坐标event.clientX;event.clientY; 相对于当前屏幕&#xff08;和浏览器窗口大小无关&#xff09;的坐标event.screenX;…

安卓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…

十月读书心得

1.sizeof与strlen的区别。 #include <iostream> using namespace std; void main() {cout << sizeof("hello") << endl;}答案&#xff1a; 6原因&#xff1a; “hello”{‘h’,e,l,l,o,\0};共六个字节。 那么sizeof与strlen有什么区别呢&#xff…

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…

protobuf的安装和使用

以下全部基于win7系统。 protobuf是什么&#xff0c;有什么用网上说的已经很多了。这里就是说一下怎么使用。就当给自己做个笔记吧。 .proto文件的语法什么的也请网上查看&#xff0c;挺多的。 第一步&#xff1a; 下载protoc.exe 和 protobuf-java-2.4.1.jar。这里要注意版本区…

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

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

Struts2 通配符

在配置<action …./>元素时&#xff0c;需要指定name,class和method属性&#xff0c;这三个属性都支持通配符。 例如&#xff1a; 1.<action name ”*Action” class “student.RegisterAction” method “{1}”> 如果用户请求的URL为loginAction.action,则调用…

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

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

JAVA Drp项目实战—— Unable to compile class for JSP 一波三折

交代下背景。电脑系统是64位的&#xff0c;用的是64位的Tomcat。安装是32位的Myeclipse10&#xff0c;java环境也是32位的。Tomcat在開始启动时会报这样一个错误&#xff0c;“Cant load IA 64-bit .dll on a AMD32-bit platform”。可是不耽误使用&#xff0c;近期在敲Drp项目…

Java中的ClassLoader

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

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

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

Doxygen for C++使用说明——注释代码一

写这一节的时候&#xff0c;我在想网上有众多的参考文献&#xff0c;外加官网上的&#xff0c;要是我再将它们重复一遍&#xff0c;也没什么意思。网上资料很多&#xff0c;但是他们有一个共同的缺点是都是罗列用法&#xff0c;然后显示效果。这些都是比较散的&#xff0c;我想…

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;写点东西给后面更新的…