如何从非人脸请求中调用 JSF 支持 bean 方法?
Posted
技术标签:
【中文标题】如何从非人脸请求中调用 JSF 支持 bean 方法?【英文标题】:How to invoke a JSF backing bean method from a non-faces request? 【发布时间】:2011-03-13 06:26:06 【问题描述】:对于使用单点登录以 JSF 编写的 Web 应用程序,我们需要替换当前的登录名。目前,我们的 login.jsp 调用后备 bean 上的 authenticate 方法来实现这一点并执行额外的角色验证。现在身份验证将由我的单点登录服务器完成,但我如何调用支持 bean 上的身份验证方法来执行角色验证
【问题讨论】:
【参考方案1】:将请求参数设置为托管属性,并使用@PostConstruct
注解在bean构造和托管属性设置后立即执行一些代码。
您可以将 GET 或 POST 请求参数设置为托管属性,如下所示:
<managed-bean>
<managed-bean-name>bean</managed-bean-name>
<managed-bean-class>mypackage.Bean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>name1</property-name>
<value>#param.name1</value>
</managed-property>
<managed-property>
<property-name>name2</property-name>
<value>#param.name2</value>
</managed-property>
</managed-bean>
或者如果您已经在使用 JSF 2.0,那么您可以使用 @ManagedProperty
:
@ManagedProperty(value="#param.name1")
private String name1;
@ManagedProperty(value="#param.name2")
private String name2;
当最终用户使用name1=value1&name2=value2
查询字符串触发 GET 或 POST 请求时,将设置这些参数。 #param.name1
EL 表达式基本上代表request.getParameter("name1")
的结果。
现在创建一个@PostConstruct
方法,如下所示:
@PostConstruct
public void init()
if (name1 != null && name2 != null)
// Both request parameters are been set. Do your thing here!
【讨论】:
你好 baslusc,但是你将如何调用 bean 的创建呢?因为 @PostConstruct 只会在创建 bean 后使用。因为当请求是面孔请求时会调用 bean 创建,但在这种情况下,请求是非面孔请求。 @Tarun:如果是非人脸请求,那么您需要寻找非人脸解决方案。一个简单的 servlet 或者一个过滤器。 这正是我的意思(一个简单的 servlet),但问题似乎偏离了目标,因为它指出“如何从非面孔请求调用 JSF 支持 bean 方法?”所以它谈论的是从非面孔请求中调用 JSF bean。您的答案中解释的概念涉及 JSF bean 的调用。但由于在问题中写的是“非面孔”请求,所以我无法理解您在问题上下文中的回答。 @Tarun:将 bean 的原始代码重构为一个单独的类,您可以在 servlet 和支持 bean 中导入/使用它。以上是关于如何从非人脸请求中调用 JSF 支持 bean 方法?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 JSF 页面加载之前在支持 bean 中启动特殊的 init 事件?