jpa jsf_完整的Web应用程序Tomcat JSF Primefaces JPA Hibernate –第3部分

jpa jsf

Primefaces AutoComplete,JSF转换器

这篇文章从第一部分和第二部分继续。

JSF拥有Converter工具,可以帮助我们从用户视图中获取一些数据并将其转换为从数据库或缓存中加载的对象。

在“ com.converter”包中,创建以下类:

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());}
}

关于上面的代码:

  • 在@Converter批注中,有一个名为“ forClass”的属性。 此属性向de JSF指示“ forClass”中指定的所有类将调用Converter。 DogConverter带有“ forClass = com.model.Dog.class ”注释,每次JSF需要一个Dog类的Converter时,JSF都会调用DogConverter。 无需在“ web.xml”文件中编写任何代码。

Primefaces自动完成中需要转换器代码。 在下面,您会看到使用“自动完成”有多么容易:

personUpdateDialog.xhtml

人MB.java

关于上面的代码:

  • 自动完成功能具有多个选项,例如最小查询长度,启动查询的延迟,下拉菜单以显示所有值等等。 值得一看的是所有选项: http : //primefaces.org/showcase/ui/autoCompleteBasic.jsf和http://primefaces.org/showcase/ui/autocompleteHome.jsf
  • complete ”方法具有在数据库中找到的值的缓存。 该方法转到List <Dog>的每个对象,并保留匹配项。
  • 注意,将始终调用Converter,因为您将在AutoComplete组件中找到“ itemValue =”#{dog}” ”。

您可以看到自动完成功能如下:

使用JSFCSS / javascript /图像

看一下下面的图片,它将显示该帖子的应用程序如何处理资源:

master.xhtml

“ index.xhtml”

使用JSF,很容易处理这种资源。 开发人员不再需要使用文件相对路径。 要像这样使用资源,请像下面那样创建文件:

JSF将映射在“ / WebContent / resources”文件夹中找到的所有资源,开发人员将能够使用上面显示的资源。

“ web.xml”配置

在文件夹“ WebContent / WEB-INF / ”中,创建以下文件:

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>

关于上面的代码:

  • 您会在web.xml文件中找到所有映射的安全过滤器。 您也可以使用@Filter注释,它们的工作原理相同。
  • 属性“ javax.faces.PROJECT_STAGE ”的值为DEVELOPMENT。 这种配置的优点之一是,如果在屏幕中未找到“ h:message”,则JSF将附加“ h:message”。 如果发生某些异常并且没有任何可显示的组件,JSF将在页面中附加ah:message组件。
  • 在“ faces-config”内部存在一个名为“ message-bundle”的标签。 此标记允许开发人员覆盖JSF默认消息,此标记的值将指向具有默认JSF消息键的文件。 在“ message.properties”文件(第08页)中,键为“ javax.faces.component.UIInput.REQUIRED ”,您在此键中写入的任何值都会影响应用程序中显示的所有“必填字段”消息。

增强应用程序的安全性

不要串联查询

不要使用通常的“ where id =” + id sql代码。 这种代码允许“ SQL Injection ”黑客攻击。 使用ORM的开发人员也容易受到这种攻击,但使用不同的名称:“ HQL注入”。 您可以在Person和User类中找到最佳查询方法:

是否使用JPA无关紧要,不要将查询与字符串连接在一起。

开发人员必须意识到“ SQL注入可能在您的应用程序的任何查询中发生 ”,而不仅仅是登录查询中。 如果用户对您的应用程序具有有效的登录名,则该用户可以在所有查询中执行“ SQL注入 ”。

自动完成关闭

在“ login.xhtml ”页面中,有以下代码:

标记为“自动完成”的关闭会告诉浏览器不应保存此字段。 优秀的浏览器(Firefox,Chrome,IE)会尊重此标记,它有助于保护您的应用程序。

如果允许浏览器保留密码,则浏览器必须将此密码存储在某个位置。 如果黑客发现了该密钥的存储位置,他可能会尝试将其破解。

验证所有传入请求

如果仅要求应用程序验证用户是否已登录,则用户类将不需要角色Enum。

如果没有角色验证,则普通用户可以访问系统的任何区域,例如管理页面。 请注意,此应用程序具有始终用于验证所有请求的用户角色的过滤器。 “ 隐藏链接不是保护措施。 开发人员应始终验证所有传入请求 ”。 开发人员可以隐藏URL或按钮,但是如果用户在浏览器中键入URL或模拟get / post调用,则用户可以访问应用程序的任何屏幕。

始终使用h:outputText组件

避免跨站点脚本编写的一种简单方法是使用h:outputText组件显示数据库中的数据。 请注意,在这篇文章中,显示给de user的所有来自数据库的值都使用h:outputText组件。 可以避免使用h:outputText组件的情况是,应用程序将显示“ message.properties”之类的文件中的系统消息。

运行应用程序

启动Tomcat并检查数据库; 请注意,数据库中还没有表。

