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



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

我的问题是,在我的 viewscope bean 中,<f:viewAction>标签的action属性的 initialize() 函数仅在首次加载页面时被调用。(Firebug Inspect 告诉我这是一个帖子(到调用页面),然后是进入 viewAction 页面)。

我也想在提交此页面上的表格后调用它。从提交表单的commandButton中,我返回一个不带&faces-redirect=true的字符串"/myJsfPage.xhtml",因为我想返回到表单所在的同一页面,而不是不同的页面。

问题是现在 {myBean.nameOfUser.size()} 不显示,其他属性也是如此。同样从调试中我知道这次没有调用 initialize()。当按下提交按钮时,Firebug 仅显示获取请求。我尝试没有onPostback="true"属性,但没有运气。

编辑

我的问题不是关于标签的位置。所以它不是重复的。无论如何,在主模板中添加<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>

我的 javascript 函数.js文件中是:

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

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

从我的函数中,我必须返回

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

而不仅仅是

"/myJsfPage.xhtml"

当我用faces-redirect=true检查它时,我在 url 中添加了&而不是?(非常基本的错误 - 发生是因为我从 url 中发送另一个参数的地方复制粘贴它以及重定向)。

现在,Firebug显示一个帖子,然后是同一页面的get(以前缺少)。

从这个链接中,我了解到只有在表单提交后重定向到其他页面时,才应添加faces-redirect=true。这就是为什么我最初不添加它的原因,因为我想在表单提交后加载相同的页面。也许有人可以澄清这一点?

"但通常情况下,结果只是在同一页面上呈现,如果 必要的有条件呈现/包含。仅在成功提交时 这绝对需要转到不同的页面(例如登录/注销), 你确实应该发送重定向。

相关内容

  • 没有找到相关文章

最新更新