面向初学者的JSF 2.0教程

1.什么是JSF?

JSF是Java Server Faces的首字母缩写。 它是一种服务器端处理技术,它允许将服务器端代码嵌入到网页中。 由于可以将服务器端处理和呈现代码嵌入网页本身,因此使项目的整体编码更加简单。 减少总体数量以及文件大小。 JSF包含2个主要组件:

  1. Java Facets :服务器端文件,用作控制器,将客户端请求重定向到正确的JSF网页。
  2. JSF标签:除了允许将服务器端脚本编写到网页中之外,JSF还提供了自定义标签来轻松执行某些操作,例如迭代或条件检查。

这些组件共同构成了MVC的视图和控制器。

2. JSF 2.0 –有何不同?

JSF 2.0和更高版本是其较早版本JSF 1.x的主要升级。 随着JSF 2.0版本的发布,基于JSF的项目的编码风格发生了变化。 使用JSF 2.0,无需在单独的配置文件(如旧版本)中声明不同的项目。 JSF 2.0允许在faces-config.xml文件中声明几乎所有内容。 此外,JSF 2.0已添加了使用注释定义导航,托管或CDI Bean的功能。 当然,这可以减少设置项目结构所需的配置量。

以下各节将通过一个简单的Hello World示例提供有关JSF代码如何工作的基本理解,并在以后转向JSF 2.0功能和标签。

3.设置基于JSF 2.0的动态Web项目

3.1先决条件

以下示例是使用以下工具集创建的:

  • Maven v4.0
  • Eclipse Java EE IDE
  • Apache Tomcat 9.0
  • JDK v7或更高版本
  • JSF 2.0

为了设置项目以执行与JSF 2.0相关的任务,请按照以下所示的步骤从创建Maven WebApp项目开始。

  1. 在Eclipse中,导航到File-> New-> Maven Project
  2. 选择工作空间或选择使用默认工作空间,然后单击下一步

    具有默认工作区的新Maven项目

  3. 在“原型”选择中,选择“ maven-archetype-webapp”
  4. 提供您选择的组ID和工件ID,然后继续

这些步骤将创建一个带有默认index.jsp文件的简单Web项目。 创建项目后,将Apache Tomcat服务器绑定到该项目。 完成此配置后,通过右键单击文件index.jsp并导航至Run as- > Run on Server来测试项目的运行 。 选择Apache Tomcat服务器,然后单击完成。

如果一切都配置正确,将显示类似于以下所示的网页。

索引页

下一步是将JSF 2.0的Maven依赖项添加到项目中。 在pom.xml中添加以下依赖项以启用对JSF 2.0功能的支持。

pom.xml

<dependency><groupId>com.sun.faces</groupId><artifactId>jsf-api</artifactId><version>2.1.7</version></dependency><dependency><groupId>com.sun.faces</groupId><artifactId>jsf-impl</artifactId><version>2.1.7</version></dependency><!-- Required for JSTL tags to be used in JSF --><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency>

一旦将依赖项添加到pom.xml中,请保存项目并出一些时间来下载依赖项。

4.从托管豆开始

JSF 2.0的主要优点之一是它允许使用批注来定义Managed Bean。 在本节中,我们将介绍如何创建和使用简单的托管Bean,以及稍后使用JSTL标签进行稍微复杂的操作。

4.1使用基本EL创建一个简单的xHTML页面

EL是表达语言的缩写。 使用JSF 2.0,可以直接访问Bean中可用的变量或使用EL编写简单的表达式。 下面的页面包含一个简单的EL #{'Coding'} ,它产生一个简单的字符串值Coding

SayHello.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"xmlns:f="http://java.sun.com/jsf/core"xmlns:h="http://java.sun.com/jsf/html"><head><title>JSF 2.0 Say Hello</title>
</head><body><p>Hey There! My hobby is #{'Coding'}</p></body>
</html>

在WEB-INF文件夹中创建上述文件之前,需要完成某些配置。

  1. 通过右键单击项目并导航到“ 属性”->“项目构面” ,然后选中“ JavaServer Faces ”复选框,为Java Server Faces配置项目
  2. 确定JSF模块是2.0,而不是1.2。 如果将其设置为2.0时遇到问题,请从项目中的.settings文件夹中打开文件org.eclipse.wst.common.project.facet.core .xml并添加该行
    <installed facet="jst.jsf" version="2.0"/>
  3. 将Web模块版本设置为3.0,以使JSF 2.0顺利运行。 可以通过将facet="jst.web"版本修改为3.0来完成。
  4. 更改完成后刷新项目。
  5. 右键单击该项目,然后导航到Maven-> Update Maven Project。

