further continuing of double press

让人想犯罪 __ 提交于 2019-12-24 10:56:48

问题


In a previous question BalusC gave me good advice on how a button, in place of a commandButton is useful for non ajax navigation. In particular it updates the destination address in the http: position which is useful for the user to bookmark a page.

I tried to use this information to my advantage until I came upon a problem. In a button I tried to use outcome="#{backing.something}" to find out that it gives me a null result. This looks like a timing problem in that action="#{}" is evaluated only when the button is pressed whereas outcome apparently wants a fixed string which gets checked when the page is loaded.

So I went back to commandButton with ajax="false". This has a problem that my navigation address is the page I came from, not the one I am navigating to. This is the wrong bookmark for the user.

I appreciate all the help I have received in stackoverflow on my learning exercise. Ilan


回答1:


The <h/p:button outcome> is not intented to invoke a bean action method, but to contain the outcome string directly. Any EL in there is evaluated immediately as a value expression. So the method behind it would immediately be invoked when you just open the page containing the <h/p:button>.

There are in your particular case basically two ways to invoke a bean action method on navigation. If you need to invoke it before the navigation takes place and the action isn't intented to be re-invoked everytime when the enduser reopens/reloads the GET request, then make it a POST-Redirect-GET request. It's a matter of adding faces-redirect=true to the outcome value in query string syntax.

E.g.

<p:commandButton action="#{bean.submit}" ... />

with

public String submit() {
    // ...

    return "nextpage?faces-redirect=true";
}

This way the browser will be redirected to the target page after POST, hence the enduser will see the target URL being reflected in the address bar.

Or if you need to invoke the action everytime when the enduser reopens/reloads the GET request, do the job in the (post)constructor or preRenderView listener method of the request/view scoped backing bean instead.

E.g.

<p:button outcome="nextpage" ... />

with

@ManagedBean
@RequestScoped
public class NextpageBacking {

    public NextpageBacking() {
        // In constructor.
    }

    @PostConstruct
    public void onPostConstruct() {
        // Or in postconstructor (will be invoked after construction AND injection).
    }

    public void onPreRenderView() {
        // Or before rendering the view (will be invoked after all view params are set).
    }

    // ...
}

The pre render view listener method needs to be definied as follows in the nextpage

<f:event type="preRenderView" listener="#{nextpageBacking.onPreRenderView}" />

See also:

  • What can <f:metadata>, <f:viewParam> and <f:viewAction> be used for?
  • Communication in JSF 2.0 - Processing GET request parameters


来源:https://stackoverflow.com/questions/10869174/further-continuing-of-double-press

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!