打车项目的开发与总结

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

相关文章

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Python基于wxPython和FFmpeg开发一个视频标签工具

《Python基于wxPython和FFmpeg开发一个视频标签工具》在当今数字媒体时代,视频内容的管理和标记变得越来越重要,无论是研究人员需要对实验视频进行时间点标记,还是个人用户希望对家庭视频进行... 目录引言1. 应用概述2. 技术栈分析2.1 核心库和模块2.2 wxpython作为GUI选择的优

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

springboot集成Deepseek4j的项目实践

《springboot集成Deepseek4j的项目实践》本文主要介绍了springboot集成Deepseek4j的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录Deepseek4j快速开始Maven 依js赖基础配置基础使用示例1. 流式返回示例2. 进阶

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于

SpringBoot项目使用MDC给日志增加唯一标识的实现步骤

《SpringBoot项目使用MDC给日志增加唯一标识的实现步骤》本文介绍了如何在SpringBoot项目中使用MDC(MappedDiagnosticContext)为日志增加唯一标识,以便于日... 目录【Java】SpringBoot项目使用MDC给日志增加唯一标识,方便日志追踪1.日志效果2.实现步