國稅辦公系統項目
1 項目撰寫
註意:在寫下面的項目經驗之前;應該在簡歷前面的個人描述那裏把自己在傳智播客學的技術點都描述清楚。
|
|
項目名稱 |
XX國稅局協同辦公平臺 |
項目描述 |
納稅服務系統是XX國稅局協同辦公平臺中的一個子系統。納稅服務系統包括移動客戶端和後臺管理端。
1、 客戶端 客戶端的功能包括會員註冊登錄、個人信息維護、查詢信息、我要咨詢、我要投訴、我要預約、查看易告知信息並可填寫調查問卷。(客戶端包括有android和ios客戶端) 註冊/登錄:用戶可以使用手機號註冊系統並可以使用動態驗證碼和靜態密碼登錄; 個人信息維護:用戶可以修改名稱、頭像、單位、密碼等個人信息; 查詢信息:可以查詢信息發布管理模塊發布的是發布狀態的信息; 我要咨詢:註冊用戶可以在移動端通過填寫咨詢信息,然後提交到系統的納稅咨詢管理中由後臺管理員進行處理;如果有處理結果則用戶可以查看回復結果; 我要投訴:註冊用戶可以在移動端通過填寫投訴內容,然後提交到系統的投訴受理管理中由後臺管理員進行處理;如果有處理結果則用戶可以查看回復結果; 我要預約:註冊用戶可以在移動端通過填寫預約事項、預約內容、地點、時間,然後提交預約到系統的服務預約管理中由後臺對應事項的處理人員進行處理;如果有處理結果則用戶可以查看回復結果; 易告知:可以查看由系統定時發送的催辦和催繳稅的信息; 調查問卷:可以查看由系統推送的調查問卷和自己填寫過的調查問卷內容。
2、 後臺端 後臺端的功能包括會員管理、信息發布管理、納稅咨詢管理、投訴受理管理、預約服務管理、易告知管理、服務調查管理。在後臺開發中以SSH作為開發框架。在會員管理中利用POI導入大量的初始會員數據和導出系統的會員記錄到Excel;在日期輸入上選用了WDatePicker作為日期組件高度自定義日期輸入功能;靈活使用Struts的各類標簽,如復選框標簽Checkboxlist將List/Map等集合的數據叠代並顯示;充分使用ajax的同步與異步方式進行系統功能處理;巧妙的利用Spring中提供的工具類進行業務邏輯操作,如HibernateDaoSupport,WebApplicationContextUtils 會員管理:可以對手機註冊的會員信息進行管理並導入導出; 信息發布管理:在後臺端可以添加信息,然後由特定管理人員進行信息審核並發布,發布後的信息可在移動端展示; 納稅咨詢管理:管理由移動端用戶提交的一些咨詢納稅信息的問題並可以在後臺端進行回復; 投訴受理管理:管理由移動端用戶提交的投訴信息並可以在後臺端進行受理回復;自動受理歷史待受理的投訴;生成年度投訴數3D統計圖表; 預約服務管理:由預約事項和預約服務組成;其中事項對應有特定的處理人,當用戶預約了事項後由該事項對應的處理人進行預約受理。預約的受理情況將在移動端可查看; 易告知管理:主要是在後臺端做一個定時對批量手機號用戶進行信息的推送和告知其納稅信息;易告知的信息類型包含催辦和催繳,當系統定時任務到發布時機將自動推送信息給移動端用戶; 服務調查管理:可以制定系統的調查問卷;問卷形式主要由單選和多選題構成,當問卷制定並發布後用戶可以在移動端填寫調查問卷;管理員可以在系統管理中查看某一問卷的統計情況。 |
項目團隊組成 |
後臺開發人員3名;客戶端開發人員2名(包含android和ios);測試人員1名。 |
開發時間與計劃 |
鑒於同學們往往寫1年的工作經驗;所以項目一在簡歷中的時間跨度大概可以到4-5個月;周期可以如下分配: 需求調研與分析時間:3周 界面設計、美工與數據庫、詳細設計:3周 開發:4周 測試:1周 上線部署、需求變更修改:4周 |
項目開發環境 |
操作系統:windows server 2008 數據庫:Oracle 10g 應用服務器:tomcat/weblogic 開發工具:MyEclipse/Eclipse;Rational Rose;Edraw Max;Power Designer
|
項目職責 |
Team Leader版本: 前期需求收集和整理需求文檔;輔助系統設計師設計系統原型;配合美工根據系統原型進行切圖;根據需求文檔進行詳細設計、數據庫設計;協調項目組開發人員進行開發。在系統功能上開發了會員管理、信息發布管理、投訴受理管理、預約服務管理,編寫客戶端調用接口和文檔;安排測試計劃和整合系統的各個功能模塊並編寫系統相關文檔。
非Team Leader版本: 參與並完善需求、設計文檔中負責開發的功能模塊的UML圖形和功能描述、進行數據庫設計。在開發階段按照項目組的要求獨立完成會員管理、信息發布管理、納稅咨詢管理、投訴受理管理、預約服務管理等功能模塊的開發與測試。配合開發團隊進行聯合調試和編寫系統相關文檔。 |
2 項目面試問題
1、 請描述下你做的項目
納稅服務系統是國稅協同辦公平臺的一個子系統;主要目的是給用戶在移動端上可快速查詢國稅相關信息並可以在後臺對發布的信息進行管理。整個系統包括了移動端和後臺端:在移動端主要是查看國稅局發布的信息、通知、維護個人信息等;而後臺管理功能包括:會員管理、信息發布管理、納稅咨詢管理、投訴受理管理、預約服務管理、易告知管理、服務調查管理。我做了其中的xxx。。。等模塊。
spring和hibernate管理事務有啥區別
1、從編碼上說,hibernate的事務管理是硬編碼,是寫在程序之中的。這就造成了,如果需要調整,就要修改源碼,重新編譯。
2、從事務控制的位置來說: hibernate是持久層框架,事務是控制在持久層的,這樣就造成了越權操作。事務應放在業務層,而非持久層
3、從代碼維護上來說:hibernate控制事務,需要在每個需要事務支持的地方編寫代碼,後期維護不便。
簡單介紹一下你對spring的理解?
任何框架在植入項目之中都不能帶來效率的提升,反而是會帶來效率的下降。因為java核心機制的問題,內存中多創建一個對象,就會造成性能降低。
但是,spring帶來的好處還是顯而易見的:
1、它的核心之一IoC控制反轉,降低了我們程序的耦合度,使我們可以把項目設計成為一個可插拔的組件式工程。
2、它的另一大核心AOP面向切面,使我們在開發過程中,精力得到釋放,可以更專註的去理解客戶的需求。並且在後期維護時,可以只維護很少的一部分。
利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,可以更專註的去理解客戶的需求同時提高了開發的效率。
3、它提供的事務管理機制,采用聲明的方式來配置事務,從而在維護時無需改動源碼,解決了程序硬編碼的弊端。
4、它提供的DAO模板使我們的持久層開發又多了一種途徑。
5、它可以整合其他時下流行的框架,使我們在管理項目時,更加清晰,明確。
並且以現在計算機的水平,使用spring框架造成的這點下降對程序的影響是微乎其微的。
所以,總體來說spring框架的使用還是利大於弊的。
Spring是幹嘛的?
它是一個full-stack框架,提供了從表現層到業務層再到持久層的一套完整的解決方案。我們在項目中可以只使用spring一個框架,它就可以提供表現層的mvc框架,持久層的Dao框架。
它的兩大核心IoC和AOP更是為我們程序解耦和代碼簡潔易維護提供了支持。
你知道依賴註入麽?簡單介紹一下
首先,明確依賴註入是實現控制反轉的一種思想(另一種是依賴查找)。
其次,在開發過程中,我們需要某個類的實例時,是由使用者為我們提供該類的實例。而不是自己去獲取。
最後,實現依賴註入的方式可以是使用構造方法註入或者set方法註入兩種方式。
在spring中註入的方式就有很多了,比如constructor-arg元素,property元素,p名稱空間等等。
你知道控制反轉麽?簡單介紹一下
它是spring的核心之一。或者說是spring的基礎核心,spring的其余核心功能都必須有IoC的支持。
控制反轉指的是,我們在獲取對象的時候,由之前的主動出擊,變成了被動接收。也就是說,在編寫某個類時,只需要提供一個接口類型的類成員,並不需要關系具體的實現類,而是由使用者在使用時提供。這就降低了類和類之間的耦合度。
2、 結合項目談談你對MVC的理解
MVC是Model—View—Controler的簡稱。即模型—視圖—控制器。MVC是一種設計模式,它強制性的把應用程序的輸入、處理和輸出分開。
MVC中的模型、視圖、控制器它們分別擔負著不同的任務。
視圖: 該部分采用JSP實現,視圖是用戶看到並與之交互的界面。視圖向用戶顯示相關的數據,並接受用戶的輸入。視圖不進行任何業務邏輯處理。
模型: Model部分:由JavaBean組成,ActionForm用於封裝用戶的請求參數,封裝成ActionForm對象,該對象被ActionServlet轉發給Action,Action根據ActionFrom裏面的請求參數處理用戶的請求。JavaBean則封裝了底層的業務邏輯,包括數據庫訪問等。
一個模型能為多個視圖提供數據。這提高了應用程序的重用性
控制器: 控制器接受請求並調用相應的模型去處理請求。
然後根據處理的結果調用相應的視圖來顯示處理的結果。
MVC的處理過程:首先控制器接受用戶的請求,調用相應的模型來進行業務處理,並返回數據給控制器。控制器調用相應的視圖來顯示處理的結果。並通過視圖呈現給用戶。
如在項目中要對應MVC的話:View 對應項目中Jsp,Controler對應Action,Model 對應service+dao層的業務邏輯和持久層的操作。
3、 項目中為什麽使用SSH
1. 使用Struts是因為struts是基於MVC模式的,很好的將應用程序進行了分層,使開發者更關註於業務邏輯的實現;struts有著豐富的標簽庫,能大大提高開發效率。
2. 使用Hibernate:因為hibernate為Java應用提供了一個易用的、高效率的對象關系映射框架(ORM)。hibernate是個輕量級的持久性框架,功能豐富。
3. 使用Spring:因為spring基於IoC(Inversion of Control,反向控制)和AOP構架多層j2ee系統的框架。
4、 挑選一個你做的功能說明SSH框架的應用原理
① 在表現層中,首先通過JSP頁面實現交互界面,負責傳送請求(Request)和接收響應(Response),然後Struts根據配置文件(*-struts.xml)將ActionServlet接收到的Request委派給相應的Action處理。
② 在業務層中,管理服務組件的Spring IoC容器負責向Action提供業務模型(Model)組件和該組件的協作對象數據處理(DAO)組件完成業務邏輯,並提供事務處理、緩沖池等容器組件以提升系統性能和保證數據的完整性。
③ 在持久層中,則依賴於Hibernate的對象化映射和數據庫交互,處理DAO組件請求的數據,並返回處理結果。
結合上面的概述;然後可以把我們做的信息發布管理模塊用上述的方式實例化描述一遍。
5、 Struts工作原理
-----------------------------------按照Struts工作原理圖地說:
1.客戶端發出一個指向servlet容器的請求;
2.請求會經過StrutsPrepareAndExecuteFilter過濾器;
3.過濾器和請求將訪問struts2的底層框架結構。在web容器啟動時,struts2框架會自動加載配置文件裏相關參數,並轉換成相應的類。
如:ConfigurationManager、ActionMapper和ObjectFactory。ConfigurationManager 存有配置文件的一些基本信息,ActionMapper存有action的配置信息。在請求過程中所有的對象(Action,Results,Interceptors,等)都是通過ObjectFactory來創建的。過濾器會通過詢問ActionMapper類來查找請求中需要用到的Action。
4.如果找到需要調用的Action,過濾器會把請求的處理交給ActionProxy。ActionProxy為Action的代理對象。ActionProxy通過ConfigurationManager詢問框架的配置文件,找到需要調用的Action類。
5.ActionProxy創建一個ActionInvocation的實例。ActionInvocation在ActionProxy層之下,它表示了Action的執行狀態,或者說它控制的Action的執行步驟。它持有Action實例和所有的Interceptor。
6.ActionInvocation實例使用命名模式來調用,1. ActionInvocation初始化時,根據配置,加載Action相關的所有Interceptor。2. 通過ActionInvocation.invoke方法調用Action實現時,執行Interceptor。在調用Action的過程前後,涉及到相關攔截器(intercepetor)的調用。
7. 一旦Action執行完畢,ActionInvocation負責根據struts.xml中的配置找到對應的返回結果。
---------------------------------通俗地說:
è發送http請求
èWeb服務器(tomcat/weblogic...)
è執行struts核心過濾器StrutsPrepareAndExecuteFilter
è加載struts配置文件中配置信息,找到對應的Action類並實例化
è執行各類攔截器和Action中對應方法
è配置文件中找到返回結果
è轉發到具體頁面或其它操作
(9)Spring的隔離級別:Default默認的事務隔離級別
READ_UNCOMMITTED讀未提交,一個事務可以操作另外一個未提交的事務,不能避免臟讀,不可重復讀,幻讀,隔離級別最低,並發性 能最高
READ_COMMITTED讀已提交,一個事務不可以操作另外一個未提交的事務, 能防止臟讀,不能避免不可重復讀,幻讀。
repeatable_read能夠避免臟讀,不可重復讀,不能避免幻讀
SERIALIZABLE隔離級別最高,消耗資源最低,代價最高,能夠防止臟讀, 不可重復讀,幻讀。
6. Struts的工作流程;
工作流程:
(1)客戶端提交一個HttpServletRequest請求(action或JSP頁面)。
(2)請求被提交到一系列Filter過濾器,如ActionCleanUp和FilterDispatcher等。
(3)FilterDispatcher是Struts2控制器的核心,它通常是過濾器鏈中的最後一個過濾器.
(4)請求被發送到FilterDispatcher後,FilterDispatcher詢問ActionMapper時候需要調用某個action來處理這個Request。
(5)如果ActionMapper決定需要調用某個action,FilterDispatcher則把請求交給ActionProxy進行處理.
(6)ActionProxy通過Configuration Manager詢問框架的配置文件struts.xml,找到調用的action類。
(7)ActionProxy創建一個ActionInvocation實例,通過代理模式調用Action。
(8)action執行完畢後,返回一個result字符串,此時再按相反的順序通過Intercepter攔截器。
(9)最後ActionInvocation實例,負責根據struts.xml中配置result元素,找到與之相對應的result,決定進一步輸出。
基本簡要流程:
I.客戶端瀏覽器發出HTTP請求。
II.根據web.xml配置,該請求被FilterDispatcher接收。
III.根據struts.xml配置,找到需要調用的Action類和方法, 並通過IoC方式,將值註入給Aciton。
IV.Action調用業務邏輯組件處理業務邏輯,這一步包含表單驗證。
VI.Action執行完畢,根據struts.xml中的配置找到對應的返回結果result,並跳轉到相應頁面。VI.返回HTTP響應到客戶端瀏覽器。
6、 Struts有什麽優缺點
優點:
1. 實現MVC模式,結構清晰;
2. 豐富的struts的標記庫,利用好能大大提高開發效率;
3. 全局結果與聲明式異常;
4. 可使用OGNL進行參數傳遞
5. 各個類方便使用的攔截器
缺點:
在並發量比較大的場景中,.每次請求都要創建一個Action,資源消耗比較大.
1. 轉到表現層時,需要配置結果頁面;頁面多了比較繁雜;
2. 對Servlet的依賴性過強
3. struts標簽稍微比el表達式繁重
使用場景
SSH對於中小型項目提供了一套完整的解決方案.在表關系相對簡單,數據量不大,並發量不高的項目中,能夠極大的提高開發效率.
表關系復雜或數據量比較大時,可以使用Mybatis替換Hibernate.
並發量很高時可以使用SpringMVC替換struts
Spring優缺點:
Spring是一個輕量級的控制反轉(IoC)、面向切面(AOP)、面向接口、事務管理、包容促進其它框架;使系統中用到的其它框架耦合程度大大降低,拓展性強、簡單易用好管理。
1、它的核心之一IoC,降低了我們程序的耦合度,使我們可以把項目設計成為一個可插拔的組件式工程。
2、它的另一大核心AOP,使我們在開發過程中,精力得到釋放,可以更專註的去理解客戶的需求。並且在後期維護時,可以只維護很少的一部分。
3、它提供的事務管理機制,采用聲明的方式來配置事務,從而在維護時無需改動源碼,解決了程序硬編碼的弊端。
4、它提供的DAO模板使我們的持久層開發又多了一種途徑。
5、它可以整合其他時下流行的框架,使我們在管理項目時,更加清晰,明確。
並且以現在計算機的水平,使用spring框架造成的這點下降對程序的影響是微乎其微的。
所以,總體來說spring框架的使用還是利大於弊的。
7、 spring在項目中如何充當粘合劑
1、在項目中利用spring的IOC(控制反轉或依賴註入),明確地定義組件接口(如UserDAO),開發者可以獨立開發各個組件, 然後根據組件間的依賴關系組裝(UserAction依賴於UserService,UserService依賴於UserDAO)運行,很好的把Struts(Action)和hibernate(DAO的實現)結合起來;
2、spring的事務管理把hibernate對數據庫的操作進行了事務配置
8、 描述在系統中如何使用了Spring的事務控制
Spring事務包括編程式事務和聲明式事務。在系統中使用了聲明式的事務管理是用Spring的AOP來實現的;配置了只讀事務和回滾事務(傳播行為為REQUIRED)當出現錯誤後進行回滾操作。在項目中通過aop切入事務到serivce層,這樣做能使一次業務邏輯操作如果包括幾個數據庫操作都控制在一個事務中。
9、 Hibernate工作原理及為什麽要用
原理: 1.讀取並解析配置文件 2.讀取並解析映射信息,創建SessionFactory 3.打開Session 4.創建事務Transation 5.持久化操作 6.提交事務 7.關閉Session 8.關閉SesstionFactory
Hibernate優點: 1. 對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重復性代碼。 2. Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作 3. hibernate使用Java反射機制,而不是字節碼增強程序來實現透明性。 4. hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關系數據庫,從一對一到多對多的各種復雜關系。
(7) 簡潔的HQL編程
(8) ‘(6) 緩存機制,提供一級緩存和二級緩存
hibernate框架是一個ORM的持久層框架,ORM的含義是對象關系映射,簡單理解就是通過對象和關系型數據庫之間建立映射信息,以後再操作對象就相當於操作數據庫了。hibernate框架是對JDBC進行了輕量級的封裝,可以更方便簡單的對數據庫完成增刪改查的操作。同時也提供了查詢的方式和查詢的策略。例如HQL和QBC的查詢方式等。還提供了緩存的策略,效率會更高。
Hibernate缺點:
(1) Hibernate在批量數據處理時有弱勢
10、 Hibernate在系統中使用的優化策略
Hibernate 對數據的緩存包括兩個級:一級緩存,在Session的級別上進行,主要是對象緩存,以其id為鍵保存對象,在Session的生命期間存在;二級緩存, 在SessionFactory的級別上進行,有對象緩存和查詢緩存,查詢緩存以查詢條件為鍵保存查詢結果,在SessionFactory的生命期間存 在。默認地,Hibernate只啟用一級緩存。
關於這個問題答系統使用了Hibernate的二級緩存就好。
11、 列舉你在開發中常用的Struts標簽
property、iterator、if、date、form、a、url、textfiled、textarea、select、radio、checkboxlist、hidden、param
12、 Jquery異步獲取數據的方式有幾種?有何區別?
1、load 載入遠程 HTML 文件代碼並插入至 DOM 中
2、get
3、post
4、ajax
5、getJSON
6、getScript 通過 GET 方式請求載入並執行一個 JavaScript 文件
13、 簡述UML並說明你使用Rose常於什麽情況,畫什麽圖?
Unified Modeling Language (UML) 統一建模語言;用於在軟件開發各個階段中用圖形的方式描述流程和功能需求;IBM Rational Rose是uml建模工具之一比較多的在需求階段,常用於畫用例圖、類圖、時序圖。
14、 請簡述導入導出的工具類;並說明你導出過的最大數據量
POI(合並單元格對象和背景色的應用)
15、 統計圖的實現方式
Fusioncharts 圖表采用SVG(可縮放矢量圖形)實現,無需Flash;跨終端
16、 易告知信息推送方式;如何實現?
在後臺填寫推送信息和推送名單後,系統將自動推送;後臺EE開發人員只實現定時的調用由客戶端開發人員寫的接口推送信息。
17、 簡述調查問卷的制作
不在你填寫的開發功能內的;只需要描述下功能。可以制定調查題目和提供單選和多選兩種類型的選項;並可對調查結果進行統計。
18、 系統的並發量如何?如何解決大並發量的請求?
系統並發量不大;但有在應用服務器中間件Weblogic上做負載均衡的配置。
19、 項目中遇到問題如何解決?
自行解決——網絡搜索——團隊討論解決
20、 簡述你在項目中的開發流程
項目課中的設計和開發都是比較貼近實際開發的,做了的話按照當時的開發情況描述。
3 拓展
1、 使用一種排序算法排序一組數字
冒泡、直接插入、選擇
2、 編寫一個可以體現多線程的例子
3、 編寫一個Singleton類
12. 如何將1個g的數據最快速度放進C盤中?
(1)public class Test01 {
public static void main(String[] args) throws Exception{
getInputStream("C:\\setup.log","D:\\a.txt");
}
private static void getInputStream(String pathName,String copyName)throws Exception{
File file = new File(pathName);
if(!file.exists())
throw new RuntimeException("文件不存在呀,你Copy個屁!");
else{
getCopy(copyName,new BufferedInputStream(new FileInputStream(file)));
}
}
private static void getCopy(String copyName,BufferedInputStream bis)throws Exception{
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(copyName));
BufferedInputStream biss = bis;
byte[] b = new byte[biss.available()];
int len = 0;
while((len = biss.read(b))!=-1){
bos.write(b, 0, len);
}
bos.close();
biss.close();
System.out.println(copyName+"復制成功!");
}
冒泡排序:
public static void bubbleSort(int[] numbers) {
int temp; // 記錄臨時中間值
int size = numbers.length; // 數組大小
for (int i = 0; i < size - 1; i++) {
for (int j = i + 1; j < size; j++) {
if (numbers[i] < numbers[j]) { // 交換兩數的位置
temp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = temp;
}
}
}
}
選擇排序:
public static void selectSort(int[] numbers) {
int size = numbers.length, temp;
for (int i = 0; i < size; i++) {
int k = i;
for (int j = size - 1; j >i; j--) {
if (numbers[j] < numbers[k]) k = j;
}
temp = numbers[i];
numbers[i] = numbers[k];
numbers[k] = temp;
}
}
國稅辦公系統項目