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

众所周知,可以通过某些URL直接从浏览器或某些外部应用程序调用有限任务流。 如果任务流的属性“ URL invoke”设置为“ url-invoke-allowed”,则启用此功能,该功能通常在集成项目中使用。 通常,客户端(或调用者)使用HTTP GET方法并在URL中传递其参数。 让我们考虑一个带有一个必需输入参数的简单任务流:

<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调用任务流

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>

它看起来像这样:

屏幕截图2013年8月2日下午5.55.16

一些客户端更喜欢使用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)都将丢失。 为什么? 因为“回送”。 如果在单击“提交”按钮后发现从浏览器发送到服务器的请求,我们将看到以下内容:

屏幕截图2013年8月2日下午6.41.27

屏幕截图2013年8月2日下午6.45.56

因此,服务器不发送“诚实”响应,而是发送一些“回送”脚本,该脚本生成“窗口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>

而已!

参考:来自ADF实践博客的JCG合作伙伴 Eugene Fedorenko 使用HTTP POST方法进行URL任务流调用 。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(十二)Bind读取配置到C#实例

继续上一节的&#xff0c;接下来用Options或者Bind把json文件里的配置转成C#的实体&#xff0c;相互之间映射起来。首先新建一个asp.net core mvc项目OptionsBindSampleStartup.cs&#xff0c;这里用依赖注入把Configuration加进来 1 public IConfiguration Configurat…

转-测试用例-常用控件

1. 文本框 是否是必填项 是 为空时提交&#xff0c;给出提示 输入空格时提交&#xff0c;给出提示 否 为空时提交&#xff0c;可提交成功 不为空时提交&#xff0c;提交后内容与输入的一致&#xff0c;存储到数据库中正确 是否支持TAB键在文本框中输入回车键&#xff0c;是…

java 项目做多级缓存_【开源项目系列】如何基于 Spring Cache 实现多级缓存(同时整合本地缓存 Ehcache 和分布式缓存 Redis)...

一、缓存当系统的并发量上来了&#xff0c;如果我们频繁地去访问数据库&#xff0c;那么会使数据库的压力不断增大&#xff0c;在高峰时甚至可以出现数据库崩溃的现象。所以一般我们会使用缓存来解决这个数据库并发访问问题&#xff0c;用户访问进来&#xff0c;会先从缓存里查…

[译] SpaceAce 了解一下,一个新的前端状态管理库

原文地址&#xff1a;Introducing SpaceAce, a new kind of front-end state library原文作者&#xff1a;Jon Abrams译文出自&#xff1a;掘金翻译计划本文永久链接&#xff1a;https://github.com/xitu/gold-miner/blob/master/TODO1/introducing-spaceace-a-new-kind-of-fro…

Spring MVC:带有CNVR卷的REST应用程序。 3

这是带有CNVR的Spring MVC REST教程的最后一部分。 在这里&#xff0c;我将演示所有这些东西如何工作&#xff0c;这是我在前两部分中开发的。 对于每种类型的CRUD操作&#xff0c;这将分为四个部分&#xff1a;CREATE&#xff0c;READ&#xff0c;UPDATE&#xff0c;DELETE。 …

Python学习笔记——txt文件转csv文件

import numpy as np import pandas as pdtxt np.loadtxt(data1.txt) txtDF pd.DataFrame(txt) txtDF.to_csv(file1.csv, indexFalse)转载于:https://www.cnblogs.com/yucen/p/9343574.html

左侧固定,右侧自适应的布局方式(新增评论区大佬教的方法)

一.浮动布局 1.先让固定宽度的div浮动&#xff01;使其脱离文档流。 2.margin-left的值等于固定div的宽度相等。 .aside{float: left;width: 200px;background-color: red;}.content{margin-left: 200px;background-color: blue;}<div class"aside">Lorem ipsu…

java 中io的删除文件_总结删除文件或文件夹的7种方法-JAVA IO基础总结第4篇

本文是Java IO总结系列篇的第4篇&#xff0c;前篇的访问地址如下&#xff1a;如果您阅读完成&#xff0c;觉得此文对您有帮助&#xff0c;请给我点个赞&#xff0c;您的支持是我不竭的创作动力。为了方便大家理解&#xff0c;我特意制作了本文对应的视频&#xff1a;总结删除文…

