刷新页面后,会话范围的 selectOneMenu 值更改回默认值 [重复]

Posted

技术标签:

【中文标题】刷新页面后,会话范围的 selectOneMenu 值更改回默认值 [重复]【英文标题】:Session scoped selectOneMenu value changes back to default after refreshing page [duplicate] 【发布时间】:2016-03-28 12:42:39 【问题描述】:

我的应用程序中有一个 jsf 表单,它应该显示几个用于创建/编辑员工的输入字段。有几个部门我想用<h:selectOneMenu> 显示。我的其他组件基本都是primefaces组件。

如果我从数据表中选择现有员工,则部门设置正确(在前端和 bean 中)。我检查了转换器,它是调试模式下的getAsString() 方法。两者似乎都可以正常工作。

但是当我用 [F5] 刷新页面时,它会将 <h:selectOneMenu> 中的值更改回之前的值,但 bean 的值仍然可以。我的会话 bean 和 jsf 组件之间的绑定似乎无法正常工作。

此外,当我想保存任何员工时,还有另一个问题。验证显示 selectOneMenu 值无效。在getAsObject() 方法成功返回我的部门pojo 后出现此错误。我没有在这个特定组件上定义任何验证器,但我使用了几个不能为空的输入组件。这个错误可能是因为我上面所说的设置值有问题。

DepartmentConverter.java

@ManagedBean(name="departmentConverter")
public class DepartmentConverter implements Converter 

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) 
        DepartmentDAOImpl deptUtils = new DepartmentDAOImpl();

        try 

            int code = Integer.parseInt(value);
            return deptUtils.getDepartmentById(code);

         catch (NumberFormatException nfe) 
            System.out.println("Couldn't transform department code from string to int");
            nfe.printStackTrace();
        

        return null;
    

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) 
        return ((Department) value).getCode() + "";
    


SampleJSFBean.java

@ManagedBean(name = "sampleBean")
@SessionScoped
public class SampleJSFBean 

    private Task employee;
    private List<Task> employees;
    private List<Department> departments;
    private Department department;

    public String showEditEmployeePanel() 
        // shows panel
    

    public String updateEmployee() 
        // saves employee
    

    // getter and setter


registration.xhtml

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<ui:composition 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:p="http://primefaces.org/ui" template="/templates/BasicTemplate.xhtml">

<ui:define name="content">

    <h:form id="formResult">
        <p:panel>
            <p:dataTable id="employee" var="task" value="#sampleBean.employees">
                <p:column headerText="Code">
                    <h:outputText value="#task.employee.code" />
                </p:column>
                <p:column headerText="Name">
                    <h:outputText value="#task.employee.lastname" />
                </p:column>
                <p:column headerText="Department">
                    <h:outputText value="#task.employee.department.name" />
                </p:column>
                <p:column headerText="edit">
                    <p:commandButton id="btnMut" icon="ui-icon-pencil" title="edit employee" disabled="#task.jobActive == true" action="#sampleBean.showEditEmployeePanel"
                        update=":formEmployee" resetValues="true">
                        <f:setPropertyActionListener value="#task" target="#sampleBean.task" />
                    </p:commandButton>
                </p:column>
            </p:dataTable>
        </p:panel>
    </h:form>

    <h:form id="formEmployee">
        <p:growl autoUpdate="false" />
        <p:panel id="panelEmployee">
            <h:outputText value="Lastname" styleClass="labelForm" />
            <p:inputText id="inputLastname" value="#sampleBean.task.employee.lastname" required="true" requiredMessage="Please enter lastname." />
            <br />
            <h:outputText value="Department" styleClass="labelForm" />
            <h:selectOneMenu value="#sampleBean.department" converter="#departmentConverter">
                <f:selectItems value="#sampleBean.departments" var="dept" itemLabel="#dept.code - #dept.name" />
            </h:selectOneMenu>
            <br />
            <p:commandButton value="save" action="#sampleBean.updateEmployee" icon="ui-icon-disk" update=":formResult :formEmployee" />
        </p:panel>
    </h:form>

</ui:define>

【问题讨论】:

那么,你得到了这个确切的错误吗? ***.com/questions/9069379/… 换句话说,您的Department 对象的equals() 方法丢失或损坏? 感谢 BalusC 再次拯救了我的一天! equals() 方法丢失了,所以我无法保存。仍然有一个错误,因为如果我刷新页面,组件总是显示旧值,但这是一个小错误.. 【参考方案1】:

您是否尝试过使用 primefaces 组件而不是 &lt;h:selectOneMenu&gt; 使用 &lt;p:selectOneMenu&gt;。 我不确定它是否有帮助,但我总是使用 primeFaces 的 selectOneMenu 并且总是有效。

【讨论】:

不幸的是,这与使用&lt;h:selectOneMenu&gt;的效果完全相同 原因,为什么刷新后 bean 保持旧值在 @SessionScope 中用于控制器 bean 我使用 @Scope("view") 这篇文章更适合作为评论而不是作为答案。您有足够的声誉在任何地方将 cmets 作为真正的 cmets 发布。

以上是关于刷新页面后,会话范围的 selectOneMenu 值更改回默认值 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

CodeIgniter 3 会话在页面刷新后销毁

php - 刷新页面后会话丢失[重复]

修复 laravel 5 会话在刷新或进入另一个页面后过期?

融云会话页面刷新不及时问题

JSF selectOneMenu 正在刷新并返回到之前的状态,而不是显示新值

刷新后登录会话被破坏