集成Spring和JavaServer Faces:改進的模板

隨著2.0版的發布,Facelet模板成為JSF規范的核心部分。 使用<ui:composition><ui:decorate>標記,可以輕松構建復雜的頁面,同時仍保持標記清晰。 模板在創建HTML表單時特別有用,但是不幸的是,模板的確會在您的xhtml文件中引起重復,從而破壞了良好軟件設計的DRY(不要自己重復)原理 。 作為在JSF和Spring之間提供更深層集成的項目的一部分,我開發了兩個新組件,旨在簡化模板。 在探究新組件之前,讓我們看一下如何使用標準JSF模板構建典型表單。

表單模板的初始起點通常是為每個輸入添加一些模板。 通常,您需要額外的<div>或<span>標記以供CSS使用。 這是一個典型的例子:

<!-- /WEB-INF/pages/entername.xhtml -->
<ui:decoreate template="/WEB-INF/layout/form.xhtml"><h:inputText id="firstName" label="First Name" value="#{bean.firstName}"/><ui:param name="label" value="First Name"/><ui:param name="for" value="firstName"/>
</ui:decorate>
<ui:decoreate template="/WEB-INF/layout/form.xhtml"><h:inputText id="lastName" label="Last Name" value="#{bean.lastName}"/><ui:param name="label" value="Last Name"/><ui:param name="for" value="lastName"/>
</ui:decorate>
<!-- Many additional form elements -->
<!-- /WEB-INF/layout/form.xhtml -->
<ui:composition><div class="formElement"><span class="formLabel"><h:outputLabel for="#{for}" label="#{label}"></span><ui:insert/></div>
</ui:composition>

在這里,我們可以看到表單上的每個項目都包含在<div>中,并且表單標簽被包裹在其他<span>中 。 標記中已經存在一些重復,“ for”參數反映了組件ID。 我還給每個<h:inputText>元素一個標簽屬性
為了獲得更好的驗證錯誤消息,請在“標簽” <ui:param>中重復此操作。 如果我們想用星號標記必填字段,情況會變得越來越糟:

<!-- /WEB-INF/pages/entername.xhtml -->
<ui:decoreate template="/WEB-INF/layout/form.xhtml"><h:inputText id="firstName" label="First Name" value="#{bean.firstName}" required="false"/><ui:param name="label" value="First Name"/><ui:param name="for" value="firstName"/><ui:param name="showAsterisk" value="false"/>
</ui:decorate>
<ui:decoreate template="/WEB-INF/layout/form.xhtml"><h:inputText id="lastName" label="Last Name" value="#{bean.lastName}" required="true"/><ui:param name="label" value="Last Name"/><ui:param name="for" value="lastName"/><ui:param name="showAsterisk" value="true"/>
</ui:decorate>
<!-- Many additional form elements -->
<!-- /WEB-INF/layout/form.xhtml -->
<ui:composition><div class="formElement"><span class="formLabel"><h:outputLabel for="#{for}" label="#{label}#{showAsterisk ? ' *' : ''}"></span><ui:insert/></div>
</ui:composition>

非常令人沮喪的是,我們需要傳遞<ui:param>項,這些項與<h:inputText>上已經指定的屬性重復。 很容易看出,即使是相對較小的表單,我們也將最終在標記中重復很多。 我們需要的是一種獲取有關模板中插入的組件的信息的方法,即使我們不知道組件將是哪種類型。 我們需要的是<s:componentInfo>

<s:componentInfo>組件公開一個變量,其中包含有關所插入組件的信息。 此信息包括標簽 ,組件clientID以及是否需要該組件。 通過檢查插入的項目,我們可以刪除很多重復項:

<!-- /WEB-INF/pages/entername.xhtml -->
<ui:decoreate template="/WEB-INF/layout/form.xhtml"><h:inputText id="firstName" label="First Name" value="#{bean.firstName}" required="false"/>
</ui:decorate>
<ui:decoreate template="/WEB-INF/layout/form.xhtml"><h:inputText id="lastName" label="Last Name" value="#{bean.lastName}" required="true"/>
</ui:decorate>
<!-- Many additional form elements -->
<!-- /WEB-INF/layout/form.xhtml -->
<ui:composition><s:componentInfo var="info"><div class="formElement"><span class="#{info.valid ? 'formLabel' : 'formErrorLabel'}"><h:outputLabel for="#{info.for}" label="#{info.label}#{info.required ? ' *' : ''}"></span><ui:insert/></div></s:componentInfo>
</ui:composition>

我們現在可以做的其他事情就是判斷插入的組件是否通過了驗證。 請注意,上面的示例將為無效的組件選擇“ formErrorLabel ” CSS類。