Koa2和Redux中间件源码研究

一、Koa2中间件源码分析 在Koa2中&#xff0c;中间件被存放在一个数组中。 使用koa中&#xff0c;最常见的就是app.use(fn)&#xff0c;use函数部分源码如下所示。首先中间件必须是个函数。若是generator函数&#xff0c;则需要进行转化。最后把该中间件推入middelaware数组中…

Web应用程序的简单插件系统

我们需要制作多个具有很多共享功能的基于Web的项目。 为此&#xff0c;某种插件系统将是一个不错的选择&#xff08;作为复制粘贴内容的替代方法&#xff09;。 有些框架&#xff08;例如grails&#xff09;可以选择制作Web插件&#xff0c;但大多数没有&#xff0c;因此需要实…

[转]C++ auto 关键字的使用

原文地址: https://www.cnblogs.com/KunLunSu/p/7861330.html C98 auto 早在C98标准中就存在了auto关键字&#xff0c;那时的auto用于声明变量为自动变量&#xff0c;自动变量意为拥有自动的生命期&#xff0c;这是多余的&#xff0c;因为就算不使用auto声明&#xff0c;变量依…

python模块之configparser

一 什么是configparser&#xff1f; configparser是用于解析配置文件的模块。什么是配置文件呢&#xff1f;包含配置程序信息的文件就称为配置文件。什么样的数据应该作为配置信息呢&#xff1f;需要修改但是不经常改的信息就可以作为配置信息&#xff0c;比如数据文件的路径。…

java的使用条件_Java使用条件语句和循环结构确定控制流

与任何程序设计语言一样&#xff0c;Java使用条件语句和循环结构确定控制流。本文将简单讲解条件、循环和switch。一、块作用域块(block)&#xff0c;即复合语句。是指由一对大括号括起来的若干条简单的Java语句。块确定了变量的作用域。比如&#xff1a;public class Code {st…

实现小程序canvas拖拽功能

组件地址 https://github.com/jasondu/wx-comp-canvas-drag 实现效果 如何实现 使用canvas使用movable-view标签 由于movable-view无法实现旋转&#xff0c;所以选择使用canvas 需要解决的问题 如何将多个元素渲染到canvas上如何知道手指在元素上、如果多个元素重叠如何知…

探索Apache Camel Core – Seda组件

Apache Camel中的seda组件与我在之前的博客中介绍的direct组件非常相似&#xff0c;但是以异步的方式。 为此&#xff0c;它使用java.util.concurrent.BlockingQueue作为默认实现来使消息排队并与主Route线程断开连接&#xff0c;然后在单独的线程中处理消息。 由于此BlockingQ…

Properties类和如何操作属性

Properties类继承关系java.lang.Object java.util.Dictionary<K,V> java.util.Hashtable<Object,Object> java.util.Properties所有已实现的接口&#xff1a; Serializable, Cloneable, Map<Object,Object> 直接已知子类&#xff1a; Provide…

Spring MVC:带有CNVR卷的REST应用程序。 2

在上一篇文章中&#xff0c;我快速概述了带有CNVR的Spring MVC REST项目的设置环境。 在这一部分中&#xff0c;我可以直接关注控制器和REST服务的演示。 通常&#xff0c;我将做一个简短的介绍&#xff0c;然后我将介绍控制器方法并解释所有关键时刻。 由于我将进一步讨论RES…

SCP 报错 not a regular file

在 scp 后 加 -r转载于:https://www.cnblogs.com/LYliangying/p/9815534.html

H5页面滚动阻尼效果实现

功能描述 要求 页面分为AB两个区域 当手机可视区的底部接触到 “阻尼带” 的时候&#xff0c;有个上拉弹性过程 当上拉到一定阈值程度就直接把B区顶部弹到手机可视区的顶部&#xff0c;让可视区从B区开始显示当上拉程度未到阈值&#xff0c;就回弹复原 当手机可视区从B区向上…

java面试题(杨晓峰)---第五讲String、StringBuffer、StringBuilder有什么区别?

线程 字符 操作频繁度 1 String &#xff08;1&#xff09;String的创建机制 由于String在java世界中使用过于频繁&#xff0c;java为了避免在一个系统中产生大量重复的String对象&#xff0c;引入了字符串常量池&#xff0c;其运行机制是&#xff1a;创建一个字符串时&am…