Oracle Apex:访问通过 URL 传递的参数
Oracle Apex : Accessing params passed through URL
我正在通过 URL 传递参数并且页面被正确重定向。如何访问下一个(重定向的)页面上的参数(从上一页)传递并在 URL 中可用?
谁能告诉我怎么做?
或者有没有其他的页面间传递参数的方法?
有没有类似于Angular的广播事件的可用选项?
我不想使用全局页面选项。
Is there any option available similar to broadcast event from Angular?
不是真的。虽然您可以使用 APEX 做到这一点,但它可能有点矫枉过正。 Angular 是一个执行客户端渲染的 SPA 框架,而 APEX 主要执行服务器端渲染。如果您来自 Angular 世界,您将不得不重新考虑一些事情。
How do I access the parameters on the next (redirected) page that were passed (from previous page) and available in the URL?
第一个问题是:您是否尝试使用 JavaScript 或 SQL & PL/SQL 访问值?我会回答这两个问题,但首先我会退后一步来解释 APEX 中的 session state。以下内容过于简单,但应该有助于让您了解幕后发生的事情。
请记住,APEX 引擎是 Oracle 数据库中的一个模式,其中包含许多 table(主要用于存储应用程序元数据)、包(用于业务逻辑和 HTML 生成),以及其他数据库对象。在那些 table 中有一些用于存储 "session state"。将两个主要的 table 视为 SESSIONS 和 SESSION_DATA。 SESSIONS 将具有会话的唯一标识符、用户名等。SESSION_DATA 将具有一个指向 SESSIONS table 的 SESSION 列、一个 ITEM_NAME 列和一个 ITEM_VALUE列。
假设您转到以下 URL:
https://yourdomain.com/apex/f?p=101:1:12690960447054
APEX 引擎将获取 URL 的 "p" 参数并将其解析为 up to 9 values:
- 应用程序
- 页数
- 会话
- 请求
- 调试
- 清除缓存
- 项目名称
- 物品价值
- 打印机友好
在上面的 URL 中,只指定了其中三个值,因此 APEX 引擎为会话 12690960447054 的应用程序 101 中的第 1 页生成 HTML。
但是如果你使用下面的 URL 会怎么样:
https://yourdomain.com/apex/f?p=101:1:12690960447054::::P1_ITEM_NAME:Dan
在这种情况下,APEX 引擎将在生成 HTML 之前更新 SESSION_DATA table 中的会话状态。它会将 ITEM_VALUE 列设置为 'Dan',其中 SESSION 为 12690960447054,ITEM_NAME 为 'P1_ITEM_NAME'。
这就是当您通过 URL 设置会话状态时技术上发生的事情。当您准备好了解有关会话状态的更多信息时,请查看 Anton Nielsen 的 this old but still relevant post。现在让我们继续讨论有关访问会话状态的问题...
SQL & PL/SQL
一旦 APEX 设置了会话状态,它就会继续生成 HTML。假设您在页面上有一个报告区域,其中包含以下查询:
select col1, col2, col3
from some_table
where col4 = :P1_ITEM_NAME
APEX 引擎将识别查询中的绑定变量,并根据会话提供来自 SESSION_DATA table 的正确值。坦率地说,您可以从任何页面访问项目的值,也可以访问应用程序项目,因为此时我们在服务器端,这真的没有什么区别。话虽如此,最佳做法是仅引用当前页面中的页面项目。
有关访问会话状态服务器端的更多方法,请参阅 "Referencing Items Values":
https://docs.oracle.com/en/database/oracle/application-express/19.1/htmdb/understanding-page-level-items.html#GUID-207E66F9-C8A6-4FD1-B2F4-12D4BB302D31
JavaScript
生成 HTML 后,它会被发送到浏览器进行渲染。对于 JavaScript 在不使用 Ajax 的情况下从会话状态访问值(你应该尽量避免),这些值必须已经到达 DOM。如果 P1_ITEM_NAME 在页面上呈现,那么它的值应该是 'Dan'。您可以使用原始 JavaScript:
获取此值
document.getElementById('P1_ITEM_NAME').value
或jQuery:
$('#P1_ITEM_NAME').val()
但是,最好使用 APEX specific JavaScript APIs 了解 APEX 如何处理复选框和单选按钮组等内容。例如,您可以使用:
$v('P1_ITEM_NAME')
或者您可以使用:
apex.item('P1_ITEM_NAME').getValue()
请记住,如果该项目没有进入 DOM,比如因为它属于另一个页面或因为某个条件,那么您将无法在 JavaScript.
我正在通过 URL 传递参数并且页面被正确重定向。如何访问下一个(重定向的)页面上的参数(从上一页)传递并在 URL 中可用? 谁能告诉我怎么做?
或者有没有其他的页面间传递参数的方法?
有没有类似于Angular的广播事件的可用选项?
我不想使用全局页面选项。
Is there any option available similar to broadcast event from Angular?
不是真的。虽然您可以使用 APEX 做到这一点,但它可能有点矫枉过正。 Angular 是一个执行客户端渲染的 SPA 框架,而 APEX 主要执行服务器端渲染。如果您来自 Angular 世界,您将不得不重新考虑一些事情。
How do I access the parameters on the next (redirected) page that were passed (from previous page) and available in the URL?
第一个问题是:您是否尝试使用 JavaScript 或 SQL & PL/SQL 访问值?我会回答这两个问题,但首先我会退后一步来解释 APEX 中的 session state。以下内容过于简单,但应该有助于让您了解幕后发生的事情。
请记住,APEX 引擎是 Oracle 数据库中的一个模式,其中包含许多 table(主要用于存储应用程序元数据)、包(用于业务逻辑和 HTML 生成),以及其他数据库对象。在那些 table 中有一些用于存储 "session state"。将两个主要的 table 视为 SESSIONS 和 SESSION_DATA。 SESSIONS 将具有会话的唯一标识符、用户名等。SESSION_DATA 将具有一个指向 SESSIONS table 的 SESSION 列、一个 ITEM_NAME 列和一个 ITEM_VALUE列。
假设您转到以下 URL: https://yourdomain.com/apex/f?p=101:1:12690960447054
APEX 引擎将获取 URL 的 "p" 参数并将其解析为 up to 9 values:
- 应用程序
- 页数
- 会话
- 请求
- 调试
- 清除缓存
- 项目名称
- 物品价值
- 打印机友好
在上面的 URL 中,只指定了其中三个值,因此 APEX 引擎为会话 12690960447054 的应用程序 101 中的第 1 页生成 HTML。
但是如果你使用下面的 URL 会怎么样: https://yourdomain.com/apex/f?p=101:1:12690960447054::::P1_ITEM_NAME:Dan
在这种情况下,APEX 引擎将在生成 HTML 之前更新 SESSION_DATA table 中的会话状态。它会将 ITEM_VALUE 列设置为 'Dan',其中 SESSION 为 12690960447054,ITEM_NAME 为 'P1_ITEM_NAME'。
这就是当您通过 URL 设置会话状态时技术上发生的事情。当您准备好了解有关会话状态的更多信息时,请查看 Anton Nielsen 的 this old but still relevant post。现在让我们继续讨论有关访问会话状态的问题...
SQL & PL/SQL
一旦 APEX 设置了会话状态,它就会继续生成 HTML。假设您在页面上有一个报告区域,其中包含以下查询:
select col1, col2, col3
from some_table
where col4 = :P1_ITEM_NAME
APEX 引擎将识别查询中的绑定变量,并根据会话提供来自 SESSION_DATA table 的正确值。坦率地说,您可以从任何页面访问项目的值,也可以访问应用程序项目,因为此时我们在服务器端,这真的没有什么区别。话虽如此,最佳做法是仅引用当前页面中的页面项目。
有关访问会话状态服务器端的更多方法,请参阅 "Referencing Items Values": https://docs.oracle.com/en/database/oracle/application-express/19.1/htmdb/understanding-page-level-items.html#GUID-207E66F9-C8A6-4FD1-B2F4-12D4BB302D31
JavaScript
生成 HTML 后,它会被发送到浏览器进行渲染。对于 JavaScript 在不使用 Ajax 的情况下从会话状态访问值(你应该尽量避免),这些值必须已经到达 DOM。如果 P1_ITEM_NAME 在页面上呈现,那么它的值应该是 'Dan'。您可以使用原始 JavaScript:
获取此值document.getElementById('P1_ITEM_NAME').value
或jQuery:
$('#P1_ITEM_NAME').val()
但是,最好使用 APEX specific JavaScript APIs 了解 APEX 如何处理复选框和单选按钮组等内容。例如,您可以使用:
$v('P1_ITEM_NAME')
或者您可以使用:
apex.item('P1_ITEM_NAME').getValue()
请记住,如果该项目没有进入 DOM,比如因为它属于另一个页面或因为某个条件,那么您将无法在 JavaScript.