【问题标题】:How to programatically achieve UncommitedDataWarning in ADF?如何在 ADF 中以编程方式实现 UncommitedDataWarning?
【发布时间】:2013-10-02 12:44:38
【问题描述】:

ADF 具有此文档属性 (UncommitedDataWarning),当用户想要导航到实际页面中的某个未提交日期的另一个页面时,该属性会向用户发出警告。这只是一个警告。当用户在对话框中按 OK 时,我想对输入的数据执行回滚。 有谁知道如何实现这一目标?

如果有人有任何想法通过 JSF 和 JavaScript 实现这一点,请告诉我,也许我会找到某种方式来适应它:)。

【问题讨论】:

  • 阅读下面的答案和 cmets,为什么不创建自定义警告并将“确定”按钮指向回滚?我以前做过自定义警告框,但不是在离开页面的情况下,也许其他人可以提供帮助。
  • 是的,这是我需要的,但我不知道如何检测用户是按 F5 还是只是在地址栏中输入另一个 URL..
  • 这看起来可能是朝着您需要采取的方向迈出的一步 :) blogs.oracle.com/groundside/entry/…
  • 谢谢,但我是几个小时前发现的,它只是解释了发生了什么......

标签: javascript jsf oracle-adf jdeveloper


【解决方案1】:

这是相位监听器的代码,我用它来检查用户是否在 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>

【讨论】:

    【解决方案2】:

    你检查https://blogs.oracle.com/shay/entry/warning_of_uncommitted_unsaved_changes了吗。

    我假设您只需要打开它。

    【讨论】:

    • 是的,谢谢,这只是一个警告。如果用户在那里按 OK,他将毫无问题地导航到另一个页面。不会调用回滚操作。实际上,我想使用与此相同的东西,只是我想在用户按下 OK 时回滚。有什么想法吗?
    【解决方案3】:

    好的,当你按下 ok 时,你想自己回滚,尽管如果你不提交,你的更改将不会自行提交

    您可以检查您的应用程序模块。如果数据是脏的(因此已经进行了更改),您可以调用您在页面中创建的弹出窗口 (RichPopup) 并输出文本告诉您有关更改和回滚更改的按钮

    通过

    获取您的应用程序模块
    private ApplicationModule getApplicationModule(String dataProvider) {
        FacesContext fc = FacesContext.getCurrentInstance();
        Application app = fc.getApplication();
        ExpressionFactory elFactory = app.getExpressionFactory();
        ELContext elContext = fc.getELContext();
        ValueExpression valueExp = elFactory.createValueExpression(elContext, dataProvider, Object.class);
    
        return (ApplicationModule)valueExp.getValue(elContext);
    }
    

    通过以下方法检查是否有任何变化

     private boolean pendingChangesExist() {
        return this.getApplicationModule("#{data.AppModuleDataControl.dataProvider}").getTransaction().isDirty();
    }
    

    并在您用于导航的按钮中调用以下方法

     public String gotosecondpage() {
        if (!this.pendingChangesExist()) {
            make navigation-
        } else {
             call your pop up window }
        return null;
    }
    

    【讨论】:

    • 感谢您的回答,但不,这不是真的。至少在 ADF 中,一旦您在迭代器中提交更改,即使您没有提交任何内容,您也必须调用回滚来取消这些更改。
    • 编辑我的帖子,了解如何在 ADF 中以编程方式执行 UncommitedDataWarning
    • 再次感谢,但我的问题是用户按 F5 或在地址栏中输入另一个 URL 时的情况。在这种情况下,我想进行回滚。打扰了,抱歉,可能我的问题不是很清楚,但我不知道如何写得更好..
    • 我从您的问题中了解到的是,您不想使用声明性方式来检查更改,您想要一种编程方式,所以这是检查更改的编程方法,所以答案是调用方法它检查您想要的任何情况的更改
    • 您可以使用过滤器或阶段侦听器,这是您通常在用户复制 URL 并将其粘贴到地址栏中而不登录或尝试访问未经授权的页面时所做的事情
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2012-02-09
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    相关资源
    最近更新 更多