javascript
完整的Web应用程序Tomcat JSF Primefaces JPA Hibernate –第3部分
Primefaces AutoComplete,JSF轉(zhuǎn)換器
這篇文章從第一部分和第二部分繼續(xù)。
 JSF擁有Converter工具,可以幫助我們從用戶視圖中獲取一些數(shù)據(jù)并將其轉(zhuǎn)換為從數(shù)據(jù)庫或緩存中加載的對象。 
在“ com.converter”包中,創(chuàng)建以下類:
package com.converter;import javax.faces.application.FacesMessage; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.convert.*;import com.facade.DogFacade; import com.model.Dog;@FacesConverter(forClass = com.model.Dog.class) public class DogConverter implements Converter {@Overridepublic Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2) {DogFacade dogFacade = new DogFacade();int dogId;try {dogId = Integer.parseInt(arg2);} catch (NumberFormatException exception) {throw new ConverterException(new FacesMessage(FacesMessage.SEVERITY_ERROR, 'Type the name of a Dog and select it (or use the dropdow)', 'Type the name of a Dog and select it (or use the dropdow)'));}return dogFacade.findDog(dogId);}@Overridepublic String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {if (arg2 == null) {return '';}Dog dog = (Dog) arg2;return String.valueOf(dog.getId());} }關(guān)于上面的代碼:
- 在@Converter批注中,有一個名為“ forClass”的屬性。 此屬性向de JSF指示“ forClass”中指定的所有類將調(diào)用Converter。 DogConverter帶有“ forClass = com.model.Dog.class ”注釋,每次JSF需要Dog類的Converter時,JSF都會調(diào)用DogConverter。 無需在“ web.xml”文件中編寫任何代碼。
 
Primefaces自動完成中需要轉(zhuǎn)換器代碼。 在下面,您會看到使用“自動完成”有多么容易:
 personUpdateDialog.xhtml 
 
 
人MB.java
關(guān)于上面的代碼:
- 自動完成功能具有多個選項,例如最小查詢長度,啟動查詢的延遲,下拉菜單以顯示所有值等等。 值得一看的是所有選項: http : //primefaces.org/showcase/ui/autoCompleteBasic.jsf和http://primefaces.org/showcase/ui/autocompleteHome.jsf
 - “ complete ”方法具有在數(shù)據(jù)庫中找到的值的緩存。 該方法轉(zhuǎn)到List <Dog>的每個對象,并保留匹配項。
 - 注意,將始終調(diào)用Converter,因為您將在AutoComplete組件中找到“ itemValue =”#{dog}” ”。
 
