【问题标题】:Passing Parameter From One Method To Another将参数从一种方法传递到另一种方法
【发布时间】:2011-04-18 15:45:50
【问题描述】:

我有一个相当愚蠢的问题,我需要将参数从一种方法传递到另一种方法。 我有以下方法

public String test(Employees emp)
{
   return emp.getempno();
}

我需要将emp.getempno() 传递给我的另一个方法loadDetails();

我的问题是我无法在 loadDetails() 方法中添加参数,因为我在其他几个地方调用此方法。

我怎样才能做到这一点?我尝试将emp.getempno() 放在collecion 对象中,但问题是test(Employees emp) 在我的第二种方法中没有调用methood。

请原谅我的无知,任何帮助都非常感激。

谢谢

更新 1

这就是我为测试方法赋值的方式,当我将参数从一个页面传递到另一个页面时,getTestValues 方法被另一个类调用。

public void getTestValues(List<Employees> paramList)  {
    for (Employees dataItem: paramList) {
        test(dataItem);
    }
}

更新 2

这是我的 loadDetails() 方法,我在其中获取 db 值并在 jsf 页面中显示为数据表。

private void loadDetails() {

        try {

            dataDetails = anotherclass.deptDetails(passempno);
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("error from loadDetails" + e.getMessage());
        }

    }

【问题讨论】:

  • loadDetails 在什么类?让我们看看那个类。
  • @Polappan:如果您提供更多代码会有所帮助。这应该很容易解决,但需要更深入地了解您要做什么。
  • @Polappan:好的,假设你在loadDetails() 中有getempno() 的结果......你想用它做什么?您能否通过使用员工编号的新逻辑向我们展示更新 2 的外观(假设我们可以获取它?)
  • @andersoj 非常抱歉我忘记添加参数,我已在更新 2 中更正。我想将 empno 作为参数传递给另一个类中的方法。
  • 功能需求是什么?你肯定走错了路。

标签: java jsf parameter-passing


【解决方案1】:

基本上我想要做的是,当我单击数据表中的一行时,我想将该行的主键传递给第二页的 bean 类,以便我可以在第二页中填充数据表。

JSF 1.1 并希望在数据表中使用 commandlink 输出链接作为 POST GET 传递。

使用以下内容(假设 JSF 1.1):

EmployeeBacking

public class EmployeeBacking {

    private List<Employee> list;

    public EmployeeBacking() {
        list = employeeService.list();
    }

    // ...
}

employees.jsp

<h:dataTable value="#{employeeBacking.list}" var="employee">
    <h:column>
        <h:outputText value="#{employee.name}" />
    </h:column>
    <h:column>
        <h:outputLink value="departments.jsp">
            <h:outputText value="Show departments" />
            <f:param name="employeeId" value="#{employee.id}" />
        </h:outputLink>
    </h:column>
</h:dataTable>

DepartmentBacking

public class DepartmentBacking {

    private Long employeeId;
    private List<Department> list;

    private void load() {
        list = departmentService.list(employeeId);
    }

    public List<Department> getList() {
        if (list == null) load();
        return list;
    }

    // ...
}

(请注意 getter 中的延迟加载,在 JSF 1.2 中您最好使用 @PostConstruct 方法)

departments.jsp

<h:dataTable value="#{departmentBacking.list}" var="department">
    <h:column>
        <h:outputText value="#{department.name}" />
    </h:column>
</h:dataTable>

faces-config.xml

<managed-bean>
    <managed-bean-name>employeeBacking</managed-bean-name>
    <managed-bean-class>com.example.EmployeeBacking</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

<managed-bean>
    <managed-bean-name>departmentBacking</managed-bean-name>
    <managed-bean-class>com.example.DepartmentBacking</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
        <property-name>employeeId</property-name>
        <value>#{param.employeeId}</value>
    </managed-property>
</managed-bean>

这里发生了什么,输出链接将导航到departments.jsp,并将当前员工 ID 作为请求参数,faces-config.xml 中的&lt;managed-property&gt; 将在部门支持中设置它,最后列表上的 getter 将延迟加载根据员工 ID 确定部门。

【讨论】:

  • @BalusC 感谢您将参数从一个 jsf 传递到另一个 jsp 页面的输入。但是,faces-config.xml 中的 存在一个问题。如果我添加 那么在 DepartmentBacking bean 中employeeId 始终为空。如果我删除 则正确传递了employeeId。我需要在 faces-config.xml 中有 。这可能是什么原因,我怎样才能做到这一点。谢谢
  • 原因是重定向触发了一个新请求。要使其工作(在 JSF 1.1 中),您必须获取会话范围。
  • @BalusC 你的意思是我需要将值放在 HTTP 会话对象中或将 bean 的范围从请求更改为会话?
  • 哦,等等,毕竟,您需要的是 HTTP GET 请求,而不是 HTTP POST 请求。因此将&lt;h:commandLink&gt; 替换为&lt;h:outputLink&gt; 并删除整个&lt;navigation-case&gt;,因为它是多余的。
  • @BalusC 非常感谢,非常感谢。这就像一个魅力。这是由于旧版本的 JSF1.1 造成的吗?除了我需要重定向之外,我的其他 icefaces 页面会表现得很奇怪。
【解决方案2】:

好的,我仍在努力解决这个问题,但我认为它变得更加清晰了。为了使loadDetails() 正常工作,您需要知道一个员工编号(如上图passempno 所示)。我有两个回应:

  1. 最好的情况,似乎passempno 真的loadDetails() 方法的一个参数。即,passempno 的值是方法行为的一部分。因此,强烈推荐的选项是简单地添加员工编号作为参数。您声明您不想这样做,因为其他地方正在使用它——该方法的其他客户在没有指定员工编号的情况下如何使用它?

  2. 如果这是父类的某些重要状态的一部分,那么可能您需要在对象的字段中存储员工编号。这不太理想,因为它隐藏(或至少隐含)loadDetails() 需要运行的重要状态。

  3. 如果与后备数据库有状态交互,并且这里的员工编号是该状态的一部分,我建议将数据库交互的状态分解到包含员工编号的子类中和任何其他状态(如上面 2 中所建议的)。

如果这有帮助,请告诉我;如果没有...让我知道我错过了什么。

【讨论】:

  • loadDetails() 方法在类的构造函数中调用,以在调用 jsf 页面时加载值。所以我在 loadDetails() 方法中添加了一个参数,当我在构造函数中调用该方法时会出现问题。基本上我想要做的是当我单击数据表中的一行时,我想将该行的主键传递给第二页的 bean 类,以便我可以在第二页中填充数据表。
  • @Polappan:我想我想弄清楚你是否需要这个值来调用loadDetails()。如果您确实需要它,那么您在构造函数中需要它,一种或另一种方式。如果你有两种不同风格的loadDetails(),一种需要参数,另一种不需要,那么也许你需要两种不同的方法......
【解决方案3】:

我以开发 ERP 软件为生。您的 LoadDetails 方法不应将 Employee 作为参数。

我假设 loadDetails 在 Load 类上,并且您有一个 Employee 安排负载或填充负载。如果是这种情况,则 Load 类应该从创建时就引用该 Employee。

【讨论】:

  • 这与loadDetails() 有什么关系?让我们看看loadDetails(),这样我们就可以弄清楚如何让员工进入它。
猜你喜欢
  • 2014-02-24
  • 2013-01-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多