【struts2】struts2中的流接收与流发送

【前言】在我们的struts2后端中,实现流的接收和发送。就能够实现向server传视频流以及下载图片。

【流接收】

如今举一个传公钥的样例。struts2用一个action接收Key,而Key就是用http二进制流传过来的。

配置文件struts.xml写起来非常easy:

<action name="key" class="com.seeplant.action.PublicKeyAction" method="key">

<result>/WEB-INF/content/SUCCESS.jsp</result>

<result>/WEB-INF/content/ERROR.jsp</result>

</action>

仅仅是简单的指定了用Public String key()方法来处理这个Action,Action中用Servlet的Request读出流

public class PublicKeyAction extends ActionSupport {

public String key() {

try (ObjectInputStream oStream = new ObjectInputStream(ServletActionContext.getRequest().getInputStream());) {

java.security.Key publicKey = (Key) oStream.readObject();

System.out.println("公钥\n"+publicKey);

} catch (Exception e) { e.printStackTrace();}

}

}

为了配合測试,贴上client发请求的代码。

public class MyTest {

private final static int KEYSIZE = 512;

private final static String kurlstring = "http://127.0.0.1/key";

public static void main(String[] args) {

try {

URL url = new URL(kurlstring);

URLConnection uConnection = url.openConnection();

uConnection.setRequestProperty("content-type", "application/octet-stream");
//注意这里的content-type,一定要按规范写

uConnection.setDoOutput(true);

OutputStream oStream = uConnection.getOutputStream();

// 生成Key

KeyPairGenerator pairGenerator = KeyPairGenerator.getInstance("RSA");

SecureRandom random = new SecureRandom();

pairGenerator.initialize(KEYSIZE,random);

KeyPair keyPair = pairGenerator.generateKeyPair();

try (ObjectOutputStream out = new ObjectOutputStream(oStream);){

out.writeObject(keyPair.getPublic());

out.flush();

} catch (Exception e) {

// TODO: handle exception

e.printStackTrace();

}

uConnection.getInputStream();

} catch (MalformedURLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (NoSuchAlgorithmException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

【流发送】流发送一般用于server公布流媒体。像中文名的图片就能够用流发送的方式提供,而不用改动tomcat的配置

struts.xml中,相应的流发送Action要配置成stream模式

<action name="download" class="com.seeplant.action.AndroidAppDownload">

<param name="inputPath">/WEB-INF/androidVersion/SeePlant.apk</param>
<!-- 这里指定了源文件的路径,在action类中有一个inputPath属性-->

<result type="stream">

<!--这里要指定content Type-->

<param name="contentType">application/vnd.android.package-archive</param>

<!--这个inputName一定要有,他是框架默认的入口函数标示,这里定义了一个targetFile,structs在收到client请求的download.action之后,会定位到getTargetFile函数。细致体会一下这里的相应关系-->

<param name="inputName">targetFile</param>

<!-- 这里是设置client收到的文件名称 ,client将会看到将要打开一个叫做SeePlantPack.apk的文件 -->

<param name="contentDisposition">filename="SeePlantPack.apk"</param>

<param name="bufferSize">4096</param>

</result>

Action非常easy

public class AndroidAppDownload extends ActionSupport {

private String inputPath;

public void setInputPath(String inputPath) { this.inputPath = inputPath;}

// 注意这里的入口方法的返回值是InputStream接口类型

public InputStream getTargetFile() throws Exception {

return ServletActionContext.getServletContext().getResourceAsStream(inputPath);

}

}

时间: 2024-10-15 00:56:33

【struts2】struts2中的流接收与流发送的相关文章

通过http请求传递xml流和接收xml流的代码示例

通过http请求传递xml流和接收xml流的代码示例 //1.在servlet中post一个xml流:import java.io.OutputStreamWriter;import org.jdom.Document;import org.jdom.Document; public void doPost(HttpServletRequest request, HttpServletResponse response)    throws ServletException, IOExcepti

JavaScript中的两种事件流

JavaScript中的两种事件流 事件流描述的是从页面中接收事件的顺序.提出事件流概念的正是IE和Netscape,但是前者提出的是我们常用的事件冒泡流,而后者提出的是事件捕获流. 第一部分:事件冒泡 即事件开始由最具体的元素接收,然后逐级向上传播到较为不具体的节点(文档). 下面举一个简单的例子: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"&

ffmpeg接收rtsp流问题

项目使用mingw环境g++5.3,C++调用ffmpeg接收rtsp流,再通过C#显示.结构上是C#调用C++的so文件,读取得到的视频帧(RGB888格式),通过图片控件显示. 一开始是使用opencv打开视频源,本地文件和rtsp的源使用一样的接口,方便使用.但是通过opencv打开rtsp源的时候,发现720p2Mbit的视频能够正常打开,但1080p的视频打开后出马赛克,卡顿比较多. 而同样的视频源,使用VLC就能流畅的打开,不过延时很高,大约1s. 后来又发现,使用i3低电压版CPU

IO包中的其他类 打印流,序列流,操作对象,管道流,RandomAccessFile,操作基本数据类型,操作字节数组

打印流,序列流,操作对象,管道流,RandomAccessFile,操作基本数据类型,操作字节数组 一.打印流: 该流提供了打印方法,可以将各种数据类型的数据都原样打印. 字节打印流PrintStream构造函数可以接收的参数类型1.File对象 File2.字符串路径 String3.字节输出流 OutputStream 字符打印流PrintWriter(更常用)1.File对象 File2.字符串路径 String3.字节输出流 OutputStream4.字符输出流 Writer publ

java中的序列化流和反序列化流

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px SimSun; color: #4e9072 } 序列化流:把对象按照流一样的方式存入文本文件或者在网络中传输.  对象 -- 流数据(ObjectOutputStream) 反序列化流:把文本文件中的流对象数据或者网络中的流对象数据还原成对象.流数据 -- 对象(ObjectInputStream) 序列化流和反序列化流不同于字节流 字符流 内存字节流,这些都是把字符串写入/读取文件,序列

struts2 action中的私有变量

struts2 框架中action 中都有一些私有变量来接收ajax传过来的值,比如:有个page(private String page;)接收传过来的页数,当ajax访问这个action 而没有传过来page参数时,page = null ,而不是""

struts2.0中Action的对象生命周期详解!!(转)

原文出处:http://blog.csdn.net/wxy_g/article/details/2071662 有很多人问Struts2.0中的对象既然都是线程安全的,都不是单例模式,那么它究竟何时创建,何时销毁呢? 这个和struts2.0中的配置有关,我们来看struts.properties ### if specified, the default object factory can be overridden here ### Note: short-hand notation is

1.java.io包中定义了多个流类型来实现输入和输出功能,

1.java.io包中定义了多个流类型来实现输入和输出功能,可以从不同的角度对其进行分 类,按功能分为:(C),如果为读取的内容进行处理后再输出,需要使用下列哪种流?(G)   A.输入流和输出流 B.字节流和字符流 C.节点流和处理流   D.File stream E.Pipe stream F.Random stream G.Filter stream

关于Struts2 Action中get和set惹得祸。

代码: 1 public class RandomAction extends PageAction { 2 3 /**随机抽取**/ 4 private IRandomService randomService; 5 6 /**责任民警**/ 7 private IScZrmjService scZrmjService; 8 9 /**企业基本信息**/ 10 private IQyjbxxService qyjbxxService; 11 12 private User user; 13 1