Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在jsf中使用不同bean的策略_Java_Spring_Jsf_Jsf 2_Javabeans - Fatal编程技术网

Java 在jsf中使用不同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。您可以对任何页面使用任意数

我想对一个JSF页面使用两个不同的bean(Spring)。我不喜欢将每个方法都写到一个bean中,所以我尝试将它们分成两个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
。祝你好运!:)谢谢你的答复,但它没有回答我的问题,这是我的错,因为我没有解释清楚:)。我知道使用范围和不同