ADF 具有此文档属性 (UncommitedDataWarning),当用户想要导航到实际页面中存在未提交日期的另一个页面时,该属性会向用户发出警告。这只是一个警告。我想当用户在对话框中按“确定”时对输入的数据执行回滚。 有谁知道如何实现这一目标?
如果有人有任何想法通过 JSF 和 JavaScript 实现这一点,请告诉我,也许我会找到某种方法来适应它:)。
最佳答案
这是阶段监听器的代码,我用它来检查用户是否已登录 ADF。进行您想要检查的其他更改
import javax.el.ELContext;
import javax.el.ExpressionFactory;
import javax.el.ValueExpression;
import javax.faces.application.Application;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import oracle.adf.controller.ControllerContext;
import oracle.adf.controller.faces.lifecycle.JSFLifecycle;
import oracle.adf.controller.v2.lifecycle.PagePhaseEvent;
import oracle.adf.controller.v2.lifecycle.PagePhaseListener;
import view.backing.UserData;
public class SecurityPagePhaseListener implements PagePhaseListener {
public static final String LOGIN_VIEW = "/Home";
public static final String LOGOUT_MSG = "You are not logged in";
public static final String PASTE_MSG = "Don't try to copy and paste URL address :)";
public static final String currentView=FacesContext.getCurrentInstance().getViewRoot().getId();
public static Object resolveExpression(String expression) {
FacesContext facesContext = FacesContext.getCurrentInstance();
Application app = facesContext.getApplication();
ExpressionFactory elFactory = app.getExpressionFactory();
ELContext elContext = facesContext.getELContext();
ValueExpression valueExp = elFactory.createValueExpression(elContext, expression, Object.class);
return valueExp.getValue(elContext);
}
public void beforePhase(PagePhaseEvent event) {
if (event.getPhaseId() == JSFLifecycle.INIT_CONTEXT_ID) {
ControllerContext cc = ControllerContext.getInstance();
String viewId = cc.getCurrentViewPort().getViewId();
Boolean protectedView = SecurityUtil.isProtectedPage(viewId);
/** ------ [ If requested page is protected area ] ----- */
if (protectedView) {
UserData ud = (UserData)resolveExpression("#{UserData}");
Boolean logedIn = ud.getLoggedIn();
/** ------ [ If user is not logged in ] ----- */
if (!logedIn) {
FacesMessage fm = new FacesMessage(LOGOUT_MSG);
fm.setSeverity(FacesMessage.SEVERITY_ERROR);
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, fm);
SecurityUtil.displayView(LOGIN_VIEW);
}
/** [ If user try to paste direct link to protected page ] */
if (!SecurityUtil.isViewState()) {
FacesMessage fm = new FacesMessage(PASTE_MSG);
fm.setSeverity(FacesMessage.SEVERITY_ERROR);
FacesContext context = FacesContext.getCurrentInstance();
context.addMessage(null, fm);
SecurityUtil.displayView(LOGIN_VIEW );
}
}
}
}
public void afterPhase(PagePhaseEvent event) {
}
}
不要忘记在 adf-settings.xml 中注册它,如下所示
<lifecycle>
<phase-listener>
<listener-id>SecurityPagePhaseListener</listener-id>
<class>security.SecurityPagePhaseListener</class>
</phase-listener>
</lifecycle>
关于javascript - 如何在 ADF 中以编程方式实现 UncommitedDataWarning?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19137208/