面向对象程序设计期末项目总结

news2024/11/26 4:23:22

面向对象程序设计期末项目总结

开发前准备

  • Mysql
  • Navicat
  • TomCat
  • IDEA

一,配置项目环境

右键项目名,添加新模块
请添加图片描述

命名后右键新建的模块

请添加图片描述

选中Web模块

请添加图片描述

到此项目创建完毕,接下来是配置环境。

打开IDEA–>File找到Project Structure

请添加图片描述

添加所要用到的jar包

  • mysql-connector-j-8.0.31
  • servlet-api

请添加图片描述

二,编写服务端与客户端

要求:编写服务器端(端口为21000)与客户端,客户端发送4个整数给服务端,服务器端计算四个整数的平均值返回给客户端

右键src新建包名为exam

  1. 新建ExamServer类实现服务器端
public class ExamServer {

    public static void main(String args[]) {
        ServerSocket server = null;
        ServerThread thread;
        Socket you = null;
        while (true) {
            try {
                server = new ServerSocket(21000);
            } catch (IOException e1) {
                System.out.println("正在监听"); //ServerSocket对象不能重复创建
            }
            try {
                System.out.println(" 等待客户呼叫");
                you = server.accept();
                System.out.println("客户的地址:" + you.getInetAddress());
            } catch (IOException e) {
                System.out.println("正在等待客户");
            }
            if (you != null) {
                new ServerThread(you).start(); //为每个客户启动一个专门的线程
            }
        }
    }
}

class ServerThread extends Thread {

    Socket socket;
    DataOutputStream out = null;
    DataInputStream in = null;
    String s = null;

    ServerThread(Socket t) {
        socket = t;
        try {
            out = new DataOutputStream(socket.getOutputStream());
            in = new DataInputStream(socket.getInputStream());
        } catch (IOException e) {
        }
    }

    public void run() {
        while (true) {
            try {
                double num[]=new double[4];
                for (int i = 0; i < num.length; i++) {
                    double a = in.readDouble();//堵塞状态,除非读取到信息
                    System.out.println("接收到的数为:"+a);
                    num[i]=a;
                }
                double result = (num[0] + num[1] + num[2] + num[3])/4;
                System.out.println("四个整数的平均数为:"+result);
                out.writeDouble(result);
                for (int i = 0; i < num.length; i++) {
                    out.writeDouble(num[i]);
                }

            } catch (IOException e) {
                System.out.println("客户离开");
                e.printStackTrace();
                return;
            }
        }
    }
}
  1. 新建ExamClient类实现客户端:
public class ExamClient {

    public static void main(String args[]) {
        Scanner scanner = new Scanner(System.in);
        Socket mysocket = null;
        DataInputStream in = null;
        DataOutputStream out = null;
        Thread readData;
        Read read = null;
        try {
            mysocket = new Socket();
            read = new Read();
            readData = new Thread(read);
            System.out.print("输入服务器的IP:");
            String IP = scanner.nextLine();
            System.out.print("输入端口号:");
            int port = scanner.nextInt();
            if (mysocket.isConnected()) {
            } else {
                InetAddress address = InetAddress.getByName(IP);
                InetSocketAddress socketAddress = new InetSocketAddress(address, port);
                mysocket.connect(socketAddress);
                in = new DataInputStream(mysocket.getInputStream());
                out = new DataOutputStream(mysocket.getOutputStream());
                read.setDataInputStream(in);
                readData.start();
            }
        } catch (Exception e) {
            System.out.println("服务器已断开" + e);
        }
        System.out.print("输入四个整数(放弃请输入N):");
        while (scanner.hasNext()) {
            double a = 0;
            try {
                a = scanner.nextDouble();
            } catch (InputMismatchException exp) {
                System.exit(0);
            }
            try {
                out.writeDouble(a);
            } catch (Exception e) {
            }
        }
    }
}
class Read implements Runnable {
    DataInputStream in;
    public void setDataInputStream(DataInputStream in) {
        this.in = in;
    }
    public void run() {
        double result = 0;
        while(true) {
            try{ result = in.readDouble();
                double arr[] = new double[4];
                for (int i = 0; i < arr.length; i++) {
                    arr[i] = in.readDouble();
                }
                StringJoiner sj = new StringJoiner(",");
                for (int i = 0; i < arr.length; i++) {
                    sj.add(arr[i] + "");
                }
                String descp = sj.toString();
                System.out.println("计算四个整数的平均数为:"+result);
                System.out.print("输入四个整数(放弃请输入N):");

   
            }
            catch(IOException e) {
                System.out.println("与服务器已断开"+e);
                break;
            }
        }
    }
}

