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的知识,过后会在博客里补充。的~