第二次作业
一、实验目的
1.掌握软件开发的基本流程
2.掌握常用的软件开发方式和工具。
二、实验内容
1.设计一个包含登录界面的计算器软件,该软件可以实现第一次作业中的全部功能,同时可以保存用户的历史计算记录(保存数据最好使用数据库)。
三、实验要求
1.完成软件的UI设计、使用Visio设计软件中所涉及的所有流程图。
2.选择合适的集成开发环境和工具完成计算器软件的开发
3.将开发好软件进行测试并截图
四、实验环境
1.使用Microsoft Visio作为绘图工具
2.使用Java语言与IntelliJ IDEA Community Edition作开发工具
3.使用MySQL数据库储存数据
4.建立JavaWeb项目其采用Servlet容器作为服务器端运行环境如tomcat,Servlet容器负责加载和执行Servlet,处理HTTP请求和响应。

四、登录流程图

五、功能实现
1.登录界面

.jsp文件代码
<%-- Created by IntelliJ IDEA. User: 过路风景 Date: 2023/12/3 Time: 18:31 To change this template use File | Settings | File Templates. --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>个人登陆</title> <style> body{ background-image:url("a.jpg"); } #dakuangjia { margin: 50px ; margin-top: 200px; margin-left: 120px; padding: 30px 70px; width: 400px; height: 300px; background-color: rgba(52, 52, 59, 0.64); text-align: center; } #dakuangjia h1 { margin-left: 16px; color: steelblue; } #dakuangjia .inputBox { margin-top: 30px; } #dakuangjia .inputBox .inputText { color:snow; margin-top: 20px; } #dakuangjia .inputBox .inputText input{ width: 120px; height:20px; margin-left: 1px; } #dakuangjia h2 { margin-left: 90px; font-size: 12px; color: steelblue; } #dakuangjia .inputBox .inputButton1{ width: 90px; height: 40px; margin-top: 10px; margin-left: 6px; border-radius: 80px; font-size: 20px; background-color: rgb(128, 128, 128); } #dakuangjia .inputBox .inputButton2{ width: 90px; height: 40px; margin-top: 10px; margin-left: 8px; border-radius: 80px; font-size: 20px; background-color: rgb(128, 128, 128); } </style> </head> <body> <form action="LoginServlet" method="post"> <div id="dakuangjia"> <h1>User LOGIN</h1> <div class="inputBox"> <div class="inputText"> 用户: <input type="text" placeholder="username"> </div> <div class="inputText"> 密码: <input type="password" placeholder="password"> </div> <h2>忘记密码?</h2> <input type="button" value="登录" class="inputButton1"> <input type="button" value="注册" class="inputButton2"> </div> </div> </form> </body> </html>
2.连接数据库
package Model; import com.mysql.cj.jdbc.Driver; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class lianjie { public static void main(String[] args) throws SQLException { Driver driver = new Driver(); String url = "jdbc:mysql://localhost:3308/登录表"; Properties properties =new Properties(); properties.setProperty("user","root"); properties.setProperty("password","123456"); Connection connect = driver.connect(url,properties); System.out.println(connect); String sql = "insert into login values (12,'da','688862')"; Statement statement = connect.createStatement(); int cj = statement.executeUpdate(sql); System.out.println(cj>0?"成功":"失败"); } public Connection getcon() { return null; } }


