JSF知识点概览

来源:互联网 发布:网络整合营销书面方案 编辑:程序博客网 时间:2024/05/29 15:30

Managed Bean

Managed Bean的配置

<managed-bean>
<managed-bean-name>mybean</managed-bean-name>

<managed-bean-class>org.pfyu.beans.MyBean

</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>

<managed-property>
<property-name>userName</property-name>
<value>tom</value>
</managed-property>
<managed-property>
<property-name>password</property-name>
<value>123456</value>
</managed-property>
</managed-bean>

<managed-bean>
<managed-bean-name>myname</managed-bean-name>

<managed-bean-class>org.pfyu.beans.MyAnotherBean

</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>

<managed-property>
<property-name>myBean</property-name>
<value>#{mybean}</value>
</managed-property>
</managed-bean>


Managed Bean的使用

利用EL来取得Bean的属性与方法

<h:inputText value="#{myname.userName}"/>


Managed Bean的范围

Request, Session, Application


Managed Bean的List与Map

<managed-property>
<property-name>aList</property-name>
<list-entries>
<value-class>java.lang.Integer</value-class>
<value>1</value>
<value>2</value>
<value>3</value>
</list-entries>
</managed-property>

<managed-property>
<property-name>aMap</property-name>
<map-entries>
<value-class>java.lang.Integer</value-class>
<map-entry>
<key>aKey</key>
<value>1</value>
</map-entry>
<map-entry>
<key>aKey1</key>
<value>2</value>
</map-entry>
</map-entries>
</managed-property>


