ViewParam vs @ManagedProperty(value = “#{param.id}”)

前端 未结 2 1134
无人及你
无人及你 2020-11-21 23:01

What is the difference between defining View Params like this:


  
         


        
2条回答
  •  不思量自难忘°
    2020-11-21 23:20

    :

    • Sets the value during update model values phase only (since it extends UIInput).

    • The set value is not available during @PostConstruct, so you need an additional inside the to do initialization/preloading based on the set values. Since JSF 2.2 you could use for that instead.

    • Allows for nested and for more fine-grained conversion/validation. Even a can be attached.

    • Can be included as GET query string using includeViewParams attribute of or includeViewParams=true request parameter in any URL.

    • Can be used on a @RequestScoped bean, but it requires the bean to be @ViewScoped if you want the view parameters to survive any validation failures caused by forms enclosed in the view, otherwise you need to manually retain all request parameters for the subsequent requests by in the command components.

    Example:

    
        
    
    
    

    with

    private User user;
    

    and an @FacesConverter("userConverter"). Invoking page by http://example.com/context/user.xhtml?id=123 will pass the id parameter through the converter and set the User object as a bean property.


    @ManagedProperty:

    • Sets the value immediately after bean's construction.

    • Set value is available during @PostConstruct which allows easy initialization/preloading of other properties based on the set value.

    • Doesn't allow for declarative conversion/validation in view.

    • Managed property of #{param} is not allowed on beans with a broader scope than request scope, so the bean is required to be @RequestScoped.

    • If you rely a managed property of #{param} being present in the subsequent POST requests, then you need to include it as in the UICommand components.

    Example:

    @ManagedProperty("#{param.id}")
    private Long id;
    
    private User user;
    
    @EJB
    private UserService userService;
    
    @PostConstruct
    public void init() {
        user = userService.find(id);
    }
    

    But you have to manage validation yourself whenever user is null by fiddling with FacesContext#addMessage() or something.


    You can use them both when both @PostConstruct and includeViewParams are mandatory. You only won't be able to apply fine-grained conversion/validation anymore.


    See also:

    • What can , and be used for?
    • Communication in JSF 2.0 - Processing GET request parameters

提交回复
热议问题