第二次作业
前言:
一.实验目的
设计一个包含登录界面的计算器软件,该软件可以实现第一次作业中的全部功能,同时可以保存用户的历史计算记录。
二.项目功能
简易计算机的建立
登录界面
登录功能的实现
三.使用环境
使用WPS Offic作绘图工具
使用Java语言与IntelliJ IDEA Community Edition作开发工具
使用MySQL数据库储存数据
使用Navicat 15管理操作数据库
项目整体:
代码实现:
src:
controller-UserServlet:
package com.xxxx.controller; import com.xxxx.entity.vo.MessageModel; import com.xxxx.service.UserService; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet("/xszy") public class UserServlet extends HttpServlet { //实例化UserService对象 private UserService userService = new UserService(); @Override protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //接收客户端的请求(接收参数,姓名,密码) String uname = request.getParameter("uname"); String upwd = request.getParameter("upwd"); //调用service层的方法,返回消息模型对象 MessageModel messageModel = userService.userxszy(uname, upwd); //判断消息模型的状态码 if (messageModel.getCode() == 1) { //将消息模型中的用户信息设置到session作用域中,定向跳转到index.jsp request.getSession().setAttribute("user", messageModel.getObject()); response.sendRedirect("index.jsp"); } else {//失败 //将消息模型对象设置到request作用域中,请求转发跳转到xszy.jsp request.setAttribute("messageModel", messageModel); request.getRequestDispatcher("xszy.jsp").forward(request, response); } } }
entity-vo-MessageModel:
package com.xxxx.entity.vo; public class MessageModel { public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Object getObject() { return object; } public void setObject(Object object) { this.object = object; } private Integer code = 1; private String msg = "成功!"; private Object object; }
entity-User:
package com.xxxx.entity; public class User { private Integer userId;//用户编号 private String userName;//用户姓名 private String userPwd;//用户密码 public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserpwd() { return userPwd; } public void setUserpwd(String userpwd) { this.userPwd = userpwd; } }
mapper-UserMapper:
package com.xxxx.mapper; import com.xxxx.entity.User; public interface UserMapper { public User queryUserByName(String userName); }
mapper-UserMapper.xml:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- 首先来解析namespace:命名空间,此属性通常用来映射Dao层接口.--> <mapper namespace="com.xxxx.mapper.UserMapper"> <!-- id:对应Dao层接口方法名parameterType:指定输入参数类型 --> <!-- useGeneratedKeys="true"把新增加的主键赋值到自己定义的keyProperty (id)中 --> <select id = "queryUserByName" parameterType = "String" resultType = "com.xxxx.entity.User"> select * from tb_user where userName = #{userName} </select> </mapper>
service-UserService:
package com.xxxx.service; import com.xxxx.entity.User; import com.xxxx.entity.vo.MessageModel; import com.xxxx.mapper.UserMapper; import com.xxxx.util.GetSqlSession; import com.xxxx.util.StringUtil; import org.apache.ibatis.session.SqlSession; public class UserService { public MessageModel userxszy(String uname, String upwd) { MessageModel messageModel = new MessageModel(); //回显数据 User u = new User(); u.setUserName(uname); u.setUserpwd(upwd); messageModel.setObject(u); //参数的非空判断 if (StringUtil.isEmpty(uname) ||StringUtil.isEmpty(upwd)){ //将状态码,提示信息,回信数据设置到消息模型对象中,返回消息模型对象 messageModel.setCode(0); messageModel.setMsg("用户姓名和密码不能为空!"); return messageModel; } SqlSession session = GetSqlSession.createSqlSession(); UserMapper userMapper = session.getMapper(UserMapper.class); User user = userMapper.queryUserByName(uname); // 判断用户对象是否为空 if(user == null){ //将状态码,提示信息,回信数据设置到消息模型对象中,返回消息模型对象 messageModel.setCode(0); messageModel.setMsg("用户不存在!"); return messageModel; } //判断数据库中查询到的用户密码与前台传递过来的密码进行比较 if (!upwd.equals(user.getUserpwd())){ //如果不相等,将状态码,提示信息,回显数据设置到消息模型对象中,返回消息模型对象 messageModel.setCode(0); messageModel.setMsg("用户密码不正确!"); return messageModel; } //登录成功,将用户信息设置到消息模型对象中 messageModel.setObject(user); return messageModel; } }
test-test:
package com.xxxx.test; import com.xxxx.entity.User; import com.xxxx.mapper.UserMapper; import com.xxxx.util.GetSqlSession; import org.apache.ibatis.session.SqlSession; public class test { public static void main(String[] args) { SqlSession session = GetSqlSession.createSqlSession(); UserMapper userMapper = session.getMapper(UserMapper.class); User user = userMapper.queryUserByName("admin"); System.out.println(user); } }
util-GetSqlSession:
package com.xxxx.util; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException; import java.io.InputStream;
public class GetSqlSession { public static SqlSession createSqlSession(){ SqlSessionFactory sqlSessionFactory = null; InputStream input = null; SqlSession session = null; try{ String resource = "mybatis-config.xml"; input = Resources.getResourceAsStream(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(input); session = sqlSessionFactory.openSession(); return session; }catch (IOException e){ e.printStackTrace(); return null; } } public static void main(String[] args) { System.out.println(createSqlSession()); } }
util-StringUtil:
package com.xxxx.util; public class StringUtil { public static boolean isEmpty(String str){ if (str == null || "".equals(str.trim())){ return true; } return false; } }
mybatis-config.xml:
<?xm1 version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="mysql.properties"/> <environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <dataSource type="POOLED"> <property name="driver" value="${driver}" /> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <package name="com.xxxx.mapper"/> </mappers> </configuration>
mysql.properties:
driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://127.0.0.1:3305/java_test?serverTimezone=UTC&useSSL=false&characterEncoding=UTF-8 username=root password=0987654321
web:
js:
WEB-INF:
index.jsp:
<%@ page contentType="text/html; charset=UTF-8" language="java"%> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>有个计算器</title> <style> /* 设置顶部标题栏样式 */ #top { width: 450px; height: 50px; margin: auto; background-color: gray; /* border-radius: 10px; */ /* border-top-left-radius: 10px; */ } #top .point { width: 20px; height: 20px; float: left; margin-left: 10px; margin-top: 15px; border-radius: 10px; } #top .red { background-color: red; } #top .blue { background-color: blue; } #top .green { background-color: green; } #calc-title { font-size: 22px; color: white; float: right; margin-top: 10px; margin-right: 10px; } /* 设置结果显示栏样式 */ #result { width: 446px; height: 50px; margin: auto; text-align: right;/*文本内容右对齐*/ background-color: white; border: solid 2px red; font-size: 30px; } /* 设置按钮区域的样式 */ #button { width: 450px; height: 422px; background-color: gray; margin: auto; } #button div { width: 108px; height: 80px; float: left; background-color: #7fffd4; margin: 2px; line-height: 80px; text-align: center; font-size: 26px; } #button div:hover { background-color: orangered; } </style> <script type="text/javascript"> //获取一个元素 function aler(){ var cal = document.getElementById("calc-title").innerHTML; window.alert(cal); } document.getElementsByClassName("point"); //输入数字 function num(number){ var result = document.getElementById("result") result.innerHTML = result.innerHTML + number }//输入运算符 function oper(operator){ var result = document.getElementById("result") result.innerHTML = result.innerHTML + operator } //计算结果 function yunsuan(){ var result= document.getElementById("result") var expression = result.innerHTML result.innerHTML =eval(expression) } function doback(){ var result =document.getElementById("result")//定位到result var len=result.innerHTML.length//取出result的值并取他的总长度 result.innerHTML =result.innerHTML.substr(0,len-1)//把result里面的值处理后重新放到result里面 } function qingkong(){ var result = document.getElementById("result") result.innerHTML = "" } </script> </head> <body > <div id="top"> <div class="point red"></div> <div class="point blue"></div> <div class="point green"></div> <div id="calc-title">及其有品的计算器</div> </div> <div id="result" name="result" ></div> <div id="button"> <!--当被单击时触发事件--> <!--在<script>里面写函数,下面调用函数,传参--> <div onclick="qingkong()">AC</div> <div>+/-</div> <div onclick="oper('%')">%</div> <div onclick="oper('/')">÷</div> <div onclick="num(7)">7</div> <div onclick="num(8)">8</div> <div onclick="num(9)">9</div> <div onclick="oper('*')">*</div> <div onclick="num(4)">4</div> <div onclick="num(5)">5</div> <div onclick="num(6)">6</div> <div onclick="oper('-')">-</div> <div onclick="num(1)">1</div> <div onclick="num(2)">2</div> <div onclick="num(3)">3</div> <div onclick="oper('+')">+</div> <div onclick="num(0)">0</div> <div onclick="doback()">删除</div> <div onclick="oper('.')">.</div> <div onclick="yunsuan()">=</div> </div> </body> </html>
xszy.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>用户登录</title> </head> <body> <div style="text-align: center"> <form action="xszy" method="post" id="xszyForm"> 姓名:<input type="text" name="uname" id="uname" value="${messageModel.object.userName}"><br> 密码:<input type="password" name="upwd" id="upwd" value="${messageModel.object.userPwd}"><br> <span id="msg" style="font-size: 15px;color: #fd0329">${messageModel.msg}</span><br> <button type="button" id="xszyBtn">登录</button> <button type="button">注册</button> </form> </div> <%--引入Jquery的js文件--%> <script type="text/javascript" src="js/jquery-3.4.1.js"></script> <script type="text/javascript"> $("#xszyBtn").click(function (){ //获取用户姓名和密码的值 var uname = $("#uname").val(); var upwd = $("#upwd").val(); //判断姓名是否为空 if(isEmpty(uname)){ $("#msg").html("用户姓名不可为空!"); return; } //判断密码是否为空 if(isEmpty(upwd)){ $("#msg").html("用户密码不可为空!"); return; } //如果都不为空,则提交表单 $("#xszyForm").submit(); }); function isEmpty(str){ if(str == null || str.trim() == ""){ return true; } return false } </script> </body> </html>
流程图:
功能实现:
不输入姓名:
不输入密码:
登录成功:
计算器:
数据库:
*登录系统实现b站教程,如有雷同,纯属巧合