问题标签 [ognl]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3107 浏览

struts2 - OGNL 和通配符在使用 struts2-tiles-plugin 的瓷砖定义中工作?

我希望 Tiles 从 struts2 值堆栈中解析 ognl。这该怎么做?

使用 tile 2.2.2(虽然如果可以使用更高版本,例如 3,那很好)

这里提到了新功能: http ://tiles.apache.org/2.2/framework/whats-new.html

这里展示了如何实现它:http ://tiles.apache.org/2.2/framework/tutorial/advanced/el-support.html#OGNL_Support

但我不确定如何在我的项目中进行。是否有人在他们的 struts2 项目中使用了 tiles3?我记得阅读了一些默认情况下打开图块 3 中所有新功能的方法,但我找不到该页面的链接。

如果可以使用 spring 无论如何都可以完成配置,那很好(如果有帮助,如果没有,则不是问题)。

0 投票
2 回答
7127 浏览

struts2 - 如何在 OGNL/Struts2 中迭代和索引列表列表?

我有一个配置文件如下的属性:

我希望为外部列表中的每个元素创建一个表,为内部列表中的前五个位置中的每一个创建一个列。我尝试使用这个:

但是,输出是 100 多行完全空白的列:

我知道数据已正确填充。当我这样做时:

我得到100多行这样的:

当我这样做时:

我得到一个例外:

所以我知道“行”解析为 ArrayList。我读到的关于 OGNL 的所有内容似乎都暗示我应该能够通过 [] 表示法对数组进行索引。我已经尝试了更多的 {}、# 等组合,我不会给你带来负担,但无济于事。谁能解释为什么这不起作用以及我需要做些什么才能使它起作用?

更新

在下面尝试四元数的建议时,我使用了以下代码:

主要工作。不幸的是,复选框失败了:

如果我不使用键,则 id 或 value 的组合也不起作用。如果我只是名字和身份证:

如果不能解决:

如果我只使用名称:

它也不起作用:

如果我只使用 id,我会收到一些内部错误:

为什么复选框的参数需要与属性不同的语法?

0 投票
4 回答
4448 浏览

java - 如何在 Struts 迭代器中访问 ValueStack 对象?

我有以下代码:

评论是评论对象的列表,其中包含评论的详细信息,例如评分和用户名。

我的问题是我无法访问循环内 ValueStack 上存在的任何对象。

循环外<s:property value="#request.restaurant.portalImage.url" />正常工作。但在循环内它打印空。

AFAIK 迭代器将其集合推送到 ValueStack 上,以便所有 OGNL 表达式都针对它进行解析。但是我使用了 # 这意味着我明确指定了要解析的根对象。

为什么它仍然不起作用?

0 投票
0 回答
2953 浏览

jsp - Struts 2 - 访问静态成员值。似乎忽略了 struts.properties 和 struts.xml 文件中的“struts.ognl.allowStaticMethodAccess”值

我正在尝试访问 JSP 中的静态成员值,如下所示: "@package.subPackage.ClassName@STATIC_MEMBER"

STATIC_MEMBER 被声明为public static final String分配了一个值,并且类具有公共范围。我的 struts.properties(位于 webapps\appName\WEB-INF\classes 文件夹下)有struts.ognl.allowStaticMethodAccess=true条目。但是,Struts 似乎忽略struts.ognl.allowStaticMethodAccess=true了 struts.properties 中的条目。

我在另一个项目中遵循了上述相同的步骤,并且运行良好。

注意:
1. 我已经交叉检查了完整的包、类和 STATIC_MEMBER 名称的正确性。
2.页面上没有错误/异常。3. 同一个JSP 可以从Action 类( )
中访问成员值。 4. 我尝试从其他类访问静态成员,但不起作用。 5. 我曾尝试删除 struts.properties 文件,并在 struts.xml 文件中的标签后创建一个条目,为 : 。重新启动并重新尝试。但是,不起作用。 6. 从服务器中删除 Web 应用程序及其缓存(工作文件夹)后,我重新构建、重新部署并重新启动了服务器,但是没有工作。<s:property value="actionMember"/>

<struts><constant name="struts.struts.ognl.allowStaticMethodAccess" value="true" />


环境:Java 1.6、Struts 2.1、Tomcat 6.0 @ Windows XP 2002

请帮忙。
提前非常感谢!

--------------------代码更新---------------------------- ---

班级


struts.properties
struts.ognl.allowStaticMethodAccess=true

JSP
<s:if test="errorType == @package1.subPackage1.FooClassName@INVALID_LOGIN"> some code here </s:if>


Action 类
1. private int errorType;
2. 有各自的 getter 和 settererrorType

甚至没有打印值,试过了:
<s:property value="@package1.subPackage1.FooClassName@INVALID_LOGIN"/>

0 投票
1 回答
587 浏览

java - 如何禁用ognl评估?

要强制 OGNL 评估,可以使用 %{} 语法,但应该使用什么来禁用它?

考虑以下代码 -

发生的情况是在值堆栈上查找 viewItem,当找不到时返回一个空字符串。

这不是我想要的。我想要的是作为参数传递的文字值 viewItem。

0 投票
1 回答
468 浏览

java - 在 s:select 中使用 #this 时出现奇怪的 OGNL 行为

考虑以下情况,其中 availableExclusions 是 Date 对象的数组。