在浏览器中键入以下URL: http:// localhost / JSFCrudApp / 。

将显示以下屏幕:

键入所需的任何值,然后按登录按钮,如果没有用户或表,请不要打扰。 只需单击它。 您将看到以下错误消息:

再次检查数据库,您将看到所有表都已创建。 应用程序手动控制所有事务,这是JPA / Hibernate在首次调用时才创建表的原因。

您需要创建一个角色为ADMIN的用户(我将该用户命名为Real Madrid),以及另一个角色为USER的用户(我将其命名为Barcelona)。 ADMIN用户将有权访问所有文件夹下的所有系统,但具有USER角色的用户将有权访问文件夹defaultUser下的页面。

如果使用ADMIN用户登录,您将看到:

现在以具有USER角色的用户身份登录:

狗按钮被隐藏。 即使没有该按钮,用户也可以访问Dogs的URL,并且只允许ADMIN角色使用Dogs屏幕。

要查看应用程序的行为和非法访问的行为,请保持使用USER角色的身份登录,并尝试访问以下链接: http://localhost/JSFCrudApp/pages/protected/admin/adminIndex.xhtml

将显示下一个屏幕:

将显示此屏幕,因为AdminPagesFilter检查请求是否来自ADMIN用户。 如果用户不是ADMIN角色,我们的忍者猫就会得到它! [=

参考:在uaiHebert博客上,来自我们的JCG合作伙伴 Hebert Coelho的Tomcat JSF Primefaces JPA Hibernate完整Web应用程序 。

翻译自: https://www.javacodegeeks.com/2012/07/full-web-application-tomcat-jsf_4954.html

jpa jsf

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/354791.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

会话保持 (转)

http://www.cnblogs.com/kellyseeme/p/7599061.html 理论部分 会话也就是session&#xff0c;主要存储在服务器端&#xff0c;用来识别用户的身份。 在浏览器中向服务端发送请求的时候&#xff0c;不是http协议就是https协议&#xff0c;而两种协议在发送请求的时候&#xff0c…

win7链接html线到屏幕上,为你解决win7系统html文件图标变成空白的具体技巧 - win7吧...

我们经常在电脑上安装应用软件&#xff0c;难免会遇到诸如win7系统html文件图标变成空白的状况&#xff0c;对于大多电脑用户而言&#xff0c;大家几乎都是首次看到win7系统html文件图标变成空白这种状况&#xff0c;其实小编的经验是碰到win7系统html文件图标变成空白的问题别…

计算机科学之前说,国内计算机科学十强大学是哪些?前2名没悬念,后面几所都不好说...

随着科技的发展、产业结构的不断优化&#xff0c;许多单位对计算机相关专业人才需求量越来越大&#xff0c;计算机专业毕业生就业情况普遍不差。加上计算机学科本身就给人一种“格局很高”的感觉&#xff0c;所以该专业成为了当下最热门的专业之一&#xff0c;每年高考都会有一…

服务引用代理类_在代理类中引用动态代理

服务引用代理类在Stackoverflow中有一个有趣的问题 &#xff0c;关于Spring Bean如何获​​得对由Spring创建的代理的引用以处理事务&#xff0c;Spring AOP&#xff0c;缓存&#xff0c;异步流等。需要对代理的引用&#xff0c;因为如果存在对自身的调用通过代理bean&#xff…

Java中特质模式的定义

在本文中&#xff0c;我将介绍特征的概念&#xff0c;并为您提供一个如何在Java中使用它们以在对象设计中减少冗余的具体示例。 我将首先提出一个虚构的案例&#xff0c;其中可以使用特征来减少重复&#xff0c;然后以使用Java 8的特征模式示例实现为结尾。 假设您正在开发留言…

计算机 注册表 远程桌面,仅允许运行使用网络级别身份验证的远程桌面计算机连接失败处理方法(远程桌面连接)...

计算机在开启远程桌面的时候选中了“仅允许运行使用网络级别身份验证的远程桌面计算机连接”&#xff0c;于是连接时提示错误如下&#xff1a;远程计算机需要网络级别身份验证&#xff0c;而您的计算机不支持该验证&#xff0c;请联系您的系统管理员或者技术人员来获得帮助解决…

前端笔记----定位

一.定位分三种&#xff1a;相对定位&#xff0c;绝对定位和固定定位。 1.相对定位&#xff1a;元素所占据的文档流的位置保留&#xff0c;元素本身相对自身原位置进行偏移&#xff1b; 如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head>&l…

线程并发库和线程池的作用_并发–顺序线程和原始线程

线程并发库和线程池的作用不久前&#xff0c;我参与了一个项目&#xff0c;该项目的报告流程如下&#xff1a; 用户会要求举报 报告要求将被翻译成较小的部分 基于零件/节的类型的每个零件的报告将由报告生成器生成 组成报告的各个部分将重新组合成最终报告&#xff0c;并返…

ipad2018编写html,IT教程:ipad6是ipad2018吗

科技就如同电灯发出的光一样&#xff0c;点亮我们的世界&#xff0c;点亮我们的生活&#xff0c;这一段时间以来ipad6是ipad2018吗的消息络绎不绝是什么原因呢?接下来就让我们一起了解一下吧。大家好&#xff0c;我是智能客服时间君&#xff0c;上述问题将由我为大家进行解答。…

流的多层次分组

1.简介 使用Java 8流&#xff0c;可以很容易地根据不同的标准对对象集合进行分组。 在这篇文章中&#xff0c;我们将看到如何从简单的单级分组到更复杂的&#xff0c;涉及多个级分组的分组。 我们将使用两个类来表示我们要分组的对象&#xff1a;人和宠物。 人类 public cla…

冈仁波齐

昨日看了《冈仁波齐》&#xff0c;其实第一次听这部电影还是在网易云看到朴树的新歌《No Fear In My Heart》时知道有这样一部电影的&#xff1b; 抱着好奇心去看&#xff0c;发现这确实是一部不错的电影&#xff0c;具体好在哪里我也不是说得很清楚&#xff0c;只知道我在看电…

四川高职计算机二本线学校,全网首发!四川省本科二批次2019年对口高职投档录取线出炉...

原标题&#xff1a;全网首发&#xff01;四川省本科二批次2019年对口高职投档录取线出炉四川省2019年高校招生本科录取接近尾声&#xff0c;二本批次征集志愿于8月1日进行。与此同时&#xff0c;专科批相关录取工作也进入我们视野。四川省各高校2019年对口高职调档线我省高职院…

app engine_App Engine中的Google Services身份验证,第1部分

app engine这篇文章将说明如何构建一个简单的Google App Engine&#xff08;GAE&#xff09;Java应用程序&#xff0c;该应用程序可以针对Google进行身份验证&#xff0c;并利用Google的OAuth授权访问Google的API服务&#xff08;例如Google Docs&#xff09;。 此外&#xff0…

Angular最新教程-第六节编写响应式导航栏

这节课我们讲解如何使用bootstrap 4 编写响应式布局。 参考图我们还是参照Angular中文社区http://www.angularjs.cn/ 图中标注红色的部分&#xff0c;我自己不是很喜欢&#xff0c;所以做了一点小改动。 他这里也没有做响应式布局&#xff0c;所以样式就不抄他的&#xff0c…

计算机在智慧交通的应用论文,智能交通的毕业论文

智能交通的毕业论文智能运输系统的研究许多国家都投入了巨大的人力和物力,并成为继航空航天、军事领域之后高新技术应用最集中的领域。下面为大家分享了有关智能交通的论文&#xff0c;欢迎欣赏&#xff01;摘 要&#xff1a;八十年代以来&#xff0c;世界一些发达国家纷纷投入…

MySQL5.5安装教程

1、 官网下载mysql5.5 下载地址&#xff1a; http://dev.mysql.com/downloads/mysql/5.5.html#downloads 2、 安装mysql5.5 注意&#xff0c;安装之前&#xff0c;请关闭杀毒软件。 &#xff08;1&#xff09; 打开下载的mysql-5.5.53-winx64.msi &#xff08;2&#xff09; 点…

计算机上平方米的单位,word怎么写平方米 word中平方米的单位怎么打

1、以Word2010版本为例&#xff0c;在文档中输入了平方米的单位&#xff0c;但是数字2不在上方&#xff1b;2、首先选中数字2&#xff0c;然后点击页面上方的上标图标&#xff0c;如下图所示&#xff1b;3、点击上标图标后&#xff0c;就会发现数字2在字母的右上方了&#xff0…

SQL Server 索引重建手册

注意&#xff1a;索引重建前建议把数据库切换为完整模式&#xff0c;否则索引复制会在数据文件中进行&#xff0c;导致数据文件很大&#xff0c;而数据文件的收缩比日志文件的收缩要困难的多&#xff0c;且会对业务造成影响。步骤一:查询索引碎片&#xff0c;脚本如下&#xff…

apache camel_令人印象深刻的第一个Apache Camel版本

apache camel在准备下周的CamelOne会议时&#xff0c;我花了一些时间回顾一下Apache Camel项目的历史。 因此&#xff0c;除其他外&#xff0c;我了解了Apache Camel的第一个正式1.0版本 。 Apache Camel 1.0 – 5年前 我看的越多&#xff0c;这个版本的事实给我留下了深刻的印…

notion自建服务器,【速报】Notion的特色「双向链接」方案来了,Synced Block 登场...

Notion 作为一款出色的「聚合型」(All-In-One)笔记 App&#xff0c;在这几年里逐渐获得了不少知识工作者的宠爱。在以前&#xff0c;大家一般会高度赞扬 Notion 的「模块化」编辑器&#xff0c;但同时也会好奇什么时候 Notion 可以带来像Roam Research 那样的 「双向链接」功能…