Navigation Rule

    <navigation-rule>  
        <from-view-id>/*</from-view-id>  
        <navigation-case>  

           <from-action>#{myBean.verify}</from-action>
            <from-outcome>ab</from-outcome>  
            <to-view-id>/ab.jsp</to-view-id>

            <redirect/>
        </navigation-case>  
    </navigation-rule> 

其中:

from-veiw-id: 定义了来源页面

navigation-case: 定义了导航条件

from-action: 定义了导航的动作方法

from-outcome: 定义了导航的条件

to-view-id: 定义了目的页面

redirect: 重定向


EL

EL以#开头,将变量、常量或表达式放置在{}中。以下是一些常用的使用方法:

<h:outputText value="#{userBean.name}"/>

<h:outputText value="#{userBean.name}, #{userBean.age}"/>

<h:outputText value="#{someBean.someMap[user.name]}"/>

<h:outputText value="#{someBean.someList[0]}"/>

<h:outputText value="#{someBean.someArray[1]}"/>

<h:outputText value="#{someBean.someListOrArray[user.age]}"/>

<h:outputText value="#{true}"/>

<h:outputText value="#{'This is a test'}"/>


Converter

内置转换器

对于PrimitiveType或其Wrapper类,JSF 会使用javax.faces.Boolean、javax.faces.Byte、javax.faces.Character、javax.faces.Double、javax.faces.Float、javax.faces.Integer、javax.faces.Long、javax.faces.Short 等自动进行转换,对于BigDecimal、BigInteger,则会使用javax.faces.BigDecimal、javax.faces.BigInteger
自动进行转换。

对于Date和Number,可以使用使用<f:convertDateTime>、<f:convertNumber>标签进行转换。


自定义转换器

首先需要实现接口javax.faces.convert.Converter,并实现方法:

public Object getAsObject(FacesContext context, UIComponent component, String str);
public String getAsString(FacesContext context, UIComponent component, Object obj);

其次需要注册该转换器,有两种方法

1)在faces-config.xml中添加

<converter>
<converter-id>xxx</converter-id>
<converter-class>
xxx.xxxConverter
</converter-class>
</converter>

2)直接在Bean 上提供一个取得转换器的方法,如:

private Converter converter = new UserConverter();

public Converter getConverter() {
return converter;
}

最后使用该转换器,有两种方法,如:

1)<h:outputText value="#{guest.user}"
converter="xxx.xxxConverter"/>

2)<h:inputText id="userField" value="#{guest.user}">
<f:converter converterId="xxx"/>
</h:inputText>


Validator

内置验证器

JSF 提供了三种标准验证器:<f:validateDoubleRange>、<f:validateLongRange>、<f:validateLength>

除此之外,还有一些属性,如required="true"


自定义验证器

有两种方法

1)首先需要实现接口javax.faces.validator.Validator,实现其方法:

public void validate(FacesContext context, UIComponent component, Object obj) throws ValidatorException 

其次需要注册该验证器

<validator>
<validator-id>
onlyfun.caterpillar.Password
</validator-id>
<validator-class>
onlyfun.caterpillar.PasswordValidator
</validator-class>
</validator>

最后使用该验证器,如:

<h:inputSecret value="#{user.password}" required="true">
<f:validator validatorId="xxx.xxxValidator"/>
</h:inputSecret>

2)直接在Managed Bean里面提供一个验证方法,这个方法没有传回值,并可以接收FacesContext、UIComponent、Object 三个参数。

然后使用该验证器,如:

<h:inputSecret value="#{user.password}"
required="true"
validator="#{user.validate}"/>


Event Handling

动作事件

首先创建相应的动作方法,如:

public void verify(ActionEvent e) {

xxx
}
public String outcome() {
return outcome;
}

然后使用该动作,如:

<h:commandButton value="送出"
actionListener="#{user.verify}"
action="#{user.outcome}"/>


也可以使用多个动作方法,这就需要实现多个javax.faces.event.ActionListener接口。如:

public class MyListener1 implements ActionListener {
public void processAction(ActionEvent e) {
// 处理Log
}
}

public class MyListener1implements ActionListener {
public void processAction(ActionEvent e) {
// 处理Log
}
}

然后使用这几个动作方法,如:

<h:commandButton value="送出" action="#{user.outcome}">
<f:actionListener type="xxx.MyListener1"/>
<f:actionListener type="xxx.MyListener2"/>
</h:commandButton>


实时事件

所谓的实时事件(Immediate Events),是指JSF 视图组件在取得请求中该取得的值之后,即立即处理指定的事件,而不再进行后续的转换器处理、验证器处理、更新模型值
等流程。

您可以设定组件的事件在套用请求值之后立即被处理,并跳过后续的阶段,直接进行画面绘制以响应请求,对于JSF 的input 与command 组件,都有一个immediate 属性可
以设定,只要将其设定为true,则指定的事件就成为立即事件。如:

<h:commandButton value="#{msgs.Text}"
immediate="true" actionListener="#{user.changeLocale}"/>


值变事件

有两种使用方法

1)在Managed Bean中创建值变方法,如:

public void changeLocale(ValueChangeEvent event) {
if(locale.equals("en"))
locale = "zh_TW";
else
locale = "en";
}

然后使用该方法,如:

<h:selectOneMenu value="#{user.locale}"
onchange="this.form.submit();"
valueChangeListener="#{user.changeLocale}">
<f:selectItem itemValue="zh_TW" itemLabel="Chinese"/>
<f:selectItem itemValue="en" itemLabel="English"/>
</h:selectOneMenu>

2)实现javax.faces.event.ValueChangeListener接口和processValueChange()方法,如:

public class SomeListener implements ValueChangeListener {
public void processValueChange(ValueChangeEvent event) {
....
}
....
}

然后使用该类,如:

<h:selectOneMenu value="#{user.locale}" onchange="this.form.submit();">
     <f:valueChangeListener type="onlyfun.caterpillar.SomeListener"/>
     <f:selectItem itemValue="zh_TW" itemLabel="Chinese"/>
     <f:selectItem itemValue="en" itemLabel="English"/>
</h:selectOneMenu>


Phase事件

在JSF的LifeCycle中,在每个阶段的前后会引发javax.faces.event.PhaseEvent,如果您想尝试在每个阶段的前后捕捉这个事件,以进行一些处理,则可以实作
javax.faces.event.PhaseListener,并向javax.faces.lifecycle.Lifecycle 登记这个Listener,以有适当的时候通知事件的发生。

PhaseListener 有三个必须实作的方法getPhaseId()、beforePhase()与afterPhase()。而PhaseID有:

• PhaseId.RESTORE_VIEW
• PhaseId.APPLY_REQUEST_VALUES
• PhaseId.PROCESS_VALIDATIONS
• PhaseId.UPDATE_MODEL_VALUES

• PhaseId.INVOKE_APPLICATION
• PhaseId.RENDER_RESPONSE
• PhaseId.ANY_PHASE

在创建完PhaseListener后,需要注册之,如:

<lifecycle>
<phase-listener>
  xxx.xxxPhaseListener
</phase-listener>
</lifecycle>

然后就可以查看每个阶段的内容变化


LifeCycle

扣除事件处理,JSF 总共必须经过六个阶段:
• 回复画面(Restore View)
对于选择的页面如果是初次浏览则建立新的组件树。如果是会话阶段,会从使用者端或服务器端的数据找寻数据以回复每个组件的状态并重建组件树,如果不包括请求参数,则直接跳过接下来的阶段直接绘制响应。
• 套用申请值(Apply Request Values)
每个组件尝试从到来的请求中找寻自己的参数并更新组件值,在这边会触发ActionEvent,这个事件会被排入队列中,然后在唤起应用程序阶段之后才会真正由事件处理者进行处理。
然而对于设定immeduate 为true 的命令(Commamnd)组件来说,会立即处理事件并跳过之后的阶段直接绘制响应,而对于设定immediate 为true 的输入(Input)组件,
会马上进行转换验证并处理值变事件,之后跳过接下来的阶段,直接绘制响应。
• 执行验证(Process Validations)
进行转换与验证处理,如果验证错误,则会跳过之后的阶段,直接绘制响应,结果是重新呼叫同一页绘制结果。
• 更新模型值(Update Model Values)
更新每一个与组件绑定的backing bean 或模型对象。
• 唤起应用程序(Invoke Application)
处理动作事件,并进行后端应用程序逻辑。
• 绘制回应(Render Response)
使用绘制器绘制页面。


Components

输入类(Input)

<h:inputText styleClass="inputText" id="text1"></h:inputText>

<h:inputSecret styleClass="inputSecret" id="secret1"></h:inputSecret>

<h:inputHidden id="hidden1"></h:inputHidden>

<h:inputTextarea styleClass="inputTextarea" id="textarea1"></h:inputTextarea>


输出类(Output)

<h:outputText styleClass="outputText" id="text2"></h:outputText>

<h:outputFormat styleClass="outputFormat" id="format1"></h:outputFormat>

<h:outputLabel value="a" styleClass="outputLabel" id="label1"></h:outputLabel>

 <h:outputScript styleClass="outputScript" id="script1"></h:outputScript>
 <h:outputStylesheet styleClass="outputStylesheet" id="stylesheet1"></h:outputStylesheet>


选择类(Select)

<h:selectBooleanCheckbox styleClass="selectBooleanCheckbox" id="checkbox1"></h:selectBooleanCheckbox>

<h:selectManyCheckbox disabledClass="selectManyCheckbox_Disabled" styleClass="selectManyCheckbox" id="checkbox2"></h:selectManyCheckbox>

<h:selectOneMenu styleClass="selectOneMenu" id="menu1"></h:selectOneMenu>

<h:selectManyMenu styleClass="selectManyMenu" id="menu2"></h:selectManyMenu>

<h:selectOneListbox styleClass="selectOneListbox" id="listbox1"></h:selectOneListbox>

<h:selectManyListbox styleClass="selectManyListbox" id="listbox2"></h:selectManyListbox>

<h:selectOneRadio/>


命令类(Command)

<h:button value="Click" styleClass="button" id="button2"></h:button>

<h:commandButton type="submit" value="Submit" styleClass="commandButton" id="button1"></h:commandButton>

<h:link value="Link" styleClass="link" id="link1"></h:link>

<h:commandLink styleClass="commandLink" id="link2">
      <h:outputText id="text3" styleClass="outputText" value="link label"></h:outputText></h:commandLink>

<h:outputLink styleClass="outputLink" id="link3">
                    <h:outputText id="text4" styleClass="outputText" value="link label"></h:outputText></h:outputLink>


面板类 (Panel)

<h:panelGrid columns="2">

<h:panelGroup>


表单类(Form)

<h:form styleClass="form" id="form2"></h:form>


表格类(Table)

                <h:dataTable border="0" cellpadding="2" cellspacing="0"
                    columnClasses="columnClass1" headerClass="headerClass"
                    footerClass="footerClass" rowClasses="rowClass1, rowClass2"
                    styleClass="dataTable" id="table1">
                    <h:column id="column1">
                        <f:facet name="header">
                            <h:outputText id="text5" styleClass="outputText" value="Column 1"></h:outputText>
                        </f:facet>
                    </h:column>
                </h:dataTable>


消息类(Message)

 <h:message styleClass="message" id="message1"></h:message>
 <h:messages styleClass="messages" id="messages1"></h:messages>


图像类(Image)

<h:graphicImage styleClass="graphicImage" id="image1"></h:graphicImage>


其他

<f:param id="parameter2"></f:param>

<f:verbatim></f:verbatim>

<f:metadata styleClass="metadata" id="metadata1"></f:metadata>





原创粉丝点击