gpt4 book ai didi

java - 如何从 java 类中的托管 bean 访问属性值?

转载 作者:行者123 更新时间:2023-12-02 02:50:30 25 4
gpt4 key购买 nike

我想为 session 设置一个全局属性,例如“上帝模式”,因此在 session 期间,一个人可以看到比平均水平更多的内容(仅用于发展目的),例如

<managed-bean>
<managed-bean-name>appBean</managed-bean-name>
<managed-bean-class>se.corp.app.package.ApplicationBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>godmode</property-name>
<value>true</value>
<property-class>java.lang.Boolean</property-class>
</managed-property>
</managed-bean>

但是我怎样才能从另一个java类中访问属性集呢?

最佳答案

您可以采用两种方法来解决此问题:一种简单,另一种更符合一般的 JSF 理念。换句话说,这是个人诚信与技术原则的问题:D

最简单的一个是由 Per Henrik Lausten 绘制的。然而它在某种程度上是有缺陷的。它并不是真正的环境中立/不可知论。这并不意味着这是一个问题,但是如果你想重新分发你的 bean,你将被迫并且正在强制你,你的实现者,使用你选择的 bean 名称 - 例如appBean

现在我不想让事情变得过于复杂,但更灵活的方法如下:

 <managed-bean>
<managed-bean-name>appBean</managed-bean-name>
<managed-bean-class>bean.ApplicationBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>name</property-name>
<value>appBean</value>
</managed-property>
</managed-bean>

bean :

public class ApplicationBean implements Serializable {

private static final long serialVersionUID = 1L;

private static final String DEFAULT_NAME = "appBean";

private String name;
private boolean godMode;

public void setName(String name) {
this.name = name;
}

public void setGodMode(boolean godMode) {
this.godMode = godMode;
}

public boolean isGodMode() {
return godMode;
}

// Your other logic here

public static ApplicationBean getInstance(FacesContext facesContext) {
return (ApplicationBean) Helper.resolveVariable(facesContext, name != null ? name : DEFAULT_NAME);
}

}

通过上述方法,bean 可以部署在任何地方,如果需要,您可以定义一个不同的名称 - 托管 bean-name 并且属性值必须匹配。否则,您将省略 faces-config.xml 中的 name 属性,同时将 management-bean-name 设置为与 DEFAULT_NAME java 类属性中显示的完全相同。

“哲学”方法是利用属性注入(inject)的方法。这完全取决于您发现自己在所有 bean 中需要特定 bean 的频率。但首先请看示例:

 <managed-bean>
<managed-bean-name>appBean</managed-bean-name>
<managed-bean-class>bean.ApplicationBean</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>godMode</property-name>
<value>true</value>
<property-class>java.lang.Boolean</property-class>
</managed-property>
</managed-bean>

<managed-bean>
<managed-bean-name>myOtherBean</managed-bean-name>
<managed-bean-class>bean.MyOtherBean</managed-bean-class>
<managed-bean-scope>view</managed-bean-scope>
<managed-property>
<property-name>app</property-name>
<value>#{appBean}</value>
</managed-property>
</managed-bean>

其他 Bean 类:

public class MyOtherBean implements Serializable {

private static final long serialVersionUID = 1L;

private ApplicationBean app;

public void setApp(ApplicationBean app) {
this.app = app;
}

public void doSomething() {
// App is already here
// no need to resolve it
if (app.isGodMode()) {
//do something;
}
}
}

我个人使用这两种方法,尽管我更喜欢最后一种方法。但有一个问题:您只能注入(inject)共享相同作用域的 Bean,或者比您注入(inject)它们的 Bean 的作用域生命周期更长的 Bean。

应用程序进入 session :是

session 进入 View :是

查看应用程序:否

请求查看:否

关于java - 如何从 java 类中的托管 bean 访问属性值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43914381/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com