您可以看到自動完成功能如下:
使用JSFCSS / javascript /圖像
看一下下面的圖片,它將顯示該帖子的應(yīng)用程序如何處理資源:
“ master.xhtml ”
“ index.xhtml”
使用JSF,很容易處理這種資源。 開發(fā)人員不再需要使用文件相對路徑。 要像這樣使用資源,請像下面那樣創(chuàng)建文件:
JSF將映射在“ / WebContent / resources”文件夾中找到的所有資源,開發(fā)人員將能夠使用上面顯示的資源。
“ web.xml”配置
在文件夾“ WebContent / WEB-INF / ”中,創(chuàng)建以下文件:
“ web.xml ”
<?xml version='1.0'?> <web-app version='3.0' xmlns='http://java.sun.com/xml/ns/javaee'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xsi:schemaLocation='http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd'><display-name>JSFCrudApp</display-name><servlet><servlet-name>Faces Servlet</servlet-name><servlet-class>javax.faces.webapp.FacesServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>Faces Servlet</servlet-name><url-pattern>*.xhtml</url-pattern></servlet-mapping><welcome-file-list><welcome-file>/pages/protected/index.xhtml</welcome-file></welcome-file-list><context-param><param-name>javax.faces.PROJECT_STAGE</param-name><param-value>Development</param-value></context-param><filter><filter-name>LoginCheckFilter</filter-name><filter-class>com.filter.LoginCheckFilter</filter-class><init-param><param-name>loginActionURI</param-name><param-value>/JSFCrudApp/pages/public/login.xhtml</param-value></init-param></filter><filter-mapping><filter-name>LoginCheckFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter><filter-name>AdminPagesFilter</filter-name><filter-class>com.filter.AdminPagesFilter</filter-class></filter><filter-mapping><filter-name>AdminPagesFilter</filter-name><url-pattern>/pages/protected/admin/*</url-pattern></filter-mapping><filter><filter-name>DefaultUserPagesFilter</filter-name><filter-class>com.filter.DefaultUserPagesFilter</filter-class></filter><filter-mapping><filter-name>DefaultUserPagesFilter</filter-name><url-pattern>/pages/protected/defaultUser/*</url-pattern></filter-mapping> </web-app>“ faces-config.xml ”
<?xml version='1.0' encoding='UTF-8'?><faces-config xmlns='http://java.sun.com/xml/ns/javaee'xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'xsi:schemaLocation='http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd'version='2.0'><application><resource-bundle><base-name>messages</base-name><var>bundle</var></resource-bundle><message-bundle>messages</message-bundle></application> </faces-config>關(guān)于上面的代碼:
- 您將在web.xml文件中找到所有映射的安全過濾器。 您也可以使用@Filter注釋,它們的作用相同。
 - 屬性“ javax.faces.PROJECT_STAGE ”的值為DEVELOPMENT。 這種配置的優(yōu)點之一是,如果在屏幕中未找到“ h:message”,則JSF將附加“ h:message”。 如果發(fā)生某些異常并且沒有任何可顯示的組件,JSF將在頁面中附加ah:message組件。
 - 在“ faces-config”內(nèi)部存在一個名為“ message-bundle”的標簽。 此標記允許開發(fā)人員覆蓋JSF默認消息,此標記的值將指向具有默認JSF消息鍵的文件。 在“ message.properties”文件(第08頁)中,鍵為“ javax.faces.component.UIInput.REQUIRED ”,您在此鍵中寫入的任何值都會影響應(yīng)用程序中顯示的所有“必填字段”消息。
 
增強應(yīng)用程序的安全性
不要串聯(lián)查詢
不要使用通常的“ where id =” + id sql代碼。 這種代碼允許“ SQL Injection ”黑客攻擊。 使用ORM的開發(fā)人員也容易受到這種攻擊,但具有不同的名稱:“ HQL注入”。 您可以在Person和User類中找到進行查詢的最佳方法:
是否使用JPA無關(guān)緊要,不要將查詢與字符串連接在一起。
開發(fā)人員必須意識到“ SQL注入可能在您的應(yīng)用程序的任何查詢中發(fā)生 ”,而不僅僅是登錄查詢中。 如果用戶對您的應(yīng)用程序具有有效的登錄名,則該用戶可以在所有查詢中執(zhí)行“ SQL注入 ”。
自動完成關(guān)閉
在“ login.xhtml ”頁面中,有以下代碼:
標記為“自動完成”的關(guān)閉會告知瀏覽器不應(yīng)保存此字段。 優(yōu)秀的瀏覽器(Firefox,Chrome,IE)會尊重此標記,它有助于保護您的應(yīng)用程序。
如果允許瀏覽器保留密碼,則瀏覽器必須將此密碼存儲在某個位置。 如果黑客發(fā)現(xiàn)了該密鑰的存儲位置,他可能會嘗試將其破解。
驗證所有傳入請求
如果僅要求應(yīng)用程序驗證用戶是否已登錄,則用戶類將不需要角色Enum。
如果沒有角色驗證,則普通用戶可以訪問系統(tǒng)的任何區(qū)域,例如管理頁面。 請注意,此應(yīng)用程序具有始終用于驗證所有請求的用戶角色的過濾器。 “ 隱藏鏈接不是保護措施。 開發(fā)人員應(yīng)始終驗證所有傳入請求 ”。 開發(fā)人員可以隱藏URL或按鈕,但是如果用戶在瀏覽器中鍵入URL或模擬get / post調(diào)用,則用戶可以訪問應(yīng)用程序的任何屏幕。
始終使用h:outputText組件
避免跨站點腳本編寫的一種簡單方法是使用h:outputText組件顯示數(shù)據(jù)庫中的數(shù)據(jù)。 請注意,在這篇文章中,顯示給de user的所有來自數(shù)據(jù)庫的值都使用h:outputText組件。 可以避免使用h:outputText組件的情況是,應(yīng)用程序?qū)@示“ message.properties”之類的文件中的系統(tǒng)消息。
運行應(yīng)用程序
啟動Tomcat并檢查數(shù)據(jù)庫; 請注意,數(shù)據(jù)庫中還沒有表。
在瀏覽器中鍵入以下URL: http:// localhost / JSFCrudApp / 。
將顯示以下屏幕:
鍵入所需的任何值,然后按登錄按鈕,如果沒有用戶或表,請不要打擾。 只需單擊它。 您將看到以下錯誤消息:
再次檢查數(shù)據(jù)庫,您將看到所有表都已創(chuàng)建。 應(yīng)用程序手動控制所有事務(wù),這是JPA / Hibernate在首次調(diào)用時才創(chuàng)建表的原因。
您需要創(chuàng)建一個角色為ADMIN的用戶(我將該用戶命名為Real Madrid),以及另一個角色為USER的用戶(我將其命名為Barcelona)。 ADMIN用戶將有權(quán)訪問所有文件夾下的所有系統(tǒng),但具有USER角色的用戶將有權(quán)訪問文件夾defaultUser下的頁面。
如果使用ADMIN用戶登錄,您將看到:
現(xiàn)在以具有USER角色的用戶身份登錄:
狗按鈕被隱藏。 即使沒有該按鈕,用戶也可以訪問Dogs的URL,并且只允許ADMIN角色使用Dogs屏幕。
要查看應(yīng)用程序的行為和非法訪問的行為,請保持使用USER角色的身份登錄,并嘗試訪問以下鏈接: http://localhost/JSFCrudApp/pages/protected/admin/adminIndex.xhtml
將顯示下一個屏幕:
因為AdminPagesFilter檢查請求是否來自ADMIN用戶,所以將顯示此屏幕。 如果用戶不是ADMIN角色,我們的忍者貓就會得到它! [=
參考:在uaiHebert博客上,我們的JCG合作伙伴 Hebert Coelho的Tomcat JSF Primefaces JPA Hibernate完整Web應(yīng)用程序 。
翻譯自: https://www.javacodegeeks.com/2012/07/full-web-application-tomcat-jsf_4954.html
總結(jié)
以上是生活随笔為你收集整理的完整的Web应用程序Tomcat JSF Primefaces JPA Hibernate –第3部分的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 使用工厂模式解决设计问题
 - 下一篇: (linux .os)