adf4351使用方法_ADF:使用HTTP POST方法进行URL任务流调用
adf4351使用方法
眾所周知,可以通過某些URL直接從瀏覽器或某些外部應用程序調用有限任務流。 如果任務流的屬性“ URL invoke”設置為“ URL-invoke-allowed”,則啟用此功能,該功能通常在集成項目中使用。 通常,客戶端(或調用者)使用HTTP GET方法并在URL中傳遞其參數。 讓我們考慮一個帶有一個必需輸入參數的簡單任務流:
可以通過這樣的URL調用任務流
http://127.0.0.1:7101/TestApp/faces/adf.task-flow?adf.tfId=task-flow-definition&adf.tfDoc=/WEB-INF/task-flow-definition.xml&userName=xammer客戶端使用簡單的html表單構造此GET請求:
<html><head>??? <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/></head><body><form action="http://127.0.0.1:7101/TestApp/faces/adf.task-flow"><input type="hidden" name="adf.tfId" value="task-flow-definition"/>? <input type="hidden" name="adf.tfDoc" value="/WEB-INF/task-flow-definition.xml"/>? <label>???? User Name <input type="text" name="userName" value="xammer"/>? </label><input type="submit" value="Submit"/></form></body> </html>它看起來像這樣:
一些客戶端更喜歡使用HTTP POST方法,這是他們的要求:
<html><head>??? <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/></head><body><form action="http://127.0.0.1:7101/TestApp/faces/adf.task-flow" method="POST"><input type="hidden" name="adf.tfId" value="task-flow-definition"/>? <input type="hidden" name="adf.tfDoc" value="/WEB-INF/task-flow-definition.xml"/>? <label>???? User Name <input type="text" name="userName" value="xammer"/>? </label><input type="submit" value="Submit"/></form></body> </html>而且效果很好。 在這種情況下,URL將如下所示:
http://127.0.0.1:7101/TestApp/faces/adf.task-flow所有其他必要的信息(例如任務流ID和參數值)都在POST請求中。 但是問題在于,它僅對R1有效。 如果我們在R2上進行嘗試,將會得到以下結果:
ADF_FACES-30179:有關更多信息,請參見服務器的錯誤日志中以下列開頭的條目:UIViewRoot為空。 PhaseId期間的致命異常:RESTORE_VIEW 1。
為什么? 因此:
oracle.adfinternal.controller.application.InvokeTaskFlowException: ADFC-02006: A task flow ID is not found in the URL.at oracle.adfinternal.controller.util.UrlParams.getTaskFlowInfo(UrlParams.java:144)at oracle.adfinternal.controller.application.RemoteTaskFlowCallRequestHandler. invokeTaskFlowByUrl(RemoteTaskFlowCallRequestHandler.java:84)at oracle.adfinternal.controller.application.RemoteTaskFlowCallRequestHandler. doCreateView(RemoteTaskFlowCallRequestHandler.java:63)本應在POST請求中傳遞的所有必需數據(包括任務流ID)都將丟失。 為什么? 因為“回送”。 如果在單擊“提交”按鈕后發現從瀏覽器發送到服務器的請求,我們將看到以下內容:
因此,服務器不發送“誠實”響應,而是發送一些“回送”腳本,該腳本生成“窗口ID”,并發送以下具有生成的窗口ID的GET請求。 涼! 但是所有發布數據都消失了。 GET請求絕對為空。
幸運的是,如果初始POST請求已經具有一些“窗口ID”,則該框架不會生成任何“環回”。 因此,本例的解決方法是開發一個servlet過濾器,為我們的請求設置“ window id”屬性:
public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain)throws IOException, ServletException {HttpServletRequest r = (HttpServletRequest) servletRequest;HttpSession s = r.getSession();//May be this is not an initial request and window id has been generated earlier//We want all the following requests to work with the same window id //For our use-case this is ok??? String windowID = (String) s.getAttribute(_WINDOW_ID_KEY);if (windowID == null){String pathInfo = r.getPathInfo();//This is an initial POST request to get access to the task flowif (("/adf.task-flow").equals(pathInfo) &&"POST".equals(r.getMethod())){windowID = WINDOW_ID;//Save window id in the session s.setAttribute(_WINDOW_ID_KEY, windowID);}}//Setup attribute for the request//This will prevent generating of the loopbackif (windowID != null)r.setAttribute(_WINDOW_ID_KEY, windowID);filterChain.doFilter(servletRequest, servletResponse); }private static final String __WINDOW_MANAGER_KEY = RichWindowManager.class.getName(); private static final String _WINDOW_ID_KEY = __WINDOW_MANAGER_KEY + "#WINDOW_ID";? private static final String WINDOW_ID = "wextflow";請注意,此過濾器應位于過濾器鏈中的“特立尼達”過濾器之前:
<filter><filter-name>ExtPostFilter</filter-name><filter-class>com.cs.fusion.core.view.filter.ExtPostFilter</filter-class></filter> <filter><filter-name>trinidad</filter-name><filter-class>org.apache.myfaces.trinidad.webapp.TrinidadFilter</filter-class></filter><filter><filter-name>ServletADFFilter</filter-name><filter-class>oracle.adf.share.http.ServletADFFilter</filter-class></filter> 而已!
翻譯自: https://www.javacodegeeks.com/2013/08/adf-url-task-flow-call-with-http-post-method.html
adf4351使用方法
總結
以上是生活随笔為你收集整理的adf4351使用方法_ADF:使用HTTP POST方法进行URL任务流调用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring Apache Kafka教
- 下一篇: 电脑文件如何快速备份如何进行电脑文件备份