gpt4 book ai didi

java - p :selectOneMenu value set to null, 当位于刷新选项卡 View 中的 p:inplace 时

转载 作者:行者123 更新时间:2023-12-02 02:57:54 26 4
gpt4 key购买 nike

我使用 p:tabView 将可编辑数据拆分为多个部分。所有编辑元素都位于 p:inplace 组件内。该问题特别出在 p:selectOneMenu 组件上。

刷新整个选项卡 View 后,其他选项卡上处于 Activity 状态的 p:selectOneMenu 的值将设置为 null。我不知道为什么。这是一个错误,还是 PrimeFaces 组件的错误使用?

环境:

  • PrimeFaces 3.4
  • MyFaces 2.0.7
  • IBM WebSphere 7.0

重现错误的方法:

  • 制作一个包含多个选项卡的 tabView
  • 将 selectOneMenu 放置在一个选项卡中就位
  • 制作将更新 tabView 的按钮
  • 选择 selectOneMenu 的值,更改选项卡,单击刷新并返回带有 selectOneMenu 的选项卡

示例页面和bean的代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head>
<f:facet name="first">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</f:facet>
<title>QMWPSUI</title>
<h:outputScript library="qm" name="qmutils.js" />
<h:outputScript library="qmwpsui" name="process.js" />
</h:head>
<h:body>


<h:form id="main">
<p:blockUI block="main" trigger="refreshButton" widgetVar="block">
<p:graphicImage
value="#{resource['primefaces-qmui:images/waitprogress.gif']}" />
</p:blockUI>

<h3>Test</h3>

<p:commandButton id="refreshButton" widgetVar="refreshButton"
action="#{test.refresh}"
icon="ui-icon-refresh" title="#{i18n['action.reload']}"
onclick="block.show()"
update="tabView"/>

<p:tabView id="tabView" orientation="top" dynamic="TRUE">
<p:tab id="tab1" title="Tab 1" process="@this">
<h:outputLabel value="Type*:" for="type"/>
<p:inplace emptyLabel="Click here to change">
<p:selectOneMenu id="typ" value="#{test.type}" effect="fade"
style="width:300px">
<f:selectItem itemLabel="" itemValue="" />
<f:selectItem itemLabel="Type a" itemValue="a" />
<f:selectItem itemLabel="Type b" itemValue="b" />
<f:selectItem itemLabel="Type c" itemValue="c" />
</p:selectOneMenu>
</p:inplace>
</p:tab>
<p:tab id="tab2" title="Tab 2" process="@this">
</p:tab>
<p:tab id="tab3" title="Tab 3" process="@this">
</p:tab>
</p:tabView>

</h:form>

</h:body>

bean 类:

import java.io.Serializable;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

@ManagedBean(name = "test")
@ViewScoped
public class TestBean implements Serializable {

private static final long serialVersionUID = 1L;

private static final Logger log = LoggerFactory.getLogger(TestBean.class);
private String type;

public String getType() {
return type;
}

public void setType(String type) {
this.type = type;
}

@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("TestBean [");
if (type != null) {
builder.append("type=");
builder.append(type);
}
builder.append("]");
return builder.toString();
}

public void refresh() {
log.info("Refresh");
log.info("Test = <{}>", this);
}

}

最佳答案

您需要一个适合这种情况的转换器

公共(public)类 EmptyToNullConverter 实现转换器{

@Override
public Object getAsObject(FacesContext facesContext, UIComponent component,
String value) {
Object retorno = value;
if (value == null || value.isEmpty()) {
if (component instanceof EditableValueHolder) {
((EditableValueHolder) component).setSubmittedValue(null);
}
retorno = null;
}
return retorno;
}

@Override
public String getAsString(FacesContext facesContext, UIComponent component,
Object value) {
return (value == null) ? null : value.toString();
}

}

并在 faces-config.xml 中定义

<converter>
<converter-for-class>java.lang.String</converter-for-class>
<converter-class>org.converter.EmptyToNullConverter</converter-class>
</converter>

关于java - p :selectOneMenu value set to null, 当位于刷新选项卡 View 中的 p:inplace 时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14276409/

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