JSF中Post请求后向另一控制器传递数据的问题
解决方案:JSF POST重定向后用会话作用域数据初始化目标页面
核心问题修正
你之前尝试Post Redirect Get模式时,重定向参数写错了:正确的参数是faces-redirect=true(使用连字符-,而非下划线_),这个拼写错误会导致重定向逻辑失效,自然无法触发后续的页面初始化流程。
简洁实现步骤
因为两个控制器都是会话作用域,数据本身就保存在会话中,不需要额外的传递手段,按以下步骤实现即可:
修正viewA的POST重定向逻辑
在controllerA的POST处理方法中,返回正确的重定向字符串:public String postAction() { // 处理POST业务逻辑,填充controllerA的会话数据 return "viewB?faces-redirect=true"; }在viewB中复用controllerA的会话数据
由于controllerA是会话作用域,你有两种简洁的方式初始化viewB:- 直接在viewB的EL表达式中引用controllerA的属性:
<h:outputText value="#{controllerA.targetData}" /> - 或者在controllerB中注入controllerA,在初始化方法中处理数据(如果需要业务逻辑转换):
然后在viewB中添加viewAction触发初始化:@ManagedBean @SessionScoped public class ControllerB { @ManagedProperty("#{controllerA}") private ControllerA controllerA; // setter方法 public void setControllerA(ControllerA controllerA) { this.controllerA = controllerA; } // 配合f:viewAction在GET请求时初始化 public void init() { // 使用controllerA的数据初始化controllerB的属性 this.someData = controllerA.getTargetData(); } }<f:viewAction action="#{controllerB.init}" />
- 直接在viewB的EL表达式中引用controllerA的属性:
方案优势
会话作用域的Bean本身就会在会话周期内保留数据,修正重定向参数后,重定向到viewB时直接复用已有数据即可,不需要额外的c:set或复杂的传递逻辑,完全契合你追求简洁方案的需求。
内容的提问来源于stack exchange,提问作者Filippo
相关产品推荐
相关产品推荐

