Seam文件(图片)上传及相关学习记录

本文介绍如何使用s:fileUpload标签上传图片并将其转换为二进制数据存储在数据库中,同时探讨了ImageServlet如何从数据库读取这些数据并展示图片。此外,还涉及文件名过滤器的使用以及JDBC的相关知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//需要相关的知识补充,JDBC 、Servlet  
1、我的疑问是imageServlet是在展示的时候通过servlet获取保存在数据库中的二进制数据的,那么保存的时候是怎么将图片转换成二进制数据保存的呢?!
难道<s:fileUpload>自动实现了转化?----->答案是肯定的,s:fileUpload图片转化为二进制数据存进了数据库。
2、还有就是文件名字的获取是怎么实现的?有一个类FileNameFilter也就是文件名过滤器!  但是另外的没有声明使用它呀!还是s:fileUpload默认使用这个类???
没有找到任何文件中声明使用它,那么它存在的意义是怎样的,是否可有可无?不是的话他是怎么发挥作用的?------>这个问题还不是很清楚。

一、在web.xml文件中声明在处理上传图片servlet:
1、
<!-- 显示图片的servlet -->
	<servlet>
		<servlet-name>Image Servlet</servlet-name>
		<servlet-class>cn.edu.sudt.zhidui.servlet.ImageServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>Image Servlet</servlet-name>
		<url-pattern>/avator.showimg</url-pattern>
	</servlet-mapping>


2、对于s:fileUpload标签满江红的文档的说明的比较清楚,可以参考学习,设置其他的属性!不赘述。




二、文件名过滤器的一般使用方法就是实现FilenameFilter接口,然后定义String为过滤的模式,然后重写accept方法!
public class FileNameFilter implements FilenameFilter {
	String extension = "";

	public FileNameFilter(String fileExtensionNoDot) {
		extension += fileExtensionNoDot;
	}


	@Override
	public boolean accept(File dir, String name) {
		return name.startsWith(extension);
	}
}




三、JDBC知识:

推荐几个写的不错的博客教程:我看了写的不错!:

trans.blog.51cto.com/503170/109791/

even2012.iteye.com/blog/1886946




四、

处理图片的servlet。在注释里进行理解

package ××××××××××;


import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


import javax.imageio.ImageIO;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;


public class ImageServlet extends HttpServlet {
	private Integer memberId;
	private byte[] imageByte;


	/**
	 * Get data source by JNDI lookup.
	 * 
	 * @return
	 * @throws NamingException
	 */
	private DataSource getDS() throws NamingException {
		Context context = new InitialContext();
		return (DataSource) context.lookup("penglaiDatasource");
	}
//以上这几行代码不是很清楚,待我弄明白会更新的

	/**
	 * Get byte data from database.
	 * 
	 */
	private void getImageByte() {
		DataSource ds = null;
		Connection conn = null;
		//System.out.println("getImageByte() 调用");
		try {
			ds = getDS();
			conn = ds.getConnection();
			Statement stat = conn.createStatement();
			ResultSet res = stat.executeQuery("select * from member where id='"
					+ memberId + "'");


			while (res.next()) {
				imageByte = res.getBytes("avator_file");
				// System.out.println("-------------- len:"
				// + res.getBytes("avator_file").length);
			}


		} catch (SQLException ex) {
			ex.printStackTrace();
		} catch (NamingException ex) {
			ex.printStackTrace();
		} finally {
			try {
				conn.close();
			} catch (SQLException ex) {
				ex.printStackTrace();
			}
		}


	}


	/**
	 * 得到物品的图片
	 */
	private void getFinanceImageByte() {
		DataSource ds = null;
		Connection conn = null;
//		System.out.println("getFinanceImageByte() 调用");
		try {
			ds = getDS();
			conn = ds.getConnection();
			Statement stat = conn.createStatement();
			ResultSet res = stat
					.executeQuery("select * from finance where id='" + memberId
							+ "'");


			while (res.next()) {
				/*System.out
						.println("getFinanceImageByte()+++++++++++++++++++++ 调用");*/
				imageByte = res.getBytes("image");
//				System.out.println("-------------- len:"
//						+ res.getBytes("image").length);
			}


		} catch (SQLException ex) {
			ex.printStackTrace();
		} catch (NamingException ex) {
			ex.printStackTrace();
		} finally {
			try {
				conn.close();
			} catch (SQLException ex) {
				ex.printStackTrace();
			}
		}


	}


