JSP存储二进制文件和分页技术
1. 文件存储到数据库
将图像以二进制数据格式存储到数据库中,创建bindata的数据表,添加filename(char),binfile(longBlob),当然第一个位置id自动生成,然后创建一个selectImage.jsp页面: <%@ page language=\"java\" import=\"java.util.*\" pageEncoding=\"gb2312\"%> <%
String path = request.getContextPath();
String basePath = request.getScheme()+\"://\"+request.getServerName()+\":\"+request.getServerPort()+path+\"/\"; %>
\">
上传图片
然后创建一个selectImage.jsp页面,提交图片信息
<%@ page language=\"java\" import=\"java.util.*\" pageEncoding=\"gb2312\"%>
<%@page import=\"java.sql.*\" %> <%@page import=\"java.text.*\" %> <%@page import=\"java.io.*\" %> <%@page import=\"java.nio.*\" %> <%
String path = request.getContextPath();
String basePath = request.getScheme()+\"://\"+request.getServerName()+\":\"+request.getServerPort()+path+\"/\"; %>
\">
存储图片
<%
Class.forName(\"com.mysql.jdbc.Driver\").newInstance(); //加载JDBC驱动程序
String url=\"jdbc:mysql://localhost/firstjsp\"; //firstjsp为数据库的名称
String user=\"root\"; String password=\"lfw123\";
String filename=request.getParameter(\"image\");
filename=\"C:\\\\Documents and Settings\\\\Administrator\\\\桌面\\\\12444033Z-0.jpg\";
//现在的浏览器上传过来的image就只有名字了,没有绝对路径了!!! File file=new File(filename); //获取表单传过来的图片的url try{
out.println(\"这里对吧?\"+filename+\"
\"); //打开文件
FileInputStream fin=new FileInputStream(file); //建一个缓冲保存数据
ByteBuffer nbf=ByteBuffer.allocate((int)file.length()); byte[] array=new byte[1024]; int offset=0, len=0; //读取数据
while((len=fin.read(array))>0 ){
if(len!=1024) nbf.put(array,0,len); else nbf.put(array); offset+=len; }
//新建一个数组保存要写的内容 byte[] content=nbf.array(); //创建数据库连接
out.println(\"content is \"+content+\"
\");
Connection conn=DriverManager.getConnection(url, user, password);
//保存数据
Statement stmt=conn.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
String sqlstr=\"select * from bindata where filename='02'\"; //查找名字为02的文件
ResultSet rs=stmt.executeQuery(sqlstr); if(rs.next()){
rs.updateBytes(3,content); rs.updateRow(); }else{
//如果没有,添加,已经有更新,注意,第一个位置是自动编号,所以在2,3位置
rs.moveToInsertRow(); rs.updateString(2,\"02\"); rs.updateBytes(3,content); rs.insertRow(); }
rs.close(); fin.close();
out.println(\"恭喜,已经将新的记录成功添加到数据库中!\"); }catch(FileNotFoundException e){ e.printStackTrace(); out.println(\"没找到图片?\"); }catch(IOException e){ e.printStackTrace(); out.println(\"没输入?\"); } %>
最后创建一个showImage.jsp页面,读取图片:
<%@ page language=\"java\" import=\"java.util.*\" pageEncoding=\"gb2312\"%>
<%@page import=\"java.sql.*\" %> <%@page import=\"java.text.*\" %> <%@page import=\"java.io.*\" %> <%
String path = request.getContextPath();
String basePath = request.getScheme()+\"://\"+request.getServerName()+\":\"+request.getServerPort()+path+\"/\"; %>
\">
显示图片
<%
Class.forName(\"com.mysql.jdbc.Driver\"); String url=\"jdbc:mysql://localhost/firstjsp\"; String user=\"root\"; String password=\"lfw123\";
Connection conn=DriverManager.getConnection(url,user,password);
String sql=\"select binfile from bindata where filename='02'\"; Statement stmt=null; ResultSet rs=null; try{
stmt=conn.createStatement(); rs=stmt.executeQuery(sql); }catch(SQLException e){ out.println(\"连接OK?\"); } try{
while(rs.next()){
response.setContentType(\"image/jpg\");
ServletOutputStream sout=response.getOutputStream(); InputStream in=rs.getBinaryStream(1); //获取二进制输入流 byte[] b=new byte[0x7a120]; //创建byte数组用作缓冲 for(int i=in.read(b);i!=-1;){ sout.write(b); //写入页面 in.read(b); //读取数据 }
sout.flush(); sout.close(); }
}catch(Exception e){ out.println(e); } %> 截图:
(long1 vs longpo 转载请注明出处:http://blog.163.com/lfw2565295@126)
(long1 vs longpo 转载请注明出处:http://blog.163.com/lfw2565295@126)
声音,视频也可以二进制数据格式存储到数据库中,方法类似,用到标签等,但这些技术但只是一般的方法,以后能学到更好的
(long1 vs longpo 转载请注明出处:http://blog.163.com/lfw2565295@126)
2. 分页技术
使用游标定位,丢弃不属于页面的数据,使用缓存结果集,一次查询所有数据,使用数据库提供的定位集的SQL语句,返回特定行的数据,使用JavaBean实现, 建立bean包,
然后写个splitPage.java:
package bean; import java.sql.*; import java.util.*; public class splitPage { //定义数据库连接对象和结果集对象 private Connection con=null; private Statement stmt=null; private ResultSet rs=null;
private ResultSetMetaData rsmd=null; //SQL查询语句
private String sqlstr; //总记录数目
private int rowCount=0; //所分页的逻辑页数
private int pageCount=0; //每页显示的记录数目 private int pageSize=0; //设置参数值
public void setCon(Connection con){ this.con=con; if(this.con==null){
System.out.println(\"Failure to get a connection!\"); }else{
System.out.println(\"Success to get a connection!\"); } }
//初始化,获取数据表中的信息
public void initialize(String sql,int pageSize,int ipage){ int irows=pageSize*(ipage-1);
sqlstr=sql;
this.pageSize=pageSize; try{
stmt=this.con.createStatement(); rs=stmt.executeQuery(this.sqlstr); if(rs!=null){ rs.last();
this.rowCount=rs.getRow(); rs.first();
this.pageCount=(this.rowCount-1)/this.pageSize+1; }
this.sqlstr=sql+\" limit \"+irows+\+pageSize; stmt=this.con.createStatement(); rs=stmt.executeQuery(this.sqlstr); rsmd=rs.getMetaData(); }catch(SQLException e){
System.out.println(e.toString()); } }
//将显示结果存到VECTOR集合类中 public Vector getPage(){ Vector vData=new Vector(); try{
if(rs!=null){ while(rs.next()){
String[] sData=new String[6];
for(int j=0; jvData.addElement(sData); } }rs.close(); stmt.close();
}catch(SQLException e){
System.out.println(e.toString()); }
return vData; }
//获得页面总数
public int getPageCount(){ return this.pageCount; }
//获取数据表中记录总数 public int getRowCount(){ return this.rowCount; } }
建立words数据表,有自动增长的id,有varchar(100)的wtitle,text的wcontent,
datetime的wtime,int的uid,不能为空
words.jsp:
<%@ page language=\"java\" import=\"java.util.*\" pageEncoding=\"gb2312\"%>
<%@page import=\"java.sql.*\" %> <%@page import=\"java.io.*\" %> <%@page import=\"bean.*\" %>
<%String path = request.getContextPath();
String basePath = request.getScheme()+\"://\"+request.getServerName()+\":\"+request.getServerPort()+path+\"/\"; %>
<%
//每页显示的记录数 int pageSize=3; String sql=\"\"; //当前页
int showPage=1; //数据库用户名,密码
String userName=\"root\"; String password=\"lfw123\";
//数据库的url包括连接数据库所用的编码格式
String url=\"jdbc:mysql://localhost:3306/firstjsp?useUnicode=true&characterEncoding=gb2312\"; //定义连接对象
Connection conn=null; %> <% try{
//加载驱动程序
Class.forName(\"com.mysql.jdbc.Driver\"); //获得数据库的连接对象
conn=DriverManager.getConnection(url,userName,password); }
catch(SQLException e){ //打印出异常信息
out.println(e.toString()); }
//给pages中参数con赋值 pages.setCon(conn);
sql=\"select * from words order by Id\"; //查询数据表,获得查询结果 String strPage=null; //获取跳转到的目的页面
strPage=request.getParameter(\"showPage\"); if(strPage==null){ showPage=1; }else{ try{
showPage=Integer.parseInt(strPage); }catch(NumberFormatException e){ showPage=1; } }
pages.initialize(sql, pageSize, showPage); //获取要显示的数据集合
Vector vData=pages.getPage(); %>
\">
分页显示
留言簿
| 编号 | 留言标题 | 留言时间 |
<%for(int i=0; iString[] sData=(String[])vData.get(i); %> | <%=sData[0]%> | <%=sData[1] %> | <% //显示留言时间 String wtime=sData[3]; if(wtime.indexOf(\".\")>-1){ wtime=wtime.substring(0,wtime.indexOf(\".\")); } out.println(wtime); %> |
<% } %>
<%
//关闭数据库连接 conn.close(); %>
效果: