【问题标题】:Calling methods in jsf [duplicate]在jsf中调用方法[重复]
【发布时间】:2016-08-18 02:59:47
【问题描述】:

我想让预订/删除预订产品页面成为可能。 预订还可以,不幸的是不能删除...

@ManagedBean(name = "wardrobeDetailsBean")
@SessionScoped
//@RequestScoped
public class WardrobeDetailsBean implements Serializable {

    @Inject
    WardrobeService wardrobeService;
    @Inject
    AuthBean authBean;

    // other fields + setters, getters

    @ManagedProperty("#{param.id}")
    private Long id;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsernameReserving() {
        this.selectedWardrobe = wardrobeService.getWardrobeById(id);
        String usernameById = selectedWardrobe.getReservingUserId().getUsername();
        StringBuilder sb = new StringBuilder();
        sb.append(usernameById.substring(0, 2));
        sb.append("...");
        sb.append(usernameById.substring(usernameById.length() - 2, usernameById.length()));
        return sb.toString();
    }

    @PostConstruct
    public void init() {
        if (FacesContext.getCurrentInstance().getCurrentPhaseId() == PhaseId.RENDER_RESPONSE) {
            dbImage1 = new DefaultStreamedContent();
        } else if (id != null) {
            this.selectedWardrobe = wardrobeService.getWardrobeById(id);
            }
        }
    }

    public String reserve() {
        this.selectedWardrobe = wardrobeService.getWardrobeById(id);
        if (authBean.getUser() != null && authBean.getUser().getId() != null) {
            selectedWardrobe.setReservingUserId(authBean.getUser());
            wardrobeService.reserveProduct(selectedWardrobe);
            return null;
        } else {
            return "/login.xhtml?faces-redirect=true";
        }
    }

    public void unreserve() {
        this.selectedWardrobe = wardrobeService.getWardrobeById(id);
        selectedWardrobe.setReservingUserId(null);
        wardrobeService.reserveProduct(selectedWardrobe);
    }
}

productView.xhtml

<h:commandButton id="reserve" styleClass="btn-u btn-u-sea-shop btn-u-lg" rendered="#{wardrobeDetailsBean.selectedWardrobe.reservingUserId eq null}"
    value="Reserve" action="#{wardrobeDetailsBean.reserve()}">
        <f:ajax execute="@form" render="reservePanel"/>
</h:commandButton>

<h:outputText value="This product has been reserved by #{wardrobeDetailsBean.usernameReserving}" rendered="#{wardrobeDetailsBean.selectedWardrobe.reservingUserId ne null}"/>
<br />
 <input type="hidden" name="remoteUser" value="#{request.remoteUser}"/> 
// added using guidance from the answers
<h:commandButton id="unreserve" styleClass="btn-u btn-u-red btn-u-lg" rendered="#{request.remoteUser eq wardrobeDetailsBean.selectedWardrobe.reservingUserId.username}"
    value="Unreserve" action="#{wardrobeDetailsBean.unreserve()}">
        <f:ajax execute="@form" render="reservePanel"/>
</h:commandButton>

当我删除 rendered="#{request.remoteUser eq wardrobeDetailsBean.selectedWardrobe.reservingUserId.username}" 时,它可以工作。

当点击预订时,它应该只是可见的移除按钮。 有什么问题,它不起作用?记录我没有的任何错误。

使用答案中的指导后,应用程序的工作方式如下。

我点击“预订”。商品已预约,按钮将被调换。

我点击“取消保留”仍然没有调用该方法,我丢失了有关产品的信息(刷新页面返回有关产品的信息,但产品仍然保留)

【问题讨论】:

  • 是 JSF 2 还是 JSF 1?
  • Mojtaba。它是 JSF 2。
  • 如果让它返回 String 而不是 void 方法呢?
  • 请描述发生了什么?是否调用了 unreserve 方法?还是只是你的渲染有问题?
  • 同样不行

标签: jsf


【解决方案1】:

在请求到达你的bean方法之前,在提交表单的过程中评估按钮的渲染属性,

当您在渲染方法中检查request.remoteUser 时,新请求(操作的发布请求)将为空,渲染评估将为“假”,因此不会调用您的方法。

因此,您必须确保在表单提交期间,您的按钮及其父项的渲染属性保持为真。

这就是你删除渲染属性时的原因,它工作正常。

作为一种解决方法,您可以在表单中添加隐藏输入:

<input type="hidden" name="remoteUser" value="#{request.remoteUser}"/>
<input type="hidden" name="id" value="#{param.id}"/> 


更新:另一种解决方案

另一种解决方案是使用单个按钮,但使用条件值属性和切换方法:

<h:commandButton id="toggle" 
    styleClass="btn-u btn-u-#{(wardrobeDetailsBean.selectedWardrobe.reservingUserId eq null) ? 'sea-shop' : 'red' } btn-u-lg" 
    value="#{(wardrobeDetailsBean.selectedWardrobe.reservingUserId eq null) ? 'Reserve' : 'Unreserve'}" 
    action="#{wardrobeDetailsBean.toggle()}">
        <f:ajax execute="@form" render="reservePanel"/>
</h:commandButton>

在你的 bean 中,使用切换方法:

public String toggle() {
        this.selectedWardrobe = wardrobeService.getWardrobeById(id);
        if(selectedWardrobe.getReservingUserId() == null){
            if (authBean.getUser() != null && authBean.getUser().getId() != null) {
                selectedWardrobe.setReservingUserId(authBean.getUser());
                wardrobeService.reserveProduct(selectedWardrobe);
                return null;
            } else {
                return "/login.xhtml?faces-redirect=true";
            }
        }else{
            this.selectedWardrobe = wardrobeService.getWardrobeById(id);
            selectedWardrobe.setReservingUserId(null);
            wardrobeService.reserveProduct(selectedWardrobe);
        }

    }

【讨论】:

  • 这一行的任务之外还有什么我应该改变的吗?
  • 编辑了该行,因此将新代码放入您的表单中。
  • 更新了以前的解决方案并添加了另一个解决方案,请先编辑以前的解决方案,如果不起作用,如果您想检查另一个解决方案。我仍然确定问题是发布取消保留请求时您的渲染被评估为假
  • 完美运行!非常感谢 Mojtaba!
  • 欢迎您@user3128303
猜你喜欢
  • 2011-03-03
  • 2014-07-18
  • 2017-07-07
  • 2011-04-04
  • 1970-01-01
  • 1970-01-01
  • 2011-12-14
  • 2013-05-04
  • 1970-01-01
相关资源
最近更新 更多