	/**
	 * 得到图片的一个可普遍调用的封装方法
	 */
	private void getImage(String tableName, String filedName) {
		DataSource ds = null;
		Connection conn = null;
		System.out.println("getImage() 调用");
		try {
			ds = getDS();
			conn = ds.getConnection();
			Statement stat = conn.createStatement();
			ResultSet res = stat.executeQuery("select * from  " + tableName
					+ " where id='" + memberId + "'");


			while (res.next()) {
//				System.out
//						.println("getFinanceImageByte()+++++++++++++++++++++ 调用");
				imageByte = res.getBytes(filedName);
//				System.out.println("-------------- len:"
//						+ res.getBytes(filedName).length);
			}


		} catch (SQLException ex) {
			ex.printStackTrace();
		} catch (NamingException ex) {
			ex.printStackTrace();
		} finally {
			try {
				conn.close();
			} catch (SQLException ex) {
				ex.printStackTrace();
			}
		}


	}


	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		String parm;
		String financeParm;
		String layerParm;
		synchronized (this) {
//			System.out.println("Servlet 调用");
/*
 *设置http响应报头!与设置状态码类似,必须在返回文件之前设置最常用的方法就是setHeader(String HeaderName, String HeaderValue) 还有两个设置日期和时间
 *的方法,setDateHeader(Sttring Heade, Long miliseconds) setIntHeader(String Header, Int HeaderValue),报头名对大小写不敏感
 *
 * 
 */


			resp.setContentType("image/jpeg");//设置返回的数据类型,JPEG图片的MIME类型是image/jpeg
			resp.setHeader("Pragma", "No-cache");//对一些旧版本的浏览器进行的设置不保存缓存
			resp.setHeader("Cache-Control", "no-cache");//功能与Pragma功能一样。
			resp.setDateHeader("Expires", 0);//规定内容的过期时间






			layerParm = req.getParameter("lawyerId");
			parm = req.getParameter("memberId");
			financeParm = req.getParameter("financeId");
			if (parm != null) {
				memberId = Integer.parseInt(parm);
				getImageByte();
			} else if (financeParm != null) {
//				System.out.println("qqqqqqqqqid是" + financeParm);
				memberId = Integer.parseInt(financeParm);
				getFinanceImageByte();
			} else if (layerParm!= null) {


				memberId = Integer.parseInt(layerParm);
				getImage("lawyer", "images");
			}

			resp.getOutputStream().write(imageByte, 0, imageByte.length);
			//因为图像数据存储的是byte[]类型,所以就不能使用getWrier()获得PrintWriter了。	
		}
	}
}

---------------Update For The Fourth Item ImageServlet Doubt-------------------------------------

A factory for connections to the physical data source that this DataSource object represents. An alternative to the DriverManager facility, a DataSource object is the preferred means of getting a connection. An object that implements the DataSource interface will typically be registered with a naming service based on the JavaTM Naming and Directory (JNDI) API.


A driver that is accessed via a DataSource object does not register itself with the DriverManager. Rather, a DataSource object is retrieved though a lookup operation and then used to create a Connection object. With a basic implementation, the connection obtained through a DataSource object is identical to a connection obtained through the DriverManager facility.

以上是对javax.sql.DataSource对DataSource的文档解释。看了之后就会明白多了。

自己用上大学后日益下降的英语水平斗胆将自己的翻译贴出来吧:

这个datasource对象代表了一个为连接到物理数据库源的工厂。是DriverManager的可替代的设施,DataSource对象是获取连接的首选方式,实现DataSource接口的对象通常会被注册进JNDI服务中。
一个通过DataSource对象访问的驱动不能通过DriverManager注册自己。然而,一个datasource通过查询被检索出来然后被用来创建一个Connection 对象。通过基本的实现,用DataSource获得的Connection和用DriverManager获得的Connection是一样的!



【注】理解这个说明是挺重要的,因为传统的建立Connection的方式在JDBC中是利用DriverManager(如果你学习了JDBC,并有了解的话)。

【警】在这看来需要理解JNDI的知识,过后会在博客里补充。的~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值