【发布时间】:2018-01-10 15:14:52
【问题描述】:
我正在使用来自 mojara 2.2.10 依赖项的 jsf 2.2。
我的问题是,在我的 viewscope bean 中,<f:viewAction> 标签的 action 属性的 initialize() 函数仅在页面第一次加载时才被调用。(firebug 检查告诉我它是一个帖子(到调用页面),然后进入 viewAction 页面)。
我也想在提交此页面上的表单后调用它。从提交表单的commandButton 中,我返回一个字符串"/myJsfPage.xhtml" 而没有&faces-redirect=true,因为我想返回表单所在的同一页面,而不是另一个页面。
问题是现在 {myBean.nameOfUser.size()} 没有显示,其他属性也是如此。同样从调试中我知道这次没有调用 initialize() 。按下提交按钮时,萤火虫仅显示获取请求。我尝试不使用 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>
我的 .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
【问题讨论】:
-
根据 JSF 2.2 文档,动作方法“签名必须匹配 public java.lang.Object action()”,而你没有。先尝试解决这个问题。
-
@Kukeltje 我不这么认为。请参考我的编辑。
-
我知道这不是您的明确问题(SO 中 50% 的问题有点“错误地表达了顺便说一句)。但如果展示位置'错误',它可能无法按预期工作。这至少是我(也)从副本中得到的理解。'纠正'它仍然会更好......
-
@Kukeltje 好的。无论如何,我将其添加为最佳实践。
标签: javascript jsf-2 navigation javabeans forms