2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩8頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、<p>  Best practices for Struts development</p><p>  Palaniyappan Thiagarajan, Pagadala Suresh</p><p>  Struts: A brief introduction</p><p>  Struts, an open source framework y

2、ou can use to build Web applications, is based on the popular Model-View-Controller (MVC2) design paradigm. The framework is built upon standard technologies like Java Servlets, JavaBeans, ResourceBundles, and XML, and i

3、t provides flexible and extensible components. Struts implements the Controller layer in the form of ActionServlet and recommends building the View layer using JSP tag libraries. Struts also provides a wrapper

4、around the Model layer throughAction</p><p>  Figure 1. Struts and MVC</p><p>  Overview of Struts components</p><p>  First, we'll explain the Struts components in the context

5、of best practices and the role each one plays in your Web application development.</p><p><b>  Action</b></p><p>  Every Action of your application extends Struts' 

6、;org.apache.struts.action.Action. These Action classes provide an interface to the application's Model layer, acting as a wrapper around the business logic. Each Action class must provide its case

7、-specific implementation to the perform() method. The perform() method always returns a value of type ActionForward.</p><p>  ActionForm</p><p>  Every ActionForm&#

8、160;of your application extends Struts' org.apache.struts.action.ActionForm. ActionForms are simple JavaBeans that encapsulate and validate request parameters. To validate your request data, your Actio

9、nForm's validate() method must give a case-specific implementation. ActionForms serve as a carrier of request data to the Action class. A JSP object combines with a respective ActionForm

10、 to form your application's View layer, where almost every form field of the JSP object maps to an a</p><p>  JSP custom tag libraries</p><p>  The JSP custom tag libraries are a collec

11、tion of actions presented as tags. This is a powerful feature of the JSP Specification 1.1; it allows you to separate presentation from other application tiers. The libraries are easy to use and you can read them in XML-

12、like fashion. You can easily maintain the JSP components by minimizing the use of Java scriptlets in them. The JSP tags that Struts provides include HTML, logic, and bean tags.</p><p>  ActionErrors</p>

13、;<p>  You use ActionErrors to support exception handling. An ActionError traps and propagates an application exception to the View layer. Each one is a collection of ActionError instances

14、. ActionErrors encapsulate error messages, while the </html:errors> in the Presentation layer renders all error messages in the ActionError collection.</p><p>  Best Practice 1

15、. Reuse data across multiple ActionForms</p><p>  Now that you are familiar with the Struts components, we will continue by showing you ways to get the most out of the framework. First, Struts recommends tha

16、t you associate every JSP object with an ActionForm, which encapsulates data represented in the screen. You access the form data in the JSP object using accessory methods found in ActionForm. Listing 1 shows th

17、e conventional use of ActionForm tag in the View layer.</p><p>  Listing 1. Using ActionForm in JSP</p><p>  <html:form action="/bp1"></p><p>  <html:te

18、xt property="attrib1" /></p><p>  </html:form ></p><p>  The ActionForm called "BP1AForm" includes the attribute attrib1, as well as its getter and s

19、etter methods. In the configuration filestruts-config.xml, the action "/bp1" maps to bp1AForm using the name attribute. This facilitates data display in the JSP.</p><p>  To imp

20、lement this best practice, Struts recommends you do two things:</p><p>  Create a JavaBean (BP1BForm) with attributes that form an attribute subset in BP1AForm, along with the attributes' getter and

21、 setter methods.</p><p>  Replace the attributes in BP1AForm with the bean BP1BForm by associating the bean with BP1AForm. Now you can access this attribute subset in BP1AForm&#

22、160;through BP1BForm. Listing 2 shows you how.</p><p>  Listing 2. Accessing form attributes in JSP</p><p>  <html:form action="/bp1"></p><p>  <bean:define

23、name="bp1AForm" property="bp1BForm" id="bp1B"</p><p>  type="com.ibm.dw.webarch.struts.BP1BForm" /></p><p>  <html:text name="bp1B" prope

