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

来源:互联网 发布:java api chm 中文 编辑:程序博客网 时间:2024/05/22 00:35
//需要相关的知识补充,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;}@Overridepublic 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();}}}@Overrideprotected 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/jpegresp.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的知识,过后会在博客里补充。的~

0 0
原创粉丝点击