【原创】第一次做网站的总结

最近用一个月的时间做了一个网站--乐享,最初的动力是一个实践课,我们突发奇想,想到大家都懂点音乐,会点乐器,可以以此为主题,做一个乐器聚合类的系统,主要功能是发布、浏览交易、视频和资源信息,我们决定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 }

github: https://github.com/luckyboy703/Lexiang

 

posted @ 2015-06-17 11:10  M-zyh  阅读(1015)  评论(0编辑  收藏  举报