现在,该项目可以运行了。 项目结构应如下图所示:

Maven Web App项目结构

现在,只需右键单击文件SayHello.xhtml并导航至“运行方式->在服务器上运行”,选择Apache Tomcat服务器,然后单击“完成”以运行第一个xHTML页面。

请注意,这里有2个不同的JSF标签库导入到页面中以支持JSF标签。 这些标记使您可以在HTML页面中编写逻辑代码块,并可以用预先设置样式的JSF标记替换标准HTML标记。 执行页面时,页面显示以下输出。

SayHello.xhtml的输出

4.2创建第一个托管Bean

下一步,让我们将用户的爱好作为托管Bean中的变量,并尝试使用托管Bean进行填充。 使用下面的代码创建一个托管bean。

HobbiesBean.java

package jsftutorial;import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;@ManagedBean
@SessionScoped
public class HobbiesBean {private String hobby = "Java Coding";public String getHobby() {return hobby;}public void setHobby(String hobby) {this.hobby = hobby;}}

请注意,这里使用了两个注释。

  1. ManagedBean :此批注用于通过此简单批注定义托管bean。 托管bean与页面紧密绑定,可用于从页面获取输入值,或仅将变量值放在输出文本中。
  2. SessionScoped :此批注用于声明bean的范围。 bean的作用域决定是否每次都将创建bean的新实例。

让我们尝试在之前创建的xhtml页面上显示变量hobby的值。 为此,请修改SayHello.xhtml文件,如下所示:

SayHello.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"xmlns:f="http://java.sun.com/jsf/core"xmlns:h="http://java.sun.com/jsf/html"><head><title>JSF 2.0 Say Hello</title>
</head><body><p>Hey There! My hobby is #{hobbiesBean.hobby}</p></body>
</html>

实施上述代码后,请重新启动服务器并检查页面。 除爱好文本外,输出保持类似。 输出现在是Hey There! 我的爱好是Java编码 。 这里有两点很重要。

  1. 上面文件中使用的名为bean的是hobbiesBean 。 如果仔细注意,则Bean名称类似于类名称,除了第一个字符小写。 JSF 2.0标准通过将第一个字符转换为小写并保留其余的类名称来自动定义Bean名称。
  2. 变量hobby是一个私有变量,在Bean中具有getter和setter方法。 服务器使用getter获取变量的值。 因此,如果需要,开发人员可以自由地操纵吸气剂中的输出。

4.3使用自定义别名命名bean

上面的示例根据JSF标准使用bean的默认名称。 但是,有时开发人员可能希望使用自定义bean名称来更好地理解。 例如,对于Employee类,开发人员可能更喜欢bean名称为user 。 对于此类情况,注释@ManagedBean具有属性名称

此属性允许开发人员使用以下语法来提供自定义名称。 放置注释的代码行中的以下修改将把HobbiesBean重命名为myHobbies

@ManagedBean(name="myHobbies")

在Bean文件中完成此更改后,如下所示修改SayHello.xhtml文件。

SayHello.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"xmlns:f="http://java.sun.com/jsf/core"xmlns:h="http://java.sun.com/jsf/html"><head><title>JSF 2.0 Say Hello</title>
</head><body><p>Hey There! My hobby is #{myHobbies.hobby}</p></body>
</html>

尽管Bean的名称发生了变化,但执行此代码后的输出仍保持不变。

4.4在托管Bean中注入Bean依赖项

依赖注入是在面向对象的环境中进行管理的重要方面。 让我们考虑下面的User类:

User.java

package jsftutorial;import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;@ManagedBean
@SessionScoped
public class User {private HobbiesBean hobby;private String name="Java Coder";public HobbiesBean getHobby() {return hobby;}public void setHobby(HobbiesBean hobby) {this.hobby = hobby;}public String getName() {return name;}public void setName(String name) {this.name = name;}	
}

在这里,我们需要将HobbiesBean类的对象注入到User类中。 为了将其作为托管bean依赖项注入,JSF 2.0支持注释@ManagedProperty(value="#{myHobbies}") 。 值属性应根据相应类的bean名称进行分配。 提取用户对象时,此批注将自动注入依赖的bean。 可以通过如下创建新文件来验证。

injectiontest.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"xmlns:f="http://java.sun.com/jsf/core"xmlns:h="http://java.sun.com/jsf/html"><head><title>JSF 2.0 Say Hello</title>
</head><body><p>Hey There! I am #{user.name}. My hobby is #{user.hobby.hobby}</p></body>
</html>

