6

我会尽量简短,请留在我这里

"A.jsf" -> managed bean : bean "#{bean.list}": 将我们带到 B.jsf

        <p:growl id="msgs" showDetail="true"/>
        <h:form id="myform1" enctype="multipart/form-data">
            <p:panel header="Upload" style="font-size: 11px;">
                <h:panelGrid columns="2" cellpadding="10">
                    <h:outputLabel value="Drawing:" />
                    <p:fileUpload fileUploadListener="#{bean.handleFileUpload}" update="msgs" allowTypes="*.*;"/>                        
                </h:panelGrid>
                <p:commandButton ajax="false" immediate="true" id="back" value="Back" action="#{bean.list}"/>
                <p:commandButton ajax="false" id="persist" value="Persist" action="#{bean.handleRevision}" />
            </p:panel>
        </h:form>

然后handleFileUpload()

        if(!upload){
            FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error", "You do not have permission to upload.");
            FacesContext.getCurrentInstance().addMessage(null, msg);
        }
        ...

“B.jsf”-> 托管 bean:bean2

 ...
 <p:growl id="msgs" showDetail="true"/>
 ...

当我点击上传时,它给我一个咆哮的错误消息“你没有上传权限。”,这很好。但是当我单击“返回”时,我将转到 B.jsf,我看到了咆哮消息“您没有上传权限”。再次。似乎正在发生的事情是当我单击“返回”时,我发送其他表单请求上传,然后生成相同的错误消息,然后显示在 B.jsf 中。有没有办法解决这个问题,除了将“后退”按钮放入一个空表单之外,因为现在我有两个按钮彼此叠放,而不是并排。我尝试这样做:

FacesContext.getCurrentInstance().addMessage("tom", msg);

希望它会发送到 id="tom" 的组件,所以 id=msgs 的咆哮不会得到负载,但没有运气。upload当我单击按钮时,我尝试打开标志,但是在调用处理导航Back的方法之前请求了 Web 表单。back

它没有我想要的那么简短,因此我要为此道歉:D

4

2 回答 2

5

除了将“后退”按钮放入空表单之外,因为现在我有两个按钮相互叠放

默认情况下,HTML<form>是一个块元素。默认情况下,HTML 块元素被放置在新行中。您实际上想让它成为一个内联元素。您可以display: inline;在 CSS 中使用。

回到实际问题,令我惊讶的fileUploadListener是,尽管immediate="true"p:commandButton. 我试图重现这一点,我可以确认这一点。但我不希望它发生。通常immediate="true"on a button跳过提交“整个”表单的解决方案(至少,跳过UIInput没有此属性的组件)。进一步的调查了解到,它p:fileUpload根本不是一个UIInput组件,并且侦听器在应用请求值阶段而不是验证或更新模型值阶段被触发。所以这种行为是完全可以预测的,但 imo 仍然是设计中的疏忽。

由于对组件的p:fileUpload要求,另一方面,您也可以将其从后退按钮中删除,以便它触发一个 ajaxical 请求并因此跳过被调用。ajax="false"p:commandButtonfileUploadListener

于 2010-08-25T01:13:31.110 回答
2

实际上,将按钮设置为不同的形式听起来是一个很好的解决方案。按钮不再对齐的原因是新的起始<form>元素从它自己的行开始。您应该能够通过添加form { display: inline; }到您的 CSS 文件来防止这种情况发生。

也就是说,如果您有一些剩余的错误消息想要删除,您可以在支持 bean 的初始化方法中执行此操作(如果有的话)。以下作品非常有效:

public void clearErrorMessages() {
    //it may get messy to debug why messages are swallowed
    logger.debug("clearing messages, coming from " + new Exception().getStackTrace()[1]);

    Iterator iter = FacesContext.getCurrentInstance().getMessages();
    while (iter.hasNext()) {
        FacesMessage msg = (FacesMessage) iter.next();
        logger.debug("clearing message: " + msg.getDetail());
        iter.remove();
    }
}

这里的缺点是,在提交表单和初始化目标页面的支持 bean 之间发生的任何错误也会被吞掉。

于 2010-08-24T20:15:11.677 回答