文章目录
- 前言
- 一、关于数据库的问题
- 1.1、为什么采用 MySQL 数据库?
- 1.2、系统数据是如何跟数据库进行交互?
- 1.3、JDBC 连接数据库所需四要素?
- 1.4、JDBC 的操作步骤有几步?
- 二、关于应用服务器的问题
- 2.1、Tomcat 应用服务器作用是什么?
- 三、关于 JavaWeb 的问题
- 3.1、JavaWeb 三层架构都是哪三层?
- 3.2、JSP 的本质与九大内置对象?
- 四、关于 SSM 框架的问题
- 4.1、什么是 SSM 框架?有何优势?
- 4.2、Spring 的两个核心功能分别是什么?
- 4.3、解释 Spring 的 IOC(控制反转)?
- 4.4、解释 Spring 中的 AOP(面向切面编程)?
- 4.5、Spring 的四种事务管理如何实现?
- 4.6、SpringMVC 的 M、V、C 分别代表什么?
- 4.7、简述 SpringMVC 工作流程?
- 4.8、前端控制器(DispatcherServlet)作用?
- 4.9、MyBatis Generator (MBG)有何优势?
- 五、关于分布式架构的问题
- 5.1、采用 Spring Boot 有何优势?
- 5.2、如何理解 Spring Boot 起步依赖的 starter 启动器?
- 六、关于项目管理
- 6.1、Maven 有什么作用?
- 七、关于毕设项目本身
- 7.1、项目的特色与优势是什么?
- 7.2、毕设项目业务逻辑是什么?
- 7.3、简述商品下单购买的业务逻辑?
- 7.4、搜索框模糊查询是如何进行实现的?
- 7.5、分页查询是如何实现的?
- 7.6、主键或者是唯一索引如何进行 SQL 优化?
- 7.7、如何实现对手机号的正则校验?
- 7.8、注册/登陆验证码是如何实现的?
- 7.9、图片上传功能如何实现?
- 7.10、图片全动态变化如何实现?
- 7.11、重定向和转发的区别?
- 7.12、表升级如何实现?如何维护?
- 7.13、购物车商品数量是否可以设置成负数?
- 7.14、项目如何部署上云?
- 7.15、项目在遇到的困难是什么?如何解决?
- 7.16、这个项目最大的体会是什么?
- 7.17、项目后期如何优化扩展?
- 总结
前言
一年一度的毕业季既让人开心,也难免让人忧愁。以我的本科母校为例,毕业除了要提交毕业论文,还需要准备毕业设计作品。而对于毕业设计作品的答辩难免让一些同学感到头大,除了对项目本身了解不是很深入,又因为担心自己准备不充分难以通过答辩,还有些同学不太了解项目答辩会问哪些问题,那么本文一定就是你在答辩前夜的必看指南,精心总结祝你顺利过关!
说明:由于本文定位是临时突击和答辩前预备,所以部分问题回答不是很详细,有问题可以留言。
一、关于数据库的问题
1.1、为什么采用 MySQL 数据库?
问:你的系统中采用的是什么数据库?为什么采用这种数据库,而不是 XX 数据库?
采用的是 MySQL 数据库,MySQL 是最流行的关系型数据库之一。
在 Web 应用方面,MySQL 是最好的应用软件之一。 而且在学校的学习中,我们一直使用的数据库也是 MySQL,对于其他的数据库都不太熟悉。
1.2、系统数据是如何跟数据库进行交互?
问:你的系统中所有的数据是如何跟数据库进行交互的?(采用的什么框架?还是说 JDBC?)优点是什么?
采用的是 MyBatis,该框架将 SQL 语句从代码中分离出来,写在 xml 里面,降低耦合度,便于统一管理和优化,可重用。
优点:支持编写动态 SQL,而且这个是最简单的持久化框架,小巧并且简单易学。
1.3、JDBC 连接数据库所需四要素?
问:JDBC 连接数据库所需要四要素都是什么?
数据库驱动 driverClass,数据库 url,数据库用户名和密码。
1.4、JDBC 的操作步骤有几步?
问:JDBC 的操作步骤有几步,都有什么?
- 注册驱动。
- 获取数据库连接。
- 创建 Statement 类型或者子类型对象。
- 执行 SQL。
- 处理结果(如果需要的话,一般查询语句必须要处理)。
- 关闭资源。
二、关于应用服务器的问题
2.1、Tomcat 应用服务器作用是什么?
问:Tomcat 作用是什么?
Tomcat 是一个免费的开放源代码的 Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选。
当在一台机器上配置好 Apache 服务器,可利用它响应 HTML(标准通用标记语言下的一个应用)页面的访问请求。实际上 Tomcat 部分是 Apache 服务器的扩展,但它是独立运行的,所以当你运行 Tomcat 时,它实际上作为一个与 Apache 独立的进程单独运行的。当配置正确时,Apache 为HTML页面服务,Tomcat 实际上运行 JSP 页面和 Servlet。
Tomcat 和 IIS 等 Web 服务器一样,具有处理 HTML 页面的功能,另外它还是一个 Servlet 和 JSP 容器,独立的 Servlet 容器是 Tomcat 的默认模式。但是,Tomcat 处理静态 HTML 的能力不如 Apache 服务器。
三、关于 JavaWeb 的问题
3.1、JavaWeb 三层架构都是哪三层?
问:项目中是否采用三层架构,三层都是哪三层?为什么用三层架构?
(如果项目采用 SSM 框架就不用看这个,如果是三层架构,就是 web 层、service 层、dao 层。)
- 数据访问层 dao:对数据的操作。
- 业务逻辑层 service:主要对逻辑操作。
- 表示层 web:主要是 web 方式。
优点:开发人员只需关注架构中的某一层,降低后期维护成本和时间,降低了层与层之间的依赖,有利于标准化。
3.2、JSP 的本质与九大内置对象?
问:JSP 本质上是什么?它有几大内置对象,你列举三四个出来说明?
JSP 本质上也是 Servlet。JSP 有九大内置对象,如下:
- out(JspWriter):等同与
response.getWriter()
,用来向客户端发送文本数据。 - config(ServletConfig):对应“真身”中的 ServletConfig。
- page(当前 JSP 的真身类型):当前 JSP 页面的“this”,即当前对象。
- pageContext(PageContext):页面上下文对象,它是最后一个没讲的域对象。
- exception(Throwable):只有在错误页面中可以使用这个对象。
- request(HttpServletRequest):即 HttpServletRequest 类的对象。
- response(HttpServletResponse):即 HttpServletResponse 类的对象。
- application(ServletContext):即 ServletContext 类的对象。
- session(HttpSession):即 HttpSession 类的对象,不是每个 JSP 页面中都可以使用,如果在某个 JSP 页面中设置
<%@page session=”false”%>
,说明这个页面不能使用 session。
四、关于 SSM 框架的问题
4.1、什么是 SSM 框架?有何优势?
问:你的系统采用的是 SSM 框架,那你说一下 SSM 分别是什么,有什么优势?
SSM 是指 Spring、SpringMVC、MyBatis。其所具备的优势如下:
- Spring 核心是 IOC 和 AOP。IOC 使得代码复用,可维护性大大提高,AOP 提供切面编程,同时也增加了生成力。
- SpringMVC 是属于 SpringFrameWork 的后续产品,SpringMVC 分离了控制器、模型对象、分派器以及理想程序对象角色,这种分离更容易定制。
- MyBatis 消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML 或注解用于配置和原始映射,将接口和 Java 的 POJO(Plain Old Java Objects,普通的 Java 对象)映射成数据库中的记录。
4.2、Spring 的两个核心功能分别是什么?
问:Spring 的两个核心功能分别是什么?
- IOC:控制反转。
- AOP:面向切面编程,扩展功能不是修改源代码实现。
4.3、解释 Spring 的 IOC(控制反转)?
问:解释 Spring 的 IOC(控制反转)是什么?
比如一个类,在类里面有方法(非静态的方法),如果要调用类里面的方法,需要创建类的对象,使用对象调用方法。
通常方法就是创建类对象的过程,需要 new 出来对象。而 Spring 要做的就是,把对象的创建不是通过 new 方式实现,而是交给 Spring 配置创建类对象。这个由 Spring 框架管理对象创建和生命周期的机制称之为控制反转。而在创建对象的过程中 Spring 可以依据配置对对象的属性进行设置,这个过程称之为依赖注入(DI)。
在初始化一个 Spring 容器时,Spring 会去解析指定的 xml 文件,当解析到其中的<bean>
标签时,会根据该标签中的 class 属性指定的类的全路径名,通过反射创建该类的对象,并将该对象存入内置的 Map 中管理。其中键就是该标签的 id 值,值就是该对象。
之后,当通过 getBean 方法来从容器中获取对象时,其实就是根据传入的条件在内置的 Map 中寻找是否有匹配的键值,如果有则将该键值对中保存的对象返回,如果没有匹配到则抛出异常。
4.4、解释 Spring 中的 AOP(面向切面编程)?
问:解释 Spring 中的 AOP(面向切面编程),用它有什么好处?
AOP 简单来说是面向切面编程,面向切面,是一种编程思想,OOP(面向对象编程)的延续。 OOP 允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在 OOP 设计中,它导致了大量代码的重复,而不利于各个模块的重用。
而 AOP 技术则恰恰相反,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即方面。所谓“方面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
将系统中非核心的业务提取出来,进行单独处理。比如事务、日志和安全等。就是可以规定在你运行某些特定方法之前或者之后进行的另外一种操作,这种编程方法的好处是,当你有一些方法中会有基本相同的操作进行时,可以抽取出来,通过配置文件放进方法中,而它需要修改的时候只需要动抽取出来的这个方法就好了,而不用一个一个的挨着改,达到低耦合的效果。
好处:
- 解耦:实现低耦合高内聚。
- 实现代码复用,提高使用效率。
4.5、Spring 的四种事务管理如何实现?
问:项目中事务管理如何实现的?有没有用到 Spring 中的 AOP?
在 Spring 项目中,我们可以用通过四种方式实现事务管理,分别是编程式事务管理、基于 TransactionProxyFactoryBean 的声明式事务管理、基于 @Transactional 的声明式事务管理和基于 Aspectj AOP 配置事务。
实现方式如下:https://www.cnblogs.com/weechang/p/12608964.html
Spring 中进行事务管理的通常方式是利用 AOP(面向切片编程)的方式,为普通 Java 类封装事务控制,它是通过动态代理实现的,由于接口是延迟实例化的,Spring 在这段时间内通过拦截器,加载事务切片。
4.6、SpringMVC 的 M、V、C 分别代表什么?
问:SpringMVC 的 M、V、C 分别代表什么?
SpringMVC 的 M、V、C 分别代表 MVC 三层结构:
- C 就是 Controller,是我们写的逻辑控制器,但在 Spring 中叫做 Handler(处理器),Handler 是SpringMVC 的 C 层。
- V 层就是 View 视图层,SpringMVC 把最后要展示给用户的数据和网页封装到 View 中。
- M 层就是 Model 层,这层功能和工作很多,它是 C 层和 V 层传输数据的桥梁,也就是说它贯穿于 Controller 层和 View 层之中,为这两层提供数据。像注视了 @ModelAttribute 方法、SessionAttribute、FlashMap、Model 以及需要执行的方法的参数和返回值都属于这一层,而使用这一层的类有 HandlerMethodArgumentResolver 和 HandlerMethodReturnValueHandler、ModelFactory 和 FlashMapManager。它是 SpringMVC 中最复杂的一层,因为一个请求的参数封装有多重形式,比如方法里的参数,注解了 @ModelAttribute,@SessionAttribute,还有 FlashMap 中的参数。
4.7、简述 SpringMVC 工作流程?
问:简述 SpringMVC 工作流程?
- 用户发起请求到前端控制器(DispatcherServlet),该控制器会过滤出哪些请求可以访问 Servlet、哪些不能访问。就是 url-pattern 的作用,并且会加载 springmvc.xml 配置文件。
- 前端控制器会找到处理器映射器(HandlerMapping),通过 HandlerMapping 完成 url 到 controller 映射的组件,简单来说,就是将在 springmvc.xml 中配置的或者注解的 url 与对应的处理类找到并进行存储,用
map<url,handler>
这样的方式来存储。 - HandlerMapping 有了映射关系,并且找到 url 对应的处理器,HandlerMapping 就会将其处理器(Handler)返回,在返回前,会加上很多拦截器。
- DispatcherServlet 拿到 Handler 后,找到 HandlerAdapter(处理器适配器),通过它来访问处理器,并执行处理器。
- 执行处理器。
- 处理器会返回一个 ModelAndView 对象给 HandlerAdapter。
- 通过 HandlerAdapter 将 ModelAndView 对象返回给前端控制器(DispatcherServlet)。
- 前端控制器请求视图解析器(ViewResolver)去进行视图解析,根据逻辑视图名解析成真正的视图(JSP),其实就是将 ModelAndView 对象中存放视图的名称进行查找,找到对应的页面形成视图对象。
- 返回视图对象到前端控制器。
- 视图渲染,就是将 ModelAndView 对象中的数据放到 request 域中,用来让页面加载数据的。
- 通过第 8 步,通过名称找到了对应的页面,通过第 10 步,request 域中有了所需要的数据,那么就能够进行视图渲染了,最后将其返回即可。
4.8、前端控制器(DispatcherServlet)作用?
问:前端控制器(DispatcherServlet)是干什么用的?
SpringMVC 是 Spring 中的模块,它实现了 MVC 设计模式的 web 框架,首先用户发出请求,请求到达 SpringMVC 的前端控制器(DispatcherServlet),前端控制器根据用户的 url 请求处理器映射器查找匹配该 url 的 handler,并返回一个执行链,前端控制器再请求处理器适配器调用相应的 handler 进行处理并返回给前端控制器一个 modelAndView,前端控制器再请求视图解析器对返回的逻辑视图进行解析,最后前端控制器将返回的视图进行渲染并把数据装入到 request 域,返回给用户。DispatcherServlet 作为 SpringMVC 的前端控制器,负责接收用户的请求并根据用户的请求返回相应的视图给用户。
4.9、MyBatis Generator (MBG)有何优势?
问:你了解过 mybatis-generator 吗?使用它有什么优势?
MyBatis Generator (MBG) 是一个 Mybatis 的代码生成器 MyBatis 和 iBATIS。可以生成 MyBatis 各个版本的代码,和 iBATIS 2.2.0 版本以后的代码。
它可以通过数据库的表(或多个表)生成可以用来访问(多个)表的基础对象。这样和数据库表进行交互时不需要创建对象和配置文件。MBG 解决了对数据库操作有最大影响的一些简单的 CRUD(插入,查询,更新,删除)操作。不过仍然需要对联合查询和存储过程手写 SQL 和对象。
五、关于分布式架构的问题
5.1、采用 Spring Boot 有何优势?
问:有没有想过不用 SSM,而用 Spring Boot,Spring Boot 最大的优势是什么?
有考虑过 Spring Boot。Spring Boot 最大的优势在于可以快速构建项目,具体优势如下:
- 对主流开发框架的无配置集成。
- 项目可独立运行,无须外部依赖 Servlet 容器。
- 提供运行时的应用监控。
- 极大地提高了开发、部署效率。
- 与云计算的天然集成。
- Spring Boot 并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具。
- 同时它集成了大量常用的第三方库配置,Spring Boot 应用中这些第三方库几乎可以是零配置的开箱即用(out-of-the-box),大部分的 Spring Boot 应用都只需要非常少量的配置代码(基于 Java 的配置),开发者能够更加专注于业务逻辑。
5.2、如何理解 Spring Boot 起步依赖的 starter 启动器?
问:如何理解 Spring Boot 中起步依赖里面 starter 启动器?
Starters 可以理解为启动器,它包含了一系列可以集成到应用里面的依赖包,你可以一站式集成 Spring 及其他技术,而不需要到处找示例代码和依赖包。如你想使用 Spring JPA 访问数据库,只要加入 spring-boot-starter-data-jpa 启动器依赖就能使用了。
spring-boot-starter-*
起步依赖是 SpringBoot 核心之处,它提供了 Spring 和相关技术提供一站式服务,让开发者不在关心 Spring 相关配置,简化了传统的依赖注入操作,当然开发者也可通过 application.properties 文件自定义配置。
SpringBoot 常规启动都遵循类似的命名模式spring-boot-starter-*
,其中*
是一种指定类型的应用程序,如 spring-boot-starter-web 表示应用程序依赖 SpringWeb 相关内容。另外,SpringBoot 支持第三方插件引用,第三方启动程序通常以项目的名称开始。例如,MyBatis 依赖插件引用为 mybatis-spring-boot-starter。
六、关于项目管理
6.1、Maven 有什么作用?
问:Maven 是什么?有什么作用?
Maven 的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)。开发人员只需做一些简单的配置,就可以批量完成项目的构建、报告和文档的生成工作。
Maven 的作用如下:
- Maven 统一集中管理好所有的依赖包,不需要程序员再去寻找。
- 对应第三方组件用到的共同 jar,Maven 自动解决重复和冲突问题。
- Maven 作为一个开放的架构,提供了公共接口,方便同第三方插件集成。程序员可以将自己需要的插件,动态地集成到 Maven,从而扩展新的管理功能。
- Maven 可以统一每个项目的构建过程,实现不同项目的兼容性管理。
七、关于毕设项目本身
7.1、项目的特色与优势是什么?
问:你这个项目的特色在哪?与目前市面的系统进行比较,你的优势在哪?
(根据自己情况来答。)
7.2、毕设项目业务逻辑是什么?
问:该功能的业务逻辑是什么?你来简单描述一下?
(根据自己情况来答。)
7.3、简述商品下单购买的业务逻辑?
问:简述下单购买的业务逻辑?
根据实际业务场景,订单流程可抽象为 5 大步骤。 分别是:订单创建>订单支付>订单生产>订单确认>订单完成。
订单创建:用户下单后,系统需要生成订单,此时需要先获取下单中涉及的商品信息,然后获取该商品所涉及到的优惠信息,如果商品不参与优惠信息,则无此环节。
增减库存规则是指订单中的商品,何时从仓储系统中对相应商品库存进行扣除,目前主流有两种方式:
下单减库存——即用户下单成功时减少库存数量。
- 优势:用户体验友好,系统逻辑简洁。
- 缺点:会导致恶意下单或下单后却不买,使得真正有需求的用户无法购买,影响真实销量。
- 解决办法: 设置订单有效时间,若订单创建成功N分钟不付款,则订单取消,库存回滚。 限购,用各种条件来限制买家的购买件数,比如一个账号、一个ip,只能买一件。 风控,从技术角度进行判断,屏蔽恶意账号,禁止恶意账号购买。
付款减库存——即用户支付完成并反馈给平台后再减少库存数量。
- 优势:减少无效订单带来的资源损耗。
- 缺点:因第三方支付返回结果存在时差,同一时间多个用户同时付款成功,会导致下单数目超过库存,商家库存不足容易引发断货和投诉,成本增加。
- 解决办法: 付款前再次校验库存,如确认订单要付款时再验证一次,并友好提示用户库存不足。 增加提示信息:在商品详情页,订单步骤页面提示不及时付款,不能保证有库存等。
订单支付:用户支付完订单后,需要获取订单的支付信息,包括支付流水号、支付时间等。支付完订单接着就是等商家发货,但在发货过程中,根据平台业务模式的不同,可能会涉及到订单的拆分。订单拆分也是一个相对独立的模块,这里就不详细描述了。
订单生产:订单生产,是指产品从企业到用户这一流程的概述。如电商平台中,商家发货过程已有一个标准化的流程,订单内容会发送到仓库,仓库对商品进行打单、拣货、包装、交接快递进行配送。
订单确认:收到货后,订单系统需要在快递被签收后提醒用户对商品做评价。这里要注意,确认收到货不代表交易成功,相反是售后服务的开始。
订单完成:订单完成是指在收到货 X 天的状态,此时订单不在售后的支持时间范围内。到此,一个订单的正向流程就算走完了。
7.4、搜索框模糊查询是如何进行实现的?
问:搜索框模糊查询是如何进行实现的?
一般模糊语句格式如下:
代码语言:javascript复制SELECT 字段 FROM 表 WHERE 某字段 LIKE 条件;
其中,关于条件,SQL 提供了如下四种匹配模式:
- %:表示零个或多个字符,可以匹配任意类型和任意长度的字符。
说明:有些情况下若是中文,请使用两个百分号(%%)表示。
代码语言:javascript复制select * from flow_user where username like '%王%';
如果需要找到 flow_user 这张表里面,字段 username 中既有“唐”,又有“英”的记录,可以使用 and 条件:
代码语言:javascript复制select * from flow_user where username like '%英%' and username like '%唐%';
则可以查询出来所有包含“英”和“唐”的所有内容,“英”和“唐”所在的前后位置无所谓。
- _:表示任意单个字符
select * from flow_user where username like '_英_';
只能找到“王英琨”这样 username 为三个字且中间一个字是“英”的内容。
- []:表示括号内所列字符中的一个(类似正则表达式)。
指定一个字符、字符串或范围,要求所匹配的对象为他们中的任一个。 将找出“王飞”“李飞”“张飞”(而不是“张王李飞”)。
如 [] 内有一系列字符(01234,abcde 之类的)则可略写为“0-4”,“a-e”:
代码语言:javascript复制select * from flow_user where username like '老[0-9]';
将找出“老1”、“老2”、……、“老9”。
- [^]:表示不在括号所列之内的单个字符。
其取之和 [] 相同,但它所要求匹配对象为指定字符以外的任一个字符。
代码语言:javascript复制select * from flow_user where username LIKE'[^王李张]飞';
将找出不是“王飞”、“李飞”、“张飞”的“赵飞“、“吴飞”等。
说明:查询内容包含通配符时,由于通配符的缘故,导致查询特殊字符“%”、“_”、“[”的语句无法正常实现,把特殊字符用“[]”括起来便可以正常查询。
7.5、分页查询是如何实现的?
问:页面分页查询是如何实现的?
MySQL 中实现分页查询,在数据量较小的情况下可使用 limit 查询来实现分页查询,在数据量大的情况下使用建立主键或唯一索引来实现,另外可通过 order by 对其排序。
分页需求:客户端通过传递 start(页码),limit(每页显示的条数)两个参数去分页查询数据库表中的数据,MySQL 数据库提供分页的函数有 limit m,n,但是该函数的用法和我们的需求不一样,所以就需要根据实际情况去改写适合自己的分页语句。
例如:查询第 1 条到第 10 条的数据的 SQL 是:
代码语言:javascript复制select * from table limit 0,10;
对应我们的需求就是查询第一页的数据:
代码语言:javascript复制select * from table limit (1-1)*10,10;
从上面的分析我们可以得出分页 SQL 的格式是:
代码语言:javascript复制select * from table limit (start-1)*limit,limit;
说明:其中 start 是页码,limit 是每页显示的条数。
7.6、主键或者是唯一索引如何进行 SQL 优化?
在数据量较小的时候使用 limit 进行数据分页在性能上面不会有明显的缓慢,但是当数据量达到了万级或百万级时,SQL 语句的性能将会影响数据的返回。这时就要使用主键或者是唯一索引来代替 limit 进行数据分页。
例如,返回 10 到 50 之间的数据,设主键或唯一索引为 demo_id,代码如下:
代码语言:javascript复制select * from table where demo_id > (pageNo-1)*pageSize limit pageSize;
基于数据再排序:当需要返回的信息要按顺序或者逆序时,就需要对上面的数据进行排序。可用 order by ASC 表示顺序,order by DESC 表示逆序,一般情况下默认的为顺序。
返回的数据依照 demo_id 的顺序进行排列,代码如下:
代码语言:javascript复制select * from table where demo_id > (pageNo-1)*pageSize order by demo_id limit pageSize;
7.7、如何实现对手机号的正则校验?
问:对于手机号的正确,你是否进行了验证?如何实现的?
我在前端 JS 脚本中是采用正则表达式来规范手机号,比如:/^1[3-9]d{9}$/
。
第一位: 1
第二位: 3~9
第三到第十一位:只要是数字就行
后端使用 JSP 303 校验 导入 Hibernate-Validator,使用 @Valid
注解完成检验功能。
(这里和 Hibernate 没有关系,我们只是选择了一种具体的实现而已)
7.8、注册/登陆验证码是如何实现的?
问:登录时候那个验证码是如何实现的?前端产生,还是后端产生的?所用的技术是什么?
https://www.cnblogs.com/YQian/p/11323443.html
7.9、图片上传功能如何实现?
问:你这个图片上传的功能在后端是如何实现的?将图片保存到数据库中,还是保存到服务器的指定路径下面?
在 form 表单中声明 enctype="multipart/form-data"
,保存到数据库。
7.10、图片全动态变化如何实现?
问:首页的图片会动态的变化,这是什么技术?如何实现的?
使用 JS 中 Window setInterval() 方法实现。 说明:setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式。
代码如下:
代码语言:javascript复制window.setInterval("slide_photos()",2000);
7.11、重定向和转发的区别?
问:页面跳转采用技术是哪个?重定向还是内部跳转,简述两者区别?
- 请求的次数的不同,重定向总共请求了两次服务器;转发则是用户请求一次可能经过n个jsp页面由返回到用户浏览器中,是一次请求多次处理的过程。
- 跳转过程中链接的变化,重定向在跳转中请求了两次服务器并且是两次不同的链接地址,在浏览器的地址栏可以看到两次是有变化的;转发在跳转过程中浏览器请求了一次服务器,服务器经过了 n 个 jsp 页面并没有改变请求的链接地址,因为用户只请求了一次,所以在整个跳转过程中链接地址是没有改变的,在浏览器的地址栏就可以看到。
- 目的不同,重定向只是简单的让用户访问一个新的链接,而转发是服务器要得到用户的请求内容并需要进行一部分处理的,所以两者目的之不同的。
7.12、表升级如何实现?如何维护?
问:普通用户升级为管理员,在数据库表中你是如何维护的?
7.13、购物车商品数量是否可以设置成负数?
问:在购物里面,你购买的数量是否可以设置成负数,或者大于库存数?这个是如何实现的?
不能。在 cart.jsp 中的 changeNum(),我们还需要把库存这个变量作为参数传入,然后写两个 if 判断,分别判断商品数量小于 1 和商品数量大于库存的情况。
7.14、项目如何部署上云?
问:你这个项目是部署在阿里云上的,那你简单说一下,如何将项目部署到阿里云上?
7.15、项目在遇到的困难是什么?如何解决?
问:你在做这个项目的时候,遇到的困难是什么?或者是用到了比较难的技术?
(开放式问题,也可以说具体知识点) 业务处理逻辑存在问题,不严谨。配置文件等问题。
7.16、这个项目最大的体会是什么?
问:在做这个项目的过程中,你学习到了什么?(你最大的体会是什么?)
(开放式问题,也可以说具体知识点) 掌握项目开发的基本步骤。 具备极强的面向对象的分析与设计技巧。 掌握用例驱动、以架构为核心的主流开发方法。
7.17、项目后期如何优化扩展?
问:如果后期需要你优化扩展你的功能,你会做哪块?
(开放式问题,也可以说具体知识点)
总结
白鹿作为软件工程 Java EE 方向的“过来人”,就在此为大家总结了一些 Java EE 毕设答辩常见的几类问题,当然也欢迎大家在评论区下方留言补充!希望看了本文能让你成竹在胸,答辩如能帮到你也欢迎积极留言告诉白鹿哈!