`
cuisuqiang
  • 浏览: 3935666 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
3feb66c0-2fb6-35ff-968a-5f5ec10ada43
Java研发技术指南
浏览量:3650303
社区版块
存档分类
最新评论

通过Servlet 将服务器硬盘图片 展示到浏览器

    博客分类:
  • J2EE
阅读更多

其实这个实例非常简单,但是今天有人问我了,而且我也写了个小例子,就顺便发上来吧!

 

在浏览器显示一张图片,使用标签

<img src="">

 

img 元素向网页中嵌入一幅图像。
请注意,从技术上讲,<img> 标签并不会在网页中插入图像,而是从网页上链接图像。<img> 标签创建的是被引用图像的占位空间。
<img> 标签有两个必需的属性:src 属性 和 alt 属性。

 

HTML 与 XHTML 之间的差异
在 HTML 中,<img> 标签没有结束标签。
在 XHTML 中,<img> 标签必须被正确地关闭。
在 HTML 4.01 中,不推荐使用 image 元素的 "align"、"border"、"hspace" 以及 "vspace" 属性。
在 XHTML 1.0 Strict DTD 中,不支持 image 元素的 "align"、"border"、"hspace" 以及 "vspace" 属性。

 

SRC的路径有很多:

指向其他站点(比如 src="http://www.******.com/***.jpg")
指向站点内的文件(比如 src="/i/image.gif")

许多新手忽略了一点是,其实IMG只是告诉浏览器这里要现实图片,而浏览器通过路径去获得图片的数据流然后进行显示

简单来说,SRC其实就是浏览器走了一个请求,然后这个请求返回图片的数据流给浏览器而已

所以,SRC同样可以是请求,可以是Servlet也可以是Action,这里我们用Servlet来做一个简单示例

 

JSP页面:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    <title>图片显示</title>
  </head>
  <body>
    <img src="<%=basePath %>servlet/ImageShowServlet">
  </body>
</html>

 

Web.xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <servlet>
    <servlet-name>ImageShowServlet</servlet-name>
    <servlet-class>servlet.ImageShowServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>ImageShowServlet</servlet-name>
    <url-pattern>/servlet/ImageShowServlet</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

 

Servlet非常简单:

package servlet;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @说明 该Servlet将本地硬盘的图片输入管道中
 * @author cuisuqiang
 * @version 1.0
 * @since
 */
@SuppressWarnings("serial")
public class ImageShowServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		OutputStream os = response.getOutputStream();
		File file = new File("C:\\abc.jpg");
		FileInputStream fips = new FileInputStream(file);
		byte[] btImg = readStream(fips);
		os.write(btImg);
		os.flush();
	}
	
	/**
	 * 读取管道中的流数据
	 */
	public byte[] readStream(InputStream inStream) {
		ByteArrayOutputStream bops = new ByteArrayOutputStream();
		int data = -1;
		try {
			while((data = inStream.read()) != -1){
				bops.write(data);
			}
			return bops.toByteArray();
		}catch(Exception e){
			return null;
		}
	}
}

 

就是获取本地硬盘的文件的字节流,然后写入到管道中而已!

 

请您到ITEYE网站看原创,谢谢!

http://cuisuqiang.iteye.com/ !

自建博客地址:http://www.javacui.com/ ,内容与ITEYE同步!

分享到:
评论
6 楼 hugh.wang 2013-04-17  
文件流需要关闭吗
5 楼 宋建勇 2012-12-21  
4 楼 122829827 2012-12-15  
学习了,楼主加油
3 楼 cuisuqiang 2012-12-06  
pengyan5945 写道
验证码不就这么干的吗?只是验证码是生成一张图片,最后servlet都是流的形式返回!

是的
2 楼 cuisuqiang 2012-12-06  
用以下代码生成验证码
package com.nms.servlet;

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.*;
import javax.servlet.http.*;

/**
 * @说明 向客户端输出验证码
 * @author cuisuqiang
 * @version 1.0
 * @since
 */
@SuppressWarnings("serial")
public class ValidationCode extends HttpServlet {
	// 图形验证码的字符集合,系统将随机从这个字符串中选择一些字符作为验证码
	private static String codeChars = "%#23456789abcdefghkmnpqrstuvwxyzABCDEFGHKLMNPQRSTUVWXYZ";

	// 返回一个随机颜色(Color对象)
	private static Color getRandomColor(int minColor, int maxColor) {
		Random random = new Random();
		// 保存minColor最大不会超过255
		if (minColor > 255)
			minColor = 255;
		// 保存minColor最大不会超过255
		if (maxColor > 255)
			maxColor = 255;
		// 获得红色的随机颜色值
		int red = minColor + random.nextInt(maxColor - minColor);
		// 获得绿色的随机颜色值
		int green = minColor + random.nextInt(maxColor - minColor);
		// 获得蓝色的随机颜色值
		int blue = minColor + random.nextInt(maxColor - minColor);
		return new Color(red, green, blue);
	}

	@Override
	protected void service(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		try {
			// 获得验证码集合的长度
			int charsLength = codeChars.length();
			// 下面三条记录是关闭客户端浏览器的缓冲区
			// 这三条语句都可以关闭浏览器的缓冲区,但是由于浏览器的版本不同,对这三条语句的支持也不同
			// 因此,为了保险起见,建议同时使用这三条语句来关闭浏览器的缓冲区
			response.setHeader("ragma", "No-cache");
			response.setHeader("Cache-Control", "no-cache");
			response.setDateHeader("Expires", 0);
			// 设置图形验证码的长和宽(图形的大小)
			int width = 90, height = 20;
			BufferedImage image = new BufferedImage(width, height,
					BufferedImage.TYPE_INT_RGB);
			Graphics g = image.getGraphics();// 获得用于输出文字的Graphics对象
			Random random = new Random();
			g.setColor(getRandomColor(180, 250));// 随机设置要填充的颜色
			g.fillRect(0, 0, width, height);// 填充图形背景
			// 设置初始字体
			g.setFont(new Font("Times New Roman", Font.ITALIC, height));
			g.setColor(getRandomColor(120, 180));// 随机设置字体颜色
			// 用于保存最后随机生成的验证码
			StringBuilder validationCode = new StringBuilder();
			// 验证码的随机字体
			String[] fontNames = { "Times New Roman", "Book antiqua", "Arial" };
			// 随机生成3个到5个验证码
			for (int i = 0; i < 3 + random.nextInt(3); i++) {
				// 随机设置当前验证码的字符的字体
				g.setFont(new Font(fontNames[random.nextInt(3)], Font.ITALIC,
						height));
				// 随机获得当前验证码的字符
				char codeChar = codeChars.charAt(random.nextInt(charsLength));
				validationCode.append(codeChar);
				// 随机设置当前验证码字符的颜色
				g.setColor(getRandomColor(10, 100));
				// 在图形上输出验证码字符,x和y都是随机生成的
				g.drawString(String.valueOf(codeChar), 16 * i
						+ random.nextInt(7), height - random.nextInt(6));
			}
			// 获得HttpSession对象
			HttpSession session = request.getSession();
			session.setMaxInactiveInterval(5 * 60); // 设置session对象5分钟失效
			// 将验证码保存在session对象中,key为validation_code
			session.setAttribute("validation_code", validationCode.toString());
			g.dispose();// 关闭Graphics对象
			OutputStream os = response.getOutputStream();
			ImageIO.write(image, "JPEG", os);// 以JPEG格式向客户端发送图形验证码
		} catch (Exception e) {
		}
	}
}
1 楼 pengyan5945 2012-12-06  
验证码不就这么干的吗?只是验证码是生成一张图片,最后servlet都是流的形式返回!

相关推荐

    JSP中通过Servlet 将服务器硬盘图片并展示到浏览器

    主要介绍了JSP中通过Servlet 将服务器硬盘图片并展示到浏览器的相关资料,希望通过本文大家可以实现这样的功能,需要的朋友可以参考下

    JSP 开发之THE SERVLET NAME ALREADY EXISTS.解决方法

    The servlet name already exists.解决方法 当我们建立过同名的servlet文件,... 您可能感兴趣的文章:Java,JSP,Servlet获取当前工程路径(绝对路径)问题解析JSP中通过Servlet 将服务器硬盘图片并展示到浏览器Jsp+S

    java-servlet-api.doc

    Servlet通过HTTP将这个响应转发到客户端。 在功能上,Servlet与CGI、NSAPI有点类似,但是,与他们不同的是:Servlet具有平台无关性。 JavaServlet概论 Servlet与其他普通的server扩展机制有以下进步: 因为它采用了...

    利用Cookie实现十天免登录

    浏览器接收到来自服务器的Cookie数据之后默认将其保存在浏览器缓存中(如果浏览器关闭,缓存消失,Cookie数据消失),只要浏览器不关闭,当我们下一次发送“特定”请求的时候,浏览器负责将Cookie数据发送给WEB...

    开源网络硬盘系统-dogdisk.rar.tar.gz.tar.gz

    JSP将Java代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。JSP引入了被称为“JSP动作”的XML标签,用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签...

    基于javatcpsocket通信的拆包和装包源码-Servlet:小服务程序

    但是随着网络的发展,很多线下业务开始向网上发展,基于Internet的web应用也变得越来越复杂用户所访问的资源已不仅仅局限于服务器硬盘上存放的静态网页,更多的应用需要根据用户的请求动态生成网页信息,复杂的还...

    基于J2EE框架的个人博客系统项目毕业设计论...

    即应用程序在部署、升级、维护时,只需要在服务器端进行配置就可以了,网络管理人员只需要管理服务器就行了,用户界面主要事务逻辑在服务器(Server)端完全通过WWW浏览器实现,极少部分事务逻辑在前端(Browser)...

    java获取路径的各种方法

    基本概念的理解绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如:C:xyz est.txt 代表了test.txt文件的绝对路径。http://www.sun.com/index.htm也代表了一个URL绝对路径。相对...

    《Java-web程序设计》教案.doc

    从只有一个小的Jar文件就可以运行Servlet/JSP,到由多台服务器 进行集群和负载均衡,到多台Application进行事务处理,消息处理,一台服务器到无数 台服务器,Java显示了一个巨大的生命力。 多样化和功能强大的开发...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    即应用程序在部署、升级、维护时,只需要在服务器端进行配置就可以了,网络管理人员只需要管理服务器就行了,用户界面主要事务逻辑在服务器(Server)端完全通过WWW浏览器实现,极少部分事务逻辑在前端(Browser)...

    网管教程 从入门到精通软件篇.txt

     下例将在硬盘上添加一个 20 MB 的分区:  diskpart /add Device HardDisk0 20  Fixboot  向系统分区写入新的分区引导扇区。只有在使用故障恢复控制台时,才能使用 fixboot 命令。  fixboot [drive]  ...

    RED HAT LINUX 6大全

    11.5.3 DNS将名字映射到IP地址及反 序操作 207 11.5.4 前区和反区必须保持同步 207 11.5.5 HUP信号和重启 207 11.5.6 IN-ADDR.ARPA域 207 11.5.7 主机命名方案 208 11.5.8 配置DNS客户:/etc/resolv.conf 208 ...

    jsp探针 ver0.1

    Class.forName("org.apache.struts.action.ActionServlet"); supportStruts = true; } catch (ClassNotFoundException ex) { } try { Class.forName("javax.naming.Name"); supportJNDI = true; } catch ...

Global site tag (gtag.js) - Google Analytics