标签:
最近用一个月的时间做了一个网站--乐享,最初的动力是一个实践课,我们突发奇想,想到大家都懂点音乐,会点乐器,可以以此为主题,做一个乐器聚合类的系统,主要功能是发布、浏览交易、视频和资源、,我们决定Web端+手机端同时做,2个人负责web,2个人负责app,我们都没有基础,从0开始。
我负责的是网站的后端,主要用到的是jsp和java,数据库使用的是mysql,使用的工具有myeclipse,MySQL workbench,tomcat,notepad++(多文件查找实在太方便,改代码必备),起初做的工作是部署服务器、配置开发环境,建立数据库,大概用了一天时间,之后就是学习jsp知识,去图书馆借了两本书,感觉这两本书借的太对了,让我学的很快,并且很对路,书名是《jsp程序开发实用教程》和《jsp编程教程》,里面的实例带给我很多思路,谢谢这两本书的作者!以下是数据库的核心表:
jsp学了几天,感觉也不知道学的咋样了,后来还是决定边做边学,思路:既然是后端,肯定要操作数据库。so先连接数据库再说,这就是3、4天时间,最后把Mysql的连接类写出来了:
这个类的编写借鉴了好多网上的好心人的代码,最后还是回馈给网络,帮助其他更多人,包括我写的其他代码,都将一一贴出来。为了帖子看起来方便,一并放在最后。
然后就可以在这个基础上做一些操作了,首先是登录、注册功能,这个主要用到了数据库的user表,由于一开始并不会用javabean,所以写的是代码重用性很差,就是所谓的写死了,不过功能实现了,还是很happy,从这里也学到了网页之间传递数据的方法:一种是使用jsp:param,另一种是form表单传递,用request.getParameter("变量名")读取。登录注册大概用了4、5天,真的是万事开头难。
后边我看到书上的个人博客网站的文章模块的架构,开始了解到javabean的重要性,所以开始写bean,dao,写起来很快,我们的三个核心功能点(视频、资源、交易)有很多相似之处,大概3、4天就写完了,一共31个java文件:
不过这些不是一开始就写的很完美的,后期经过了很多次的修改,才实现想要的功能,后期让有经验的同学看了一下,说我的命名和分类好奇怪,我才了解到命名规范,com或org开头,中间是公司或项目名称,最后是包的类型。
这些写好后,前端页面写的也差不多了,就可以写一些响应网站前端请求的代码,按理说应该用servlet写,由于当时以实现为主,没有想规范的问题,加之第一次写,对自己期望较低,因此全部写到jsp文件中了。
功能要一个一个实现,首先是数据库数据的显示,先要将html文件改为jsp文件,这时出现乱码,前面的乱码问题也忘说了,一块写到这儿了,凡是有存储和显示,都要涉及编码问题,因此IDE的显示,浏览器的显示,数据库的存储,都有一个编码方式,为了三者能正常互通数据,一定要统一编码方式,如果有乱码,一定是没有统一编码,我都将编码方式设为UTF-8,注意:MySQL中有多个UTF-8,一定要选择utf-8_unicode_ci。jsp文件中加入<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>,这条语句就解决了IDE和浏览器的显示乱码问题。
数据库的显示其实比较简单,按条件调用数据库查询语句select * from table where condition,返回一个List,再将List显示出来即可。
之后遇到一连串问题,怎么在登录期间保存登陆者的信息,怎么判断用户是否登录,等等,其实是一个问题,了解到session后,恍然大悟,这个问题变得很简单了,用的jsp:usebean语句:<jsp:useBean id="user" class="com.lexiang.entity.UserBean" scope="session"/>,在登录期间,存储一个UserBean,里面包括了用户的各种信息,存取很方便。
接下来是发布问题,纯文本信息的发布是不难的,用form表单就可以 ,和注册无异,但是还要上传文件,所以开始查找上传文件的jar包,有两个可以用:commons-fileupload和jspSmartUpload,当时没有考虑太多,随便选了后边那个,后来才知道,这个不如前者好用,其实也无所谓,不涉及大文件上传。文件上传也是用了form表单,一开始想上传文件和发布文字只用一个提交按钮,没有调试通,所以只能这样:
文件上传到文件夹,数据库只存一条链接,后来发觉到:数据库只存文件名就可以了,将路径写到basePath中,可以更方便移植。
视频上传时,遇到缩略图和读取视频信息的问题,我使用了FFmpeg,将截图存到服务器文件夹,在video数据库中存储截图路径。感觉速度还可以。代码较少,直接贴出来:
Toimage.java
package com.lexiang.service; import java.io.IOException; public class Toimage { public static void main(String[] args){ //视频文件 String videoRealPath=args[0]; //截图的路径(输出路径) String imageRealPath=args[1]; try{ //调用批处理文件 Runtime.getRuntime().exec("cmd /c start G:\\ffmpeg\\ffmpeg.bat \""+ videoRealPath + "\" \"" + imageRealPath + "\""); }catch(IOException e){ //TODOAuto-generatedcatchblock e.printStackTrace(); } } }
ffmpeg.bat
start G:/ffmpeg/bin/ffmpeg.exe -ss 5 -i %1 -vframes 1 -r 1 -ac 1 -ab 2 -s 155*114 -f image2 %2 exit
还有一些关于视频的小细节,点赞,收藏,评论,这些也挺简单的,实现代码都写在dao中,在jsp中调用函数就可以,未解决的问题是多级评论,建数据库时没有考虑全,所以只能一级评论,就是不能回复评论。
代码区:
由于视频、资源和交易是类似的,只放上video相关的:
VideoBean.java
package com.lexiang.entity; /** * 处理视频信息的类 * @author zhangyunhao */ public class VideoBean { private int id = -1; private String url = ""; private String image = "/Lexiang/upload/video/default.jpg"; private String title = ""; private String send_time = ""; private String describe = ""; private int like_count = 0; private String length = ""; private String username = ""; private int uid = -1; public int getId(){ return id; } public boolean setId(int id) { if(id!=-1){ this.id = id; return true; } else return false; } public String getUrl(){ return url; } public boolean setUrl(String url) { if(!url.isEmpty()){ this.url = url; return true; } else return false; } public String getImage(){ return image; } public boolean setImage(String img) { if(!img.isEmpty()){ image = img; return true; } else return false; } public String getTitle(){ return title; } public boolean setTitle(String title) { if(!title.isEmpty()){ this.title = title; return true; } else return false; } public String getSdtime(){ return send_time; } public boolean setSdtime(String sdt) { if(!sdt.isEmpty()){ send_time = sdt; return true; } else return false; } public String getDescribe(){ return describe; } public boolean setDescribe(String des) { if(!des.isEmpty()){ describe = des; return true; } else return false; } public int getCount(){ return like_count; } public boolean setCount(int cnt) { if(cnt!=-1){ like_count = cnt; return true; } else return false; } public String getLength(){ return length; } public boolean setLength(String len) { if(!len.isEmpty()){ length = len; return true; } else return false; } public String getUsername(){ return username; } public boolean setUsername(String uname) { if(!uname.isEmpty()){ username = uname; return true; } else return false; } public int getUid(){ return uid; } public boolean setUid(int uid) { if(uid!=-1){ this.uid = uid; return true; } else return false; } }
VideoDao.java
1 package com.lexiang.dao; 2 3 /** 4 * 与数据库video表连接的类,处理视频的增删改等请求,以及查询视频 5 * @author zhangyunhao 6 */ 7 8 import java.sql.*; 9 import java.util.*; 10 import com.lexiang.entity.VideoBean; 11 import com.lexiang.sql.SQL; 12 13 public class VideoDao { 14 private SQL db = new SQL("my_project"); 15 private VideoBean video = null; 16 17 public VideoDao() throws Exception { 18 // TODO Auto-generated constructor stub 19 } 20 21 public boolean operationVideo(String oper, VideoBean single) throws Exception { 22 //生成SQL语句 23 String sql = null; 24 if(oper.equals("add")) //添加视频z 25 sql = "insert into video values(0,‘"+single.getUrl()+"‘,‘"+single.getImage()+"‘,‘"+single.getTitle()+"‘,null,‘"+single.getDescribe()+"‘,‘"+single.getCount()+"‘,‘"+single.getLength()+"‘,‘"+single.getUsername()+"‘,"+single.getUid()+")"; 26 if(oper.equals("modify")) //修改视频 27 sql = "update video set url=‘"+single.getUrl()+"‘,describe=‘"+single.getDescribe()+"‘ where id="+single.getId(); 28 if(oper.equals("delete")) //删除视频 29 { 30 db.executeUpdate("delete from video_has_video_type where video_id ="+single.getId()); 31 sql = "delete from video where id="+single.getId(); 32 } 33 if(oper.equals("like")) //点赞 34 sql = "update video set like_count=(like_count+0.5) where title=‘"+single.getTitle()+"‘"; 35 boolean flag = db.executeUpdate(sql); 36 return flag; 37 } 38 39 @SuppressWarnings({ "rawtypes", "unchecked" }) 40 public List<VideoBean> queryVideo(int type_id, String type, int number) throws Exception{ //type为查询类型: all or 其他(前五项) 41 List videolist = new ArrayList(); 42 String sql = ""; 43 if(type_id == 0) //最新视频 44 sql = "select * from video order by send_time DESC limit 0,"+number; 45 else 46 if (type_id == -1 ) //最热视频 47 sql = "select * from video order by like_count DESC limit 0,"+number; 48 else 49 if (type_id == -2) //最长视频 50 sql = "select * from video order by length DESC limit 0,"+number; 51 else 52 if (type_id == -3) //我的视频 53 sql = "select * from video where user_name=‘"+type+"‘ order by send_time DESC limit 0,"+number; 54 else 55 if (type_id == -4) //按题目搜索 56 sql = "select * from video where title=‘"+type+"‘"; 57 else 58 if(type==null||type.equals("")||!type.equals("all")) //按类型查询,默认按发布时间排序,返回前五项 59 sql = "select * from video join video_has_video_type on video.id=video_has_video_type.video_id where type_id = "+type_id+" order by send_time DESC limit 0,"+number; 60 else //按类型查询,默认按发布时间排序,返回所有项 61 sql = "select * from video join video_has_video_type on video.id=video_has_video_type.video_id where type_id=" + type_id + " order by send_time DESC"; 62 ResultSet rs = null; 63 rs = db.executeQuery(sql); 64 if(rs!=null){ 65 try{ 66 while(rs.next()){ 67 video = new VideoBean(); 68 video.setId(rs.getInt("id")); 69 video.setUrl(rs.getString("url")); 70 video.setImage(rs.getString("image")); 71 video.setTitle(rs.getString("title")); 72 video.setSdtime(rs.getTimestamp("send_time").toString()); 73 video.setDescribe(rs.getString("describe")); 74 video.setCount(rs.getInt("like_count")); 75 video.setLength(rs.getTime("length").toString()); 76 video.setUsername(rs.getString("user_name")); 77 video.setUid(rs.getInt("user_id")); 78 79 videolist.add(video); 80 } 81 }catch (SQLException e){ 82 e.printStackTrace(); 83 }finally{ 84 try{ 85 rs.close(); 86 }catch(SQLException e){ 87 e.printStackTrace(); 88 } 89 db.close(); 90 } 91 } 92 return videolist; 93 } 94 }
sql.java
1 package com.lexiang.sql; 2 3 import java.sql.*; 4 import java.io.*; 5 6 /** 7 * 处理数据库的连接和访问 8 * @author zhangyunhao 9 * @version 1.0 10 */ 11 public class SQL{ 12 13 private Connection conn = null; 14 private Statement stmt = null; 15 private PreparedStatement prepstmt = null; 16 private String user = "root"; 17 private String password = "1084271781"; 18 private String dburl = "jdbc:mysql://localhost:3306/"; 19 private String dbdriver = "com.mysql.jdbc.Driver"; 20 private String dbname = null; 21 private String other = "?autoReconnect=true&characterEncoding=utf8"; 22 23 /** 24 * 构造数据库的连接和访问类 25 */ 26 public SQL(String value) throws Exception { 27 dbname = value; 28 Class.forName(dbdriver); 29 conn = DriverManager.getConnection(dburl+dbname+other,user,password); 30 stmt = conn.createStatement(); 31 } 32 public SQL(String value,String sql) throws Exception { 33 dbname = value; 34 Class.forName(dbdriver); 35 conn = DriverManager.getConnection(dburl+dbname,user,password); 36 this.prepareStatement(sql); 37 } 38 39 /** 40 * 返回连接 41 * @return Connection 连接 42 */ 43 public Connection getConnection() { 44 return conn; 45 } 46 /** 47 * PreparedStatement 48 * @return sql 预设SQL语句 49 */ 50 public void prepareStatement(String sql) throws SQLException { 51 prepstmt = conn.prepareStatement(sql); 52 } 53 /** 54 * 设置对应值 55 * @param index 参数索引 56 * @param value 对应值 57 */ 58 public void setString(int index,String value) throws SQLException { 59 prepstmt.setString(index,value); 60 } 61 public void setInt(int index,int value) throws SQLException { 62 prepstmt.setInt(index,value); 63 } 64 public void setBoolean(int index,boolean value) throws SQLException { 65 prepstmt.setBoolean(index,value); 66 } 67 public void setDate(int index,Date value) throws SQLException { 68 prepstmt.setDate(index,value); 69 } 70 public void setLong(int index,long value) throws SQLException { 71 prepstmt.setLong(index,value); 72 } 73 public void setFloat(int index,float value) throws SQLException { 74 prepstmt.setFloat(index,value); 75 } 76 //File file = new File("test/data.txt"); 77 //int fileLength = file.length(); 78 //InputStream fin = new java.io.FileInputStream(file); 79 //mysql.setBinaryStream(5,fin,fileLength); 80 public void setBinaryStream(int index,InputStream in,int length) throws SQLException { 81 prepstmt.setBinaryStream(index,in,length); 82 } 83 84 public void clearParameters()throws SQLException 85 { 86 prepstmt.clearParameters(); 87 } 88 /** 89 * 返回预设状态 90 */ 91 public PreparedStatement getPreparedStatement() { 92 return prepstmt; 93 } 94 /** 95 * 返回状态 96 * @return Statement 状态 97 */ 98 public Statement getStatement() { 99 return stmt; 100 } 101 /** 102 * 执行SQL语句返回字段集 103 * @param sql SQL语句 104 * @return ResultSet 字段集 105 */ 106 public ResultSet executeQuery(String sql) throws SQLException { 107 if (stmt != null) { 108 return stmt.executeQuery(sql); 109 } 110 else return null; 111 } 112 public ResultSet executeQuery() throws SQLException { 113 if (prepstmt != null) { 114 return prepstmt.executeQuery(); 115 } 116 else return null; 117 } 118 /** 119 * 执行SQL语句 120 * @param sql SQL语句 121 * @return 122 */ 123 public boolean executeUpdate(String sql) throws SQLException { 124 if (stmt != null) 125 { 126 stmt.executeUpdate(sql); 127 return true; 128 } 129 else return false; 130 } 131 public boolean executeUpdate() throws SQLException { 132 if (prepstmt != null) 133 { 134 prepstmt.executeUpdate(); 135 return true; 136 } 137 else return false; 138 } 139 140 /** 141 * 关闭连接 142 */ 143 public void close() throws Exception { 144 if (stmt != null) { 145 stmt.close(); 146 stmt = null; 147 } 148 if (prepstmt != null) { 149 prepstmt.close(); 150 prepstmt = null; 151 } 152 conn.close(); 153 conn = null; 154 } 155 }
MyEclipse工程文件下载地址:Lexiang
标签:
原文地址:http://www.cnblogs.com/zhangyunhao/p/4582685.html