實際開發過程中,使用maven管理jar給我們開發帶來了很多便利,不需要自己一個一個的jar包下載了,只需要配置個pom配置文件就可以了,寫上對應坐標和倉庫地址就可以了。但是jar沖突沒問題沒有解決,有沖突的jar包maven不會給我們檢查出來還是會根據我們的配置進行下載,等到編譯才會報錯,并且報錯信息很晦澀,需要面向百度查一會可能才能定位出問題。
這時候我們迫切需要有個東東可以提前告訴我們我的工程里有內奸,需要及時剔除,否則會影響軍心。
1、maven插件,通過參數指令傳給插件
2、工程里所有jar包沖突預警
3、工程中不能共存jar預警
4、自定義規則預警
3.1 詳細技術方案
1、maven插件開發,繼承AbstractMojo,入口方法execute,命令參數可以通過注解方式傳入,例如:@Parameter(property="groupId"),邊亮可以獲取groupId對應傳入的參數值。
2、獲取工程中所有的jar包及類:通過Maven獲取MavenProject,拿到工程后就可以拿到所有的jar及其所有依賴樹,把所有jar包放到一個大map中。
3、jar包沖突算法:
A、相同jar包版本沖突:通過自定義規則配置到屬性文件中,定義某jar的哪些版本水火不相容。規則示例:xxxgroupId:xxxArtifactId>5.1.8,那么程序則認為這個坐標的jar包大于我要發(5.1.8)時就是內奸,需要除掉。
B、相同jar包版本沖突:倆jar包中有class個數不同或者個數相同但是MD5后結果不同或者倆jar包中有相同類大小不同這三種情況認為此山不容倆jar包。具體代碼此處省略一萬行。
C、不相同jar包沖突:通過自定義規則配置到屬性文件中,定義某jar的某個版本和別的某jar包某個版本互看不順眼。規則示例:if 王寶強groupId:王寶強ArtifactId >=2.2.2 then 經紀人groupId:經紀人ArtifactId>3.3.3,此規則代表王寶強jar包版本222與經紀人jar包版本333不能共存,否則會產生綠帽子,給出綠帽告警。
已知的會產生綠帽告警的有如下:
log4j-over-slf4j 和 slf4j-log4j12 不能共存。
jcl-over-slf4j 和 slf4j-jcl 不能共存。
jcl-over-slf4j 和 commons-logging 不能共存。
出處:https://www.slf4j.org/codes.html#version_mismatch。
部分核心代碼展示
完成SpringBoot打包獨立可執行Web項目(2)
章通過名片管理系統的設計與實現,講述如何使用SSM框架來實現一個Web應用。通過本章的學習,掌握SSM框架應用開發的流程、方法以及技術
名片管理系統是針對注冊用戶使用的系統。系統提供的功能如下:
1.非注冊用戶可以注冊為注冊用戶。
2.成功注冊的用戶,可以登錄系統。
3.成功登錄的用戶,可以添加、修改、刪除以及瀏覽自己客戶的名片信息。
4.成功登錄的用戶,可以修改密碼
用戶登錄成功后,進入管理主頁面(main.jsp)可以對自己的客戶名片進行管理。系統模塊劃分,如圖4.1所示。
■ 圖4.1 名片管理系統
系統采用加載純Java數據庫驅動程序的方式連接MySQL5.x數據庫。在MySQL5.x的數據庫ch4中,共創建兩張與系統相關的數據表:usertable和cardtable。
根據系統設計與分析,可以設計出如下數據結構:
1.用戶
包括ID、用戶名以及密碼,注冊用戶名唯一。
2.名片
包括ID、名稱、電話、郵箱、單位、職務、地址、Logo以及所屬用戶。其中,ID唯一,“所屬用戶”與“1.用戶”的用戶ID關聯。
根據以上數據結構,結合數據庫設計特點,可畫出如圖4.2所示的數據庫概念結構圖。
■ 圖4.2 數據庫概念結構圖
其中,ID為正整數,值是從1開始遞增的序列。
將數據庫概念結構圖轉換為MySQL數據庫所支持的實際數據模型,即數據庫的邏輯結構。
用戶信息表(usertable)的設計,如表4.1所示。
■ 表4.1 用戶信息表
名片信息表(cardtable)的設計,如表4.2所示。
■ 表4.2 名片信息表
為方便管理,在/WebContent/static目錄下存放與系統相關的靜態資源,如BootStrap相關的CSS與JS;在/WEB-INF/jsp目錄下存放與系統相關的JSP頁面。
在本系統中,與名片管理相關的功能包括添加、修改、刪除、查詢等,由控制器類CardController負責處理。由系統功能需求可知,用戶必須成功登錄才能管理自己的名片,所以,CardController處理添加、修改、刪除、查詢名片等功能前,需要進行登錄權限驗證。在CardController中,使用@ModelAttribute注解的方法進行登錄權限驗證。
在本系統中,與名片管理相關的功能包括添加、修改、刪除、查詢等,由控制器類CardController負責處理。由系統功能需求可知,用戶必須成功登錄才能管理自己的名片,所以,CardController處理添加、修改、刪除、查詢名片等功能前,需要進行登錄權限驗證。在CardController中,使用@ModelAttribute注解的方法進行登錄權限驗證。
Dao層是數據訪問層,即@Repository注解的數據操作接口(接口中的方法與SQL映射文件中元素的id對應),與名片管理相關的數據訪問層為CardMapper。
SQL映射文件的namespace屬性與數據操作接口對應。與名片管理功能相關的SQL映射文件是CardMapper.xml(位于dao包中)
首先,用戶登錄成功后,進入名片管理系統的主頁面。然后,用戶在名片管理主頁面單擊“添加名片”超鏈接打開添加名片頁面。最后,用戶輸入客戶名片的姓名、電話、E-Mail、單位、職務、地址、Logo后,單擊“添加”按鈕實現添加。如果成功,則跳轉到名片管理主頁面;如果失敗,則回到添加名片頁面。
addCard.jsp頁面實現添加名片信息的輸入界面,如圖4.3所示。
■ 圖4.3 添加名片頁面
單擊圖4.3中“添加”按鈕,將添加請求通過“card/addCard?act=add”提交給控制器類CardController(4.5.2節)的addCard方法進行添加功能處理。添加成功跳轉到名片管理主頁面;添加失敗回到添加名片頁面。
用戶登錄成功后,進入名片管理系統的主頁面(main.jsp),運行效果如圖4.4所示。
■ 圖4.4 名片管理主頁面
在主頁面中單擊“詳情”超鏈接,打開名片詳細信息頁面detail.jsp。“詳情”超鏈接的目標地址是個url請求。該請求路徑為“card/detail?id=${card.id}&act=detail”。根據請求路徑找到對應控制器類CardController的detail方法處理查詢一個名片功能。根據動作類型(“修改”以及“詳情”),將查詢結果轉發到不同視圖。名片詳細信息頁面cardDetail.jsp運行效果如圖4.5所示。
■ 圖4.5 名片詳情
單擊名片管理主頁面中“修改”超鏈接,打開修改名片信息頁面updateCard.jsp。“修改”超鏈接的目標地址是url請求card/detail?id=${card.id}&act=update。找到對應控制器類CardController的方法detail,在該方法中,根據動作類型,將查詢結果轉發給updateCard.jsp頁面顯示。
輸入要修改的信息后,單擊“修改”按鈕,將名片信息提交給控制器類,找到對應控制器類CardController的方法addCard,在addCard方法中根據動作類型,執行修改的業務處理。修改成功,進入名片管理主頁面。修改失敗,回到updateCard.jsp頁面。
updateCard.jsp頁面的運行效果如圖4.6所示。
■ 圖4.6 updateCard.jsp頁面
在名片管理主頁面中,單擊“刪除”超鏈接,將要刪除名片的ID通過Ajax提交給控制器類。找到對應控制器類CardController的方法delete,在該方法中,執行刪除的業務處理。刪除成功后,進入管理主頁面
在本系統中,與用戶相關的功能包括用戶注冊、用戶登錄以及用戶檢查等,由控制器類UserController負責處理。
與用戶相關的Service接口和實現類分別為UserService和UserServiceImpl。控制器獲取一個請求后,需要調用Service層中業務處理方法,在Service層中需要調用Dao層。所以,Service層是控制器層和Dao層的橋梁。UserService接口的代碼略。
@Service
public class UserServiceImpl implements UserService{
@Autowired
private UserMapper userMapper;
/***
* 檢查用戶名是否可用
*/
@Override
public String checkUname(MyUser myUser) {
List<MyUserTable> userList=userMapper.selectByUname(myUser);
if(userList.size() > 0)
return "no";
return "ok";
}
/**
* 實現注冊功能
*/
@Override
public String register(MyUser myUser) {
//將明文變成密文
myUser.setUpwd(MD5Util.MD5(myUser.getUpwd()));
if(userMapper.register(myUser) > 0)
return "login";
return "register";
}
/**
* 實現登錄功能
*/
@Override
public String login(MyUser myUser, Model model, HttpSession session) {
//ValidateCodeController中的rand
String code=(String)session.getAttribute("rand");
if(!code.equalsIgnoreCase(myUser.getCode())) {
model.addAttribute("errorMessage", "驗證碼錯誤!");
return "login";
}else {
//將明文變成密文
myUser.setUpwd(MD5Util.MD5(myUser.getUpwd()));
List<MyUserTable> list=userMapper.login(myUser);
if(list.size() > 0){
session.setAttribute("userLogin", list.get(0));
return "redirect:/card/selectAllCardsByPage?currentPage=1";
}else {
model.addAttribute("errorMessage", "用戶名或密碼錯誤!");
return "login";
}
}
}
}
Dao層是數據訪問層,即@Repository注解的數據操作接口(接口中的方法與SQL映射文件中元素的id對應),與用戶相關的數據訪問層為UserMapper。
SQL映射文件的namespace屬性與數據操作接口對應。與用戶相關的SQL映射文件是UserMapper.xml(位于dao包中),具體代碼如下:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dao.UserMapper">
<select id="selectByUname" resultType="MyUserTable" parameterType="MyUser">
select * from usertable where uname=#{uname}
</select>
<insert id="register" parameterType="MyUser">
insert into usertable (id,uname,upwd) values(null,#{uname},#{upwd})
</insert>
<select id="login" parameterType="MyUser" resultType="MyUserTable">
select * from usertable where uname=#{uname} and upwd=#{upwd}
</select>
</mapper>
在登錄頁面login.jsp,單擊“注冊”鏈接,打開注冊頁面register.jsp,效果如圖4.7所示。
■ 圖4.7 注冊頁面
在圖4.7所示的注冊頁面中,輸入“姓名”后,系統將通過Ajax提交“user/checkUname” 請求檢測“姓名”是否可用。輸入合法的用戶信息后,單擊“注冊”按鈕,實現注冊功能。
在瀏覽器中,通過地址http://localhost:8080/ch4打開登錄頁面login.jsp,效果如圖4.8所示。
■ 圖4.8 登錄界面
用戶輸入姓名、密碼和驗證碼后,系統將對姓名、密碼和驗證碼進行驗證。如果姓名、密碼和驗證碼同時正確,則登錄成功,將用戶信息保存到session對象,并進入系統管理主頁面(main.jsp);如果輸入有誤,則提示錯誤。
單擊名片管理主頁面中的“修改密碼”菜單,打開密碼修改頁面updatePwd.jsp。密碼修好頁面效果如圖4.9所示。
■ 圖4.9 密碼修改頁面
在圖4.9中輸入“新密碼”后,單擊“修改”按鈕,將請求通過“card/updatePwd”提交給控制器類。根據請求路徑找到對應控制器類CardController的updatePwd方法處理密碼修改請求。這里找控制器類CardController處理密碼修改,是因為用戶必須登錄成功后才能修改密碼。
在名片管理主頁面中,單擊“安全退出”菜單,將返回登錄頁面。“安全退出”超鏈接的目標地址是一個請求card/loginOut,找到控制器類CardController的對應處理方法loginOut。這里找控制器類CardController處理安全退出,是因為用戶必須登錄成功后才能安全退出。
本章講述了名片管理系統的設計與實現。通過我們的學習,不僅掌握SSM框架整合開發的流程、方法和技術,還應該熟悉名片管理的業務需求、設計以及實現。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。