JSF开发与验证技巧解析

内容分享4小时前发布
1 0 0

1、拿一张纸,列出 Java EE 7 的核心规范,包括 Servlet、CDI、EJB、JPA、JMS、JAX – RS 和 JSF。在 1 – 10 的范围内(1 为新手,10 为专家),评估自己对这些规范的了解程度。

这是一个自我评估问题,需要你自行列出核心规范,并在 1 – 10 的范围内评估自己对这些规范的了解程度。

2、现在换个角度,对 Java EE 提出异议。社区中有些人支持标准化,有些人坚决反对。反对者认为,对于一个充满需求和创新的世界来说,标准化进程太慢。你认为依赖 Java EE 平台可能会有哪些潜在问题?思考软件开发之外的领域,如教育、培训、招聘和更广泛的社区。Java 的理想状态是什么样的?

依赖 Java EE 平台的潜在问题

教育方面 :标准化进程慢可能使教材内容更新不及时,学生学到的知识与实际需求脱节。 培训方面 :难以快速跟上技术创新节奏,导致培训内容滞后。 招聘方面 :企业难以招到适应快速变化需求的人才。 社区发展 :在更广泛社区中,会阻碍新技术的推广和应用。

Java 的理想状态

或许是拥有高度灵活的开发环境,开发者能自由选择技术和工具,无需遵循复杂标准规范,同时有丰富资源和良好社区支持,能快速实现想法。但这在实际中难以实现。