我创建了上述内容以回答这个问题如何在 struts 2 选择标签中格式化日期列表?(我还建议其他解决方案可能是更好的方法)。不管使用这么长的 OGNL 表达式是否是一个好主意,我都看不出有必要:new java.util.Date(#this[0].time)尽管出于沮丧创建了该片段,但令我惊讶的是,它发现它在看似等效的地方#this[0]不起作用(没有产生输出)。

如果我们替换,listValue="#this[0].class"我们会看到我们所期望的:class java.util.Date

创建一个新的 Date 的行为符合预期,并调用 Date 的不推荐使用的属性,例如listValue="#this[0].day"产生预期的输出。

为什么我必须使用冗余表达式 new java.util.Date(#this[0].time) 而不是 #this[0] 在这个 select 语句中?

使用 Struts 2.3.1.2

0 投票
1 回答
644 浏览

struts2 - 可能的 struts-portlet 2.3.3 错误?动作类不在值栈的顶部

我正在将一个 struts 2.2.3.1 portlet 应用程序 (jsr168) 迁移到新版本 2.3.3。在大多数情况下,一切仍然正常,但有一个明显的问题。

我正在使用 package.properties 资源包来处理我的 jsp 中的标题和标签等内容。当我第一次点击操作时,会从资源包中检索消息并按预期显示。但是,当我对某个操作发出第二个请求时,会显示消息键,这通常意味着找不到资源。

(第一次执行操作和任何后续请求之间的主要区别似乎是,在第一个请求中,仅处理事件 portlet 阶段,而不是呈现 portlet 阶段。任何后续请求都使用这两个阶段。)

我花了很长时间才弄清楚发生了什么,但大致是这样的:

我开始逐步浏览org.apache.struts2.components.Text。当在 jsp 中遇到 struts 文本标记时使用此类。

end()方法使用来自TextProviderHelper的静态getText()方法。这就是我找到问题根源的地方:

上面的代码遍历值堆栈,直到找到TextProvider。因为ActionSupport实现了 TextProvider,并且因为 struts 试图将动作放在堆栈顶部或附近,所以动作通常是提供者。

这是两个版本在不同时间的值堆栈中的对象:

版本 2.2.3.1

第一个请求值栈

  • --> TestPortletAction
  • 默认文本提供者

第二次请求值栈

  • --> TestPortletAction
  • 默认文本提供者
  • DirectRenderFromEventAction
  • 默认文本提供者

版本 2.3.3

第一个请求值栈

  • --> TestPortletAction
  • 默认文本提供者

第二次请求值栈

  • DirectRenderFromEventAction
  • 默认文本提供者
  • --> TestPortletAction
  • 默认文本提供者

因此,由于某种原因,在新版本中,在处理完渲染阶段后,动作类不在堆栈顶部。这意味着TextProviderHelper使用DefaultTextProvider,它确实尝试定位资源包......但这样做永远不会成功。

我对DefaultTextProvider如何被推入堆栈进行了一些调查:

Jsr168调度程序serviceAction () 调用ActionProxyFactory来创建动作代理。就在返回代理之前,调用prepare (),然后调用DefaultActionInvocationinit方法。init 调用createContextMap () 来创建堆栈

使用的构造函数:

啊啊啊,这就是我到目前为止所遇到的问题。剩下的问题是:

  1. 第二个DefaultTextProvider如何以及在何处被推入堆栈?(真的有理由拥有其中两个吗?)
  2. DirectRenderFromEventAction如何以及在何处被推入堆栈?
  3. 新版本的什么变化导致了这种情况?
  4. 这是错误还是预期行为?

一个可能的解决方案(确实可以解决它)是使用 ognl 显式调用操作的getText方法,但我认为这并不理想,它确实意味着更改一堆 jsp 文件。

可以在此处找到演示该问题的示例项目(这是一个 Maven 项目):

http://new-value-stack-order.googlecode.com/svn

我使用tomcat 6.0.25pluto 1.1.7作为我的开发环境。

0 投票
2 回答
976 浏览

java - 使用 Struts Select 标签指定选项标签 (listValue)

标签的 listValue 属性用于指定在选择该选项时应向用户显示的标签。

例子 -

使用 OGNL 文字枚举列表时是否可以这样做?

我希望将 1Km 显示给用户并且整数 1 而不是字符串 1Km 与表单一起提交。

0 投票
1 回答
333 浏览

ognl - OGNL 中的通配符?

我必须编写一些 OGNL 才能在表格中查找某些内容,有点像使用 C# 字典。这很容易:

但现在我的要求发生了变化。现在我需要制定一些更复杂的规则,我不确定OGNL是否可以做到。我对更新的表达式有几个要求。我现在有两个不同的值及其组合需要担心。我们将值称为 A 和 B。规则如下所示:

  1. 如果出现 A 的特定值,则始终返回相同的值。
  2. 如果出现 A 和 B 值的某些组合,则返回另一个值。
  3. 如果 A 的任何值出现在我们特别关心的值之外,则返回另一个值。

如果我有 A 和 B 的所有可能值的列表,我可以制作一个非常大的哈希表,其中包含它们的每个连接以及为每种情况返回的正确值。如果我可以使用通配符,这似乎会容易得多。有没有人想过如何实现这一点,或者是否可以使用 OGNL?

0 投票
4 回答
5884 浏览

java - 使用OGNL自定义struts2 textfield标签的值

我有一个包含用户信息的数据库。当用户登录时,我在会话中注册了用户,如下所示:

我想在我的 jsp 页面中获取用户的信息,以便用这些信息填充 struts2 文本字段。我尝试使用以下代码,但它不起作用:

我需要你的帮助。