jsf从另一个托管bean调用托管bean方法

时间:2014-03-03 14:41:03

标签: jsf-2

我在我的项目中使用JSF 2.x.

这两个页​​面有两个页面和两个托管bean(请求作用域)。

用户点击主页上的链接后会加载

第1页。此链接调用Bean1的view()方法(请求参数ID =某个值),我们从DB中加载一些数据(基于ID),然后重定向到显示此数据的第1页。

稍后,用户从第1页导航到第2页,此处我们将相同的ID传递给第2页。

第2页上,用户输入数据并点击“保存”按钮。这将调用Bean 2的saveDetails()方法。

在saveDetails()方法之后,我想通过调用Bean1的view()方法并将ID作为请求参数传递来重定向到第1页。我无法直接重定向到page1,因为当bean1是请求作用域时,将不会显示任何数据。

因此,我想用请求参数ID调用bean1.view()。即我希望实现与用户点击主页上的链接相同的行为。

如何实现这一目标?

以下是目前的代码:

    @ManagedBean
@Component
@RequestScoped
@Scope("request")
// bean for page1
public class ModifyCDSPageBean extends BasePageBean {
private DisplayTicket ticket;
private String selectedCDS;
...
...
// CDS List
private static Map<String, String> cdsList = new LinkedHashMap<String, String>();

@Autowired
TicketConsoleGTRDao ticketConsoleGTRDao;

private static final Logger LOGGER = Logger.getLogger(ModifyCDSPageBean.class);

public String viewTicketDetails() {
    populateCDSList();

    ....
    // Method updated to set DisplayInfoTravail
    String id_incident = getRequestParameterValue(TicketConstants.ID_INCIDENT);
    List<InfoTravail> travailsList = 
    ticketConsoleGTRDao.findMatchingTrvailInformation(id_incident);

    ....

    return NavigationConstants.PAGE_MODIFY_CDS;
}
...
...
}


@ManagedBean
@Component
@RequestScoped
@Scope("request")
//Bean for page 2
public class CreateInfoTravailPageBean extends BasePageBean {

private String selectedTypeInfoTravail;

...
...

@Autowired
TicketConsoleGTRDao ticketConsoleGTRDao;

private static final Logger LOGGER = Logger.getLogger(CreateInfoTravailPageBean.class);

public String viewInfoTravail() {
    populateTypeInfoTravailList();
    ...
    ...
    return NavigationConstants.PAGE_CREATE_INFO_TRAVAIL;
}

public String saveInfoTravail() {
    String idIncident = getRequestParameterValue(TicketConstants.ID_INCIDENT);
    infoTravail.setTicketId(idIncident);
    infoTravail.setDate_creation(formatter.format(new Date()));

    // HERE I WANT TO CALL ModifyCDSPageBean.viewTicketDetails() method 
    // pass id_incident as request parameter while making this call
    // because if you check  ModifyCDSPageBean.viewTicketDetails above it 
    // looks for request parameter id_incident

}

1 个答案:

答案 0 :(得分:1)

重新阅读您的要求,听起来您想要一个页面初始化代码。也就是说,转过流并且不要让入口点进入你的page1调用bean的代码,让bean自己做:

@ManagedBean @RequestScoped
public class ModifyCDSPageBean {
    @Inject @Param(name = TicketConstants.ID_INCIDENT)
    private ParamValue<Long> myParam;

    @Autowired
    private TicketConsoleGTRDao dao;

    private List<InfoTravail> travailsList;

    @PostConstruct
    public void init() {
        if (myParam.getValue() != null) {
            // do stuff based on the param being set
            travailsList = dao.findById(myParam.getValue());
        }
    }
    // getter for travailsList
}

然后在bean2导航中包含参数:

public class Bean2 {
    public String save() {
        String idIncident = getRequestParameterValue(TicketConstants.ID_INCIDENT);
        // do stuff and then return to page1, passing parameter ID_INCIDENT
        return String.format("page1?faces-redirect=true&%s=%s", 
            TicketConstants.ID_INCIDENT, idIncident);
}

如果您不需要在创建ModifyCDSPageBean的每个时间执行视图准备代码(即,如果它也在其他页面上使用),请查看您的页。如果您有JSF-2.2,请尝试<f:viewAction action="#{modifyCDSPageBean.init}">或旧版本<f:event listener="#{modifyCDSPageBean.init()}" type="preRenderView">

请注意,带有@PostConstruct bean的@RequestScoped将使用每个AJAX请求重新创建bean,这可能不是您想要的。在这种情况下,请尝试@ViewScoped

我的代码示例使用omnifaces'@Param来解释我对spring的不了解。也许他们已经在工具箱中有类似的东西(或者只是从bean方法中调用你的getRequestParameterValue)。