3、在现代网页浏览器中是否可以使用开发者工具(如 Chrome 开发者工具,网址为 https://developer.chrome.com/devtools ,或 Christopher Pederick 的 Web 开发者工具,网址为 http://chrispederick.com/work/web – developer/ 等)动态检查 HTML、CSS 和 JavaScript?是否可以通过这些工具学习调试 JavaScript?能否在代码中简单地添加断点?是否可以使用检查器来检查计算后的 CSS?

在现代网页浏览器中可以使用开发者工具(如 Chrome 开发者工具、Christopher Pederick 的 Web 开发者工具等)动态检查 HTML、CSS 和 JavaScript;
可以通过这些工具学习调试 JavaScript;
能在代码中简单地添加断点;
可以使用检查器来检查计算后的 CSS。

4、使用分布式版本控制系统 Git 从 GitHub(http://github.com/peterpilgrim/digitaljavaee7)克隆源代码,并查看其中的简单 JSF 示例代码。下载并设置 GlassFish 4.1(https://glassfish.java.net/)或 WildFly 9(http://wildfly.org/)应用服务器,让第一个示例运行起来。

操作步骤

使用 Git 从指定 GitHub 地址克隆代码 查看简单 JSF 示例代码 下载并设置 GlassFish 4.1 或 WildFly 9 应用服务器 运行第一个示例

5、你在网页设计中的图像编辑技能如何(使用商业应用程序Adobe Photoshop、Firework或Xara Edit)?你是在工作或家里进行这项活动,还是将这项工作委托给其他人,比如创意设计师?在这个领域拥有更丰富的知识会对你更广泛的职业规划有帮助吗?这会让你成为一名更优秀的数字工作者吗?

这几个问题是引导读者对自身图像编辑技能、参与情况以及技能提升对职业的影响进行思考,并没有既定答案,需读者结合自身实际情况作答。

6、采用敏捷软件开发的数字团队倾向于与利益相关者合作,利益相关者是客户,即业务终端用户的代表,团队要向他们交付软件。你是否曾直接与利益相关者进行过对话?这些讨论的结果如何?进展怎样?你是否曾希望更多地参与其中?你是否曾想过逃避?回顾过去,你在这些对话中的努力怎样才能做得更好?站在利益相关者的角度去理解他对你的看法。

与利益相关者对话的提升方法

要想在与利益相关者的对话中做得更好,可遵循以下步骤:

1. 提前充分准备

了解项目情况 掌握利益相关者的需求

2. 沟通时表达清晰

准确表达自己的观点 认真倾听对方的意见

3. 站在对方角度思考

理解其关注点 了解其期望

4. 对话后总结改进

及时总结经验 不断改进沟通方式和能力

7、你被要求为选民编写一个选民登记册网络应用程序,以取代传统的纸质记录。公民将能够在线登记选民名单,而不是等待接收填写好的表格。在这个应用程序中,什么构成了模型 – 视图 – 控制器?

模型-视图-控制器(MVC)架构说明

模型(Model)

存储选民登记相关的数据,如选民的姓名、年龄、地址等信息,可能以数据库表或数据对象的形式存在。

视图(View)

负责将选民登记的数据呈现给用户,可能是一个网页界面,让用户可以查看自己的登记信息、填写登记表格等。

控制器(Controller)

包含处理用户输入和输出的逻辑,例如:
– 接收用户在网页上填写的登记信息
– 对信息进行验证
– 将信息保存到数据库中
– 根据用户的操作返回相应的结果给视图

8、JSF生命周期的哪些部分对应于模型 – 视图 – 控制器模式?

在JSF中,模型是处理业务数据和逻辑的组件或组件集,如 CDI bean、EJB 等与 Web 容器和 JSF 框架生命周期兼容的组件;

控制器方面,
FacesServlet
可视为起点,负责将传入的 HTTP 请求分发到正确的托管 bean;

视图是包含 UI 组件及其各自 bean 的渲染组,通常用页面描述语言(如 JSF 2.0 的 Facelets)描述,JSF 的渲染套件将 UI 组件和 bean 组合成完整页面。

9、描述框架何时以及在何处会遇到恢复视图阶段。

标准请求处理生命周期

标准请求处理生命周期从 Faces 请求刺激 恢复视图阶段 开始。

恢复视图阶段

恢复视图阶段是生命周期的一个阶段,在该阶段,JSF 框架要确保组件树及其状态与视图最初在响应中生成时的表单相匹配。

请求类型判断

JSF 会根据算法判断请求是 回发请求 还是 初始请求

若视图已存在 :则为回发请求,JSF 会使用先前保存的状态恢复带有视图 ID 的视图; 若是全新视图 :JSF 会创建一个
javax.faces.component.UIViewRoot
类型的新实例,并设置相关属性,然后用 UI 组件填充视图。

10、当客户在表单中输入无效值时,描述处理Faces请求的JSF生命周期阶段。你认为Faces响应中会添加什么?为什么?

当客户输入无效值时,JSF生命周期会经历 Apply Request Values 阶段,之后进入 Process Validations 阶段。在该阶段,若验证失败或存在转换错误,JSF框架会直接跳过后续阶段,进入 Render Response 阶段。

Faces响应中会添加错误信息 ,目的是提示用户输入了无效值,让用户有机会在HTML输入表单中输入正确数据。

11、JSF中HTML5渲染套件标签和核心自定义标签有什么区别?


## HTML5渲染套件标签

HTML5渲染套件标签用于渲染HTML元素,处理不同类型的页面元素,如按钮、表单、表格等,同时负责处理页面布局和用户交互。

## 核心自定义标签

核心自定义标签用于添加独立于HTML5渲染套件标签的功能,可对UI组件进行属性添加、监听器注册、转换器注册等增强和配置操作。

- **命名空间**: `http://xmlns.jcp.org/jsf/core`
- **特性**: 即使使用替代渲染套件,核心自定义标签仍可正常工作。

12、JSF 自定义标签共享的常见属性有哪些?

以下是给定文本内容的 Markdown 格式版本:


JSF 标准标签共享的常见属性及描述如下:


id
:指定 HTML 元素标识符
binding
:将标签绑定到托管 bean 中的组件实例
immediate
:指定布尔值,若为
true
,使 JSF 框架在 JSF 生命周期的应用请求值阶段后跳过验证、转换和事件处理
rendered
:指定布尔值,通常默认值为
true
,决定组件是否渲染
required
:指定布尔值,决定此输入元素是否为输入验证所必需
styleClass
:指定渲染标签的 HTML 类属性
style
:指定渲染标签的 HTML 样式属性
value
:指定字符串值或表达式语言引用

13、为了在 JSF 中使用 Bootstrap CSS,我们可以将几乎所有的 JSF HTML 组件应用于 styleClass 属性。除了 styleClass 属性外,JSF HTML 组件的其他常见属性有哪些?

其他常见属性包括:


id
(指定 HTML 元素标识符)
binding
(将标签绑定到托管 bean 中的组件实例)
immediate
(指定布尔值,若为
true
,使 JSF 框架在 JSF 生命周期的应用请求值阶段后跳过验证、转换和事件处理)
rendered
(指定布尔值,通常默认为
true
,指示组件是否应渲染)
required
(指定布尔值,指示此输入元素是否为输入验证所必需)
style
(指定渲染标签的 HTML 样式属性)
value
(指定字符串值或表达式语言引用)

14、以业余书友会应用程序为例,添加

下拉列表组件。为支持 bean 添加属性,该属性表示书籍的类型,如犯罪、科幻、惊悚或浪漫类。同时创建一个名为 Registrant.java 的 POJO 类,作为注册者的数据记录。

按要求,在业余书友会应用里添加
<h:selectManyMenu>
下拉列表组件,为支持 bean 添加书籍类型属性。
创建一个名为
Registrant.java
的 POJO 类,用于存储注册者的数据。

15、调整你的兴趣爱好应用程序,以使用 JSF HTML 自定义标签的其他元素,如

。你可以为一个属性添加布尔值,以捕捉小组中有人对书籍进行了评价这一状态。

要实现这个需求,首先在与应用程序关联的 Java 类(比如
Registrant.java
)里添加一个布尔类型的属性,用来表示书籍是否被评价过。例如:


public class Registrant {
    private boolean bookReviewed;

    // 构造方法、getter 和 setter 方法
    public Registrant() {}

    public boolean isBookReviewed() {
        return bookReviewed;
    }

    public void setBookReviewed(boolean bookReviewed) {
        this.bookReviewed = bookReviewed;
    }
}

然后在 JSF 页面中使用
<h:selectBooleanCheckbox>
标签来绑定这个布尔属性。示例如下:


<h:selectBooleanCheckbox value="#{registrant.bookReviewed}">
    有人评价过这本书
</h:selectBooleanCheckbox>

这样,当用户在界面上勾选或取消勾选这个复选框时,
Registrant
类中的
bookReviewed
属性值会相应改变,从而捕捉到书籍是否被评价的状态。

16、当两个客户想在网络数据库中编辑同一条联系人详细记录时会发生什么?你认为应用程序应该如何表现?你会添加哪些功能?你认为客户会如何看待你的想法?

数据冲突处理方案

当两个客户想编辑同一条联系人详细记录时,可能会出现数据冲突,导致数据不一致或丢失。应用程序可以采用以下方式处理:

处理方式

锁定机制
当一个客户开始编辑记录时,将该记录锁定,其他客户无法编辑,直到锁定解除。

版本控制
记录每次编辑的版本,当出现冲突时,允许用户选择保留哪个版本或合并版本。

实时通知
当有其他用户正在编辑同一记录时,及时通知当前用户。

增强功能建议

为了更好地处理这种情况,可以添加以下功能:

冲突解决界面
提供一个界面,让用户可以直观地看到冲突并选择解决方案。

自动保存
定期自动保存编辑内容,防止数据丢失。

历史记录
记录所有编辑历史,方便用户查看和恢复。

用户反馈预期

对于这些想法,客户可能会觉得:

提高了数据的安全性和一致性 减少了错误发生的概率,从而提升了使用体验

但也有可能有客户认为:

锁定机制会影响他们的操作效率 希望有更灵活的处理方式

17、将用户界面模板合成应用到你的业余书友会项目中。将此版本命名为版本二,并保留第一个版本以供参考。现阶段仅使用模板合成标签

以下是将UI模板合成应用到业余书友会项目(版本二)的基本步骤:

创建模板文件(如
template.xhtml
):在该文件中使用
<ui:insert>
标签定义占位符。示例代码如下:

“`xml

<br /> 书友会项目模板<br />

默认头部

默认内容

默认页脚

“`

创建具体页面(如
bookList.xhtml
),使用
<ui:composition>
引用模板,并使用
<ui:define>
填充占位符。示例代码如下:

“`xml

<br /> 书籍列表<br />

书友会 – 书籍列表

书名
#{book.title}

作者
#{book.author}

版权所有 © 书友会项目

“`

按照以上步骤,就可以将UI模板合成应用到业余书友会项目的版本二中。同时要保留版本一的代码,以便后续参考。

18、在主模板页面添加一个

自定义标签。这个特殊标签对开发者有什么作用?


`<ui:debug>` 标签会在当前页面创建并添加一个特殊组件,允许显示调试输出。它接受 `hotkey` 和 `rendered` 两个属性:

- `hotkey` 可定义打开可调试窗口的热键字符,默认是 `d`;
- `rendered` 可指定调试组件是否渲染,必须是值表达式或计算结果为 `true` 或 `false` 的字符串字面量。

点击相关的加号(+)符号可展开内容,让开发者动态查看更多信息。

19、一位恼怒的企业利益相关者来到你的办公室,告诉你他们遇到了虚假数据的问题。似乎互联网上的一些调皮鬼在伪造数据录入,这给案件处理人员带来了更多负担。作为 JSF 顾问,请解释如何通过验证来保护后端数据库中的数据。仅使用服务器端验证是否可行?仅使用客户端验证是否可行?

数据验证的方法与策略

可以通过 服务器端验证 客户端验证 来保护后端数据库中的数据。

服务器端验证

验证流程 :信息通过网页浏览器以普通 HTTP 表单提交的方式发送到 Web 应用程序,由 Java EE 等 Web 框架验证输入并向客户端返回响应。 验证失败处理 :若表单验证失败,包含 Web 表单的页面会重新显示,并显示错误信息。 优点 : 即使浏览器禁用或无法使用 JavaScript,也能保护数据库。 缺点 : 需要从客户端到服务器端的往返,用户提交表单后才能得到反馈。 响应速度较慢,用户体验不佳。

使用 AJAX 的服务器端验证

改进点 :通过 AJAX 进行服务器端表单验证,可在用户输入数据时即时进行验证。 优点 : 解决响应慢的问题。 提供更及时的反馈。 前提条件 : 需要浏览器启用 JavaScript。

客户端验证

实现方式 :依赖浏览器中的 JavaScript 或等效的动态脚本技术。 优点 : 提供更具响应性和丰富的用户交互。 可确保用户提交表单前表单始终正确。 能在用户输入数据时提供提示和验证错误消息。 缺点 : 当浏览器禁用或无法使用 JavaScript 时,客户端验证会失效,用户可能绕过验证。

单一验证方式的不足

验证方式 不足之处
仅服务器端验证 响应慢,用户体验不佳。
仅客户端验证 在 JavaScript 不可用时会失效,无法保证数据验证。

推荐方案

结合服务器端验证和客户端验证 ,发挥各自优势,从而更好地保护后端数据库中的数据。

20、为创建的 JSF 表单元素添加验证,应该如何操作?

可按以下步骤操作:

为 Registrant POJO 添加一些属性。 添加 URL 验证器验证社交网络属性是否正确:
– 使用正则表达式验证器验证 Twitter 账户语法。
– 或编写自定义验证器。 下载书籍的源代码示例并运行第 4 章的示例代码,研究服务器端的验证过程。 在已开发的带有服务器端验证的项目基础上,为 Hobby Book Club 网络应用添加客户端验证:
– 使用 AJAX 对控制元素进行验证。
– 在 JSF 表单控制元素中添加适当的
<f:ajax>
元素。
– 每个控制元素需要一个区域来显示特定的错误消息。
– 在页面上添加相应的
<h:message>
元素。 对 JSF 表单元素进行验证,如在创建页面上针对注册者姓名进行验证:
– 可使用
<f:validateRequired>

<f:validateLength>
直接在页面视图上验证。
– 并添加适当的
<h:messages>
到页面视图。 还可添加 Bean 验证到注册者类(Registrant.java)。

21、向注册者类(Registrant.java,你在自己的项目中可能对这个类有不同的命名)添加 Bean 验证。你的用户会对验证输出感到满意吗?

不一定。Bean 验证有优点:

可防止数据库接收输入不佳的数据 可在应用逻辑中添加验证 能保证业务需求(如联系信息标题不为空) 还能实现复杂和分组验证

但也存在缺点:

与 JSF 前端无关联 数据验证依赖 Java 工程师 页面作者或设计师难以创新、编辑或移除验证 可能无法提供良好的用户体验

若直接在控制器方法添加 Bean 验证注释,还可能导致用户收到不友好的错误信息。因此,用户不一定会对验证输出满意。

22、当你仅在应用程序中添加服务器端验证时会发生什么?

表单提交与验证的工作原理

信息会以普通 HTTP 表单提交的方式从网页浏览器发送到 Web 应用程序,表单作为传统 HTML 表单元素提交。

Web 框架会验证输入并向客户端发送响应。若表单验证失败,包含 Web 表单的页面会重新显示并显示错误信息。

服务器端验证的优势

服务器端快速验证是安全的。 即便网页浏览器中 JavaScript 被禁用或不可用,也能保护数据库。

服务器端验证的局限性

这种验证需要客户端与服务器端之间进行往返通信。 用户在提交表单前无法获得关于表单数据的反馈。

提升响应速度的方法

如果使用 AJAX 提交服务器端表单验证,可避免响应缓慢的问题。

23、从创建页面开始,对注册者的姓名进行验证。你可以直接在页面视图上使用

进行验证。在页面视图中添加适当的

在创建页面里,针对注册者姓名使用
<f:validateRequired>
确保姓名必填,用
<f:validateLength>
限制姓名长度。

例如,可在输入姓名的输入框标签内添加这两个验证标签:


<h:inputText value="#{registrant.name}">
    <f:validateRequired />
    <f:validateLength minimum="2" maximum="50" />
</h:inputText>

之后在页面合适位置添加
<h:messages>
标签来显示验证错误信息,如:


<h:messages for="nameInput" errorClass="error-message" />

这里
nameInput
是输入姓名输入框的 ID,
error-message
是自定义的错误信息样式类。

24、一些注册者使用像 Facebook、Twitter 和 Instagram 这样的社交网络。为 Registrant POJO 添加一些属性。添加一个 URL 验证器来验证社交网络属性是否正确。使用正则表达式验证器来验证 Twitter 账户语法,或者编写你自己的自定义验证器。

需求说明


Registrant
POJO 添加与社交网络相关的属性,例如:

Facebook 链接 Twitter 链接 Instagram 链接

验证器实现

URL 验证器

用于确保社交网络属性的链接格式合法,可使用正则表达式验证器或自定义验证器。

实现方式

利用正则表达式匹配合法的 URL 格式。

Twitter 账户语法验证器

用于验证 Twitter 账户名的格式是否符合规范。

实现方式

可使用正则表达式验证器。 也可以编写自定义验证逻辑。

验证依据

遵循 Twitter 账户的命名规则。 可通过正则表达式定义账户名格式,或通过逻辑判断实现。

25、下载某项目的源代码示例并运行第4章的示例代码,研究服务器端是如何进行验证的。

可从GitHub ( http://github.com/peterpilgrim/digitaljavaee7 ) 克隆该项目源代码,下载并设置 GlassFish 4.1 ( https://glassfish.java.net/ ) 或 WildFly 9 ( http://wildfly.org/ ) 应用服务器,运行第4章示例代码并研究服务器端验证。

26、假设你已经使用服务器端验证开发了项目,现在需要将“爱好图书俱乐部”网络应用提升一个档次。为表单控件元素添加使用 AJAX 的客户端验证。你需要在 JSF 表单控件元素中添加合适的

元素。每个控件都需要一个区域来显示特定的错误信息,不要在页面上紧邻添加相应的

元素。请说明具体操作步骤。

应用提升操作指南

请按照以下步骤提升应用:

为 JSF 表单控件元素添加使用 AJAX 的客户端验证; 在 JSF 表单控件元素中添加合适的
<f:ajax>
元素; 为每个控件设置显示特定错误信息的区域,且不在页面上紧邻添加相应的
<h:message>
元素。

© 版权声明

相关文章

暂无评论

none
暂无评论...