Работая с JSF для разработки веб-приложений с использованием NetBeans, я много раз замечал, что в некоторых случаях, методы получения (и, вероятно, сеттеры) в JSF ManagedBeand выполняются более одного раза, в то время как они предназначены для выполнения только один раз. В таком сценарии иногда чрезвычайно важно обеспечить соблюдение некоторых критических условий (если и т. Д.) Для некоторых операций (особенно некоторых вычислений), чтобы предотвратить их перегрузку. Я все пытался узнать настоящую причину этого, но не мог.
Здесь я демонстрирую очень простое приложение, в котором метод получения, а именно
public Collection<entity.Country> getCountries(){};
, вызывает удаленный EJB и извлекает все страны из соответствующей таблицы в базе данных MySql и отображается на странице JSF. Снимок экрана веб-страницы выглядит просто так, как показано ниже.
Нет необходимости уделять много внимания снимку экрана, коду страницы JSF и соответствующему ManagedBean.
Вот код страницы JSF
<?xml version='1.0' encoding='UTF-8' ?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
<title>Countries</title>
</h:head>
<h:body>
<h:form>
<center><br/><br/><br/>
<h:dataTable id="dataTable" styleClass="table" frame="box" value="#
{country.countries}" var="row" bgcolor="lightyellow" border="7"
cellpadding="7" cellspacing="7" rules="all" width="50%" dir="ltr">
<f:facet id="header" name="header">
<h:outputText value="~:Country:~" styleClass="tableHeader"/>
</f:facet>
<h:column>
<f:facet name="header">Country ID</f:facet>
<h:outputText id="countryID" value="#{row.countryID}"/>
</h:column>
<h:column>
<f:facet name="header">Country Name :</f:facet>
<h:outputText id="countryName" value="#{row.countryName}"/>
</h:column>
</h:dataTable>
</center>
</h:form>
</h:body>
</html>
и соответствующий простой код JSF ManagedBean.
package country;
import commonBean.CommomBeanRemote;
import java.util.Collection;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
@ManagedBean
@RequestScoped
public class Country
{
@EJB
private CommomBeanRemote obj=null;
private Collection<entity.Country>countries=null;
public Country() {}
public Collection<entity.Country> getCountries()
{
countries=obj.getAllCountries(); //Calls a remote EJB to retrieve the data.
System.out.println("The Country() method called.");//Here this displays 8 times unnecessarily
return countries;
}
public void setCountries(Collection<entity.Country> countries)
{
this.countries = countries;
}
}
DataTable, в котором отображаются фактические данные, привязан к свойству стран value = "# {country.countries}"
ManagedBean и его соответствующих средств получения и установки. являются следующими.
public Collection<entity.Country> getCountries()
{
countries=obj.getAllCountries();
System.out.println("The Country() method called.");
return countries;
}
public void setCountries(Collection<entity.Country> countries)
{
this.countries = countries;
}
Метод country = obj.getAllCountries ();
извлекает данные из удаленного EJB . Мне показалось, что публиковать здесь фактическую реализацию этого метода (который в EJB) совершенно не нужно. Все это просто для того, чтобы показать, что я пытаюсь сделать.
На самом деле мой вопрос заключается в том, что public Collection
выполняется без необходимости 8 раз, в то время как он должен выполняться только один раз, что чрезвычайно важно в некоторых очень конкретных ситуации.
Я пробовал это так много раз, увеличивая и уменьшая количество отображаемых строк, но этот метод всегда выполняется 8 раз, почему ... ???