zoukankan      html  css  js  c++  java
  • 【原创】第一次做网站的总结

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

  • 相关阅读:
    C# Sleep延时方法
    浅谈模糊测试
    python time模块常用方法小结
    Markdown使用小结
    关于测试用例设计、评审及用例质量评估的思考
    关于评估软件产品质量的思考
    关于软件测试工程师进阶提升的思考
    关于软件测试中回归测试的思考
    测试技术的思考 ---- 读《微软的软件测试之道》有感系列
    vue-learning:22
  • 原文地址:https://www.cnblogs.com/zhangyunhao/p/4582685.html
Copyright © 2011-2022 走看看