![軟件工程設計模式基礎_第1頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/12/97237544-b48d-4cae-8c5a-2f998d6aa4de/97237544-b48d-4cae-8c5a-2f998d6aa4de1.gif)
![軟件工程設計模式基礎_第2頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/12/97237544-b48d-4cae-8c5a-2f998d6aa4de/97237544-b48d-4cae-8c5a-2f998d6aa4de2.gif)
![軟件工程設計模式基礎_第3頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/12/97237544-b48d-4cae-8c5a-2f998d6aa4de/97237544-b48d-4cae-8c5a-2f998d6aa4de3.gif)
![軟件工程設計模式基礎_第4頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/12/97237544-b48d-4cae-8c5a-2f998d6aa4de/97237544-b48d-4cae-8c5a-2f998d6aa4de4.gif)
![軟件工程設計模式基礎_第5頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/12/97237544-b48d-4cae-8c5a-2f998d6aa4de/97237544-b48d-4cae-8c5a-2f998d6aa4de5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、軟件工程與設計模式1、 UML 方面標準建模語言UML 。用例圖,靜態(tài)圖(包括類圖、對象圖和包圖),行為圖,交互圖 (順序圖,合作圖),實現(xiàn)圖。2、 軟件開發(fā)的3、j2ee常用的設計模式?說明工廠模式??偣?23 種,分為三大類:創(chuàng)建型,結(jié)構型,行為型我只記得其中常用的6、 7 種,分別是:創(chuàng)建型(工廠、工廠方法、抽象工廠、單例)結(jié)構型(包裝、適配器,組合,代理)行為(觀察者,模版,策略)然后再針對你熟悉的模式談談你的理解即可。Java中的23種設計模式:Factory (工廠模式), Builder (建造模式), Factory Method (工廠方法模式),Prototype (原始模
2、型模式),Singleton (單例模式),Facade (門面模式),Adapter (適配器模式),式),Decorator (裝飾模式),Command (命令模式),式),Iterator (迭代子模式),式),Observer (觀察者模式),Bridge (橋梁模式),F(xiàn)lyweight (享元模式),Interpreter (解釋器模式),Mediator (調(diào)停者模式),State (狀態(tài)模式),Composite (合成模Proxy (代理模式),Visitor (訪問者模Memento (備忘錄模Strategy (策略模式),Template Method (模板方法模式
3、), Chain Of Responsibleity (責任鏈模式)工廠模式:工廠模式是一種經(jīng)常被使用到的模式,根據(jù)工廠模式實現(xiàn)的類可 以根據(jù)提供的數(shù)據(jù)生成一組類中某一個類的實例,通常這一組類有一個公共的 抽象父類并且實現(xiàn)了相同的方法,但是這些方法針對不同的數(shù)據(jù)進行了不同的 操作。首先需要定義一個基類,該類的子類通過不同的方法實現(xiàn)了基類中的方 法。然后需要定義一個工廠類,工廠類可以根據(jù)條件生成不同的子類實例。當 得到子類的實例后,開發(fā)人員可以調(diào)用基類中的方法而不必考慮到底返回的是 哪一個子類的實例。4、開發(fā)中都用到了那些設計模式?用在什么場合?每個模式都描述了一個在我們的環(huán)境中不斷出現(xiàn)的問題,
4、然后描述了該問題的解決方案的核心。通過這種方式,你可以無數(shù)次地使用那些已有的解決方案,無需在重復相同的工作。主要用到了MVC 的設計模式。用來開發(fā)JSP/Servlet或者J2EE的相關應用。簡單工廠模式等。流行的框架與新技術1、談談你對Struts 的理解。答:1. struts是一個按MVC模式設計的Web層框架,其實它就是一個大大的 servlet,這個 Servlet名為 ActionServlet,或是 ActionServlet 的子類。我們可以 在web.xml文件中將符合某種特征的所有請求交給這個Servlet處理,這個Servlet再參照一個配置文件(通常為/WEB-INF/
5、struts-config.xml )將各個請求 分別分配給不同的action 去處理。一個擴展知識點:struts的配置文件可以有多個,可以按模塊配置各自的配 置文件,這樣可以防止配置文件的過度膨脹;2 . ActionServlet把請求交給action去處理之前,會將請求參數(shù)封裝成一個 formbean對象(就是一個java類,這個類中的每個屬性對應一個請求參數(shù)), 封裝成一個什么樣的formbean對象呢?看配置文件。3 .要說明的是, ActionServlet把formbean對象傳遞給action的execute方法 之前,可能會調(diào)用formbean的validate方法進行校驗
6、,只有校驗通過后才將這 個formbean對象傳遞給action的execute方法,否則,它將返回一個錯誤頁面, 這個錯誤頁面由input 屬性指定,(看配置文件)作者為什么將這里命名為input屬性,而不是error屬性,我們后面結(jié)合實際的運行效果進行分析。4 .action執(zhí)行完后要返回顯示的結(jié)果視圖,這個結(jié)果視圖是用一個ActionForward 對象來表示的,actionforward 對象通過struts-config.xml 配置文件中的配置關聯(lián)到某個jsp 頁面,因為程序中使用的是在struts-config.xml 配置文件為jsp頁面設置的邏輯名,這樣可以實現(xiàn)action程
7、序代碼與返回的jsp頁面名稱的解耦。你對struts可能還有自己的應用方面的經(jīng)驗,那也要一并說出來2、談談你對 Hibernate的理解。答 :1. 面向?qū)ο笤O計的軟件內(nèi)部運行過程可以理解成就是在不斷創(chuàng)建各種新對 象、建立對象之間的關系,調(diào)用對象的方法來改變各個對象的狀態(tài)和對象消亡的過程,不管程序運行的過程和操作怎么樣,本質(zhì)上都是要得到一個結(jié)果,程序上一個時刻和下一個時刻的運行結(jié)果的差異就表現(xiàn)在內(nèi)存中的對象狀態(tài)發(fā)生 了變化。2 .為了在關機和內(nèi)存空間不夠的狀況下,保持程序的運行狀態(tài),需要將內(nèi)存中的對象狀態(tài)保存到持久化設備和從持久化設備中恢復出對象的狀態(tài),通常都是保存到關系數(shù)據(jù)庫來保存大量對象信
8、息。從Java程序的運行功能上來講,保存對象狀態(tài)的功能相比系統(tǒng)運行的其他功能來說,應該是一個很不起眼的附屬功能, java 采用 jdbc 來實現(xiàn)這個功能,這個不起眼的功能卻要編寫大量的代碼,而做的事情僅僅是保存對象和恢復對象,并且那些大量的jdbc 代碼并沒有什么技術含量,基本上是采用一套例行公事的標準代碼模板來編寫,是一種苦活和重復性的工作。3 .通過數(shù)據(jù)庫保存java程序運行時產(chǎn)生的對象和恢復對象,其實就是實現(xiàn)了 java對象與關系數(shù)據(jù)庫記錄的映射關系,稱為 ORM (即Object Relation Mapping),人們可以通過封裝JDBC代碼來實現(xiàn)了這種功能,封裝出來的產(chǎn)品 稱之為
9、ORM框架,Hibernate就是其中的一種流行 ORM框架。使用Hibernate 框架,不用寫JDBC代碼,僅僅是調(diào)用一個save方法,就可以將對象保存到關 系數(shù)據(jù)庫中,僅僅是調(diào)用一個 get方法,就可以從數(shù)據(jù)庫中加載出一個對象。4 .使用Hibernate的基本流程是:配置 Configuration對象、產(chǎn)生 SessionFactory創(chuàng)建session對象,啟動事務,完成 CRUD操作,提交事務, 關閉session。5 .使用Hibernate時,先要配置hibernate.cfg.xml文件,其中配置數(shù)據(jù)庫連接 信息和方言等,還要為每個實體配置相應的hbm.xml文件,hibe
10、rnate.cfg.xml文件中需要登記每個hbm.xml 文件。6 .在應用Hibernate時,重點要了解Session的緩存原理,級聯(lián),延遲加載和 hql 查詢。3、 AOP 的作用。4、你對Spring 的理解。1.Spring實現(xiàn)了工廠模式的工廠類(在這里有必要解釋清楚什么是工廠模 式),這個類名為BeanFactory (實際上是一個接口),在程序中通常 BeanFactory的子類ApplicationContext。Spring相當于一個大的工廠類,在其配 置文件中通過bean元素配置用于創(chuàng)建實例對象的類名和實例對象的屬性。2. Spring提供了對IOC良好支持,IOC是一種
11、編程思想,是一種架構藝術, 利用這種思想可以很好地實現(xiàn)模塊之間的解耦。IOC也稱為DI (DepencyInjection ),什么叫依賴注入呢?譬如, Class ProgrammerComputer computer = null;public void code()/Computer computer = new IBMComputer();/Computer computer = beanfacotry.getComputer();computer.write();public void setComputer(Computer computer)puter = computer;另外
12、兩種方式都由依賴,第一個直接依賴于目標類,第二個把依賴轉(zhuǎn)移到工廠上,第三個徹底與目標和工廠解耦了。在spring 的配置文件中配置片段如下:<bean id= ” computer ” class= ” erview.Computer ”></bean><bean id= ” programmer” class= ” erview.Programmer ”><property name= ” computererf”= ” computer ” ></proyp>ert </b
13、ean>3. Spring提供了對AOP技術的良好封裝,AOP稱為面向切面編程,就是系統(tǒng)中有很多各不相干的類的方法,在這些眾多方法中要加入某種系統(tǒng)功能的代碼,例如,加入日志,加入權限判斷,加入異常處理,這種應用稱為 AOPo實現(xiàn) AOP 功能采用的是代理技術,客戶端程序不再調(diào)用目標,而調(diào)用代理類,代理類與目標類對外具有相同的方法聲明,有兩種方式可以實現(xiàn)相同的方法聲明,一是實現(xiàn)相同的接口,二是作為目標的子類在,JDK中采用Proxy類產(chǎn)生動態(tài)代理的方式為某個接口生成實現(xiàn)類,如果要為某個類生成子類,則可以用CGLIBo在生成的代理類的方法中加入系統(tǒng)功能和調(diào)用目標類的相應方法,系統(tǒng)功能的代理以
14、Advice 對象進行提供,顯然要創(chuàng)建出代理對象,至少需要目標類和Advice類。spring提供了這種支持,只需要在spring配置文件中配置這兩個元 素即可實現(xiàn)代理和aop功能,例如,<bean id= ” proxy ” type=” org.spring.framework.aop.ProxyBeanFactory”><property name=” target ” ref= ” ></property>ref= ” ></property><property name= ” advisor </bean>5、談
15、談Struts 中的 Action servlet。6、 Struts 優(yōu)缺點優(yōu)點:1. 實現(xiàn) MVC 模式,結(jié)構清晰,使開發(fā)者只關注業(yè)務邏輯的實現(xiàn)2. 有豐富的tag可以用,Struts的標記庫(Taglib),如能靈活動用,則能大大 提高開發(fā)效率3. 頁面導航使系統(tǒng)的脈絡更加清晰。通過一個配置文件,即可把握整個系統(tǒng)各部分之間的聯(lián)系,這對于后期的維護有著莫大的好處。尤其是當另一批開發(fā)者接手這個項目時,這種優(yōu)勢體現(xiàn)得更加明顯。4. 提供 Exception 處理機制.5. 數(shù)據(jù)庫鏈接池管理6. 支持 I18N缺點轉(zhuǎn)到展示層時,需要配置forward,如果有十個展示層的jsp,需要配置十 次st
16、ruts,而且還不包括有時候目錄、文件變更,需要重新修改 forward , 注意,每次修改配置之后,要求重新部署整個項目,而 tomcate這樣的服 務器,還必須重新啟動服務器二、Struts的Action必需是thread safe方式,它僅僅允許一個實例去處理所有的請求。所以action 用到的所有的資源都必需統(tǒng)一同步,這個就引起了線程安全的問題。測試不方便.Struts的每個Action都同Web層耦合在一起,這樣它的測試依賴于Web容器,單元測試也很難實現(xiàn)。不過有一個Junit的擴展工具Struts 丁6$心2$皿以實現(xiàn)它的單元測試。四、 類型的轉(zhuǎn)換.Struts的FormBean把
17、所有的數(shù)據(jù)都作為String類型,它可以 使用工具Commons-Beanutils進行類型轉(zhuǎn)化。但它的轉(zhuǎn)化都是在 Class級別, 而且轉(zhuǎn)化的類型是不可配置的。類型轉(zhuǎn)化時的錯誤信息返回給用戶也是非常困難的。五、對Servlet的依賴性過強.Struts處理Action時必需要依賴 ServletRequest和 ServletResponse 所有它才i脫不了 Servlet容器。六、前端表達式語言方面.Struts集成了 JSTL,所以它主要使用JSTL的表達式 語言來獲取數(shù)據(jù)??墒荍STL 的表達式語言在Collection 和索引屬性方面處理顯得很弱。7、 對Action執(zhí)行的控制困難
18、.Struts創(chuàng)建一個Action ,如果想控制它的執(zhí)行 順序?qū)浅@щy。甚至你要重新去寫Servlet來實現(xiàn)你的這個功能需求,8、 對Action執(zhí)行前和后的處理.Struts處理Action的時候是基于class的 hierarchies,很又t在action處理前和后進行操作。9、 對事件支持不夠.在struts中,實際是一個表單Form對應一個Action類(或DispatchAction),換一句話說:在Struts中實際是一個表單只能對應一 個事件,struts 這種事件方式稱為 application event, application event和 component ev
19、ent相比是一種粗粒度的事件7、 STRUTS 的應用(如STRUTS 架構 )Struts是采用Java Servlet/JavaServer Pages術,開發(fā) Web應用程序的開放 源碼的 framework。采用 Struts能開發(fā)出基于 MVC(Model-View-Controller)設計 模式的應用構架。Struts有如下的主要功能:一.包含一個controller servlet,能 將用戶的請求發(fā)送到相應的 Action對象。二.JSP自由tag庫,并且在controller servlet中提供關聯(lián)支持,幫助開發(fā)員創(chuàng)建交互式表單應用。三.提供了一系列實用對象:XML處理、
20、通過Java reflection APIs自動處理JavaBeansil性、國際 化的提示和消息。8、說說strutsl與struts2的區(qū)別1 .都是MVC 的 WEB 框架 ,2 struts1的老牌框架,應用很廣泛,有很好的群眾基礎,使用它開發(fā)風險很 小,成本更低! struts2雖然基于這個框架,但是應用群眾并多,相對不成熟,未知的風險和變化很多,開發(fā)人員相對不好招,使用它開發(fā)項目的風險系數(shù)更大,用人成本更高!3 .struts2畢竟是站在前輩的基礎設計出來,它會改善和完善struts1中的一些缺陷,struts1中一些懸而未決問題在struts2得到了解決。4.struts1的前端
21、控制器是一個 Servlet,名稱為ActionServlet, struts2的前端 控制器是一個 filter,在 struts2.0中叫 FilterDispatcher,在 struts2.1 中叫 StrutsPrepareAndExecuteFilte r5.struts1的action需要繼承 Action類,struts2的action可以不繼承任何類; struts1對同一個路徑的所有請求共享一個Action實例,struts2對同一個路徑的每個請求分別使用一個獨立 Action實例對象,所有對于struts2的Action不用考 慮線程安全問題。6.在strutsl中使用f
22、ormbean封裝請求參數(shù),在 struts2中直接使用action的屬 性來封裝請求參數(shù)。7.struts1中的多個業(yè)務方法放在一個 Action中時(即繼承 DispatchAction 時),要么都校驗,要么都不校驗;對于 struts2,可以指定只對某個方法進行 校驗,當一個Action 繼承了 ActionSupport 且在這個類中只編寫了validateXxx()方法,那么則只對Xxx() 方法進行校驗。(一個請求來了的執(zhí)行流程進行分析,struts2是自動支持分模塊開發(fā),并可以 不同模塊設置不同的url前綴,這是通過package的namespac媒實現(xiàn)的; struts2是支
23、持多種類型的視圖;struts2的視圖地址可以是動態(tài)的,即視圖的 名稱是支持變量方式的,舉例,論壇發(fā)帖失敗后回來還要傳遞boardido視圖內(nèi)容顯示方面:它的標簽用 ognl,要el強大很多,在國際化方面支持分 模塊管理,兩個模塊用到同樣的key,對應不同的消息;)與Struts1不同,Struts2對用戶的每一次請求都會創(chuàng)建一個 Action ,所以 Struts2中的Action是線程安全的。給我印象最深刻的是:struts配置文件中的redirect視圖的url不能接受參數(shù), 而struts2配置文件中的redirect視圖可以接受參數(shù)。9、hibernate 中的 update()和
24、saveOrUpdate()的區(qū)另session勺load()和get()的區(qū)另10、簡述Hibernate 和 JDBC 的優(yōu)缺點?如何書寫一個oneto many 配置文件.11、 iBatis 與 Hibernate 有什么不同相同點:屏蔽jdbc api 的底層訪問細節(jié),使用我們不用與jdbc api 打交道,就可以訪問數(shù)據(jù)。jdbc api編程流程固定,還將sql語句與java代碼混雜在了一起,經(jīng)常需要拼湊 sql 語句,細節(jié)很繁瑣。ibatis的好處:屏蔽jdbc api的底層訪問細節(jié);將sql語句與java代碼進行分離; 提供了將結(jié)果集自動封裝稱為實體對象和對象的集合的功能,qu
25、eryForList返回對象集合,用queryForObject返回單個對象;提供了自動將實體對象的屬性傳 遞給 sql 語句的參數(shù)。Hibernate是一個全自動的orm映射工具,它可以自動生成 sql語句,ibatis需要我 們自己在xml配置文件中寫sql語句,hibernate要比ibatis功能負責和強大很多。 因為hibernate自動生成sql語句,我們無法控制該語句,我們就無法去寫特定 的高效率的sqL對于一些不太復雜的sql查詢,hibernate可以很好幫我們完成, 但是,對于特別復雜的查詢,hibernate就很難適應了,這時候用ibatis就是不錯 的選擇,因為ibat
26、is 還是由我們自己寫sql 語句。12、寫Hibernate 的一對多和多對一雙向關聯(lián)的orm 配置 ?13、hibernate 的 inverse屬性的作用?解決方案一,按照Object口數(shù)據(jù)取出數(shù)據(jù),然后自己組 bean解決方案二,對每個表的bean寫構造函數(shù),比如表一要查出field1,field2兩個字段,那么有一個構造函數(shù)就是Bean(type1 filed1,type2field2),然后在hql里面就可以直接生成這個bean了。14、在DAO 中如何體現(xiàn)DAO 設計模式?解決方案一,按照Object口數(shù)據(jù)取出數(shù)據(jù),然后自己組 bean解決方案二,對每個表的bean寫構造函數(shù),比
27、如表一要查出field1,field2兩個字段,那么有一個構造函數(shù)就是Bean(type1 filed1,type2field2),然后在hql里面就可以直接生成這個bean了。15、 spring+Hibernate 中委托方案怎么配置?解決方案一,按照Object口數(shù)據(jù)取出數(shù)據(jù),然后自己組 bean解決方案二,對每個表的bean寫構造函數(shù),比如表一要查出field1,field2兩個字段,那么有一個構造函數(shù)就是Bean(type1 filed1,type2field2),然后在hql里面就可以直接生成這個bean了。16、 spring+Hibernate 中委托方案怎么配置?解決方案一,
28、按照Object口數(shù)據(jù)取出數(shù)據(jù),然后自己組 bean解決方案二,對每個表的bean寫構造函數(shù),比如表一要查出field1,field2兩個字段,那么有一個構造函數(shù)就是Bean(type1 filed1,type2field2),然后在hql里面就可以直接生成這個bean了。17、 hibernate 進行多表查詢每個表中各取幾個字段,也就是說查詢出來的結(jié)果集沒有一個實體類與之對應如何解決;解決方案一,按照Object口數(shù)據(jù)取出數(shù)據(jù),然后自己組 bean解決方案二,對每個表的bean寫構造函數(shù),比如表一要查出field1,field2兩個字段,那么有一個構造函數(shù)就是Bean(type1 file
29、d1,type2field2),然后在hql里面就可以直接生成這個bean了18、 介紹一下Hibernate 的二級緩存按照以下思路來回答:(1)首先說清楚什么是緩存,(2)再說有了hibernate的Session就是一級緩存,即有了一級緩存,為什么還要有二級緩存, (3)最后再說如何配置Hibernate的二級緩存。( 1)緩存就是把以前從數(shù)據(jù)庫中查詢出來和使用過的對象保存在內(nèi)存中(一個數(shù)據(jù)結(jié)構中),這個數(shù)據(jù)結(jié)構通常是或類似 Hashmap當以后要使用某個對象 時,先查詢緩存中是否有這個對象,如果有則使用緩存中的對象,如果沒有則去查詢數(shù)據(jù)庫,并將查詢出來的對象保存在緩存中,以便下次使用。
30、下面是緩存的偽代碼:引出hibernate的第二級緩存,用下面的偽代碼分析了Cache的實現(xiàn)原理Daohashmap map = new map();User getUser(integer id)User user = map.get(id)if(user = null)user = session.get(id);map.put(id,user);return user;DaoCache cache = nullsetCache(Cache cache)this.cache = cacheUser getUser(int id)if(cache!=null)User user = cach
31、e.get(id);if(user =null)user = session.get(id);cache.put(id,user);return user; return session.get(id); (2) Hibernate的Session就是一種緩存,我們通常將之稱為 Hibernate的一級緩 存,當想使用session從數(shù)據(jù)庫中查詢出一個對象時,Sessio也是先從自己內(nèi)部 查看是否存在這個對象,存在則直接返回,不存在才去訪問數(shù)據(jù)庫,并將查詢的結(jié)果保存在自己內(nèi)部。由于 Session代表一次會話過程,一個 Session與一個 數(shù)據(jù)庫連接相關連,所以Session最好不要長時間保持打
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年企業(yè)市場營銷宣傳協(xié)議
- 2025年傳統(tǒng)工藝振興戰(zhàn)略諒解協(xié)議
- 2025年中學食品安全監(jiān)管協(xié)議
- 2025年公共環(huán)境策劃改善協(xié)議
- 2025年導師學員攜手共進協(xié)議書
- 2025年度股權合伙財產(chǎn)分割協(xié)議范例
- 江蘇省2025年土地使用權互換合同
- 2025年臨時辦公設施租賃合同
- 2025年企業(yè)股權融資協(xié)議書規(guī)范文本
- 2025年商業(yè)地產(chǎn)合作協(xié)議標準版
- 發(fā)證機關所在地區(qū)代碼表
- 情商知識概述課件
- 新蘇教版科學六年級下冊全冊教案(含反思)
- 九年級物理總復習教案
- 【64精品】國標蘇少版小學音樂六年級下冊教案全冊
- 汽車座椅骨架的焊接夾具論文說明書
- 前列腺癌臨床路徑(最全版)
- [重慶]房建和市政工程質(zhì)量常見問題防治要點
- 發(fā)電機組自動控制器
- 實習鑒定表1頁
- 翻車機主要技術參數(shù)
評論
0/150
提交評論