打车项目的开发与总结

2023-11-26 14:59
文章标签 总结 项目 开发 打车

本文主要是介绍打车项目的开发与总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目总结之打车项目

  • 打车项目的学习与开发

打车项目的学习与开发

经过一个月的基地实训学习时光,我成长了许多,以前对于Java和SQL都是浅尝辄止,而现在真正的运用它们构建了一个完整的项目,这使我小有成就感。
这一次实训开发项目主要是围绕着与日常生活息息相关的出行问题(打车)进行的系统性开发,主要运用的是Java Web和Mysql语句相关知识,为网页界面与数据库连接提供了合理性的技术支持。
此次运用的是一个动态Web开发项目,运用到的开发技术有JSP、Servlet等,WEB Server Plugin发现客户端请求的是动态资源(.jsp、.asp/.aspx、.php),则先将请求转交给WEB Container(WEB容器),在WEB Container中连接数据库,从数据库中取出数据等一系列操作后动态拼凑页面的展示内容,拼凑页面的展示内容后,把所有的展示内容交给WEB服务器,之后通过WEB服务器将内容发送回客户端浏览器进行解析执行。这次项目开发用到的服务器是Tomcat,TomcatTomcat是一个实现了JAVA EE标准的最小的WEB服务器,Tomcat运行时占用的系统资源小,扩展性好,支持负载均衡与邮件服务等开发应用系统常用的功能,且Tomcat开源免费,是初学者开发项目很好的一个选择。
项目主要层次为

1.service服务层:此层主要是用于提供服务,被称为服务,肯定是相比之下比较高层次的一层结构,相当于将几种操作封装起来。然后在控制层通过接口new一个service对象,并用service层中定义的方法向上层传递返回的值。
2.controller控制层
3.dao数据交互层:全称为data access object,属于一种比较底层,比较基础的操作,具体到对于某个表、某个实体的增删改查
4.util存放工具类层
实际这种层次被称为MVC不是设计模式,现在标准主流的编程方式都是采用MVC综合设计模式,MVC本身不属于设计模式的一种,是一个比设计模式更大一点的模式,称作设计模式不合理,应该说MVC它是一种软件开发架构模式,它包含了很多的设计模式,最为密切是以下三种:Observer (观察者模式), Composite(组合模式)和Strategy(策略模式)。所以说MVC模式又称复合模式。MVC(Model-View-Controller) 模式的基本思想是数据,显示和处理相分离。模型(Model)负责数据管理,视图(View)负责数据显示,控制器(Controller)负责业务逻辑和响应策略。它描述的是一种结构,最终目的达到解耦,解耦说的意思是你更改某一层代码,不会影响我其他层代码,如果你会像spring这样的框架,你会了解面向接口编程,表示层调用控制层,控制层调用业务层,业务层调用数据访问层。用户界面逻辑的更改往往比业务逻辑频繁,尤其是在基于Web的应用程序中。例如,可能添加新的用户界面页,或者可能完全打乱现有的页面布局。对显示的更改,尽可能地不要影响到数据和业务逻辑。
目前大部分Web应用都是将数据代码和表示混在一起。经验比较丰富的开发者会将数据从表示层分离开来,但这通常不是很容易做到的,它需要精心的计划和不断的尝试。MVC从根本上强制性的将它们分开。尽管构造MVC应用需要一些额外的工作,但它带来的好处是无庸质疑的。如提高了代码的重用率,提高程序的可维护性,在开发过程中,可以更好的分工,更好的协作。有利于开发出高质量的软件。
以下为项目分层的具体截图:
在这里插入图片描述
在这里插入图片描述
此次项目并没有实现前后端分离,而是前后端相互结合,这样做并不是很完美。希望将来有望能够真正的完成一个前后端分离的项目。在这里补充一下前后端分离的概念:一个项目拆成两个或者多个项目,一个项目只有服务器端代码(Java代码),而另一个项目只要前端页面,这个页面中调用ajax或其他技术去调用后台的接口,后台接口拿到数据之后前台把数据显示出来。在前后端分离的应用模式中,后端仅返回前端所需的数据,不再渲染HTML页面,不再控制前端的效果。至于前端用户看到什么效果,从后端请求的数据如何加载到前端中,都由前端自己决定,网页有网页的处理方式,App有App的处理方式,但无论哪种前端,所需的数据基本相同,后端仅需开发一套逻辑对外提供数据即可。在前后端分离的应用模式中 ,前端与后端的耦合度相对较低。在前后端分离的应用模式中,我们通常将后端开发的每个视图都称为一个接口,或者API,前端通过访问接口来对数据进行增删改查。
在项目中引用bootstrap的css和js样式,写一个前端的登陆页面Login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta name="viewport"content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<title>Insert title here</title>
<!--使用响应式布局-->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body><!-- 使用bootstrap的东西 --><form action="/dcp2019/CsServlet?action=login" method="post"><div >${errorMsg }</div><div class="form-group row"><div class="col-md-2 col-sx-12"><label for="exampleInputEmail1">用户名:</label></div><div class="col-md-10 col-sx-12"><input type="text" name="username" id="form-control"placeholder="请输入用户名"></div></div><div class="form-group row"><div class="col-md-2 col-sx-12"><label for="exampleInputPassword1">密码:</label></div><div class="col-md-10 col-sx-12"><input type="password" name="pwd" id="form-control"placeholder="请输入密码"></div></div><div class="form-group row"><div class="col-md-2 col-sx-4"><label for="exampleInputFile">验证码:</label></div><div class="col-md-4 col-sx-6"><input type="text" name="yanzhengma" class="form-control"placeholder="请输入验证码"></div><div class="col-md-6 col-sx-12"><img src="getcatpcher.jpg" id="myimg"/></div></div><div class="col-md-12 col-sx-12"><button type="submit" class="btn btn-default">登陆</button></div></form><scriptsrc="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script><!-- 加载 Bootstrap 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 --><scriptsrc="https://cdn.jsdelivr.net/npm/bootstrap@3.3.7/dist/js/bootstrap.min.js"></script><script>$(function(){$("#myimg").click(function(){$(this).attr("src", "getcatpcher.jpg");});});</script>
</body></html>

