【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);
}
}
【struts2】struts2中的流接收与流发送的更多相关文章
- Linux网络中接收 "二进制" 流的那些事 --- 就recv的返回值和strlen库函数进行对话
1. 前言 很多朋友在做网络编程开发的时候可能都遇到这样的问题,在进行接收二进制流的数据的时候,使用strlen库函数来得到 二进制数据长度的时候并不准确.为什么呢??首先,使用strlen进行 ...
- java中的序列化流和反序列化流
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px SimSun; color: #4e9072 } 序列化流:把对象按照流一样的方式存入文本文件 ...
- 通过http请求传递xml流和接收xml流的代码示例
通过http请求传递xml流和接收xml流的代码示例 //1.在servlet中post一个xml流:import java.io.OutputStreamWriter;import org.jdom ...
- ffmpeg接收rtsp流问题
项目使用mingw环境g++5.3,C++调用ffmpeg接收rtsp流,再通过C#显示.结构上是C#调用C++的so文件,读取得到的视频帧(RGB888格式),通过图片控件显示. 一开始是使用ope ...
- Java中使用try-catch-finally处理IO流中的异常
我们使用try-catch-finally来接收IO流的异常 finally是最后执行的步骤,非常适合最后存放close来关闭IO流,而且编程中我们不可以随意抛出异常,必须对异常进行处理. 从try- ...
- ueditor1.3.6jsp版在struts2应用中上传图片报"未找到上传文件"解决方案
摘要: ueditor1.3.6jsp版在struts2应用中上传图片报"未找到上传文件"解决方案 在struts2应用中使用ueditor富文本编辑器上传图片或者附件时,即使配置 ...
- 请求在Struts2框架中的处理步骤
上图来源于Struts2官方站点,是Struts 2 的整体结构. 一个请求在Struts2框架中的处理大概分为以下几个步骤 1 客户端初始化一个指向Servlet容器(例如Tomcat)的请求 2 ...
- struts2配置文件中action的name属性
struts2配置文件中action的name属性的第一个字符不要加斜杠 <action name="see" class="baoxiuManage_seeAct ...
- C++中输入输出流及文件流操作笔记
1.流的控制 iomanip 在使用格式化I/O时应包含此头文件. stdiostream 用于混合使用C和C + +的I/O机制时,例如想将C程序转变为C++程序 2.类 ...
随机推荐
- CF 372B Counting Rectangles is Fun [dp+数据维护]
题意,给出一个n行m列的矩阵 里面元素是0或者1 给出q个询问 a,b,c,d 求(a,b)到(c,d)有多少个由0组成的矩形 我们定义 watermark/2/text/aHR0cDovL2Jsb2 ...
- 初学ToggleButton 点击button,更换button背景图片;再次点击,恢复之前背景图
上方的图标,R.drawable.register_checked 是选中图片 下方的图标, R.drawable.register_unchecked 是未选中图片 默认是上方的选中效果.点击 ...
- phpStorm中ftp的配置与使用,支持配置多个
小结:很方便,支持ftp功能和比较. 扩展,可以查看远程文件和日期 配置多个ftp
- 分析性能瓶颈的视图:v$session_wait
这是一个寻找性能瓶颈的关键视图.它提供了任何情况下session在数据库中当前正在等待什么(如果session当前什么也没在做,则显示它最后的等待事件).当系统存在性能问题时,本视图可以做为一个起点指 ...
- kubernetes系列:(一)、kubeadm搭建kubernetes(v1.13.1)单节点集群
kubeadm是Kubernetes官方提供的用于快速部署Kubernetes集群的工具,本篇文章使用kubeadm搭建一个单master节点的k8s集群. 节点部署信息 节点主机名 节点IP 节点角 ...
- 关于HTML与CSS与class
在web前端开发中接触的一直是html.css.javascript. 在这个过程中,经常使用的是html中的span.div元素以及css的选择器. 为了方便查找在这里将这些内容的基础知识记录下来. ...
- .NET平台开源JSON序列化
转载: http://blog.csdn.net/ddgweb/article/details/39643747 一个简单示例: String str = "{’name’:’cyf’,’i ...
- Spinner默认选择问题
1.需求中使用Spinner,不允许有默认选中,在网上查了好多,有设置 spinner.setSelection(-1,true); 也有设置如下: spinner.setOnItemSelected ...
- 有关windows dpi适配(c#)
/// <summary>当前Dpi</summary> public static Int32 Dpi { get; set; } /// <summary>修正 ...
- mac修改默认打开方式
首先选中你要修改默认打开方式的文件,右键单击这个文件,在弹出的菜单中,选择“查看简介”: 然后在弹出的菜单中,找到“打开方式”选项,从下来的菜单中,找到你希望默认打开这个文件的程序: 然后点击下面的“ ...