`

jsp用流从数据库读取图片, 如果有图片就显示,没有则显示默认的图片

    博客分类:
  • jsp
阅读更多
[size=medium]数据库中存放的头像是byte[] 字节的,在jsp页面上根据用户的id用流从数据库中读取图片。但是如果用户没有头像的话,那么在页面上显示的就是一个图片的小白框框,难看死了,所以如果用户没有头像的话,就给用户一个默认的头像。
在User类中:
private byte img[];

在UserAction类中:
ClientUser user = new ClientUser();
user=UserService.getUserByUserId(sqlSession,user);				request.getSession().setAttribute("LoginUserImg", user.getImg().length);
//在这里需要用byte[]对象的length属性判断是否存放了图片,如果length为0,那么就没有图片,反之则有。

在jsp页面中:
<c:if test="${LoginUserImg==0 }">
					<img src="${pageContext.request.contextPath }/images/head.jpg"
						alt=" " width="100" height="118" align="middle" />
				</c:if>
				<c:if test="${LoginUserImg!=0 }">
					<img
						src="userImg.jsp?id=${id}"
						alt="${id}"
						width="100" height="118" align="middle">
				</c:if>

userImg.jsp:
<%@page contentType="image/jpeg; charset=utf8"%>
<%@page import="java.io.OutputStream"%>
<%
	String id = request.getParameter("id"); 
	Boolean ret = true;
	id = id == null ? "" : id.trim();
	userId = userId == null ? "" : userId.trim();
	OutputStream os = response.getOutputStream();
	if (!id.isEmpty()) {

		ret =UserService.getUserImgById(
				id, os); 
	}  
	os.flush();
	os.close();
	os = null;
	response.flushBuffer();//下面这三句是一定要加上的,否则就会报错。
	out.clear();
	out = pageContext.pushBody();
%>

=================================================================================
后来发现上面的办法并不是最好的解决办法,比如对象User和ClientUser都有byte[] img的属相,那么再Action类中就要分别根据主键id获取对象信息的img属性,然后放到容器中判断byte[]的长度是否为0.那么这是很繁琐的。因此,我想到了一个更好的方法,那就是把读取默认图片也封装成一个方法。java类代码如下:
 
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.OutputStream;

public class DefaultImage {
	public static int getUserImg(OutputStream out, String path) {
		int size = -1;
		FileInputStream is = null;
		try {
			is = new FileInputStream(path);
			// size = is.available(); // 得到文件大小
			byte[] bytes = new byte[1024];
			int len = 0;
			// 开始读取图片信息
			while (-1 != (len = is.read(bytes))) {
				out.write(bytes, 0, len);
				size += len;
			}
			out.flush();
			out.close();
			is.close();
			is = null;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return size;

	}
} 

在jsp页面中,这个和上面的一样,没有变化,只是传递一个id到userImg.jsp中。
<c:if test="${LoginUserImg==0 }">
					<img src="${pageContext.request.contextPath }/images/head.jpg"
						alt=" " width="100" height="118" align="middle" />
				</c:if>
				<c:if test="${LoginUserImg!=0 }">
					<img
						src="userImg.jsp?id=${id}"
						alt="${id}"
						width="100" height="118" align="middle">
				</c:if>

userImg.jsp:
<%@page contentType="image/jpeg; charset=utf8"%>
<%@page import="java.io.OutputStream"%>
<%@page import="java.io.FileInputStream"%>
<%@page import="com.tools.DefaultImage"%>
<%
	String id = request.getParameter("id");
	String userId = request.getParameter("uid");
	int imgLen = 0;
	id = id == null ? "" : id.trim();/**注意这个地方必须判断一下**/
	userId = userId == null ? "" : userId.trim();
	OutputStream os = response.getOutputStream();

	if (!id.isEmpty()) {
		imgLen = UserService.getUserImgById(
				id, os);//Get Validate Information
	} else if (!userId.isEmpty()) {
		imgLen =UserService
				.getUserImgByUserId(userId, os); 
	}
        //开始读取默认图片
	[color=red]String path = request.getRealPath("/images/head.jpg");[/color]
        //获取项目下的相对路径
	if (imgLen <= 0) {
		imgLen = DefaultImage.getUserImg(os, path);
	} else {
		os.flush();
		os.close();
	}
	os = null;
	response.flushBuffer();
	out.clear();
	out = pageContext.pushBody();
%> 
  
[/size]
分享到:
评论
3 楼 2213127617 2017-04-19  
  
2 楼 2213127617 2017-04-19  
[/flash]
1 楼 yuruei2000 2012-04-16  
不错,挺棒!

相关推荐

    jsp读取数据库实现分页技术简析

    这篇文章介绍的是用javabean和jsp页面来实现数据的分页显示,例子中所使用的数据库是Mysql。 1、先看javabean 类名: databaseBean.java: 以下为databaseBean.java的代码: 代码如下: package database_basic; ...

    网页教程《跟姐姐学JSP》

    1. 想用jsp做网站的朋友看过来 2. 预备知识 3. java环境配置 3.1. 安装jdk 3.2. 配置tomcat服务器 1. 开始编写jsp 1.1. 开篇第一个jsp 1.2. B/S结构,请求与响应 2. 让jsp说hello 2.1. 另一个简单jsp 2.2. ...

    Servlet与JSP核心编程第2版

    15.7 从jsp页面转发请求 15.8 包含页面 第16章 简化对java代码的访问:jsp 2.0表达式语言 16.1 应用el的驱动力 16.2 表达式语言的调用 16.3 阻止表达式语言的求值 16.4 阻止标准脚本元素的使用 16.5 ...

    Java网上书店管理系统(基于MVC模式编写:前端jsp页面、数据库MySQL、服务器Tomcat).zip

    MyISAM则更侧重于读取密集型操作,提供全文索引支持,适用于读多写少的场景。这种多引擎架构使得MySQL能够适应不同业务需求,提供高度定制化的存储解决方案。 性能与可扩展性 MySQL通过高效的缓存机制、查询优化器...

    基于Jsp+Servlet+Java实现的病房管理系统源码+说明书.zip

    医生在侧边栏选择“医嘱编写”则进入编写医嘱的页面,此处显示对当前登录的医生负责的患者的信息(如图1-3所示)且具备搜索功能,在Search框内输入需要寻找的内容,若想搜索不同列则搜索词条间用空格隔开即可。...

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

    如果不使用 arc 参数,则 map 命令显示设备名称。 map 命令还显示文件系统的类型和每个磁盘的大小(MB)。 二。★★★常见文件扩展名和它们的说明 常见文件扩展名和它们的说明 A ACE:Ace压缩档案格式 ACT:...

    JAVA上百实例源码以及开源项目

     数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录  一个Java+ajax写...

    day019-io笔记和代码.rar

    * 别人给提供了字节流,而需要处理文本文件,这时候,就需要用转换流转换一下,更方便处理文本文件 * * 作用:就是一字符流的方式读取或写出文本相关的数据 * * InputStreamReader:将字节输入流包装...

    SpringBoot 学习笔记+完整教程

    Spring boot(后续用*表示) helloworld * 返回 json 数据 * 使用其他 json 转换框架 * 全局异常捕捉 * JPA 连接数据库 * 配置 JPA * 整合 JPA 保存数据 * 使用 JdbcTemplate 保存数据 * 常用配置 * 静态资源处理 * ...

    Java开发技术大全(500个源代码).

    代码范例列表 第1章 ... useArray2.java 用反射机制使用数组示例2 第10章 示例描述:本章学习泛型。 demoBounds.java 演示有界类型 demoForceChange.java 演示强制类型转换 demoGeneric.java ...

    test_mysql.rar_ROOT_TEST MYSQL

    测试Mysql是否安装成功,用jsp查询mysql数据库的内容,默认连接数据库用root用户名,密码是123456.mysql数据库中有testdatabase这样一个数据库,该数据库中有mytable表,表中的内容可以读取出来。

    JAVA上百实例源码以及开源项目源代码

     数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录  一个Java+ajax写...

    淘特站内搜索引擎For帝国CMS版v4.0

    有效解决了帝国CMS在数据量很大时采取直接读取数据库查询的性能问题。 使用方法 1、登录后台//localhost:8080/searchportal/ 默认用户名:admins 密码:admins 2、配置:网站地址、数据库连接参数(数据库URL、...

    cas4.2.7服务端+cas客户端+示例程序+环境搭建之服务端war包

    除了cas默认支持的功能外,该war包还实现了:登录页面的样式修改,让所有页面提示变为中文,登录时候对用户账户和密码的验证信息是从数据库中读取的,登录成功后,客户端需要获取用户相关的其他信息时,服务端会通过...

    jpivot学习总结.doc

    memberReaderClass 设定一个成员读取器,默认情况下 Hierarchy 都是从关系型数据库里读取的,如果你的数据不在 RDBMS 里面的话,你可以通过自定义一个 member reader 来表现一个 Hierarchy 。 3.5. Level 级别 , ...

    javaweb(jsp)-课程设计-图书购物网站,基于JSP(MVC模式)和MySQL的网上图书购物系统.zip

    MyISAM则更侧重于读取密集型操作,提供全文索引支持,适用于读多写少的场景。这种多引擎架构使得MySQL能够适应不同业务需求,提供高度定制化的存储解决方案。 性能与可扩展性 MySQL通过高效的缓存机制、查询优化器...

    风越asp代码生成器 V3.5

    《风越代码生成器 [FireCode Creator]》是一款采用.Net FrameWork2.0框架、基于多种数据库的程序代码生成软件,可快速建立数据信息的:添加、编辑、查看、列表、搜索功能。默认提供asp、aspx WEB程序、.net普通三层...

    基于servlet+jsp+mysql的图书馆管理系统.zip

    MyISAM则更侧重于读取密集型操作,提供全文索引支持,适用于读多写少的场景。这种多引擎架构使得MySQL能够适应不同业务需求,提供高度定制化的存储解决方案。 性能与可扩展性 MySQL通过高效的缓存机制、查询优化器...

Global site tag (gtag.js) - Google Analytics