现在输出显示Hey There! I am Java Coder. My hobby is Coding Hey There! I am Java Coder. My hobby is Coding Hey There! I am Java Coder. My hobby is Coding 。 以这种方式,可以轻松注入任何数量的bean,而不必初始化bean。

4.5 JSF 2.0标记

JSF 2.0标准定义了许多标签,用于以简单的方式执行高级操作。 在上面创建的xhtml文件中可以注意到,已经导入了两个XML名称空间。

xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"

前缀为h的名称空间可替换常规html标签。 下面提供了与实际HTML标签相关的最常用标签的列表。

HTML标签 JSF h标签
<label> <h:outputText>
<input type="text"> <h:inputText>
<input type="hidden"> <h:inputHidden>
<input type="password"> <h:inputSecret>
<input type="checkbox"> <h:selectBooleanCheckbox>
<input type="radio"> <h:selectOneRadio>
<textarea> <h:inputTextArea>
<select> <h:selectOneListbox>
<select multiple> <h:selectManyListbox>
<img> <h:graphicImage>

除了这些,还可以在此处找到其他众多h标签的详细信息。

前缀f的名称空间在这里很重要。 这些标签提供了某些特殊功能,例如验证组件,声明上述h标签的项目以及遍历列表,数组或映射之类的对象并创建数据表。 一些基本的f标签将在下面的实现中进行讨论。

actionlistener.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"xmlns:f="http://java.sun.com/jsf/core"xmlns:h="http://java.sun.com/jsf/html">
<body>			
<h:form>
<h:commandButton action="result" value="Submit"><f:setPropertyActionListener target="#{user.name}" value="Java Code Geeks" />
</h:commandButton>
</h:form>
</body>
</html>

使用标签f:setPropertyActionListener ,可以在提交表单时设置特定属性的值。 上面的代码设置了单击命令按钮时user Bean的属性name的值。 该值将在操作页面result.xhtml可用 。 输出如下所示。

f:setPropertyActionListener的输出

f:setPropertyActionListener的输出

考虑如下所示的Bill类。

比尔

package jsftutorial;import java.util.Date;import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;@ManagedBean
@SessionScoped
public class Bill {private double amount = 34.8; private Date billDate = new Date();public double getAmount() {return amount;}public void setAmount(double amount) {this.amount = amount;}public Date getBillDate() {return billDate;}public void setBillDate(Date billDate) {this.billDate = billDate;}
}

讨论的下一个标签允许控制十进制输入中的小数位数。 创建xhtml文件,如下所示。

convert.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"xmlns:f="http://java.sun.com/jsf/core"xmlns:h="http://java.sun.com/jsf/html">
<body>			<h:outputText value="#{bill.amount}" ><f:convertNumber minFractionDigits="2" />
</h:outputText></body>
</html>

这是一个非常有用的标记,当您希望将数字截断到某些小数位或将数字强制具有一定的小数位数时,此标记非常有用。 该标签的使用非常简单。
minFractionDigits强制要求最小十进制精度。 例如,如果输入的输入是34.8 (与Bill类相同),则标记将自动将值转换为34.80 ,如下图所示。

将数字转换为至少2个小数

将数字转换为至少2个小数

同样,也可以以模式形式指定小数。 例如:

convert.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"xmlns:f="http://java.sun.com/jsf/core"xmlns:h="http://java.sun.com/jsf/html">
<body>			<h:outputText value="#{bill.amount}" ><f:convertNumber pattern="#00.00" />
</h:outputText></body>
</html>

此模式将允许最多2位数字和2位小数。 这样就无需在键盘输入或焦点对准时添加自定义脚本。 输出仍然类似于上面显示的输出。

convert.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"xmlns:f="http://java.sun.com/jsf/core"xmlns:h="http://java.sun.com/jsf/html">
<body>			<h:outputText value="#{bill.amount}" ><f:convertNumber pattern="#00.00" />
</h:outputText><br>
<h:outputText value="#{bill.billDate}" ><f:convertDateTime pattern="d-M-yyyy"/>
</h:outputText></body>
</html>

当我们需要以特定格式显示日期和时间时,此属性非常有用。 标记可以动态接受模式,并以给定模式显示提供的java.util.Date变量。 bill.billDate是此处的java.util.Datef标记将日期转换为java.text.SimpleDateFormat类指定的dM-yyyy格式。 输出将如下所示。

f:convertDateTime为d-M-yyyy格式

将f:convertDateTime转换为dM-yyyy格式