24、rty="subsetAtt1" /></p><p>  </html:form ></p><p>  Best Practice 2. Use Action class to handle requests</p><p>  Typically when using the Struts framework, for e

25、very action the JSP component requests your application to execute, the application must extend Struts' org.apache.struts.action.Action to create an Action class. This individual Action 

26、class interfaces with the application's Model layer while processing the request.</p><p>  To implement this practice, Struts recommends you follow these steps:</p><p>  Create an Actio

27、n class, say BP2Action, by extending org.apache.struts.action.Action.</p><p>  Create all other Action classes in your Web application by extending BP2Action.</p><p&g

28、t;  In BP2Action, create a method performTask(), as in public abstract ActionForward performTask(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOE

29、xception, ServletException.</p><p>  In BP2Action add one or more generic methods to the application, for example serverSideValidate(). You can decide on the method's access modifier by co

30、nsidering the following factors:</p><p>  If all Action classes must implement this method, make it abstract.</p><p>  If some Action classes will provide a case-specific imp

31、lementation, declare the method protected and give it a default implementation.</p><p>  In BP2Action, declare method perform() as final. Invoke the above generic method, which must always be

32、called before processing the request. Now call the method performTask() created in step 3.</p><p>  In every Action class extending BP2Action, add method performTask() 

33、;with a case-specific implementation.</p><p>  Advantages</p><p>  This practice has two main advantages. First, it helps you avoid redundant code in every Action class of your Web app

34、lication. Second, it gives the application more control over generic tasks by centralizing the behavior in one Action class.</p><p>  Best Practice 3. Use ActionForm to work on session data</p&g

35、t;<p>  In a Struts-based Web application, each ActionForm extends org.apache.struts.action.ActionForm. These ActionForms encapsulate page data and provide a validation framework to validate re

36、quest parameters.</p><p>  Most Web applications maintain data in session to make them available throughout the application. This best practice addresses this Web application feature. It allows methods 

37、toSession() and fromSession() to move session data to and from the form data. Thus, it addresses session data maintenance in a Web application.</p><p>  To adhere to this practice, follow thes

38、e steps:</p><p>  Create an abstract class named BP3Form by extending org.apache.struts.action.ActionForm.</p><p>  In BP3Form, add methods with access modifiers as in public

39、 abstract void toSession(SessionData sessionData) and void fromSession(SessionData sessionData).</p><p>  In every ActionForm, extend BP3Form and implement the abstract methods

40、in which the form data is transported to and from the session.</p><p>  The corresponding Action class may determine the order in which these methods are called. For example, you could invoke metho

41、d toSession() on the ActionForm just before actionForward is determined.</p><p>  When to use this practice</p><p>  This practice is most useful when session data

42、is maintained as a single object and/or every page manipulates or uses session data.</p><p>  Best Practice 4. Handle exceptions effectively</p><p>  Conventionally, when an application exceptio

43、n occurs in an Action class, the exception is first logged. Then the class creates anActionError and stores it in the appropriate scope. This Action class then forwards control to the appropriate

44、 ActionForward. Listing 3 shows how Action class handles exceptions.</p><p>  Listing 3. Exception handling in an Action class</p><p><b>  try {</b></p><p&g

45、t;  //Code in Action class</p><p><b>  }</b></p><p>  catch (ApplicationException e) {</p><p>  //log exception</p><p>  ActionErrors actionErrors = new Act

46、ionErrors();</p><p>  ActionError actionError = new ActionError(e.getErrorCode());</p><p>  actionErrors.add(ActionErrors.GLOBAL_ERROR, actionError);</p><p>  saveErrors(request, ac

47、tionErrors);</p><p><b>  }</b></p><p>  While conventional exception handling procedures save exception information in every Action class, best practice 4 aims to avoid red

48、undant code while handling exceptions.</p><p>  To use this practice, Struts recommends following these steps:</p><p>  Create an Action class, say BP4Action, by extending or

49、g.apache.struts.action.Action.</p><p>  Create all other Action classes in your Web application by extending BP4Action.</p><p>  In BP4Action, declare variable ActionErr

50、ors actionErrors = new ActionErrors();.</p><p>  In BP4Action, create a method performTask() as in public abstract ActionForward performTask(ActionMapping mapping, ActionForm form, HttpSe

51、rvletRequest request, HttpServletResponse response, ActionErrors actionErrors) throws IOException, ServletException.</p><p>  In BP4Action, declare method perform() as final. Then invoke gener

52、ic methods, which must always be called before processing the request. Now you can call the method performTask() created in the previous step.</p><p>  While implementing method performTask()&

53、#160;in every Action class (by extending BP4Action), handle application exceptions as shown in Listing 4.</p><p>  Listing 4. Using ActionErrors effectively</p><p><b>  try

54、 {</b></p><p>  //Code in Action class</p><p><b>  }</b></p><p>  catch(ApplicationException appException) {</p><p>  //Log exception</p><

55、p>  //Add error to actionErrors</p><p>  actionErrors.add(ActionErrors.GLOBAL_ERROR,</p><p>  new ActionError(appException.getErrorCode()));</p><p><b>  }</b></p&g

56、t;<p>  In BP4Action, after invoking the method performTask(), save the ActionErrors using saveErrors(request, errors).</p><p>  Advantages</p><p>  This practice

57、's main advantage is that it avoids code redundancy in every Action class that handles ActionErrors.</p><p>  In conclusion</p><p>  Building an easily maintainable Web applic

58、ation can be one of the most challenging tasks for a development team. Using a mature framework like Struts helps you implement the infrastructure code normally associated with building an application. The Struts framewo

59、rk provides a set of standard interfaces for plugging business logic into the application, a consistent mechanism across development teams for performing tasks such as user data validation, screen navigation, and so fort

60、h, as well as a se</p><p>  These four best practices are important for you to extract more from the framework's features. You, as a developer, can benefit from these lessons to increase your code modula

61、rity and application reusability, plus minimize code redundancy. These are all critical to building an extensible Web application.</p><p><b>  譯文</b></p><p>  Struts 開發(fā)的最佳實踐</p>

62、;<p>  Palaniyappan Thiagarajan, Pagadala Suresh</p><p><b>  Struts:簡介</b></p><p>  Struts 是一種開源框架,可用來構(gòu)建 Web 應(yīng)用程序,它基于流行的 Model-View-Controller (MVC2) 設(shè)計范型。該框架構(gòu)建在一些標準的技術(shù)之上,比如 J

63、ava Servlets、JavaBeans、ResourceBundles 和 XML,并且可提供靈活和可擴展的組件。Struts 以ActionServlet 的形式實現(xiàn)了 Controller 層,并建議使用 JSP 標記庫構(gòu)建 View 層。Struts 通過 Action 類提供了圍繞 Model 層的包裝器。圖 1 展示了基于 Model-View-Controller 設(shè)計的 Struts 框

64、架。</p><p>  圖 1. Struts 和 MVC</p><p>  Struts 組件概覽</p><p>  首先,我們在最佳實踐上下文中解釋 Struts 組件,以及它們在 Web 應(yīng)用程序開發(fā)中所起的作用。</p><p><b>  Action</b></p><p>  

65、應(yīng)用程序的每個 Action 都會擴展 Struts 的 org.apache.struts.action.Action 類。這些 Action 類為應(yīng)用程序的 Model 層提供了一個接口,充當圍繞業(yè)務(wù)邏輯的包裝器。每個 Action 類都必須向 perform() 方法提供其特定于用例的實現(xiàn)。perform() 方法經(jīng)常返回

66、類型 ActionForward 的一個值。</p><p>  ActionForm</p><p>  應(yīng)用程序的 ActionForm 擴展了 Struts 的 org.apache.struts.action.ActionForm 類。ActionForm 是一些封裝和驗證請求參數(shù)的簡單 JavaBean。要驗證

67、請求數(shù)據(jù),ActionForm 的 validate() 方法必須給出一個特定于該情況的實現(xiàn)。ActionForm 作為運載工具,向Action 類提供請求數(shù)據(jù)。一個 JSP 對象與各自的 ActionForm 對象相結(jié)合,構(gòu)成應(yīng)用程序的 View 層。在該層,幾乎 JSP 對象的每個表單字段都映射到相應(yīng)的 ActionForm 的屬性。</

68、p><p><b>  JSP 定制標記庫</b></p><p>  JSP 定制標記庫是用標記表示的一組行為的集合。這是 JSP Specification 1.1 的一個強大特性;它將其他應(yīng)用程序?qū)拥谋硎緟^(qū)別了開來。這些庫易于使用,而且可以以一種類似 XML 的方式來讀取。只要盡量少地在其中使用 Java scriptlet,就可以輕松維護 JSP 組件。Strut

69、s 提供的 JSP 標記包括 HTML、邏輯和 bean 標記。</p><p>  ActionErrors</p><p>  可以使用 ActionError 來支持異常處理。ActionError 捕捉應(yīng)用程序異常,并將其傳送給 View 層。每個異常都是一個 ActionError實例的集合。ActionError 可以封裝錯誤消

70、息,而 Presentation 層中的 </html:errors> 可以呈現(xiàn) ActionError 集合內(nèi)的所有錯誤消息。</p><p>  最佳實踐 1. 跨多個 ActionForm 重用數(shù)據(jù)</p><p>  熟悉了 Struts 組件之后,就可以繼續(xù)學(xué)習(xí)如何充分利用這一框架。首先,Struts 建議將每個 JSP 對象與

71、一個 ActionForm 相關(guān)聯(lián),后者可以封裝屏幕上顯示的數(shù)據(jù)??梢酝ㄟ^ ActionForm 內(nèi)的附加方法來訪問 JSP 對象內(nèi)的表單數(shù)據(jù)。清單 1 展示了 ActionForm 標記在 View 層中的傳統(tǒng)方法。</p><p>  清單 1. 使用 ActionForm</p><p>  <html:form ac

72、tion="/bp1"></p><p>  <html:text property="attrib1" /></p><p>  </html:form ></p><p>  這個 ActionForm 被稱為 “BP1AForm”,它包括屬性 attrib1&

73、#160;及其 getter 和 setter 方法。在配置文件 struts-config.xml 中,行為 “/bp1” 通過 name 屬性映射到 bp1AForm。這有助于在 JSP 中顯示數(shù)據(jù)。</p><p>  要實現(xiàn)這一最佳實踐,Struts 建議您進行以下兩個操作:</p><p>  創(chuàng)建一個 JavaBean(BP1B

74、Form),且其屬性是 BP1AForm 屬性的子集,還要創(chuàng)建這些屬性的 getter 和 setter 方法。</p><p>  通過將這個 bean 與 BP1AForm 關(guān)聯(lián),用 bean BP1BForm 的屬性替代 BP1AForm 中的屬性。現(xiàn)在就可以通過 BP1BForm 訪問BP1AForm