3.前后端交互代码
package Controller; import Model.User; import Model.fanhuishu; import Model.lianjie; import java.io.IOException; import java.sql.Connection; public class LoginServlet extends javax.servlet.http.HttpServlet { protected void doPost(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws IOException { //创建两个变量暂存前端传来的数据 String username = request.getParameter("username"); String password = request.getParameter("password"); //创建进行数据库连接对象 lianjie db = new lianjie(); //使用User对象储存前后端传输的姓名,密码数据 User user = new User(username,password); //创建数据库操作对象,根据不同服务进行不同数据库操作 fanhuishu dao = new fanhuishu(); //进行数据库连接 Connection con = db.getcon(); try { if(dao.login(con,user) != null) { //进行登陆功能的数据库操作,传入数据库连接和前端数据对象 response.sendRedirect("ok.jsp");//登陆成功之后跳转的页面 ok.jsp中的内容为登陆成功!! } } catch (Exception e) { throw new RuntimeException(e); } } protected void doGet(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws IOException { this.doPost(request,response); } }
package Model; public class User { //创建成员变量,暂存前后端传输的数据 private String username; private String password; //构造函数 public User(){} //重写构造函数 public User(String username,String password){ this.username = username; this.password = password; } //get、set方法保证数据传输的安全性 public void setUsername(String username){ this.username = username; } public void setPassword(String password){ this.password = password; } public String getUsername(){ return username; } public String getPassword(){ return password; } } package Model;
import java.sql.Connection; import java.sql.ResultSet; import java.sql.PreparedStatement; public class fanhuishu { public User login(Connection con,User user) throws Exception { //创建结果对象,存储最终数据 User resultUser = null; //定义执行的数据库语句 String sql = "select * from login where username = ? and password = ?"; //处理sql语句,类似于让sql语句准备好 PreparedStatement dl = con.prepareStatement(sql); //设置sql语句中的参数 dl.setString(1,user.getUsername()); dl.setString(2,user.getPassword()); //执行sql语句 ResultSet rs = dl.executeQuery(); if(rs.next()){ //如果返回结果,则进行以下操作,如果没有返回结果,则结果集resultUser保持为null resultUser = new User(); resultUser.setUsername(rs.getString("username")); resultUser.setPassword(rs.getString("password")); } //返回结果,servlet根据resultUser是否为null值,进行相应的操作 return resultUser; } }
4.计算器实现
import javax.swing.*; public class calculator { public static void main(String[] args) { // 创建一个 JFrame 对象作为窗口容器 JFrame frame = new JFrame("Calculator"); // 设置 JFrame 对象的大小和关闭操作 frame.setSize(300, 300); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 创建一个 CalculatorPanel 对象 CalculatorPanel panel = new CalculatorPanel(); // 将 CalculatorPanel 对象添加到 JFrame 对象中 frame.add(panel); // 显示 JFrame 对象 frame.setVisible(true); } } import javax.swing.*; import java.awt.*; import java.awt.event.*; public class CalculatorPanel extends JPanel implements ActionListener { private JTextField textField; private JButton addButton, subtractButton, multiplyButton, divideButton, clearButton, equalsButton; private double firstNumber, secondNumber, result; private char operation; public CalculatorPanel() { // 设置 JPanel 对象的布局 setLayout(new BorderLayout()); // 创建一个 JTextField 对象用于显示输入和计算结果 textField = new JTextField("0", 12); textField.setEditable(false); add(textField, BorderLayout.NORTH); // 创建一个 JPanel 对象用于存放操作符按钮 JPanel operationPanel = new JPanel(); operationPanel.setLayout(new GridLayout(4, 1)); // 创建操作符按钮并添加到操作符面板中 addButton = new JButton("+"); addButton.addActionListener(this); operationPanel.add(addButton); subtractButton = new JButton("-"); subtractButton.addActionListener(this); operationPanel.add(subtractButton); multiplyButton = new JButton("*"); multiplyButton.addActionListener(this); operationPanel.add(multiplyButton); divideButton = new JButton("/"); divideButton.addActionListener(this); operationPanel.add(divideButton); // 创建一个 JPanel 对象用于存放数字按钮 JPanel numberPanel = new JPanel(); numberPanel.setLayout(new GridLayout(4, 3)); // 创建数字按钮并添加到数字面板中 JButton[] numberButtons = new JButton[10]; for (int i = 0; i < numberButtons.length; i++) { numberButtons[i] = new JButton(String.valueOf(i)); numberButtons[i].addActionListener(this); numberPanel.add(numberButtons[i]); } clearButton = new JButton("C"); clearButton.addActionListener(this); numberPanel.add(clearButton); equalsButton = new JButton("="); equalsButton.addActionListener(this); numberPanel.add(equalsButton); // 将操作符面板和数字面板添加到 JPanel 对象中 JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new GridLayout(1, 2)); buttonPanel.add(numberPanel); buttonPanel.add(operationPanel); // 添加 JPanel 对象到 CalculatorPanel 中 add(buttonPanel, BorderLayout.CENTER); } public void actionPerformed(ActionEvent event) { String command = event.getActionCommand(); if (command.equals("C")) { textField.setText("0"); firstNumber = 0.0; secondNumber = 0.0; result = 0.0; operation = ' '; } else if (command.equals("+") || command.equals("-") || command.equals("*") || command.equals("/")) { firstNumber = Double.parseDouble(textField.getText()); operation = command.charAt(0); textField.setText("0"); } else if (command.equals("=")) { secondNumber = Double.parseDouble(textField.getText()); switch(operation) { case '+': result = firstNumber + secondNumber; break; case '-': result = firstNumber - secondNumber; break; case '*': result = firstNumber * secondNumber; break; case '/': result = firstNumber / secondNumber; break; } textField.setText(String.valueOf(result)); firstNumber = result; secondNumber = 0.0; operation = ' '; } else { String currentText = textField.getText(); if (currentText.equals("0")) currentText = command; else currentText += command; textField.setText(currentText); } } }

五、实验总结
本次实验中未能将计算器集成到登录界面跳转后的界面中及计算器计算数据的记录。

浙公网安备 33010602011771号