登陆界面展示
该界面实现了每刷新一次页面,就有一个随机的验证码生成,而且点击验证码图片就会切换一张新的随机验证码。
具体的用户名、密码以及验证码的验证功能在CsServlet中去实现
ps:这个验证码的点击事件,实现的不够完美,可以后来进行改善,加一个random函数。像上述一样其实也能实现,但在一些非chrome内核的浏览器上不能实现(经测试)。

private void Login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{// TODO Auto-generated method stubString username = request.getParameter("username");String password = request.getParameter("pwd");String yanzhengma = request.getParameter("yanzhengma");// 根据自己的具体业务逻辑编写程序:// 1查看验证码是否合法// 原始生成的验证码在session com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY// 得到sessionHttpSession session = request.getSession(true);String ori = (String) session.getAttribute(com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY);String id =null;// 原始的和用户输入的进行比较:if (ori.equals(yanzhengma)) {// 2 查看用户名和密码是否合法Customer cs = new Customer();cs.setAccount(username);cs.setPassword(password);// 验证用户的合法性 根据是否合法进行页面跳转CustomerServiceInterface service = new CustomerService();Customer customer = null;try {customer = service.checkCs(cs);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}if (customer == null) {session.setAttribute("errorMsg","用户名或密码不正确,请重新登陆");
//				request.getRequestDispatcher
//
//				("login.jsp").forward(request, response);response.sendRedirect("/dcp2019/login.jsp");} else {session.setAttribute("loginUser", customer);request.getRequestDispatcher("WEB-INF/jsp/index/main.jsp").forward(request, response);}} else {// 验证码输入不正确// 跳转到登陆页面,并提示验证码输入不成功,请重新输入。session.setAttribute("errorMsg", "验证码输入不成功,请重新输入!");response.sendRedirect("/dcp2019/login.jsp");}}

request.getParameter() 取得是通过容器的实现来取得通过类似post,get等方式传入的数据,两个WEB页面间为链接关系时,如Login.jsp与WEB-INF下的main.jsp两个页面之间相互连接,在登陆完后,会跳转到main.jsp,这一点在上方代码中也有体现。这时候main.jsp就可以通过getParameter()这个方法来获得请求参数。request.setAttribute()和getAttribute()只是在web容器内部流转,仅仅是请求处理阶段。当两个Web组件之间为转发关系时,转发目标组件通过getAttribute()方法来和转发源组件共享request范围内的数据。一般通过表单和链接传递的参数使用getParameter,通过request.setAttribute(“name”,“jerry”)的方式赋值的使用request.getAttribute(“name”),request范围较小一些,只是一个请求,简单说就是你在页面上的一个操作, request.getParameter()就是从上一个页面中的url、form中获取参数,但如果一个request涉及多个类,后面还要取参数,可以用request.setAttribute()和request.getAttribute(),但是当结果输出之后,request就结束了。而session可以跨越很多页面,使用session.setAttribute()会在一个过程中始终保有这个值。可以理解是客户端同一个IE窗口发出的多个请求。这之间都可以传递参数,比如很多网站的用户登录都用到了。此次项目开发中也多次使用getParameter与setAttribute两个方法进行页面间参数的获取与传递。
举个例子:

private void doUpdate(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// TODO Auto-generated method stubrequest.setCharacterEncoding("utf-8");response.setCharacterEncoding("utf-8");String name=request.getParameter("name");String mobile=request.getParameter("mobile");String carNumber=request.getParameter("carNumber");String carType=request.getParameter("carType");String workDate=request.getParameter("workDate");String id=request.getParameter("id");Driver driver=new Driver();driver.setName(name);driver.setMobile(mobile);driver.setCarNumber(carNumber);driver.setCarType(carType);driver.setWorkDate(workDate);driver.setId(id);DriverServiceInterface service=new DriverService();int result=-1;try {result=service.updateDriver(driver);} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}HttpSession session=request.getSession();switch(result) {case -1: session.setAttribute("msg", "司机信息更新失败!");break;case 0: session.setAttribute("msg", "司机信息更新成功!");break;case -2:session.setAttribute("msg", "手机号码重复,请确认后再提交");break;}//页面跳转到driver_list.jspresponse.sendRedirect("RequestDispatcherServlet?page=driver/driver_list.jsp");}

以上代码为司机的更新操作,一开始通过getParameter获取参数值,最后通过setAttribute返回字符数据给msg到前端(前端通过弹框提示信息的方式反映给用户)。

 <c:if test="${msg!=null }"><input type="hidden" id="msg" value="${msg }"><script type="text/javascript">bootbox.alert({buttons : {ok : {label : '确定',className : 'btn-myStyle'}},message :$("#msg").val(),title : "操作消息",});</script></c:if>

在实现完登陆界面后,就可以着手于各功能的实现了,实际上就是几套增删改查:实现数据库中司机列表的显示、添加、删除与修改(这其中的删除不能是真的删除,信息很重要,所以这其中的删除只是将司机的状态state设置为0);
客服的显示,添加,编辑(更新信息),密码重置与删除;站点的显示,添加,删除,查看正在该站点等待的司机信息,编辑;任务的显示,添加,取消,查看任务派送给的司机信息;消息的显示,添加,删除。
具体界面如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
不得不承认,以前的数据库没有好好学,这次JavaWeb+数据库,对于我来说真的是难上加难,好在有同学和老师的指导,在完成了两套增删改查后,几乎就已经熟悉了这个程序编写的流程。如何用url的action对前端与后端进行连接,如何在dao层连接数据库,对数据库进行操作,封装数据,返回数据到service层等等。这个项目对于我来说真的是一次很好的锻炼。
但这还不是最难的地方,接下来监听器,过滤器以及接口的加入,让我这个java小白有点吃不消,这个过程让我陷入一直在悔恨为啥我当初在课堂上不好好学习java中。
乱码过滤器先是把界面中的乱码问题进行了解决,再编写权限过滤器,使得登陆的用户身份不同(是普通管理员还是超级管理员)看得到的界面不同,能够行使的权限不同。
其次是监听器部分,监听器主要实现的功能是消息与任务的推送,以及超时处理,可以借用信鸽进行消息的推送,设置一个假的设备(暂时无法运用真实设备进行推送),在代码中模拟设置当前司机的token(实际中用设备自动产生并用jedis.getset方法获取),这一块真的很难,需要好好去琢磨体会。
最后就是接口api部分,实现了与手机端的连接(手机端部分暂时还未完成,用postman做接口请求调试,无论是前端,后台还是测试人员,都可以用postman来测试接口,用起来非常方便)。

这篇关于打车项目的开发与总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/425888

相关文章

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

golang内存对齐的项目实践

《golang内存对齐的项目实践》本文主要介绍了golang内存对齐的项目实践,内存对齐不仅有助于提高内存访问效率,还确保了与硬件接口的兼容性,是Go语言编程中不可忽视的重要优化手段,下面就来介绍一下... 目录一、结构体中的字段顺序与内存对齐二、内存对齐的原理与规则三、调整结构体字段顺序优化内存对齐四、内

配置springboot项目动静分离打包分离lib方式

《配置springboot项目动静分离打包分离lib方式》本文介绍了如何将SpringBoot工程中的静态资源和配置文件分离出来,以减少jar包大小,方便修改配置文件,通过在jar包同级目录创建co... 目录前言1、分离配置文件原理2、pom文件配置3、使用package命令打包4、总结前言默认情况下,

python实现简易SSL的项目实践

《python实现简易SSL的项目实践》本文主要介绍了python实现简易SSL的项目实践,包括CA.py、server.py和client.py三个模块,文中通过示例代码介绍的非常详细,对大家的学习... 目录运行环境运行前准备程序实现与流程说明运行截图代码CA.pyclient.pyserver.py参

基于Python开发PPTX压缩工具

《基于Python开发PPTX压缩工具》在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,不便于传输和存储,所以本文将使用Python开发一个PPTX压缩工具,需要的可以了解下... 目录引言全部代码环境准备代码结构代码实现运行结果引言在日常办公中,PPT文件往往因为图片过大而导致文件体积过大,

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

Git提交代码详细流程及问题总结

《Git提交代码详细流程及问题总结》:本文主要介绍Git的三大分区,分别是工作区、暂存区和版本库,并详细描述了提交、推送、拉取代码和合并分支的流程,文中通过代码介绍的非常详解,需要的朋友可以参考下... 目录1.git 三大分区2.Git提交、推送、拉取代码、合并分支详细流程3.问题总结4.git push

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

IDEA运行spring项目时,控制台未出现的解决方案

《IDEA运行spring项目时,控制台未出现的解决方案》文章总结了在使用IDEA运行代码时,控制台未出现的问题和解决方案,问题可能是由于点击图标或重启IDEA后控制台仍未显示,解决方案提供了解决方法... 目录问题分析解决方案总结问题js使用IDEA,点击运行按钮,运行结束,但控制台未出现http://