日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

adf4351使用方法_ADF:使用HTTP POST方法进行URL任务流调用

發(fā)布時間:2023/12/3 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 adf4351使用方法_ADF:使用HTTP POST方法进行URL任务流调用 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

adf4351使用方法

眾所周知,可以通過某些URL直接從瀏覽器或某些外部應用程序調(diào)用有限任務流。 如果任務流的屬性“ URL invoke”設置為“ URL-invoke-allowed”,則啟用此功能,該功能通常在集成項目中使用。 通常,客戶端(或調(diào)用者)使用HTTP GET方法并在URL中傳遞其參數(shù)。 讓我們考慮一個帶有一個必需輸入?yún)?shù)的簡單任務流:

<task-flow-definition id="task-flow-definition">??? <input-parameter-definition id="__23"><name id="__24">userName</name><value id="__67">#{requestScope.userName}</value><class id="__63">java.lang.String</class><required/></input-parameter-definition>??? ...

可以通過這樣的URL調(diào)用任務流

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和參數(shù)值)都在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請求中傳遞的所有必需數(shù)據(jù)(包括任務流ID)都將丟失。 為什么? 因為“回送”。 如果在單擊“提交”按鈕后發(fā)現(xiàn)從瀏覽器發(fā)送到服務器的請求,我們將看到以下內(nèi)容:

因此,服務器不發(fā)送“誠實”響應,而是發(fā)送一些“回送”腳本,該腳本生成“窗口ID”,并發(fā)送以下具有生成的窗口ID的GET請求。 涼! 但是所有發(fā)布數(shù)據(jù)都消失了。 GET請求絕對為空。

幸運的是,如果初始POST請求已經(jīng)具有一些“窗口ID”,則該框架不會生成任何“環(huán)回”。 因此,本例的解決方法是開發(fā)一個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>

而已!

參考:來自ADF實踐博客的JCG合作伙伴 Eugene Fedorenko 使用HTTP POST方法進行URL任務流調(diào)用 。

翻譯自: https://www.javacodegeeks.com/2013/08/adf-url-task-flow-call-with-http-post-method.html

adf4351使用方法

總結

以上是生活随笔為你收集整理的adf4351使用方法_ADF:使用HTTP POST方法进行URL任务流调用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。