三,实现连接数据库

要求:

请添加图片描述

我们需要在本地创建名为studentdb的数据库

这里用的是Navicat

请添加图片描述

注意要给id选上自动递增。

在src下新建包名sdstudentapp.dal

  1. 新建DBUtil类

编写JDBC连接数据库。

public class DBUtil {

    private static String driver = "com.mysql.cj.jdbc.Driver";
    private static String URL = "jdbc:mysql://localhost:3306/studentdb?characterEncoding=gbk";
    private static Connection con = null;
    private static Statement smt = null;
    private static ResultSet rs = null;

    private static Connection createConnection() {
        try {
            
            Class.forName(driver);
            return DriverManager.getConnection(URL, "root", "123456");
        } catch (SQLException e) {
            System.out.println(e.getMessage());
            e.printStackTrace();
        } catch (java.lang.ClassNotFoundException e) {
            System.out.println("Can't load Driver");
        }
        return null;
    }

    public static int runUpdate(String sql) throws SQLException {
        int count = 0;
        if (con == null) {
            con = createConnection();
        }
        if (smt == null) {
            smt = con.createStatement();
        }

        count = smt.executeUpdate(sql);

        if (smt != null) {
            smt.close();
            smt = null;
        }
        if (con != null) {
            con.close();
            con = null;
        }
        return count;
    }

    
    public static ResultSet runQuery(String sql) throws SQLException {
        if (con == null) {
            con = createConnection();
        }
        if (smt == null) {
            smt = con.createStatement();
        }
        return smt.executeQuery(sql);
    }

