每次在<f:viewaction>上初始化bean

时间:2018-01-10 15:14:52

标签: javascript jsf-2 navigation javabeans html-form

我正在使用来自mojara 2.2.10依赖的jsf 2.2。

我的问题是,在我的viewcope bean中,只有在第一次加载页面时才会调用<f:viewAction>标记action属性的initialize()函数。(firebug inspect tell我认为它是一个帖子(到调用页面)然后到了viewAction页面)。

我也想在提交此页面上的表格后再打电话。从提交表单的commandButton开始,我返回一个不带"/myJsfPage.xhtml"的字符串&faces-redirect=true,因为我想返回表单所在的同一页面,而不是另一个页面。

问题是现在不显示{myBean.nameOfUser.size()},因此显示其他属性。同样从调试我知道这次没有调用initialize()。当按下提交按钮时,firebug仅显示get请求。我试过没有onPostback =&#34; true&#34;财产,但没有运气。

修改

我的问题不在于标签的位置。所以它不是重复的。无论如何,在主模板中添加<ui:insert name="metadata">而在.xhtml页面中添加<ui:define name="metadata">并不能解决我的问题。

我的jsf页面:

<ui:composition xmlns="http://www.w3.org/1999/xhtml"
                xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
                xmlns:h="http://xmlns.jcp.org/jsf/html"
                xmlns:f="http://xmlns.jcp.org/jsf/core"
                template="../components/defaultLayout.xhtml">

    <f:metadata>
        <f:viewAction action="#{myBean.initialize}" onPostback="true"/>
    </f:metadata>

    <ui:param name="bodyClass" value="container body-nomargin" />

    <ui:define name="body">
        <h:panelGroup layout="block" styleClass="col-md-10">

            <h:form id="uploadform" enctype="multipart/form-data">

                **#{myBean.nameOfUser.size()}**

                <!-- Only this code works after form submission -->

                    <h:panelGroup class="input-group" layout="block">
                        <input type="text"
                               class="form-control" readonly="readonly"
                               onclick="$('#uploadform\\:file').click();"/>

                        <label class="input-group-btn">
                            <h:panelGroup
                                    class="btn btn-default">
                                <h:outputText value="some value"/>
                                <h:inputFile id="file" value="some other value"
                                             validator="#{myBean.checkFile}"
                                             onchange="$('#uploadform\\:uploadBtn').removeClass('disabled');"
                                             style="display: none;"/>
                            </h:panelGroup>
                            <h:commandButton id="uploadBtn" value="Upload"
                                             action="#{myBean.uploadFile}"
                                             styleClass="btn btn-primary disabled"/>
                        </label>
                    </h:panelGroup>

                    <h:outputScript>
                        $(function () {
                            doUpload();
                        });
                    </h:outputScript>
                </h:panelGroup>
           </h:form>

来自.js文件的我的javascript函数是:

function initializeFileUpload() {

    $(document).on('change', ':file', function() {
        var input = $(this),
            numFiles = input.get(0).files ? input.get(0).files.length : 1,
            label = input.val().replace(/\\/g, '/').replace(/.*\//, '');
        input.trigger('fileselect', [numFiles, label]);
    });


    $(document).ready( function() {
        $(':file').on('fileselect', function(event, numFiles, label) {

            var input = $(this).parents('.input-group').find(':text'),
                log = numFiles > 1 ? numFiles + ' files selected' : label;

            if( input.length ) {
                input.val(log);
            } else {
                if( log ) alert(log);
            }

        });
    });
}

我的Java Bean是:

 public void initialize() {        
    setAllFilesOfUser(myDatabaseFunction());                   
 }

 public String uploadFile() {

    //SomeCode

    System.out.println(nameOfUser.size());
        return "/myJsfPage.xhtml";
 }

    //Few more methods and attributes with getter and setters

1 个答案:

答案 0 :(得分:0)

所以我找到了解决方案,虽然我仍然不了解它是如何工作的。

从我的功能我必须返回

"/myJsfPage.xhtml?faces-redirect=true";

而不仅仅是

"/myJsfPage.xhtml"

当我使用faces-redirect=true进行检查时,我在网址中添加了&而不是?(非常基本的错误 - 因为我复制了粘贴来自其他地方的地方在url中发送的参数以及重定向)。

现在,萤火虫显示了一个帖子,然后是一个get(之前已经丢失)到同一页面。

this link我知道只有在表单提交后重定向到其他页面时才应添加faces-redirect=true。这就是为什么我最初添加它,因为我想在表单提交后加载相同的页面。可能有人可以澄清一下吗?

  

&#34;但结果通常只是在同一页面中显示,如果   有条件地呈现/包含的必要条件。只有成功提交   绝对需要转到不同的页面(例如登录/注销),   你确实应该发送一个重定向。&#34;