1.好了,我们终于要有新的需求了,在我的
《3.如何使用@RequestMapping注解》里面讲授了如何使用@RequestMapping
进行请求映射
《4.关于@RequestMapping上传图片》里面讲授了如何传递图片(或许我会单独
开一张来讲如何传递文字啥的)
现在嘛,我提出了一个需求,我如何在前端请求
服务器,然后服务器就给我返回一张图片,并且下载到本地
,哈哈,这个感觉就有些挑战性了是吧
卜若的代码笔记系列是对每一个技术点进行故事性的
攻略,如果你有技术问题,欢迎发送邮件给我
874212844@qq.com
好了,广告打到这儿,基本上以后每一篇卜若的代码笔记
都会有上三句哈~
现在开始go!
2.现在,我们简化需求,我定义一个
<href>
的标签,制作一个url请求发给服务器,并且将这个请求
映射到我们的服务器,接着,我们的服务器返回一个新的页面
并且将我们的图片放到这个页面上去。
好,这个流程看起来非常简单,先来一段代码
<body>
<a href="requestPic">请求图片</a>
</body>
使用这个,我们向服务器发送一个requestPic的请求,并且将这个请求映射到控制器当中去
当我们点击了这个请求之后,其实是发送了一个请求给我们的控制器,发送一个requestPic的请求
好了,我们接受到这个请求通过servlet发给控制器Controller。
接着,我们需要返回给我们的请求者一张图片。
于是我们可以直接使用response。
我们再来屡一下,我这里举个例子,因为我是菜鸡所以我知道身为菜鸡的各位缺的是啥。
我现在产生了一个新的需求,我的前端显示一张图片,于是我可以这样请求
<img src="http://localhost:8080/test/showImage.jpeg" height="80" width="80"/>
它其实是组装了一个url,并且将showImage.jpeg发给服务器然后转发给控制器。
我只需要response一个东西,就会顺着这个《请求线》返回给我们请求的页面。
换句话说
我控制器声明了一个负责解决showImage.jpeg的函数映射(一个策略)
@RequestMapping("/showImage.jpeg")
public String showImage(HttpServletResponse response) throws Exception {
try{
FileInputStream fis = new FileInputStream("D:\\temp\\test.jpeg"); // 以byte流的方式打开文件 d:\1.gif
int i=fis.available(); //得到文件大小
byte data[]=new byte[i];
fis.read(data); //读数据
response.setContentType("image/*"); //设置返回的文件类型
OutputStream toClient=response.getOutputStream(); //得到向客户端输出二进制数据的对象
toClient.write(data); //输出数据
toClient.flush();
toClient.close();
fis.close();
}catch(Exception e){
e.printStackTrace();
System.out.println("图片不存在");
}
return "success";
}
ps:非常抱歉我这段代码是摘录自网上,但是我关浏览器的时候没有记录那个地址,如果有谁看到欢迎留言,把你送上去!
response之后,其实已经顺着请求线对请求做了回复。
我们再刷新一下页面,其实图片已经显示出来了。
然后整个请求流程是这样子的。但事实上,还有坑。
首先,我们的服务器是做不到物理穿透的,什么意思呢?就是说我们不能强行的从硬盘去读取图片,这特么就很恶心了。
然后我们应该如何解决呢?当然可以使用无所不能的i/o流啦~
具体代码看上面咯~