    public static void realeaseAll() {
        if (rs != null) {
            try {
                rs.close();
                rs = null;
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (smt != null) {
            try {
                smt.close();
                smt = null;
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        if (con != null) {
            try {
                con.close();
                con = null;
            } catch (SQLException ex) {
                Logger.getLogger(DBUtil.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
    }

    public static void closeConnection(Connection conn) {
        System.out.println("...");
        try {
            if (conn != null) {
                conn.close();
                conn = null;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

注:mysql-connector-java 5以后的版本中(不包括5) 使用的都是com.mysql.cj.jdbc.Driver

在sdstudentapp.dal下新建包名Entity

新建Record类实现

public class Record {
     int id;
     double result;
     String operNum;
     String operName;
     String descp;

    public Record() {
    }

    public Record(int id, double result, String operNum, String operName, String descp) {
        this.id = id;
        this.result = result;
        this.operNum = operNum;
        this.operName = operName;
        this.descp = descp;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public double getResult() {
        return result;
    }

    public void setResult(double result) {
        this.result = result;
    }

    public String getOperNum() {
        return operNum;
    }

    public void setOperNum(String operNum) {
        this.operNum = operNum;
    }

    public String getOperName() {
        return operName;
    }

    public void setOperName(String operName) {
        this.operName = operName;
    }
    
    public String getDescp() {
        return descp;
    }

    public void setDescp(String descp) {
        this.descp = descp;
    }
  

    @Override
    public String toString() {
        return "Record{" + "id=" + id + ", result=" + result + ", operNum=" + operNum + ", operName=" + operName + ",descp=" + descp +'}';
    }
     
     
}

在sdstudent.dal下创建dao层,可以对Record类进行管理,例如添加,查询等操作

新建RecordDao接口

import java.util.List;
import sdstudentapp.dal.Entity.Record;


public interface RecordDao {
    public boolean addRecord(Record record);
     public List<Record> getAllRecord();
}

创建接口实现类

在sdstudent.dal下创建daoimpl层

新建RecordDaoImpl类主要用来实现RecordDao接口中提供的方法

public class RecordDaoImpl  implements RecordDao {

    @Override
    public boolean addRecord(Record record) {
          String insert = "insert into exam(result,operNum,operName,descp) "
                +"values('"+record.getResult()+"','"+record.getOperNum()+"','"+record.getOperName()+"','"+record.getDescp()+"')";
        //insert into exam(resule,operNum,operName) values (2,'222',zzz)
        try {
            DBUtil.runUpdate(insert);
            return true;
        } catch (SQLException ex) {
            Logger.getLogger(UserDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
      }

    @Override
    public List<Record> getAllRecord() {
        String select="select * from exam order by id desc";
        try {
            List<Record> records = new ArrayList<Record>();
            ResultSet rs=DBUtil.runQuery(select);
            while(rs.next())
            {
               Record record = new Record();
               record.setId(rs.getInt("id"));
               record.setResult(rs.getDouble("result"));
               record.setOperNum(rs.getString("operNum"));
               record.setOperName(rs.getString("operName"));
               record.setDescp(rs.getString("descp"));
               records.add(record);
            }
            DBUtil.realeaseAll();
            return records;
        } catch (SQLException ex) {
            Logger.getLogger(UserDaoImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null; //To change body of generated methods, choose Tools | Templates.
        
        }
    
    
}

完善ExamClient类,将数据添加到数据库中。

通过调用Record中的set,get方法创建Record类,再创建RecordDao来实现对数据库添加的操作。

class Read implements Runnable {
    DataInputStream in;
    public void setDataInputStream(DataInputStream in) {
        this.in = in;
    }
    public void run() {
        double result = 0;
        while(true) {
            try{ result = in.readDouble();
                double arr[] = new double[4];
                for (int i = 0; i < arr.length; i++) {
                    arr[i] = in.readDouble();
                }
                StringJoiner sj = new StringJoiner(",");
                for (int i = 0; i < arr.length; i++) {
                    sj.add(arr[i] + "");
                }
                String descp = sj.toString();
                System.out.println("计算四个整数的平均数为:"+result);
                System.out.print("输入四个整数(放弃请输入N):");

                Record record = new Record();
                record.setId(1);
                record.setResult(result);
                record.setOperNum("学号");
                record.setOperName("姓名");
                record.setDescp(descp);

                RecordDao recordDao = new RecordDaoImpl();
                boolean flag = recordDao.addRecord(record);
                if(flag == true){
                    System.out.println("插入成功");
                }else{
                    System.out.println("插入失败");
                }

            }
            catch(IOException e) {
                System.out.println("与服务器已断开"+e);
                break;
            }
        }
    }
}

四,编写Servlet

要求:
请添加图片描述

在src下创建包名为webapp

新建showResultServlet类

public class showResultServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        try (PrintWriter out = response.getWriter()) {
            /* TODO output your page here. You may use following sample code. */
            out.println("<!DOCTYPE html>");
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Servlet showResultServlet</title>");
            out.println("</head>");
            out.println("<body>");

            RecordDao recordDao=new RecordDaoImpl();
            List<Record> records=recordDao.getAllRecord();

            Record record=records.get(0);
            out.println("<h2>"+record.toString()+"</h2>");


            out.println("</body>");
            out.println("</html>");
        }
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

}

之后要对Servlet进行配置

进入web–>WEB-INF中打开web.xml

配置Servlet和Servlet-mapping

	<servlet>
        <servlet-name>showResultServlet</servlet-name>
        <servlet-class>webapp.showResultServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>showResultServlet</servlet-name>
        <url-pattern>/showResultServlet</url-pattern>
    </servlet-mapping>
    <session-config>
        <session-timeout>
            30
        </session-timeout>
    </session-config>

配置好之后需要对TomCat进行配置:
请添加图片描述

请添加图片描述

请添加图片描述

请添加图片描述

完成上面这几步之后就可以运行服务器端和用户端以及小猫咪了
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/89041.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pikachu(皮卡丘)靶场中SQL注入

Pikachu靶场中SQL注入1.Pikachu(皮卡丘)靶场中SQL注入1.1.数字型注入1.2.字符型注入1.3.搜索型注入1.4.xx型注入1.5.insert/update注入1.6.delete注入1.7.http头注入1.8.盲注(base on boolian)1.9.盲注(base on time)1.10.宽字节注入1.Pikachu(皮卡丘)靶场中SQL注入 若遇到不链…

基于java+springboot+mybatis+vue+mysql的冬奥会科普平台

项目介绍 基于SpringBoot框架的冬奥会科普平台利用网络沟通、计算机信息存储管理&#xff0c;有着与传统的方式所无法替代的优点&#xff0c;系统采用java语言开发&#xff0c;前端采用vue技术&#xff0c;数据库采用mysql进行数据存储。比如计算检索速度特别快、可靠性特别高…

大数据如何在制造业中进行应用?数据宝董事长汤寒林现身数字化年会讲了这个事

12月8日1670923102263472480日&#xff0c;2022中国数字化年会成功在线上举办&#xff01;本届年会以“向变而生”为主题&#xff0c;历时三天&#xff0c;特别打造了主论坛、高峰论坛与行业数智化论坛三大板块&#xff0c;60余位专家学者与来自各领域各行业数字化领军人物 通过…

前端基础(五)_CSS文本文字属性

CSS文本文字属性 1、文字属性 1.1、字号 font-size&#xff1a;38px; 浏览器默认16px; 1.2、字体 font-family: 如果字体名称包含空格&#xff0c;字体名称上加引号&#xff1b; 中文字体名称加引号&#xff1b; 多个字体名称作为一个回退系统来保存&#xff0c;如果第一个不…

什么才是写博客初心如何坚持

为何写机器人课程博客并一直坚持&#xff1f;&#xff08;2021&#xff09; 创新源自真心&#xff0c;“乱”创新的课程徒有其表&#xff0c;“不”创新的课程逐渐凋零。 个人觉得&#xff0c;课程教学创新宏观上的目标是让学生更好的认识自己并适应社会发展和变化&#xff1b…

停车场管理系统

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 主要用jsp,数据库用MySQL 分为前台用户和后台管理员 前台用户 主界面是一个区域内的两到三个停车场&#xff0c;然后 可…

virtualenv系列 (2) · 系统环境与虚拟环境

文章目录1. 怎样算是一套Python环境&#xff1f;2. 系统环境 VS 虚拟环境3. 虚拟环境最佳实践1. 怎样算是一套Python环境&#xff1f; 首先&#xff0c;我们得先弄清楚&#xff1a;怎样算是一个Python环境&#xff1f;然后再去区分系统环境和虚拟环境。简单地说&#xff0c;在…

[附源码]Python计算机毕业设计SSM基于web的家教管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

阿里5位高级架构师耗时两年共同研发《Redis入门手册》

在我们日常的开发中&#xff0c;无不都是使用数据库来进行数据的存储&#xff0c;由于一般的系统任务中通常不会存在高并发的情况&#xff0c;所以这样看起来并没有什么问题&#xff0c;可是一旦涉及大数据量的需求&#xff0c;比如一些商品抢购的情景&#xff0c;或者是主页访…

喜报!Coremail两大方案入选“2022年软件行业典型应用案例”

12月5日&#xff0c;由中国软件行业协会联合中软国际有限公司、江苏省软件行业协会主办的2022中国程序员节在江苏南京圆满落幕&#xff0c;本次活动聚焦当前我国对数字技术创新及应用发展的现实需求&#xff0c;以开源创新、软件根技术、平台工具等热点议题&#xff0c;探讨影响…

Spring Boot 配置文件 · properties 基本语法 · yml 基本语法 · yml 配置不同数据以及 null · yml 配置文件读取

一、配置文件作用二、配置文件的格式三、properties 配置文件说明3.1 properties 基本语法3.2 读取配置文件3.3 properties 缺点分析四、yml 配置文件说明4.1 yml 基本语法4.2 yml 与 properties 格式对比4.3 yml 配置不同数据类型以及 null4.4 yml 配置读取4.4.1 读取配置文件…

Win11十二月系统更新了什么内容?

微软今天发布了12月最新的累积更新补丁&#xff0c;根据Microsoft 支持页面&#xff0c;build 22621.963 现在会在用户 OneDrive 上的存储空间不足时在“设置”应用程序中警告用户&#xff0c;将 Windows Spotlight 与主题设置相结合&#xff0c;修复任务管理器应用程序的界面问…

SSM垃圾分类网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 1,系统&#xff1a;Vindows10 2.软件&#xff1a;IDEA.SQLyog 3.数据库环境&#xff1a;ySQL 4.开源框架&#xff1a;sp…

毕业设计-基于SpringBoot幼儿园管理系统

环境&#xff1a;开发工具&#xff1a;idea&#xff0c;数据库&#xff1a;MySQL5.7 jdk1.8 架构&#xff1a;SpringBoot&#xff0c;前端HTML 主要功能 管理员&#xff1a; 用户管理&#xff08;编辑用户、删除用户、添加用户、查询指定用户&#xff09; 角色管理&#xff08;…

软件测试进阶——测试划分

文章目录按照测试对象划分界面测试可靠性测试容错性测试文档测试兼容性测试易用性测试安装和卸载测试安全测试性能测试按照是否查看代码黑盒测试白盒测试灰盒测试按照开发阶段划分单元测试集成测试系统测试回归测试冒烟测试验收测试按照实施组织划分α测试β测试按照是否运行划…

数据可视化常用工具推荐

数据可视化是将数据分析的结果以图形、表格等形式展示出来&#xff0c;这样能我们更加清晰、明了的理解分析结果、判断数据走势等&#xff0c;让没有进行过数据分析的人也能清楚的了解数据中所含有的规律、趋势等。下面小编将向大家介绍几种常用的数据可视化工具&#xff0c;分…

计算机毕业设计php+vue基于微信小程序的高校新生报到管理小程序

项目介绍 随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理程序应运而生,各行各业相继进入信息管理时代,高校新生报到管理小程序就是信息时代变革中的产物之一。 任何程序都要…

外汇天眼:爆雷跑路!DingHui索要高额佣金,结果客户一分钱没拿到!

我们都知道&#xff0c;外汇交易佣金是外汇平台杠杆进入中国市场时的产物&#xff0c;也可以将其简单的理解为是在自己原本的手续费之外&#xff0c;额外增加的一些交易成本。 不过随着外汇市场的发展&#xff0c;在外汇交易平台进行交易也是越来越正规化&#xff0c;现如今正…

16-luogu-P1012-[NOIP1998 提高组] 拼数

文章目录[NOIP1998 提高组] 拼数题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1样例 #2样例输入 #2样例输出 #2提示大神代码分析总结[NOIP1998 提高组] 拼数 题目描述 设有 nnn 个正整数 a1…ana_1 \dots a_na1​…an​&#xff0c;将它们联接成一排&#xff0c;相邻…

shell语法总结二(持续补充)

文章目录一、函数1、函数的定义格式2、案例13、案例2二、函数参数三、输入/输出重定向1、标准输入输出2、输出重定向&#xff1a;2.1、语法如下所示:2.2、案例&#xff1a;输出重定向会覆盖文件内容&#xff0c;请看下面的例子&#xff1a;2.3、如果不希望文件内容被覆盖&#…