文章目錄
- 前言
- 一、關于數據庫的問題
- 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、搜索框模糊查詢是如何進行實現的?
問:搜索框模糊查詢是如何進行實現的?
一般模糊語句格式如下:
SELECT 字段 FROM 表 WHERE 某字段 LIKE 條件;
其中,關于條件,SQL 提供了如下四種匹配模式:
- %:表示零個或多個字符,可以匹配任意類型和任意長度的字符。
說明:有些情況下若是中文,請使用兩個百分號(%%)表示。
select * from flow_user where username like '%王%';
如果需要找到 flow_user 這張表里面,字段 username 中既有“唐”,又有“英”的記錄,可以使用 and 條件:
select * from flow_user where username like '%英%' and username like '%唐%';
則可以查詢出來所有包含“英”和“唐”的所有內容,“英”和“唐”所在的前后位置無所謂。
- _:表示任意單個字符
select * from flow_user where username like '_英_';
只能找到“王英琨”這樣 username 為三個字且中間一個字是“英”的內容。
- []:表示括號內所列字符中的一個(類似正則表達式)。
指定一個字符、字符串或范圍,要求所匹配的對象為他們中的任一個。
將找出“王飛”“李飛”“張飛”(而不是“張王李飛”)。
如 [] 內有一系列字符(01234,abcde 之類的)則可略寫為“0-4”,“a-e”:
select * from flow_user where username like '老[0-9]';
將找出“老1”、“老2”、……、“老9”。
- [^]:表示不在括號所列之內的單個字符。
其取之和 [] 相同,但它所要求匹配對象為指定字符以外的任一個字符。
select * from flow_user where username LIKE'[^王李張]飛';
將找出不是“王飛”、“李飛”、“張飛”的“趙飛“、“吳飛”等。
說明:查詢內容包含通配符時,由于通配符的緣故,導致查詢特殊字符“%”、“_”、“[”的語句無法正常實現,把特殊字符用“[]”括起來便可以正常查詢。
7.5、分頁查詢是如何實現的?
問:頁面分頁查詢是如何實現的?
MySQL 中實現分頁查詢,在數據量較小的情況下可使用 limit 查詢來實現分頁查詢,在數據量大的情況下使用建立主鍵或唯一索引來實現,另外可通過 order by 對其排序。
分頁需求:客戶端通過傳遞 start(頁碼),limit(每頁顯示的條數)兩個參數去分頁查詢數據庫表中的數據,MySQL 數據庫提供分頁的函數有 limit m,n,但是該函數的用法和我們的需求不一樣,所以就需要根據實際情況去改寫適合自己的分頁語句。
例如:查詢第 1 條到第 10 條的數據的 SQL 是:
select * from table limit 0,10;
對應我們的需求就是查詢第一頁的數據:
select * from table limit (1-1)*10,10;
從上面的分析我們可以得出分頁 SQL 的格式是:
select * from table limit (start-1)*limit,limit;
說明:其中 start 是頁碼,limit 是每頁顯示的條數。
7.6、主鍵或者是唯一索引如何進行 SQL 優化?
在數據量較小的時候使用 limit 進行數據分頁在性能上面不會有明顯的緩慢,但是當數據量達到了萬級或百萬級時,SQL 語句的性能將會影響數據的返回。這時就要使用主鍵或者是唯一索引來代替 limit 進行數據分頁。
例如,返回 10 到 50 之間的數據,設主鍵或唯一索引為 demo_id,代碼如下:
select * from table where demo_id > (pageNo-1)*pageSize limit pageSize;
基于數據再排序:當需要返回的信息要按順序或者逆序時,就需要對上面的數據進行排序。可用 order by ASC 表示順序,order by DESC 表示逆序,一般情況下默認的為順序。
返回的數據依照 demo_id 的順序進行排列,代碼如下:
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() 方法可按照指定的周期(以毫秒計)來調用函數或計算表達式。
代碼如下:
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 畢設答辯常見的幾類問題,當然也歡迎大家在評論區下方留言補充!希望看了本文能讓你成竹在胸,答辯如能幫到你也歡迎積極留言告訴白鹿哈!我是白鹿,一個不懈奮斗的程序猿。望本文能對你有所裨益,歡迎大家的一鍵三連!若有其他問題、建議或者補充可以留言在文章下方,感謝大家的支持!