我想在JSP文件中使用@Inject的“常规注入”(即不使用EL表达式),例如:
<%! @Inject MyBean myBean; %GT;然后<%= myBean.getMyAttribute()%>.即使使用EL表达式可以实现该示例,其他一些用例也不能.
这似乎并不完全支持应用服务器:
– JBoss 6.0.0,JBoss 6.1.0,Resin 4.0.22:好的,它运行得很好.
– JBoss 7.0.1,GlassFish 3.x(测试了几个版本):FAILS,myBean仍为null.
它应该在JSP中正常工作,因为:
(1)根据各种规范,它在servlet中工作正常
(2)JSP在运行时被转换为servlet.
你们知道我想要做的事情是否得到支持?任何内部/实施信息可能?
最好的祝福.
感谢您的时间.
有趣的问题,如果你没有测试它,我会赌一些钱,因为它不起作用;-)CDI构建在托管bean(JSR 316)上.相应的定义相当宽松(故意):
从规格:
A Managed Bean can be declared by annotating its class with the
javax.annotation.ManagedBean annotation. A Managed Bean must not be: a
final class, an abstract class, a non-static inner class. A Managed
Bean may not be serializable, unlike a regular JavaBean component.In the basic component model, Managed Beans must provide a no-argument
constructor, but a specification that builds on Managed Beans, such as
CDI (JSR-299), can relax that requirement and allow Managed Beans to
provide constructors with more complex signatures,
可能发生的是容器扫描类路径并碰巧找到已编译的JSP servlet.自从我上次看到它以来已经有一段时间,但我记得代码是生成的,所有内容(包括scriptlet)都在doGet()或doPost()中生成……!因此,即使他们在定义方面没有正式取消资格,我怀疑JSP scriplet是你想要考虑托管bean的任何东西.老实说,这感觉非常错误;-)
我很长一段时间都在关注CDI / Weld / Seam邮件列表,并且不记得曾经提到过JSP.与谷歌搜索相同.
因此,您不应该依赖CDI使用scriptlet.恕我直言这种行为有更多的副作用,而不是一些特意的东西,可以在未经通知的情况下放弃(甚至没有被注意到:-)
因此,1对于JB Nizet的提议:使用带有CDI的servlet,而不是JSP.
更新:我试图帮助,而不是制造混乱;-)我的观点是:恕我直言,在JSP中使用CDI感觉真的非常错误,但我没有在相关规范中找到任何证明这一点的内容.我只能说,JSP在任何地方都没有被提及 – 这种支持我的直觉(并且符合一些实现确实考虑它的观察,其他人没有).