有关更多标签,您可以在此处进行探索。

5.结论

本文概括了JSF 2.0大部分必要功能的要点。 它从设置过程开始,然后继续为托管bean使用注释的主要功能。 所有主要功能(如注释, h标签和f标签)均已包含必要的详细信息。 总是有更多参考。 其他有用的链接可以在下面的参考资料中找到。

6.参考

  • 有关f标签的更多信息
  • 关于h标签的更多信息
  • c标签用于条件分支和循环

7.下载Eclipse项目

这是讨论使用JSF 2.0的示例。

下载
您可以在此处下载此示例的完整源代码: jsftutorial-1.zip

翻译自: https://www.javacodegeeks.com/2018/03/jsf-2-0-tutorial-for-beginners.html

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

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

相关文章

华为nova7保密柜_华为发布nova8系列新品 轻松拍出Vlog黄金脸占比

2020年12月23日&#xff0c;华为nova8系列手机正式发布。作为深受年轻人喜爱的手机品牌之一&#xff0c;华为nova8系列此次延续其强大的前置视觉实力、强悍的设计性能以及独特的设计美学&#xff0c;带来业内首款专为Vlog拍摄设计的5G手机。随着短视频和Vlog的崛起&#xff0c;…

26.0.0-alpha1_WildFly 8.0.0.Alpha1的发布和一些历史

26.0.0-alpha1自从我们发布WildFly 8.0.0.Alpha1版本以来&#xff0c; 已经过去了大约2周。 该下载位于WildFly下载页面上 。 我敢肯定&#xff0c;你们中的许多人可能会想知道WildFly是什么&#xff0c;而其中一些知道它是什么的人可能不会知道已经发布了。 我将尝试回答其中的…

单机最大负载_分布式高可靠之负载均衡,今天看了你肯定会

到目前为止&#xff0c;我已经为你介绍了分布式起源、分布式协调与同步、分布式资源管理与负载调度、分布式计算技术、分布式通信技术和分布式数据存储。可以说&#xff0c;掌握了这些内容&#xff0c;基本上就掌握了分布式的关键技术。然而&#xff0c;只有可靠的分布式系统才…

【强化学习】一文带你理清强化学习

整理不易&#xff0c;希望留个赞再走哦&#xff01;&#xff01; 学习路线 这个图描述的比较清晰&#xff0c;蓝框里是整个强化学习的一些概念基础了&#xff0c;橙色是一些学习方法&#xff0c;可以针对性的选择一些&#xff0c;废话不多说&#xff0c;接下来就按照这个路线图…

了解Java缓冲池

了解Java缓冲池 缓冲池空间位于垃圾收集器管理的内存之外。 这是分配本地堆外内存的一种方法。 使用缓冲池有什么好处&#xff1f; 为了回答这个问题&#xff0c;让我们首先了解什么是字节缓冲区。 字节缓冲区 非直接缓冲区 ByteBuffer类附带了java.nio包。 它允许我们分配直接…

java 循环拼接字符串用分号隔开_Java 8中字符串拼接新姿势:StringJoiner

在为什么阿里巴巴不建议在for循环中使用””进行字符串拼接一文中&#xff0c;我们介绍了几种Java中字符串拼接的方式&#xff0c;以及优缺点。其中还有一个重要的拼接方式我没有介绍&#xff0c;那就是Java 8中提供的StringJoiner &#xff0c;本文就来介绍一下这个字符串拼接…

doctrine find的对象转换成数组_「ES6基础」Array数组的新方法(上)

在日常工作中我们经常会与数组打交道&#xff0c;因此需要熟练掌握数组操作的相关方法&#xff0c;ES6中关于数组的操作&#xff0c;又给我们带来了哪些惊喜呢&#xff0c;Array数组操作又添加了哪些新方法&#xff1f;本篇文章将从以下几个方面进行介绍&#xff1a;Array.from…

No module named ‘__main__.common‘; ‘__main__‘ is not a package

今天在调通代码时遇到一个难缠的bug,源代码如下&#xff1a; from .common import _FLOATX, _EPSILON结果报错&#xff1a; 问题原因&#xff1a; 也就是说&#xff0c;这是相对导入&#xff0c;只有在父模块在当前运行环境中被导入过才能用。 这揭示了报错的缘由&#xff0…

