您的位置:首页 > 编程语言 > Java开发

【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);

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: