struts2 el表达式常见问题有哪些?老手总结解决方法

吉云

哥们儿姐们儿,今天得空,跟大家唠唠我前两天捣鼓Struts2里面用EL表达式那点事儿。一开始我以为挺简单的,毕竟JSP页面里用EL表达式那叫一个顺手,想着在Struts2标签里应该也差不多?结果你猜怎么着,直接就给我干懵。

一开始的尝试

我当时是这么想的,我Action里头放点数据,比如用 `*("myName", "张三");` 这种,或者直接在Action类里定义个属性 `private String myName;` 然后提供 `getMyName()` 方法。到JSP页面,我就想当然地在Struts2的标签里写,类似这样:

struts2 el表达式常见问题有哪些?老手总结解决方法

<s:property value="${myName}" />

或者

<s:textfield name="${myName}" ... />

结果,页面上啥也不显示,或者直接报错。 这就让我纳闷,EL表达式在普通HTML或者JSTL标签里用得好好的,怎么到Struts2标签里就不灵?

捣鼓过程与发现

我就开始查资料,东搞搞西搞搞。发现一个关键点:Struts2标签它默认不直接解析花括号美元符 `${}` 这种EL表达式。它用的是自己的一套东西,叫OGNL表达式。

struts2 el表达式常见问题有哪些?老手总结解决方法

JSP页面本身还是支持EL表达式的。如果你不是在Struts2标签里面,比如直接在HTML代码里,或者用JSTL的标签,像这样:

<p>我的名字是:${myName}</p>

这个通常是没问题的,前提是你得确保你的JSP页面允许使用EL表达式。有时候,特别是在一些老项目或者特定配置下,EL表达式可能被禁用。这时候就得在JSP页面顶部加上一句:

<%@ page isELIgnored="false" %>

把这个`isELIgnored`设置成`false`,意思就是告诉JSP别忽略EL表达式,让它生效。 我试下,确实,加上这句之后,在Struts2标签外面用 `${myName}` 就能正确显示我在`request`里设置的值。

Struts2自己的玩法:OGNL

struts2 el表达式常见问题有哪些?老手总结解决方法

那Struts2标签里面到底该怎么访问数据?后来我才搞明白,Struts2主要是靠它的值栈(Value Stack)来传数据的。

简单说,你Action类的实例,默认就在这个值栈的顶端。 如果你的Action类里有个属性,比如:

private String userName = "李四";
public String getUserName() { return userName; }

那么在JSP里,用Struts2的标签就可以直接这样访问:

<s:property value="userName" />

struts2 el表达式常见问题有哪些?老手总结解决方法

注意,这里 `value` 属性里写的是 `userName`,就是Action里的那个属性名,没有 `${}`。这就是OGNL的用法。Struts2会自己去值栈里找这个 `userName` 属性。

那如果我想访问不是Action属性,而是我自己手动 `setAttribute` 到 `request`、`session` 或 `application` 里的数据?比如前面那个 `*("myName", "张三");`。 在Struts2标签里,得用 `#` 号来指定范围:

  • 访问request里的:<s:property value="#*" />
  • 访问session里的:<s:property value="#*" />
  • 访问application里的:<s:property value="#*" />
  • struts2 el表达式常见问题有哪些?老手总结解决方法

这个 `#` 号很重要,它告诉Struts2:“别在值栈(Action属性)里直接找,去指定的那个范围(比如request)里找”。

总结一下我的实践

折腾半天,总算是捋清楚:

  • Struts2标签(比如<s:property>, <s:textfield>等)内部,主要用OGNL表达式来访问数据,特别是访问Action的属性时,直接写属性名就行。
  • struts2 el表达式常见问题有哪些?老手总结解决方法

  • 标准的EL表达式 `${}` 主要用在Struts2标签外面,或者配合JSTL等其他标签库使用。
  • 如果要在JSP里用EL表达式,确保页面没有禁用它,可能需要加上 <%@ page isELIgnored="false" %>
  • 如果想在Struts2标签里访问 request, session, application 范围的数据,得用 `#` 号,比如 。

顺带一提,有时候还会碰到些烦人的警告,像什么 `Could not parse * setting` 或者 `Could not find property [*]` 之类的,这些通常是Struts2的配置问题,比如少 `log4j` 的包或者 `*` 里有些默认设置没配不过这跟EL表达式本身关系不大,是另一个话题。

反正,搞清楚Struts2的值栈和OGNL,再结合JSP本身的EL表达式用法,基本上就能在页面上顺利拿到并显示数据。希望我这回踩坑的记录对大家有点用处哈。

struts2 el表达式常见问题有哪些?老手总结解决方法

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。

目录[+]