gpt4 book ai didi

jsf - p :remoteCommand destroys @ViewScoped managed bean

转载 作者:行者123 更新时间:2023-12-05 06:45:46 25 4
gpt4 key购买 nike

我在向表单添加 p:remoteCommand 时遇到问题。它看起来像:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html" xmlns:f="http://java.sun.com/jsf/core"
xmlns:util="http://java.sun.com/jsf/composite/components/util"
xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:fn="http://java.sun.com/jsp/jstl/functions"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Reset Test</title>
<link type="text/css" rel="stylesheet" href="/treetable-sscce/css/example.css" />
<h:outputScript library="primefaces" name="jquery/jquery.js"/>
</h:head>

<div class="box">
<h2>Box</h2>
<h:panelGroup id="mypanel">
Headline: <h:outputText value="#{resetBean.headline}" />
<br/>
Message : <h:outputText value="#{resetBean.message}" />
<br/>
</h:panelGroup>
</div>

<div class="box">
<h2>Form</h2>
<h:form id="myform" acceptcharset="utf-8">

<p:growl id="growl" showDetail="true" sticky="false" severity="info, warn" />

<!-- register custom validate event -->
<f:event listener="#{resetBean.validateForm}" type="postValidate" />

<p:remoteCommand name="resetByEscape" action="#{resetBean.resetAction}"
immediate="true" update=":myform :mypanel" />

<h:outputLabel for="headline">Meldungsüberschrift</h:outputLabel>
<h:inputText id="headline" value="#{resetBean.headline}" />
<br/>

<h:outputLabel for="message">Meldungsüberschrift</h:outputLabel>
<h:inputTextarea id="message" value="#{resetBean.message}" />
<br/>

<h:commandButton action="#{resetBean.resetAction}"
value="Reset" immediate="true" onclick="resetForm()"/>

<h:commandButton action="#{resetBean.submitAction}" value="Submit" immediate="false"/>

</h:form>
</div>

<script type="text/javascript">
<!--//--><![CDATA[//><!--

var resetForm = function()
{
$("[id$='headline']").val(null)
$("[id$='message']").val(null)
}

var escapePressed = function()
{
resetForm();
resetByEscape();
}

$(document).keyup(function(e) {if (e.keyCode == 27) escapePressed();});

//--><!]]>
</script>
</html>

下面是bean代码:

package de.example.beans;

import java.io.Serializable;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ComponentSystemEvent;
import javax.faces.validator.ValidatorException;

import org.apache.log4j.Logger;

@ViewScoped
@ManagedBean
public class ResetBean implements Serializable
{
private static final long serialVersionUID = 7282752623428425109L;
private static final Logger log = Logger.getLogger(ResetBean.class);

protected String headline = null;
protected String message = null;

public ResetBean() {
log.error("ResetBean");
}

@PostConstruct
public void postConstruct() {
log.error("postConstruct");
}

@PreDestroy
public void preDestroy() {
log.error("preDestroy");
}

public void resetAction() {
log.error("resetAction");
headline = null;
message = null;
}

public void submitAction() {
log.error("submitAction headline="+headline+" message="+message);
}

public void validateForm(ComponentSystemEvent event) throws ValidatorException {
log.error("validateForm");
}

public String getHeadline() {
return headline;
}

public void setHeadline(String headline) {
this.headline = headline;
}

public String getMessage() {
return message;
}

public void setMessage(String message) {
this.message = message;
}

}

h:command 按钮和 p:remoteCommand 都以相同的方式执行相同的操作。不同之处在于,h:command 按钮响应鼠标点击,而 ESC 键在使用 ESC 键时通过 javascript 触发 p:remoteCommand

问题是,通过p:remoteCommand 的路由似乎以某种方式破坏了支持bean(该bean 是@ViewScoped)。但是,永远不会调用带注释的 @PreDestroy 方法:使用 p:remoteCommand 后页面上的下一个操作会强制从头开始创建组件!默认构造函数和 @PostConstruct 被调用。自然地,一些重要的参数现在丢失了,整个 View 都变得一团糟。

知道发生了什么吗?为什么在这种情况下 p:remoteCommmandh:commandButton 之间存在差异?是否有机会解决该问题?

最佳答案

我可以重现这个问题。在我的情况下,也许这里的情况相同(问题仅提供“示例”代码,而不是真实代码),它是由嵌套表单模板->页面引起的。

如果你有一个 ui:composition 模板或类似的东西,在客户端生成的 HTML 的末尾,它可能会创建这样的嵌套表单:

<h:form>
...
<h:form>
...
</h:form>
...
</h:form>

这是无效的 HTML 代码。

删除不必要的表格或重新组织代码并再次测试。当通过 JavaScript 调用 p:remoteCommand 时,它不应该调用 @postConstruct 方法

关于jsf - p :remoteCommand destroys @ViewScoped managed bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21485301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com