Java 在jsf中使用不同bean的策略
我想对一个JSF页面使用两个不同的bean(Spring)。我不喜欢将每个方法都写到一个bean中,所以我尝试将它们分成两个bean,如Java 在jsf中使用不同bean的策略,java,spring,jsf,jsf-2,javabeans,Java,Spring,Jsf,Jsf 2,Javabeans,我想对一个JSF页面使用两个不同的bean(Spring)。我不喜欢将每个方法都写到一个bean中,所以我尝试将它们分成两个bean,如JobEditDataBean和JobEditActionBean。 我希望将JobedDataBean用作数据对象的“容器”,并将actionstuff(如保存、更新等)移动到ActionBean。 到目前为止,我所做的(以及似乎有效但感觉错误的)是: 你有什么提示或提示如何做得更好,更好 实际上,您不需要每个页面都有一个bean。您可以对任何页面使用任意数
JobEditDataBean
和JobEditActionBean
。
我希望将JobedDataBean用作数据对象的“容器”,并将actionstuff(如保存、更新等)移动到ActionBean。
到目前为止,我所做的(以及似乎有效但感觉错误的)是:
你有什么提示或提示如何做得更好,更好 实际上,您不需要每个页面都有一个bean。您可以对任何页面使用任意数量的bean,这很好,因为只要在XHTML中找到像
{someMB}
这样的表达式,JSF就会找到具有该名称的bean,并在必要时创建一个新实例
如果需要将一个bean注入另一个bean,只需使用@Autowired
:
@Component
@Scope("request")
public class JobEditActionBean {
@Autowired
private JobEditDataBean dataBean;
@PostConstruct
public void init() {
// dataBean.youCanUseDataBeanMethodsHereAlready()
}
}
您只需确保两个bean都在Spring容器中(用@Component
注释它们就可以了),并为每个bean选择正确的范围。注意您正在注入的bean的作用域,因为通常只有将范围更广的bean注入到相同或更多范围的bean中才有意义
话虽如此,我建议阅读以下关于选择正确范围的文章:
还有一件事:只有当您的JSFbean真正由Spring容器管理时,这才有效(这是我在使用@Autowired
之后的假设)。如果让JSF容器管理bean(例如,使用带有@RequestScoped
或@ViewScoped
的@ManagedBean
),则注入它们的方式是使用@ManagedProperty
注释:
...
@ManagedProperty("#{jobEditDataBean}")
private JobEditDataBean dataBean;
实际上,您不需要每个页面都有一个bean。您可以对任何页面使用任意数量的bean,这很好,因为只要在XHTML中找到像
{someMB}
这样的表达式,JSF就会找到具有该名称的bean,并在必要时创建一个新实例
如果需要将一个bean注入另一个bean,只需使用@Autowired
:
@Component
@Scope("request")
public class JobEditActionBean {
@Autowired
private JobEditDataBean dataBean;
@PostConstruct
public void init() {
// dataBean.youCanUseDataBeanMethodsHereAlready()
}
}
您只需确保两个bean都在Spring容器中(用@Component
注释它们就可以了),并为每个bean选择正确的范围。注意您正在注入的bean的作用域,因为通常只有将范围更广的bean注入到相同或更多范围的bean中才有意义
话虽如此,我建议阅读以下关于选择正确范围的文章:
还有一件事:只有当您的JSFbean真正由Spring容器管理时,这才有效(这是我在使用@Autowired
之后的假设)。如果让JSF容器管理bean(例如,使用带有@RequestScoped
或@ViewScoped
的@ManagedBean
),则注入它们的方式是使用@ManagedProperty
注释:
...
@ManagedProperty("#{jobEditDataBean}")
private JobEditDataBean dataBean;
UH我通常有一个web页面的“控制”bean(我在某个地方看到了这是推荐的做法),但我可以直接从JSF访问其他bean。例如,在我的
ticket.xhtml
中,我主要访问{ticketCtrl.myMethod}
,但我也可以直接使用{userManager.getCurrentUserName()}
。这是真的,但我想从JobEditActionBean
中的JobEditDataBean
访问对象。但是这无法完成,因为JobEditActionBean
不知道JobEditDataBean
中的对象?我通常有一个web页面的“控制”bean(我在某个地方看到了这是推荐的做法),但我可以直接从JSF访问其他bean。例如,在我的ticket.xhtml
中,我主要访问{ticketCtrl.myMethod}
,但我也可以直接使用{userManager.getCurrentUserName()}
。这是真的,但我想从JobEditActionBean
中的JobEditDataBean
访问对象。但是这是无法做到的,因为JobEditActionBean
不知道JobEditDataBean
Thx中的对象,但它没有回答我的问题,这是我的错,因为我没有解释清楚:)。我知道使用范围和不同的bean等。我想做的是:与ActionBean
共享DataBean
的数据。像DataBean
一样,它只保留getter和setter以及对象,但是ActionBean
可以精确地处理这些数据,而无需通过参数将其传递给每个函数。我希望我能以某种方式澄清我的问题……好吧,这就是我最后想说的。您只需确保这两个bean都在Spring容器中(例如,使用适当的@范围@组件注释这两个bean),以及何时可以使用@Autowired
将一个注入另一个。但是答案有点混乱,很抱歉,我会尽力澄清。我已经改进了答案,请看它现在是否能帮助您。对不起,之前的混乱。谢谢没问题,您不应该说sry:)。是的,你是对的,我用的是弹簧。因此,如果我“仅”将数据库自动连接到ActionBean
,那么我可以直接访问数据库吗?像平常一样在我的JSF页面中使用它?f、 e.我有
并直接在actionBean中访问该值?像actionBean.dataBean.value
?那太容易了:)我会试试的@djnose是的,您可以这样做,但是如果您想通过actionBean
访问它,则需要dataBean
的getter。请注意,该实例在同一请求(或会话,如果这是范围)中共享,因此您最好直接在页面中参考dataBean
。祝你好运!:)谢谢你的答复,但它没有回答我的问题,这是我的错,因为我没有解释清楚:)。我知道使用范围和不同