如何从另一个 class 调用存储在 applicationScope 中的 ArrayList
How to call an ArrayList stored in applicationScope from another class
我想从另一个 class
调用存储在 applicationScope 中的 ArrayList
我有一个 class,类似这样的东西将大量数据存储在 public 变量名 AL_data 中,方法 getAllData 只是将数据存储在 AL_data
public class Application implements Serializable{
private static final long serialVersionUID = 1L;
public ArrayList<District> AL_data;
public Application(){
try {
getAllData();
} catch (NotesException e) {
e.printStackTrace();
}
}
}
并且我使用 applicationScope
在 faces-config 中将 class 设置为托管 bean
<managed-bean>
<managed-bean-name>App</managed-bean-name>
<managed-bean-class>com.utils.Application</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
我还有另一个 class 想用来阅读应用范围
public class actions {
private static Map<String, Object> applicationScope() {
FacesContext context = FacesContext.getCurrentInstance();
return (Map<String, Object>) context.getApplication().getVariableResolver().resolveVariable(context,"applicationScope");
}
public Vector<String> getDataForCurrentUser() {
try {
// how do I access the AL_data arraylist stored in applicationscope
// ArrayList m = (ArrayList) this.applicationScope();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
并且我已使用 sessionScope 将此 class 设置为管理 bean。
<managed-bean>
<managed-bean-name>Actions</managed-bean-name>
<managed-bean-class>com.utils.actions</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
我想知道如何调用应用程序范围 class 并访问它的 public 属性,或者如何 return 我的 ArrayList。
谢谢
托马斯
向您的应用程序范围的 bean 添加一个 public 方法,其他 Java classes 可以使用它来访问该 bean 的实例:
public static Application get() {
FacesContext context = FacesContext.getCurrentInstance();
return (Application) context.getApplication().getVariableResolver().resolveVariable("App");
}
然后您可以使用该方法从 Actions class 获取应用程序作用域 bean 的实例,然后访问该 bean 的方法和变量:
public class actions {
public Vector<String> getDataForCurrentUser() {
// Access the AL_data arraylist stored in the App application scoped bean
ArrayList<District> m = Application.get().AL_data;
}
只要作用域规则允许,最好的方法就是让框架处理属性和 bean 到其他 bean 的注入。
由于您需要在会话范围的 bean 中使用应用范围的 bean,您可以简单地定义注入,如下所示:
<managed-bean>
<managed-bean-name>Actions</managed-bean-name>
<managed-bean-class>com.utils.actions</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>application</property-name>
<value>#{App}</value>
</managed-property>
</managed-bean>
要在您的 Actions bean 中接受 属性 的注入,定义一个 public 方法,如下所示:
public class actions implements Serializable {
private Application app;
public void setApplication(Application app) {
this.app = app;
}
}
通过这种方式,您可以在 class 中任何需要的地方获取应用程序 bean,而无需在需要时反复解析它。
您可能还决定引用应用程序 bean 太多了,您只需要数据。到那时,您只需要相应地调整 faces-config.xml
和接收方法即可。
<managed-property>
<property-name>allData</property-name>
<value>#{App.allData}</value>
</managed-property>
public class actions implements Serializable {
private static final long serialVersionUID = 1L;
private ArrayList<District> allData;
public void setAllData(ArrayList<District> allData) {
this.allData = allData;
}
}
现在,有两条建议。
- 我不鼓励您在构造函数中初始化 bean 的数据。 Bean 意味着延迟使用,因此数据应该延迟加载。如果您需要预加载数据,构造函数不是正确的地方。不幸的是,我们受困于不死的 XPage,因此没有比通过检查相关变量是否已设置来解决问题更好的帮助了。这意味着采用类似于此的方法:
public class Application implements Serializable {
private static final long serialVersionUID = 1L;
private ArrayList<District> allData;
//public Application(){
// try {
// getAllData();
// } catch (NotesException e) {
// e.printStackTrace();
// }
//}
public ArrayList<District> getAllData() {
if (allData == null) {
try {
allData = // your logic result
} catch (NotesException e) {
throw new FacesException(e);
}
}
return allData;
}
}
- 我鼓励您使用完善的命名约定,即 属性 名称应以小写字母开头(app 而不是 App),class 名称应以大写字母开头(com.utils.Actions 而不是 com.utils.actions)
我想从另一个 class
调用存储在 applicationScope 中的 ArrayList我有一个 class,类似这样的东西将大量数据存储在 public 变量名 AL_data 中,方法 getAllData 只是将数据存储在 AL_data
public class Application implements Serializable{
private static final long serialVersionUID = 1L;
public ArrayList<District> AL_data;
public Application(){
try {
getAllData();
} catch (NotesException e) {
e.printStackTrace();
}
}
}
并且我使用 applicationScope
在 faces-config 中将 class 设置为托管 bean<managed-bean>
<managed-bean-name>App</managed-bean-name>
<managed-bean-class>com.utils.Application</managed-bean-class>
<managed-bean-scope>application</managed-bean-scope>
</managed-bean>
我还有另一个 class 想用来阅读应用范围
public class actions {
private static Map<String, Object> applicationScope() {
FacesContext context = FacesContext.getCurrentInstance();
return (Map<String, Object>) context.getApplication().getVariableResolver().resolveVariable(context,"applicationScope");
}
public Vector<String> getDataForCurrentUser() {
try {
// how do I access the AL_data arraylist stored in applicationscope
// ArrayList m = (ArrayList) this.applicationScope();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
并且我已使用 sessionScope 将此 class 设置为管理 bean。
<managed-bean>
<managed-bean-name>Actions</managed-bean-name>
<managed-bean-class>com.utils.actions</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
</managed-bean>
我想知道如何调用应用程序范围 class 并访问它的 public 属性,或者如何 return 我的 ArrayList。
谢谢
托马斯
向您的应用程序范围的 bean 添加一个 public 方法,其他 Java classes 可以使用它来访问该 bean 的实例:
public static Application get() {
FacesContext context = FacesContext.getCurrentInstance();
return (Application) context.getApplication().getVariableResolver().resolveVariable("App");
}
然后您可以使用该方法从 Actions class 获取应用程序作用域 bean 的实例,然后访问该 bean 的方法和变量:
public class actions {
public Vector<String> getDataForCurrentUser() {
// Access the AL_data arraylist stored in the App application scoped bean
ArrayList<District> m = Application.get().AL_data;
}
只要作用域规则允许,最好的方法就是让框架处理属性和 bean 到其他 bean 的注入。
由于您需要在会话范围的 bean 中使用应用范围的 bean,您可以简单地定义注入,如下所示:
<managed-bean>
<managed-bean-name>Actions</managed-bean-name>
<managed-bean-class>com.utils.actions</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>application</property-name>
<value>#{App}</value>
</managed-property>
</managed-bean>
要在您的 Actions bean 中接受 属性 的注入,定义一个 public 方法,如下所示:
public class actions implements Serializable {
private Application app;
public void setApplication(Application app) {
this.app = app;
}
}
通过这种方式,您可以在 class 中任何需要的地方获取应用程序 bean,而无需在需要时反复解析它。
您可能还决定引用应用程序 bean 太多了,您只需要数据。到那时,您只需要相应地调整 faces-config.xml
和接收方法即可。
<managed-property>
<property-name>allData</property-name>
<value>#{App.allData}</value>
</managed-property>
public class actions implements Serializable {
private static final long serialVersionUID = 1L;
private ArrayList<District> allData;
public void setAllData(ArrayList<District> allData) {
this.allData = allData;
}
}
现在,有两条建议。
- 我不鼓励您在构造函数中初始化 bean 的数据。 Bean 意味着延迟使用,因此数据应该延迟加载。如果您需要预加载数据,构造函数不是正确的地方。不幸的是,我们受困于不死的 XPage,因此没有比通过检查相关变量是否已设置来解决问题更好的帮助了。这意味着采用类似于此的方法:
public class Application implements Serializable {
private static final long serialVersionUID = 1L;
private ArrayList<District> allData;
//public Application(){
// try {
// getAllData();
// } catch (NotesException e) {
// e.printStackTrace();
// }
//}
public ArrayList<District> getAllData() {
if (allData == null) {
try {
allData = // your logic result
} catch (NotesException e) {
throw new FacesException(e);
}
}
return allData;
}
}
- 我鼓励您使用完善的命名约定,即 属性 名称应以小写字母开头(app 而不是 App),class 名称应以大写字母开头(com.utils.Actions 而不是 com.utils.actions)