开发者

Why this param is being sent as Null in my Bean?

开发者 https://www.devze.com 2023-04-13 06:11 出处:网络
I am Using JSF 2 and EJB 3.1 to create a form. I am using this part of the page to get me some data, so I can pass it to my bean using the confirmDialog just below

I am Using JSF 2 and EJB 3.1 to create a form.

I am using this part of the page to get me some data, so I can pass it to my bean using the confirmDialog just below

<p:column headerText="#{bundle.edit}" style="width:10px; overflow:visible;">  
    <p:rowEditor/>                            
</p:column>
<p:column headerText="#{bundle.delete}" style="width:10px; overflow:visible;">
    <p:commandButton update=":form" oncomplete="confirmation.show()" 
                     image="ui-icon ui-icon-close" title="Delete">  
        <f:param value="#{user}" name="userAction" />
    </p:commandButton>  
</p:column>
</p:dataTable>

<p:confirmDialog message="Are you sure? user:#{param['userAction']} " width="500"  
                    header="Confirm" severity="alert" widgetVar="confirmation">  
    <p:commandButton value="Yes sure" update=":form" 
              actionListener="#{userController.deleteAction(param['userAction'])}"
              oncomplete="confirmation.hide()" />  
    <p:commandButton value="Not yet" onclick="confirmation.hide()" type="button" />  

</p:confirmDialog>

</h:form>

And this is the Bean that should get it

@Named(value = "userController")
@Stateful
@RequestScoped
@TransactionManagement(开发者_如何学JAVATransactionManagementType.CONTAINER)
public class UserController implements Serializable {

    private User current;

    @Inject
    private br.com.cflex.itm.dataaccess.UserFacade userFacade;

    public UserController() {
    }

    public void deleteAction(User user) {
        userFacade.remove(user);
    }

But My bean is only receiving null as User, and in the Dialog I am printing the data so I can see there is a User Object selected there.

What is wrong in passing params like that ?

Why am I getting null in my Bean? Because they are getting lost in the communication between client and server-side...


<p:commandButton action="#{userController.deleteAction(param['userAction'])}" />

The EL of action (and actionListener) is evaluated when the form is been submitted, not when the form is been displayed. Request parameters are request scoped and are not there in the subsequent request of the form submit. You need to pass it along:

<p:commandButton action="#{userController.deleteAction(param['userAction'])}">  
    <f:param name="userAction" value="#{param['userAction']}" />
</p:commandButton>

The EL of <f:param> is evaluated when the form is been displayed. So it will be there in the generated HTML and JavaScript will take care that it is passed along.

Note that request parameters are of String type. Expecting them to be User won't work at all. Basically, it contains the value of User#toString(). You'd need to take String as action argument and convert it to User yourself. Or better, use <f:viewParam> wherein you can explicitly specify a converter.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号