【struts2】struts2中的流接收与流发送
2015-07-09 11:49
627 查看
【前言】在我们的struts2后端中,实现流的接收和发送,就可以实现向服务器传视频流以及下载图片。
【流接收】
现在举一个传公钥的例子。struts2用一个action接收Key,而Key就是用http二进制流传过来的。
配置文件struts.xml写起来很简单:
<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();}
}
}
为了配合测试,贴上客户端发请求的代码。
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();
}
}
}
【流发送】流发送一般用于服务器发布流媒体。像中文名的图片就可以用流发送的方式提供,而不用修改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在收到客户端请求的download.action之后,会定位到getTargetFile函数,仔细体会一下这里的对应关系-->
<param name="inputName">targetFile</param>
<!-- 这里是设置客户端收到的文件名 ,客户端将会看到将要打开一个叫做SeePlantPack.apk的文件 -->
<param name="contentDisposition">filename="SeePlantPack.apk"</param>
<param name="bufferSize">4096</param>
</result>
Action很简单
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用一个action接收Key,而Key就是用http二进制流传过来的。
配置文件struts.xml写起来很简单:
<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();}
}
}
为了配合测试,贴上客户端发请求的代码。
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();
}
}
}
【流发送】流发送一般用于服务器发布流媒体。像中文名的图片就可以用流发送的方式提供,而不用修改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在收到客户端请求的download.action之后,会定位到getTargetFile函数,仔细体会一下这里的对应关系-->
<param name="inputName">targetFile</param>
<!-- 这里是设置客户端收到的文件名 ,客户端将会看到将要打开一个叫做SeePlantPack.apk的文件 -->
<param name="contentDisposition">filename="SeePlantPack.apk"</param>
<param name="bufferSize">4096</param>
</result>
Action很简单
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);
}
}
相关文章推荐
- Java(多态练习 instanceof)
- Java基础日记———Java的三大特性(下)
- Eclipse离线安装SVN插件速度很慢的解决办法
- java反射机制实例解析
- java 软件 设置session超时(失效)的三种方式
- java基础入门-对象流与序列化
- java基础入门-对象流与序列化
- Java读取图片像素和大小
- java.lang.IllegalStateException: Argument [RedirectAttributes] is of type Model
- [LeetCode][Java] 3Sum
- Java经典算法的实现(一)-----希尔排序
- Java的工作方式
- MyEclipse6.5注册机
- java.lang.NoSuchMethodError: antlr.collections.AST.getLine()解决方法
- 深入理解java垃圾回收机制
- 简述spring mvc 和spring
- [LeetCode][Java] Longest Common Prefix
- struts2(一)---编写第一个struts2项目
- Maven自定义绑定插件
- Java基础日记———异常