Faces サーブレットの直前にマップし、リクエストを続行する前に HttpSession にいくつかの属性を設定するフィルターがあります。
if (_clientUser != null && !_clientUser.isEmpty()) {
session.setAttribute(CLIENT_USER_URI_PARAM_NAME, _clientUser);
filterChain.doFilter(servletRequest, servletResponse);
return;
}
URI 内には、タスク フローを処理する必要がある情報がいくつかあります。
faces/adf.task-flow?adf.tfId=task-flow-definition-id&adf.tfDoc=/WEB-INF/task-flow-definition-id.xml
リクエストを進めた後、デフォルトのアクティビティにすることで、ビューの前に呼び出されるバインドされたタスクフロー内にメソッド呼び出しがあります(ビュー MainPage を呼び出すことができます)。
<default-activity>doStuff</default-activity>
メソッド自体は、Task-flow-definition-id.xml に追加される PageFlowScoped マネージド Bean 内にあります。
「MainPage」ビューの前に呼び出される doStuff メソッドを次に示します。
public class Controller{
public void doStuff {
FacesContext ctx = FacesContext.getCurrentInstance();
Map sessionMap = ctx.getExternalContext().getSessionMap();
String clientUser = (String) sessionMap.get(CLIENT_USER_URI_PARAM_NAME);
AppModImpl am = getApplicationModule();
DBTransaction transaction = am.getDBTransaction();
//do more stuff
}
}
public AppModImpl getApplicationModule() {
FacesContext fc = FacesContext.getCurrentInstance();
Application app = fc.getApplication();
ExpressionFactory elFactory = app.getExpressionFactory();
ELContext elContext = fc.getELContext();
ValueExpression valueExp =
elFactory.createValueExpression(elContext, "#{data.AppModDataControl.dataProvider}", Object.class);
AppModImpl am = (AppModImpl) valueExp.getValue(elContext);
return am;
}
ここまではすべて正常に動作します。しかし、アプリケーションモジュールを取得しようとすると. ありません。このアプリケーションは通常、ADFLibrarys によって追加されたさまざまなコンポーネントを保持するルート アプリケーションであるため、DataControl はありませんが、DataBindings.cpx に DataControl を追加し、MainPagePageDef に反復子を追加しました (DataControl をバインディング)しかし、まだ結果はありません。
アプリケーション モジュールにアクセスする方法について何かアドバイスはありますか? FacesServlet は、マネージド Bean が呼び出されるまでに必要な FacesContext を既に作成している必要がありますか、それとも実際のページ (jspx/jsf) が読み込まれるときにのみ新しい FacesContext を作成しますか?