2014-03-03 151 views
1

我在我的项目中使用JSF 2.x。jsf调用另一个托管bean的托管bean方法

我有两个页面和两个托管bean(请求范围)这两个页面。

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

稍后,用户从第1页导航至2页,在这里我们通过相同的ID的第2页。

页2,用户进入上保存按钮数据和点击。这将调用Bean 2的saveDetails()方法。

通过调用Bean1的view()方法并将ID作为请求参数传递给saveDetails()方法后,我想重定向到第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 

} 
+0

如果这个参数是你想保持很久的东西,也许把它放到会话范围中是一个选项? – mabi

+0

你能不能展示你的代码,看看你迄今为止做了什么? – SRy

+0

@mabi,即使我把这个参数放在session中,这也不能解决我的问题。我想调用另一个托管bean的方法到当前的bean中。详细信息见上面的代码。谢谢。 – Yogesh

回答

1

重读你的要求,这听起来像你想有一个页面初始化代码。也就是说,把周围的流动,不要让入口点到您的page1调用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@RequestScoped bean将重新创建与每个AJAX请求,这可能不是你想要的bean。在这种情况下,请尝试@ViewScoped

我的代码示例使用了omnifaces'@Param因为我对spring的知识缺乏。也许他们已经在工具包中有类似的东西(或者只需从bean方法调用你的getRequestParameterValue)。

+0

嗨,对不起,我不明白这将如何解决我的问题。具体来说,我想从CreateInfoTravailPageBean.saveInfoTravail()调用ModifyCDSPageBean.viewTicketDetails()方法。 @PostConstruct对我来说是新的,我在线阅读它,并且我明白,每当bean被实例化时,就会调用init()方法。如果我将id_incident(ticketid)放入会话并让init()方法从会话中读取它,这看起来像是能解决我的问题的东西。不知道我是否理解正确。你能确认一下吗?谢谢 – Yogesh

+0

@ user3091282在这种情况下不需要会话作用域。我不知道你的'getRequestParameterValue'方法是什么样的,但是它有可能在'init'中未修改(例如,你可以从'FacesContext'中读取)。我已更新该帖子以包含第二个页面bean的示例。 – mabi