- 浏览: 11767 次
- 性别:
- 来自: 上海
-
最近访客 更多访客>>
最新评论
-
bugmenot:
用了包装类型当然只能用equals比较相等
acrbb 写道 ...
Java Effective 49 基本类型优于装箱基本类型
Add immediate="true" to UIInput and UICommand
Extend the h:inputText as well as the h:commandButton in the test.jsp with immediate="true" :
... <h:inputText binding="#{myBean.inputComponent}" value="#{myBean.inputValue}" valueChangeListener="#{myBean.inputChanged}" immediate="true"> ... <h:commandButton value="submit" action="#{myBean.action}" immediate="true" /> ...
The form submit with the value "test" entered should output at least:
START PHASE RESTORE_VIEW 1
MyBean <init>: constructed
MyBean setInputComponent: javax.faces.component.html.HtmlInputText@2a9fca57
MyBean setOutputComponent: javax.faces.component.html.HtmlOutputText@13bbca56
END PHASE RESTORE_VIEW 1
START PHASE APPLY_REQUEST_VALUES 2
MyConverter getAsObject: test
MyValidator validate: test
MyBean getInputValue: null
MyBean inputChanged: null to test
MyBean action: succes
END PHASE APPLY_REQUEST_VALUES 2
START PHASE RENDER_RESPONSE 6
MyConverter getAsString: test
MyBean getOutputValue: null
END PHASE RENDER_RESPONSE 6
1. Restore view.
The bean is constructed. The UIViewRoot
is restored from session and the bounded components are set in the component bindings.
2. Apply request values.
Behind the scenes the submitted form values are obtained as request parameters and set in the relevant components in the UIViewRoot
, for example inputComponent.setSubmittedValue("test"
)
. The submitted values are immediately passed through the converter getAsObject()
method and validated by the validator. If the conversion and validation
succeeds, then the initial input value will be retrieved from the value
binding getter and behind the scenes the inputComponent.setValue(submittedValue)
and inputComponent.setSubmittedValue(null
)
will be executed. If the retrieved initial input value differs from the
submitted value, then the valueChangeListener method will be invoked.
This all happens in this phase instead of the Process validations phase
due to the immediate="true"
in the h:inputText
.
Finally the real processing of the form submission happens here. This
happens in this phase instead of the Invoke application phase due to the
immediate="true"
in the h:commandButton
.
验证,应用都在这个阶段执行!
3. Process validations.
This phase is skipped due to the immediate="true"
in the h:commandButton
.
4. Update model values.
This phase is skipped due to the immediate="true"
in the h:commandButton
.
5. Invoke application.
This phase is skipped due to the immediate="true"
in the h:commandButton
.
6. Render response.
The values to be shown are
retrieved from the value binding getters in the backing bean. If a
converter is definied, then the value will be passed through the
converter getAsString()
method and the result will be shown in the form.
Note for all components with immediate : as the Update model values phase is skipped, the value bindings aren't been set and the value binding getters will return null. But the values are still available by the relevant components in the UIViewRoot . In this case you can retrieve the input value from inputComponent.getValue() in the action() method. The new input value is also available by the ValueChangeEvent in the inputChanged() method. You could even change it using inputComponent.setValue(newValue) in the action() method.
在action()中可以发现,这种情况下,inputComponent.getValue() 可以得到值,而getSubmittedValue已经被reset null.
Note for other components without immediate : any other UIInput components inside the same form which don't have immediate="true" set will not be converted, validated nor updated, but behind the scenes the inputComponent.setSubmittedValue(submittedValue) will be executed before the action() method will be executed. You can retrieve the non-converted and non-validated input value from inputComponent.getSubmittedValue() in the action() method. You could even change it using inputComponent.setSubmittedValue(newValue) in the action() method .
Conversion error
Let's see what happens if a conversion error will occur. Change the getAsObject() method of MyConverter.java as follows (and remove the immediate="true" from the test.jsp file):
package mypackage; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.convert.Converter; import javax.faces.convert.ConverterException; public class MyConverter implements Converter { public Object getAsObject(FacesContext context, UIComponent component, String value) { System.out.println("MyConverter getAsObject: " + value); throw new ConverterException("Conversion failed."); } ... }
The form submit with the value "test" entered should output at least:
START PHASE RESTORE_VIEW 1
MyBean <init>: constructed
MyBean setInputComponent: javax.faces.component.html.HtmlInputText@2a9fca57
MyBean setOutputComponent: javax.faces.component.html.HtmlOutputText@13bbca56
END PHASE RESTORE_VIEW 1
START PHASE APPLY_REQUEST_VALUES 2
END PHASE APPLY_REQUEST_VALUES 2
START PHASE PROCESS_VALIDATIONS 3
MyConverter getAsObject: test
END PHASE PROCESS_VALIDATIONS 3
START PHASE RENDER_RESPONSE 6
MyBean getOutputValue: null
END PHASE RENDER_RESPONSE 6
1. Restore view.
The bean is constructed. The UIViewRoot
is restored from session and the bounded components are set in the component bindings.
2. Apply request values.
Nothing to see here. Behind
the scenes the submitted form values are obtained as request parameters
and set in the relevant components in the UIViewRoot
, for example inputComponent.setSubmittedValue("test"
)
.
3. Process validations.
The submitted values are passed through the converter getAsObject()
method, where a ConverterException is thrown. The validator and the valueChangeListener are bypassed. Also the inputComponent.setValue(submittedValue)
won't take place. The lifecycle will proceed to the Render response phase immediately.
Convert 异常发生,跳过验证,更新,应用,直接到最后的阶段!
4. Update model values.
This phase is skipped due to the ConverterException.
5. Invoke application.
This phase is skipped due to the ConverterException.
6. Render response.
The values to be shown are
retrieved from the value binding getters in the backing bean, expecting
the values for which a ConverterException has occurred. Behind the
scenes those will be retrieved from the components in the UIViewRoot
, e.g. inputComponent.getSubmittedValue()
.
发生异常的,会从inputComponent.getSubmittedValue()取值!
Note : any other UIInput components inside the same form which don't throw a ConverterException will continue the lifecycle as usual , only the invoke application phase will still be skipped.
Validation error
Let's see what happens if a validation error will occur. Change the validate() method of MyValidator.java as follows (and remove the immediate="true" from the test.jsp file and revert MyConverter.java back to original):
package mypackage; import javax.faces.application.FacesMessage; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.validator.Validator; import javax.faces.validator.ValidatorException; public class MyValidator implements Validator { public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { System.out.println("MyValidator validate: " + value); throw new ValidatorException(new FacesMessage("Validation failed.")); } }
The form submit with the value "test" entered should output at least:
START PHASE RESTORE_VIEW 1
MyBean <init>: constructed
MyBean setInputComponent: javax.faces.component.html.HtmlInputText@2a9fca57
MyBean setOutputComponent: javax.faces.component.html.HtmlOutputText@13bbca56
END PHASE RESTORE_VIEW 1
START PHASE APPLY_REQUEST_VALUES 2
END PHASE APPLY_REQUEST_VALUES 2
START PHASE PROCESS_VALIDATIONS 3
MyConverter getAsObject: test
MyValidator validate: test
END PHASE PROCESS_VALIDATIONS 3
START PHASE RENDER_RESPONSE 6
MyBean getOutputValue: null
END PHASE RENDER_RESPONSE 6
1. Restore view.
The bean is constructed. The UIViewRoot
is restored from session and the bounded components are set in the component bindings.
2. Apply request values.
Nothing to see here. Behind
the scenes the submitted form values are obtained as request parameters
and set in the relevant components in the UIViewRoot
, for example inputComponent.setSubmittedValue("test"
)
.
3. Process validations.
The values are retrieved as objects from the components, passed through the converter getAsObject()
method and validated by the validator, where a ValidatorException is thrown. The valueChangeListener is bypassed. Also the inputComponent.setValue(submittedValue)
won't take place. The lifecycle will proceed to the Render response phase immediately.
4. Update model values.
This phase is skipped due to the ValidatorException.
5. Invoke application.
This phase is skipped due to the ValidatorException.
6. Render response.
The values to be shown are
retrieved from the value binding getters in the backing bean, expect of
the values for which a ValidatorException has occurred. Behind the
scenes those will be retrieved from the components in the UIViewRoot
, e.g. inputComponent.getSubmittedValue()
.
Note : any other UIInput components inside the same form which don't throw a ValidatorException will continue the lifecycle as usual , only the invoke application phase will still be skipped.
Okay, when should I use the immediate attribute?
If it isn't entirely clear yet, here's a summary, complete with real world use examples when they may be beneficial:
- If set in UIInput (s) only, the process validations phase will be taken place in apply request values phase instead. Use this to prioritize validation for the UIInput component(s) in question. When validation/conversion fails for any of them, the non-immediate components won't be validated/converted.
当组件设置“即时",那么验证就会在第二阶段是,可以优先让它得到验证,避免其他非即时组件的验证与转化!
- If set in UICommand only, the apply request values phase until with update model values phases will be skipped for any of the UIInput component(s). Use this to skip the entire processing of the form. E.g. "Cancel" or "Back" button.
如果是按钮设置“即时”,那么可以跳过验证与转化的过程!
- If set in both UIInput and UICommand components, the apply request values phase until with update model values phases will be skipped for any of the UIInput component(s) which does not have this attribute set. Use this to skip the processing of the entire form expect for certain fields (with immediate). E.g. "Password forgotten" button in a login form with a required and immediate username field and a required but non-immediate password field.
如果提交按钮与组件都设置“即时",那么可以跳过非即时 组件的验证与转化!
相关推荐
3. **Managed Beans**:作为业务逻辑的容器,提供了一种简化的方法来管理bean对象,包括依赖注入(DI)和生命周期管理。 4. **Faces Flow**:提供了一种新的方式来组织和导航复杂的UI流程,使得多个视图之间的转换...
JSF生命周期总结JSF生命周期总结JSF生命周期总结JSF生命周期总结JSF生命周期总结JSF生命周期总结
《JSF-AV-rules.rar》是一个压缩包文件,包含了航空C++编程规范,这个规范主要针对的是在航空系统开发中使用C++编程时应当遵循的一系列规则和标准。航空系统的软件开发对于安全性、可靠性和可维护性有着极高的要求,...
【标题】"jboss-ajax4jsf-1.1.1-src" 是一个开源项目,主要涉及Ajax4jsf框架的源代码版本,版本号为1.1.1。Ajax4jsf是针对JavaServer Faces (JSF) 技术的一个扩展,它允许开发者在JSF应用中无缝集成Ajax功能,提升...
这是jsf-api-2.0.jar,为了使用方便传上来.只是个jar包.
《集体林权流转合同》(JSF-2015-2602)是针对我国农村集体林地使用权和林木所有权转移的一种规范性法律文件。这份文档,以.docx格式存储在压缩包内,旨在为涉及集体林权交易的各方提供一个标准化的合同模板,确保...
在深入理解JSF请求处理生命周期之前,我们先要明白JSF的核心目标是简化Web开发,尤其是处理用户输入和更新服务器端状态的过程。生命周期的概念在JSF中扮演着至关重要的角色,因为它自动化了许多传统Web技术中需要...
综上所述,"jsf-api-1.2"提供了丰富的API和功能,使开发者能够高效地构建和维护企业级的Java Web应用程序。通过对组件、事件、Managed Beans、视图状态、转换验证、导航、国际化以及错误处理的理解和熟练运用,...
- `jsf-impl.jar` 和 `jsf-api.jar` 包含了JSF2的核心实现和API,供应用程序使用。 - `commons-collections-3.1.jar` 提供了集合操作的扩展,常常用于辅助处理数据。 - `commons-beanutils-1.8.0.jar` 提供了对...
"jsf-api" JAR文件包含了JSF框架的公共接口和类,定义了各种组件、事件和生命周期方法,供开发者在代码中引用。而"jsf-impl" JAR文件则提供了这些API的具体实现,包括渲染器、生命周期管理器等,使得开发者可以直接...
3. **FacesContext与ApplicationContext**:在JSF中获取Spring的ApplicationContext,以便于在JSF的生命周期中使用Spring服务。 4. **安全整合**:如Spring Security可以与JSF集成,提供用户认证和授权功能。 5. **...
jsf-impl-2.0.0源代码文件, jsf-impl-2.0.0-SNAPSHOT-sources.jar
【标题】"jsf-spring-boot-starter-2.2.6.zip" 是一个基于Java Server Faces (JSF) 和Spring Boot的启动器项目,版本为2.2.6。这个压缩包通常包含了用于快速搭建JSF应用在Spring Boot环境中的必要组件和配置。 ...
这是jsf-impl-1.2_15.jar,为了使用方便传上来.只是个jar包.
`jsf-api-src.zip`是一个压缩包,包含了JSF API的源代码,这对于开发者深入理解JSF的工作原理、调试和自定义组件非常有帮助。 在这个源码包中,`jsf127src`很可能代表JSF 1.2或2.7版本的源代码。JSF 1.2是JSF的第一...
1. **JSF基础**:JSF的基本概念,如UI组件、生命周期、渲染树和事件处理。这些组件是预定义的可重用HTML元素,例如按钮、文本输入框等,它们简化了HTML标记的编写。 2. **JSF架构**:JSF的工作原理,包括视图、控制...
2. **jsf-impl.jar**: `jsf-impl.jar`包含了JSF框架的具体实现,是`jsf-api.jar`中接口和抽象类的具体实现。这个库包含了以下关键部分: - JSF组件库的实现,如`UIInput`、`UICommand`等,它们是JSF中常用组件的...
JSF-api-1.2_14-sources.jar,提供了jsf使用时的多种内部类。
在这个名为"jsf-by-example-源码"的压缩包中,我们很可能会找到一系列关于JSF应用开发的示例代码。 **1. JSF框架概述** JSF遵循MVC(Model-View-Controller)设计模式,提供了一种声明式的方式来管理Web界面的生命...
`jsf-ri`包含了JSF生命周期的执行逻辑,包括渲染、事件处理、数据绑定等关键流程。通过研究`jsf-ri`的源码,开发者可以了解JSF如何处理请求、更新模型、调用生命周期方法,以及如何处理视图状态。 ### 3. `jsf-...