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

  • 相关阅读:
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 88怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 81.0怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 40怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 24.0怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下伺服驱动器报错 21.0怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下驱动器试运行提示过速度保护怎么办
    倍福TwinCAT(贝福Beckhoff)基础教程 松下驱动器如何执行绝对值清零
    倍福TwinCAT(贝福Beckhoff)基础教程 松下绝对值驱动器如何做初始化设置
    倍福TwinCAT(贝福Beckhoff)基础教程 松下官方软件开启报错伺服未就绪怎么办
    JAVA Eclipse 启动 Eclipse 弹出“Failed to load the JNI shared library jvm_dll”怎么办
  • 原文地址:https://www.cnblogs.com/zhangyunhao/p/4582685.html
Copyright © 2011-2022 走看看