打车项目的开发与总结

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

相关文章

PyQt5 GUI 开发的基础知识

《PyQt5GUI开发的基础知识》Qt是一个跨平台的C++图形用户界面开发框架,支持GUI和非GUI程序开发,本文介绍了使用PyQt5进行界面开发的基础知识,包括创建简单窗口、常用控件、窗口属性设... 目录简介第一个PyQt程序最常用的三个功能模块控件QPushButton(按钮)控件QLable(纯文本

在IntelliJ IDEA中高效运行与调试Spring Boot项目的实战步骤

《在IntelliJIDEA中高效运行与调试SpringBoot项目的实战步骤》本章详解SpringBoot项目导入IntelliJIDEA的流程,教授运行与调试技巧,包括断点设置与变量查看,奠定... 目录引言:为良驹配上好鞍一、为何选择IntelliJ IDEA?二、实战:导入并运行你的第一个项目步骤1

Spring Boot 与微服务入门实战详细总结

《SpringBoot与微服务入门实战详细总结》本文讲解SpringBoot框架的核心特性如快速构建、自动配置、零XML与微服务架构的定义、演进及优缺点,涵盖开发环境准备和HelloWorld实战... 目录一、Spring Boot 核心概述二、微服务架构详解1. 微服务的定义与演进2. 微服务的优缺点三

基于Python开发一个图像水印批量添加工具

《基于Python开发一个图像水印批量添加工具》在当今数字化内容爆炸式增长的时代,图像版权保护已成为创作者和企业的核心需求,本方案将详细介绍一个基于PythonPIL库的工业级图像水印解决方案,有需要... 目录一、系统架构设计1.1 整体处理流程1.2 类结构设计(扩展版本)二、核心算法深入解析2.1 自

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文