75、60;中的屬性子集了。清單 2 展示了訪問的方式。</p><p>  清單 2. 訪問 JSP 中的表單屬性</p><p>  <html:form action="/bp1"></p><p>  <bean:define name="bp1AForm" property="bp1BForm&

76、quot; id="bp1B"</p><p>  type="com.ibm.dw.webarch.struts.BP1BForm" /></p><p>  <html:text name="bp1B" property="subsetAtt1" /></p><p&

77、gt;  </html:form ></p><p>  最佳實踐 2. 使用 Action 類處理請求</p><p>  通常,在使用這個 Struts 框架時,對于 JSP 組件請求應(yīng)用程序執(zhí)行的每個動作,應(yīng)用程序都必須擴展 Struts 的org.apache.struts.action.Action 以創(chuàng)建 Action 類。在處理請求時

78、,單個的 Action 類與應(yīng)用程序的 Model 層連接。</p><p>  要實現(xiàn)這一最佳實踐,Struts 建議您遵循以下步驟:</p><p>  通過擴展 org.apache.struts.action.Action 創(chuàng)建一個 Action 類,比如 BP2Action。</p><p&

79、gt;  通過擴展 BP2Action 在 Web 應(yīng)用程序中創(chuàng)建所有其他 Action 類。</p><p>  在 BP2Action 類中創(chuàng)建一個方法 performTask(),就像在公共抽象類 ActionForward performTask(ActionMapping mapping, ActionForm form,

80、HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException 中一樣。</p><p>  在 BP2Action 類中向應(yīng)用程序添加一個或多個泛型方法,比如 serverSideValidate()。考慮以下因素后決定方法的訪問修飾符:</

81、p><p>  如果所有 Action 類都必須實現(xiàn)此方法,則讓其為抽象。</p><p>  如果某些 Action 類提供一個特定的實現(xiàn),則將此方法聲明為受保護,并給它一個默認實現(xiàn)。</p><p>  在 BP2Action 類中,將方法 perform() 聲明為 final。調(diào)用上

82、述的泛型方法(通常在處理請求前調(diào)用該方法)?,F(xiàn)在調(diào)用 步驟 3 中創(chuàng)建的方法 performTask()。</p><p>  在每個擴展 BP2Action 的 Action 類,添加具有特定實現(xiàn)的方法 performTask()。</p><p><b>  優(yōu)勢</b></p&

83、gt;<p>  這一實踐有兩個主要優(yōu)勢。首先,它避免了 Web 應(yīng)用程序中每個 Action 類的冗余代碼。其次,通過將 Action 類的行為集中在一起,使應(yīng)用程序能夠更多地控制通用的任務(wù)。</p><p>  最佳實踐 3. 使用 ActionForm 處理會話數(shù)據(jù)</p><p>  在一個基于 Struts 的 Web 應(yīng)用程

84、序中,每個 ActionForm 都擴展 org.apache.struts.action.ActionForm 類。這些 ActionForm 封裝頁面數(shù)據(jù),并提供一個驗證框架來驗證請求參數(shù)。</p><p>  大多數(shù) Web 應(yīng)用程序都在會話中保持數(shù)據(jù),使其在整個應(yīng)用程序過程中可用。這種最佳實踐實現(xiàn)了這種 Web 應(yīng)用程序特性。它允許方法 

85、;toSession() 和 fromSession() 將會話數(shù)據(jù)移動到表單數(shù)據(jù)或從表單數(shù)據(jù)移回。因此,它實現(xiàn)了在 Web 應(yīng)用程序中保持會話數(shù)據(jù)。</p><p>  要遵循一最佳實踐,執(zhí)行以下步驟:</p><p>  通過擴展 org.apache.struts.action.ActionForm 創(chuàng)建一個名為 BP3Fo

86、rm 的抽象類。</p><p>  在 BP3Form 類中,添加具有訪問修飾語的方法,就像在公共抽象類 void toSession(SessionData sessionData) 和 void fromSession(SessionData sessionData) 中一樣。</p><p>  在每個 

87、;ActionForm 類中,擴展 BP3Form 并實現(xiàn)這些抽象方法(表單數(shù)據(jù)通過它們傳遞到會話或從會話傳回)。</p><p>  相應(yīng)的 Action 類可以決定這些方法的調(diào)用順序。例如,可以在決定 actionForward 之前調(diào)用 ActionForm 上的方法toSession()。</p>&l

88、t;p><b>  何時使用這一實踐</b></p><p>  這一實踐最適用于:會話數(shù)據(jù)是單一對象和/或每個頁操作或使用會話數(shù)據(jù)。</p><p>  最佳實踐 4. 有效處理異常</p><p>  傳統(tǒng)地,當在 Action 類中發(fā)生應(yīng)用程序異常時,異常首先被寫入日志。然后此類創(chuàng)建一個 ActionE

89、rror 并在合適的作用域中存儲它。然后 Action 類再將控制轉(zhuǎn)交給合適的 ActionForward。清單 3 展示了 Action 類是如何處理異常的。</p><p>  清單 3. Action 類中的異常處理</p><p><b>  try {</b></p><p>

90、;  //Code in Action class</p><p><b>  }</b></p><p>  catch (ApplicationException e) {</p><p>  //log exception</p><p>  ActionErrors actionErrors = new Acti

91、onErrors();</p><p>  ActionError actionError = new ActionError(e.getErrorCode());</p><p>  actionErrors.add(ActionErrors.GLOBAL_ERROR, actionError);</p><p>  saveErrors(request, act

92、ionErrors);</p><p><b>  }</b></p><p>  傳統(tǒng)的異常處理過程在每個 Action 類中保存異常信息,而最佳實踐 4 則在處理異常時避免冗余代碼。</p><p>  要使用這一最佳實踐,Struts 建議您遵循以下步驟:</p><p>  通過擴展 

93、;org.apache.struts.action.Action 創(chuàng)建一個 Action 類,比如 BP4Action。</p><p>  通過擴展 BP4Action 在 Web 應(yīng)用程序中創(chuàng)建所有其他 Action 類。</p><p>  在 BP4Action 中聲明變量 

94、;ActionErrors actionErrors = new ActionErrors();。</p><p>  在 BP4Action 中創(chuàng)建方法 performTask(),就像在公共抽象類 ActionForward performTask(ActionMapping mapping, ActionForm form, HttpServletRequest re

95、quest, HttpServletResponse response, ActionErrors actionErrors) throws IOException, ServletException 中一樣。</p><p>  在 BP4Action 中將方法 perform() 聲明為 final。然后調(diào)用泛型方法(這些方法總是在處理請求前調(diào)用)?,F(xiàn)在調(diào)用在

96、前一個步驟中創(chuàng)建的 performTask()。</p><p>  在每個 Action 類中實現(xiàn)方法 performTask() 的同時(通過擴展 BP4Action),像清單 4 那樣處理應(yīng)用程序異常。</p><p>  清單 4. 有效使用 ActionErrors</p><p><b&g

97、t;  try {</b></p><p>  //Code in Action class</p><p><b>  }</b></p><p>  catch(ApplicationException appException) {</p><p>  //Log exception</p&g

98、t;<p>  //Add error to actionErrors</p><p>  actionErrors.add(ActionErrors.GLOBAL_ERROR,</p><p>  new ActionError(appException.getErrorCode()));</p><p><b>  }</b>

99、</p><p>  在 BP4Action 中,調(diào)用方法 performTask() 之后,通過 saveErrors(request, errors) 保存 ActionErrors。</p><p><b>  優(yōu)勢</b></p><p>  這一實踐主要的優(yōu)勢是:避

100、免了每個處理 ActionErrors 的 Action 類中的代碼冗余。</p><p><b>  結(jié)束語</b></p><p>  對開發(fā)團隊而言,構(gòu)建易于維護的 Web 應(yīng)用程序是一項非常具有挑戰(zhàn)性的任務(wù)。使用 Struts 等成熟的框架有助于實現(xiàn)通常與構(gòu)建應(yīng)用程序相關(guān)的基礎(chǔ)設(shè)施代碼。Struts 框架提供了一組標準接

101、口,用于將業(yè)務(wù)邏輯插入到應(yīng)用程序中。此外,還提供了一種跨開發(fā)團隊的一致機制,用于執(zhí)行用戶數(shù)據(jù)驗證、屏幕導(dǎo)航等任務(wù),以及用于簡化開發(fā)屏幕的一組定制標記庫。</p><p>  本文給出的 4 種最佳實踐對您充分利用這種框架的特性十分重要。它們不僅能夠提高代碼的模塊化程度和應(yīng)用程序的可重用性,還能減少代碼冗余。對于構(gòu)建可擴展的 Web 應(yīng)用程序,這是至關(guān)重要的。</p><p>  本文譯自:

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論