手机进销存系统/供应链管理系统
花了將近兩個(gè)月的時(shí)間學(xué)習(xí)了一個(gè)企業(yè)級(jí)進(jìn)銷存項(xiàng)目,已經(jīng)結(jié)束了兩周多,現(xiàn)在終于有時(shí)間來對(duì)這個(gè)項(xiàng)目的學(xué)習(xí)做個(gè)總結(jié)了!
一、首先介紹下這個(gè)項(xiàng)目
(注:本人目前大三,專業(yè)為信息管理,與編程沾邊不多。而我對(duì)編程很感興趣,從大一下期開始主要通過看書和視頻自學(xué)學(xué)習(xí)java編程!)。
項(xiàng)目名稱:手機(jī)進(jìn)銷存系統(tǒng)(Mobile SCM)
主要開發(fā)技術(shù):Struts2+Spring+ibatis+jQuery
數(shù)據(jù)庫:MySql5.1(Navicat客戶端管理工具)
服務(wù)器:tomcat7.0
建模工具:ER/Studio
運(yùn)行系統(tǒng):Linux
其他技術(shù):報(bào)表應(yīng)用iReport+jasperReport技術(shù),應(yīng)用jxl進(jìn)行excel導(dǎo)出。
項(xiàng)目介紹(視頻原話):本系統(tǒng)由某手機(jī)貿(mào)易企業(yè)定制開發(fā),合同價(jià)格9.8萬元,開發(fā)周期3個(gè)月,5人開發(fā)完成。本系統(tǒng)既具有一般進(jìn)銷存系統(tǒng)功能,又有客戶獨(dú)有的需求,通過學(xué)習(xí)本課程,可以全面了解進(jìn)銷存類項(xiàng)目。
視頻評(píng)價(jià):
①.這是我在網(wǎng)上找的一套視頻教程,總共80集,每集60分鐘左右(需要很大的耐心啊!)。項(xiàng)目有點(diǎn)老,大概是12年左右錄制的,但是學(xué)到的東西很多。
②.這是我看的視頻中總時(shí)間最長(zhǎng)的一套視頻了,雖然有80集之多,但仍有很多模塊功能的實(shí)現(xiàn)沒有在視頻中展現(xiàn)出來。但是,這套視頻已經(jīng)把該講的都講了,而且講的很全面,學(xué)到了很多東西。
③.這套視頻是基于現(xiàn)有的、企業(yè)實(shí)際在使用的系統(tǒng)來講解,從售前的與客戶溝通->開發(fā)階段->售后維護(hù)階段,讓我了解到了公司項(xiàng)目開發(fā)流程。不過這套視頻的著重點(diǎn)是在開發(fā)階段,主要講解了系統(tǒng)設(shè)計(jì)、建模工具的使用、主要模塊功能實(shí)現(xiàn)等;像與客戶溝通、具體參與項(xiàng)目需求分析、團(tuán)隊(duì)分工合作等還是得工作后具體參與其中才能真正有所體會(huì)。
④.視頻講解的內(nèi)容也非常詳細(xì),就一個(gè)功能而言,詳細(xì)地講解了JS,頁面構(gòu)成,代碼編寫,文件配置等等,所以也能學(xué)到很多細(xì)節(jié)性的東西,某些內(nèi)容會(huì)在后面寫出來。作為一個(gè)開發(fā)人員,最主要的是需要了解項(xiàng)目的需求,根據(jù)需求來完成代碼的編寫。
實(shí)際學(xué)習(xí):
①.首先,視頻中的持久層框架使用的是iBatis,我因?yàn)樵趯W(xué)習(xí)這套視頻之前不久剛學(xué)習(xí)過了MyBatis框架,所以將iBatis換成了MyBatis,ibatis、mybatis和hibernate后面會(huì)具體說一說。總的來說,框架的使用感覺是非常簡(jiǎn)單的,在此之前就已經(jīng)學(xué)習(xí)過了S2SH(Struts2+Spring+Hibernate),SSM(SpringMVC+Spring+MyBatis),學(xué)框架就是學(xué)配置!。
②.在實(shí)際學(xué)習(xí)時(shí),視頻中講解系統(tǒng)設(shè)計(jì)等內(nèi)容時(shí)是跟著視頻認(rèn)真聽的,涉及到代碼的編寫等內(nèi)容大部分是先了解模塊功能的需求后,先自行編寫代碼實(shí)現(xiàn)功能后再快進(jìn)地看視頻,代碼編寫相對(duì)簡(jiǎn)單,主要還是業(yè)務(wù)需求。代碼寫多了之后會(huì)發(fā)現(xiàn)(剛剛統(tǒng)計(jì)了下代碼量<僅統(tǒng)計(jì)了.java和.jsp>,到現(xiàn)在為止,已超過11W行啦(∩_∩)),無非就是增刪改查,要說難一點(diǎn)的就是將需求轉(zhuǎn)換為邏輯實(shí)現(xiàn)。
③.因?yàn)槭蔷毩?xí),加上學(xué)校時(shí)間也比較緊,實(shí)際編寫代碼時(shí),部分類似于表單驗(yàn)證的就沒有具體做了;到后面部分模塊也沒有具體去實(shí)現(xiàn)了,因?yàn)榛径际切┲貜?fù)的工作了,在以前的學(xué)習(xí)和項(xiàng)目中代碼寫得夠多的啦~\(≧▽≦)/~,而且視頻總的來說也只實(shí)現(xiàn)了一半不到的功能,因?yàn)橐曨l講的非常詳細(xì),所以想要80集講完所有功能不可能,也沒有必要!!
④.因?yàn)橹v得很詳細(xì),所以學(xué)到了以前很多沒注意到的細(xì)節(jié);在學(xué)習(xí)這套視頻的同時(shí),一方面學(xué)到了很多新知識(shí),類似于建模工具ER/Studio的使用;另一方面也復(fù)習(xí)了以前的知識(shí),并更加熟練地加以運(yùn)用。在這期間,有些新的知識(shí)點(diǎn)或者解決的問題寫了幾篇新的博客(可以看之前的博客),有些則會(huì)在接下來的篇幅中進(jìn)行總結(jié)!
?
二、項(xiàng)目相關(guān)截圖展示
1.登錄頁面
?2.首頁
?3.功能展示
菜單管理
權(quán)限管理
供應(yīng)商業(yè)務(wù)
?
4.虛擬機(jī)運(yùn)行效果(Linux)
?5.工程目錄結(jié)構(gòu)
?6.項(xiàng)目相關(guān)文件
?
?三、項(xiàng)目學(xué)習(xí)總結(jié)
?1.進(jìn)銷存系統(tǒng)概述
?進(jìn)銷存系統(tǒng)也稱作供應(yīng)鏈管理系統(tǒng)(Supply Chain Management, SCM)。SCM基本內(nèi)容:計(jì)劃(決策管理層,主要體現(xiàn)在報(bào)表上)、采購、[制造(跟生產(chǎn)有關(guān)的企業(yè))]、庫存、銷售、退換貨管理。SCM總體為兩大流程:物品流、財(cái)務(wù)流。
?百度百科解釋:進(jìn)銷存系統(tǒng)是對(duì)企業(yè)生產(chǎn)經(jīng)營中進(jìn)貨、出貨、批發(fā)銷售、付款等進(jìn)行全程跟蹤管理,從接獲訂單合同開始,進(jìn)入物料采購、入庫、領(lǐng)用到產(chǎn)品完工入庫、交貨、回收貨款、支付原材料款等,每一步都為您提供詳盡準(zhǔn)確的數(shù)據(jù)。有效輔助企業(yè)解決業(yè)務(wù)管 ?理、分銷管理、存 ?貨管理、營銷計(jì)劃的執(zhí)行和監(jiān)控、統(tǒng)計(jì)信息的收集等方面的業(yè)務(wù)問題。
?系統(tǒng)總流程圖:
?
?2.項(xiàng)目組成員及分工(企業(yè)開發(fā)):我想剛進(jìn)公司的新人則處于開發(fā)工程師這個(gè)階段,然后一步步往上走!
?項(xiàng)目經(jīng)理(PM):與客戶溝通、進(jìn)度、成本、質(zhì)量的控制、資源(人力資源)協(xié)調(diào)等。
?系統(tǒng)分析師(SA)[架構(gòu)設(shè)計(jì)師/技術(shù)經(jīng)理]:技術(shù)帶頭人,需求分析、架構(gòu)設(shè)計(jì)、指導(dǎo)開發(fā)、重要功能開發(fā)等。
?開發(fā)工程師(SE):具體模塊的設(shè)計(jì)與實(shí)現(xiàn)。
?測(cè)試工程師(Test Engineer):測(cè)試用例編寫、執(zhí)行測(cè)試提交BUG列表。
?3.項(xiàng)目開發(fā)流程
?需求分析 -> 系統(tǒng)設(shè)計(jì) -> 開發(fā) -> 測(cè)試 -> 實(shí)施及試運(yùn)行 -> 客戶培訓(xùn) -> 維護(hù)
?項(xiàng)目開發(fā)流程圖:
?4.系統(tǒng)設(shè)計(jì)主要工作內(nèi)容:
?①分析需求、了解環(huán)境及限制等
?②總體設(shè)計(jì)、完成子系統(tǒng)劃分,并確定子系統(tǒng)間關(guān)聯(lián)及通信方式
?③對(duì)每個(gè)子系統(tǒng)進(jìn)行模塊及子模塊劃分,并確定之間關(guān)聯(lián)
?④每個(gè)模塊輸入、處理流程、輸出
?⑤設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)
?⑥設(shè)計(jì)用戶界面
?⑦完成《概要設(shè)計(jì)說明書》
5.概要設(shè)計(jì)說明書(主要內(nèi)容參考《概要設(shè)計(jì)說明書主要的內(nèi)容.doc》)
概要設(shè)計(jì)的目的就是希望一個(gè)從來沒有接觸過的人一看就能從各個(gè)方面都對(duì)系統(tǒng)的作用,功能,實(shí)現(xiàn)方面有一個(gè)大概的了解,并為以后的各類詳細(xì)設(shè)計(jì)文檔提供一個(gè)指引和方向。
6.《需求規(guī)格說明書》作用及主要內(nèi)容(可具體參考《LSD-軟件需求規(guī)格說明書.doc》)
作用:
①項(xiàng)目組成員、測(cè)試人員、公司審核部門的一個(gè)參照標(biāo)準(zhǔn)
②客戶驗(yàn)收標(biāo)準(zhǔn)
主要內(nèi)容:
①標(biāo)題、編號(hào)、版本、作者、時(shí)間等信息
②變更記錄
③項(xiàng)目概況、編寫目的、目標(biāo)讀者、系統(tǒng)用戶與環(huán)境等
④系統(tǒng)模塊、總流程圖等
⑤功能性需求
⑥性能性需求
7.模塊設(shè)計(jì)
①分析模塊流程
②根據(jù)需求確定輸入、輸出及處理邏輯
③設(shè)計(jì)用戶界面
④面向?qū)ο蟮脑O(shè)計(jì)方法[UML(統(tǒng)一建模語言),時(shí)序圖,狀態(tài)圖,類圖等]
⑤以數(shù)據(jù)為中心的設(shè)計(jì)方法(數(shù)據(jù)建模)
8.MVC與分層設(shè)計(jì)(具體可網(wǎng)上查閱)
①M(fèi)VC(Model-View-Controller):MVC是一種架構(gòu)型模式,它本身并不引入新的功能,只是用來指導(dǎo)我們改善應(yīng)用程序的架構(gòu),使得應(yīng)用的模型和視圖相分離,從而達(dá)到更好的開發(fā)和維護(hù)效率。在MVC模式中,應(yīng)用程序被劃分成模型(Model)、視圖(View)和控制器(Controller)三個(gè)部分。其中,模型部分包含了應(yīng)用程序的業(yè)務(wù)邏輯和業(yè)務(wù)數(shù)據(jù);視圖部分封裝了應(yīng)用程序的輸出形式(頁面、界面);而控制器部分負(fù)責(zé)協(xié)調(diào)模型和視圖,根據(jù)用戶請(qǐng)求來選擇要調(diào)用哪個(gè)模型來處理業(yè)務(wù),以及最終由哪個(gè)視圖為用戶做出應(yīng)答。MVC模式的這三個(gè)部分的職責(zé)非常明確,而且相互分離,每個(gè)部分都可以獨(dú)立的改變而不影響其他部分,大大提高了應(yīng)用的靈活性和重用性。
②為什么分層:便于重用、維護(hù)。
③三層結(jié)構(gòu)及各層次的結(jié)構(gòu):業(yè)務(wù)邏輯層(Service):不要出現(xiàn)直接的數(shù)據(jù)訪問;傳進(jìn)來一組數(shù)據(jù),根據(jù)傳進(jìn)來的參數(shù)和業(yè)務(wù)邏輯的要求把業(yè)務(wù)邏輯實(shí)現(xiàn),最后把要顯示的數(shù)據(jù)傳遞出去。業(yè)務(wù)邏輯層是重用性最高的一層,是核心。
④這里想說一下Struts2的MVC:推薦一篇博客:Struts2與MVC基礎(chǔ)入門
9.ER/Studio(專業(yè)的數(shù)據(jù)建模工具):
ERStudio:ERStudio是優(yōu)秀的數(shù)據(jù)庫建模軟件,它不僅可以建立表、視圖等模型,還可以建立多表間各種關(guān)系的模型,另外還可以根據(jù)模型生成表到數(shù)據(jù)庫。
使用體會(huì):在這次的學(xué)習(xí)中,使用頻率較多的一個(gè)軟件就是ERStudio了。在此之前每次做項(xiàng)目時(shí),因?yàn)閿?shù)據(jù)量都比較小,基本10張表左右,因此都沒有使用過建模工具,一個(gè)初步的分析后就開始直接建表;之前一直會(huì)遇到的問題是在開發(fā)中對(duì)表結(jié)構(gòu)的修改是比較麻煩的,就算只有10張表左右,比如修改了某張表名后,與其相關(guān)聯(lián)的表都要去修改,比較麻煩;而且很難看出表與表之間的聯(lián)系,容易遺漏東西。而在這種中大型項(xiàng)目中(在這個(gè)項(xiàng)目中只做了三個(gè)模塊就已經(jīng)有30張表了),如果沒有提前進(jìn)行一個(gè)好的表結(jié)構(gòu)設(shè)計(jì)的話,對(duì)后面的維護(hù)將是災(zāi)難性的。所以如果有一個(gè)好的建模工具就可以解決這些問題了。
表關(guān)聯(lián)設(shè)計(jì):如果我們對(duì)數(shù)據(jù)庫擁有完全的控制權(quán)限,創(chuàng)建數(shù)據(jù)庫時(shí),可以不用考慮表之間的關(guān)聯(lián),因?yàn)閿?shù)據(jù)庫維護(hù)關(guān)聯(lián)關(guān)系會(huì)消耗一定的資源。我們可以通過程序來維護(hù)即可。
可以看看下圖使用ERStudio建立的邏輯模型:我們可以通過圖形界面很清晰的了解模塊劃分、表結(jié)構(gòu)、表之間的關(guān)聯(lián)(這里并沒有很嚴(yán)謹(jǐn)?shù)脑O(shè)計(jì)表之間的關(guān)聯(lián),主要通過程序來維護(hù))等等。我們?nèi)绻枰R時(shí)修改一個(gè)字段或是關(guān)聯(lián)關(guān)系等,可以很容易的修改。而且最方便的是可以直接將該邏輯模型生成物理模型并導(dǎo)出sql文件,直接導(dǎo)入數(shù)據(jù)庫就可以使用了。ERStudio連上數(shù)據(jù)庫后,還可以把數(shù)據(jù)庫中的表拉到可視化建模界面顯示,表與表之間的聯(lián)系能夠清晰地展現(xiàn)出來。
10.編碼的一些技巧
①可直接使用Spring的字符編碼過濾器來設(shè)置UTF-8格式,雖然以前學(xué)過,但在實(shí)際使用時(shí)就忘了Spring還有這個(gè)功能,每次都是自己建立一個(gè)過濾器來設(shè)置字符編碼。
1 <filter> 2 <filter-name>CharacterEncodingFilter</filter-name> 3 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 4 <init-param> 5 <param-name>encoding</param-name> 6 <param-value>UTF-8</param-value> 7 </init-param> 8 </filter> 9 <filter-mapping> 10 <filter-name>CharacterEncodingFilter</filter-name> 11 <url-pattern>/*</url-pattern> 12 </filter-mapping>②寫一個(gè)系統(tǒng)初始化類實(shí)現(xiàn)ServletContextListener來加載系統(tǒng)初始化需要的數(shù)據(jù)以及啟動(dòng)一個(gè)定時(shí)器來定時(shí)清除系統(tǒng)日志等功能。系統(tǒng)公用的東西(如系統(tǒng)標(biāo)題)可寫在配置文件里,系統(tǒng)初始化時(shí)就加載進(jìn)來。
③系統(tǒng)用戶表一般會(huì)設(shè)置一個(gè)用戶狀態(tài),如啟動(dòng),停用,刪除等狀態(tài)。一般來說,刪除用戶不會(huì)真正刪除用戶信息,而是設(shè)置其狀態(tài)為刪除狀態(tài)。角色也是一樣,會(huì)有一個(gè)狀態(tài)信息,如果停用了就要禁止該角色下的權(quán)限。
④如果我們對(duì)數(shù)據(jù)庫擁有完全的控制權(quán)限,創(chuàng)建數(shù)據(jù)庫時(shí),可以不用考慮表之間的關(guān)聯(lián),因?yàn)閿?shù)據(jù)庫維護(hù)關(guān)聯(lián)關(guān)系會(huì)消耗一定的資源。我們可以通過程序來維護(hù)即可。
⑤權(quán)限系統(tǒng)獨(dú)立出來成一個(gè)模塊或項(xiàng)目,以方便以后可以重用。
⑥寫一個(gè)BaseAction來放置一些常用的request,resposne等等,其它的action類如果要用到這些資源可以直接繼承BaseAction。
?
⑦利用好struts的標(biāo)簽庫。<%@ taglib uri="/struts-tags" prefix="s"%>
?可以用其來按需求顯示某些數(shù)據(jù)或者模塊。比如:<s:if test=" ">...</s:if> ?<s:elseif test=" ">...</s:elseif>
?以及利用好c標(biāo)簽來做頁面的一些判斷處理。比如:<c:choose><c:when test="${status.first}">...</c:when><c:otherwise>...</c:otherwise></c:choose>
1 <c:url value="${ctx}/mobileBasic_delete.action" var="delUrl"> 2 <c:param name="table" value="basic_config"></c:param> 3 <c:param name="id" value="${config.id}"></c:param> 4 </c:url> 5 <a href="${delUrl}" onclick="return confirm('確定要?jiǎng)h除嗎?');">刪除</a> 6 //這種方式也可以對(duì)中文進(jìn)行編碼⑧測(cè)試的時(shí)候記得經(jīng)常清空瀏覽器緩存(尤其是js文件更改后),否則某些數(shù)據(jù)一直測(cè)試不正常。以及,測(cè)試的時(shí)候個(gè)人覺得最好還是用火狐瀏覽器,用好火狐的firebug能節(jié)省很多時(shí)間。
⑨以前一般點(diǎn)擊某些功能簡(jiǎn)單的按鈕時(shí),會(huì)用js來實(shí)現(xiàn)。現(xiàn)在才意識(shí)到還可以這樣:
例如使用input按鈕來簡(jiǎn)單跳轉(zhuǎn)頁面:<input type="button" class="btn cancel" value="取消" οnclick="location='menu_menuDetail.action?menu.id=${menu.id}'"/>
⑩不要忘了可以自定義標(biāo)簽來處理某些問題,代替某些js代碼以及<%= %>。與jsp頁面整體統(tǒng)一。自定義標(biāo)簽一是可以自定義類繼承SimpleTagSupport,在doTag方法里實(shí)現(xiàn)邏輯處理,此種方式需要在xml中配置tag。另一種方式是在靜態(tài)類中寫一個(gè)靜態(tài)方法處理邏輯,此種方式需要在xml中配置function,前臺(tái)的書寫方式則是:${my:dateFormat(beginDate)}
可參考個(gè)人博客:JSP自定義標(biāo)簽/自定義標(biāo)簽打包
以及,自定義注解、自定義攔截器、自定義標(biāo)簽等配合使用能更方便的編程。
?字符串處理時(shí),StringBuilder速度更快,但是線程不安全的。SringBuffer是線程安全的,速度相比較慢。
?在類似于easyui這類框架下,我們點(diǎn)擊菜單按鈕跳轉(zhuǎn)的頁面往往是跳轉(zhuǎn)到一個(gè)iframe中,但如果有這么一個(gè)業(yè)務(wù)需求:修改密碼/退出系統(tǒng),需要返回到首頁,但如果直接讓struts的result跳轉(zhuǎn)到首頁時(shí),首頁則顯示到iframe中了,我們的需求是整個(gè)窗口刷新。這里有三種方法:
⑴js獲取該按鈕,利用ajax來實(shí)現(xiàn),在action中處理后,返回時(shí)利用window.top.location = “”; 即可。
⑵使用一個(gè)臨時(shí)頁面,result配置轉(zhuǎn)到該頁面后,立即跳轉(zhuǎn)。
⑶還有一種則是,臨時(shí)生成一個(gè)腳本代碼跳轉(zhuǎn):這種方式就非常簡(jiǎn)單了,以前怎么就沒想到呢,反正都是通過js來跳轉(zhuǎn)。
out.print(“<script type=’text/javascript’>top.location=index.action</script>”);
out.close();
?注銷與退出系統(tǒng)的區(qū)別:注銷系統(tǒng):清除用戶信息,返回首頁;退出系統(tǒng):清除用戶信息,關(guān)閉瀏覽器。
?利用mybatis-generator自動(dòng)生成javabean,sqlMap,dao等,就像利用HIbernate反向生成一樣。我們使用建模工具建好邏輯模型后,生成物理模型,導(dǎo)出sql文件,再導(dǎo)入數(shù)據(jù)庫,然后利用這個(gè)插件就可以自動(dòng)生成javabean,sqlMap,dao等,極其方便。具體怎么安裝插件和使用,這里給出一個(gè)百度鏈接:mybatis generator eclipse插件的安裝
?日期:我們選擇日期如2016-05-03 這個(gè)代表的是5月3日0時(shí),即5月2日一整天,所以邏輯上我們?nèi)绻@取5月3日的數(shù)據(jù)時(shí),還需要加上一天的時(shí)間。
?使用Navicat查詢創(chuàng)建工具完成復(fù)雜SQL構(gòu)建:
?項(xiàng)目完成后可以將工具類留存。
?
11.遇到的一些小問題
①mybatis聯(lián)合查詢(association)的配置問題及某些細(xì)節(jié):查看個(gè)人博客:MyBatis關(guān)聯(lián)查詢 (association) 時(shí)遇到的某些問題/mybatis映射
②一次偶然的斷網(wǎng)條件下,啟動(dòng)系統(tǒng)發(fā)現(xiàn)報(bào)了如下錯(cuò)誤:
1 DEBUG - Loaded schema mappings: {http://mybatis.org/schema/mybatis-spring-1.2.xsd=org/mybatis/spring/config/mybatis-spring-1.2.xsd, 2 http://www.springframework.org/schema/util/spring-util.xsd=org/springframework/beans/factory/xml/spring-util-3.1.xsd, 3 http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd=org/springframework/web/servlet/config/spring-mvc-3.1.xsd, 4 ....................................網(wǎng)上查了下,原因是斷網(wǎng)后,applicationContext.xml配置文件中指定的xsd文件讀取不到了——也就是說xsd每次都是從網(wǎng)上讀取的?
當(dāng)然這是不怎么可取的,具體解決辦法參考這個(gè)博客:Spring如何加載XSD文件。我這里出錯(cuò)的原因是版本不一致導(dǎo)致的。
③一定要將action配置@Scope(value="prototype"),配置成原型模式的,否則就算你重定向也會(huì)有意向不到的問題,會(huì)將原來的數(shù)據(jù)帶到新的頁面去。
④MyBatis的<foreach ></foreach>標(biāo)簽:
當(dāng)collection為L(zhǎng)ist<Map<String,Object>>的時(shí)候,而且我們要使用map的key和value,如下使用item:
<foreach collection="mapList" item="item" separator=",">
(#{item.key},#{item.value})
</foreach>
當(dāng)遍歷的集合collection為Map<String, Object>時(shí),要使用key和value,如下使用:
<foreach collection="map" index="key" item="value" separator=",">
(#{key},#{roleId},#{value})
</foreach>
⑤登出系統(tǒng)時(shí),要清空session所有信息。request.getSession().invalidate();//注:此處必須使用原始的session,不能使用框架的Map<> session,那只是個(gè)映射.
⑥表單設(shè)置為disabled="disabled"時(shí),將無法提交該表單數(shù)據(jù),可以設(shè)置為readonly
<input type="text" readonly="readonly" name="supplier.id" value="${supplier.id}"/>
⑦Jstl標(biāo)簽可以用在js中,但只能在jsp文件的js中,外部js文件不可用。
1 <c:forEach items="${mobileTypeList}" var="mobType"> 2 if("${mobType.id}" == mobileTypeId){ 3 $("#refPrice").html("¥${mobType.buyPrice}"); 4 } 5 </c:forEach>?
12.關(guān)于JSON使用的一些問題
①從服務(wù)端返回的json格式數(shù)據(jù) 鍵/值都必須用雙引號(hào)(無論是json文件,還是json數(shù)據(jù)),不要用單引號(hào),否則會(huì)出現(xiàn)一些意想不到的問題,像數(shù)據(jù)解析不正確等。
看官網(wǎng)的說明:
正確格式:JSON數(shù)據(jù)格式
?②Spring的json插件:
以前一直都是使用JSONObject,JSONArray來得到j(luò)son格式數(shù)據(jù)。這次發(fā)現(xiàn)還可以直接添加一個(gè)json插件,就可以很輕松的返回json數(shù)據(jù)了。
步奏:
⑴添加struts2-json-plugin-2.3.28.jar包
⑵修改配置文件(注意綠色的地方)
1 <package name="dev" namespace="/" extends="json-default"> 2 <action name="menu_*" class="menuAction" method="{1}"> 3 <result name="menuTree" type="json"></result> 4 </action> 5 </package>⑶Action中將要轉(zhuǎn)化成json的數(shù)據(jù)放在全局中(成員變量)。不必在方法內(nèi)像JSONObject那樣轉(zhuǎn)成字符串再輸出。
//使用JSONObject轉(zhuǎn)換數(shù)據(jù) JSONObject jsonObject = new JSONObject(); //將data轉(zhuǎn)換為json格式數(shù)據(jù) String result = jsonObject.fromObject(data).toString(); //返回 response.write(result);⑷在前臺(tái)獲取的時(shí)候,注意需要從data里面取出來,因?yàn)榇藭r(shí)的data中可能包含多個(gè)數(shù)據(jù):
function(data){
?? var json= [data.key];
}
⑸插件原理:在返回到前臺(tái)時(shí),框架會(huì)自動(dòng)將有g(shù)et方法的成員變量轉(zhuǎn)換成json格式數(shù)據(jù)返回(所以在action中不要將具體邏輯方法名帶get,還有Action中的service成員也不要設(shè)置get方法,否則極容易出錯(cuò)。如果非要帶get,可以在這個(gè)方法上加注解;@JSON(serialize=false),使其不要序列化,就不會(huì)轉(zhuǎn)成json了)。
這種插件方式比使用JSONObject雖然更方便,但不容易控制,JSONObject可以控制具體輸出的類容。
1 JSONObject jsonObject = new JSONObject(); 2 //json配置 3 JsonConfig config = new JsonConfig(); 4 //設(shè)置需要過濾掉的字段 5 config.setExcludes(new String[]{"subMenuList"}); 6 //得到j(luò)son數(shù)據(jù) 7 String result = jsonObject.fromObject(menuTree, config).toString();而且使用JsonConfig可以注冊(cè)轉(zhuǎn)換器,比如將Date對(duì)象轉(zhuǎn)換成字符串。
注冊(cè)轉(zhuǎn)換器:config.registerDefaultValueProcessor(target, defaultValueProcessor);
13.switch…case…
變量的使用:
?
switch(此處數(shù)據(jù)類型):switch后面的括號(hào)里面只能放int(byte,short,char)類型和String類型的數(shù)據(jù)
case后的數(shù)據(jù)類型不能為Integer:
?
14.MyBatis、iBatis、Hibernate:具體區(qū)別百度
ibatis:半自動(dòng)ORM框架,需手動(dòng)寫sql語句;開發(fā)效率相對(duì)于hibernate較低,但是更靈活,適應(yīng)性更廣泛(在企業(yè)開發(fā)中,我們可能不能完全去控制數(shù)據(jù)庫結(jié)構(gòu) );
mybatis:MyBatis 最強(qiáng)大的特性之一就是它的動(dòng)態(tài)語句功能。其前身就是ibatis。
Hibernate:由hibernate自動(dòng)生成sql語句;hibernate則需要在符合一定規(guī)范(如數(shù)據(jù)庫結(jié)構(gòu)必須規(guī)范)下才能發(fā)揮它的最大效用。
15.mybatis緩存:默認(rèn)情況下是沒有開啟緩存的,除了局部的 session 緩存(一級(jí)緩存),可以增強(qiáng)變現(xiàn)而且處理循環(huán)依賴也是必須的。要開啟二級(jí)緩存,需要在你的 SQL 映射文件中添加一行:<cache/>
?
?
四、項(xiàng)目相關(guān)資料
項(xiàng)目打包文件:手機(jī)進(jìn)銷存系統(tǒng)
視頻分享:北風(fēng)網(wǎng)-手機(jī)進(jìn)銷存系統(tǒng)?
注意所有視頻及資料僅供學(xué)習(xí)使用!!!
然后,說一下此時(shí)此刻的感受,通過自學(xué)學(xué)習(xí)的東西雖然有點(diǎn)多,但也比較雜,不能形成一套系統(tǒng)性的知識(shí)鏈;而且,越是到后面就越不想再學(xué)下去,主要是現(xiàn)在所學(xué)的東西沒能有地方使用,有點(diǎn)類似于一身武藝沒有用武之地的感覺。以前一直礙于學(xué)校的課程和其它的瑣事沒有找工作,雖然有做過一些課程上的小項(xiàng)目,但都不能滿足我。大三馬上就結(jié)束了,所以還是盡快找個(gè)工作,也只有在工作中才能用我所學(xué),也能學(xué)到更多新東西,學(xué)習(xí)才更有動(dòng)力、更有激情!
?
轉(zhuǎn)載于:https://www.cnblogs.com/chiangchou/p/project-mobilescm.html
總結(jié)
以上是生活随笔為你收集整理的手机进销存系统/供应链管理系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 多线程的单元测试工具 - GroboUt
- 下一篇: 《信息安全系统设计基础》 实验五