为什么我不应该将JSF SessionScoped bean用于逻辑?

Pie*_*syP 5 jsf ejb stateful java-ee stateful-session-bean

我正在使用带有购物车样式流程的JSF开发一个java EE Web应用程序,所以我想在多个页面上收集用户输入,然后用它做一些事情.

我正在考虑使用EJB 3有状态会话bean,但是我的研究让我相信SFSB并不依赖于客户端的http会话,因此我必须通过httpSession手动跟踪它,一些方面的问题这里 ...

1)为什么它被称为会话bean,据我所知它与会话无关,我可以通过在会话中存储pojo来实现同样的目的.

2)能够注射它的重点是什么,如果所有我要注射'是这个SFSB的新实例那么我不妨使用pojo?

回到我看到的主要问题,JSF是一种演示技术,所以它不应该用于逻辑,但它似乎是收集用户输入的完美选择.

我可以将JSF会话作用域bean设置为我所有请求bean的托管属性,这意味着它被注入到它们中,但与SFSB不同,JSF托管会话作用域bean与http会话绑定,因此相同的实例始终被注入只要http会话没有失效.

所以我有多层

第1层)JSF托管请求范围的bean处理演示文稿,每页1个.
第二层)一个JSF托管会话范围的bean,它由请求bean设置了值.
第3层)无状态会话EJB,它对JSF会话范围bean中的数据执行逻辑.

为什么这么糟糕?

另一种选择是使用SFSB但是我必须将它注入我的初始请求bean中,然后将其存储在http会话中并在每个后续请求bean中将其抓回 - 这看起来很麻烦.

或者我可以将所有内容存储在会话中,但这并不理想,因为它涉及使用文字键和强制转换.等等.这容易出错...凌乱!

任何想法都赞赏我觉得我正在与这项技术作斗争,而不是与之合作.

谢谢

Pas*_*ent 9

为什么它被称为会话bean,据我所知,它与会话无关,我可以通过在会话中存储pojo来实现同样的目的.

从旧的J2EE 1.3教程:

什么是会话Bean?

会话bean表示J2EE服务器内的单个客户端.要访问部署在服务器上的应用程序,客户端将调用会话Bean的方法.会话bean为其客户端执行工作,通过在服务器内执行业务任务来保护客户端免受复杂性的影响.

顾名思义,会话bean类似于交互式会话.会话bean不是共享的 - 它可能只有一个客户端,就像交互式会话可能只有一个用户一样.像交互式会话一样,会话bean不是持久的.(也就是说,它的数据不会保存到数据库中.)当客户端终止时,其会话bean似乎终止并且不再与客户端关联.

所以它与"会话"有关.但会话不一定意味着"HTTP会话"

能够注射它的重点是什么,如果我要注射的是'这个SFSB的新实例那么我不妨使用pojo?

好吧,首先,你没有在无状态组件中注入SFSB(在另一个SFSB注入就可以了),你必须进行查找.其次,在HTTP会话和SFSB之间进行选择实际上取决于您的应用程序和您的需求.从纯粹的理论角度来看,HTTP会话应该用于表示逻辑状态(例如,您处于多页表单中),而SFSB应该用于业务逻辑状态.在TSS上的"旧" HttpSession与有状态会话bean线程中很好地解释了这一点,它也有一个很好的例子,其中SFSB是有意义的:

您可能希望使用有状态会话bean来跟踪特定事务的状态.即某人购买铁路车票.

Web会话跟踪用户在html页面流中的位置.但是,如果用户随后通过不同的频道(例如,wap电话)或通过呼叫中心获得了对系统的访问权限,您仍然希望知道购票交易的状态.

但是SFSB并不简单,如果你没有合理使用它们的需求,我的实际建议是坚持使用HTTP会话(特别是如果这对你来说都是新的).以防万一,请参阅:

回到我看到的主要问题,JSF是一种演示技术,所以它不应该用于逻辑,但它似乎是收集用户输入的完美选择.

这不是业务逻辑,而是表示逻辑.

所以我有多层(...)

不.您可能拥有客户端层,表示层,业务层和数据层.你所描述的内容看起来更像是层(甚至不确定).看到:

为什么这么糟糕?

我不知道,我不知道你在说什么:)但你应该只是将多页表单信息收集到SessionScoped bean中并在进程结束时调用无状态会话Bean(SLSB).

  • 实际上,这是关键短语 - "这不是业务逻辑,而是表示逻辑" - 这是一个重要的引用 (2认同)

Bal*_*usC 6

1)为什么它被称为会话bean,据我所知它与会话无关,我可以通过在会话中存储pojo来实现同样的目的.

更正:EJB会话与HTTP会话无关.粗略地说,在EJB中,客户端是servlet容器,服务器是EJB容器(都在Web /应用程序服务器中运行).在HTTP中,客户端是webbrowser,服务器是Web /应用程序服务器.

现在更有意义吗?

2)能够注射它的重点是什么,如果所有我要注射'是这个SFSB的新实例那么我不妨使用pojo?

将EJB用于事务性业务任务.使用会话范围的托管bean来存储特定于HTTP会话的数据.顺便说一下,两者都不是POJO.只是Javabeans.

为什么我不应该将JSF SessionScoped bean用于逻辑?

如果你没有利用事务性业务任务和EJB提供的抽象,那么只需在一个简单的JSF托管bean中执行它确实不是一个糟糕的选择.这也是基本JSF应用程序中的常规方法.然而,这些操作通常发生在请求范围的托管bean中,其中会话范围的一个被注入为a @ManagedProperty.

但是既然你已经在使用EJB,我就会质疑是否没有使用EJB的具体原因.如果这是业务需求的优势,那么我就会坚持下去.至少,现在应该清除你的会话混淆.