擁有新的<s:componentInfo>組件的一項有趣功能是,所有<ui:decorate>標記都變得相同。 我們已刪除了標簽內的所有重復,但是標簽本身仍然重復了很多次。 在這里,我們還有另外一個技巧,可以通過引入新的<s:decorateAll>標簽來提供幫助。 使用<s:decorateAll>允許對每個子組件一次應用模板。 這是更新的表單標記:

<!-- /WEB-INF/pages/entername.xhtml -->
<s:decoreateAll template="/WEB-INF/layout/form.xhtml"><h:inputText id="firstName" label="First Name" value="#{bean.firstName}" required="false"/><h:inputText id="lastName" label="Last Name" value="#{bean.lastName}" required="true"/><!-- Many additional form elements -->
</s:decorateAll>
<!-- /WEB-INF/layout/form.xhtml -->
<ui:composition><s:componentInfo var="info"><div class="formElement"><span class="#{info.valid ? 'formLabel' : 'formErrorLabel'}"><h:outputLabel for="#{info.for}" label="#{info.label}#{info.required ? ' *' : ''}"></span><ui:insert/></div></s:componentInfo>
</ui:composition>

如果要查看這些組件的源代碼,請查看springfaces GitHub項目上的org.springframework.springfaces.template.ui軟件包。

參考: 將Spring和JavaServer Faces集成:改進的模板來自Phil Webb博客中的JCG合作伙伴 Phillip Webb。


翻譯自: https://www.javacodegeeks.com/2012/04/integrating-spring-javaserver-faces.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372932.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372932.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372932.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

whmcs模板路徑

whmcs網站根目錄 比如你的域名是server.nongbin.vip&#xff0c;你需要cd /home/wwwroot/server.nongbin.vip&#xff0c;該目錄下然后&#xff0c;cd template/ 給文件夾下就是你上傳的模板文件夾轉載于:https://www.cnblogs.com/nongbin/p/6412108.html

系統英偉達gpu驅動卸載_繞過CPU,英偉達讓GPU直連存儲設備

英偉達最近發布了一個新的GPUDirect Storage&#xff0c;暫且叫做GPU直連存儲&#xff0c;讓GPU直接連到NVMe存儲設備上。這一方案用到了RDMA設備來把數據從閃存存儲轉移到GPU本地的內存里&#xff0c;無需經過CPU還有系統內存。如果這一舉措順利的話&#xff0c;英偉達就能擺脫…

37、EnumSet詳解

EnumSet類也是有順序的&#xff0c;EnumSet按照枚舉值在Enum類內定義的順序決定集合元素的順序 EnumSet在內部已位向量的形式存儲&#xff0c;這種存儲方式非常緊湊、搞笑&#xff0c;因此EnumSet占用內存很小&#xff0c;而且運行效率很好。 EnumSet集合不允許加入null元素 En…

嘲弄和存根–了解Mockito的測試雙打

介紹 我遇到的一件事是使用模擬框架的團隊假設他們在模擬。 他們并不知道Mocks只是Gerard Meszaros在xunitpatterns.com上歸類的“測試雙打”之一。 重要的是要意識到每種類型的測試雙精度在測試中都扮演著不同的角色。 用與您需要學習不同模式或重構的方式相同&#xff0c;您…

numpy 辨異(三)—— hstack/column_stack,linalg.eig/linalg.eigh

1. np.hstack np.column_stack >>> np.hstack([np.array([1, 2, 3]), np.array([4, 5, 6])]) array([1, 2, 3, 4, 5, 6])>>> np.column_stack([np.array([1, 2, 3]), np.array([4, 5, 6])]) array([[1, 4],[2, 5],[3, 6]]) 當然對等地&#xff0c;也存在&…

【代碼筆記】iOS-首頁3張圖片變化

一&#xff0c;效果圖。 二&#xff0c;工程圖。 三&#xff0c;代碼。 RootViewController.h #import <UIKit/UIKit.h>interface RootViewController : UIViewController {NSTimer *timer;UIImageView *imageView1;UIImageView *imageView2;UIImageView *imageView3;UIV…

acwing算法提高之動態規劃--數位DP

目錄 1 基礎知識2 模板3 訓練 1 基礎知識 暫無。。。 2 模板 暫無。。。 3 訓練 題目1&#xff1a;度的數量。 解題思路&#xff1a;分類討論。 C代碼如下&#xff0c; #include <iostream> #include <vector>using namespace std;const int N 35; int K,…

python 輸入數字變成密碼_如何在python中檢查數字的“密碼”

我建議使用sets和stdlib中的string包作為可接受字符的列表。在我還建議進行一點重構&#xff0c;以刪除大量帶有if / else分支的嵌套。在import stringupper set(list(string.uppercase))lower set(list(string.lowercase))numbers set(list(string.digits))while True:npw …

使用Eclipse在Amazon Ec2中部署Java Web應用程序的完整指南