ValueError( Shape(4, ?, 1, 20) and () are incompatible

报错&#xff1a; 解决&#xff1a; 将文件中的return tf.concat(axis, tensors) 改为&#xff1a;return tf.concat(tensors, axis)问题完美解决

adadelta算法_对C++用户比较友好的机器学习算法库

由于疫情影响&#xff0c;这几天在家学习编程&#xff0c;整理了基于c语言的机器学习算法库。目前大部分机器学习库都是面向pyhton语言的&#xff0c;尽管很python包的底层语言是c&#xff0c;但c用户使用起来很麻烦&#xff0c;这里整理了一些对c比较优化的机器学习算法库&…

不解析,使用解析对象

将面向对象的后端与外部系统集成的传统方式是通过数据传输对象 &#xff0c;这些对象在外出之前先序列化为JSON&#xff0c;然后在返回时反序列化。 这种方法很流行&#xff0c;而且是错误的。 序列化部分应该由打印机代替&#xff0c;我在前面已经解释过。 这是我对反序列化的…

yaml报错TypeError: load() missing 1 required positional argument: ‘Loader‘

添加一下命令即可&#xff1a; 我的操作&#xff1a; return yaml.load(config)改为 return yaml.full_load(config)问题完美解决

3d制作中需要注意的问题_珠宝首饰工艺篇-戒指3D造型设计制作注意要点

1、戒指的常规手寸数据和戒指外围周长计算公式应用参考如下图&#xff1a;戒指手寸内直径大小说明图1、戒指手寸规格有14号、15号、16号、17号、18号、19号、20号、&#xff0c;但是从开发角度来说比较常见规格是17号18号19号这几种规格比较多&#xff0c;那我们电脑3D建模的时…

微信推送封面尺寸_连封面图都搞不明白,做什么新时代的新媒体人?

嘿&#xff0c;胖友们大家好呀&#xff0c;我是三儿。又是精(bu)神(xiang)满(shang)满(ban)的周一啦&#xff0c;胖友们准备好开始迎接新的一周了吗&#xff01;为了迎接这个崭新的周一&#xff0c;三儿特意为你们准备的一些实用的小工具教学&#xff0c;帮助你们快速的完成工作…

latex学习篇【一】论文中的图片技巧QA

第一篇论文总算收尾了&#xff0c;整理一波latex写论文的Q&A。 LATEX专栏第一篇&#xff1a;在Latex模板中引入各种图片的问题。 工具&#xff1a;overleaf网站&#xff1a;https://www.overleaf.com/project/60e9ceb20f8db14efa31dc80在overleaf上面插入图片什么形式最好…

LATEX学习篇【二】:论文中的公式技巧QA

写论文免不了写好多好多公式&#xff0c;众所周知啊latex的公式是很难编辑的&#xff0c;有没有简便一点的办法呢&#xff1f;有的&#xff0c;让我们继续读下去吧&#xff01; 写公式时会用到的一些奇奇怪怪的符号大全&#xff08;来自百度&#xff09; 2. 写公式好用的工具…

使用RabbitMQ的SpringBoot消息传递

RabbitMQ是流行的消息代理解决方案之一&#xff0c;并提供可用于各种编程语言的客户端库&#xff0c;包括Java&#xff0c;Scala&#xff0c;.NET&#xff0c;Go&#xff0c;Python&#xff0c;Ruby&#xff0c;PHP等。在本教程中&#xff0c;我们将学习如何使用RabbitMQ消息代…

1.0jpa 2.0_在JPA 2.1中使用@Convert正确完成映射枚举

1.0jpa 2.0如果您曾经在JPA中使用过Java枚举&#xff0c;那么您肯定会意识到它们的局限性和陷阱。 使用enum作为Entity的属性通常是一个很好的选择&#xff0c;但是2.1之前的JPA不能很好地处理它们。 它给了您2 1个选择&#xff1a; 托肖夫达林 Enumerated(EnumType.ORDINAL…

矩形脉冲信号的_IQ信号的解调学习

前面的文章学习了IQ的调制&#xff0c;本文主要讨论IQ的解调过程。调制波形回顾IQ的shifted DQPSK的调制波形总结如下。IQ的星图映射波形每个symbol有256个采样点&#xff0c;这里可以用单位脉冲或者矩形脉冲。如果只看256个symbol的话&#xff1a;IQ经过FIR滤波之后&#xff0…

Spring Data MongoDB教程

在当今世界&#xff0c;尽快启动并运行应用程序非常重要。 该应用程序还应该易于开发和维护。 Spring是这样的框架&#xff0c;它提供了与许多不同框架的集成的简便性&#xff0c;这使得使用Spring开发应用程序变得容易。 一种这样的集成是Spring与MongoDB的集成。 1.简介 在…