版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
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 開(kāi)發(fā)的最佳實(shí)踐</p>
62、;<p> Palaniyappan Thiagarajan, Pagadala Suresh</p><p><b> Struts:簡(jiǎn)介</b></p><p> Struts 是一種開(kāi)源框架,可用來(lái)構(gòu)建 Web 應(yīng)用程序,它基于流行的 Model-View-Controller (MVC2) 設(shè)計(jì)范型。該框架構(gòu)建在一些標(biāo)準(zhǔn)的技術(shù)之上,比如 J
63、ava Servlets、JavaBeans、ResourceBundles 和 XML,并且可提供靈活和可擴(kuò)展的組件。Struts 以ActionServlet 的形式實(shí)現(xiàn)了 Controller 層,并建議使用 JSP 標(biāo)記庫(kù)構(gòu)建 View 層。Struts 通過(guò) Action 類提供了圍繞 Model 層的包裝器。圖 1 展示了基于 Model-View-Controller 設(shè)計(jì)的 Struts 框
64、架。</p><p> 圖 1. Struts 和 MVC</p><p> Struts 組件概覽</p><p> 首先,我們?cè)谧罴褜?shí)踐上下文中解釋 Struts 組件,以及它們?cè)?Web 應(yīng)用程序開(kāi)發(fā)中所起的作用。</p><p><b> Action</b></p><p>
65、應(yīng)用程序的每個(gè) Action 都會(huì)擴(kuò)展 Struts 的 org.apache.struts.action.Action 類。這些 Action 類為應(yīng)用程序的 Model 層提供了一個(gè)接口,充當(dāng)圍繞業(yè)務(wù)邏輯的包裝器。每個(gè) Action 類都必須向 perform() 方法提供其特定于用例的實(shí)現(xiàn)。perform() 方法經(jīng)常返回
66、類型 ActionForward 的一個(gè)值。</p><p> ActionForm</p><p> 應(yīng)用程序的 ActionForm 擴(kuò)展了 Struts 的 org.apache.struts.action.ActionForm 類。ActionForm 是一些封裝和驗(yàn)證請(qǐng)求參數(shù)的簡(jiǎn)單 JavaBean。要驗(yàn)證
67、請(qǐng)求數(shù)據(jù),ActionForm 的 validate() 方法必須給出一個(gè)特定于該情況的實(shí)現(xiàn)。ActionForm 作為運(yùn)載工具,向Action 類提供請(qǐng)求數(shù)據(jù)。一個(gè) JSP 對(duì)象與各自的 ActionForm 對(duì)象相結(jié)合,構(gòu)成應(yīng)用程序的 View 層。在該層,幾乎 JSP 對(duì)象的每個(gè)表單字段都映射到相應(yīng)的 ActionForm 的屬性。</
68、p><p><b> JSP 定制標(biāo)記庫(kù)</b></p><p> JSP 定制標(biāo)記庫(kù)是用標(biāo)記表示的一組行為的集合。這是 JSP Specification 1.1 的一個(gè)強(qiáng)大特性;它將其他應(yīng)用程序?qū)拥谋硎緟^(qū)別了開(kāi)來(lái)。這些庫(kù)易于使用,而且可以以一種類似 XML 的方式來(lái)讀取。只要盡量少地在其中使用 Java scriptlet,就可以輕松維護(hù) JSP 組件。Strut
69、s 提供的 JSP 標(biāo)記包括 HTML、邏輯和 bean 標(biāo)記。</p><p> ActionErrors</p><p> 可以使用 ActionError 來(lái)支持異常處理。ActionError 捕捉應(yīng)用程序異常,并將其傳送給 View 層。每個(gè)異常都是一個(gè) ActionError實(shí)例的集合。ActionError 可以封裝錯(cuò)誤消
70、息,而 Presentation 層中的 </html:errors> 可以呈現(xiàn) ActionError 集合內(nèi)的所有錯(cuò)誤消息。</p><p> 最佳實(shí)踐 1. 跨多個(gè) ActionForm 重用數(shù)據(jù)</p><p> 熟悉了 Struts 組件之后,就可以繼續(xù)學(xué)習(xí)如何充分利用這一框架。首先,Struts 建議將每個(gè) JSP 對(duì)象與
71、一個(gè) ActionForm 相關(guān)聯(lián),后者可以封裝屏幕上顯示的數(shù)據(jù)??梢酝ㄟ^(guò) ActionForm 內(nèi)的附加方法來(lái)訪問(wèn) JSP 對(duì)象內(nèi)的表單數(shù)據(jù)。清單 1 展示了 ActionForm 標(biāo)記在 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> 這個(gè) ActionForm 被稱為 “BP1AForm”,它包括屬性 attrib1&
73、#160;及其 getter 和 setter 方法。在配置文件 struts-config.xml 中,行為 “/bp1” 通過(guò) name 屬性映射到 bp1AForm。這有助于在 JSP 中顯示數(shù)據(jù)。</p><p> 要實(shí)現(xiàn)這一最佳實(shí)踐,Struts 建議您進(jìn)行以下兩個(gè)操作:</p><p> 創(chuàng)建一個(gè) JavaBean(BP1B
74、Form),且其屬性是 BP1AForm 屬性的子集,還要?jiǎng)?chuàng)建這些屬性的 getter 和 setter 方法。</p><p> 通過(guò)將這個(gè) bean 與 BP1AForm 關(guān)聯(lián),用 bean BP1BForm 的屬性替代 BP1AForm 中的屬性。現(xiàn)在就可以通過(guò) BP1BForm 訪問(wèn)BP1AForm
75、60;中的屬性子集了。清單 2 展示了訪問(wèn)的方式。</p><p> 清單 2. 訪問(wèn) 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> 最佳實(shí)踐 2. 使用 Action 類處理請(qǐng)求</p><p> 通常,在使用這個(gè) Struts 框架時(shí),對(duì)于 JSP 組件請(qǐng)求應(yīng)用程序執(zhí)行的每個(gè)動(dòng)作,應(yīng)用程序都必須擴(kuò)展 Struts 的org.apache.struts.action.Action 以創(chuàng)建 Action 類。在處理請(qǐng)求時(shí)
78、,單個(gè)的 Action 類與應(yīng)用程序的 Model 層連接。</p><p> 要實(shí)現(xiàn)這一最佳實(shí)踐,Struts 建議您遵循以下步驟:</p><p> 通過(guò)擴(kuò)展 org.apache.struts.action.Action 創(chuàng)建一個(gè) Action 類,比如 BP2Action。</p><p&
79、gt; 通過(guò)擴(kuò)展 BP2Action 在 Web 應(yīng)用程序中創(chuàng)建所有其他 Action 類。</p><p> 在 BP2Action 類中創(chuàng)建一個(gè)方法 performTask(),就像在公共抽象類 ActionForward performTask(ActionMapping mapping, ActionForm form,
80、HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException 中一樣。</p><p> 在 BP2Action 類中向應(yīng)用程序添加一個(gè)或多個(gè)泛型方法,比如 serverSideValidate()。考慮以下因素后決定方法的訪問(wèn)修飾符:</
81、p><p> 如果所有 Action 類都必須實(shí)現(xiàn)此方法,則讓其為抽象。</p><p> 如果某些 Action 類提供一個(gè)特定的實(shí)現(xiàn),則將此方法聲明為受保護(hù),并給它一個(gè)默認(rèn)實(shí)現(xiàn)。</p><p> 在 BP2Action 類中,將方法 perform() 聲明為 final。調(diào)用上
82、述的泛型方法(通常在處理請(qǐng)求前調(diào)用該方法)?,F(xiàn)在調(diào)用 步驟 3 中創(chuàng)建的方法 performTask()。</p><p> 在每個(gè)擴(kuò)展 BP2Action 的 Action 類,添加具有特定實(shí)現(xiàn)的方法 performTask()。</p><p><b> 優(yōu)勢(shì)</b></p&
83、gt;<p> 這一實(shí)踐有兩個(gè)主要優(yōu)勢(shì)。首先,它避免了 Web 應(yīng)用程序中每個(gè) Action 類的冗余代碼。其次,通過(guò)將 Action 類的行為集中在一起,使應(yīng)用程序能夠更多地控制通用的任務(wù)。</p><p> 最佳實(shí)踐 3. 使用 ActionForm 處理會(huì)話數(shù)據(jù)</p><p> 在一個(gè)基于 Struts 的 Web 應(yīng)用程
84、序中,每個(gè) ActionForm 都擴(kuò)展 org.apache.struts.action.ActionForm 類。這些 ActionForm 封裝頁(yè)面數(shù)據(jù),并提供一個(gè)驗(yàn)證框架來(lái)驗(yàn)證請(qǐng)求參數(shù)。</p><p> 大多數(shù) Web 應(yīng)用程序都在會(huì)話中保持?jǐn)?shù)據(jù),使其在整個(gè)應(yīng)用程序過(guò)程中可用。這種最佳實(shí)踐實(shí)現(xiàn)了這種 Web 應(yīng)用程序特性。它允許方法
85、;toSession() 和 fromSession() 將會(huì)話數(shù)據(jù)移動(dòng)到表單數(shù)據(jù)或從表單數(shù)據(jù)移回。因此,它實(shí)現(xiàn)了在 Web 應(yīng)用程序中保持會(huì)話數(shù)據(jù)。</p><p> 要遵循一最佳實(shí)踐,執(zhí)行以下步驟:</p><p> 通過(guò)擴(kuò)展 org.apache.struts.action.ActionForm 創(chuàng)建一個(gè)名為 BP3Fo
86、rm 的抽象類。</p><p> 在 BP3Form 類中,添加具有訪問(wèn)修飾語(yǔ)的方法,就像在公共抽象類 void toSession(SessionData sessionData) 和 void fromSession(SessionData sessionData) 中一樣。</p><p> 在每個(gè)
87、;ActionForm 類中,擴(kuò)展 BP3Form 并實(shí)現(xiàn)這些抽象方法(表單數(shù)據(jù)通過(guò)它們傳遞到會(huì)話或從會(huì)話傳回)。</p><p> 相應(yīng)的 Action 類可以決定這些方法的調(diào)用順序。例如,可以在決定 actionForward 之前調(diào)用 ActionForm 上的方法toSession()。</p>&l
88、t;p><b> 何時(shí)使用這一實(shí)踐</b></p><p> 這一實(shí)踐最適用于:會(huì)話數(shù)據(jù)是單一對(duì)象和/或每個(gè)頁(yè)操作或使用會(huì)話數(shù)據(jù)。</p><p> 最佳實(shí)踐 4. 有效處理異常</p><p> 傳統(tǒng)地,當(dāng)在 Action 類中發(fā)生應(yīng)用程序異常時(shí),異常首先被寫(xiě)入日志。然后此類創(chuàng)建一個(gè) ActionE
89、rror 并在合適的作用域中存儲(chǔ)它。然后 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)的異常處理過(guò)程在每個(gè) Action 類中保存異常信息,而最佳實(shí)踐 4 則在處理異常時(shí)避免冗余代碼。</p><p> 要使用這一最佳實(shí)踐,Struts 建議您遵循以下步驟:</p><p> 通過(guò)擴(kuò)展
93、;org.apache.struts.action.Action 創(chuàng)建一個(gè) Action 類,比如 BP4Action。</p><p> 通過(guò)擴(kuò)展 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)用泛型方法(這些方法總是在處理請(qǐng)求前調(diào)用)?,F(xiàn)在調(diào)用在
96、前一個(gè)步驟中創(chuàng)建的 performTask()。</p><p> 在每個(gè) Action 類中實(shí)現(xiàn)方法 performTask() 的同時(shí)(通過(guò)擴(kuò)展 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() 之后,通過(guò) saveErrors(request, errors) 保存 ActionErrors。</p><p><b> 優(yōu)勢(shì)</b></p><p> 這一實(shí)踐主要的優(yōu)勢(shì)是:避
100、免了每個(gè)處理 ActionErrors 的 Action 類中的代碼冗余。</p><p><b> 結(jié)束語(yǔ)</b></p><p> 對(duì)開(kāi)發(fā)團(tuán)隊(duì)而言,構(gòu)建易于維護(hù)的 Web 應(yīng)用程序是一項(xiàng)非常具有挑戰(zhàn)性的任務(wù)。使用 Struts 等成熟的框架有助于實(shí)現(xiàn)通常與構(gòu)建應(yīng)用程序相關(guān)的基礎(chǔ)設(shè)施代碼。Struts 框架提供了一組標(biāo)準(zhǔn)接
101、口,用于將業(yè)務(wù)邏輯插入到應(yīng)用程序中。此外,還提供了一種跨開(kāi)發(fā)團(tuán)隊(duì)的一致機(jī)制,用于執(zhí)行用戶數(shù)據(jù)驗(yàn)證、屏幕導(dǎo)航等任務(wù),以及用于簡(jiǎn)化開(kāi)發(fā)屏幕的一組定制標(biāo)記庫(kù)。</p><p> 本文給出的 4 種最佳實(shí)踐對(duì)您充分利用這種框架的特性十分重要。它們不僅能夠提高代碼的模塊化程度和應(yīng)用程序的可重用性,還能減少代碼冗余。對(duì)于構(gòu)建可擴(kuò)展的 Web 應(yīng)用程序,這是至關(guān)重要的。</p><p> 本文譯自:
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 風(fēng)險(xiǎn)基礎(chǔ)審計(jì)的最佳實(shí)踐【外文翻譯】
- struts外文翻譯
- jsp最佳實(shí)踐外文翻譯@中英文翻譯@外文文獻(xiàn)翻譯
- 外文資料翻譯---struts 和 tiles 輔助基于組件的開(kāi)發(fā)
- struts-mvc外文翻譯
- servlets 和 jsp pages最佳實(shí)踐經(jīng)驗(yàn)【外文翻譯】
- 定義能增加企業(yè)價(jià)值的公司治理最佳實(shí)踐【外文翻譯】
- 電子評(píng)估的最佳方法【外文翻譯】
- 五個(gè)最佳降低供應(yīng)商財(cái)務(wù)風(fēng)險(xiǎn)的實(shí)踐方法【外文翻譯】
- 資源特征,開(kāi)采成本,最佳開(kāi)發(fā)利用礦產(chǎn)資源【外文翻譯】
- 最佳人才評(píng)價(jià)措施【外文翻譯】
- 企業(yè)最佳的融資結(jié)構(gòu)的研究【外文翻譯】
- 外文翻譯----apd偏壓電路的最佳設(shè)計(jì)
- 外文翻譯----apd偏壓電路的最佳設(shè)計(jì)
- 存貨管理控制最佳實(shí)務(wù)【外文翻譯】
- 外文翻譯--存貨管理控制最佳實(shí)務(wù)
- 成本降低與控制的最佳做法【外文翻譯】
- 探究最佳的財(cái)務(wù)業(yè)績(jī)估量方法【外文翻譯】
- 何為最佳家族企業(yè)規(guī)劃【外文翻譯】
- 外文翻譯---一種基于hibernate、struts和spring的j2ee應(yīng)用開(kāi)發(fā)框架
評(píng)論
0/150
提交評(píng)論