我在我的项目中使用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
}
答案 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
)。