嗨&#xff0c;讀者們&#xff0c; 今天&#xff0c;我將向您展示如何使用Eclipse IDE在Amazon EC2中部署簡單的Java Web應用程序。 在我們開始之前&#xff0c;我們需要一些必需的東西&#xff0c; Eclipse Java EE IDE –您可以從http://www.eclipse.org/downloads/下載&…

jquery的load方法

load方法指定一個界面會顯示在目標的標簽內部 比如MVC的一個分部視圖頁面想要顯示在某個標簽里面&#xff0c;可以寫成 $(標簽ID).load&#xff08;分部視圖名稱,data&#xff09; 其中第二個參數可選&#xff0c;主要是一些需要傳遞到該頁面的數據JSON格式組成&#xff0c;發送…

android 錄音原始文件_音頻采集:Android基于AudioRecord的實現

前言這篇文章簡單介紹下移動端Android系統下利用AudioRecord進行音頻采集方法。按照慣例開始前先提供一份源碼 AudioRecordLib 。AudioRecord采集的核心實現在于 AudioRecordCore.java 這個文件。權限申請想要使用AudioRecord這個API&#xff0c;需要在AndroidManifest.xml的配…

Spring 3和Java EE 6 –不公平和不完整的比較

這篇小文章的初稿標題為“ Spring&#xff06;Java EE –比較蘋果和橙子”。 在撰寫本文時&#xff0c;我了解到可以比較Spring Framework和Java EE&#xff0c;但這始終是不公平且不完整的工作。 Java for Enterprise和Spring Framework的發展緊密地聯系在一起。 兩者相互依存…

xml配置文件推薦方式

1.XML幫助類 /// <summary>/// Xml幫助類/// </summary>public class XmlHelper{/// <summary>/// 保存xml/// </summary>/// <typeparam name"T"></typeparam>/// <param name"path"></param>/// <p…

AFNetWorking https SSL認證

一般來講如果app用了web service , 我們需要防止數據嗅探來保證數據安全.通常的做法是用ssl來連接以防止數據抓包和嗅探 其實這么做的話還是不夠的 。 我們還需要防止中間人攻擊&#xff08;不明白的自己去百度&#xff09;。攻擊者通過偽造的ssl證書使app連接到了偽裝的假冒的…

查看環境列表_Xfce 4.14桌面環境正式發布,想要圖形界面又想節省內存?就它了...

1. Xfce 4.14桌面環境正式發布&#xff0c;它有什么新特性&#xff1f;本文主要講解Xfce 4.14桌面環境正式發布&#xff0c;它有什么新特性。Xfce已經開發了4年多&#xff0c;但是這個周末終于看到了期待已久的Xfce 4.14的發布。Xfce 4.14是這個輕量級桌面環境的最新穩定版本&a…

使用Log4jdbc記錄JDBC操作

當我們開發任何應用程序&#xff0c;完成它或結束其任何模塊時&#xff0c;我們都會開始優化過程。 大多數應用程序都包含數據庫訪問權限&#xff0c;并且如果您使用的是ORM &#xff0c;則可能會使用hibernate 。 優化休眠持久層&#xff0c;要求準備閱讀&#xff0c;理解和評…

android BluetoothAdapter藍牙BLE掃描總結

做室內定位的程序員應該都知道&#xff0c;在Android 5.0之后&#xff0c;google推出了藍牙掃描新接口&#xff0c;我們在實測中發現出一些問題&#xff0c;現在給大家列出&#xff0c;以供參考&#xff1a; 1.android 4.3.1(Build.VERSION_CODES.JELLY_BEAN_MR2)增加的startLe…

卷積神經網絡語音識別_用于物體識別的3D卷積神經網絡

本文提出了一種基于CNN的3D物體識別方法&#xff0c;能夠從3D圖像表示中識別3D物體&#xff0c;并在比較了不同的體素時的準確性。已有文獻中&#xff0c;3D CNN使用3D點云數據集或者RGBD圖像來構建3D CNNs&#xff0c;但是CNN也可以用于直接識別物體體積表示的體素。本文中&am…

段落排版--對齊(text-aliagn)

想為塊狀元素中的文本、圖片設置居中樣式嗎&#xff1f;可以使用text-align樣式代碼&#xff0c;如下代碼可實現文本居中顯示。(那么什么是塊狀元素呢&#xff1f;后面會講到呢~) h1{text-align:center; } <h1>了不起的蓋茨比</h1> 同樣可以設置居左&#xff1a; h…

Java 7:在不丟失數據的情況下關閉NIO.2文件通道

關閉異步文件通道可能非常困難。 如果您將I / O任務提交到異步通道&#xff0c;則需要確保正確執行了任務。 實際上&#xff0c;出于多種原因&#xff0c;這對于異步通道可能是一個棘手的要求。 默認的通道組使用守護進程線程作為工作線程&#xff0c;這不是一個好選擇&#xf…