深入探索JavaServerFaces2.2开发:组件、流程与HTML5支持
立即解锁
发布时间: 2025-08-18 02:36:47 阅读量: 2 订阅数: 4 

### 深入探索JavaServer Faces 2.2开发:组件、流程与HTML5支持
#### 1. JSF复合组件开发
JSF的一大出色特性是能够轻松编写自定义组件。在JSF 2中,创建自定义组件只需编写其标记,无需Java代码或配置。由于自定义组件通常由其他JSF组件组成,因此被称为复合组件。
##### 1.1 创建复合组件步骤
1. 打开NetBeans,选择“File | New File”。
2. 选择“JavaServer Faces”类别,然后选择“JSF Composite Component”文件类型。
3. 点击“Next”,指定自定义组件的文件名、项目和文件夹。为利用JSF 2.0的自动资源处理和约定,不建议更改组件的默认放置文件夹。
4. 点击“Finish”,NetBeans会生成一个空的复合组件:
```xml
<?xml version='1.0' encoding='UTF-8' ?>
<!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:cc="http://xmlns.jcp.org/jsf/composite">
<!-- INTERFACE -->
<cc:interface>
</cc:interface>
<!-- IMPLEMENTATION -->
<cc:implementation>
</cc:implementation>
</html>
```
每个JSF 2复合组件包含两个部分:接口和实现。接口部分必须包含在`<cc:interface>`标签内,用于定义组件的所有属性;实现部分包含使用组件时将渲染的标记。
以开发一个用于输入地址的简单组件为例,填充后的复合组件如下:
```xml
<?xml version='1.0' encoding='UTF-8' ?>
<!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:cc="http://xmlns.jcp.org/jsf/composite"
xmlns:h="http://xmlns.jcp.org/jsf/html"
xmlns:f="http://xmlns.jcp.org/jsf/core">
<!-- INTERFACE -->
<cc:interface>
<cc:attribute name="addrType"/>
<cc:attribute name="namedBean" required="true"/>
</cc:interface>
<!-- IMPLEMENTATION -->
<cc:implementation>
<h:panelGrid columns="2">
<f:facet name="header">
<h:outputText value="#{cc.attrs.addrType} Address"/>
</f:facet>
<h:outputLabel for="line1" value="Line 1"/>
<h:inputText id="line1"
value="#{cc.attrs.namedBean.line1}"/>
<h:outputLabel for="line2" value="Line 2"/>
<h:inputText id="line2"
value="#{cc.attrs.namedBean.line2}"/>
<h:outputLabel for="city" value="City"/>
<h:inputText id="city" value="#{cc.attrs.namedBean.city}"/>
<h:outputLabel for="state" value="state"/>
<h:inputText id="state" value="#{cc.attrs.namedBean.state}"
size="2" maxlength="2"/>
<h:outputLabel for="zip" value="Zip"/>
<h:inputText id="zip" value="#{cc.attrs.namedBean.zip}"
size="5" maxlength="5"/>
</h:panelGrid>
</cc:implementation>
</html>
```
通过`<cc:attribute>`标签指定组件的属性,该标签有一个`name`属性用于指定属性名,还有一个可选的`required`属性用于指定属性是否必需。
使用组件时,通过`#{cc.attrs.ATTRIBUTE_NAME}`表达式访问标签的属性。组件的`namedBean`属性必须解析为一个命名bean,使用该组件的页面必须使用解析为托管bean的JSF表达式作为`namedBean`属性的值。
使用复合组件的示例代码如下:
```xml
<?xml version='1.0' encoding='UTF-8' ?>
<!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:h="http://xmlns.jcp.org/jsf/html"
xmlns:ezcomp="http://xmlns.jcp.org/jsf/composite/ezcomp">
<h:head>
<title>Address Entry</title>
</h:head>
<h:body>
<h:form>
<h:panelGrid columns="1">
<ezcomp:address namedBean="#{addressBean}"
addrType="Home"/>
<h:commandButton value="Submit" action="confirmation"
style="display: block; margin: 0 auto;"/>
</h:panelGrid>
</h:form>
</h:body>
</html>
```
自定义组件的命名空间通常为`xmlns:ezcomp="http://xmlns.jcp.org/jsf/composite/ezcomp"`,因此不建议更改组件的默认放置文件夹。NetBeans为自定义复合组件提供代码补全功能。
#### 2. Faces流程
传统的Web应用程序是无状态的,Java Web应用程序框架通过在服务器上存储状态并将Java类附加到不同的应用程序作用域来解决这个问题。JSF通过在CDI命名bean上使用适当的作用域注解来实现这一点。
在不同场景下
0
0
复制全文
相关推荐








